@anvia/core 0.26.0 → 1.0.0-rc.2

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.
Files changed (162) hide show
  1. package/README.md +303 -94
  2. package/dist/agent/index.d.ts +36 -70
  3. package/dist/agent/index.js +25 -18
  4. package/dist/agent-yBG8e9Jj.d.ts +153 -0
  5. package/dist/chunk-4WI3VGZK.js +127 -0
  6. package/dist/chunk-4WI3VGZK.js.map +1 -0
  7. package/dist/chunk-77AIYARB.js +654 -0
  8. package/dist/chunk-77AIYARB.js.map +1 -0
  9. package/dist/chunk-AI5JMUW7.js +45 -0
  10. package/dist/chunk-AI5JMUW7.js.map +1 -0
  11. package/dist/chunk-BEYBU7VJ.js +53 -0
  12. package/dist/chunk-BEYBU7VJ.js.map +1 -0
  13. package/dist/chunk-CWM7B2OO.js +315 -0
  14. package/dist/chunk-CWM7B2OO.js.map +1 -0
  15. package/dist/chunk-D37WMSP6.js +131 -0
  16. package/dist/chunk-D37WMSP6.js.map +1 -0
  17. package/dist/chunk-DBSCKTUL.js +3793 -0
  18. package/dist/chunk-DBSCKTUL.js.map +1 -0
  19. package/dist/chunk-EINTGEGY.js +629 -0
  20. package/dist/chunk-EINTGEGY.js.map +1 -0
  21. package/dist/chunk-FMHLROPQ.js +351 -0
  22. package/dist/chunk-FMHLROPQ.js.map +1 -0
  23. package/dist/chunk-FN7HLLAZ.js +211 -0
  24. package/dist/chunk-FN7HLLAZ.js.map +1 -0
  25. package/dist/chunk-GKDERULJ.js +50 -0
  26. package/dist/chunk-GKDERULJ.js.map +1 -0
  27. package/dist/{chunk-CWUJUSOS.js → chunk-KIDGIJM7.js} +26 -5
  28. package/dist/chunk-KIDGIJM7.js.map +1 -0
  29. package/dist/chunk-KR3RCCHJ.js +500 -0
  30. package/dist/chunk-KR3RCCHJ.js.map +1 -0
  31. package/dist/chunk-MGNTXGTX.js +37 -0
  32. package/dist/chunk-MGNTXGTX.js.map +1 -0
  33. package/dist/{chunk-MRQLEK2B.js → chunk-OJH6HWHX.js} +63 -51
  34. package/dist/chunk-OJH6HWHX.js.map +1 -0
  35. package/dist/chunk-QOUPWOGW.js +29 -0
  36. package/dist/chunk-QOUPWOGW.js.map +1 -0
  37. package/dist/chunk-TIZYTPJO.js +208 -0
  38. package/dist/chunk-TIZYTPJO.js.map +1 -0
  39. package/dist/{chunk-NCPN4SJR.js → chunk-XKYYBABH.js} +13 -13
  40. package/dist/chunk-XKYYBABH.js.map +1 -0
  41. package/dist/client-B8DT1vUG.d.ts +83 -0
  42. package/dist/completion/index.d.ts +6 -36
  43. package/dist/completion/index.js +25 -29
  44. package/dist/dynamic-tools-KwEGRbHp.d.ts +45 -0
  45. package/dist/embeddings/index.d.ts +11 -9
  46. package/dist/embeddings/index.js +2 -4
  47. package/dist/evals/index.d.ts +47 -20
  48. package/dist/evals/index.js +104 -65
  49. package/dist/evals/index.js.map +1 -1
  50. package/dist/extractor/index.d.ts +27 -42
  51. package/dist/extractor/index.js +7 -22
  52. package/dist/guardrails/index.d.ts +3 -2
  53. package/dist/guardrails/index.js +1 -1
  54. package/dist/image-generation/index.d.ts +23 -23
  55. package/dist/image-generation/index.js +5 -39
  56. package/dist/image-generation/index.js.map +1 -1
  57. package/dist/index.d.ts +25 -20
  58. package/dist/index.js +60 -63
  59. package/dist/internal/agent.d.ts +163 -9
  60. package/dist/internal/agent.js +25 -18
  61. package/dist/loaders/index.d.ts +6 -10
  62. package/dist/loaders/index.js.map +1 -1
  63. package/dist/mcp/index.d.ts +19 -13
  64. package/dist/mcp/index.js +13 -348
  65. package/dist/mcp/index.js.map +1 -1
  66. package/dist/memory/index.d.ts +20 -6
  67. package/dist/memory/index.js +9 -10
  68. package/dist/message-schema-Cn7ezRfJ.d.ts +52 -0
  69. package/dist/middleware-C7PdmKF7.d.ts +56 -0
  70. package/dist/model-call-options-CZkSw_xN.d.ts +6 -0
  71. package/dist/model-listing/index.d.ts +3 -1
  72. package/dist/observability/index.d.ts +20 -3
  73. package/dist/observability/index.js +8 -5
  74. package/dist/observability/index.js.map +1 -1
  75. package/dist/pipeline/index.d.ts +114 -72
  76. package/dist/pipeline/index.js +478 -286
  77. package/dist/pipeline/index.js.map +1 -1
  78. package/dist/retry-CjvSlKGW.d.ts +16 -0
  79. package/dist/skills/index.d.ts +5 -4
  80. package/dist/skills/index.js +7 -8
  81. package/dist/speech-generation/index.d.ts +37 -0
  82. package/dist/speech-generation/index.js +8 -0
  83. package/dist/streaming/index.js +37 -3
  84. package/dist/streaming/index.js.map +1 -1
  85. package/dist/{think-tool-DfCMuO8e.d.ts → think-tool-6H2QNQzQ.d.ts} +5 -5
  86. package/dist/tool/index.d.ts +10 -6
  87. package/dist/tool/index.js +15 -21
  88. package/dist/tool--Mz4v1eL.d.ts +57 -0
  89. package/dist/transcription/index.d.ts +29 -22
  90. package/dist/transcription/index.js +5 -57
  91. package/dist/transcription/index.js.map +1 -1
  92. package/dist/type-utils-CtHVDRn_.d.ts +6 -0
  93. package/dist/types-3x3mOLHU.d.ts +379 -0
  94. package/dist/types-BVzM4RsC.d.ts +155 -0
  95. package/dist/types-CQ_ioXWK.d.ts +319 -0
  96. package/dist/types-Cr4uiYo5.d.ts +99 -0
  97. package/dist/{types-04LqWrmy.d.ts → types-DiJqJejp.d.ts} +1 -1
  98. package/dist/types-Dld1TpWj.d.ts +130 -0
  99. package/dist/vector-store/index.d.ts +33 -34
  100. package/dist/vector-store/index.js +6 -6
  101. package/package.json +6 -18
  102. package/dist/agent-x3YTyv5i.d.ts +0 -222
  103. package/dist/audio-generation/index.d.ts +0 -33
  104. package/dist/audio-generation/index.js +0 -42
  105. package/dist/audio-generation/index.js.map +0 -1
  106. package/dist/chunk-2ODTMRHP.js +0 -54
  107. package/dist/chunk-2ODTMRHP.js.map +0 -1
  108. package/dist/chunk-ADH7NNCS.js +0 -512
  109. package/dist/chunk-ADH7NNCS.js.map +0 -1
  110. package/dist/chunk-BALBBVI3.js +0 -2732
  111. package/dist/chunk-BALBBVI3.js.map +0 -1
  112. package/dist/chunk-CWUJUSOS.js.map +0 -1
  113. package/dist/chunk-DALYP4PX.js +0 -225
  114. package/dist/chunk-DALYP4PX.js.map +0 -1
  115. package/dist/chunk-HYUYZEAJ.js +0 -223
  116. package/dist/chunk-HYUYZEAJ.js.map +0 -1
  117. package/dist/chunk-I6XOQ4LK.js +0 -466
  118. package/dist/chunk-I6XOQ4LK.js.map +0 -1
  119. package/dist/chunk-JI5YZWNT.js +0 -220
  120. package/dist/chunk-JI5YZWNT.js.map +0 -1
  121. package/dist/chunk-MC3CCKEB.js +0 -221
  122. package/dist/chunk-MC3CCKEB.js.map +0 -1
  123. package/dist/chunk-MELYDKWQ.js +0 -337
  124. package/dist/chunk-MELYDKWQ.js.map +0 -1
  125. package/dist/chunk-MNWK2USR.js +0 -243
  126. package/dist/chunk-MNWK2USR.js.map +0 -1
  127. package/dist/chunk-MRQLEK2B.js.map +0 -1
  128. package/dist/chunk-NCPN4SJR.js.map +0 -1
  129. package/dist/chunk-OIMLU4SF.js +0 -20
  130. package/dist/chunk-OIMLU4SF.js.map +0 -1
  131. package/dist/chunk-Q25IWLBT.js +0 -138
  132. package/dist/chunk-Q25IWLBT.js.map +0 -1
  133. package/dist/chunk-UQX6EXWG.js +0 -33
  134. package/dist/chunk-UQX6EXWG.js.map +0 -1
  135. package/dist/chunk-WQKHFADH.js +0 -12
  136. package/dist/chunk-WQKHFADH.js.map +0 -1
  137. package/dist/chunk-XUUY2L2D.js +0 -42
  138. package/dist/chunk-XUUY2L2D.js.map +0 -1
  139. package/dist/chunk-XWUC7CIT.js +0 -1
  140. package/dist/chunk-XWUC7CIT.js.map +0 -1
  141. package/dist/chunk-YLMDBQO4.js +0 -141
  142. package/dist/chunk-YLMDBQO4.js.map +0 -1
  143. package/dist/errors-2moLDuuN.d.ts +0 -17
  144. package/dist/hooks/index.d.ts +0 -12
  145. package/dist/hooks/index.js +0 -17
  146. package/dist/index-BxSbmOMr.d.ts +0 -257
  147. package/dist/json-BVPssigK.d.ts +0 -39
  148. package/dist/middleware-Dp3d_pxi.d.ts +0 -90
  149. package/dist/request/index.d.ts +0 -28
  150. package/dist/request/index.js +0 -25
  151. package/dist/request/index.js.map +0 -1
  152. package/dist/tool-Cohdv5GC.d.ts +0 -65
  153. package/dist/types-BCTRUGex.d.ts +0 -47
  154. package/dist/types-BrLbKnEz.d.ts +0 -119
  155. package/dist/types-D9JpeAPF.d.ts +0 -114
  156. package/dist/types-G12i56s2.d.ts +0 -354
  157. package/dist/types-JJCxRnaZ.d.ts +0 -70
  158. package/dist/types-O-abTIin.d.ts +0 -79
  159. package/dist/ui/index.d.ts +0 -107
  160. package/dist/ui/index.js +0 -10
  161. package/dist/ui/index.js.map +0 -1
  162. /package/dist/{hooks → speech-generation}/index.js.map +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/client.ts","../src/mcp/abort.ts","../src/mcp/result.ts","../src/mcp/tool.ts","../src/mcp/url-safety.ts","../src/mcp/client-group.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport type { Transport } from \"@modelcontextprotocol/sdk/shared/transport.js\";\nimport type { JsonObject } from \"../completion/index\";\nimport { abortError, throwIfAborted } from \"../internal/abort\";\nimport { linkAbortSignal } from \"./abort\";\nimport { createMcpTool } from \"./tool\";\nimport type { McpClientOptions, McpConnectOptions, McpServer, McpServerInfo } from \"./types\";\nimport { createSafeMcpFetch, parseAndValidateMcpUrl } from \"./url-safety\";\n\nlet coreClientVersion: string | undefined;\n\ntype ClientResource = {\n readonly client: Client;\n closePromise?: Promise<void> | undefined;\n};\n\nexport class McpClient {\n readonly name: string;\n\n readonly #options: McpClientOptions;\n #closed = false;\n #connectAbortController?: AbortController | undefined;\n #connecting?: Promise<McpServer> | undefined;\n #resource?: ClientResource | undefined;\n #server?: McpServer | undefined;\n\n constructor(options: McpClientOptions) {\n if (options.name.trim() === \"\") {\n throw new TypeError(\"MCP client name must not be empty\");\n }\n this.name = options.name;\n this.#options = options;\n }\n\n connect(options: McpConnectOptions = {}): Promise<McpServer> {\n if (this.#closed) {\n return Promise.reject(new Error(`MCP client \"${this.name}\" is closed`));\n }\n if (this.#server !== undefined) {\n return Promise.resolve(this.#server);\n }\n if (this.#connecting !== undefined) {\n return this.#connecting;\n }\n\n if (options.abortSignal?.aborted === true) {\n return Promise.reject(abortError(options.abortSignal.reason));\n }\n\n const abortController = new AbortController();\n const unlinkAbortSignal = linkAbortSignal(options.abortSignal, abortController);\n this.#connectAbortController = abortController;\n const connecting = this.#initialize(abortController.signal);\n this.#connecting = connecting;\n const clearConnecting = () => {\n unlinkAbortSignal();\n if (this.#connecting === connecting) {\n this.#connecting = undefined;\n }\n if (this.#connectAbortController === abortController) {\n this.#connectAbortController = undefined;\n }\n };\n void connecting.then(clearConnecting, clearConnecting);\n return connecting;\n }\n\n async close(): Promise<void> {\n this.#closed = true;\n this.#connectAbortController?.abort(\n abortError(new Error(`MCP client \"${this.name}\" was closed during connection`)),\n );\n\n const resource = this.#resource;\n if (resource !== undefined) {\n await closeResource(resource);\n }\n }\n\n async #initialize(abortSignal: AbortSignal): Promise<McpServer> {\n const client = createSdkClient();\n const resource: ClientResource = { client };\n this.#resource = resource;\n\n try {\n throwIfAborted(abortSignal);\n const transport = await createTransport(this.#options, { abortSignal });\n throwIfAborted(abortSignal);\n await client.connect(transport, requestOptions(abortSignal));\n throwIfAborted(abortSignal);\n const definitions = await listAllTools(client, abortSignal);\n throwIfAborted(abortSignal);\n const tools = definitions.map((definition) =>\n createMcpTool({\n definition,\n client,\n serverName: this.name,\n prefix: this.#options.tools?.prefix,\n }),\n );\n assertUniqueToolNames(tools, this.name);\n\n if (this.#closed) {\n throw new Error(`MCP client \"${this.name}\" was closed during connection`);\n }\n\n const serverInfo = copyServerInfo(client.getServerVersion());\n const capabilities = copyJsonObject(client.getServerCapabilities());\n const instructions = client.getInstructions();\n const server = freezeServer({\n name: this.name,\n tools,\n ...(serverInfo === undefined ? {} : { serverInfo }),\n ...(capabilities === undefined ? {} : { capabilities }),\n ...(instructions === undefined ? {} : { instructions }),\n });\n this.#server = server;\n return server;\n } catch (error) {\n try {\n await closeResource(resource);\n } catch {\n // Preserve the actionable connection or discovery failure.\n }\n if (this.#resource === resource) {\n this.#resource = undefined;\n }\n this.#server = undefined;\n throw error;\n }\n }\n}\n\nasync function createTransport(\n options: McpClientOptions,\n connectOptions: McpConnectOptions,\n): Promise<Transport> {\n const transport = options.transport;\n if (transport.type === \"custom\") {\n return transport.create({ abortSignal: connectOptions.abortSignal });\n }\n if (transport.type === \"stdio\") {\n return new StdioClientTransport({\n command: transport.command,\n ...(transport.args === undefined ? {} : { args: transport.args }),\n ...(transport.env === undefined ? {} : { env: transport.env }),\n ...(transport.cwd === undefined ? {} : { cwd: transport.cwd }),\n ...(transport.stderr === undefined ? {} : { stderr: transport.stderr }),\n ...(transport.maxBufferSize === undefined ? {} : { maxBufferSize: transport.maxBufferSize }),\n });\n }\n\n return asSdkTransport(\n new StreamableHTTPClientTransport(parseAndValidateMcpUrl(transport.url), {\n ...(transport.requestInit === undefined ? {} : { requestInit: transport.requestInit }),\n ...(transport.authProvider === undefined ? {} : { authProvider: transport.authProvider }),\n ...(transport.reconnectionOptions === undefined\n ? {}\n : { reconnectionOptions: transport.reconnectionOptions }),\n ...(transport.sessionId === undefined ? {} : { sessionId: transport.sessionId }),\n fetch: createSafeMcpFetch(),\n }),\n );\n}\n\nasync function listAllTools(\n client: Client,\n abortSignal?: AbortSignal | undefined,\n): Promise<Awaited<ReturnType<Client[\"listTools\"]>>[\"tools\"]> {\n const tools: Awaited<ReturnType<Client[\"listTools\"]>>[\"tools\"] = [];\n const seenCursors = new Set<string>();\n let cursor: string | undefined;\n\n do {\n const page = await client.listTools(\n cursor === undefined ? undefined : { cursor },\n requestOptions(abortSignal),\n );\n tools.push(...page.tools);\n cursor = page.nextCursor;\n if (cursor !== undefined && seenCursors.has(cursor)) {\n throw new Error(`MCP server returned a repeated tools cursor: ${cursor}`);\n }\n if (cursor !== undefined) {\n seenCursors.add(cursor);\n }\n } while (cursor !== undefined);\n\n return tools;\n}\n\nfunction assertUniqueToolNames(tools: readonly { name: string }[], serverName: string): void {\n const names = new Set<string>();\n for (const tool of tools) {\n if (names.has(tool.name)) {\n throw new Error(`Duplicate MCP tool name \"${tool.name}\" from server \"${serverName}\"`);\n }\n names.add(tool.name);\n }\n}\n\nfunction createSdkClient(): Client {\n return new Client({\n name: \"@anvia/core\",\n version: getCoreClientVersion(),\n });\n}\n\nfunction getCoreClientVersion(): string {\n if (coreClientVersion === undefined) {\n coreClientVersion = readCorePackageVersion();\n }\n return coreClientVersion;\n}\n\nfunction requestOptions(signal?: AbortSignal | undefined): { signal?: AbortSignal } {\n return signal === undefined ? {} : { signal };\n}\n\nfunction asSdkTransport(transport: unknown): Transport {\n return transport as Transport;\n}\n\nfunction closeResource(resource: ClientResource): Promise<void> {\n resource.closePromise ??= resource.client.close();\n return resource.closePromise;\n}\n\nfunction readCorePackageVersion(): string {\n try {\n const packageJson = JSON.parse(\n readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf8\"),\n ) as { version?: unknown };\n return typeof packageJson.version === \"string\" ? packageJson.version : \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction copyServerInfo(value: ReturnType<Client[\"getServerVersion\"]>): McpServerInfo | undefined {\n if (value === undefined) {\n return undefined;\n }\n return deepFreeze(structuredClone(value)) as McpServerInfo;\n}\n\nfunction copyJsonObject(value: unknown): JsonObject | undefined {\n if (value === undefined) {\n return undefined;\n }\n return deepFreeze(structuredClone(value)) as JsonObject;\n}\n\nfunction freezeServer(server: McpServer): McpServer {\n Object.freeze(server.tools);\n return Object.freeze(server);\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return value;\n }\n for (const child of Object.values(value)) {\n deepFreeze(child);\n }\n return Object.freeze(value);\n}\n","export function linkAbortSignal(\n source: AbortSignal | undefined,\n target: AbortController,\n): () => void {\n if (source === undefined) {\n return () => undefined;\n }\n if (source.aborted) {\n target.abort(source.reason);\n return () => undefined;\n }\n\n const onAbort = () => target.abort(source.reason);\n source.addEventListener(\"abort\", onAbort, { once: true });\n return () => source.removeEventListener(\"abort\", onAbort);\n}\n","import type { ToolResultContentPart } from \"../completion/index\";\nimport { isRecord } from \"../internal/record\";\n\ntype McpResultContent =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string }\n | { type: \"audio\"; data: string; mimeType: string }\n | {\n type: \"resource\";\n resource:\n | { uri: string; text: string; mimeType?: string | undefined }\n | { uri: string; blob: string; mimeType?: string | undefined };\n }\n | {\n type: \"resource_link\";\n uri: string;\n name: string;\n mimeType?: string | undefined;\n };\n\nexport type McpToolCallResult =\n | {\n content: McpResultContent[];\n structuredContent?: Record<string, unknown> | undefined;\n isError?: boolean | undefined;\n }\n | {\n toolResult: unknown;\n };\n\nexport function createCallToolParams(\n name: string,\n args: unknown,\n): { name: string; arguments?: Record<string, unknown> } {\n if (args === null || args === undefined) {\n return { name };\n }\n\n if (!isRecord(args)) {\n throw new Error(\"MCP tool arguments must be a JSON object\");\n }\n\n return { name, arguments: args };\n}\n\nexport function mapMcpToolResult(result: McpToolCallResult): readonly ToolResultContentPart[] {\n if (\"toolResult\" in result) {\n return [{ type: \"text\", text: serializeMcpValue(result.toolResult) }];\n }\n\n if (result.isError === true) {\n throw new Error(mcpErrorMessage(result.content));\n }\n\n const content = result.content.map(mapMcpContent);\n if (content.length === 0 && result.structuredContent !== undefined) {\n content.push({ type: \"text\", text: serializeMcpValue(result.structuredContent) });\n }\n return content;\n}\n\nfunction mcpErrorMessage(content: McpResultContent[]): string {\n const text = content\n .map((item) => (item.type === \"text\" ? item.text : undefined))\n .filter((item): item is string => item !== undefined)\n .join(\"\\n\");\n\n return text === \"\" ? \"MCP tool returned an error\" : text;\n}\n\nfunction mapMcpContent(content: McpResultContent): ToolResultContentPart {\n if (content.type === \"text\") {\n return { type: \"text\", text: content.text };\n }\n\n if (content.type === \"image\") {\n return {\n type: \"file\",\n data: { type: \"data\", data: content.data },\n mediaType: content.mimeType,\n };\n }\n\n if (content.type === \"resource\") {\n return { type: \"text\", text: serializeResource(content.resource) };\n }\n\n if (content.type === \"audio\") {\n throw new Error(`Unsupported MCP tool result content type: audio (${content.mimeType})`);\n }\n\n throw new Error(`Unsupported MCP tool result content type: resource_link (${content.uri})`);\n}\n\nfunction serializeResource(\n resource:\n | { uri: string; text: string; mimeType?: string | undefined }\n | { uri: string; blob: string; mimeType?: string | undefined },\n): string {\n const mediaType =\n resource.mimeType ?? (\"text\" in resource ? \"text/plain\" : \"application/octet-stream\");\n const encoding = \"text\" in resource ? \"text\" : \"base64\";\n const data = \"text\" in resource ? resource.text : resource.blob;\n return `MCP resource (${resource.uri}; ${mediaType}; ${encoding})\\n${data}`;\n}\n\nfunction serializeMcpValue(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n let serialized: string | undefined;\n try {\n serialized = JSON.stringify(value);\n } catch (error) {\n throw new TypeError(\"MCP tool results must be JSON-serializable.\", { cause: error });\n }\n if (serialized === undefined) {\n throw new TypeError(\"MCP tool results must be JSON-serializable.\");\n }\n return serialized;\n}\n","import type { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport type { JsonObject, ToolDefinition } from \"../completion/index\";\nimport { ToolOutput } from \"../tool\";\nimport { createCallToolParams, mapMcpToolResult } from \"./result\";\nimport type { McpTool } from \"./types\";\n\ntype SdkMcpToolDefinition = Awaited<ReturnType<Client[\"listTools\"]>>[\"tools\"][number];\n\nexport function createMcpTool(options: {\n definition: SdkMcpToolDefinition;\n client: Client;\n serverName: string;\n prefix?: string | undefined;\n}): McpTool {\n const { definition, client, serverName, prefix = \"\" } = options;\n const exposedName = `${prefix}${definition.name}`;\n const provenance = Object.freeze({\n serverName,\n remoteName: definition.name,\n });\n const toolDefinition = Object.freeze<ToolDefinition>({\n name: exposedName,\n description: definition.description ?? \"\",\n parameters: deepFreeze(structuredClone(definition.inputSchema)) as unknown as JsonObject,\n });\n const tool: McpTool = {\n name: exposedName,\n mcp: provenance,\n definition(): ToolDefinition {\n return toolDefinition;\n },\n async call(args, context) {\n const result = await client.callTool(\n createCallToolParams(definition.name, args),\n undefined,\n context?.abortSignal === undefined ? {} : { signal: context.abortSignal },\n );\n return ToolOutput.content(mapMcpToolResult(result));\n },\n };\n return Object.freeze(tool);\n}\n\nexport function isMcpTool(tool: unknown): tool is McpTool {\n if (typeof tool !== \"object\" || tool === null || !(\"mcp\" in tool)) {\n return false;\n }\n const mcp = tool.mcp;\n return (\n typeof mcp === \"object\" &&\n mcp !== null &&\n \"serverName\" in mcp &&\n typeof mcp.serverName === \"string\" &&\n mcp.serverName.length > 0 &&\n \"remoteName\" in mcp &&\n typeof mcp.remoteName === \"string\" &&\n mcp.remoteName.length > 0\n );\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return value;\n }\n for (const child of Object.values(value)) {\n deepFreeze(child);\n }\n return Object.freeze(value);\n}\n","import type { LookupAddress } from \"node:dns\";\nimport { lookup } from \"node:dns/promises\";\nimport type { LookupFunction } from \"node:net\";\nimport { BlockList, isIP } from \"node:net\";\nimport type { StreamableHTTPClientTransportOptions } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { Agent, Pool, fetch as undiciFetch } from \"undici\";\n\ntype FetchLike = NonNullable<StreamableHTTPClientTransportOptions[\"fetch\"]>;\n\nexport type McpAddressResolver = (hostname: string) => Promise<LookupAddress[]>;\n\nconst blockedIpv4Addresses = new BlockList();\nconst blockedIpv6Addresses = new BlockList();\n\nfor (const [network, prefix] of [\n [\"0.0.0.0\", 8],\n [\"10.0.0.0\", 8],\n [\"100.64.0.0\", 10],\n [\"127.0.0.0\", 8],\n [\"169.254.0.0\", 16],\n [\"172.16.0.0\", 12],\n [\"192.0.0.0\", 24],\n [\"192.0.2.0\", 24],\n [\"192.88.99.0\", 24],\n [\"192.168.0.0\", 16],\n [\"198.18.0.0\", 15],\n [\"198.51.100.0\", 24],\n [\"203.0.113.0\", 24],\n [\"224.0.0.0\", 4],\n [\"240.0.0.0\", 4],\n] as const) {\n blockedIpv4Addresses.addSubnet(network, prefix, \"ipv4\");\n}\n\nfor (const [network, prefix] of [\n [\"::\", 96],\n [\"::ffff:0:0\", 96],\n [\"64:ff9b::\", 96],\n [\"64:ff9b:1::\", 48],\n [\"100::\", 64],\n [\"2001::\", 32],\n [\"2001:2::\", 48],\n [\"2001:10::\", 28],\n [\"2001:20::\", 28],\n [\"2001:db8::\", 32],\n [\"2002::\", 16],\n [\"fc00::\", 7],\n [\"fe80::\", 10],\n [\"fec0::\", 10],\n [\"ff00::\", 8],\n] as const) {\n blockedIpv6Addresses.addSubnet(network, prefix, \"ipv6\");\n}\n\nconst defaultAddressResolver: McpAddressResolver = (hostname) =>\n lookup(hostname, { all: true, verbatim: true });\n\nexport function parseAndValidateMcpUrl(url: string | URL): URL {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(`Invalid MCP URL: ${url}`);\n }\n\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(`MCP URL blocked: only HTTP(S) URLs are allowed (${parsed.protocol})`);\n }\n\n validateMcpHostname(parsed.hostname);\n return parsed;\n}\n\nexport async function resolveAndValidateMcpHostname(\n hostname: string,\n resolveAddresses: McpAddressResolver = defaultAddressResolver,\n): Promise<LookupAddress[]> {\n const normalizedHostname = normalizeHostname(hostname);\n validateMcpHostname(normalizedHostname);\n\n const family = isIP(normalizedHostname);\n if (family !== 0) {\n return [{ address: normalizedHostname, family }];\n }\n\n let addresses: LookupAddress[];\n try {\n addresses = await resolveAddresses(normalizedHostname);\n } catch (cause) {\n throw new Error(`Unable to resolve MCP URL hostname (${normalizedHostname})`, { cause });\n }\n\n if (addresses.length === 0) {\n throw new Error(`Unable to resolve MCP URL hostname (${normalizedHostname})`);\n }\n\n for (const { address } of addresses) {\n validateMcpHostname(address);\n }\n\n return addresses;\n}\n\nexport function createSafeMcpLookup(\n resolveAddresses: McpAddressResolver = defaultAddressResolver,\n): LookupFunction {\n return (hostname, options, callback) => {\n void resolveAndValidateMcpHostname(hostname, resolveAddresses).then(\n (addresses) => {\n const requestedFamily = normalizeRequestedFamily(options.family);\n const matchingAddresses =\n requestedFamily === 0\n ? addresses\n : addresses.filter(({ family }) => family === requestedFamily);\n\n if (matchingAddresses.length === 0) {\n const error = new Error(`No matching address family for MCP URL (${hostname})`);\n Object.assign(error, { code: \"EAI_ADDRFAMILY\" });\n callback(error, []);\n return;\n }\n\n if (options.all) {\n callback(null, matchingAddresses);\n return;\n }\n\n const address = matchingAddresses[0];\n if (!address) {\n callback(new Error(`Unable to resolve MCP URL hostname (${hostname})`), []);\n return;\n }\n callback(null, address.address, address.family);\n },\n (cause: unknown) => {\n callback(asError(cause), []);\n },\n );\n };\n}\n\nexport function createSafeMcpFetch(): FetchLike {\n return (url, init) => {\n parseAndValidateMcpUrl(url);\n return undiciFetch(url as Parameters<typeof undiciFetch>[0], {\n ...(init as Parameters<typeof undiciFetch>[1]),\n dispatcher: safeMcpDispatcher,\n }) as unknown as ReturnType<FetchLike>;\n };\n}\n\nfunction validateMcpHostname(hostname: string): void {\n const normalizedHostname = normalizeHostname(hostname);\n\n if (normalizedHostname === \"localhost\" || normalizedHostname.endsWith(\".localhost\")) {\n throw new Error(`MCP URL blocked: localhost not allowed (${normalizedHostname})`);\n }\n\n const family = isIP(normalizedHostname);\n if (family === 0) {\n return;\n }\n\n if (\n (family === 4 && normalizedHostname.startsWith(\"127.\")) ||\n (family === 6 && normalizedHostname === \"::1\")\n ) {\n throw new Error(`MCP URL blocked: localhost not allowed (${normalizedHostname})`);\n }\n\n if (normalizedHostname === \"169.254.169.254\" || normalizedHostname === \"fd00:ec2::254\") {\n throw new Error(`MCP URL blocked: cloud metadata endpoint not allowed (${normalizedHostname})`);\n }\n\n if (\n (family === 4 && blockedIpv4Addresses.check(normalizedHostname, \"ipv4\")) ||\n (family === 6 && blockedIpv6Addresses.check(normalizedHostname, \"ipv6\"))\n ) {\n const range = family === 4 ? \"IP\" : \"IPv6\";\n throw new Error(`MCP URL blocked: private ${range} range not allowed (${normalizedHostname})`);\n }\n}\n\nfunction normalizeHostname(hostname: string): string {\n const withoutBrackets =\n hostname.startsWith(\"[\") && hostname.endsWith(\"]\") ? hostname.slice(1, -1) : hostname;\n return withoutBrackets.toLowerCase().replace(/\\.+$/, \"\");\n}\n\nfunction normalizeRequestedFamily(family: number | string | undefined): 0 | 4 | 6 {\n if (family === 4 || family === \"IPv4\") {\n return 4;\n }\n if (family === 6 || family === \"IPv6\") {\n return 6;\n }\n return 0;\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nconst safeMcpDispatcher = new Agent({\n autoSelectFamily: true,\n connect: {\n lookup: createSafeMcpLookup(),\n },\n factory(origin, options) {\n parseAndValidateMcpUrl(origin);\n return new Pool(origin, options as Pool.Options);\n },\n});\n","import { linkAbortSignal } from \"./abort\";\nimport type { McpClient } from \"./client\";\nimport type { McpClientGroupConnectOptions, McpServer } from \"./types\";\n\nexport class McpClientGroup {\n readonly clients: readonly McpClient[];\n readonly servers: readonly McpServer[];\n\n #closePromise?: Promise<void> | undefined;\n\n private constructor(clients: readonly McpClient[], servers: readonly McpServer[]) {\n this.clients = Object.freeze([...clients]);\n this.servers = Object.freeze([...servers]);\n }\n\n static async connect(options: McpClientGroupConnectOptions): Promise<McpClientGroup> {\n const clients = [...options.clients];\n assertUniqueClientNames(clients);\n\n const abortController = new AbortController();\n const unlinkAbortSignal = linkAbortSignal(options.abortSignal, abortController);\n let firstConnectionFailure: unknown;\n let connectionFailed = false;\n const connections = clients.map((client) =>\n client.connect({ abortSignal: abortController.signal }).catch((error: unknown) => {\n if (!connectionFailed) {\n connectionFailed = true;\n firstConnectionFailure = error;\n abortController.abort(error);\n }\n throw error;\n }),\n );\n const settled = await Promise.allSettled(connections).finally(unlinkAbortSignal);\n const firstFailure = settled.find(\n (result): result is PromiseRejectedResult => result.status === \"rejected\",\n );\n if (firstFailure !== undefined) {\n await rollbackSuccessfulClients(clients, settled);\n throw connectionFailed ? firstConnectionFailure : firstFailure.reason;\n }\n\n const servers = settled.map((result) => (result as PromiseFulfilledResult<McpServer>).value);\n try {\n assertUniqueServerAndToolNames(servers);\n } catch (error) {\n try {\n await closeAll(clients);\n } catch {\n // Preserve the registration validation failure that caused rollback.\n }\n throw error;\n }\n\n return new McpClientGroup(clients, servers);\n }\n\n close(): Promise<void> {\n this.#closePromise ??= closeAll(this.clients);\n return this.#closePromise;\n }\n}\n\nfunction assertUniqueClientNames(clients: readonly McpClient[]): void {\n const names = new Set<string>();\n for (const client of clients) {\n if (names.has(client.name)) {\n throw new Error(`Duplicate MCP client name \"${client.name}\"`);\n }\n names.add(client.name);\n }\n}\n\nfunction assertUniqueServerAndToolNames(servers: readonly McpServer[]): void {\n const serverNames = new Set<string>();\n const toolNames = new Map<string, string>();\n for (const server of servers) {\n if (serverNames.has(server.name)) {\n throw new Error(`Duplicate MCP server name \"${server.name}\"`);\n }\n serverNames.add(server.name);\n\n for (const tool of server.tools) {\n const existing = toolNames.get(tool.name);\n if (existing !== undefined) {\n throw new Error(\n `Duplicate MCP tool name \"${tool.name}\" from servers \"${existing}\" and \"${server.name}\"`,\n );\n }\n toolNames.set(tool.name, server.name);\n }\n }\n}\n\nasync function rollbackSuccessfulClients(\n clients: readonly McpClient[],\n settled: readonly PromiseSettledResult<McpServer>[],\n): Promise<void> {\n const successful = clients.filter((_, index) => settled[index]?.status === \"fulfilled\");\n try {\n await closeAll(successful);\n } catch {\n // Preserve the connection failure that caused rollback.\n }\n}\n\nasync function closeAll(clients: readonly McpClient[]): Promise<void> {\n const settled = await Promise.allSettled(clients.map((client) => client.close()));\n const errors = settled.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n if (errors.length > 0) {\n throw new AggregateError(errors, \"Failed to close one or more MCP clients\");\n }\n}\n"],"mappings":"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","names":["deepFreeze"]}
@@ -0,0 +1,351 @@
1
+ import {
2
+ resolveRetryOptions,
3
+ runWithRetries,
4
+ throwIfAborted
5
+ } from "./chunk-FN7HLLAZ.js";
6
+
7
+ // src/embeddings/distance.ts
8
+ function dotProduct(left, right) {
9
+ assertSameDimensions(left, right);
10
+ return left.reduce((sum, value, index) => sum + value * right[index], 0);
11
+ }
12
+ function cosineSimilarity(left, right) {
13
+ assertSameDimensions(left, right);
14
+ const leftMagnitude = magnitude(left);
15
+ const rightMagnitude = magnitude(right);
16
+ if (leftMagnitude === 0 || rightMagnitude === 0) {
17
+ return 0;
18
+ }
19
+ return dotProduct(left, right) / (leftMagnitude * rightMagnitude);
20
+ }
21
+ function angularDistance(left, right) {
22
+ const similarity = Math.max(-1, Math.min(1, cosineSimilarity(left, right)));
23
+ return Math.acos(similarity) / Math.PI;
24
+ }
25
+ function euclideanDistance(left, right) {
26
+ assertSameDimensions(left, right);
27
+ return Math.sqrt(
28
+ left.reduce((sum, value, index) => sum + (value - right[index]) ** 2, 0)
29
+ );
30
+ }
31
+ function manhattanDistance(left, right) {
32
+ assertSameDimensions(left, right);
33
+ return left.reduce((sum, value, index) => sum + Math.abs(value - right[index]), 0);
34
+ }
35
+ function chebyshevDistance(left, right) {
36
+ assertSameDimensions(left, right);
37
+ return left.reduce(
38
+ (max, value, index) => Math.max(max, Math.abs(value - right[index])),
39
+ 0
40
+ );
41
+ }
42
+ function magnitude(vector) {
43
+ return Math.sqrt(vector.reduce((sum, value) => sum + value ** 2, 0));
44
+ }
45
+ function assertSameDimensions(left, right) {
46
+ if (left.length !== right.length) {
47
+ throw new Error(`Vector dimension mismatch: ${left.length} !== ${right.length}`);
48
+ }
49
+ }
50
+
51
+ // src/internal/concurrency.ts
52
+ async function mapWithConcurrency(inputs, concurrency2, mapper) {
53
+ if (!Number.isSafeInteger(concurrency2) || concurrency2 <= 0) {
54
+ throw new RangeError("concurrency must be a positive safe integer.");
55
+ }
56
+ const limit = concurrency2;
57
+ const results = new Array(inputs.length);
58
+ let nextIndex = 0;
59
+ let firstFailure;
60
+ async function worker() {
61
+ while (firstFailure === void 0 && nextIndex < inputs.length) {
62
+ const index = nextIndex;
63
+ nextIndex += 1;
64
+ try {
65
+ results[index] = await mapper(inputs[index]);
66
+ } catch (error) {
67
+ firstFailure ??= { error };
68
+ }
69
+ }
70
+ }
71
+ await Promise.all(Array.from({ length: Math.min(limit, inputs.length) }, () => worker()));
72
+ if (firstFailure !== void 0) {
73
+ throw firstFailure.error;
74
+ }
75
+ return results;
76
+ }
77
+
78
+ // src/embeddings/embed.ts
79
+ async function embedText(options) {
80
+ const { embeddings } = await embedTexts({
81
+ model: options.model,
82
+ texts: [options.text],
83
+ retries: options.retries,
84
+ abortSignal: options.abortSignal
85
+ });
86
+ const embedding = embeddings[0];
87
+ if (embedding === void 0) throw new Error("Embedding model returned no embeddings");
88
+ return { embedding };
89
+ }
90
+ async function embedTexts(options) {
91
+ throwIfAborted(options.abortSignal);
92
+ if (options.texts.length === 0) return { embeddings: [] };
93
+ const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));
94
+ const results = await mapWithConcurrency(
95
+ batches,
96
+ concurrency(options.concurrency),
97
+ (batch) => embedDenseBatch(options.model, batch, options)
98
+ );
99
+ const embeddings = results.flat();
100
+ if (embeddings.length !== options.texts.length) {
101
+ throw new Error(
102
+ `Embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`
103
+ );
104
+ }
105
+ return { embeddings };
106
+ }
107
+ async function embedSparseTexts(options) {
108
+ throwIfAborted(options.abortSignal);
109
+ if (options.texts.length === 0) return { embeddings: [] };
110
+ const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));
111
+ const results = await mapWithConcurrency(
112
+ batches,
113
+ concurrency(options.concurrency),
114
+ (batch) => embedSparseBatch(options.model, batch, options)
115
+ );
116
+ const embeddings = results.flat();
117
+ if (embeddings.length !== options.texts.length) {
118
+ throw new Error(
119
+ `Sparse embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`
120
+ );
121
+ }
122
+ return { embeddings };
123
+ }
124
+ async function embedSparseQuery(options) {
125
+ throwIfAborted(options.abortSignal);
126
+ const embedding = await runWithRetries(
127
+ () => {
128
+ throwIfAborted(options.abortSignal);
129
+ return options.model.embedQuery(options.query, modelCallOptions(options.abortSignal));
130
+ },
131
+ resolveRetries(options),
132
+ { streaming: false, abortSignal: options.abortSignal }
133
+ );
134
+ throwIfAborted(options.abortSignal);
135
+ validateSparseEmbedding(embedding, "query");
136
+ return { embedding };
137
+ }
138
+ async function embedDocuments(options) {
139
+ throwIfAborted(options.abortSignal);
140
+ const prepared = prepareDocuments(options.documents, options);
141
+ const flatTexts = prepared.flatMap(
142
+ (item, documentIndex) => item.texts.map((text) => ({ documentIndex, text }))
143
+ );
144
+ const concurrencyLimit = concurrency(options.concurrency);
145
+ if ("model" in options && options.model !== void 0) {
146
+ const batches = chunk(flatTexts, batchSize(options.model.maxBatchSize, flatTexts.length || 1));
147
+ const results = await mapWithConcurrency(batches, concurrencyLimit, async (batch) => {
148
+ const embeddings = await embedDenseBatch(
149
+ options.model,
150
+ batch.map((item) => item.text),
151
+ options
152
+ );
153
+ assertBatchLength("Embedding", embeddings.length, batch.length);
154
+ return batch.map((item, index) => ({
155
+ documentIndex: item.documentIndex,
156
+ embedding: embeddings[index]
157
+ }));
158
+ });
159
+ const byDocument = groupEmbeddings(results.flat());
160
+ return {
161
+ documents: prepared.map((item, index) => embeddedDocument(item, byDocument.get(index) ?? []))
162
+ };
163
+ }
164
+ const { dense, sparse } = options.models;
165
+ const [denseResults, sparseResults] = await Promise.all([
166
+ mapWithConcurrency(
167
+ chunk(flatTexts, batchSize(dense.maxBatchSize, flatTexts.length || 1)),
168
+ concurrencyLimit,
169
+ async (batch) => {
170
+ const embeddings = await embedDenseBatch(
171
+ dense,
172
+ batch.map((item) => item.text),
173
+ options
174
+ );
175
+ assertBatchLength("Embedding", embeddings.length, batch.length);
176
+ return batch.map((item, index) => ({
177
+ documentIndex: item.documentIndex,
178
+ embedding: embeddings[index]
179
+ }));
180
+ }
181
+ ),
182
+ mapWithConcurrency(
183
+ chunk(flatTexts, batchSize(sparse.maxBatchSize, flatTexts.length || 1)),
184
+ concurrencyLimit,
185
+ async (batch) => {
186
+ const embeddings = await embedSparseBatch(
187
+ sparse,
188
+ batch.map((item) => item.text),
189
+ options
190
+ );
191
+ assertBatchLength("Sparse embedding", embeddings.length, batch.length);
192
+ return batch.map((item, index) => ({
193
+ documentIndex: item.documentIndex,
194
+ embedding: embeddings[index]
195
+ }));
196
+ }
197
+ )
198
+ ]);
199
+ const denseByDocument = groupEmbeddings(denseResults.flat());
200
+ const sparseByDocument = groupEmbeddings(sparseResults.flat());
201
+ return {
202
+ documents: prepared.map((item, index) => {
203
+ const embeddings = denseByDocument.get(index) ?? [];
204
+ const sparseEmbeddings = sparseByDocument.get(index) ?? [];
205
+ if (embeddings.length !== sparseEmbeddings.length) {
206
+ throw new Error(
207
+ `Hybrid embedding produced ${embeddings.length} dense and ${sparseEmbeddings.length} sparse vectors for document ${item.id}`
208
+ );
209
+ }
210
+ return embeddedDocument(item, embeddings, sparseEmbeddings);
211
+ })
212
+ };
213
+ }
214
+ async function embedDenseBatch(model, texts, options) {
215
+ throwIfAborted(options.abortSignal);
216
+ const embeddings = await runWithRetries(
217
+ () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),
218
+ resolveRetries(options),
219
+ { streaming: false, abortSignal: options.abortSignal }
220
+ );
221
+ throwIfAborted(options.abortSignal);
222
+ for (const [index, embedding] of embeddings.entries()) {
223
+ validateDenseEmbedding(embedding, model.dimensions, index);
224
+ }
225
+ return embeddings;
226
+ }
227
+ async function embedSparseBatch(model, texts, options) {
228
+ throwIfAborted(options.abortSignal);
229
+ const embeddings = await runWithRetries(
230
+ () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),
231
+ resolveRetries(options),
232
+ { streaming: false, abortSignal: options.abortSignal }
233
+ );
234
+ throwIfAborted(options.abortSignal);
235
+ for (const [index, embedding] of embeddings.entries()) validateSparseEmbedding(embedding, index);
236
+ return embeddings;
237
+ }
238
+ function prepareDocuments(documents, options) {
239
+ const ids = /* @__PURE__ */ new Set();
240
+ return documents.map((document, index) => {
241
+ const id = options.id?.(document, index) ?? `doc${index}`;
242
+ if (id.length === 0) throw new TypeError("Embedded document ids must not be empty");
243
+ if (ids.has(id)) throw new TypeError(`Duplicate embedded document id: ${id}`);
244
+ ids.add(id);
245
+ const content = options.content(document, index);
246
+ if (Array.isArray(content) && content.length === 0)
247
+ throw new TypeError(`Embedded document ${id} must contain at least one text chunk`);
248
+ return {
249
+ id,
250
+ document,
251
+ metadata: options.metadata?.(document, index),
252
+ texts: Array.isArray(content) ? content : [content]
253
+ };
254
+ });
255
+ }
256
+ function embeddedDocument(item, embeddings, sparseEmbeddings) {
257
+ return {
258
+ id: item.id,
259
+ document: item.document,
260
+ ...item.metadata === void 0 ? {} : { metadata: item.metadata },
261
+ embeddings,
262
+ ...sparseEmbeddings === void 0 ? {} : { sparseEmbeddings }
263
+ };
264
+ }
265
+ function groupEmbeddings(items) {
266
+ const groups = /* @__PURE__ */ new Map();
267
+ for (const item of items) {
268
+ const list = groups.get(item.documentIndex) ?? [];
269
+ list.push(item.embedding);
270
+ groups.set(item.documentIndex, list);
271
+ }
272
+ return groups;
273
+ }
274
+ function assertBatchLength(name, actual, expected) {
275
+ if (actual !== expected)
276
+ throw new Error(`${name} model returned ${actual} embeddings for ${expected} texts`);
277
+ }
278
+ function resolveRetries(options) {
279
+ return options.retries === void 0 || options.retries === false ? void 0 : resolveRetryOptions(options.retries);
280
+ }
281
+ function modelCallOptions(abortSignal) {
282
+ return abortSignal === void 0 ? void 0 : { abortSignal };
283
+ }
284
+ function chunk(items, size) {
285
+ const chunks = [];
286
+ for (let index = 0; index < items.length; index += size)
287
+ chunks.push(items.slice(index, index + size));
288
+ return chunks;
289
+ }
290
+ function batchSize(configured, fallback) {
291
+ if (configured === void 0) return fallback;
292
+ if (!Number.isSafeInteger(configured) || configured < 1) {
293
+ throw new RangeError("Embedding model maxBatchSize must be a positive safe integer");
294
+ }
295
+ return configured;
296
+ }
297
+ function concurrency(configured) {
298
+ if (configured === void 0) return 1;
299
+ if (!Number.isSafeInteger(configured) || configured < 1) {
300
+ throw new RangeError("Embedding concurrency must be a positive safe integer");
301
+ }
302
+ return configured;
303
+ }
304
+ function validateDenseEmbedding(embedding, dimensions, index) {
305
+ if (embedding.vector.length === 0) {
306
+ throw new TypeError(`Embedding model returned an empty vector at index ${index}`);
307
+ }
308
+ if (!embedding.vector.every(Number.isFinite)) {
309
+ throw new TypeError(`Embedding model returned a non-finite vector at index ${index}`);
310
+ }
311
+ if (dimensions !== void 0) {
312
+ if (!Number.isSafeInteger(dimensions) || dimensions < 1)
313
+ throw new TypeError("Embedding model dimensions must be a positive safe integer");
314
+ if (embedding.vector.length !== dimensions) {
315
+ throw new Error(
316
+ `Embedding model returned ${embedding.vector.length} dimensions at index ${index}; expected ${dimensions}`
317
+ );
318
+ }
319
+ }
320
+ }
321
+ function validateSparseEmbedding(embedding, index) {
322
+ const { indices, values } = embedding.vector;
323
+ if (indices.length !== values.length) {
324
+ throw new Error(`Sparse embedding at ${index} has mismatched indices and values`);
325
+ }
326
+ if (!indices.every((value) => Number.isSafeInteger(value) && value >= 0)) {
327
+ throw new TypeError(`Sparse embedding at ${index} has an invalid index`);
328
+ }
329
+ if (new Set(indices).size !== indices.length) {
330
+ throw new TypeError(`Sparse embedding at ${index} has duplicate indices`);
331
+ }
332
+ if (!values.every(Number.isFinite)) {
333
+ throw new TypeError(`Sparse embedding at ${index} has a non-finite value`);
334
+ }
335
+ }
336
+
337
+ export {
338
+ dotProduct,
339
+ cosineSimilarity,
340
+ angularDistance,
341
+ euclideanDistance,
342
+ manhattanDistance,
343
+ chebyshevDistance,
344
+ mapWithConcurrency,
345
+ embedText,
346
+ embedTexts,
347
+ embedSparseTexts,
348
+ embedSparseQuery,
349
+ embedDocuments
350
+ };
351
+ //# sourceMappingURL=chunk-FMHLROPQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/embeddings/distance.ts","../src/internal/concurrency.ts","../src/embeddings/embed.ts"],"sourcesContent":["export function dotProduct(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce((sum, value, index) => sum + value * (right[index] as number), 0);\n}\n\nexport function cosineSimilarity(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n const leftMagnitude = magnitude(left);\n const rightMagnitude = magnitude(right);\n if (leftMagnitude === 0 || rightMagnitude === 0) {\n return 0;\n }\n return dotProduct(left, right) / (leftMagnitude * rightMagnitude);\n}\n\nexport function angularDistance(left: number[], right: number[]): number {\n const similarity = Math.max(-1, Math.min(1, cosineSimilarity(left, right)));\n return Math.acos(similarity) / Math.PI;\n}\n\nexport function euclideanDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return Math.sqrt(\n left.reduce((sum, value, index) => sum + (value - (right[index] as number)) ** 2, 0),\n );\n}\n\nexport function manhattanDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce((sum, value, index) => sum + Math.abs(value - (right[index] as number)), 0);\n}\n\nexport function chebyshevDistance(left: number[], right: number[]): number {\n assertSameDimensions(left, right);\n return left.reduce(\n (max, value, index) => Math.max(max, Math.abs(value - (right[index] as number))),\n 0,\n );\n}\n\nfunction magnitude(vector: number[]): number {\n return Math.sqrt(vector.reduce((sum, value) => sum + value ** 2, 0));\n}\n\nfunction assertSameDimensions(left: number[], right: number[]): void {\n if (left.length !== right.length) {\n throw new Error(`Vector dimension mismatch: ${left.length} !== ${right.length}`);\n }\n}\n","export async function mapWithConcurrency<Input, Output>(\n inputs: readonly Input[],\n concurrency: number,\n mapper: (input: Input) => Promise<Output>,\n): Promise<Output[]> {\n if (!Number.isSafeInteger(concurrency) || concurrency <= 0) {\n throw new RangeError(\"concurrency must be a positive safe integer.\");\n }\n const limit = concurrency;\n const results = new Array<Output>(inputs.length);\n let nextIndex = 0;\n let firstFailure: { error: unknown } | undefined;\n\n async function worker(): Promise<void> {\n while (firstFailure === undefined && nextIndex < inputs.length) {\n const index = nextIndex;\n nextIndex += 1;\n try {\n results[index] = await mapper(inputs[index] as Input);\n } catch (error) {\n firstFailure ??= { error };\n }\n }\n }\n\n await Promise.all(Array.from({ length: Math.min(limit, inputs.length) }, () => worker()));\n if (firstFailure !== undefined) {\n throw firstFailure.error;\n }\n return results;\n}\n","import { throwIfAborted } from \"../internal/abort\";\nimport { mapWithConcurrency } from \"../internal/concurrency\";\nimport type { ModelCallOptions } from \"../model-call-options\";\nimport { type ResolvedRetryOptions, resolveRetryOptions, runWithRetries } from \"../retry\";\nimport type {\n EmbedDocumentsOptions,\n EmbedDocumentsResult,\n Embedding,\n EmbeddingOperationOptions,\n EmbedHybridDocumentsOptions,\n EmbedSparseQueryOptions,\n EmbedSparseQueryResult,\n EmbedSparseTextsOptions,\n EmbedSparseTextsResult,\n EmbedTextOptions,\n EmbedTextResult,\n EmbedTextsOptions,\n EmbedTextsResult,\n SparseEmbedding,\n VectorMetadata,\n} from \"./types\";\n\nexport async function embedText(options: EmbedTextOptions): Promise<EmbedTextResult> {\n const { embeddings } = await embedTexts({\n model: options.model,\n texts: [options.text],\n retries: options.retries,\n abortSignal: options.abortSignal,\n });\n const embedding = embeddings[0];\n if (embedding === undefined) throw new Error(\"Embedding model returned no embeddings\");\n return { embedding };\n}\n\nexport async function embedTexts(options: EmbedTextsOptions): Promise<EmbedTextsResult> {\n throwIfAborted(options.abortSignal);\n if (options.texts.length === 0) return { embeddings: [] };\n const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));\n const results = await mapWithConcurrency(batches, concurrency(options.concurrency), (batch) =>\n embedDenseBatch(options.model, batch, options),\n );\n const embeddings = results.flat();\n if (embeddings.length !== options.texts.length) {\n throw new Error(\n `Embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`,\n );\n }\n return { embeddings };\n}\n\nexport async function embedSparseTexts(\n options: EmbedSparseTextsOptions,\n): Promise<EmbedSparseTextsResult> {\n throwIfAborted(options.abortSignal);\n if (options.texts.length === 0) return { embeddings: [] };\n const batches = chunk(options.texts, batchSize(options.model.maxBatchSize, options.texts.length));\n const results = await mapWithConcurrency(batches, concurrency(options.concurrency), (batch) =>\n embedSparseBatch(options.model, batch, options),\n );\n const embeddings = results.flat();\n if (embeddings.length !== options.texts.length) {\n throw new Error(\n `Sparse embedding model returned ${embeddings.length} embeddings for ${options.texts.length} texts`,\n );\n }\n return { embeddings };\n}\n\nexport async function embedSparseQuery(\n options: EmbedSparseQueryOptions,\n): Promise<EmbedSparseQueryResult> {\n throwIfAborted(options.abortSignal);\n const embedding = await runWithRetries(\n () => {\n throwIfAborted(options.abortSignal);\n return options.model.embedQuery(options.query, modelCallOptions(options.abortSignal));\n },\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n validateSparseEmbedding(embedding, \"query\");\n return { embedding };\n}\n\nexport function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>>;\nexport function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedHybridDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>>;\nexport async function embedDocuments<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: EmbedDocumentsOptions<T, Metadata> | EmbedHybridDocumentsOptions<T, Metadata>,\n): Promise<EmbedDocumentsResult<T, Metadata>> {\n throwIfAborted(options.abortSignal);\n const prepared = prepareDocuments(options.documents, options);\n const flatTexts = prepared.flatMap((item, documentIndex) =>\n item.texts.map((text) => ({ documentIndex, text })),\n );\n const concurrencyLimit = concurrency(options.concurrency);\n\n if (\"model\" in options && options.model !== undefined) {\n const batches = chunk(flatTexts, batchSize(options.model.maxBatchSize, flatTexts.length || 1));\n const results = await mapWithConcurrency(batches, concurrencyLimit, async (batch) => {\n const embeddings = await embedDenseBatch(\n options.model,\n batch.map((item) => item.text),\n options,\n );\n assertBatchLength(\"Embedding\", embeddings.length, batch.length);\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as Embedding,\n }));\n });\n const byDocument = groupEmbeddings(results.flat());\n return {\n documents: prepared.map((item, index) => embeddedDocument(item, byDocument.get(index) ?? [])),\n };\n }\n\n const { dense, sparse } = options.models;\n const [denseResults, sparseResults] = await Promise.all([\n mapWithConcurrency(\n chunk(flatTexts, batchSize(dense.maxBatchSize, flatTexts.length || 1)),\n concurrencyLimit,\n async (batch) => {\n const embeddings = await embedDenseBatch(\n dense,\n batch.map((item) => item.text),\n options,\n );\n assertBatchLength(\"Embedding\", embeddings.length, batch.length);\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as Embedding,\n }));\n },\n ),\n mapWithConcurrency(\n chunk(flatTexts, batchSize(sparse.maxBatchSize, flatTexts.length || 1)),\n concurrencyLimit,\n async (batch) => {\n const embeddings = await embedSparseBatch(\n sparse,\n batch.map((item) => item.text),\n options,\n );\n assertBatchLength(\"Sparse embedding\", embeddings.length, batch.length);\n return batch.map((item, index) => ({\n documentIndex: item.documentIndex,\n embedding: embeddings[index] as SparseEmbedding,\n }));\n },\n ),\n ]);\n const denseByDocument = groupEmbeddings(denseResults.flat());\n const sparseByDocument = groupEmbeddings(sparseResults.flat());\n return {\n documents: prepared.map((item, index) => {\n const embeddings = denseByDocument.get(index) ?? [];\n const sparseEmbeddings = sparseByDocument.get(index) ?? [];\n if (embeddings.length !== sparseEmbeddings.length) {\n throw new Error(\n `Hybrid embedding produced ${embeddings.length} dense and ${sparseEmbeddings.length} sparse vectors for document ${item.id}`,\n );\n }\n return embeddedDocument(item, embeddings, sparseEmbeddings);\n }),\n };\n}\n\nasync function embedDenseBatch(\n model: EmbedTextOptions[\"model\"],\n texts: string[],\n options: EmbeddingOperationOptions,\n): Promise<Embedding[]> {\n throwIfAborted(options.abortSignal);\n const embeddings = await runWithRetries(\n () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n for (const [index, embedding] of embeddings.entries()) {\n validateDenseEmbedding(embedding, model.dimensions, index);\n }\n return embeddings;\n}\n\nasync function embedSparseBatch(\n model: EmbedSparseTextsOptions[\"model\"],\n texts: string[],\n options: EmbeddingOperationOptions,\n): Promise<SparseEmbedding[]> {\n throwIfAborted(options.abortSignal);\n const embeddings = await runWithRetries(\n () => model.embedTexts(texts, modelCallOptions(options.abortSignal)),\n resolveRetries(options),\n { streaming: false, abortSignal: options.abortSignal },\n );\n throwIfAborted(options.abortSignal);\n for (const [index, embedding] of embeddings.entries()) validateSparseEmbedding(embedding, index);\n return embeddings;\n}\n\nfunction prepareDocuments<T, Metadata extends VectorMetadata>(\n documents: T[],\n options: Pick<EmbedDocumentsOptions<T, Metadata>, \"id\" | \"content\" | \"metadata\">,\n) {\n const ids = new Set<string>();\n return documents.map((document, index) => {\n const id = options.id?.(document, index) ?? `doc${index}`;\n if (id.length === 0) throw new TypeError(\"Embedded document ids must not be empty\");\n if (ids.has(id)) throw new TypeError(`Duplicate embedded document id: ${id}`);\n ids.add(id);\n const content = options.content(document, index);\n if (Array.isArray(content) && content.length === 0)\n throw new TypeError(`Embedded document ${id} must contain at least one text chunk`);\n return {\n id,\n document,\n metadata: options.metadata?.(document, index),\n texts: Array.isArray(content) ? content : [content],\n };\n });\n}\n\nfunction embeddedDocument<T, Metadata extends VectorMetadata>(\n item: { id: string; document: T; metadata: Metadata | undefined },\n embeddings: Embedding[],\n sparseEmbeddings?: SparseEmbedding[],\n) {\n return {\n id: item.id,\n document: item.document,\n ...(item.metadata === undefined ? {} : { metadata: item.metadata }),\n embeddings,\n ...(sparseEmbeddings === undefined ? {} : { sparseEmbeddings }),\n };\n}\n\nfunction groupEmbeddings<E>(\n items: Array<{ documentIndex: number; embedding: E }>,\n): Map<number, E[]> {\n const groups = new Map<number, E[]>();\n for (const item of items) {\n const list = groups.get(item.documentIndex) ?? [];\n list.push(item.embedding);\n groups.set(item.documentIndex, list);\n }\n return groups;\n}\n\nfunction assertBatchLength(name: string, actual: number, expected: number): void {\n if (actual !== expected)\n throw new Error(`${name} model returned ${actual} embeddings for ${expected} texts`);\n}\n\nfunction resolveRetries(options: EmbeddingOperationOptions): ResolvedRetryOptions | undefined {\n return options.retries === undefined || options.retries === false\n ? undefined\n : resolveRetryOptions(options.retries);\n}\n\nfunction modelCallOptions(abortSignal: AbortSignal | undefined): ModelCallOptions | undefined {\n return abortSignal === undefined ? undefined : { abortSignal };\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let index = 0; index < items.length; index += size)\n chunks.push(items.slice(index, index + size));\n return chunks;\n}\n\nfunction batchSize(configured: number | undefined, fallback: number): number {\n if (configured === undefined) return fallback;\n if (!Number.isSafeInteger(configured) || configured < 1) {\n throw new RangeError(\"Embedding model maxBatchSize must be a positive safe integer\");\n }\n return configured;\n}\n\nfunction concurrency(configured: number | undefined): number {\n if (configured === undefined) return 1;\n if (!Number.isSafeInteger(configured) || configured < 1) {\n throw new RangeError(\"Embedding concurrency must be a positive safe integer\");\n }\n return configured;\n}\n\nfunction validateDenseEmbedding(\n embedding: Embedding,\n dimensions: number | undefined,\n index: number,\n): void {\n if (embedding.vector.length === 0) {\n throw new TypeError(`Embedding model returned an empty vector at index ${index}`);\n }\n if (!embedding.vector.every(Number.isFinite)) {\n throw new TypeError(`Embedding model returned a non-finite vector at index ${index}`);\n }\n if (dimensions !== undefined) {\n if (!Number.isSafeInteger(dimensions) || dimensions < 1)\n throw new TypeError(\"Embedding model dimensions must be a positive safe integer\");\n if (embedding.vector.length !== dimensions) {\n throw new Error(\n `Embedding model returned ${embedding.vector.length} dimensions at index ${index}; expected ${dimensions}`,\n );\n }\n }\n}\n\nfunction validateSparseEmbedding(embedding: SparseEmbedding, index: number | \"query\"): void {\n const { indices, values } = embedding.vector;\n if (indices.length !== values.length) {\n throw new Error(`Sparse embedding at ${index} has mismatched indices and values`);\n }\n if (!indices.every((value) => Number.isSafeInteger(value) && value >= 0)) {\n throw new TypeError(`Sparse embedding at ${index} has an invalid index`);\n }\n if (new Set(indices).size !== indices.length) {\n throw new TypeError(`Sparse embedding at ${index} has duplicate indices`);\n }\n if (!values.every(Number.isFinite)) {\n throw new TypeError(`Sparse embedding at ${index} has a non-finite value`);\n }\n}\n"],"mappings":"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","names":["concurrency"]}