import type {
ExecutableTool,
ExecutableToolContext,
ExecutableToolResult,
ToolExecution,
} from '../../../src/loop';
import { PathSecurityError } from '../../../src/tools/policies/path-access';
export type TestExecutableToolContext = ExecutableToolContext & {
readonly args: Input;
};
export async function executeTool(
tool: ExecutableTool,
context: TestExecutableToolContext,
): Promise {
const { args, ...executionContext } = context;
let execution: ToolExecution;
try {
const resolved = tool.resolveExecution(args);
execution = isPromiseLike(resolved) ? await resolved : resolved;
} catch (error) {
const output =
error instanceof PathSecurityError
? error.message
: `Tool "${tool.name}" failed to resolve execution: ${
error instanceof Error ? error.message : String(error)
}`;
return { isError: true, output };
}
if (execution.isError === true) return execution;
return execution.execute(executionContext);
}
function isPromiseLike(value: ToolExecution | Promise): value is Promise {
return typeof (value as Promise).then === 'function';
}