fix: preserve full web trace details

This commit is contained in:
Codex Agent
2026-06-08 13:13:48 +08:00
parent 23c414834f
commit 19161b5f82
2 changed files with 38 additions and 19 deletions
+5 -4
View File
@@ -3146,7 +3146,7 @@ function webTraceRenderBody(traceObject: any, parsed: ParsedArgs) {
loaded: events.length
} : undefined,
assistantText: assistantText(traceObject),
rows: rowTail.map(compactTraceRenderRow),
rows: rowTail.map((row) => compactTraceRenderRow(row, { full: parsed.full === true })),
retention: traceObject?.retention,
terminalEvidence: traceObject?.terminalEvidence,
finalResponse: traceObject?.finalResponse,
@@ -3211,7 +3211,8 @@ function traceResponseAliases(traceBody: any, parsed: ParsedArgs) {
};
}
function compactTraceRenderRow(row: any) {
function compactTraceRenderRow(row: any, options: { full?: boolean } = {}) {
const body = row?.body === undefined || row?.body === null ? undefined : String(row.body);
return pruneUndefined({
rowId: row?.rowId ?? null,
seq: row?.seq ?? null,
@@ -3219,8 +3220,8 @@ function compactTraceRenderRow(row: any) {
header: row?.header ?? null,
bodyFormat: row?.bodyFormat ?? null,
terminal: row?.terminal === true ? true : undefined,
body: row?.body
? (row?.terminal === true ? String(row.body) : preview(String(row.body), 1200))
body: body
? (options.full === true || row?.terminal === true ? body : preview(body, 1200))
: undefined
});
}
+33 -15
View File
@@ -146,12 +146,12 @@ function traceToolCallRow(trace: Record<string, unknown>, event: TraceEvent): Tr
function traceToolCallBody(event: TraceEvent, command: string | null): string | null {
const lines = [
command,
event.stdoutSummary ? `stdout:\n${compactTraceOneLine(event.stdoutSummary, 1200)}` : null,
event.stderrSummary ? `stderr:\n${compactTraceOneLine(event.stderrSummary, 800)}` : null,
command ? null : event.outputSummary,
traceDetailBlock("stdout", traceEventText(event, ["stdout", "stdoutText", "stdoutSummary"])),
traceDetailBlock("stderr", traceEventText(event, ["stderr", "stderrText", "stderrSummary"])),
command ? null : traceEventText(event, ["output", "outputText", "outputSummary"]),
event.exitCode !== undefined ? `exitCode=${event.exitCode}` : null
].map(cleanTraceText).filter(Boolean);
return lines.length > 0 ? lines.join("\n").slice(0, 1400) : null;
].map(cleanTraceDetailText).filter(Boolean);
return lines.length > 0 ? lines.join("\n") : null;
}
export function traceNoiseEventCount(events: TraceEvent[] = []): number {
@@ -456,14 +456,14 @@ function traceDisplayBody(event: TraceEvent): string | null {
const command = cleanShellCommand(event.command);
const lines = [
command,
event.stdoutSummary ? `stdout:\n${compactTraceOneLine(event.stdoutSummary, 1200)}` : null,
event.stderrSummary ? `stderr:\n${compactTraceOneLine(event.stderrSummary, 800)}` : null,
event.outputSummary,
event.promptSummary,
event.message,
event.chunk
].map(cleanTraceText).filter(Boolean);
return lines.length > 0 ? lines.join("\n").slice(0, 1400) : null;
traceDetailBlock("stdout", traceEventText(event, ["stdout", "stdoutText", "stdoutSummary"])),
traceDetailBlock("stderr", traceEventText(event, ["stderr", "stderrText", "stderrSummary"])),
traceEventText(event, ["output", "outputText", "outputSummary"]),
traceEventText(event, ["prompt", "promptText", "promptSummary"]),
traceEventText(event, ["message"]),
traceEventText(event, ["chunk"])
].map(cleanTraceDetailText).filter(Boolean);
return lines.length > 0 ? lines.join("\n") : null;
}
function traceMarkdownPreviewLines(body: string | null | undefined): string[] {
@@ -560,12 +560,30 @@ function cleanTraceText(value: unknown): string {
return String(value ?? "").replace(/\u0000/gu, "").replace(/\r\n|\r/gu, "\n").replace(/[ \t]{2,}/gu, " ").replace(/\n{3,}/gu, "\n\n").trim();
}
function cleanTraceDetailText(value: unknown): string {
return String(value ?? "").replace(/\u0000/gu, "").replace(/\r\n|\r/gu, "\n").replace(/\n{4,}/gu, "\n\n\n").trim();
}
function traceEventText(event: TraceEvent, keys: string[]): string | null {
for (const key of keys) {
const value = event[key];
if (value === undefined || value === null) continue;
const body = cleanTraceDetailText(value);
if (body) return body;
}
return null;
}
function traceDetailBlock(label: string, value: string | null): string | null {
return value ? `${label}:\n${value}` : null;
}
function cleanShellCommand(value: unknown): string | null {
const raw = cleanTraceText(value);
const raw = cleanTraceDetailText(value);
if (!raw) return null;
const stripped = stripShellWrapper(raw);
const unescaped = stripped.replace(/\\(["`$\\])/gu, "$1");
return compactTraceOneLine(unescaped, 900);
return cleanTraceDetailText(unescaped);
}
function stripShellWrapper(value: string): string {