@stackline/tool-router 1.0.0

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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.js", "../src/errors.js", "../src/safe.js", "../src/adapters.js", "../src/schema.js", "../src/tokenize.js", "../src/router.js", "../src/search-tool.js"],
4
+ "sourcesContent": ["import { TOOL_FORMATS, detectToolFormat, normalizeTool, normalizeTools } from './adapters.js';\nimport { ToolRouterError } from './errors.js';\nimport {\n ToolRouter,\n createToolRouter,\n defineTool,\n estimateToolTokens,\n routeTools\n} from './router.js';\nimport { createToolSearch } from './search-tool.js';\nimport { normalizeIdentifier, normalizeText, tokenize } from './tokenize.js';\n\nexport {\n TOOL_FORMATS,\n ToolRouter,\n ToolRouterError,\n createToolRouter,\n createToolSearch,\n defineTool,\n detectToolFormat,\n estimateToolTokens,\n normalizeIdentifier,\n normalizeText,\n normalizeTool,\n normalizeTools,\n routeTools,\n tokenize\n};\n\nexport default Object.freeze({\n TOOL_FORMATS,\n ToolRouter,\n ToolRouterError,\n createToolRouter,\n createToolSearch,\n defineTool,\n detectToolFormat,\n estimateToolTokens,\n normalizeIdentifier,\n normalizeText,\n normalizeTool,\n normalizeTools,\n routeTools,\n tokenize\n});\n", "export class ToolRouterError extends Error {\n constructor(code, message, details) {\n super(message);\n this.name = 'ToolRouterError';\n this.code = code;\n if (details !== undefined) this.details = details;\n }\n}\n\nexport function fail(code, message, details) {\n throw new ToolRouterError(code, message, details);\n}\n", "import { fail } from './errors.js';\n\nconst UNSAFE_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\n\nexport function isUnsafeKey(key) {\n return typeof key === 'string' && UNSAFE_KEYS.has(key);\n}\n\nexport function isObject(value) {\n return value !== null && typeof value === 'object';\n}\n\nexport function ownValue(value, key) {\n if (!isObject(value) && typeof value !== 'function') return undefined;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor && Object.prototype.hasOwnProperty.call(descriptor, 'value')\n ? descriptor.value\n : undefined;\n}\n\nexport function ownEnumerableEntries(value) {\n if (!isObject(value)) return [];\n const descriptors = Object.getOwnPropertyDescriptors(value);\n const entries = [];\n for (const key of Object.keys(descriptors)) {\n const descriptor = descriptors[key];\n if (!descriptor.enumerable || !Object.prototype.hasOwnProperty.call(descriptor, 'value')) continue;\n if (isUnsafeKey(key)) continue;\n entries.push([key, descriptor.value]);\n }\n return entries;\n}\n\nexport function stringValue(value, fallback = '') {\n return typeof value === 'string' ? value : fallback;\n}\n\nexport function stringList(value, limit = 256) {\n if (!Array.isArray(value)) return [];\n const result = [];\n for (let index = 0; index < value.length && result.length < limit; index++) {\n const item = ownValue(value, String(index));\n if (typeof item === 'string' && item.length > 0) result.push(item);\n }\n return result;\n}\n\nexport function positiveInteger(value, fallback, maximum, label) {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value < 1 || value > maximum) {\n fail('ERR_TOOL_ROUTER_OPTION', `${label} must be an integer between 1 and ${maximum}`);\n }\n return value;\n}\n\nexport function finiteNumber(value, fallback, minimum, maximum, label) {\n if (value === undefined) return fallback;\n if (typeof value !== 'number' || !Number.isFinite(value) || value < minimum || value > maximum) {\n fail('ERR_TOOL_ROUTER_OPTION', `${label} must be a finite number between ${minimum} and ${maximum}`);\n }\n return value;\n}\n", "import { fail } from './errors.js';\nimport { isObject, ownValue, positiveInteger, stringList, stringValue } from './safe.js';\n\nexport const TOOL_FORMATS = Object.freeze([\n 'canonical',\n 'mcp',\n 'openai-chat',\n 'openai-responses',\n 'anthropic',\n 'gemini'\n]);\n\nfunction explicitFormat(format) {\n if (format === undefined || format === 'auto') return undefined;\n if (!TOOL_FORMATS.includes(format)) {\n fail('ERR_TOOL_FORMAT', `Unsupported tool format: ${String(format)}`);\n }\n return format;\n}\n\nexport function detectToolFormat(tool) {\n if (!isObject(tool)) fail('ERR_TOOL_DEFINITION', 'Tool definition must be an object');\n const type = ownValue(tool, 'type');\n const nestedFunction = ownValue(tool, 'function');\n if (type === 'function' && isObject(nestedFunction)) return 'openai-chat';\n if (type === 'function' && typeof ownValue(tool, 'name') === 'string') return 'openai-responses';\n if (ownValue(tool, 'input_schema') !== undefined) return 'anthropic';\n if (ownValue(tool, 'inputSchema') !== undefined) return 'mcp';\n if (ownValue(tool, 'parameters') !== undefined) return 'gemini';\n if (typeof ownValue(tool, 'name') === 'string') return 'canonical';\n fail('ERR_TOOL_FORMAT', 'Unable to detect the tool definition format');\n}\n\nfunction sourceForFormat(tool, format) {\n if (format === 'openai-chat') {\n const nested = ownValue(tool, 'function');\n if (!isObject(nested)) fail('ERR_TOOL_DEFINITION', 'OpenAI Chat tool.function must be an object');\n return nested;\n }\n return tool;\n}\n\nfunction schemaForFormat(source, format) {\n if (format === 'mcp' || format === 'canonical') {\n return ownValue(source, 'inputSchema') === undefined\n ? ownValue(source, 'schema')\n : ownValue(source, 'inputSchema');\n }\n if (format === 'anthropic') return ownValue(source, 'input_schema');\n return ownValue(source, 'parameters');\n}\n\nfunction outputSchemaForFormat(source, format) {\n if (format === 'mcp' || format === 'canonical') return ownValue(source, 'outputSchema');\n return undefined;\n}\n\nfunction inferNamespace(name) {\n for (const separator of ['__', '.', '/']) {\n const index = name.indexOf(separator);\n if (index > 0) return name.slice(0, index);\n }\n return '';\n}\n\nexport function normalizeTool(tool, options = {}) {\n if (!isObject(tool)) fail('ERR_TOOL_DEFINITION', 'Tool definition must be an object');\n if (!isObject(options)) fail('ERR_TOOL_ROUTER_OPTION', 'Normalization options must be an object');\n const format = explicitFormat(options.format) || detectToolFormat(tool);\n const source = sourceForFormat(tool, format);\n const name = stringValue(ownValue(source, 'name'));\n if (name.length === 0) fail('ERR_TOOL_NAME', 'Tool name must be a non-empty string');\n if (name.length > 512) fail('ERR_TOOL_NAME', 'Tool name must not exceed 512 characters');\n\n const description = stringValue(ownValue(source, 'description'));\n const explicitNamespace = stringValue(ownValue(tool, 'namespace')) || stringValue(ownValue(source, 'namespace'));\n const namespace = explicitNamespace || inferNamespace(name);\n const explicitId = stringValue(ownValue(tool, 'id')) || stringValue(ownValue(source, 'id'));\n const id = explicitId || (namespace ? `${namespace}:${name}` : name);\n const tags = stringList(ownValue(tool, 'tags')).concat(stringList(ownValue(source, 'tags')));\n const aliases = stringList(ownValue(tool, 'aliases')).concat(stringList(ownValue(source, 'aliases')));\n\n return Object.freeze({\n aliases: Object.freeze(Array.from(new Set(aliases))),\n description,\n format,\n id,\n inputSchema: schemaForFormat(source, format),\n name,\n namespace,\n original: tool,\n outputSchema: outputSchemaForFormat(source, format),\n tags: Object.freeze(Array.from(new Set(tags)))\n });\n}\n\nfunction unwrapTools(input) {\n if (Array.isArray(input)) return input;\n if (!isObject(input)) fail('ERR_TOOL_CATALOG', 'Tool catalog must be an array or provider envelope');\n const tools = ownValue(input, 'tools');\n if (Array.isArray(tools)) return tools;\n const declarations = ownValue(input, 'functionDeclarations');\n if (Array.isArray(declarations)) return declarations;\n fail('ERR_TOOL_CATALOG', 'Tool catalog envelope must contain tools or functionDeclarations');\n}\n\nexport function normalizeTools(input, options = {}) {\n if (!isObject(options)) fail('ERR_TOOL_ROUTER_OPTION', 'Normalization options must be an object');\n const outer = unwrapTools(input);\n const maxTools = positiveInteger(options.maxTools, 100_000, 1_000_000, 'maxTools');\n if (outer.length > maxTools) {\n fail('ERR_TOOL_CATALOG_SIZE', `Tool catalog exceeds maxTools (${maxTools})`);\n }\n const flattened = [];\n for (let index = 0; index < outer.length; index++) {\n const descriptor = Object.getOwnPropertyDescriptor(outer, String(index));\n if (!descriptor || !Object.prototype.hasOwnProperty.call(descriptor, 'value')) continue;\n const value = descriptor.value;\n if (isObject(value) && Array.isArray(ownValue(value, 'functionDeclarations'))) {\n const declarations = ownValue(value, 'functionDeclarations');\n if (declarations.length > maxTools - flattened.length) {\n fail('ERR_TOOL_CATALOG_SIZE', `Tool catalog exceeds maxTools (${maxTools})`);\n }\n for (let inner = 0; inner < declarations.length; inner++) {\n const innerDescriptor = Object.getOwnPropertyDescriptor(declarations, String(inner));\n if (innerDescriptor && Object.prototype.hasOwnProperty.call(innerDescriptor, 'value')) {\n flattened.push(normalizeTool(innerDescriptor.value, { format: 'gemini' }));\n }\n }\n } else {\n flattened.push(normalizeTool(value, options));\n }\n }\n return flattened;\n}\n", "import { fail } from './errors.js';\nimport { isObject, ownEnumerableEntries } from './safe.js';\n\nconst TEXT_KEYS = new Set(['title', 'description', '$comment', 'format', 'pattern', 'const']);\nconst COLLECTION_KEYS = new Set(['enum', 'examples', 'required']);\n\nexport function collectSchemaText(schema, options = {}) {\n if (!isObject(schema) && typeof schema !== 'boolean') return '';\n const maxDepth = options.maxSchemaDepth === undefined ? 24 : options.maxSchemaDepth;\n const maxNodes = options.maxSchemaNodes === undefined ? 10_000 : options.maxSchemaNodes;\n const maxTextLength = options.maxTextLength === undefined ? 65_536 : options.maxTextLength;\n const seen = new WeakSet();\n const parts = [];\n let nodes = 0;\n let length = 0;\n\n function consumeNode() {\n nodes += 1;\n if (nodes > maxNodes) fail('ERR_TOOL_SCHEMA_SIZE', `Tool schema exceeds maxSchemaNodes (${maxNodes})`);\n }\n\n function append(value) {\n if (typeof value !== 'string' && typeof value !== 'number') return;\n const text = String(value);\n if (text.length === 0 || length >= maxTextLength) return;\n const remaining = maxTextLength - length;\n const piece = text.slice(0, remaining);\n parts.push(piece);\n length += piece.length + 1;\n }\n\n function visit(value, depth, parentKey) {\n if (depth > maxDepth) fail('ERR_TOOL_SCHEMA_DEPTH', `Tool schema exceeds maxSchemaDepth (${maxDepth})`);\n consumeNode();\n if (!isObject(value)) return;\n if (seen.has(value)) return;\n seen.add(value);\n\n if (Array.isArray(value)) {\n if (value.length > maxNodes - nodes) {\n fail('ERR_TOOL_SCHEMA_SIZE', `Tool schema exceeds maxSchemaNodes (${maxNodes})`);\n }\n for (let index = 0; index < value.length; index++) {\n const descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n if (!descriptor || !Object.prototype.hasOwnProperty.call(descriptor, 'value')) continue;\n if (COLLECTION_KEYS.has(parentKey)) {\n consumeNode();\n append(descriptor.value);\n }\n else visit(descriptor.value, depth + 1, parentKey);\n }\n return;\n }\n\n const entries = ownEnumerableEntries(value);\n if (entries.length > maxNodes - nodes) {\n fail('ERR_TOOL_SCHEMA_SIZE', `Tool schema exceeds maxSchemaNodes (${maxNodes})`);\n }\n for (const [key, child] of entries) {\n if (parentKey === 'properties' || parentKey === '$defs' || parentKey === 'definitions') append(key);\n if (TEXT_KEYS.has(key)) {\n consumeNode();\n append(child);\n }\n else if (COLLECTION_KEYS.has(key) && Array.isArray(child)) visit(child, depth + 1, key);\n else visit(child, depth + 1, key);\n }\n }\n\n visit(schema, 0, '');\n return parts.join(' ');\n}\n\nexport function estimateJsonTokens(value, options = {}) {\n const maxDepth = options.maxDepth === undefined ? 64 : options.maxDepth;\n const maxNodes = options.maxNodes === undefined ? 100_000 : options.maxNodes;\n const seen = new WeakSet();\n let nodes = 0;\n\n function stringLength(text) {\n return JSON.stringify(text).length;\n }\n\n function measure(current, depth) {\n if (depth > maxDepth) fail('ERR_TOOL_VALUE_DEPTH', `Tool definition exceeds maxDepth (${maxDepth})`);\n nodes += 1;\n if (nodes > maxNodes) fail('ERR_TOOL_VALUE_SIZE', `Tool definition exceeds maxNodes (${maxNodes})`);\n if (current === null) return 4;\n if (typeof current === 'string') return stringLength(current);\n if (typeof current === 'number') return Number.isFinite(current) ? String(current).length : 4;\n if (typeof current === 'boolean') return current ? 4 : 5;\n if (typeof current === 'bigint') fail('ERR_TOOL_VALUE_TYPE', 'Tool definition cannot contain bigint values');\n if (typeof current === 'undefined' || typeof current === 'function' || typeof current === 'symbol') return 0;\n if (seen.has(current)) fail('ERR_TOOL_CYCLIC', 'Tool definition must be JSON-serializable');\n seen.add(current);\n\n let length = 2;\n let count = 0;\n if (Array.isArray(current)) {\n if (current.length > maxNodes - nodes) {\n fail('ERR_TOOL_VALUE_SIZE', `Tool definition exceeds maxNodes (${maxNodes})`);\n }\n for (let index = 0; index < current.length; index++) {\n const descriptor = Object.getOwnPropertyDescriptor(current, String(index));\n const child = descriptor && Object.prototype.hasOwnProperty.call(descriptor, 'value')\n ? descriptor.value\n : null;\n length += measure(child, depth + 1) + (count > 0 ? 1 : 0);\n count += 1;\n }\n } else {\n const entries = ownEnumerableEntries(current);\n if (entries.length > maxNodes - nodes) {\n fail('ERR_TOOL_VALUE_SIZE', `Tool definition exceeds maxNodes (${maxNodes})`);\n }\n for (const [key, child] of entries) {\n const measured = measure(child, depth + 1);\n if (measured === 0 && (child === undefined || typeof child === 'function' || typeof child === 'symbol')) continue;\n length += stringLength(key) + 1 + measured + (count > 0 ? 1 : 0);\n count += 1;\n }\n }\n seen.delete(current);\n return length;\n }\n\n return Math.max(1, Math.ceil(measure(value, 0) / 4));\n}\n", "import { fail } from './errors.js';\n\nconst COMBINING_MARKS = /[\\u0300-\\u036f]/g;\nconst CAMEL_BOUNDARY = /([\\p{Ll}\\p{N}])([\\p{Lu}])/gu;\nconst ACRONYM_BOUNDARY = /([\\p{Lu}]+)([\\p{Lu}][\\p{Ll}])/gu;\nconst WORDS = /[\\p{L}\\p{N}]+/gu;\nconst CJK = /[\\u3040-\\u30ff\\u3400-\\u4dbf\\u4e00-\\u9fff\\uac00-\\ud7af]/u;\n\nexport function normalizeText(input) {\n if (typeof input !== 'string') return '';\n let value = input;\n if (typeof value.normalize === 'function') value = value.normalize('NFKD');\n return value\n .replace(COMBINING_MARKS, '')\n .replace(ACRONYM_BOUNDARY, '$1 $2')\n .replace(CAMEL_BOUNDARY, '$1 $2')\n .toLocaleLowerCase('en-US');\n}\n\nexport function normalizeIdentifier(input) {\n return normalizeText(input).replace(/[^\\p{L}\\p{N}]+/gu, '');\n}\n\nexport function tokenize(input, options = {}) {\n const maxTokenLength = options.maxTokenLength === undefined ? 64 : options.maxTokenLength;\n if (!Number.isInteger(maxTokenLength) || maxTokenLength < 2 || maxTokenLength > 256) {\n fail('ERR_TOOL_ROUTER_OPTION', 'maxTokenLength must be an integer between 2 and 256');\n }\n\n const normalized = normalizeText(input);\n const words = normalized.match(WORDS) || [];\n const tokens = [];\n for (const word of words) {\n const token = word.slice(0, maxTokenLength);\n if (token.length > 1 || CJK.test(token)) tokens.push(token);\n if (token.length > 2 && CJK.test(token)) {\n const characters = Array.from(token);\n for (let index = 0; index < characters.length - 1; index++) {\n tokens.push(`${characters[index]}${characters[index + 1]}`);\n }\n }\n }\n return tokens;\n}\n\nexport function tokenTrigrams(token) {\n const characters = Array.from(` ${token} `);\n const result = [];\n for (let index = 0; index <= characters.length - 3; index++) {\n result.push(characters.slice(index, index + 3).join(''));\n }\n return result;\n}\n\nexport function boundedEditDistance(left, right, maximum) {\n const a = Array.from(left);\n const b = Array.from(right);\n if (Math.abs(a.length - b.length) > maximum) return maximum + 1;\n if (a.length === 0) return Math.min(b.length, maximum + 1);\n if (b.length === 0) return Math.min(a.length, maximum + 1);\n\n let previous = new Array(b.length + 1);\n for (let index = 0; index <= b.length; index++) previous[index] = index;\n\n for (let row = 1; row <= a.length; row++) {\n const current = new Array(b.length + 1);\n current[0] = row;\n let rowMinimum = current[0];\n for (let column = 1; column <= b.length; column++) {\n const substitution = previous[column - 1] + (a[row - 1] === b[column - 1] ? 0 : 1);\n const insertion = current[column - 1] + 1;\n const deletion = previous[column] + 1;\n current[column] = Math.min(substitution, insertion, deletion);\n rowMinimum = Math.min(rowMinimum, current[column]);\n }\n if (rowMinimum > maximum) return maximum + 1;\n previous = current;\n }\n\n return previous[b.length];\n}\n", "import { normalizeTool, normalizeTools } from './adapters.js';\nimport { fail } from './errors.js';\nimport { collectSchemaText, estimateJsonTokens } from './schema.js';\nimport {\n finiteNumber,\n isObject,\n ownEnumerableEntries,\n ownValue,\n positiveInteger,\n stringList\n} from './safe.js';\nimport {\n boundedEditDistance,\n normalizeIdentifier,\n tokenTrigrams,\n tokenize\n} from './tokenize.js';\n\nconst FIELD_NAMES = Object.freeze(['name', 'namespace', 'aliases', 'tags', 'description', 'schema']);\nconst DEFAULT_WEIGHTS = Object.freeze({\n aliases: 7,\n description: 2,\n name: 10,\n namespace: 8,\n schema: 1,\n tags: 5\n});\nconst DEFAULT_SYNONYM_GROUPS = Object.freeze([\n ['cancel', 'close', 'delete', 'remove'],\n ['create', 'add', 'make', 'new', 'open', 'schedule'],\n ['download', 'fetch', 'get', 'read', 'retrieve'],\n ['find', 'discover', 'look', 'lookup', 'query', 'search'],\n ['list', 'browse', 'show'],\n ['send', 'deliver', 'post', 'publish'],\n ['update', 'change', 'edit', 'modify', 'set'],\n ['available', 'availability', 'free'],\n ['conversation', 'conversations', 'message', 'messages'],\n ['document', 'documents', 'file', 'files', 'page', 'pages']\n]);\n\nfunction resolveWeights(input) {\n const weights = Object.create(null);\n for (const field of FIELD_NAMES) {\n const value = input && Object.prototype.hasOwnProperty.call(input, field)\n ? input[field]\n : DEFAULT_WEIGHTS[field];\n weights[field] = finiteNumber(value, DEFAULT_WEIGHTS[field], 0, 100, `fieldWeights.${field}`);\n }\n return Object.freeze(weights);\n}\n\nfunction resolveSynonyms(input) {\n if (input !== undefined && input !== false && !isObject(input)) {\n fail('ERR_TOOL_ROUTER_OPTION', 'synonyms must be false or an object of string arrays');\n }\n const synonyms = new Map();\n function connect(words) {\n const unique = Array.from(new Set(words.filter((word) => typeof word === 'string' && word.length > 1)));\n for (const word of unique) {\n let related = synonyms.get(word);\n if (!related) {\n related = new Set();\n synonyms.set(word, related);\n }\n for (const candidate of unique) if (candidate !== word) related.add(candidate);\n }\n }\n if (input !== false) for (const group of DEFAULT_SYNONYM_GROUPS) connect(group);\n if (isObject(input)) {\n for (const [word, values] of ownEnumerableEntries(input)) {\n const normalizedWord = tokenize(word)[0];\n if (!normalizedWord) continue;\n if (typeof values !== 'string' && !Array.isArray(values)) {\n fail('ERR_TOOL_ROUTER_OPTION', `synonyms.${word} must be a string or array of strings`);\n }\n const normalizedValues = [];\n for (const value of stringList(typeof values === 'string' ? [values] : values)) {\n normalizedValues.push(...tokenize(value));\n }\n connect([normalizedWord, ...normalizedValues]);\n }\n }\n const result = Object.create(null);\n for (const [word, related] of synonyms) result[word] = Object.freeze(Array.from(related));\n return Object.freeze(result);\n}\n\nfunction resolveOptions(options = {}) {\n if (options === null || typeof options !== 'object') {\n fail('ERR_TOOL_ROUTER_OPTION', 'Router options must be an object');\n }\n const tokenizer = options.tokenizer === undefined ? tokenize : options.tokenizer;\n if (typeof tokenizer !== 'function') fail('ERR_TOOL_ROUTER_OPTION', 'tokenizer must be a function');\n const onDuplicate = options.onDuplicate === undefined ? 'error' : options.onDuplicate;\n if (onDuplicate !== 'error' && onDuplicate !== 'replace') {\n fail('ERR_TOOL_ROUTER_OPTION', 'onDuplicate must be error or replace');\n }\n\n return Object.freeze({\n b: finiteNumber(options.b, 0.75, 0, 1, 'b'),\n fieldWeights: resolveWeights(options.fieldWeights),\n format: options.format,\n fuzzy: options.fuzzy === undefined ? true : Boolean(options.fuzzy),\n k1: finiteNumber(options.k1, 1.2, 0.1, 5, 'k1'),\n maxExpansions: positiveInteger(options.maxExpansions, 12, 100, 'maxExpansions'),\n maxQueryLength: positiveInteger(options.maxQueryLength, 4096, 65_536, 'maxQueryLength'),\n maxSchemaDepth: positiveInteger(options.maxSchemaDepth, 24, 256, 'maxSchemaDepth'),\n maxSchemaNodes: positiveInteger(options.maxSchemaNodes, 10_000, 1_000_000, 'maxSchemaNodes'),\n maxTextLength: positiveInteger(options.maxTextLength, 65_536, 1_000_000, 'maxTextLength'),\n maxTools: positiveInteger(options.maxTools, 100_000, 1_000_000, 'maxTools'),\n minFuzzyLength: positiveInteger(options.minFuzzyLength, 4, 32, 'minFuzzyLength'),\n onDuplicate,\n synonyms: resolveSynonyms(options.synonyms),\n tokenizer\n });\n}\n\nfunction countTokens(tokens) {\n const counts = new Map();\n for (const token of tokens) counts.set(token, (counts.get(token) || 0) + 1);\n return counts;\n}\n\nfunction nameSearchText(name) {\n return `${name} ${normalizeIdentifier(name)}`;\n}\n\nfunction nameAcronyms(name) {\n const words = tokenize(name).filter((word) => word.length > 0);\n const acronyms = new Set();\n if (words.length > 1) {\n acronyms.add(words.map((word) => Array.from(word)[0]).join(''));\n for (let start = 0; start < words.length - 1; start++) {\n for (let end = start + 2; end <= Math.min(words.length, start + 6); end++) {\n acronyms.add(words.slice(start, end).map((word) => Array.from(word)[0]).join(''));\n }\n }\n }\n return acronyms;\n}\n\nfunction queryAcronyms(query) {\n const acronyms = [];\n const matches = query.match(/\\b[A-Z][A-Z0-9]{1,7}\\b/g) || [];\n for (const match of matches) acronyms.push(`acr:${match.toLocaleLowerCase('en-US')}`);\n return acronyms;\n}\n\nfunction toSet(value) {\n if (value === undefined) return undefined;\n const list = typeof value === 'string' ? [value] : value;\n if (!Array.isArray(list)) fail('ERR_TOOL_ROUTER_OPTION', 'Search filters must be strings or arrays of strings');\n return new Set(stringList(list, 10_000));\n}\n\nfunction compileFilters(options) {\n const ids = toSet(options.ids);\n const namespaces = toSet(options.namespaces);\n const formats = toSet(options.formats);\n const tags = toSet(options.tags);\n const filter = options.filter;\n if (filter !== undefined && typeof filter !== 'function') {\n fail('ERR_TOOL_ROUTER_OPTION', 'filter must be a function');\n }\n return (record) => {\n if (ids && !ids.has(record.id)) return false;\n if (namespaces && !namespaces.has(record.namespace)) return false;\n if (formats && !formats.has(record.format)) return false;\n if (tags) {\n for (const tag of tags) if (!record.tags.includes(tag)) return false;\n }\n return filter === undefined || Boolean(filter(record));\n };\n}\n\nfunction publicMatch(document, score, matchedTerms, matchedFields, queryCoverage, pinned = false) {\n return Object.freeze({\n estimatedTokens: document.estimatedTokens,\n id: document.record.id,\n matchedFields: Object.freeze(Array.from(matchedFields).sort()),\n matchedTerms: Object.freeze(Array.from(matchedTerms).sort()),\n name: document.record.name,\n pinned,\n queryCoverage,\n record: document.record,\n score: score === null ? null : Number(score.toFixed(6)),\n tool: document.record.original\n });\n}\n\nexport class ToolRouter {\n constructor(tools = [], options = {}) {\n this._options = resolveOptions(options);\n this._documents = new Map();\n this._postings = new Map();\n this._prefixes = new Map();\n this._trigrams = new Map();\n this._fieldTotals = Object.create(null);\n for (const field of FIELD_NAMES) this._fieldTotals[field] = 0;\n this._estimatedTokens = 0;\n if (Array.isArray(tools) && tools.length === 0) return;\n this.add(tools);\n }\n\n get size() {\n return this._documents.size;\n }\n\n get options() {\n return this._options;\n }\n\n add(tools, options = {}) {\n const catalog = isObject(tools)\n && (Array.isArray(ownValue(tools, 'tools')) || Array.isArray(ownValue(tools, 'functionDeclarations')))\n ? tools\n : (Array.isArray(tools) ? tools : [tools]);\n const records = normalizeTools(catalog, {\n format: options.format === undefined ? this._options.format : options.format,\n maxTools: this._options.maxTools\n });\n const prepared = records.map((record) => this._prepare(record));\n const incoming = new Set();\n for (const document of prepared) {\n if (incoming.has(document.record.id)) {\n fail('ERR_TOOL_DUPLICATE', `Duplicate tool id in batch: ${document.record.id}`);\n }\n incoming.add(document.record.id);\n if (this._documents.has(document.record.id) && this._options.onDuplicate === 'error') {\n fail('ERR_TOOL_DUPLICATE', `Tool id already exists: ${document.record.id}`);\n }\n }\n let resultingSize = this._documents.size;\n for (const id of incoming) if (!this._documents.has(id)) resultingSize += 1;\n if (resultingSize > this._options.maxTools) {\n fail('ERR_TOOL_CATALOG_SIZE', `Tool catalog exceeds maxTools (${this._options.maxTools})`);\n }\n\n for (const document of prepared) {\n if (this._documents.has(document.record.id)) this._removeDocument(document.record.id);\n this._addDocument(document);\n }\n return this;\n }\n\n remove(ids) {\n const list = Array.isArray(ids) ? ids : [ids];\n let removed = 0;\n for (const id of list) {\n if (typeof id !== 'string') fail('ERR_TOOL_NAME', 'Tool id must be a string');\n const resolved = this._resolveDocument(id);\n if (resolved && this._removeDocument(resolved.record.id)) removed += 1;\n }\n return removed;\n }\n\n replace(tools, options = {}) {\n const fresh = new ToolRouter([], this._options);\n fresh.add(tools, options);\n this._documents = fresh._documents;\n this._postings = fresh._postings;\n this._prefixes = fresh._prefixes;\n this._trigrams = fresh._trigrams;\n this._fieldTotals = fresh._fieldTotals;\n this._estimatedTokens = fresh._estimatedTokens;\n return this;\n }\n\n clear() {\n this._documents.clear();\n this._postings.clear();\n this._prefixes.clear();\n this._trigrams.clear();\n for (const field of FIELD_NAMES) this._fieldTotals[field] = 0;\n this._estimatedTokens = 0;\n return this;\n }\n\n has(idOrName) {\n return Boolean(this._resolveDocument(idOrName));\n }\n\n get(idOrName) {\n const document = this._resolveDocument(idOrName);\n return document ? document.record : undefined;\n }\n\n list() {\n return Array.from(this._documents.values(), (document) => document.record);\n }\n\n stats() {\n return Object.freeze({\n estimatedTokens: this._estimatedTokens,\n fields: Object.freeze({ ...this._fieldTotals }),\n terms: this._postings.size,\n tools: this.size\n });\n }\n\n search(query, options = {}) {\n if (typeof query !== 'string') fail('ERR_TOOL_QUERY', 'Search query must be a string');\n if (query.length > this._options.maxQueryLength) {\n fail('ERR_TOOL_QUERY_SIZE', `Search query exceeds maxQueryLength (${this._options.maxQueryLength})`);\n }\n const limit = positiveInteger(options.limit, 5, 1000, 'limit');\n const minScore = finiteNumber(options.minScore, 0.01, 0, Number.MAX_SAFE_INTEGER, 'minScore');\n const queryTokens = this._tokenize(query).concat(queryAcronyms(query));\n if (queryTokens.length === 0 || this.size === 0) return [];\n const queryCounts = countTokens(queryTokens);\n const candidates = new Map();\n const matches = compileFilters(options);\n const filterCache = new Map();\n\n for (const [queryToken, queryFrequency] of queryCounts) {\n const expansions = this._expand(queryToken);\n const tokenCandidates = new Map();\n for (const [term, expansionWeight] of expansions) {\n const posting = this._postings.get(term);\n if (!posting) continue;\n const documentFrequency = posting.size;\n const inverseFrequency = Math.log(1 + (this.size - documentFrequency + 0.5) / (documentFrequency + 0.5));\n for (const [id, frequencies] of posting) {\n const document = this._documents.get(id);\n if (!document) continue;\n let allowed = filterCache.get(id);\n if (allowed === undefined) {\n allowed = matches(document.record);\n filterCache.set(id, allowed);\n }\n if (!allowed) continue;\n let weightedFrequency = 0;\n const fields = [];\n for (const field of FIELD_NAMES) {\n const frequency = frequencies[field] || 0;\n if (frequency === 0 || this._options.fieldWeights[field] === 0) continue;\n const averageLength = this._fieldTotals[field] / Math.max(1, this.size);\n const normalization = 1 - this._options.b\n + this._options.b * (document.fieldLengths[field] / averageLength);\n weightedFrequency += this._options.fieldWeights[field] * frequency / normalization;\n fields.push(field);\n }\n if (weightedFrequency === 0) continue;\n const saturation = weightedFrequency * (this._options.k1 + 1)\n / (weightedFrequency + this._options.k1);\n const contribution = inverseFrequency * saturation * expansionWeight\n * (1 + Math.log(queryFrequency));\n let tokenState = tokenCandidates.get(id);\n if (!tokenState) {\n tokenState = { contribution: 0, fields: new Set(), terms: new Set() };\n tokenCandidates.set(id, tokenState);\n }\n if (contribution > tokenState.contribution) {\n tokenState.contribution = contribution;\n tokenState.fields = new Set(fields);\n } else if (contribution === tokenState.contribution) {\n for (const field of fields) tokenState.fields.add(field);\n }\n tokenState.terms.add(term);\n }\n }\n for (const [id, tokenState] of tokenCandidates) {\n let state = candidates.get(id);\n if (!state) {\n state = {\n fields: new Set(),\n queryTerms: new Set(),\n score: 0,\n terms: new Set()\n };\n candidates.set(id, state);\n }\n state.score += tokenState.contribution;\n state.queryTerms.add(queryToken);\n for (const term of tokenState.terms) state.terms.add(term);\n for (const field of tokenState.fields) state.fields.add(field);\n }\n }\n\n const normalizedQuery = normalizeIdentifier(query);\n const ranked = [];\n for (const [id, state] of candidates) {\n const document = this._documents.get(id);\n let score = state.score;\n if (normalizedQuery && document.identifiers.has(normalizedQuery)) score += 12;\n else if (normalizedQuery && document.identifiersText.includes(normalizedQuery)) score += 2;\n for (const queryToken of queryCounts.keys()) {\n if (document.nameTokens.has(queryToken)) score += 1.5;\n if (document.namespaceTokens.has(queryToken)) score += 2;\n }\n const coverage = state.queryTerms.size / queryCounts.size;\n score = score * (0.65 + 0.35 * coverage) + coverage;\n if (score < minScore) continue;\n ranked.push({ document, score, state, coverage });\n }\n\n ranked.sort((left, right) => right.score - left.score\n || left.document.record.name.localeCompare(right.document.record.name)\n || left.document.record.id.localeCompare(right.document.record.id));\n\n const results = [];\n let tokens = 0;\n const tokenBudget = options.maxEstimatedTokens === undefined\n ? Infinity\n : finiteNumber(options.maxEstimatedTokens, Infinity, 1, Number.MAX_SAFE_INTEGER, 'maxEstimatedTokens');\n for (const item of ranked) {\n if (results.length >= limit) break;\n if (tokens + item.document.estimatedTokens > tokenBudget) continue;\n results.push(publicMatch(\n item.document,\n item.score,\n item.state.terms,\n item.state.fields,\n Number(item.coverage.toFixed(6))\n ));\n tokens += item.document.estimatedTokens;\n }\n return results;\n }\n\n select(query, options = {}) {\n return this.search(query, options).map((match) => match.tool);\n }\n\n route(query, options = {}) {\n const maxTools = positiveInteger(options.maxTools, 5, 1000, 'maxTools');\n const tokenBudget = options.maxEstimatedTokens === undefined\n ? Infinity\n : finiteNumber(options.maxEstimatedTokens, Infinity, 1, Number.MAX_SAFE_INTEGER, 'maxEstimatedTokens');\n const selected = [];\n const selectedIds = new Set();\n let estimatedTokens = 0;\n let budgetExceeded = false;\n\n const pinned = options.pinned === undefined\n ? []\n : (typeof options.pinned === 'string' ? [options.pinned] : options.pinned);\n if (!Array.isArray(pinned)) fail('ERR_TOOL_ROUTER_OPTION', 'pinned must be a string or array of strings');\n for (const id of pinned) {\n if (selected.length >= maxTools) break;\n const document = this._resolveDocument(id);\n if (!document || selectedIds.has(document.record.id)) continue;\n selected.push(publicMatch(document, null, new Set(), new Set(), 0, true));\n selectedIds.add(document.record.id);\n estimatedTokens += document.estimatedTokens;\n if (estimatedTokens > tokenBudget) budgetExceeded = true;\n }\n\n const candidates = this.search(query, {\n ...options,\n limit: Math.min(1000, Math.max(maxTools, maxTools * 4)),\n maxEstimatedTokens: undefined\n });\n for (const match of candidates) {\n if (selected.length >= maxTools) break;\n if (selectedIds.has(match.id)) continue;\n if (estimatedTokens + match.estimatedTokens > tokenBudget) continue;\n selected.push(match);\n selectedIds.add(match.id);\n estimatedTokens += match.estimatedTokens;\n }\n\n const fallback = options.fallback === undefined ? 'none' : options.fallback;\n if (!['none', 'first', 'all'].includes(fallback)) {\n fail('ERR_TOOL_ROUTER_OPTION', 'fallback must be none, first, or all');\n }\n if (selected.length === 0 && fallback !== 'none') {\n const matches = compileFilters(options);\n const documents = Array.from(this._documents.values())\n .filter((document) => matches(document.record))\n .sort((left, right) => left.record.id.localeCompare(right.record.id));\n const fallbackLimit = fallback === 'first' ? 1 : maxTools;\n for (const document of documents) {\n if (selected.length >= fallbackLimit) break;\n if (estimatedTokens + document.estimatedTokens > tokenBudget) continue;\n selected.push(publicMatch(document, null, new Set(), new Set(), 0));\n selectedIds.add(document.record.id);\n estimatedTokens += document.estimatedTokens;\n }\n }\n\n const reduction = this._estimatedTokens === 0\n ? 0\n : Math.max(0, 1 - estimatedTokens / this._estimatedTokens);\n return Object.freeze({\n budgetExceeded,\n catalogEstimatedTokens: this._estimatedTokens,\n catalogSize: this.size,\n estimatedTokens,\n matches: Object.freeze(selected),\n records: Object.freeze(selected.map((match) => match.record)),\n selectedCount: selected.length,\n tokenReduction: Number(reduction.toFixed(6)),\n tools: Object.freeze(selected.map((match) => match.tool))\n });\n }\n\n _prepare(record) {\n const schemaText = collectSchemaText(record.inputSchema, this._options);\n const fields = {\n aliases: record.aliases.join(' '),\n description: record.description,\n name: nameSearchText(record.name),\n namespace: record.namespace,\n schema: schemaText,\n tags: record.tags.join(' ')\n };\n const fieldTokens = Object.create(null);\n const fieldLengths = Object.create(null);\n const identifiers = new Set([normalizeIdentifier(record.name)]);\n for (const alias of record.aliases) identifiers.add(normalizeIdentifier(alias));\n if (record.namespace) identifiers.add(normalizeIdentifier(`${record.namespace} ${record.name}`));\n identifiers.delete('');\n\n let textLength = 0;\n for (const field of FIELD_NAMES) {\n textLength += fields[field].length;\n if (fields[field].length > this._options.maxTextLength || textLength > this._options.maxTextLength * 2) {\n fail('ERR_TOOL_TEXT_SIZE', `Tool ${record.id} exceeds maxTextLength (${this._options.maxTextLength})`);\n }\n const tokens = this._tokenize(fields[field]);\n fieldTokens[field] = countTokens(tokens);\n fieldLengths[field] = tokens.length;\n }\n for (const acronym of nameAcronyms(record.name)) {\n const term = `acr:${acronym}`;\n fieldTokens.name.set(term, (fieldTokens.name.get(term) || 0) + 1);\n fieldLengths.name += 1;\n }\n\n return {\n estimatedTokens: estimateJsonTokens(record.original),\n fieldLengths,\n fieldTokens,\n identifiers,\n identifiersText: Array.from(identifiers).join(' '),\n nameTokens: new Set(this._tokenize(record.name)),\n namespaceTokens: new Set(this._tokenize(record.namespace)),\n record\n };\n }\n\n _tokenize(text) {\n const result = this._options.tokenizer(text);\n if (!Array.isArray(result)) fail('ERR_TOOL_TOKENIZER', 'tokenizer must return an array of strings');\n const tokens = [];\n for (const token of result) {\n if (typeof token !== 'string') fail('ERR_TOOL_TOKENIZER', 'tokenizer results must be strings');\n if (token.length > 0 && token.length <= 256) tokens.push(token);\n }\n return tokens;\n }\n\n _addDocument(document) {\n this._documents.set(document.record.id, document);\n this._estimatedTokens += document.estimatedTokens;\n for (const field of FIELD_NAMES) {\n this._fieldTotals[field] += document.fieldLengths[field];\n for (const [term, frequency] of document.fieldTokens[field]) {\n let posting = this._postings.get(term);\n const isNewTerm = !posting;\n if (!posting) {\n posting = new Map();\n this._postings.set(term, posting);\n }\n let frequencies = posting.get(document.record.id);\n if (!frequencies) {\n frequencies = Object.create(null);\n posting.set(document.record.id, frequencies);\n }\n frequencies[field] = frequency;\n if (isNewTerm) this._addLexiconTerm(term);\n }\n }\n }\n\n _removeDocument(id) {\n const document = this._documents.get(id);\n if (!document) return false;\n this._documents.delete(id);\n this._estimatedTokens -= document.estimatedTokens;\n for (const field of FIELD_NAMES) {\n this._fieldTotals[field] -= document.fieldLengths[field];\n for (const term of document.fieldTokens[field].keys()) {\n const posting = this._postings.get(term);\n if (!posting) continue;\n posting.delete(id);\n if (posting.size === 0) {\n this._postings.delete(term);\n this._removeLexiconTerm(term);\n }\n }\n }\n return true;\n }\n\n _addLexiconTerm(term) {\n const maximum = Math.min(8, term.length);\n for (let length = 2; length <= maximum; length++) {\n const prefix = term.slice(0, length);\n let terms = this._prefixes.get(prefix);\n if (!terms) {\n terms = new Set();\n this._prefixes.set(prefix, terms);\n }\n terms.add(term);\n }\n for (const trigram of new Set(tokenTrigrams(term))) {\n let terms = this._trigrams.get(trigram);\n if (!terms) {\n terms = new Set();\n this._trigrams.set(trigram, terms);\n }\n terms.add(term);\n }\n }\n\n _removeLexiconTerm(term) {\n const maximum = Math.min(8, term.length);\n for (let length = 2; length <= maximum; length++) {\n const prefix = term.slice(0, length);\n const terms = this._prefixes.get(prefix);\n if (!terms) continue;\n terms.delete(term);\n if (terms.size === 0) this._prefixes.delete(prefix);\n }\n for (const trigram of new Set(tokenTrigrams(term))) {\n const terms = this._trigrams.get(trigram);\n if (!terms) continue;\n terms.delete(term);\n if (terms.size === 0) this._trigrams.delete(trigram);\n }\n }\n\n _expand(queryToken) {\n const expanded = new Map();\n this._addLiteralExpansions(expanded, queryToken, 1);\n const synonyms = this._options.synonyms[queryToken];\n if (synonyms) {\n for (const synonym of synonyms) this._addLiteralExpansions(expanded, synonym, 0.72);\n }\n if (expanded.size > 0 || !this._options.fuzzy || queryToken.length < this._options.minFuzzyLength) {\n return new Map(Array.from(expanded)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))\n .slice(0, this._options.maxExpansions));\n }\n\n const queryTrigrams = new Set(tokenTrigrams(queryToken));\n const overlap = new Map();\n for (const trigram of queryTrigrams) {\n const terms = this._trigrams.get(trigram);\n if (!terms) continue;\n for (const term of terms) overlap.set(term, (overlap.get(term) || 0) + 1);\n }\n const candidates = [];\n const maximumDistance = queryToken.length <= 5 ? 1 : 2;\n for (const [term, shared] of overlap) {\n const termTrigrams = new Set(tokenTrigrams(term));\n const similarity = shared / (queryTrigrams.size + termTrigrams.size - shared);\n if (similarity < 0.25) continue;\n const distance = boundedEditDistance(queryToken, term, maximumDistance);\n if (distance > maximumDistance) continue;\n const editSimilarity = 1 - distance / Math.max(queryToken.length, term.length);\n candidates.push({ term, weight: 0.55 + 0.25 * editSimilarity, similarity });\n }\n candidates.sort((left, right) => right.similarity - left.similarity\n || right.weight - left.weight\n || left.term.localeCompare(right.term));\n for (const candidate of candidates.slice(0, this._options.maxExpansions)) {\n expanded.set(candidate.term, candidate.weight);\n }\n return expanded;\n }\n\n _addLiteralExpansions(expanded, token, weight) {\n if (this._postings.has(token)) expanded.set(token, Math.max(weight, expanded.get(token) || 0));\n if (token.length < 3) return;\n const prefix = token.slice(0, Math.min(8, token.length));\n const prefixTerms = this._prefixes.get(prefix);\n if (!prefixTerms) return;\n const ordered = Array.from(prefixTerms)\n .filter((term) => term.startsWith(token) && term !== token)\n .sort((left, right) => Math.abs(left.length - token.length) - Math.abs(right.length - token.length)\n || left.localeCompare(right));\n for (const term of ordered.slice(0, this._options.maxExpansions)) {\n expanded.set(term, Math.max(weight * 0.78, expanded.get(term) || 0));\n }\n }\n\n _resolveDocument(idOrName) {\n if (typeof idOrName !== 'string') return undefined;\n const exact = this._documents.get(idOrName);\n if (exact) return exact;\n let match;\n for (const document of this._documents.values()) {\n if (document.record.name !== idOrName) continue;\n if (!match || document.record.id.localeCompare(match.record.id) < 0) match = document;\n }\n return match;\n }\n}\n\nexport function createToolRouter(tools = [], options = {}) {\n return new ToolRouter(tools, options);\n}\n\nexport function routeTools(tools, query, options = {}) {\n const routerOptions = options.router || {};\n const routeOptions = { ...options };\n delete routeOptions.router;\n return createToolRouter(tools, routerOptions).route(query, routeOptions);\n}\n\nexport function estimateToolTokens(tool) {\n return estimateJsonTokens(tool);\n}\n\nexport function defineTool(tool) {\n return normalizeTool(tool).original;\n}\n", "import { fail } from './errors.js';\n\nconst SEARCH_SCHEMA = Object.freeze({\n additionalProperties: false,\n properties: {\n limit: {\n description: 'Maximum number of matching tool summaries to return.',\n maximum: 25,\n minimum: 1,\n type: 'integer'\n },\n query: {\n description: 'Capability, action, service, or resource needed for the task.',\n minLength: 1,\n type: 'string'\n }\n },\n required: ['query'],\n type: 'object'\n});\n\nfunction definitionFor(target, name, description) {\n if (target === 'openai-responses') {\n return { type: 'function', name, description, parameters: SEARCH_SCHEMA };\n }\n if (target === 'openai-chat') {\n return { type: 'function', function: { name, description, parameters: SEARCH_SCHEMA } };\n }\n if (target === 'anthropic') return { name, description, input_schema: SEARCH_SCHEMA };\n if (target === 'gemini') return { name, description, parameters: SEARCH_SCHEMA };\n if (target === 'mcp') return { name, description, inputSchema: SEARCH_SCHEMA };\n if (target === 'canonical') return { name, description, inputSchema: SEARCH_SCHEMA };\n fail('ERR_TOOL_FORMAT', `Unsupported search tool target: ${String(target)}`);\n}\n\nexport function createToolSearch(router, options = {}) {\n if (!router || typeof router.search !== 'function') {\n fail('ERR_TOOL_ROUTER', 'createToolSearch requires a ToolRouter instance');\n }\n const target = options.target === undefined ? 'canonical' : options.target;\n const name = options.name === undefined ? 'search_tools' : options.name;\n const description = options.description === undefined\n ? 'Find the smallest set of available tools relevant to a capability or task.'\n : options.description;\n if (typeof name !== 'string' || name.length === 0) fail('ERR_TOOL_NAME', 'Search tool name must be a non-empty string');\n if (typeof description !== 'string') fail('ERR_TOOL_DEFINITION', 'Search tool description must be a string');\n const defaultLimit = options.limit === undefined ? 5 : options.limit;\n if (!Number.isInteger(defaultLimit) || defaultLimit < 1 || defaultLimit > 25) {\n fail('ERR_TOOL_ROUTER_OPTION', 'Search tool limit must be an integer between 1 and 25');\n }\n\n const definition = definitionFor(target, name, description);\n return Object.freeze({\n definition,\n execute(input) {\n if (!input || typeof input !== 'object' || typeof input.query !== 'string' || input.query.length === 0) {\n fail('ERR_TOOL_QUERY', 'Search tool input.query must be a non-empty string');\n }\n const limit = input.limit === undefined ? defaultLimit : input.limit;\n if (!Number.isInteger(limit) || limit < 1 || limit > 25) {\n fail('ERR_TOOL_QUERY', 'Search tool input.limit must be an integer between 1 and 25');\n }\n const matches = router.search(input.query, { limit });\n return Object.freeze({\n catalogSize: router.size,\n query: input.query,\n tools: Object.freeze(matches.map((match) => Object.freeze({\n description: match.record.description,\n id: match.id,\n name: match.name,\n namespace: match.record.namespace || undefined,\n score: match.score,\n tags: match.record.tags\n })))\n });\n }\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,247 @@
1
+ export type ToolFormat =
2
+ | 'canonical'
3
+ | 'mcp'
4
+ | 'openai-chat'
5
+ | 'openai-responses'
6
+ | 'anthropic'
7
+ | 'gemini';
8
+
9
+ export type ToolFormatInput = ToolFormat | 'auto';
10
+
11
+ export type JsonSchema = boolean | {
12
+ [key: string]: unknown;
13
+ };
14
+
15
+ export interface CanonicalTool {
16
+ id?: string;
17
+ name: string;
18
+ description?: string;
19
+ namespace?: string;
20
+ tags?: readonly string[];
21
+ aliases?: readonly string[];
22
+ inputSchema?: JsonSchema;
23
+ outputSchema?: JsonSchema;
24
+ schema?: JsonSchema;
25
+ [key: string]: unknown;
26
+ }
27
+
28
+ export interface NormalizedTool<T = unknown> {
29
+ readonly aliases: readonly string[];
30
+ readonly description: string;
31
+ readonly format: ToolFormat;
32
+ readonly id: string;
33
+ readonly inputSchema: unknown;
34
+ readonly name: string;
35
+ readonly namespace: string;
36
+ readonly original: T;
37
+ readonly outputSchema: unknown;
38
+ readonly tags: readonly string[];
39
+ }
40
+
41
+ export interface FieldWeights {
42
+ aliases?: number;
43
+ description?: number;
44
+ name?: number;
45
+ namespace?: number;
46
+ schema?: number;
47
+ tags?: number;
48
+ }
49
+
50
+ export interface ToolRouterOptions {
51
+ b?: number;
52
+ fieldWeights?: FieldWeights;
53
+ format?: ToolFormatInput;
54
+ fuzzy?: boolean;
55
+ k1?: number;
56
+ maxExpansions?: number;
57
+ maxQueryLength?: number;
58
+ maxSchemaDepth?: number;
59
+ maxSchemaNodes?: number;
60
+ maxTextLength?: number;
61
+ maxTools?: number;
62
+ minFuzzyLength?: number;
63
+ onDuplicate?: 'error' | 'replace';
64
+ synonyms?: false | {
65
+ [word: string]: string | readonly string[];
66
+ };
67
+ tokenizer?(input: string): string[];
68
+ }
69
+
70
+ export interface ResolvedToolRouterOptions {
71
+ readonly b: number;
72
+ readonly fieldWeights: Readonly<Required<FieldWeights>>;
73
+ readonly format?: ToolFormatInput;
74
+ readonly fuzzy: boolean;
75
+ readonly k1: number;
76
+ readonly maxExpansions: number;
77
+ readonly maxQueryLength: number;
78
+ readonly maxSchemaDepth: number;
79
+ readonly maxSchemaNodes: number;
80
+ readonly maxTextLength: number;
81
+ readonly maxTools: number;
82
+ readonly minFuzzyLength: number;
83
+ readonly onDuplicate: 'error' | 'replace';
84
+ readonly synonyms: Readonly<Record<string, readonly string[]>>;
85
+ readonly tokenizer: (input: string) => string[];
86
+ }
87
+
88
+ export interface ToolSearchOptions<T = unknown> {
89
+ filter?(record: NormalizedTool<T>): boolean;
90
+ formats?: string | readonly string[];
91
+ ids?: string | readonly string[];
92
+ limit?: number;
93
+ maxEstimatedTokens?: number;
94
+ minScore?: number;
95
+ namespaces?: string | readonly string[];
96
+ tags?: string | readonly string[];
97
+ }
98
+
99
+ export interface ToolRouteOptions<T = unknown> extends ToolSearchOptions<T> {
100
+ fallback?: 'none' | 'first' | 'all';
101
+ maxTools?: number;
102
+ pinned?: string | readonly string[];
103
+ }
104
+
105
+ export interface ToolMatch<T = unknown> {
106
+ readonly estimatedTokens: number;
107
+ readonly id: string;
108
+ readonly matchedFields: readonly string[];
109
+ readonly matchedTerms: readonly string[];
110
+ readonly name: string;
111
+ readonly pinned: boolean;
112
+ readonly queryCoverage: number;
113
+ readonly record: NormalizedTool<T>;
114
+ readonly score: number | null;
115
+ readonly tool: T;
116
+ }
117
+
118
+ export interface ToolRouteResult<T = unknown> {
119
+ readonly budgetExceeded: boolean;
120
+ readonly catalogEstimatedTokens: number;
121
+ readonly catalogSize: number;
122
+ readonly estimatedTokens: number;
123
+ readonly matches: readonly ToolMatch<T>[];
124
+ readonly records: readonly NormalizedTool<T>[];
125
+ readonly selectedCount: number;
126
+ readonly tokenReduction: number;
127
+ readonly tools: readonly T[];
128
+ }
129
+
130
+ export interface ToolRouterStats {
131
+ readonly estimatedTokens: number;
132
+ readonly fields: Readonly<Record<string, number>>;
133
+ readonly terms: number;
134
+ readonly tools: number;
135
+ }
136
+
137
+ export type ToolCatalog<T> =
138
+ | readonly T[]
139
+ | { tools: readonly T[] }
140
+ | { functionDeclarations: readonly T[] };
141
+
142
+ export class ToolRouterError extends Error {
143
+ constructor(code: string, message: string, details?: unknown);
144
+ readonly code: string;
145
+ readonly details?: unknown;
146
+ }
147
+
148
+ export class ToolRouter<T = unknown> {
149
+ constructor(tools?: ToolCatalog<T>, options?: ToolRouterOptions);
150
+ readonly size: number;
151
+ readonly options: ResolvedToolRouterOptions;
152
+ add(tools: T | ToolCatalog<T>, options?: { format?: ToolFormatInput }): this;
153
+ remove(ids: string | readonly string[]): number;
154
+ replace(tools: ToolCatalog<T>, options?: { format?: ToolFormatInput }): this;
155
+ clear(): this;
156
+ has(idOrName: string): boolean;
157
+ get(idOrName: string): NormalizedTool<T> | undefined;
158
+ list(): NormalizedTool<T>[];
159
+ stats(): ToolRouterStats;
160
+ search(query: string, options?: ToolSearchOptions<T>): ToolMatch<T>[];
161
+ select(query: string, options?: ToolSearchOptions<T>): T[];
162
+ route(query: string, options?: ToolRouteOptions<T>): ToolRouteResult<T>;
163
+ }
164
+
165
+ export type ToolSearchTarget = ToolFormat;
166
+
167
+ export interface ToolSearchInput {
168
+ query: string;
169
+ limit?: number;
170
+ }
171
+
172
+ export interface ToolSearchSummary {
173
+ readonly description: string;
174
+ readonly id: string;
175
+ readonly name: string;
176
+ readonly namespace?: string;
177
+ readonly score: number | null;
178
+ readonly tags: readonly string[];
179
+ }
180
+
181
+ export interface ToolSearchResult {
182
+ readonly catalogSize: number;
183
+ readonly query: string;
184
+ readonly tools: readonly ToolSearchSummary[];
185
+ }
186
+
187
+ export interface ToolSearchHelper {
188
+ readonly definition: unknown;
189
+ execute(input: ToolSearchInput): ToolSearchResult;
190
+ }
191
+
192
+ export const TOOL_FORMATS: readonly ToolFormat[];
193
+
194
+ export function createToolRouter<T = unknown>(
195
+ tools?: ToolCatalog<T>,
196
+ options?: ToolRouterOptions
197
+ ): ToolRouter<T>;
198
+
199
+ export function routeTools<T = unknown>(
200
+ tools: ToolCatalog<T>,
201
+ query: string,
202
+ options?: ToolRouteOptions<T> & { router?: ToolRouterOptions }
203
+ ): ToolRouteResult<T>;
204
+
205
+ export function createToolSearch<T = unknown>(
206
+ router: ToolRouter<T>,
207
+ options?: {
208
+ target?: ToolSearchTarget;
209
+ name?: string;
210
+ description?: string;
211
+ limit?: number;
212
+ }
213
+ ): ToolSearchHelper;
214
+
215
+ export function defineTool<T>(tool: T): T;
216
+ export function detectToolFormat(tool: unknown): ToolFormat;
217
+ export function normalizeTool<T = unknown>(
218
+ tool: T,
219
+ options?: { format?: ToolFormatInput }
220
+ ): NormalizedTool<T>;
221
+ export function normalizeTools<T = unknown>(
222
+ tools: ToolCatalog<T>,
223
+ options?: { format?: ToolFormatInput; maxTools?: number }
224
+ ): NormalizedTool<T>[];
225
+ export function estimateToolTokens(tool: unknown): number;
226
+ export function normalizeIdentifier(input: unknown): string;
227
+ export function normalizeText(input: unknown): string;
228
+ export function tokenize(input: unknown, options?: { maxTokenLength?: number }): string[];
229
+
230
+ declare const api: {
231
+ TOOL_FORMATS: typeof TOOL_FORMATS;
232
+ ToolRouter: typeof ToolRouter;
233
+ ToolRouterError: typeof ToolRouterError;
234
+ createToolRouter: typeof createToolRouter;
235
+ createToolSearch: typeof createToolSearch;
236
+ defineTool: typeof defineTool;
237
+ detectToolFormat: typeof detectToolFormat;
238
+ estimateToolTokens: typeof estimateToolTokens;
239
+ normalizeIdentifier: typeof normalizeIdentifier;
240
+ normalizeText: typeof normalizeText;
241
+ normalizeTool: typeof normalizeTool;
242
+ normalizeTools: typeof normalizeTools;
243
+ routeTools: typeof routeTools;
244
+ tokenize: typeof tokenize;
245
+ };
246
+
247
+ export default api;