Files
openclaw/src/agents/agent-tools.abort.ts
2026-07-03 19:44:44 -07:00

47 lines
1.5 KiB
TypeScript

/**
* Abort-signal wrapping for agent tools.
* Combines per-call cancellation with run-level aborts while preserving plugin,
* channel, and before_tool_call metadata on wrapped tools.
*/
import { copyPluginToolMeta } from "../plugins/tools.js";
import { createAbortError, mergeAbortSignals } from "../infra/abort-signal.js";
import type { AnyAgentTool } from "./agent-tools.types.js";
import { copyBeforeToolCallHookMarker } from "./before-tool-call-metadata.js";
import { copyChannelAgentToolMeta } from "./channel-tools.js";
function throwAbortError(): never {
throw createAbortError("Aborted");
}
/** Wrap a tool so every execute call observes the supplied run abort signal. */
export function wrapToolWithAbortSignal(
tool: AnyAgentTool,
abortSignal?: AbortSignal,
): AnyAgentTool {
if (!abortSignal) {
return tool;
}
const execute = tool.execute;
if (!execute) {
return tool;
}
const wrappedTool: AnyAgentTool = {
...tool,
execute: async (toolCallId, params, signal, onUpdate) => {
const combined = mergeAbortSignals([signal, abortSignal]);
try {
if (combined.signal?.aborted) {
throwAbortError();
}
return await execute(toolCallId, params, combined.signal, onUpdate);
} finally {
combined.dispose();
}
},
};
copyPluginToolMeta(tool, wrappedTool);
copyChannelAgentToolMeta(tool as never, wrappedTool as never);
copyBeforeToolCallHookMarker(tool, wrappedTool);
return wrappedTool;
}