import type { AnyAgentTool } from "./pi-tools.types.js"; function throwAbortError(): never { const err = new Error("Aborted"); err.name = "AbortError"; throw err; } function combineAbortSignals(a?: AbortSignal, b?: AbortSignal): AbortSignal | undefined { if (!a && !b) { return undefined; } if (a && !b) { return a; } if (b && !a) { return b; } if (a?.aborted) { return a; } if (b?.aborted) { return b; } if (typeof AbortSignal.any === "function") { return AbortSignal.any([a as AbortSignal, b as AbortSignal]); } const controller = new AbortController(); const onAbort = () => controller.abort(); a?.addEventListener("abort", onAbort, { once: true }); b?.addEventListener("abort", onAbort, { once: true }); return controller.signal; } export function wrapToolWithAbortSignal( tool: AnyAgentTool, abortSignal?: AbortSignal, ): AnyAgentTool { if (!abortSignal) { return tool; } const execute = tool.execute; if (!execute) { return tool; } return { ...tool, execute: async (toolCallId, params, signal, onUpdate) => { const combined = combineAbortSignals(signal, abortSignal); if (combined?.aborted) { throwAbortError(); } return await execute(toolCallId, params, combined, onUpdate); }, }; }