toolwire 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/tsup/assets/cjs_shims.js","../src/schema.ts","../src/tool.ts","../src/errors.ts","../src/middleware.ts","../src/adapters/anthropic.ts","../src/adapters/gemini.ts","../src/adapters/openai.ts","../src/adapters/vercel-ai.ts","../src/discovery.ts","../src/registry.ts","../src/index.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { createRequire } from 'node:module';\nimport * as zodNs from 'zod';\nimport type { ZodType } from 'zod';\nimport type { JsonSchema } from './types.js';\n\nconst _require = createRequire(import.meta.url);\n\nconst cache = new WeakMap<ZodType, JsonSchema>();\n\n/**\n * Convert a Zod schema to JSON Schema (Draft 7 compatible).\n * Supports Zod v4 natively; Zod v3 requires the `zod-to-json-schema` package.\n * Results are cached per schema instance.\n */\nexport function resolveJsonSchema(schema: ZodType): JsonSchema {\n const hit = cache.get(schema);\n if (hit !== undefined) return hit;\n const result = compute(schema);\n cache.set(schema, result);\n return result;\n}\n\nfunction compute(schema: ZodType): JsonSchema {\n // Zod v4 exports `toJsonSchema` as a named function on the module namespace\n // Zod v4 exports `toJSONSchema` (note capital JSON)\n const toJSONSchemaV4 = (zodNs as Record<string, unknown>)['toJSONSchema'] as\n | ((s: ZodType) => Record<string, unknown>)\n | undefined;\n\n if (typeof toJSONSchemaV4 === 'function') {\n const { $schema: _$schema, ...clean } = toJSONSchemaV4(schema);\n return clean as JsonSchema;\n }\n\n // Zod v3 fallback — requires the optional `zod-to-json-schema` peer\n try {\n const pkg = _require('zod-to-json-schema') as {\n zodToJsonSchema: (\n s: ZodType,\n opts?: Record<string, unknown>,\n ) => Record<string, unknown>;\n };\n const { $schema: _$schema, ...clean } = pkg.zodToJsonSchema(schema, {\n $refStrategy: 'none',\n });\n return clean as JsonSchema;\n } catch {\n throw new Error(\n 'toolwire: Cannot convert Zod schema to JSON Schema.\\n' +\n ' • Zod v4: ensure zod@^4.0.0 is installed.\\n' +\n ' • Zod v3: run `npm install zod-to-json-schema`.\\n' +\n ' • Or supply a pre-computed schema via the `_jsonSchema` option in tool().',\n );\n }\n}\n","import { resolveJsonSchema } from './schema.js';\nimport type { ToolConfig, ToolDefinition } from './types.js';\n\nconst NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;\n\nconst DEFAULTS = {\n timeout: 30_000,\n retries: 0,\n} as const;\n\n/**\n * Define a tool. Returns a frozen ToolDefinition with pre-computed JSON schemas.\n *\n * @example\n * ```ts\n * const search = tool({\n * name: 'search_web',\n * description: 'Search the web for current information',\n * input: z.object({ query: z.string().min(1) }),\n * handler: async ({ query }) => mySearchAPI(query),\n * timeout: 10_000,\n * });\n * ```\n */\nexport function tool<TInput = unknown, TOutput = unknown>(\n config: ToolConfig<TInput, TOutput>,\n): ToolDefinition<TInput, TOutput> {\n if (!NAME_RE.test(config.name)) {\n throw new Error(\n `toolwire: Invalid tool name \"${config.name}\". ` +\n 'Names must be 1–64 characters containing only letters, digits, underscores, or hyphens.',\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const inputSchema = config._jsonSchema ?? resolveJsonSchema(config.input as any);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const outputSchema = config.output ? resolveJsonSchema(config.output as any) : undefined;\n\n const def: ToolDefinition<TInput, TOutput> = {\n name: config.name,\n description: config.description,\n input: config.input,\n output: config.output,\n handler: config.handler,\n timeout: config.timeout ?? DEFAULTS.timeout,\n retries: config.retries ?? DEFAULTS.retries,\n annotations: config.annotations ?? {},\n inputSchema,\n outputSchema,\n };\n\n return Object.freeze(def);\n}\n","import type { ZodIssue } from 'zod';\nimport type { ToolError, ToolErrorCode, ToolFailure } from './types.js';\n\nfunction err(\n code: ToolErrorCode,\n toolName: string,\n message: string,\n llmMessage: string,\n retryable: boolean,\n extras?: Partial<Pick<ToolError, 'retryAfterMs' | 'issues' | 'cause'>>,\n): ToolError {\n return { code, toolName, message, llmMessage, retryable, ...extras };\n}\n\nexport function makeNotFoundError(toolName: string, available: string[]): ToolError {\n const list =\n available.length > 0\n ? `Available tools: ${available.join(', ')}.`\n : 'No tools are currently registered.';\n return err(\n 'NOT_FOUND',\n toolName,\n `Tool \"${toolName}\" is not registered`,\n `The tool \"${toolName}\" does not exist. ${list} Please use one of the available tools.`,\n true,\n );\n}\n\nexport function makeDisabledError(toolName: string): ToolError {\n return err(\n 'DISABLED',\n toolName,\n `Tool \"${toolName}\" is currently disabled`,\n `The tool \"${toolName}\" is currently disabled and cannot be called. Please try a different approach or wait until it is re-enabled.`,\n false,\n );\n}\n\nexport function makeValidationInputError(toolName: string, issues: ZodIssue[]): ToolError {\n const lines = issues\n .map((i) => ` - ${i.path.length > 0 ? i.path.join('.') : '(root)'}: ${i.message}`)\n .join('\\n');\n return err(\n 'VALIDATION_INPUT',\n toolName,\n `Invalid input for tool \"${toolName}\"`,\n `Your call to \"${toolName}\" had invalid arguments:\\n${lines}\\n\\nPlease fix these and try again.`,\n true,\n { issues },\n );\n}\n\nexport function makeValidationOutputError(toolName: string, issues: ZodIssue[]): ToolError {\n return err(\n 'VALIDATION_OUTPUT',\n toolName,\n `Tool \"${toolName}\" returned an invalid response format`,\n `The tool \"${toolName}\" returned an unexpected response and could not be used. This is a bug in the tool implementation, not in your call. Please try a different approach.`,\n false,\n { issues },\n );\n}\n\nexport function makeTimeoutError(toolName: string, timeoutMs: number): ToolError {\n return err(\n 'TIMEOUT',\n toolName,\n `Tool \"${toolName}\" timed out after ${timeoutMs}ms`,\n `The tool \"${toolName}\" timed out after ${timeoutMs}ms. This may be a temporary issue — please wait a moment before retrying.`,\n true,\n { retryAfterMs: Math.min(timeoutMs, 5_000) },\n );\n}\n\nexport function makeExecutionError(\n toolName: string,\n cause: unknown,\n attempts: number,\n): ToolError {\n const msg = cause instanceof Error ? cause.message : String(cause);\n const attemptStr = attempts > 1 ? ` after ${attempts} attempt(s)` : '';\n return err(\n 'EXECUTION',\n toolName,\n `Tool \"${toolName}\" failed${attemptStr}: ${msg}`,\n `The tool \"${toolName}\" encountered an error${attemptStr}: ${msg}. All retries have been exhausted — please try a different approach.`,\n false,\n { cause },\n );\n}\n\nexport function makeFailure(\n toolName: string,\n error: ToolError,\n durationMs: number,\n): ToolFailure {\n return { success: false, toolName, error, durationMs };\n}\n","import type { Middleware, ToolFailure, ToolResult, ToolSuccess } from './types.js';\n\n/**\n * Run all beforeCall hooks in registration order.\n * Each hook may return a transformed argument list (or nothing to keep the current value).\n */\nexport async function runBefore(\n middleware: Middleware[],\n toolName: string,\n args: unknown,\n): Promise<unknown> {\n let current = args;\n for (const mw of middleware) {\n if (mw.beforeCall) {\n const next = await mw.beforeCall(toolName, current);\n if (next !== undefined) current = next;\n }\n }\n return current;\n}\n\n/**\n * Run all afterCall hooks in reverse registration order (outermost wraps first).\n * Each hook may return a transformed ToolSuccess (or nothing to keep the current value).\n */\nexport async function runAfter(\n middleware: Middleware[],\n toolName: string,\n args: unknown,\n result: ToolSuccess,\n): Promise<ToolSuccess> {\n let current = result;\n for (let i = middleware.length - 1; i >= 0; i--) {\n const mw = middleware[i];\n if (mw?.afterCall) {\n const next = await mw.afterCall(toolName, args, current);\n if (next !== undefined) current = next;\n }\n }\n return current;\n}\n\n/**\n * Run all onError hooks in registration order.\n * The first hook that returns a ToolResult short-circuits the chain (recovery).\n */\nexport async function runOnError(\n middleware: Middleware[],\n toolName: string,\n args: unknown,\n failure: ToolFailure,\n): Promise<ToolResult> {\n for (const mw of middleware) {\n if (mw.onError) {\n const recovery = await mw.onError(toolName, args, failure);\n if (recovery !== undefined) return recovery;\n }\n }\n return failure;\n}\n","import type { AnthropicTool, ToolDefinition } from '../types.js';\n\n/**\n * Convert tool definitions to Anthropic tool-use format.\n * Note: uses `input_schema` (not `parameters`).\n *\n * @example\n * ```ts\n * const response = await anthropic.messages.create({\n * model: 'claude-opus-4-6',\n * tools: reg.toAnthropic(),\n * messages,\n * });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toAnthropic(tools: ToolDefinition<any, any>[]): AnthropicTool[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.inputSchema,\n }));\n}\n","import type { GeminiToolConfig, ToolDefinition } from '../types.js';\n\n/**\n * Convert tool definitions to Google Gemini format.\n * Uses `parametersJsonSchema` (not `parameters`) and wraps in `functionDeclarations`.\n *\n * @example\n * ```ts\n * const response = await model.generateContent({\n * tools: [reg.toGemini()],\n * contents,\n * });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toGemini(tools: ToolDefinition<any, any>[]): GeminiToolConfig {\n return {\n functionDeclarations: tools.map((t) => ({\n name: t.name,\n description: t.description,\n parametersJsonSchema: t.inputSchema,\n })),\n };\n}\n","import type { OpenAITool, ToolDefinition } from '../types.js';\n\n/**\n * Convert tool definitions to OpenAI function-calling format.\n *\n * @example\n * ```ts\n * const response = await openai.chat.completions.create({\n * model: 'gpt-4o',\n * tools: reg.toOpenAI({ strict: true }),\n * messages,\n * });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toOpenAI(\n tools: ToolDefinition<any, any>[],\n options?: { strict?: boolean },\n): OpenAITool[] {\n return tools.map((t) => {\n const fn: OpenAITool['function'] = {\n name: t.name,\n description: t.description,\n parameters: t.inputSchema,\n };\n if (options?.strict !== undefined) {\n fn.strict = options.strict;\n }\n return { type: 'function' as const, function: fn };\n });\n}\n","import type { ToolDefinition, VercelAIToolSet } from '../types.js';\n\n/**\n * Convert tool definitions to Vercel AI SDK format.\n * Unlike other adapters, this passes the original Zod schema directly\n * (Vercel AI SDK handles JSON Schema conversion internally).\n *\n * @example\n * ```ts\n * const { text } = await generateText({\n * model: openai('gpt-4o'),\n * tools: reg.toVercelAI(),\n * prompt,\n * });\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function toVercelAI(tools: ToolDefinition<any, any>[]): VercelAIToolSet {\n return Object.fromEntries(\n tools.map((t) => [\n t.name,\n {\n description: t.description,\n parameters: t.input,\n },\n ]),\n );\n}\n","import { readdir } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { ToolRegistry } from './registry.js';\nimport { tool } from './tool.js';\nimport type { ToolDefinition, ToolManifest } from './types.js';\n\n/**\n * Load tools from a directory of compiled JavaScript files.\n * Each file may export:\n * - `export default tool(...)` — a single tool as the default export\n * - `export const tools = [tool(...), ...]` — an array under the `tools` named export\n * - `export const myTool = tool(...)` — any named export that is a ToolDefinition\n *\n * Only `.js`, `.mjs`, and `.cjs` files are scanned.\n * Files that fail to import are skipped with a warning.\n */\nexport async function fromDir(dirPath: string): Promise<ToolRegistry> {\n const absPath = resolve(dirPath);\n\n let files: string[];\n try {\n files = await readdir(absPath);\n } catch (err) {\n throw new Error(\n `toolwire: Cannot read directory \"${absPath}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const toolFiles = files.filter((f) => /\\.(js|mjs|cjs)$/.test(f));\n const discovered: ToolDefinition[] = [];\n\n for (const file of toolFiles) {\n const fileUrl = pathToFileURL(join(absPath, file)).href;\n try {\n const mod = (await import(fileUrl)) as Record<string, unknown>;\n discovered.push(...extractTools(mod));\n } catch (err) {\n console.warn(\n `toolwire: Skipping \"${file}\" (failed to import):`,\n err instanceof Error ? err.message : err,\n );\n }\n }\n\n return new ToolRegistry(discovered);\n}\n\n/**\n * Load tools from a remote JSON manifest.\n * The manifest must conform to the ToolManifest schema:\n * ```json\n * {\n * \"version\": \"1.0\",\n * \"tools\": [\n * { \"name\": \"...\", \"description\": \"...\", \"inputSchema\": {...}, \"endpoint\": \"https://...\" }\n * ]\n * }\n * ```\n * Each tool is proxied as an HTTP POST to its `endpoint`.\n */\nexport async function fromManifest(url: string): Promise<ToolRegistry> {\n let manifest: ToolManifest;\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status} ${response.statusText}`);\n }\n manifest = (await response.json()) as ToolManifest;\n } catch (err) {\n throw new Error(\n `toolwire: Failed to fetch manifest from \"${url}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n if (manifest.version !== '1.0' || !Array.isArray(manifest.tools)) {\n throw new Error(\n 'toolwire: Invalid manifest. Expected { version: \"1.0\", tools: [...] }',\n );\n }\n\n // Lazy import of zod to avoid making it a static import in this module\n const { z } = await import('zod');\n\n const tools = manifest.tools.map((entry) =>\n tool({\n name: entry.name,\n description: entry.description,\n input: z.record(z.string(), z.unknown()),\n _jsonSchema: entry.inputSchema,\n handler: async (input) => {\n const res = await fetch(entry.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n return res.json() as Promise<unknown>;\n },\n }),\n );\n\n return new ToolRegistry(tools);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isToolDefinition(value: unknown): value is ToolDefinition {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Record<string, unknown>)['name'] === 'string' &&\n typeof (value as Record<string, unknown>)['description'] === 'string' &&\n typeof (value as Record<string, unknown>)['handler'] === 'function'\n );\n}\n\nfunction extractTools(mod: Record<string, unknown>): ToolDefinition[] {\n // Priority 1: default export is a tool\n if (isToolDefinition(mod['default'])) {\n return [mod['default']];\n }\n\n // Priority 2: named `tools` export is an array\n if (Array.isArray(mod['tools'])) {\n const found = (mod['tools'] as unknown[]).filter(isToolDefinition);\n if (found.length > 0) return found;\n }\n\n // Priority 3: any named export that looks like a tool\n return Object.entries(mod)\n .filter(([key]) => key !== 'default' && key !== 'tools')\n .map(([, value]) => value)\n .filter(isToolDefinition);\n}\n","import {\n makeDisabledError,\n makeExecutionError,\n makeFailure,\n makeNotFoundError,\n makeTimeoutError,\n makeValidationInputError,\n makeValidationOutputError,\n} from './errors.js';\nimport { runAfter, runBefore, runOnError } from './middleware.js';\nimport type {\n AnthropicTool,\n GeminiToolConfig,\n Middleware,\n OpenAITool,\n RegistryOptions,\n ToolCallRequest,\n ToolDefinition,\n ToolResult,\n ToolSuccess,\n VercelAIToolSet,\n} from './types.js';\nimport { toAnthropic } from './adapters/anthropic.js';\nimport { toGemini } from './adapters/gemini.js';\nimport { toOpenAI } from './adapters/openai.js';\nimport { toVercelAI } from './adapters/vercel-ai.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyTool = ToolDefinition<any, any>;\n\nexport class ToolRegistry {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private readonly tools = new Map<string, ToolDefinition<any, any>>();\n private readonly disabledTools = new Set<string>();\n private readonly _middleware: Middleware[] = [];\n private readonly options: RegistryOptions;\n\n constructor(tools: AnyTool[] = [], options: RegistryOptions = {}) {\n this.options = options;\n for (const t of tools) {\n this.tools.set(t.name, t);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Tool management\n // ---------------------------------------------------------------------------\n\n /** Add one or more tools. Returns `this` for chaining. */\n register(tools: AnyTool | AnyTool[]): this {\n const list = Array.isArray(tools) ? tools : [tools];\n for (const t of list) this.tools.set(t.name, t);\n return this;\n }\n\n /**\n * Replace a registered tool in-place (hot-swap).\n * Useful for swapping slow tools with cached versions mid-run.\n */\n swap(name: string, newTool: AnyTool): this {\n if (!this.tools.has(name)) {\n throw new Error(`toolwire: Cannot swap \"${name}\" — it is not registered.`);\n }\n this.tools.set(name, newTool);\n return this;\n }\n\n /** Temporarily prevent a tool from being called. */\n disable(name: string): this {\n if (!this.tools.has(name)) {\n throw new Error(`toolwire: Cannot disable \"${name}\" — it is not registered.`);\n }\n this.disabledTools.add(name);\n return this;\n }\n\n /** Re-enable a previously disabled tool. */\n enable(name: string): this {\n if (!this.tools.has(name)) {\n throw new Error(`toolwire: Cannot enable \"${name}\" — it is not registered.`);\n }\n this.disabledTools.delete(name);\n return this;\n }\n\n /** Add middleware. Returns `this` for chaining. */\n use(middleware: Middleware | Middleware[]): this {\n const list = Array.isArray(middleware) ? middleware : [middleware];\n this._middleware.push(...list);\n return this;\n }\n\n /** Return the names of all registered tools (including disabled ones). */\n list(): string[] {\n return [...this.tools.keys()];\n }\n\n /** Return a tool definition by name, or undefined if not found. */\n get(name: string): AnyTool | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Return a human-readable list of enabled tools.\n * Handy for injecting into a system prompt.\n */\n describe(): string {\n const enabled = [...this.tools.values()].filter(\n (t) => !this.disabledTools.has(t.name),\n );\n if (enabled.length === 0) return 'No tools are currently available.';\n return enabled.map((t) => `- ${t.name}: ${t.description}`).join('\\n');\n }\n\n // ---------------------------------------------------------------------------\n // Execution\n // ---------------------------------------------------------------------------\n\n /**\n * Execute a tool call from an LLM.\n * Always resolves (never throws) — check `result.success` to distinguish outcomes.\n */\n async call(request: ToolCallRequest): Promise<ToolResult> {\n const start = Date.now();\n const { name: toolName, arguments: rawArgs } = request;\n\n // 1. Tool exists?\n const toolDef = this.tools.get(toolName);\n if (!toolDef) {\n return runOnError(\n this._middleware,\n toolName,\n rawArgs,\n makeFailure(toolName, makeNotFoundError(toolName, this.list()), Date.now() - start),\n );\n }\n\n // 2. Tool enabled?\n if (this.disabledTools.has(toolName)) {\n return runOnError(\n this._middleware,\n toolName,\n rawArgs,\n makeFailure(toolName, makeDisabledError(toolName), Date.now() - start),\n );\n }\n\n // 3. Validate input\n const parsed = toolDef.input.safeParse(rawArgs);\n if (!parsed.success) {\n return runOnError(\n this._middleware,\n toolName,\n rawArgs,\n makeFailure(\n toolName,\n makeValidationInputError(toolName, parsed.error.issues),\n Date.now() - start,\n ),\n );\n }\n\n // 4. beforeCall middleware (can transform args)\n let args: unknown = parsed.data;\n try {\n args = await runBefore(this._middleware, toolName, args);\n } catch (err) {\n return runOnError(\n this._middleware,\n toolName,\n rawArgs,\n makeFailure(toolName, makeExecutionError(toolName, err, 1), Date.now() - start),\n );\n }\n\n // 5. Execute with timeout + retries\n const timeout =\n toolDef.timeout ?? this.options.defaultTimeout ?? 30_000;\n const maxAttempts = toolDef.retries + 1;\n let lastError: unknown;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = await withTimeout(\n (signal) => (toolDef.handler as (i: unknown, c: { signal: AbortSignal; attempt: number }) => unknown)(args, { signal, attempt }),\n timeout,\n toolName,\n );\n\n // 6. Validate output (if schema provided)\n let output: unknown = data;\n if (toolDef.output) {\n const outParsed = toolDef.output.safeParse(data);\n if (!outParsed.success) {\n return runOnError(\n this._middleware,\n toolName,\n rawArgs,\n makeFailure(\n toolName,\n makeValidationOutputError(toolName, outParsed.error.issues),\n Date.now() - start,\n ),\n );\n }\n output = outParsed.data;\n }\n\n // 7. Build success & run afterCall middleware\n const raw: ToolSuccess = {\n success: true,\n data: output,\n toolName,\n durationMs: Date.now() - start,\n };\n return await runAfter(this._middleware, toolName, rawArgs, raw);\n\n } catch (err) {\n lastError = err;\n\n if (isAbortError(err)) {\n return runOnError(\n this._middleware,\n toolName,\n rawArgs,\n makeFailure(toolName, makeTimeoutError(toolName, timeout), Date.now() - start),\n );\n }\n\n if (attempt < maxAttempts - 1) {\n await sleep(100 * 2 ** attempt);\n }\n }\n }\n\n // All retries exhausted\n return runOnError(\n this._middleware,\n toolName,\n rawArgs,\n makeFailure(\n toolName,\n makeExecutionError(toolName, lastError, maxAttempts),\n Date.now() - start,\n ),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Provider adapters\n // ---------------------------------------------------------------------------\n\n /** Export tool schemas in OpenAI function-calling format. */\n toOpenAI(options?: { strict?: boolean }): OpenAITool[] {\n return toOpenAI(this.enabledTools(), options);\n }\n\n /** Export tool schemas in Anthropic tool-use format. */\n toAnthropic(): AnthropicTool[] {\n return toAnthropic(this.enabledTools());\n }\n\n /** Export tool schemas in Google Gemini format. */\n toGemini(): GeminiToolConfig {\n return toGemini(this.enabledTools());\n }\n\n /** Export tool schemas in Vercel AI SDK format (passes Zod schemas directly). */\n toVercelAI(): VercelAIToolSet {\n return toVercelAI(this.enabledTools());\n }\n\n // ---------------------------------------------------------------------------\n // Static factory methods\n // ---------------------------------------------------------------------------\n\n /** Load tools from a directory of compiled JS/MJS files. */\n static async fromDir(dirPath: string): Promise<ToolRegistry> {\n const { fromDir } = await import('./discovery.js');\n return fromDir(dirPath);\n }\n\n /** Load tools from a remote JSON manifest. */\n static async fromManifest(url: string): Promise<ToolRegistry> {\n const { fromManifest } = await import('./discovery.js');\n return fromManifest(url);\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private enabledTools(): AnyTool[] {\n return [...this.tools.values()].filter((t) => !this.disabledTools.has(t.name));\n }\n}\n\n/** Convenience factory — same as `new ToolRegistry(tools, options)`. */\nexport function registry(tools: AnyTool[] = [], options: RegistryOptions = {}): ToolRegistry {\n return new ToolRegistry(tools, options);\n}\n\n// ---------------------------------------------------------------------------\n// Internal utilities\n// ---------------------------------------------------------------------------\n\nasync function withTimeout<T>(\n fn: (signal: AbortSignal) => T | Promise<T>,\n ms: number,\n toolName: string,\n): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => {\n controller.abort(\n new DOMException(`Tool \"${toolName}\" timed out after ${ms}ms`, 'AbortError'),\n );\n }, ms);\n\n const execution = Promise.resolve().then(() => fn(controller.signal));\n const timeoutRace = new Promise<never>((_, reject) => {\n controller.signal.addEventListener('abort', () => reject(controller.signal.reason), {\n once: true,\n });\n });\n\n try {\n return await Promise.race([execution, timeoutRace]);\n } finally {\n clearTimeout(timer);\n // Suppress any later rejection from the execution promise if timeout won\n execution.catch(() => undefined);\n }\n}\n\nfunction isAbortError(err: unknown): boolean {\n return (\n err instanceof Error &&\n (err.name === 'AbortError' || (err instanceof DOMException && err.name === 'AbortError'))\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// ---------------------------------------------------------------------------\n// Factories\n// ---------------------------------------------------------------------------\nexport { tool } from './tool.js';\nexport { registry, ToolRegistry } from './registry.js';\n\n// ---------------------------------------------------------------------------\n// Provider adapters (standalone, tree-shakeable)\n// ---------------------------------------------------------------------------\nexport { toOpenAI } from './adapters/openai.js';\nexport { toAnthropic } from './adapters/anthropic.js';\nexport { toGemini } from './adapters/gemini.js';\nexport { toVercelAI } from './adapters/vercel-ai.js';\n\n// ---------------------------------------------------------------------------\n// Discovery\n// ---------------------------------------------------------------------------\nexport { fromDir, fromManifest } from './discovery.js';\n\n// ---------------------------------------------------------------------------\n// Error constructors (useful for middleware authors)\n// ---------------------------------------------------------------------------\nexport {\n makeDisabledError,\n makeExecutionError,\n makeFailure,\n makeNotFoundError,\n makeTimeoutError,\n makeValidationInputError,\n makeValidationOutputError,\n} from './errors.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\nexport type {\n // Config & definition\n ToolConfig,\n ToolContext,\n ToolAnnotations,\n ToolDefinition,\n\n // Results\n ToolResult,\n ToolSuccess,\n ToolFailure,\n\n // Errors\n ToolError,\n ToolErrorCode,\n\n // Middleware\n Middleware,\n\n // Registry\n ToolCallRequest,\n RegistryOptions,\n\n // Provider adapter types\n OpenAITool,\n AnthropicTool,\n GeminiFunctionDeclaration,\n GeminiToolConfig,\n VercelAIToolDef,\n VercelAIToolSet,\n\n // Discovery\n ToolManifest,\n ToolManifestEntry,\n\n // Schema\n JsonSchema,\n\n // Type inference\n InferInput,\n InferOutput,\n} from './types.js';\n"],"mappings":"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","names":["err","err","resolve","fromDir","fromManifest"]}
@@ -0,0 +1,325 @@
1
+ import { ZodType, ZodIssue } from 'zod';
2
+
3
+ type JsonSchema = Record<string, unknown>;
4
+ interface ToolConfig<TInput = unknown, TOutput = unknown> {
5
+ /** Unique name. 1–64 chars: letters, digits, underscores, hyphens. */
6
+ name: string;
7
+ /** Human description — explain when and how to call this tool. */
8
+ description: string;
9
+ /** Zod schema for input arguments. */
10
+ input: ZodType<TInput>;
11
+ /** Optional Zod schema for the return value. Validates handler output. */
12
+ output?: ZodType<TOutput>;
13
+ /** The implementation. Receives validated input and a ToolContext. */
14
+ handler: (input: TInput, context: ToolContext) => TOutput | Promise<TOutput>;
15
+ /** Timeout in milliseconds. Default: 30_000 */
16
+ timeout?: number;
17
+ /** Extra retry attempts on execution failure (not validation/timeout). Default: 0 */
18
+ retries?: number;
19
+ /** MCP-style behavioural hints (informational only — not enforced). */
20
+ annotations?: ToolAnnotations;
21
+ /**
22
+ * Override the auto-computed JSON Schema for the input.
23
+ * Useful when loading tools from remote manifests.
24
+ */
25
+ _jsonSchema?: JsonSchema;
26
+ }
27
+ interface ToolContext {
28
+ /** AbortSignal tied to the timeout. Handlers should honour this for cooperative cancellation. */
29
+ signal: AbortSignal;
30
+ /** Current attempt index (0 = first try, 1 = first retry, …). */
31
+ attempt: number;
32
+ }
33
+ interface ToolAnnotations {
34
+ /** Human-readable display title. */
35
+ title?: string;
36
+ /** Hint: tool only reads data, no side-effects. */
37
+ readOnly?: boolean;
38
+ /** Hint: tool modifies or deletes data. */
39
+ destructive?: boolean;
40
+ /** Hint: tool makes expensive external calls — consider caching. */
41
+ expensive?: boolean;
42
+ /** Hint: prompt user for confirmation before calling. */
43
+ requiresConfirmation?: boolean;
44
+ [key: string]: unknown;
45
+ }
46
+ interface ToolDefinition<TInput = unknown, TOutput = unknown> {
47
+ readonly name: string;
48
+ readonly description: string;
49
+ readonly input: ZodType<TInput>;
50
+ readonly output: ZodType<TOutput> | undefined;
51
+ readonly handler: (input: TInput, context: ToolContext) => TOutput | Promise<TOutput>;
52
+ readonly timeout: number;
53
+ readonly retries: number;
54
+ readonly annotations: ToolAnnotations;
55
+ /** Pre-computed JSON Schema for the input. Used by provider adapters. */
56
+ readonly inputSchema: JsonSchema;
57
+ /** Pre-computed JSON Schema for the output, if an output schema was provided. */
58
+ readonly outputSchema: JsonSchema | undefined;
59
+ }
60
+ type ToolResult<T = unknown> = ToolSuccess<T> | ToolFailure;
61
+ interface ToolSuccess<T = unknown> {
62
+ readonly success: true;
63
+ readonly data: T;
64
+ readonly toolName: string;
65
+ readonly durationMs: number;
66
+ }
67
+ interface ToolFailure {
68
+ readonly success: false;
69
+ readonly error: ToolError;
70
+ readonly toolName: string;
71
+ readonly durationMs: number;
72
+ }
73
+ type ToolErrorCode = 'VALIDATION_INPUT' | 'VALIDATION_OUTPUT' | 'EXECUTION' | 'TIMEOUT' | 'NOT_FOUND' | 'DISABLED';
74
+ interface ToolError {
75
+ readonly code: ToolErrorCode;
76
+ /** Developer-readable message (suitable for logs). */
77
+ readonly message: string;
78
+ /** LLM-readable message formatted to help the model understand and retry. */
79
+ readonly llmMessage: string;
80
+ readonly toolName: string;
81
+ /** Whether the LLM should retry the call. */
82
+ readonly retryable: boolean;
83
+ /** Suggested wait before retrying (ms). */
84
+ readonly retryAfterMs?: number;
85
+ /** Full Zod issue list — only present for VALIDATION_* errors. */
86
+ readonly issues?: ReadonlyArray<ZodIssue>;
87
+ /** Original thrown value — only present for EXECUTION errors. */
88
+ readonly cause?: unknown;
89
+ }
90
+ interface Middleware {
91
+ /** Optional name for logging / debugging. */
92
+ name?: string;
93
+ /**
94
+ * Runs before execution, in registration order.
95
+ * Return a value to replace the tool arguments; return void/undefined to keep them.
96
+ */
97
+ beforeCall?: (toolName: string, args: unknown) => unknown | Promise<unknown> | void | Promise<void>;
98
+ /**
99
+ * Runs after a successful execution, in reverse registration order.
100
+ * Return a ToolSuccess to replace the result; return void/undefined to keep it.
101
+ */
102
+ afterCall?: (toolName: string, args: unknown, result: ToolSuccess) => ToolSuccess | Promise<ToolSuccess> | void | Promise<void>;
103
+ /**
104
+ * Runs on any failure (validation, execution, timeout, not-found, disabled).
105
+ * Return a ToolResult to recover from the error; return void/undefined to propagate the failure.
106
+ */
107
+ onError?: (toolName: string, args: unknown, failure: ToolFailure) => ToolResult | Promise<ToolResult> | void | Promise<void>;
108
+ }
109
+ interface ToolCallRequest {
110
+ /** Name of the tool to call. */
111
+ name: string;
112
+ /** Raw arguments from the LLM (validated against the input schema at runtime). */
113
+ arguments: unknown;
114
+ }
115
+ interface RegistryOptions {
116
+ /** Default timeout for tools that don't specify their own (ms). */
117
+ defaultTimeout?: number;
118
+ }
119
+ interface OpenAITool {
120
+ type: 'function';
121
+ function: {
122
+ name: string;
123
+ description: string;
124
+ parameters: JsonSchema;
125
+ strict?: boolean;
126
+ };
127
+ }
128
+ interface AnthropicTool {
129
+ name: string;
130
+ description: string;
131
+ input_schema: JsonSchema;
132
+ }
133
+ interface GeminiFunctionDeclaration {
134
+ name: string;
135
+ description: string;
136
+ parametersJsonSchema: JsonSchema;
137
+ }
138
+ interface GeminiToolConfig {
139
+ functionDeclarations: GeminiFunctionDeclaration[];
140
+ }
141
+ interface VercelAIToolDef {
142
+ description: string;
143
+ parameters: ZodType;
144
+ }
145
+ type VercelAIToolSet = Record<string, VercelAIToolDef>;
146
+ interface ToolManifestEntry {
147
+ name: string;
148
+ description: string;
149
+ inputSchema: JsonSchema;
150
+ endpoint: string;
151
+ }
152
+ interface ToolManifest {
153
+ version: '1.0';
154
+ tools: ToolManifestEntry[];
155
+ }
156
+ /** Extract the input type from a ToolDefinition. */
157
+ type InferInput<T> = T extends ToolDefinition<infer I, unknown> ? I : never;
158
+ /** Extract the output type from a ToolDefinition. */
159
+ type InferOutput<T> = T extends ToolDefinition<unknown, infer O> ? O : never;
160
+
161
+ /**
162
+ * Define a tool. Returns a frozen ToolDefinition with pre-computed JSON schemas.
163
+ *
164
+ * @example
165
+ * ```ts
166
+ * const search = tool({
167
+ * name: 'search_web',
168
+ * description: 'Search the web for current information',
169
+ * input: z.object({ query: z.string().min(1) }),
170
+ * handler: async ({ query }) => mySearchAPI(query),
171
+ * timeout: 10_000,
172
+ * });
173
+ * ```
174
+ */
175
+ declare function tool<TInput = unknown, TOutput = unknown>(config: ToolConfig<TInput, TOutput>): ToolDefinition<TInput, TOutput>;
176
+
177
+ type AnyTool = ToolDefinition<any, any>;
178
+ declare class ToolRegistry {
179
+ private readonly tools;
180
+ private readonly disabledTools;
181
+ private readonly _middleware;
182
+ private readonly options;
183
+ constructor(tools?: AnyTool[], options?: RegistryOptions);
184
+ /** Add one or more tools. Returns `this` for chaining. */
185
+ register(tools: AnyTool | AnyTool[]): this;
186
+ /**
187
+ * Replace a registered tool in-place (hot-swap).
188
+ * Useful for swapping slow tools with cached versions mid-run.
189
+ */
190
+ swap(name: string, newTool: AnyTool): this;
191
+ /** Temporarily prevent a tool from being called. */
192
+ disable(name: string): this;
193
+ /** Re-enable a previously disabled tool. */
194
+ enable(name: string): this;
195
+ /** Add middleware. Returns `this` for chaining. */
196
+ use(middleware: Middleware | Middleware[]): this;
197
+ /** Return the names of all registered tools (including disabled ones). */
198
+ list(): string[];
199
+ /** Return a tool definition by name, or undefined if not found. */
200
+ get(name: string): AnyTool | undefined;
201
+ /**
202
+ * Return a human-readable list of enabled tools.
203
+ * Handy for injecting into a system prompt.
204
+ */
205
+ describe(): string;
206
+ /**
207
+ * Execute a tool call from an LLM.
208
+ * Always resolves (never throws) — check `result.success` to distinguish outcomes.
209
+ */
210
+ call(request: ToolCallRequest): Promise<ToolResult>;
211
+ /** Export tool schemas in OpenAI function-calling format. */
212
+ toOpenAI(options?: {
213
+ strict?: boolean;
214
+ }): OpenAITool[];
215
+ /** Export tool schemas in Anthropic tool-use format. */
216
+ toAnthropic(): AnthropicTool[];
217
+ /** Export tool schemas in Google Gemini format. */
218
+ toGemini(): GeminiToolConfig;
219
+ /** Export tool schemas in Vercel AI SDK format (passes Zod schemas directly). */
220
+ toVercelAI(): VercelAIToolSet;
221
+ /** Load tools from a directory of compiled JS/MJS files. */
222
+ static fromDir(dirPath: string): Promise<ToolRegistry>;
223
+ /** Load tools from a remote JSON manifest. */
224
+ static fromManifest(url: string): Promise<ToolRegistry>;
225
+ private enabledTools;
226
+ }
227
+ /** Convenience factory — same as `new ToolRegistry(tools, options)`. */
228
+ declare function registry(tools?: AnyTool[], options?: RegistryOptions): ToolRegistry;
229
+
230
+ /**
231
+ * Convert tool definitions to OpenAI function-calling format.
232
+ *
233
+ * @example
234
+ * ```ts
235
+ * const response = await openai.chat.completions.create({
236
+ * model: 'gpt-4o',
237
+ * tools: reg.toOpenAI({ strict: true }),
238
+ * messages,
239
+ * });
240
+ * ```
241
+ */
242
+ declare function toOpenAI(tools: ToolDefinition<any, any>[], options?: {
243
+ strict?: boolean;
244
+ }): OpenAITool[];
245
+
246
+ /**
247
+ * Convert tool definitions to Anthropic tool-use format.
248
+ * Note: uses `input_schema` (not `parameters`).
249
+ *
250
+ * @example
251
+ * ```ts
252
+ * const response = await anthropic.messages.create({
253
+ * model: 'claude-opus-4-6',
254
+ * tools: reg.toAnthropic(),
255
+ * messages,
256
+ * });
257
+ * ```
258
+ */
259
+ declare function toAnthropic(tools: ToolDefinition<any, any>[]): AnthropicTool[];
260
+
261
+ /**
262
+ * Convert tool definitions to Google Gemini format.
263
+ * Uses `parametersJsonSchema` (not `parameters`) and wraps in `functionDeclarations`.
264
+ *
265
+ * @example
266
+ * ```ts
267
+ * const response = await model.generateContent({
268
+ * tools: [reg.toGemini()],
269
+ * contents,
270
+ * });
271
+ * ```
272
+ */
273
+ declare function toGemini(tools: ToolDefinition<any, any>[]): GeminiToolConfig;
274
+
275
+ /**
276
+ * Convert tool definitions to Vercel AI SDK format.
277
+ * Unlike other adapters, this passes the original Zod schema directly
278
+ * (Vercel AI SDK handles JSON Schema conversion internally).
279
+ *
280
+ * @example
281
+ * ```ts
282
+ * const { text } = await generateText({
283
+ * model: openai('gpt-4o'),
284
+ * tools: reg.toVercelAI(),
285
+ * prompt,
286
+ * });
287
+ * ```
288
+ */
289
+ declare function toVercelAI(tools: ToolDefinition<any, any>[]): VercelAIToolSet;
290
+
291
+ /**
292
+ * Load tools from a directory of compiled JavaScript files.
293
+ * Each file may export:
294
+ * - `export default tool(...)` — a single tool as the default export
295
+ * - `export const tools = [tool(...), ...]` — an array under the `tools` named export
296
+ * - `export const myTool = tool(...)` — any named export that is a ToolDefinition
297
+ *
298
+ * Only `.js`, `.mjs`, and `.cjs` files are scanned.
299
+ * Files that fail to import are skipped with a warning.
300
+ */
301
+ declare function fromDir(dirPath: string): Promise<ToolRegistry>;
302
+ /**
303
+ * Load tools from a remote JSON manifest.
304
+ * The manifest must conform to the ToolManifest schema:
305
+ * ```json
306
+ * {
307
+ * "version": "1.0",
308
+ * "tools": [
309
+ * { "name": "...", "description": "...", "inputSchema": {...}, "endpoint": "https://..." }
310
+ * ]
311
+ * }
312
+ * ```
313
+ * Each tool is proxied as an HTTP POST to its `endpoint`.
314
+ */
315
+ declare function fromManifest(url: string): Promise<ToolRegistry>;
316
+
317
+ declare function makeNotFoundError(toolName: string, available: string[]): ToolError;
318
+ declare function makeDisabledError(toolName: string): ToolError;
319
+ declare function makeValidationInputError(toolName: string, issues: ZodIssue[]): ToolError;
320
+ declare function makeValidationOutputError(toolName: string, issues: ZodIssue[]): ToolError;
321
+ declare function makeTimeoutError(toolName: string, timeoutMs: number): ToolError;
322
+ declare function makeExecutionError(toolName: string, cause: unknown, attempts: number): ToolError;
323
+ declare function makeFailure(toolName: string, error: ToolError, durationMs: number): ToolFailure;
324
+
325
+ export { type AnthropicTool, type GeminiFunctionDeclaration, type GeminiToolConfig, type InferInput, type InferOutput, type JsonSchema, type Middleware, type OpenAITool, type RegistryOptions, type ToolAnnotations, type ToolCallRequest, type ToolConfig, type ToolContext, type ToolDefinition, type ToolError, type ToolErrorCode, type ToolFailure, type ToolManifest, type ToolManifestEntry, ToolRegistry, type ToolResult, type ToolSuccess, type VercelAIToolDef, type VercelAIToolSet, fromDir, fromManifest, makeDisabledError, makeExecutionError, makeFailure, makeNotFoundError, makeTimeoutError, makeValidationInputError, makeValidationOutputError, registry, toAnthropic, toGemini, toOpenAI, toVercelAI, tool };