diff --git a/internal/cloud/code-agent-trace-store.ts b/internal/cloud/code-agent-trace-store.ts index 1819454c..35e39d99 100644 --- a/internal/cloud/code-agent-trace-store.ts +++ b/internal/cloud/code-agent-trace-store.ts @@ -332,7 +332,7 @@ function normalizeTraceEvent(event, { traceId, seq, now, fallbackRunnerKind } = stdoutSummary: safeText(event.stdoutSummary, 600), stderrSummary: safeText(event.stderrSummary, 600), chunk: safeText(event.chunk, 400), - message: safeText(event.message, 500), + message: safeText(event.message, 1200), errorCode: safeText(event.errorCode, 120), waitingFor: safeText(event.waitingFor, 220), timeoutMs: typeof event.timeoutMs === "number" ? Math.trunc(event.timeoutMs) : undefined, diff --git a/internal/cloud/codex-stdio-session-turn-state.ts b/internal/cloud/codex-stdio-session-turn-state.ts index 1d6a9ea9..0329b0b3 100644 --- a/internal/cloud/codex-stdio-session-turn-state.ts +++ b/internal/cloud/codex-stdio-session-turn-state.ts @@ -161,11 +161,14 @@ export function createAppServerTurnState({ traceRecorder, session } = {}) { return; } if (method === "item/completed" && item?.type === "agentMessage") { - if (typeof item.text === "string") finalResponse = item.text; + const completedText = typeof item.text === "string" ? item.text : ""; + if (completedText) finalResponse = completedText; appendTrace({ type: "assistant_message", status: "completed", label: "assistant:item_completed", + itemId: optionalId(item.id), + message: redactText(completedText), sessionId: session?.sessionId, sessionStatus: session?.status, turn: session?.turn, diff --git a/web/hwlab-cloud-web/app-trace.test.ts b/web/hwlab-cloud-web/app-trace.test.ts index cc9b6398..9952486e 100644 --- a/web/hwlab-cloud-web/app-trace.test.ts +++ b/web/hwlab-cloud-web/app-trace.test.ts @@ -32,6 +32,41 @@ test("trace display rows render completion when no terminal assistant event exis assert.equal(rows.some((row) => /轮次完成/u.test(row.header)), true); }); +test("trace display rows render assistant item text when stream snapshot is absent", () => { + const events = [ + event(1, "request:accepted", { promptSummary: "请列出 device-pod" }), + event(2, "assistant:item_completed", { + type: "assistant_message", + status: "completed", + itemId: "msg_item_0", + message: "当前有以下 **5 个 device-pod** 可用。" + }), + commandEvent(3, "item/commandExecution:completed", { + itemId: "cmd-trace-2", + command: "grep -rn device-pod /workspace/hwlab", + status: "completed", + exitCode: 0, + stdoutSummary: "success=true" + }), + event(4, "assistant:completed", { + type: "assistant_message", + terminal: true, + status: "completed", + itemId: "assistant-final", + message: "可以继续指定要操作的 device-pod。" + }) + ]; + + const rows = traceDisplayRows({ traceId: "trc_assistant_item_text", events }, events); + const text = rows.map((row) => `${row.header}\n${row.body ?? ""}`).join("\n---\n"); + + assert.match(text, /🤖 助手消息(第一条)/u); + assert.match(text, /当前有以下 \*\*5 个 device-pod\*\* 可用/u); + assert.match(text, /工具调用/u); + assert.match(text, /助手最后一条消息/u); + assert.match(text, /可以继续指定要操作的 device-pod/u); +}); + function traceEvents() { return [ event(1, "request:accepted", { promptSummary: "请检查 trace" }), diff --git a/web/hwlab-cloud-web/index.html b/web/hwlab-cloud-web/index.html index 24840b68..0c56e57f 100644 --- a/web/hwlab-cloud-web/index.html +++ b/web/hwlab-cloud-web/index.html @@ -314,10 +314,6 @@
等待 /v1/device-pods 事件流。-