fix: isolate codex stdio turn routing

This commit is contained in:
Codex
2026-06-01 00:24:20 +08:00
parent 7b64427690
commit bbc3f8dca8
6 changed files with 422 additions and 57 deletions
+42 -2
View File
@@ -150,7 +150,7 @@ export function createCodeAgentTraceStore(options = {}) {
eventLabels: events.map((event) => event.label).filter(Boolean),
lastEvent,
elapsedMs: elapsedMs(trace.startedAt, trace.finishedAt ?? trace.updatedAt),
waitingFor: lastWaitingFor(events) ?? assistantStreams.at(-1)?.waitingFor ?? null,
waitingFor: snapshotWaitingFor(trace, events, assistantStreams, lastEvent),
runnerKind: extra.runnerKind ?? trace.meta.runnerKind ?? null,
workspace: extra.workspace ?? trace.meta.workspace ?? null,
sandbox: extra.sandbox ?? trace.meta.sandbox ?? null,
@@ -334,6 +334,8 @@ function normalizeTraceEvent(event, { traceId, seq, now, fallbackRunnerKind } =
chunk: safeText(event.chunk, 400),
message: safeText(event.message, 1200),
errorCode: safeText(event.errorCode, 120),
diagnosisCode: safeText(event.diagnosisCode ?? event.diagnosis?.code, 160),
diagnosis: normalizeDiagnosis(event.diagnosis),
waitingFor: safeText(event.waitingFor, 220),
timeoutMs: typeof event.timeoutMs === "number" ? Math.trunc(event.timeoutMs) : undefined,
hardTimeoutMs: typeof event.hardTimeoutMs === "number" ? Math.trunc(event.hardTimeoutMs) : undefined,
@@ -397,7 +399,7 @@ function notify(trace, event) {
eventLabels: trace.events.map((item) => item.label).filter(Boolean),
lastEvent: event ?? trace.events.at(-1) ?? null,
elapsedMs: elapsedMs(trace.startedAt, trace.finishedAt ?? trace.updatedAt),
waitingFor: lastWaitingFor(trace.events) ?? assistantStreams.at(-1)?.waitingFor ?? null,
waitingFor: snapshotWaitingFor(trace, trace.events, assistantStreams, event ?? trace.events.at(-1) ?? null),
runnerKind: trace.meta.runnerKind,
workspace: trace.meta.workspace,
sandbox: trace.meta.sandbox,
@@ -460,6 +462,14 @@ function lastWaitingFor(events) {
return null;
}
function snapshotWaitingFor(trace, events, assistantStreams, lastEvent) {
if (lastEvent?.terminal === true) {
return lastEvent.waitingFor ?? null;
}
if (trace?.finishedAt) return null;
return lastWaitingFor(events) ?? assistantStreams.at(-1)?.waitingFor ?? null;
}
function elapsedMs(start, end) {
const startMs = Date.parse(start ?? "");
const endMs = Date.parse(end ?? "");
@@ -467,6 +477,36 @@ function elapsedMs(start, end) {
return Math.max(0, endMs - startMs);
}
function normalizeDiagnosis(value) {
if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
const lastRoutedEvent = value.lastRoutedEvent && typeof value.lastRoutedEvent === "object" && !Array.isArray(value.lastRoutedEvent)
? dropUndefined({
type: safeText(value.lastRoutedEvent.type, 80),
status: safeText(value.lastRoutedEvent.status, 80),
label: safeText(value.lastRoutedEvent.label, 180),
stage: safeText(value.lastRoutedEvent.stage, 80),
toolName: safeText(value.lastRoutedEvent.toolName, 120),
itemId: safeText(value.lastRoutedEvent.itemId, 180),
waitingFor: safeText(value.lastRoutedEvent.waitingFor, 220),
exitCode: Number.isInteger(value.lastRoutedEvent.exitCode) ? value.lastRoutedEvent.exitCode : undefined,
durationMs: typeof value.lastRoutedEvent.durationMs === "number" ? Math.max(0, Math.trunc(value.lastRoutedEvent.durationMs)) : undefined
})
: undefined;
return dropUndefined({
code: safeText(value.code, 160),
layer: safeText(value.layer, 120),
kind: safeText(value.kind, 120),
summary: safeText(value.summary, 500),
waitingFor: safeText(value.waitingFor, 220),
lastActivityAt: safeText(value.lastActivityAt, 80),
idleMs: typeof value.idleMs === "number" ? Math.max(0, Math.trunc(value.idleMs)) : undefined,
lastActivityLabel: safeText(value.lastActivityLabel, 180),
threadId: safeText(value.threadId, 180),
turnId: safeText(value.turnId, 180),
lastRoutedEvent
});
}
function safeText(value, limit = TEXT_LIMIT) {
if (value === undefined || value === null || value === "") return undefined;
const redacted = String(value).replace(SECRET_PATTERN, "[redacted]").replace(/\s+/gu, " ").trim();