From c4bfea6096535c3114451543fbb351ef7594d7eb Mon Sep 17 00:00:00 2001 From: yyh <92089059+lyzno1@users.noreply.github.com> Date: Fri, 24 Jul 2026 12:55:30 +0800 Subject: [PATCH] fix(web): adapt workflow agent logs (#39488) --- .../agent-detail/logs/__tests__/page.spec.tsx | 64 +++++++++++++++++++ .../logs/components/log-detail-panel.tsx | 4 +- web/i18n/ar-TN/agent-v-2.json | 1 + web/i18n/de-DE/agent-v-2.json | 1 + web/i18n/en-US/agent-v-2.json | 1 + web/i18n/es-ES/agent-v-2.json | 1 + web/i18n/fa-IR/agent-v-2.json | 1 + web/i18n/fr-FR/agent-v-2.json | 1 + web/i18n/hi-IN/agent-v-2.json | 1 + web/i18n/id-ID/agent-v-2.json | 1 + web/i18n/it-IT/agent-v-2.json | 1 + web/i18n/ja-JP/agent-v-2.json | 1 + web/i18n/ko-KR/agent-v-2.json | 1 + web/i18n/nl-NL/agent-v-2.json | 1 + web/i18n/pl-PL/agent-v-2.json | 1 + web/i18n/pt-BR/agent-v-2.json | 1 + web/i18n/ro-RO/agent-v-2.json | 1 + web/i18n/ru-RU/agent-v-2.json | 1 + web/i18n/sl-SI/agent-v-2.json | 1 + web/i18n/th-TH/agent-v-2.json | 1 + web/i18n/tr-TR/agent-v-2.json | 1 + web/i18n/uk-UA/agent-v-2.json | 1 + web/i18n/vi-VN/agent-v-2.json | 1 + web/i18n/zh-Hans/agent-v-2.json | 1 + web/i18n/zh-Hant/agent-v-2.json | 1 + web/service/client.spec.ts | 28 +++++--- web/service/client.ts | 7 +- 27 files changed, 113 insertions(+), 13 deletions(-) diff --git a/web/features/agent-v2/agent-detail/logs/__tests__/page.spec.tsx b/web/features/agent-v2/agent-detail/logs/__tests__/page.spec.tsx index 81da7e84efc..acd2eca6a35 100644 --- a/web/features/agent-v2/agent-detail/logs/__tests__/page.spec.tsx +++ b/web/features/agent-v2/agent-detail/logs/__tests__/page.spec.tsx @@ -106,6 +106,40 @@ const populatedLogsResponse: AgentLogListResponse = { total: 1, } +const workflowLogsResponse: AgentLogListResponse = { + data: [ + { + conversation_id: 'execution-1', + created_at: 1781660000, + end_user_id: 'end-user-1', + id: 'execution-1', + message_count: 1, + operation_rate: null, + source: { + app_icon: '🖌', + app_icon_background: '#EEF4FF', + app_icon_type: 'emoji', + app_id: 'workflow-app-id', + app_name: 'SVG Logo Design', + id: 'workflow:workflow-app-id:workflow-id:v3:agent-node-id', + node_id: 'agent-node-id', + type: 'workflow', + workflow_id: 'workflow-id', + workflow_version: 'v3', + }, + status: 'success', + title: 'Workflow agent execution', + unread: false, + updated_at: 1781661000, + user_rate: null, + }, + ], + has_more: false, + limit: 25, + page: 1, + total: 1, +} + const logSourcesResponse: AgentLogSourceListResponse = { data: [], groups: [ @@ -357,7 +391,37 @@ describe('AgentLogsPage', () => { }, }) }) + expect(screen.getByText('appLog.detail.conversationId')).toBeInTheDocument() expect(await screen.findByText('Translated chapter summary')).toBeInTheDocument() }) + + it('should identify workflow log details by execution id', async () => { + const user = userEvent.setup() + mocks.logsQueryFn.mockResolvedValue(workflowLogsResponse) + + renderPage() + + await user.click(await screen.findByRole('button', { name: 'Workflow agent execution' })) + + await waitFor(() => { + expect(mocks.messagesQueryOptions).toHaveBeenCalledWith({ + input: { + params: { + agent_id: 'agent-1', + conversation_id: 'execution-1', + }, + query: { + limit: 100, + page: 1, + sort_by: 'created_at', + sort_order: 'asc', + sources: ['workflow:workflow-app-id:workflow-id:v3:agent-node-id'], + }, + }, + }) + }) + expect(screen.getByText('agentV2.agentDetail.logs.executionId')).toBeInTheDocument() + expect(screen.queryByText('appLog.detail.conversationId')).not.toBeInTheDocument() + }) }) }) diff --git a/web/features/agent-v2/agent-detail/logs/components/log-detail-panel.tsx b/web/features/agent-v2/agent-detail/logs/components/log-detail-panel.tsx index 0d3dbb2db1e..34b4036fb2e 100644 --- a/web/features/agent-v2/agent-detail/logs/components/log-detail-panel.tsx +++ b/web/features/agent-v2/agent-detail/logs/components/log-detail-panel.tsx @@ -62,7 +62,9 @@ export function AgentLogDetailPanel({
- {t(($) => $['detail.conversationId'], { ns: 'appLog' })} + {log?.source?.type === 'workflow' + ? tAgentV2(($) => $['agentDetail.logs.executionId']) + : t(($) => $['detail.conversationId'], { ns: 'appLog' })}
{log && ( diff --git a/web/i18n/ar-TN/agent-v-2.json b/web/i18n/ar-TN/agent-v-2.json index a314e953aeb..6c99dbe1658 100644 --- a/web/i18n/ar-TN/agent-v-2.json +++ b/web/i18n/ar-TN/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "وكيل", "agentDetail.logs.description": "تسجل السجلات الكاملة حالة تشغيل التطبيق، بما في ذلك مدخلات المستخدم وردود الوكيل والتخطيط واستخدامات الأدوات.", "agentDetail.logs.empty": "لم يتم العثور على سجلات", + "agentDetail.logs.executionId": "معرّف التنفيذ", "agentDetail.logs.filters.period.allTime": "كل الأوقات", "agentDetail.logs.filters.period.last30days": "آخر 30 يوماً", "agentDetail.logs.filters.period.last7days": "آخر 7 أيام", diff --git a/web/i18n/de-DE/agent-v-2.json b/web/i18n/de-DE/agent-v-2.json index 6d9c6a4309a..667e73b2136 100644 --- a/web/i18n/de-DE/agent-v-2.json +++ b/web/i18n/de-DE/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "Vollständige Logs zeichnen den Laufzeitstatus der Anwendung auf, einschließlich Benutzereingaben, Agentenantworten, Planung und Tool-Nutzung.", "agentDetail.logs.empty": "Keine Logs gefunden", + "agentDetail.logs.executionId": "Ausführungs-ID", "agentDetail.logs.filters.period.allTime": "Gesamter Zeitraum", "agentDetail.logs.filters.period.last30days": "Letzte 30 Tage", "agentDetail.logs.filters.period.last7days": "Letzte 7 Tage", diff --git a/web/i18n/en-US/agent-v-2.json b/web/i18n/en-US/agent-v-2.json index 647bb17ad75..38b041aa1eb 100644 --- a/web/i18n/en-US/agent-v-2.json +++ b/web/i18n/en-US/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "Full logs record the running status of the application, including user inputs, agent replies, planning and tool uses.", "agentDetail.logs.empty": "No logs found", + "agentDetail.logs.executionId": "Execution ID", "agentDetail.logs.filters.period.allTime": "All time", "agentDetail.logs.filters.period.last30days": "Last 30 days", "agentDetail.logs.filters.period.last7days": "Last 7 days", diff --git a/web/i18n/es-ES/agent-v-2.json b/web/i18n/es-ES/agent-v-2.json index 689eb65ad44..575d913eb41 100644 --- a/web/i18n/es-ES/agent-v-2.json +++ b/web/i18n/es-ES/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agente", "agentDetail.logs.description": "Los registros completos registran el estado de ejecución de la aplicación, incluidas las entradas del usuario, las respuestas del agente, la planificación y los usos de herramientas.", "agentDetail.logs.empty": "No se encontraron registros", + "agentDetail.logs.executionId": "ID de ejecución", "agentDetail.logs.filters.period.allTime": "Todo el tiempo", "agentDetail.logs.filters.period.last30days": "Últimos 30 días", "agentDetail.logs.filters.period.last7days": "Últimos 7 días", diff --git a/web/i18n/fa-IR/agent-v-2.json b/web/i18n/fa-IR/agent-v-2.json index bd9fcf99bce..f5010625e3f 100644 --- a/web/i18n/fa-IR/agent-v-2.json +++ b/web/i18n/fa-IR/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "عامل", "agentDetail.logs.description": "گزارش‌های کامل وضعیت اجرای برنامه را ثبت می‌کنند، از جمله ورودی‌های کاربر، پاسخ‌های عامل، برنامه‌ریزی و استفاده از ابزار.", "agentDetail.logs.empty": "هیچ گزارشی یافت نشد", + "agentDetail.logs.executionId": "شناسه اجرا", "agentDetail.logs.filters.period.allTime": "همه زمان‌ها", "agentDetail.logs.filters.period.last30days": "۳۰ روز گذشته", "agentDetail.logs.filters.period.last7days": "۷ روز گذشته", diff --git a/web/i18n/fr-FR/agent-v-2.json b/web/i18n/fr-FR/agent-v-2.json index d6da7fdc02c..aba60914426 100644 --- a/web/i18n/fr-FR/agent-v-2.json +++ b/web/i18n/fr-FR/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "Les journaux complets enregistrent l’état d’exécution de l’application, y compris les entrées des utilisateurs, les réponses de l’agent, la planification et l’utilisation des outils.", "agentDetail.logs.empty": "Aucun journal trouvé", + "agentDetail.logs.executionId": "ID d’exécution", "agentDetail.logs.filters.period.allTime": "Toute la période", "agentDetail.logs.filters.period.last30days": "30 derniers jours", "agentDetail.logs.filters.period.last7days": "7 derniers jours", diff --git a/web/i18n/hi-IN/agent-v-2.json b/web/i18n/hi-IN/agent-v-2.json index f9463312f52..4bdfef1d32a 100644 --- a/web/i18n/hi-IN/agent-v-2.json +++ b/web/i18n/hi-IN/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "एजेंट", "agentDetail.logs.description": "पूर्ण लॉग एप्लिकेशन की चल रही स्थिति को रिकॉर्ड करते हैं, जिसमें उपयोगकर्ता इनपुट, एजेंट उत्तर, योजना और उपकरण उपयोग शामिल हैं।", "agentDetail.logs.empty": "कोई लॉग नहीं मिला", + "agentDetail.logs.executionId": "निष्पादन आईडी", "agentDetail.logs.filters.period.allTime": "हर समय", "agentDetail.logs.filters.period.last30days": "पिछले 30 दिन", "agentDetail.logs.filters.period.last7days": "पिछले 7 दिन", diff --git a/web/i18n/id-ID/agent-v-2.json b/web/i18n/id-ID/agent-v-2.json index 631299ff4b3..44a23a33b29 100644 --- a/web/i18n/id-ID/agent-v-2.json +++ b/web/i18n/id-ID/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agen", "agentDetail.logs.description": "Log lengkap mencatat status berjalan aplikasi, termasuk input pengguna, balasan agen, perencanaan, dan penggunaan alat.", "agentDetail.logs.empty": "Tidak ada log ditemukan", + "agentDetail.logs.executionId": "ID Eksekusi", "agentDetail.logs.filters.period.allTime": "Sepanjang waktu", "agentDetail.logs.filters.period.last30days": "30 hari terakhir", "agentDetail.logs.filters.period.last7days": "7 hari terakhir", diff --git a/web/i18n/it-IT/agent-v-2.json b/web/i18n/it-IT/agent-v-2.json index 5621a9b5117..ec5b3238c8b 100644 --- a/web/i18n/it-IT/agent-v-2.json +++ b/web/i18n/it-IT/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agente", "agentDetail.logs.description": "I log completi registrano lo stato di esecuzione dell’applicazione, inclusi input degli utenti, risposte dell’agente, pianificazione e uso degli strumenti.", "agentDetail.logs.empty": "Nessun log trovato", + "agentDetail.logs.executionId": "ID esecuzione", "agentDetail.logs.filters.period.allTime": "Tutto il periodo", "agentDetail.logs.filters.period.last30days": "Ultimi 30 giorni", "agentDetail.logs.filters.period.last7days": "Ultimi 7 giorni", diff --git a/web/i18n/ja-JP/agent-v-2.json b/web/i18n/ja-JP/agent-v-2.json index 88a7ed8b187..2d6ade40c66 100644 --- a/web/i18n/ja-JP/agent-v-2.json +++ b/web/i18n/ja-JP/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "エージェント", "agentDetail.logs.description": "完全なログには、ユーザー入力、エージェントの応答、計画、ツールの使用など、アプリケーションの実行状況が記録されます。", "agentDetail.logs.empty": "ログが見つかりません", + "agentDetail.logs.executionId": "実行 ID", "agentDetail.logs.filters.period.allTime": "全期間", "agentDetail.logs.filters.period.last30days": "過去 30 日間", "agentDetail.logs.filters.period.last7days": "過去 7 日間", diff --git a/web/i18n/ko-KR/agent-v-2.json b/web/i18n/ko-KR/agent-v-2.json index b6bb3466062..822a7cebf1e 100644 --- a/web/i18n/ko-KR/agent-v-2.json +++ b/web/i18n/ko-KR/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "에이전트", "agentDetail.logs.description": "전체 로그는 사용자 입력, 에이전트 응답, 계획 및 도구 사용을 포함한 애플리케이션의 실행 상태를 기록합니다.", "agentDetail.logs.empty": "로그가 없습니다", + "agentDetail.logs.executionId": "실행 ID", "agentDetail.logs.filters.period.allTime": "전체 기간", "agentDetail.logs.filters.period.last30days": "지난 30 일", "agentDetail.logs.filters.period.last7days": "지난 7 일", diff --git a/web/i18n/nl-NL/agent-v-2.json b/web/i18n/nl-NL/agent-v-2.json index d11349464a4..e9a481dd27f 100644 --- a/web/i18n/nl-NL/agent-v-2.json +++ b/web/i18n/nl-NL/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "Volledige logs registreren de status van de applicatie tijdens het uitvoeren, inclusief gebruikersinvoer, antwoorden van de agent, planning en gebruik van tools.", "agentDetail.logs.empty": "Geen logs gevonden", + "agentDetail.logs.executionId": "Uitvoerings-ID", "agentDetail.logs.filters.period.allTime": "Alle tijd", "agentDetail.logs.filters.period.last30days": "Laatste 30 dagen", "agentDetail.logs.filters.period.last7days": "Laatste 7 dagen", diff --git a/web/i18n/pl-PL/agent-v-2.json b/web/i18n/pl-PL/agent-v-2.json index 8509c7a6f71..08d38a78fac 100644 --- a/web/i18n/pl-PL/agent-v-2.json +++ b/web/i18n/pl-PL/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "Pełne logi rejestrują stan działania aplikacji, w tym dane wejściowe użytkownika, odpowiedzi agenta, planowanie i użycie narzędzi.", "agentDetail.logs.empty": "Nie znaleziono logów", + "agentDetail.logs.executionId": "ID wykonania", "agentDetail.logs.filters.period.allTime": "Cały czas", "agentDetail.logs.filters.period.last30days": "Ostatnie 30 dni", "agentDetail.logs.filters.period.last7days": "Ostatnie 7 dni", diff --git a/web/i18n/pt-BR/agent-v-2.json b/web/i18n/pt-BR/agent-v-2.json index 86ece3d0b64..7be178ce8a4 100644 --- a/web/i18n/pt-BR/agent-v-2.json +++ b/web/i18n/pt-BR/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agente", "agentDetail.logs.description": "Os logs completos registram o status de execução do aplicativo, incluindo entradas do usuário, respostas do agente, planejamento e uso de ferramentas.", "agentDetail.logs.empty": "Nenhum log encontrado", + "agentDetail.logs.executionId": "ID da execução", "agentDetail.logs.filters.period.allTime": "Todo o período", "agentDetail.logs.filters.period.last30days": "Últimos 30 dias", "agentDetail.logs.filters.period.last7days": "Últimos 7 dias", diff --git a/web/i18n/ro-RO/agent-v-2.json b/web/i18n/ro-RO/agent-v-2.json index 97047c94ba7..7878a64e265 100644 --- a/web/i18n/ro-RO/agent-v-2.json +++ b/web/i18n/ro-RO/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "Jurnalele complete înregistrează starea de execuție a aplicației, inclusiv intrările utilizatorilor, răspunsurile agentului, planificarea și utilizarea instrumentelor.", "agentDetail.logs.empty": "Niciun jurnal găsit", + "agentDetail.logs.executionId": "ID execuție", "agentDetail.logs.filters.period.allTime": "Toată perioada", "agentDetail.logs.filters.period.last30days": "Ultimele 30 de zile", "agentDetail.logs.filters.period.last7days": "Ultimele 7 zile", diff --git a/web/i18n/ru-RU/agent-v-2.json b/web/i18n/ru-RU/agent-v-2.json index 438fc25cf0e..75189915bd4 100644 --- a/web/i18n/ru-RU/agent-v-2.json +++ b/web/i18n/ru-RU/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Агент", "agentDetail.logs.description": "Полные журналы записывают статус работы приложения, включая ввод пользователя, ответы агента, планирование и использование инструментов.", "agentDetail.logs.empty": "Журналы не найдены", + "agentDetail.logs.executionId": "ID выполнения", "agentDetail.logs.filters.period.allTime": "За всё время", "agentDetail.logs.filters.period.last30days": "Последние 30 дней", "agentDetail.logs.filters.period.last7days": "Последние 7 дней", diff --git a/web/i18n/sl-SI/agent-v-2.json b/web/i18n/sl-SI/agent-v-2.json index 2411c4defbf..64ca2c71d70 100644 --- a/web/i18n/sl-SI/agent-v-2.json +++ b/web/i18n/sl-SI/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "Polni dnevniki beležijo stanje izvajanja aplikacije, vključno z uporabniškimi vnosi, odgovori agenta, načrtovanjem in uporabo orodij.", "agentDetail.logs.empty": "Dnevnikov ni", + "agentDetail.logs.executionId": "ID izvedbe", "agentDetail.logs.filters.period.allTime": "Ves čas", "agentDetail.logs.filters.period.last30days": "Zadnjih 30 dni", "agentDetail.logs.filters.period.last7days": "Zadnjih 7 dni", diff --git a/web/i18n/th-TH/agent-v-2.json b/web/i18n/th-TH/agent-v-2.json index 6aecaac98d6..edba1cd3e0f 100644 --- a/web/i18n/th-TH/agent-v-2.json +++ b/web/i18n/th-TH/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "ตัวแทน", "agentDetail.logs.description": "บันทึกแบบเต็มจะบันทึกสถานะการทำงานของแอปพลิเคชัน รวมถึงอินพุตของผู้ใช้ การตอบกลับของตัวแทน การวางแผน และการใช้เครื่องมือ", "agentDetail.logs.empty": "ไม่พบบันทึก", + "agentDetail.logs.executionId": "รหัสการดำเนินการ", "agentDetail.logs.filters.period.allTime": "ตลอดเวลา", "agentDetail.logs.filters.period.last30days": "30 วันที่ผ่านมา", "agentDetail.logs.filters.period.last7days": "7 วันที่ผ่านมา", diff --git a/web/i18n/tr-TR/agent-v-2.json b/web/i18n/tr-TR/agent-v-2.json index 6e6fa6f8a12..ad526c60d26 100644 --- a/web/i18n/tr-TR/agent-v-2.json +++ b/web/i18n/tr-TR/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Ajan", "agentDetail.logs.description": "Tam günlükler, kullanıcı girişleri, ajan yanıtları, planlama ve araç kullanımları dahil olmak üzere uygulamanın çalışma durumunu kaydeder.", "agentDetail.logs.empty": "Günlük bulunamadı", + "agentDetail.logs.executionId": "Yürütme Kimliği", "agentDetail.logs.filters.period.allTime": "Tüm zamanlar", "agentDetail.logs.filters.period.last30days": "Son 30 gün", "agentDetail.logs.filters.period.last7days": "Son 7 gün", diff --git a/web/i18n/uk-UA/agent-v-2.json b/web/i18n/uk-UA/agent-v-2.json index facb6c833a1..5c054ec2815 100644 --- a/web/i18n/uk-UA/agent-v-2.json +++ b/web/i18n/uk-UA/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Агент", "agentDetail.logs.description": "Повні журнали записують стан роботи застосунка, включаючи введення користувача, відповіді агента, планування та використання інструментів.", "agentDetail.logs.empty": "Журнали не знайдено", + "agentDetail.logs.executionId": "ID виконання", "agentDetail.logs.filters.period.allTime": "За весь час", "agentDetail.logs.filters.period.last30days": "Останні 30 днів", "agentDetail.logs.filters.period.last7days": "Останні 7 днів", diff --git a/web/i18n/vi-VN/agent-v-2.json b/web/i18n/vi-VN/agent-v-2.json index 2cf906bdef7..92080c04bb2 100644 --- a/web/i18n/vi-VN/agent-v-2.json +++ b/web/i18n/vi-VN/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Tác nhân", "agentDetail.logs.description": "Nhật ký đầy đủ ghi lại trạng thái chạy của ứng dụng, bao gồm đầu vào của người dùng, phản hồi của tác nhân, lập kế hoạch và sử dụng công cụ.", "agentDetail.logs.empty": "Không tìm thấy nhật ký", + "agentDetail.logs.executionId": "ID thực thi", "agentDetail.logs.filters.period.allTime": "Mọi lúc", "agentDetail.logs.filters.period.last30days": "30 ngày qua", "agentDetail.logs.filters.period.last7days": "7 ngày qua", diff --git a/web/i18n/zh-Hans/agent-v-2.json b/web/i18n/zh-Hans/agent-v-2.json index 25edfb9faee..a4de41004fb 100644 --- a/web/i18n/zh-Hans/agent-v-2.json +++ b/web/i18n/zh-Hans/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "完整日志记录应用运行状态,包括用户输入、Agent 回复、规划和工具使用。", "agentDetail.logs.empty": "暂无日志", + "agentDetail.logs.executionId": "执行 ID", "agentDetail.logs.filters.period.allTime": "全部时间", "agentDetail.logs.filters.period.last30days": "最近 30 天", "agentDetail.logs.filters.period.last7days": "最近 7 天", diff --git a/web/i18n/zh-Hant/agent-v-2.json b/web/i18n/zh-Hant/agent-v-2.json index 26a68864b9d..dde68a244f2 100644 --- a/web/i18n/zh-Hant/agent-v-2.json +++ b/web/i18n/zh-Hant/agent-v-2.json @@ -279,6 +279,7 @@ "agentDetail.documentTitle": "Agent", "agentDetail.logs.description": "完整日誌記錄應用程式執行狀態,包括使用者輸入、Agent 回覆、規劃和工具使用。", "agentDetail.logs.empty": "暫無日誌", + "agentDetail.logs.executionId": "執行 ID", "agentDetail.logs.filters.period.allTime": "全部時間", "agentDetail.logs.filters.period.last30days": "最近 30 天", "agentDetail.logs.filters.period.last7days": "最近 7 天", diff --git a/web/service/client.spec.ts b/web/service/client.spec.ts index 566666e92bf..51bb42a4eb9 100644 --- a/web/service/client.spec.ts +++ b/web/service/client.spec.ts @@ -35,6 +35,16 @@ const loadConsoleQueryWithRequest = async (request: ReturnType) => return module.consoleQuery } +const loadConsoleQueryWithFetch = async () => { + vi.resetModules() + vi.doUnmock('./base') + vi.doMock('@/utils/client', () => ({ isClient: true, isServer: false })) + const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const module = await import('./client') + warnSpy.mockRestore() + return module.consoleQuery +} + const loadWorkflowGenerationStream = async (sseGeneratorPost: ReturnType) => { vi.resetModules() vi.doMock('@/utils/client', () => ({ isClient: true, isServer: false })) @@ -355,7 +365,7 @@ describe('consoleQuery transport context', () => { }) it('should serialize trial app dataset ids as repeated query params', async () => { - const request = vi.fn().mockResolvedValue( + const fetchSpy = vi.spyOn(globalThis, 'fetch').mockResolvedValue( new Response( JSON.stringify({ data: [], @@ -372,7 +382,7 @@ describe('consoleQuery transport context', () => { }, ), ) - const consoleQuery = await loadConsoleQueryWithRequest(request) + const consoleQuery = await loadConsoleQueryWithFetch() const queryOptions = consoleQuery.trialApps.byAppId.datasets.get.queryOptions({ input: { params: { @@ -386,14 +396,12 @@ describe('consoleQuery transport context', () => { await queryOptions.queryFn({ signal: new AbortController().signal } as QueryFunctionContext) - expect(request).toHaveBeenCalledWith( - expect.stringContaining('/trial-apps/app-1/datasets?ids=id-1&ids=id-2'), - expect.any(Object), - expect.objectContaining({ - fetchCompat: true, - }), - ) - expect(request.mock.calls[0]![0]).not.toContain('ids%5B0%5D') + expect(fetchSpy).toHaveBeenCalledTimes(1) + const resource = fetchSpy.mock.calls[0]![0] + const requestURL = new URL(resource instanceof Request ? resource.url : resource.toString()) + expect(requestURL.searchParams.getAll('ids')).toEqual(['id-1', 'id-2']) + expect(requestURL.searchParams.has('ids[0]')).toBe(false) + expect(requestURL.searchParams.has('ids[1]')).toBe(false) }) it('should consume KnowledgeFS processing events through the generated stream contract', async () => { diff --git a/web/service/client.ts b/web/service/client.ts index 062b16ab468..354b592baf3 100644 --- a/web/service/client.ts +++ b/web/service/client.ts @@ -74,10 +74,13 @@ function createConsoleOpenAPILink(contract: AnyContractRouter): ConsoleClientLin url: getBaseURL(API_PREFIX), fetch: (input, init, options) => { const requestInit = options.context.keepalive ? { ...init, keepalive: true } : init + const normalizedURL = normalizeConsoleOpenAPIURL(input.url) + const normalizedRequest = + normalizedURL === input.url ? input : new Request(normalizedURL, input) - return request(normalizeConsoleOpenAPIURL(input.url), requestInit, { + return request(normalizedURL, requestInit, { fetchCompat: true, - request: input, + request: normalizedRequest, silent: options.context.silent, }) },