


























@@ -1068,6 +1068,9 @@ export async function runCodexAppServerAttempt(
10681068let turnCompletionLastActivityAt = Date.now();
10691069let turnCompletionLastActivityReason = "startup";
10701070let turnCompletionLastActivityDetails: Record<string, unknown> | undefined;
1071+let turnAttemptLastProgressAt = Date.now();
1072+let turnAttemptLastProgressReason = "startup";
1073+let turnAttemptLastProgressDetails: Record<string, unknown> | undefined;
10711074let activeAppServerTurnRequests = 0;
10721075const activeOpenClawDynamicToolCallIds = new Set<string>();
10731076const activeTurnItemIds = new Set<string>();
@@ -1154,7 +1157,7 @@ export async function runCodexAppServerAttempt(
11541157) {
11551158return;
11561159}
1157-const idleMs = Math.max(0, Date.now() - turnCompletionLastActivityAt);
1160+const idleMs = Math.max(0, Date.now() - turnAttemptLastProgressAt);
11581161if (idleMs < turnAttemptIdleTimeoutMs) {
11591162scheduleTurnAttemptIdleWatch();
11601163return;
@@ -1169,16 +1172,16 @@ export async function runCodexAppServerAttempt(
11691172 turnId,
11701173 idleMs,
11711174timeoutMs: turnAttemptIdleTimeoutMs,
1172-lastActivityReason: turnCompletionLastActivityReason,
1173- ...turnCompletionLastActivityDetails,
1175+lastActivityReason: turnAttemptLastProgressReason,
1176+ ...turnAttemptLastProgressDetails,
11741177});
11751178embeddedAgentLog.warn("codex app-server turn idle timed out waiting for progress", {
11761179threadId: thread.threadId,
11771180 turnId,
11781181 idleMs,
11791182timeoutMs: turnAttemptIdleTimeoutMs,
1180-lastActivityReason: turnCompletionLastActivityReason,
1181- ...turnCompletionLastActivityDetails,
1183+lastActivityReason: turnAttemptLastProgressReason,
1184+ ...turnAttemptLastProgressDetails,
11821185});
11831186runAbortController.abort("turn_progress_idle_timeout");
11841187};
@@ -1296,7 +1299,7 @@ export async function runCodexAppServerAttempt(
12961299) {
12971300return;
12981301}
1299-const elapsedMs = Math.max(0, Date.now() - turnCompletionLastActivityAt);
1302+const elapsedMs = Math.max(0, Date.now() - turnAttemptLastProgressAt);
13001303const delayMs = Math.max(1, turnAttemptIdleTimeoutMs - elapsedMs);
13011304turnAttemptIdleTimer = setTimeout(fireTurnAttemptIdleTimeout, delayMs);
13021305turnAttemptIdleTimer.unref?.();
@@ -1318,13 +1321,24 @@ export async function runCodexAppServerAttempt(
13181321turnTerminalIdleTimer.unref?.();
13191322}
132013231324+function scheduleTurnProgressWatches() {
1325+scheduleTurnAttemptIdleWatch();
1326+scheduleTurnCompletionIdleWatch();
1327+scheduleTurnTerminalIdleWatch();
1328+}
1329+13211330const touchTurnCompletionActivity = (
13221331reason: string,
1323-options?: { arm?: boolean; details?: Record<string, unknown> },
1332+options?: { arm?: boolean; details?: Record<string, unknown>; attemptProgress?: boolean },
13241333) => {
13251334turnCompletionLastActivityAt = Date.now();
13261335turnCompletionLastActivityReason = reason;
13271336turnCompletionLastActivityDetails = options?.details;
1337+if (options?.attemptProgress) {
1338+turnAttemptLastProgressAt = turnCompletionLastActivityAt;
1339+turnAttemptLastProgressReason = reason;
1340+turnAttemptLastProgressDetails = options.details;
1341+}
13281342emitTrustedDiagnosticEvent({
13291343type: "run.progress",
13301344runId: params.runId,
@@ -1336,9 +1350,7 @@ export async function runCodexAppServerAttempt(
13361350turnCompletionIdleWatchArmed = true;
13371351turnCompletionIdleWatchPinnedByTerminalError = false;
13381352}
1339-scheduleTurnAttemptIdleWatch();
1340-scheduleTurnCompletionIdleWatch();
1341-scheduleTurnTerminalIdleWatch();
1353+scheduleTurnProgressWatches();
13421354};
1343135513441356const disarmTurnCompletionIdleWatch = () => {
@@ -1444,6 +1456,7 @@ export async function runCodexAppServerAttempt(
14441456if (isCurrentTurnNotification) {
14451457touchTurnCompletionActivity(`notification:${notification.method}`, {
14461458details: describeNotificationActivity(notification),
1459+attemptProgress: true,
14471460});
14481461reportCodexExecutionNotification(notification);
14491462}
@@ -1569,8 +1582,8 @@ export async function runCodexAppServerAttempt(
15691582activeAppServerTurnRequests += 1;
15701583clearTurnCompletionIdleTimer();
15711584disarmTurnAssistantCompletionIdleWatch();
1572-touchTurnCompletionActivity(`request:${request.method}`);
15731585let armCompletionWatchOnResponse = false;
1586+let requestCountsAsTurnActivity = false;
15741587try {
15751588if (request.method === "account/chatgptAuthTokens/refresh") {
15761589return refreshCodexAppServerAuthTokens({
@@ -1584,6 +1597,7 @@ export async function runCodexAppServerAttempt(
15841597}
15851598if (request.method === "mcpServer/elicitation/request") {
15861599armCompletionWatchOnResponse = true;
1600+requestCountsAsTurnActivity = true;
15871601return handleCodexAppServerElicitationRequest({
15881602requestParams: request.params,
15891603paramsForRun: params,
@@ -1595,6 +1609,7 @@ export async function runCodexAppServerAttempt(
15951609}
15961610if (request.method === "item/tool/requestUserInput") {
15971611armCompletionWatchOnResponse = true;
1612+requestCountsAsTurnActivity = true;
15981613return userInputBridge?.handleRequest({
15991614id: request.id,
16001615params: request.params,
@@ -1603,6 +1618,7 @@ export async function runCodexAppServerAttempt(
16031618if (request.method !== "item/tool/call") {
16041619if (isCodexAppServerApprovalRequest(request.method)) {
16051620armCompletionWatchOnResponse = true;
1621+requestCountsAsTurnActivity = true;
16061622return handleApprovalRequest({
16071623method: request.method,
16081624params: request.params,
@@ -1619,6 +1635,7 @@ export async function runCodexAppServerAttempt(
16191635return undefined;
16201636}
16211637armCompletionWatchOnResponse = true;
1638+requestCountsAsTurnActivity = true;
16221639turnCrossedToolHandoff = true;
16231640activeOpenClawDynamicToolCallIds.add(call.callId);
16241641trajectoryRecorder?.recordEvent("tool.call", {
@@ -1698,9 +1715,14 @@ export async function runCodexAppServerAttempt(
16981715return response as JsonValue;
16991716} finally {
17001717activeAppServerTurnRequests = Math.max(0, activeAppServerTurnRequests - 1);
1701-touchTurnCompletionActivity(`request:${request.method}:response`, {
1702-arm: armCompletionWatchOnResponse,
1703-});
1718+if (requestCountsAsTurnActivity) {
1719+touchTurnCompletionActivity(`request:${request.method}:response`, {
1720+arm: armCompletionWatchOnResponse,
1721+attemptProgress: true,
1722+});
1723+} else {
1724+scheduleTurnProgressWatches();
1725+}
17041726}
17051727});
17061728@@ -1999,7 +2021,7 @@ export async function runCodexAppServerAttempt(
19992021setActiveEmbeddedRun(params.sessionId, handle, params.sessionKey);
20002022turnAttemptIdleWatchArmed = true;
20012023turnTerminalIdleWatchArmed = true;
2002-touchTurnCompletionActivity("turn:start", { arm: true });
2024+touchTurnCompletionActivity("turn:start", { arm: true, attemptProgress: true });
2003202520042026const abortListener = () => {
20052027const shouldRetireClient = timedOut;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。