fix: write codex terminal completion in final outbox (#236)

This commit is contained in:
Lyon
2026-06-23 18:01:11 +08:00
committed by GitHub
parent 92fa2fc4ab
commit 60e6a1ff71
+13 -7
View File
@@ -449,6 +449,12 @@ async function runCodexStdioTurnWithSession(options: CodexStdioTurnOptions, sess
const emitEvents = (nextEvents: BackendEvent[]): void => {
for (const event of nextEvents) emitEvent(event);
};
const appendResultEvent = (event: BackendEvent): void => {
events.push({ ...event, payload: redactJson(event.payload) });
};
const appendResultEvents = (nextEvents: BackendEvent[]): void => {
for (const event of nextEvents) appendResultEvent(event);
};
if (options.abortSignal?.aborted) {
const cancelled = { status: "cancelled" as const, failureKind: "cancelled" as const, message: "cancel requested" };
events.push({ type: "backend_status", payload: { phase: "turn-cancelled", failureKind: "cancelled" } });
@@ -822,14 +828,14 @@ async function runCodexStdioTurnWithSession(options: CodexStdioTurnOptions, sess
if (!terminal) terminal = { status: "failed", failureKind: "backend-response-invalid", message: "codex app-server finished without terminal status" };
const pendingInterrupt: Promise<void> | null = interruptInFlight as Promise<void> | null;
if (pendingInterrupt) await pendingInterrupt.catch(() => undefined);
if (terminal.status !== "completed") emitEvents(await session.close());
emitEvents(flushAssistantDeltaProgress(assistantDeltaProgress));
if (terminal.status !== "completed") appendResultEvents(await session.close());
appendResultEvents(flushAssistantDeltaProgress(assistantDeltaProgress));
const finalAssistant = terminal.status === "completed" ? finalAssistantMessageForTurn(completedAssistantMessages, assistantText) : null;
if (finalAssistant) emitEvent(assistantFinalResponseEvent(finalAssistant));
else if (completedAssistantMessages.length === 0) emitEvents(assistantMessageEventsForTurn(assistantText, false));
emitEvents(suppressedNotificationEvents(suppressedNotifications));
emitEvents(deferredTerminalEvents);
emitEvent({ type: "terminal_status", payload: { terminalStatus: terminal.status, failureKind: terminal.failureKind, message: terminal.message } });
if (finalAssistant) appendResultEvent(assistantFinalResponseEvent(finalAssistant));
else if (completedAssistantMessages.length === 0) appendResultEvents(assistantMessageEventsForTurn(assistantText, false));
appendResultEvents(suppressedNotificationEvents(suppressedNotifications));
appendResultEvents(deferredTerminalEvents);
appendResultEvent({ type: "terminal_status", payload: { terminalStatus: terminal.status, failureKind: terminal.failureKind, message: terminal.message } });
await liveEventWrite;
return { terminalStatus: terminal.status, failureKind: terminal.failureKind, failureMessage: terminal.message, events: events.map((event) => ({ ...event, payload: redactJson(event.payload) })), ...(threadId ? { threadId } : {}), ...(turnId ? { turnId } : {}) };
}