From a85c2a1854bbbc1f873a5ea28cf15d9303a2f870 Mon Sep 17 00:00:00 2001 From: Codex Date: Sat, 16 May 2026 17:19:39 +0000 Subject: [PATCH] fix trace view message overlay --- .../microservices/code-queue/src/task-view.ts | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/components/microservices/code-queue/src/task-view.ts b/src/components/microservices/code-queue/src/task-view.ts index 1e9e2a17..2d552688 100644 --- a/src/components/microservices/code-queue/src/task-view.ts +++ b/src/components/microservices/code-queue/src/task-view.ts @@ -754,6 +754,33 @@ function coalesceTranscriptMessageFragments(entries: TranscriptLine[]): Transcri return merged; } +function traceMessageOverlayKey(line: TranscriptLine): string | null { + return messageFragmentMergeKey(line); +} + +function traceMessageOverlayCandidate(line: TranscriptLine): boolean { + return traceMessageOverlayKey(line) !== null && String(line.bodyPreview || "").trim().length > 0; +} + +function overlayTraceMessagesFromRawTranscript(oaLines: TranscriptLine[], rawLines: TranscriptLine[]): TranscriptLine[] { + const rawMessages = rawLines.filter(traceMessageOverlayCandidate); + if (rawMessages.length === 0) return oaLines; + const messageSeqs = new Set(); + for (const line of oaLines) { + if (traceMessageOverlayKey(line) === null) continue; + for (const seq of Array.isArray(line.rawSeqs) && line.rawSeqs.length > 0 ? line.rawSeqs : [line.seq]) { + if (Number.isFinite(Number(seq))) messageSeqs.add(Number(seq)); + } + } + const result = oaLines.filter((line) => traceMessageOverlayKey(line) === null); + for (const raw of rawMessages) { + const seqs = Array.isArray(raw.rawSeqs) && raw.rawSeqs.length > 0 ? raw.rawSeqs : [raw.seq]; + if (!seqs.some((seq) => messageSeqs.has(Number(seq)))) continue; + result.push(raw); + } + return coalesceTranscriptMessageFragments(result); +} + function commandKind(command: string): TranscriptKind { if (/\b(apply_patch|git apply|cat >|tee .*<<|sed -i|python3? .*write_text)\b/u.test(command)) return "edited"; @@ -1836,9 +1863,12 @@ function oaTraceStepToTranscriptLine(step: OaTraceStepSummary): TranscriptLine { }; } -async function oaTraceTranscriptForTask(taskId: string, attemptIndex: number | null): Promise { +async function oaTraceTranscriptForTask(task: QueueTask, attemptIndex: number | null): Promise { + const taskId = task.id; const steps = await readOaTraceStepsForTask(taskId, attemptIndex); - return coalesceTranscriptMessageFragments(steps.map(oaTraceStepToTranscriptLine).filter(traceLineVisibleInTraceView)); + const oaLines = coalesceTranscriptMessageFragments(steps.map(oaTraceStepToTranscriptLine).filter(traceLineVisibleInTraceView)); + const rawLines = fullTranscript(task).filter(traceLineVisibleInTraceView); + return overlayTraceMessagesFromRawTranscript(oaLines, rawLines); } function mergeTraceWindowLines(left: TranscriptLine[], right: TranscriptLine[]): TranscriptLine[] { @@ -2243,7 +2273,7 @@ async function taskTraceStepsResponse(task: QueueTask, url: URL): Promise Number(item.seq) === seq || item.rawSeqs.includes(seq)); if (line === undefined) return ctx().jsonResponse({ ok: false, error: "trace step not found", seq }, 404); return ctx().jsonResponse({