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.
- package/LICENSE +21 -0
- package/README.md +443 -0
- package/dist/index.cjs +719 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +325 -0
- package/dist/index.d.ts +325 -0
- package/dist/index.js +674 -0
- package/dist/index.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/tsup/assets/esm_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 esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "toolwire",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Framework-agnostic tool registry for LLM agents. Define tools with Zod schemas, validate arguments, export to OpenAI, Anthropic, Gemini, or Vercel AI.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=18"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"test:coverage": "vitest run --coverage",
|
|
30
|
+
"typecheck": "tsc --noEmit",
|
|
31
|
+
"prepublishOnly": "npm run typecheck && npm run build && npm test"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"zod": "^3.22.0 || ^4.0.0"
|
|
35
|
+
},
|
|
36
|
+
"peerDependenciesMeta": {
|
|
37
|
+
"zod": {
|
|
38
|
+
"optional": false
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
|
+
"tsup": "^8.0.0",
|
|
44
|
+
"typescript": "^5.5.0",
|
|
45
|
+
"vitest": "^3.0.0",
|
|
46
|
+
"zod": "^4.3.0"
|
|
47
|
+
},
|
|
48
|
+
"keywords": [
|
|
49
|
+
"llm",
|
|
50
|
+
"tools",
|
|
51
|
+
"tool-registry",
|
|
52
|
+
"toolwire",
|
|
53
|
+
"agent",
|
|
54
|
+
"ai-agent",
|
|
55
|
+
"agentic",
|
|
56
|
+
"openai",
|
|
57
|
+
"anthropic",
|
|
58
|
+
"claude",
|
|
59
|
+
"gemini",
|
|
60
|
+
"gpt",
|
|
61
|
+
"gpt-4",
|
|
62
|
+
"vercel-ai",
|
|
63
|
+
"vercel-ai-sdk",
|
|
64
|
+
"function-calling",
|
|
65
|
+
"tool-use",
|
|
66
|
+
"tool-calling",
|
|
67
|
+
"zod",
|
|
68
|
+
"validation",
|
|
69
|
+
"schema",
|
|
70
|
+
"json-schema",
|
|
71
|
+
"ai",
|
|
72
|
+
"generative-ai",
|
|
73
|
+
"framework-agnostic",
|
|
74
|
+
"typescript",
|
|
75
|
+
"middleware",
|
|
76
|
+
"error-handling",
|
|
77
|
+
"llm-tools",
|
|
78
|
+
"ai-tools",
|
|
79
|
+
"rag",
|
|
80
|
+
"chatbot",
|
|
81
|
+
"hot-swap",
|
|
82
|
+
"runtime-discovery"
|
|
83
|
+
],
|
|
84
|
+
"license": "MIT",
|
|
85
|
+
"repository": {
|
|
86
|
+
"type": "git",
|
|
87
|
+
"url": "https://github.com/your-username/toolwire.git"
|
|
88
|
+
},
|
|
89
|
+
"homepage": "https://github.com/your-username/toolwire#readme",
|
|
90
|
+
"bugs": {
|
|
91
|
+
"url": "https://github.com/your-username/toolwire/issues"
|
|
92
|
+
}
|
|
93
|
+
}
|