




















@@ -134,8 +134,11 @@ import { filterToolsForVisionInputs } from "./vision-tools.js";
134134135135const CODEX_DYNAMIC_TOOL_TIMEOUT_MS = 30_000;
136136const CODEX_APP_SERVER_STARTUP_CONNECTION_CLOSE_MAX_ATTEMPTS = 3;
137+const CODEX_APP_SERVER_STARTUP_TIMEOUT_FLOOR_MS = 100;
137138const CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS = 60_000;
138139const CODEX_TURN_TERMINAL_IDLE_TIMEOUT_MS = 30 * 60_000;
140+const CODEX_NATIVE_HOOK_RELAY_MIN_TTL_MS = 30 * 60_000;
141+const CODEX_NATIVE_HOOK_RELAY_TTL_GRACE_MS = 5 * 60_000;
139142const CODEX_STEER_ALL_DEBOUNCE_MS = 500;
140143const LOG_FIELD_MAX_LENGTH = 160;
141144const CODEX_NATIVE_PROJECT_DOC_BASENAMES = new Set(["agents.md"]);
@@ -649,6 +652,10 @@ export async function runCodexAppServerAttempt(
649652let trajectoryEndRecorded = false;
650653let nativeHookRelay: NativeHookRelayRegistrationHandle | undefined;
651654let startupClientForCleanup: CodexAppServerClient | undefined;
655+const startupTimeoutMs = resolveCodexStartupTimeoutMs({
656+timeoutMs: params.timeoutMs,
657+timeoutFloorMs: options.startupTimeoutFloorMs,
658+});
652659try {
653660emitCodexAppServerEvent(params, {
654661stream: "codex_app_server.lifecycle",
@@ -662,6 +669,9 @@ export async function runCodexAppServerAttempt(
662669sessionKey: sandboxSessionKey,
663670config: params.config,
664671runId: params.runId,
672+attemptTimeoutMs: params.timeoutMs,
673+ startupTimeoutMs,
674+turnStartTimeoutMs: params.timeoutMs,
665675signal: runAbortController.signal,
666676});
667677const nativeHookRelayConfig = nativeHookRelay
@@ -705,8 +715,7 @@ export async function runCodexAppServerAttempt(
705715}
706716 : appServer;
707717({ client, thread } = await withCodexStartupTimeout({
708-timeoutMs: params.timeoutMs,
709-timeoutFloorMs: options.startupTimeoutFloorMs,
718+timeoutMs: startupTimeoutMs,
710719signal: runAbortController.signal,
711720operation: async () => {
712721let attemptedClient: CodexAppServerClient | undefined;
@@ -1630,6 +1639,9 @@ function createCodexNativeHookRelay(params: {
16301639sessionKey: string | undefined;
16311640config: EmbeddedRunAttemptParams["config"];
16321641runId: string;
1642+attemptTimeoutMs: number;
1643+startupTimeoutMs: number;
1644+turnStartTimeoutMs: number;
16331645signal: AbortSignal;
16341646}): NativeHookRelayRegistrationHandle | undefined {
16351647if (params.options?.enabled === false) {
@@ -1648,7 +1660,12 @@ function createCodexNativeHookRelay(params: {
16481660 ...(params.config ? { config: params.config } : {}),
16491661runId: params.runId,
16501662allowedEvents: params.events,
1651-ttlMs: params.options?.ttlMs,
1663+ttlMs: resolveCodexNativeHookRelayTtlMs({
1664+explicitTtlMs: params.options?.ttlMs,
1665+attemptTimeoutMs: params.attemptTimeoutMs,
1666+startupTimeoutMs: params.startupTimeoutMs,
1667+turnStartTimeoutMs: params.turnStartTimeoutMs,
1668+}),
16521669signal: params.signal,
16531670command: {
16541671timeoutMs: params.options?.gatewayTimeoutMs,
@@ -1672,6 +1689,23 @@ function resolveCodexNativeHookRelayEvents(params: {
16721689 : CODEX_NATIVE_HOOK_RELAY_EVENTS_WITH_APP_SERVER_APPROVALS;
16731690}
167416911692+function resolveCodexNativeHookRelayTtlMs(params: {
1693+explicitTtlMs: number | undefined;
1694+attemptTimeoutMs: number;
1695+startupTimeoutMs: number;
1696+turnStartTimeoutMs: number;
1697+}): number {
1698+if (params.explicitTtlMs !== undefined) {
1699+return params.explicitTtlMs;
1700+}
1701+const relayBudgetMs =
1702+params.attemptTimeoutMs +
1703+params.startupTimeoutMs +
1704+params.turnStartTimeoutMs +
1705+CODEX_NATIVE_HOOK_RELAY_TTL_GRACE_MS;
1706+return Math.max(CODEX_NATIVE_HOOK_RELAY_MIN_TTL_MS, Math.floor(relayBudgetMs));
1707+}
1708+16751709function buildCodexNativeHookRelayId(params: {
16761710agentId: string | undefined;
16771711sessionId: string;
@@ -1855,7 +1889,6 @@ function shouldProjectMirroredHistoryForCodexStart(params: {
1855188918561890async function withCodexStartupTimeout<T>(params: {
18571891timeoutMs: number;
1858-timeoutFloorMs?: number;
18591892signal: AbortSignal;
18601893operation: () => Promise<T>;
18611894}): Promise<T> {
@@ -1875,10 +1908,9 @@ async function withCodexStartupTimeout<T>(params: {
18751908}
18761909reject(error);
18771910};
1878-const timeoutMs = Math.max(params.timeoutFloorMs ?? 100, params.timeoutMs);
18791911timeout = setTimeout(() => {
18801912rejectOnce(new Error("codex app-server startup timed out"));
1881-}, timeoutMs);
1913+}, params.timeoutMs);
18821914const abortListener = () => rejectOnce(new Error("codex app-server startup aborted"));
18831915params.signal.addEventListener("abort", abortListener, { once: true });
18841916abortCleanup = () => params.signal.removeEventListener("abort", abortListener);
@@ -1892,6 +1924,16 @@ async function withCodexStartupTimeout<T>(params: {
18921924}
18931925}
189419261927+function resolveCodexStartupTimeoutMs(params: {
1928+timeoutMs: number;
1929+timeoutFloorMs?: number;
1930+}): number {
1931+return Math.max(
1932+params.timeoutFloorMs ?? CODEX_APP_SERVER_STARTUP_TIMEOUT_FLOOR_MS,
1933+params.timeoutMs,
1934+);
1935+}
1936+18951937function resolveCodexTurnCompletionIdleTimeoutMs(value: number | undefined): number {
18961938if (value === undefined) {
18971939return CODEX_TURN_COMPLETION_IDLE_TIMEOUT_MS;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。