fix: prefer terminal markdown final response

This commit is contained in:
Codex Agent
2026-06-06 01:23:18 +08:00
parent eb9267a31f
commit 8f7bc79d1e
3 changed files with 55 additions and 2 deletions
@@ -72,6 +72,28 @@ test("mergeTraceResults uses final assistant authority instead of later progress
assert.doesNotMatch(merged.assistantText ?? "", / --- ## hwpod-spec ###/u);
});
test("mergeTraceResults prefers terminal result markdown over non-final flattened trace snapshots", () => {
const resultMarkdown = "ISSUE959_MARKDOWN_OK\n\n## hwpod-spec 机制说明\n\n- 第一条\n- 第二条\n\n```bash\nhwpod inspect --dry-run\n```";
const flattenedTrace = "I'll read context first.ISSUE959_MARKDOWN_OK ## hwpod-spec 机制说明 - 第一条 - 第二条 ```bash hwpod inspect --dry-run ```";
const terminal: AgentChatResultResponse = {
status: "completed",
traceId: "trc_issue959_real_payload",
reply: { role: "assistant", content: resultMarkdown }
};
const events: TraceEvent[] = [
{ seq: 31, label: "agentrun:assistant:message", type: "assistant", status: "running", message: flattenedTrace },
{ seq: 36, label: "agentrun:assistant:message", type: "assistant", status: "running", message: flattenedTrace },
{ seq: 42, label: "agentrun:result:completed", type: "result", status: "completed", terminal: true, message: "AgentRun result is ready for HWLAB short-connection polling." }
];
const trace: TraceSnapshot = { traceId: "trc_issue959_real_payload", status: "completed", events, eventCount: events.length, lastEventLabel: "agentrun:result:completed" };
const merged = mergeTraceResults(terminal, trace);
assert.equal(merged.assistantText, resultMarkdown);
assert.match(merged.assistantText ?? "", /ISSUE959_MARKDOWN_OK\n\n## hwpod-spec/u);
assert.doesNotMatch(merged.assistantText ?? "", /^I'll read context first/u);
});
test("mergeTraceResults prefers persisted finalResponse text for expired or compact natural traces", () => {
const finalMarkdown = "**结论**\n\n- 自然结束和刷新后都应该显示这一段。\n- Markdown 换行必须保留。";
const terminal: AgentChatResultResponse = {
@@ -97,7 +97,10 @@ export function mergeTraceResults(terminal: AgentChatResultResponse, trace: Trac
const terminalRunnerEvents = Array.isArray(terminalRunnerTrace?.events) ? terminalRunnerTrace.events : [];
const events = longestTraceEvents(traceEvents, terminalEvents, terminalRunnerEvents);
const mergedTrace = { ...trace, events, eventCount: trace.eventCount ?? events.length };
const assistantText = finalResponseText(trace.finalResponse) ?? assistantTextFromTraceEvents(events) ?? firstNonEmptyResultText(terminal);
const assistantText = finalResponseText(trace.finalResponse)
?? terminalAssistantTextFromTraceEvents(events)
?? firstNonEmptyResultText(terminal)
?? assistantTextFromTraceEvents(events);
return {
...terminal,
traceId: trace.traceId ?? terminal.traceId,