

























@@ -1060,6 +1060,9 @@ export async function runCodexAppServerAttempt(
10601060let turnAssistantCompletionIdleWatchArmed = false;
10611061let turnAssistantCompletionLastActivityAt = Date.now();
10621062let turnAssistantCompletionLastActivityDetails: Record<string, unknown> | undefined;
1063+const turnAttemptIdleTimeoutMs = Math.max(100, Math.floor(params.timeoutMs));
1064+let turnAttemptIdleTimer: ReturnType<typeof setTimeout> | undefined;
1065+let turnAttemptIdleWatchArmed = false;
10631066let turnTerminalIdleTimer: ReturnType<typeof setTimeout> | undefined;
10641067let turnTerminalIdleWatchArmed = false;
10651068let turnCompletionLastActivityAt = Date.now();
@@ -1091,6 +1094,13 @@ export async function runCodexAppServerAttempt(
10911094}
10921095};
109310961097+const clearTurnAttemptIdleTimer = () => {
1098+if (turnAttemptIdleTimer) {
1099+clearTimeout(turnAttemptIdleTimer);
1100+turnAttemptIdleTimer = undefined;
1101+}
1102+};
1103+10941104const fireTurnAssistantCompletionIdleRelease = () => {
10951105if (completed || runAbortController.signal.aborted || !turnAssistantCompletionIdleWatchArmed) {
10961106return;
@@ -1135,6 +1145,44 @@ export async function runCodexAppServerAttempt(
11351145resolveCompletion?.();
11361146};
113711471148+const fireTurnAttemptIdleTimeout = () => {
1149+if (
1150+completed ||
1151+runAbortController.signal.aborted ||
1152+!turnAttemptIdleWatchArmed ||
1153+activeAppServerTurnRequests > 0
1154+) {
1155+return;
1156+}
1157+const idleMs = Math.max(0, Date.now() - turnCompletionLastActivityAt);
1158+if (idleMs < turnAttemptIdleTimeoutMs) {
1159+scheduleTurnAttemptIdleWatch();
1160+return;
1161+}
1162+timedOut = true;
1163+turnCompletionIdleTimedOut = true;
1164+turnCompletionIdleTimeoutMessage =
1165+"codex app-server turn idle timed out waiting for turn/completed";
1166+projector?.markTimedOut();
1167+trajectoryRecorder?.recordEvent("turn.progress_idle_timeout", {
1168+threadId: thread.threadId,
1169+ turnId,
1170+ idleMs,
1171+timeoutMs: turnAttemptIdleTimeoutMs,
1172+lastActivityReason: turnCompletionLastActivityReason,
1173+ ...turnCompletionLastActivityDetails,
1174+});
1175+embeddedAgentLog.warn("codex app-server turn idle timed out waiting for progress", {
1176+threadId: thread.threadId,
1177+ turnId,
1178+ idleMs,
1179+timeoutMs: turnAttemptIdleTimeoutMs,
1180+lastActivityReason: turnCompletionLastActivityReason,
1181+ ...turnCompletionLastActivityDetails,
1182+});
1183+runAbortController.abort("turn_progress_idle_timeout");
1184+};
1185+11381186const fireTurnCompletionIdleTimeout = () => {
11391187if (
11401188completed ||
@@ -1238,6 +1286,22 @@ export async function runCodexAppServerAttempt(
12381286turnAssistantCompletionIdleTimer.unref?.();
12391287}
124012881289+function scheduleTurnAttemptIdleWatch() {
1290+clearTurnAttemptIdleTimer();
1291+if (
1292+completed ||
1293+runAbortController.signal.aborted ||
1294+!turnAttemptIdleWatchArmed ||
1295+activeAppServerTurnRequests > 0
1296+) {
1297+return;
1298+}
1299+const elapsedMs = Math.max(0, Date.now() - turnCompletionLastActivityAt);
1300+const delayMs = Math.max(1, turnAttemptIdleTimeoutMs - elapsedMs);
1301+turnAttemptIdleTimer = setTimeout(fireTurnAttemptIdleTimeout, delayMs);
1302+turnAttemptIdleTimer.unref?.();
1303+}
1304+12411305function scheduleTurnTerminalIdleWatch() {
12421306clearTurnTerminalIdleTimer();
12431307if (
@@ -1272,6 +1336,7 @@ export async function runCodexAppServerAttempt(
12721336turnCompletionIdleWatchArmed = true;
12731337turnCompletionIdleWatchPinnedByTerminalError = false;
12741338}
1339+scheduleTurnAttemptIdleWatch();
12751340scheduleTurnCompletionIdleWatch();
12761341scheduleTurnTerminalIdleWatch();
12771342};
@@ -1932,15 +1997,9 @@ export async function runCodexAppServerAttempt(
19321997abort: () => runAbortController.abort("aborted"),
19331998};
19341999setActiveEmbeddedRun(params.sessionId, handle, params.sessionKey);
1935-1936-const timeout = setTimeout(
1937-() => {
1938-timedOut = true;
1939-projector?.markTimedOut();
1940-runAbortController.abort("timeout");
1941-},
1942-Math.max(100, params.timeoutMs),
1943-);
2000+turnAttemptIdleWatchArmed = true;
2001+turnTerminalIdleWatchArmed = true;
2002+touchTurnCompletionActivity("turn:start", { arm: true });
1944200319452004const abortListener = () => {
19462005const shouldRetireClient = timedOut;
@@ -2127,7 +2186,7 @@ export async function runCodexAppServerAttempt(
21272186await steeringQueue?.flushPending();
21282187}
21292188userInputBridge?.cancelPending();
2130-clearTimeout(timeout);
2189+clearTurnAttemptIdleTimer();
21312190clearTurnCompletionIdleTimer();
21322191clearTurnAssistantCompletionIdleTimer();
21332192clearTurnTerminalIdleTimer();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。