


































@@ -21,6 +21,7 @@ import {
2121} from "../infra/system-run-approval-context.js";
2222import { formatExecCommand, resolveSystemRunCommandRequest } from "../infra/system-run-command.js";
2323import { normalizeNullableString } from "../shared/string-coerce.js";
24+import { resolveSafeTimeoutDelayMs } from "../utils/timer-delay.js";
2425import type { ExecuteNodeHostCommandParams } from "./bash-tools.exec-host-node.types.js";
2526import { renderExecOutputText } from "./bash-tools.exec-output.js";
2627import type { ExecToolDetails } from "./bash-tools.exec-types.js";
@@ -60,6 +61,30 @@ type NodeApprovalAnalysis = {
6061autoReviewArgv?: string[];
6162};
626364+function resolveNodeRunTimeoutSec(
65+timeoutSec: number | null | undefined,
66+defaultTimeoutSec: number,
67+): number {
68+return typeof timeoutSec === "number" && Number.isFinite(timeoutSec)
69+ ? timeoutSec
70+ : defaultTimeoutSec;
71+}
72+73+function resolveNodeInvokeTimeoutMs(runTimeoutSec: number, defaultTimeoutSec: number): number {
74+const baseTimeoutSec =
75+Number.isFinite(runTimeoutSec) && runTimeoutSec > 0 ? runTimeoutSec : defaultTimeoutSec;
76+if (!Number.isFinite(baseTimeoutSec) || baseTimeoutSec <= 0) {
77+return 10_000;
78+}
79+return Math.max(10_000, resolveSafeTimeoutDelayMs(baseTimeoutSec * 1000 + 5_000));
80+}
81+82+function resolveNodeRunTimeoutMs(runTimeoutSec: number): number {
83+return Number.isFinite(runTimeoutSec) && runTimeoutSec > 0
84+ ? resolveSafeTimeoutDelayMs(runTimeoutSec * 1000, { minMs: 0 })
85+ : 0;
86+}
87+6388export function shouldSkipNodeApprovalPrepare(params: {
6489hostSecurity: ExecSecurity;
6590hostAsk: ExecAsk;
@@ -142,15 +167,13 @@ export async function resolveNodeExecutionTarget(
142167);
143168}
144169145-const runTimeoutSec =
146-typeof params.timeoutSec === "number" ? params.timeoutSec : params.defaultTimeoutSec;
147-const invokeBaseTimeoutSec = runTimeoutSec > 0 ? runTimeoutSec : params.defaultTimeoutSec;
170+const runTimeoutSec = resolveNodeRunTimeoutSec(params.timeoutSec, params.defaultTimeoutSec);
148171return {
149172 nodeId,
150173platform: nodeInfo?.platform,
151174argv: buildNodeShellCommand(params.command, nodeInfo?.platform),
152175env: params.requestedEnv ? { ...params.requestedEnv } : undefined,
153-invokeTimeoutMs: Math.max(10_000, invokeBaseTimeoutSec * 1000 + 5_000),
176+invokeTimeoutMs: resolveNodeInvokeTimeoutMs(runTimeoutSec, params.defaultTimeoutSec),
154177 runTimeoutSec,
155178supportsSystemRunPrepare: declaredCommands.includes("system.run.prepare"),
156179};
@@ -174,8 +197,7 @@ export function buildNodeSystemRunInvoke(params: {
174197notifyOnExit?: boolean;
175198systemRunPlan?: SystemRunApprovalPlan;
176199}): Record<string, unknown> {
177-const timeoutMs =
178-params.target.runTimeoutSec > 0 ? Math.floor(params.target.runTimeoutSec * 1000) : 0;
200+const timeoutMs = resolveNodeRunTimeoutMs(params.target.runTimeoutSec);
179201const runId = params.runId ?? crypto.randomUUID();
180202return {
181203nodeId: params.target.nodeId,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。