























@@ -165,6 +165,7 @@ const CODEX_TURN_ASSISTANT_COMPLETION_IDLE_TIMEOUT_MS = 10_000;
165165const CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS = 30 * 60_000;
166166const CODEX_NATIVE_HOOK_RELAY_MIN_TTL_MS = 30 * 60_000;
167167const CODEX_NATIVE_HOOK_RELAY_TTL_GRACE_MS = 5 * 60_000;
168+const CODEX_NATIVE_HOOK_RELAY_RENEW_INTERVAL_MS = 60_000;
168169const CODEX_STEER_ALL_DEBOUNCE_MS = 500;
169170const LOG_FIELD_MAX_LENGTH = 160;
170171const CODEX_NATIVE_PROJECT_DOC_BASENAMES = new Set(["agents.md"]);
@@ -1071,6 +1072,7 @@ export async function runCodexAppServerAttempt(
10711072let turnAttemptLastProgressAt = Date.now();
10721073let turnAttemptLastProgressReason = "startup";
10731074let turnAttemptLastProgressDetails: Record<string, unknown> | undefined;
1075+let nativeHookRelayLastRenewedAt = 0;
10741076let activeAppServerTurnRequests = 0;
10751077const activeOpenClawDynamicToolCallIds = new Set<string>();
10761078const activeTurnItemIds = new Set<string>();
@@ -1149,12 +1151,7 @@ export async function runCodexAppServerAttempt(
11491151};
1150115211511153const fireTurnAttemptIdleTimeout = () => {
1152-if (
1153-completed ||
1154-runAbortController.signal.aborted ||
1155-!turnAttemptIdleWatchArmed ||
1156-activeAppServerTurnRequests > 0
1157-) {
1154+if (completed || runAbortController.signal.aborted || !turnAttemptIdleWatchArmed) {
11581155return;
11591156}
11601157const idleMs = Math.max(0, Date.now() - turnAttemptLastProgressAt);
@@ -1291,12 +1288,7 @@ export async function runCodexAppServerAttempt(
1291128812921289function scheduleTurnAttemptIdleWatch() {
12931290clearTurnAttemptIdleTimer();
1294-if (
1295-completed ||
1296-runAbortController.signal.aborted ||
1297-!turnAttemptIdleWatchArmed ||
1298-activeAppServerTurnRequests > 0
1299-) {
1291+if (completed || runAbortController.signal.aborted || !turnAttemptIdleWatchArmed) {
13001292return;
13011293}
13021294const elapsedMs = Math.max(0, Date.now() - turnAttemptLastProgressAt);
@@ -1327,6 +1319,28 @@ export async function runCodexAppServerAttempt(
13271319scheduleTurnTerminalIdleWatch();
13281320}
132913211322+const renewNativeHookRelayForTurnProgress = () => {
1323+if (!nativeHookRelay || options.nativeHookRelay?.ttlMs !== undefined) {
1324+return;
1325+}
1326+const now = Date.now();
1327+const renewsRecently =
1328+now - nativeHookRelayLastRenewedAt < CODEX_NATIVE_HOOK_RELAY_RENEW_INTERVAL_MS;
1329+const expiresSoon = now >= nativeHookRelay.expiresAtMs - CODEX_NATIVE_HOOK_RELAY_TTL_GRACE_MS;
1330+if (renewsRecently && !expiresSoon) {
1331+return;
1332+}
1333+nativeHookRelayLastRenewedAt = now;
1334+nativeHookRelay.renew(
1335+resolveCodexNativeHookRelayTtlMs({
1336+explicitTtlMs: undefined,
1337+attemptTimeoutMs: turnAttemptIdleTimeoutMs,
1338+ startupTimeoutMs,
1339+turnStartTimeoutMs: params.timeoutMs,
1340+}),
1341+);
1342+};
1343+13301344const touchTurnCompletionActivity = (
13311345reason: string,
13321346options?: { arm?: boolean; details?: Record<string, unknown>; attemptProgress?: boolean },
@@ -1338,6 +1352,7 @@ export async function runCodexAppServerAttempt(
13381352turnAttemptLastProgressAt = turnCompletionLastActivityAt;
13391353turnAttemptLastProgressReason = reason;
13401354turnAttemptLastProgressDetails = options.details;
1355+renewNativeHookRelayForTurnProgress();
13411356}
13421357emitTrustedDiagnosticEvent({
13431358type: "run.progress",
@@ -1579,11 +1594,17 @@ export async function runCodexAppServerAttempt(
1579159415801595const notificationCleanup = client.addNotificationHandler(enqueueNotification);
15811596const requestCleanup = client.addRequestHandler(async (request) => {
1582-activeAppServerTurnRequests += 1;
1583-clearTurnCompletionIdleTimer();
1584-disarmTurnAssistantCompletionIdleWatch();
15851597let armCompletionWatchOnResponse = false;
15861598let requestCountsAsTurnActivity = false;
1599+const markCurrentTurnRequestProgress = () => {
1600+activeAppServerTurnRequests += 1;
1601+clearTurnCompletionIdleTimer();
1602+disarmTurnAssistantCompletionIdleWatch();
1603+requestCountsAsTurnActivity = true;
1604+touchTurnCompletionActivity(`request:${request.method}:start`, {
1605+attemptProgress: true,
1606+});
1607+};
15871608try {
15881609if (request.method === "account/chatgptAuthTokens/refresh") {
15891610return refreshCodexAppServerAuthTokens({
@@ -1598,7 +1619,7 @@ export async function runCodexAppServerAttempt(
15981619if (request.method === "mcpServer/elicitation/request") {
15991620if (isCurrentThreadOptionalTurnRequestParams(request.params, thread.threadId, turnId)) {
16001621armCompletionWatchOnResponse = true;
1601-requestCountsAsTurnActivity = true;
1622+markCurrentTurnRequestProgress();
16021623}
16031624return handleCodexAppServerElicitationRequest({
16041625requestParams: request.params,
@@ -1612,7 +1633,7 @@ export async function runCodexAppServerAttempt(
16121633if (request.method === "item/tool/requestUserInput") {
16131634if (isCurrentThreadTurnRequestParams(request.params, thread.threadId, turnId)) {
16141635armCompletionWatchOnResponse = true;
1615-requestCountsAsTurnActivity = true;
1636+markCurrentTurnRequestProgress();
16161637}
16171638return userInputBridge?.handleRequest({
16181639id: request.id,
@@ -1623,7 +1644,7 @@ export async function runCodexAppServerAttempt(
16231644if (isCodexAppServerApprovalRequest(request.method)) {
16241645if (isCurrentApprovalTurnRequestParams(request.params, thread.threadId, turnId)) {
16251646armCompletionWatchOnResponse = true;
1626-requestCountsAsTurnActivity = true;
1647+markCurrentTurnRequestProgress();
16271648}
16281649return handleApprovalRequest({
16291650method: request.method,
@@ -1641,7 +1662,7 @@ export async function runCodexAppServerAttempt(
16411662return undefined;
16421663}
16431664armCompletionWatchOnResponse = true;
1644-requestCountsAsTurnActivity = true;
1665+markCurrentTurnRequestProgress();
16451666turnCrossedToolHandoff = true;
16461667activeOpenClawDynamicToolCallIds.add(call.callId);
16471668trajectoryRecorder?.recordEvent("tool.call", {
@@ -1720,8 +1741,8 @@ export async function runCodexAppServerAttempt(
17201741});
17211742return response as JsonValue;
17221743} finally {
1723-activeAppServerTurnRequests = Math.max(0, activeAppServerTurnRequests - 1);
17241744if (requestCountsAsTurnActivity) {
1745+activeAppServerTurnRequests = Math.max(0, activeAppServerTurnRequests - 1);
17251746touchTurnCompletionActivity(`request:${request.method}:response`, {
17261747arm: armCompletionWatchOnResponse,
17271748attemptProgress: true,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。