




















@@ -1040,6 +1040,7 @@ export async function runCodexAppServerAttempt(
10401040let turnCompletionIdleTimedOut = false;
10411041let turnCompletionIdleTimeoutMessage: string | undefined;
10421042let clientClosedPromptError: string | undefined;
1043+let clientClosedAbort = false;
10431044let lifecycleStarted = false;
10441045let lifecycleTerminalEmitted = false;
10451046let resolveCompletion: (() => void) | undefined;
@@ -2063,6 +2064,7 @@ export async function runCodexAppServerAttempt(
20632064threadId: thread.threadId,
20642065turnId: activeTurnId,
20652066});
2067+clientClosedAbort = true;
20662068runAbortController.abort("client_closed");
20672069completed = true;
20682070clearTurnAttemptIdleTimer();
@@ -2135,7 +2137,8 @@ export async function runCodexAppServerAttempt(
21352137try {
21362138await completion;
21372139const result = activeProjector.buildResult(toolBridge.telemetry, { yieldDetected });
2138-const finalAborted = result.aborted || runAbortController.signal.aborted;
2140+const finalAborted =
2141+result.aborted || (runAbortController.signal.aborted && !clientClosedAbort);
21392142let finalPromptError =
21402143clientClosedPromptError ??
21412144(turnCompletionIdleTimedOut
@@ -2279,11 +2282,14 @@ export async function runCodexAppServerAttempt(
22792282});
22802283if (trajectoryRecorder && !trajectoryEndRecorded) {
22812284trajectoryRecorder.recordEvent("session.ended", {
2282-status: timedOut || runAbortController.signal.aborted ? "interrupted" : "cleanup",
2285+status:
2286+timedOut || (runAbortController.signal.aborted && !clientClosedAbort)
2287+ ? "interrupted"
2288+ : "cleanup",
22832289threadId: thread.threadId,
22842290turnId: activeTurnId,
22852291 timedOut,
2286-aborted: runAbortController.signal.aborted,
2292+aborted: runAbortController.signal.aborted && !clientClosedAbort,
22872293});
22882294}
22892295await runAgentCleanupStep({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。