fix: isolate codex stdio turn routing
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user