






















@@ -49,7 +49,7 @@ function defaultTailNote(totalLines: number, usingDefaultTail: boolean) {
4949return `\n\n[showing last ${DEFAULT_LOG_TAIL_LINES} of ${totalLines} lines; pass offset/limit to page]`;
5050}
515152-const MAX_POLL_WAIT_MS = 120_000;
52+const MAX_POLL_WAIT_MS = 30_000;
53535454function resolvePollWaitMs(value: unknown) {
5555if (typeof value === "number" && Number.isFinite(value)) {
@@ -94,6 +94,44 @@ function resetPollRetrySuggestion(sessionId: string): void {
9494}
9595}
969697+function createAbortError(reason: unknown): Error {
98+if (reason instanceof Error) {
99+return reason;
100+}
101+const error = new Error(typeof reason === "string" ? reason : "Aborted");
102+error.name = "AbortError";
103+return error;
104+}
105+106+async function sleepPollInterval(ms: number, signal?: AbortSignal): Promise<void> {
107+if (signal?.aborted) {
108+throw createAbortError(signal.reason);
109+}
110+await new Promise<void>((resolve, reject) => {
111+let timer: ReturnType<typeof setTimeout> | undefined;
112+let onAbort: (() => void) | undefined;
113+const cleanup = () => {
114+if (timer) {
115+clearTimeout(timer);
116+}
117+if (onAbort) {
118+signal?.removeEventListener("abort", onAbort);
119+}
120+};
121+const onResolve = () => {
122+cleanup();
123+resolve();
124+};
125+onAbort = () => {
126+cleanup();
127+reject(createAbortError(signal?.reason));
128+};
129+timer = setTimeout(onResolve, ms);
130+timer.unref?.();
131+signal?.addEventListener("abort", onAbort, { once: true });
132+});
133+}
134+97135export function createProcessTool(
98136defaults?: ProcessToolDefaults,
99137): AgentToolWithMeta<typeof processSchema, unknown> {
@@ -129,7 +167,7 @@ export function createProcessTool(
129167displaySummary: PROCESS_TOOL_DISPLAY_SUMMARY,
130168description: describeProcessTool({ hasCronTool: defaults?.hasCronTool === true }),
131169parameters: processSchema,
132-execute: async (_toolCallId, args, _signal, _onUpdate): Promise<AgentToolResult<unknown>> => {
170+execute: async (_toolCallId, args, signal, _onUpdate): Promise<AgentToolResult<unknown>> => {
133171const params = args as {
134172action:
135173| "list"
@@ -307,9 +345,7 @@ export function createProcessTool(
307345if (pollWaitMs > 0 && !scopedSession.exited) {
308346const deadline = Date.now() + pollWaitMs;
309347while (!scopedSession.exited && Date.now() < deadline) {
310-await new Promise((resolve) =>
311-setTimeout(resolve, Math.max(0, Math.min(250, deadline - Date.now()))),
312-);
348+await sleepPollInterval(Math.max(0, Math.min(250, deadline - Date.now())), signal);
313349}
314350}
315351const { stdout, stderr } = drainSession(scopedSession);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。