fix: avoid false expired trace labels

This commit is contained in:
Codex Agent
2026-06-06 00:23:00 +08:00
parent e5636efa24
commit eeb759f970
2 changed files with 35 additions and 2 deletions
@@ -83,3 +83,23 @@ test("message trace panel renders persisted fallback for expired historical trac
assert.match(html, /sourceEventCount=31/u);
assert.doesNotMatch(html, //u);
});
test("message trace panel does not label completed traces with pending replay as expired", () => {
const trace: RunnerTrace = {
traceId: "trc_issue955_completed_replay",
status: "completed",
traceStatus: "completed",
events: [],
eventCount: 106,
traceSummary: { sourceEventCount: 106, terminalStatus: "completed", source: "code-agent-result" },
finalResponse: { text: "这里看到了 gateway sessions。" }
};
const html = renderToStaticMarkup(<MessageTracePanel trace={trace} defaultOpen />);
assert.match(html, / trace /u);
assert.match(html, /traceStatus=completed/u);
assert.match(html, /sourceEventCount=106/u);
assert.match(html, / gateway sessions/u);
assert.doesNotMatch(html, / trace /u);
});
@@ -127,16 +127,29 @@ function persistentTraceFallbackRows(trace: RunnerTrace): TraceEventRow[] {
const sourceCount = positiveInteger(summary?.sourceEventCount ?? summary?.eventCount ?? trace.eventCount);
if (!text && fallback?.available !== true && sourceCount === 0) return [];
const status = firstNonEmptyTraceText(trace.traceStatus, trace.status, summary?.terminalStatus, objectOrNull(trace.agentRun)?.terminalStatus) ?? "expired";
const header = `${trace.traceId ?? "trace"} 历史 trace 已过期,显示持久化摘要`;
const expired = isExpiredTraceStatus(trace.traceStatus, trace.status) || isExpiredTraceFallback(fallback);
const header = expired
? `${trace.traceId ?? "trace"} 历史 trace 已过期,显示持久化摘要`
: `${trace.traceId ?? "trace"} 完整 trace 回放中,先显示持久化摘要`;
const meta = [
`traceStatus=${status}`,
sourceCount > 0 ? `sourceEventCount=${sourceCount}` : null,
firstNonEmptyTraceText(fallback?.source, summary?.source) ? `source=${firstNonEmptyTraceText(fallback?.source, summary?.source)}` : null
].filter(Boolean).join("\n");
const body = [meta, text].filter(Boolean).join("\n\n") || "后端没有保留原始 event,但已返回持久化 trace 摘要。";
const body = [meta, text].filter(Boolean).join("\n\n") || (expired ? "后端没有保留原始 event,但已返回持久化 trace 摘要。" : "后端声明存在原始 event,正在通过 trace 回放入口补齐完整事件列表。");
return [{ rowId: `fallback:${trace.traceId ?? "trace"}`, seq: null, tone: "source", header, body, terminal: true, bodyFormat: text ? "markdown" : "text" }];
}
function isExpiredTraceStatus(...values: unknown[]): boolean {
return values.some((value) => ["expired", "missing"].includes(String(value ?? "").trim().toLowerCase()));
}
function isExpiredTraceFallback(fallback: Record<string, unknown> | null): boolean {
const store = String(fallback?.liveTraceStore ?? "").trim().toLowerCase();
const source = String(fallback?.source ?? "").trim().toLowerCase();
return store.includes("expired") || source.includes("expired");
}
function objectOrNull(value: unknown): Record<string, unknown> | null {
return value && typeof value === "object" ? value as Record<string, unknown> : null;
}