import type { AgentTool } from "@mariozechner/pi-agent-core"; import type { ExtensionContext, ToolDefinition } from "../extensions/types.js"; /** Wrap a ToolDefinition into an AgentTool for the core runtime. */ export function wrapToolDefinition( definition: ToolDefinition, ctxFactory?: () => ExtensionContext, ): AgentTool { return { name: definition.name, label: definition.label, description: definition.description, parameters: definition.parameters, prepareArguments: definition.prepareArguments, execute: (toolCallId, params, signal, onUpdate) => definition.execute(toolCallId, params, signal, onUpdate, ctxFactory?.() as ExtensionContext), }; } /** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */ export function wrapToolDefinitions( definitions: ToolDefinition[], ctxFactory?: () => ExtensionContext, ): AgentTool[] { return definitions.map((definition) => wrapToolDefinition(definition, ctxFactory)); } /** * Synthesize a minimal ToolDefinition from an AgentTool. * * This keeps AgentSession's internal registry definition-first even when a caller * provides plain AgentTool overrides that do not include prompt metadata or renderers. */ export function createToolDefinitionFromAgentTool(tool: AgentTool): ToolDefinition { return { name: tool.name, label: tool.label, description: tool.description, parameters: tool.parameters as any, prepareArguments: tool.prepareArguments, execute: async (toolCallId, params, signal, onUpdate) => tool.execute(toolCallId, params, signal, onUpdate), }; }