feat(operation-trace): declutter the log list and add page navigation

The list was noisy and hard to read: a constant "verified" badge and the
"L1/L2" level badge on every row carried no information, the same "view X"
line repeated until it buried real changes, and each row rendered its full
payload diff inline.

- Drop the per-row level badge and the "verified" badge; keep only an
  exception badge, so a healthy row shows nothing extra.
- Collapse consecutive identical rows into one line with an "xN" count.
- Make the change digest opt-in per row (one expanded at a time) and show a
  "<n> changes" toggle instead of dumping the diff.
- Show the registered route under each row so "Resource / System" is no
  longer ambiguous about what actually happened.
- Replace the arrows-only pager with a page selector ("Page x / y") plus the
  arrows, for logs with hundreds of records.

Verified: tsc, eslint, prettier and check-i18n all pass.
This commit is contained in:
TyperBody
2026-09-27 02:32:12 +08:00
parent 884beea4b6
commit 67bc80e3bc
10 changed files with 266 additions and 132 deletions
+3
View File
@@ -2548,6 +2548,7 @@ const enUS = {
noToolCalls: 'No tool calls recorded',
showDetails: 'Show details',
hideDetails: 'Hide details',
pageOf: 'Page {{page}} / {{total}}',
},
tokens: {
totalTokens: 'Total Tokens',
@@ -2728,6 +2729,8 @@ const enUS = {
maxRows: 'Max records',
dedupeWindow: 'Dedupe window (s)',
records: 'Operation records',
changesCount: '{{count}} change(s)',
hideDetails: 'Hide details',
levelUpdated: 'Capture level updated',
levelUpdateFailed: 'Failed to update capture level',
retentionUpdated: 'Retention updated',
+3
View File
@@ -2602,6 +2602,7 @@ const esES = {
noToolCalls: 'No se registraron llamadas de herramientas',
showDetails: 'Mostrar detalles',
hideDetails: 'Ocultar detalles',
pageOf: 'Página {{page}} / {{total}}',
},
tokens: {
totalTokens: 'Tokens totales',
@@ -2783,6 +2784,8 @@ const esES = {
maxRows: 'Registros máximos',
dedupeWindow: 'Ventana de deduplicación (s)',
records: 'Registros de operación',
changesCount: '{{count}} cambio(s)',
hideDetails: 'Ocultar detalles',
levelUpdated: 'Nivel de captura actualizado',
levelUpdateFailed: 'No se pudo actualizar el nivel de captura',
retentionUpdated: 'Retención actualizada',
+3
View File
@@ -2565,6 +2565,7 @@ const jaJP = {
noToolCalls: 'ツール呼び出しは記録されていません',
showDetails: '詳細を表示',
hideDetails: '詳細を非表示',
pageOf: '{{page}} / {{total}} ページ',
},
tokens: {
totalTokens: '総トークン数',
@@ -2746,6 +2747,8 @@ const jaJP = {
maxRows: '最大レコード数',
dedupeWindow: '重複排除ウィンドウ(秒)',
records: '操作レコード',
changesCount: '変更 {{count}} 件',
hideDetails: '詳細を隠す',
levelUpdated: 'キャプチャレベルを更新しました',
levelUpdateFailed: 'キャプチャレベルの更新に失敗しました',
retentionUpdated: '保持ポリシーを更新しました',
+3
View File
@@ -2573,6 +2573,7 @@ const ruRU = {
noToolCalls: 'Вызовы инструментов не записаны',
showDetails: 'Показать детали',
hideDetails: 'Скрыть детали',
pageOf: 'Стр. {{page}} / {{total}}',
},
tokens: {
totalTokens: 'Всего токенов',
@@ -2753,6 +2754,8 @@ const ruRU = {
maxRows: 'Максимум записей',
dedupeWindow: 'Окно дедупликации (с)',
records: 'Записи операций',
changesCount: 'Изменений: {{count}}',
hideDetails: 'Скрыть детали',
levelUpdated: 'Уровень записи обновлён',
levelUpdateFailed: 'Не удалось обновить уровень записи',
retentionUpdated: 'Хранение обновлено',
+3
View File
@@ -2499,6 +2499,7 @@ const thTH = {
noToolCalls: 'ยังไม่มีการบันทึกการเรียกใช้เครื่องมือ',
showDetails: 'แสดงรายละเอียด',
hideDetails: 'ซ่อนรายละเอียด',
pageOf: 'หน้า {{page}} / {{total}}',
},
tokens: {
totalTokens: 'Token ทั้งหมด',
@@ -2680,6 +2681,8 @@ const thTH = {
maxRows: 'จำนวนบันทึกสูงสุด',
dedupeWindow: 'ช่วงเวลาลบรายการซ้ำ (วินาที)',
records: 'บันทึกการดำเนินการ',
changesCount: '{{count}} การเปลี่ยนแปลง',
hideDetails: 'ซ่อนรายละเอียด',
levelUpdated: 'อัปเดตระดับการบันทึกแล้ว',
levelUpdateFailed: 'อัปเดตระดับการบันทึกไม่สำเร็จ',
retentionUpdated: 'อัปเดตนโยบายการเก็บรักษาแล้ว',
+3
View File
@@ -2534,6 +2534,7 @@ const viVN = {
noToolCalls: 'Chưa ghi nhận lượt gọi công cụ',
showDetails: 'Hiện chi tiết',
hideDetails: 'Ẩn chi tiết',
pageOf: 'Trang {{page}} / {{total}}',
},
tokens: {
totalTokens: 'Tổng số Token',
@@ -2715,6 +2716,8 @@ const viVN = {
maxRows: 'Số bản ghi tối đa',
dedupeWindow: 'Khoảng khử trùng lặp (giây)',
records: 'Bản ghi thao tác',
changesCount: '{{count}} thay đổi',
hideDetails: 'Ẩn chi tiết',
levelUpdated: 'Đã cập nhật mức ghi nhận',
levelUpdateFailed: 'Cập nhật mức ghi nhận thất bại',
retentionUpdated: 'Đã cập nhật chính sách lưu trữ',
+3
View File
@@ -2399,6 +2399,7 @@ const zhHans = {
noToolCalls: '未记录工具调用',
showDetails: '查看详情',
hideDetails: '隐藏详情',
pageOf: '第 {{page}} / {{total}} 页',
},
tokens: {
totalTokens: '总 Token 数',
@@ -2578,6 +2579,8 @@ const zhHans = {
maxRows: '最大记录数',
dedupeWindow: '去重窗口(秒)',
records: '操作记录',
changesCount: '{{count}} 项变更',
hideDetails: '收起详情',
levelUpdated: '操作等级已更新',
levelUpdateFailed: '操作等级更新失败',
retentionUpdated: '保留策略已更新',
+3
View File
@@ -2400,6 +2400,7 @@ const zhHant = {
noToolCalls: '未記錄工具呼叫',
showDetails: '查看詳情',
hideDetails: '隱藏詳情',
pageOf: '第 {{page}} / {{total}} 頁',
},
tokens: {
totalTokens: '總 Token 數',
@@ -2579,6 +2580,8 @@ const zhHant = {
maxRows: '最大記錄數',
dedupeWindow: '去重視窗(秒)',
records: '操作記錄',
changesCount: '{{count}} 項變更',
hideDetails: '收合詳情',
levelUpdated: '操作等級已更新',
levelUpdateFailed: '操作等級更新失敗',
retentionUpdated: '保留策略已更新',