@anvia/core 1.0.0-rc.1 → 1.0.0-rc.11

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 +433 -85
  2. package/dist/agent/index.d.ts +57 -19
  3. package/dist/agent/index.js +32 -17
  4. package/dist/agent/interactions/index.d.ts +122 -0
  5. package/dist/agent/interactions/index.js +20 -0
  6. package/dist/agent-qRKa3ibC.d.ts +154 -0
  7. package/dist/chunk-3RM57ZT2.js +31 -0
  8. package/dist/chunk-3RM57ZT2.js.map +1 -0
  9. package/dist/chunk-3RWESPUG.js +331 -0
  10. package/dist/chunk-3RWESPUG.js.map +1 -0
  11. package/dist/{chunk-DMPUP4R3.js → chunk-3SKZ2BKP.js} +7 -5
  12. package/dist/chunk-3SKZ2BKP.js.map +1 -0
  13. package/dist/chunk-3XQGVDU5.js +69 -0
  14. package/dist/chunk-3XQGVDU5.js.map +1 -0
  15. package/dist/chunk-3ZLM6OAZ.js +4773 -0
  16. package/dist/chunk-3ZLM6OAZ.js.map +1 -0
  17. package/dist/chunk-6BBOCFHV.js +323 -0
  18. package/dist/chunk-6BBOCFHV.js.map +1 -0
  19. package/dist/chunk-7JLAIN6E.js +15 -0
  20. package/dist/chunk-7JLAIN6E.js.map +1 -0
  21. package/dist/chunk-7PHMK7W4.js +1516 -0
  22. package/dist/chunk-7PHMK7W4.js.map +1 -0
  23. package/dist/chunk-AHLKV6KP.js +86 -0
  24. package/dist/chunk-AHLKV6KP.js.map +1 -0
  25. package/dist/{chunk-FNQB2JEH.js → chunk-AZB6N7P4.js} +94 -65
  26. package/dist/chunk-AZB6N7P4.js.map +1 -0
  27. package/dist/{chunk-I6G7BC42.js → chunk-D4PACGPA.js} +2 -6
  28. package/dist/chunk-D4PACGPA.js.map +1 -0
  29. package/dist/chunk-EFLT7XZD.js +51 -0
  30. package/dist/chunk-EFLT7XZD.js.map +1 -0
  31. package/dist/{chunk-R2LJSQUW.js → chunk-EMZKPRE6.js} +267 -107
  32. package/dist/chunk-EMZKPRE6.js.map +1 -0
  33. package/dist/chunk-I3Q7XSBB.js +59 -0
  34. package/dist/chunk-I3Q7XSBB.js.map +1 -0
  35. package/dist/chunk-J6LVLV6P.js +13 -0
  36. package/dist/chunk-J6LVLV6P.js.map +1 -0
  37. package/dist/chunk-LTXABCOO.js +127 -0
  38. package/dist/chunk-LTXABCOO.js.map +1 -0
  39. package/dist/chunk-OJBFDBLG.js +164 -0
  40. package/dist/chunk-OJBFDBLG.js.map +1 -0
  41. package/dist/chunk-QGX73TSQ.js +177 -0
  42. package/dist/chunk-QGX73TSQ.js.map +1 -0
  43. package/dist/chunk-SJMSS5SI.js +171 -0
  44. package/dist/chunk-SJMSS5SI.js.map +1 -0
  45. package/dist/chunk-SPD4XVR7.js +29 -0
  46. package/dist/chunk-SPD4XVR7.js.map +1 -0
  47. package/dist/chunk-T2C3CGDQ.js +56 -0
  48. package/dist/chunk-T2C3CGDQ.js.map +1 -0
  49. package/dist/{chunk-5XKDW36Z.js → chunk-YA7BMX7D.js} +99 -57
  50. package/dist/chunk-YA7BMX7D.js.map +1 -0
  51. package/dist/chunk-ZA564323.js +331 -0
  52. package/dist/chunk-ZA564323.js.map +1 -0
  53. package/dist/completion/index.d.ts +5 -4
  54. package/dist/completion/index.js +34 -28
  55. package/dist/documents/index.d.ts +34 -0
  56. package/dist/documents/index.js +340 -0
  57. package/dist/documents/index.js.map +1 -0
  58. package/dist/{dynamic-tools-i9woysFa.d.ts → dynamic-tools-aIZlg5x1.d.ts} +21 -9
  59. package/dist/embeddings/index.d.ts +11 -9
  60. package/dist/embeddings/index.js +3 -3
  61. package/dist/evals/index.d.ts +54 -25
  62. package/dist/evals/index.js +197 -114
  63. package/dist/evals/index.js.map +1 -1
  64. package/dist/extractor/index.d.ts +23 -26
  65. package/dist/extractor/index.js +9 -8
  66. package/dist/guardrails/index.d.ts +7 -129
  67. package/dist/guardrails/index.js +1 -1
  68. package/dist/image-generation/index.d.ts +18 -16
  69. package/dist/image-generation/index.js +4 -2
  70. package/dist/index.d.ts +24 -25
  71. package/dist/index.js +80 -56
  72. package/dist/internal/agent.d.ts +33 -30
  73. package/dist/internal/agent.js +50 -15
  74. package/dist/internal/agent.js.map +1 -1
  75. package/dist/mcp/index.d.ts +7 -15
  76. package/dist/mcp/index.js +3 -348
  77. package/dist/mcp/index.js.map +1 -1
  78. package/dist/memory/index.d.ts +23 -6
  79. package/dist/memory/index.js +14 -10
  80. package/dist/{middleware-KynLg_RW.d.ts → middleware-kcF8AusP.d.ts} +10 -7
  81. package/dist/model-call-options-CZkSw_xN.d.ts +6 -0
  82. package/dist/model-listing/index.d.ts +3 -1
  83. package/dist/observability/index.d.ts +22 -6
  84. package/dist/observability/index.js +10 -5
  85. package/dist/observability/index.js.map +1 -1
  86. package/dist/pipeline/index.d.ts +103 -58
  87. package/dist/pipeline/index.js +421 -236
  88. package/dist/pipeline/index.js.map +1 -1
  89. package/dist/provider-output-error-BEwDgVv3.d.ts +99 -0
  90. package/dist/{retry-D3Ruy-ba.d.ts → retry-CjvSlKGW.d.ts} +2 -1
  91. package/dist/skills/index.d.ts +5 -4
  92. package/dist/skills/index.js +8 -7
  93. package/dist/speech-generation/index.d.ts +37 -0
  94. package/dist/speech-generation/index.js +10 -0
  95. package/dist/text-ZLECpQE7.d.ts +32 -0
  96. package/dist/{think-tool-DZqZj2LV.d.ts → think-tool-BwCsJ365.d.ts} +16 -2
  97. package/dist/tool/index.d.ts +10 -7
  98. package/dist/tool/index.js +13 -10
  99. package/dist/{tool-C_8GudXn.d.ts → tool-BpqpoRSE.d.ts} +17 -8
  100. package/dist/transcription/index.d.ts +23 -14
  101. package/dist/transcription/index.js +4 -2
  102. package/dist/{index-DxB74ybJ.d.ts → types-CLCLFpAL.d.ts} +153 -91
  103. package/dist/types-CSYt7-It.d.ts +170 -0
  104. package/dist/types-CXNE592e.d.ts +130 -0
  105. package/dist/types-Cr4uiYo5.d.ts +99 -0
  106. package/dist/{types-DhQfwiZn.d.ts → types-DC1U1XwW.d.ts} +1 -1
  107. package/dist/types-DgvozfPc.d.ts +349 -0
  108. package/dist/types-DhkodEft.d.ts +105 -0
  109. package/dist/types-DjqRHeAi.d.ts +31 -0
  110. package/dist/vector-store/index.d.ts +34 -34
  111. package/dist/vector-store/index.js +10 -6
  112. package/package.json +22 -16
  113. package/dist/agent-DGYY_onS.d.ts +0 -145
  114. package/dist/audio-generation/index.d.ts +0 -31
  115. package/dist/audio-generation/index.js +0 -8
  116. package/dist/chunk-5XKDW36Z.js.map +0 -1
  117. package/dist/chunk-6WGGTJE6.js +0 -139
  118. package/dist/chunk-6WGGTJE6.js.map +0 -1
  119. package/dist/chunk-A3UBYTJT.js +0 -157
  120. package/dist/chunk-A3UBYTJT.js.map +0 -1
  121. package/dist/chunk-ADH7NNCS.js +0 -512
  122. package/dist/chunk-ADH7NNCS.js.map +0 -1
  123. package/dist/chunk-CQNNSZPG.js +0 -9
  124. package/dist/chunk-CQNNSZPG.js.map +0 -1
  125. package/dist/chunk-DMPUP4R3.js.map +0 -1
  126. package/dist/chunk-DZ3CKYTH.js +0 -267
  127. package/dist/chunk-DZ3CKYTH.js.map +0 -1
  128. package/dist/chunk-FNQB2JEH.js.map +0 -1
  129. package/dist/chunk-I6G7BC42.js.map +0 -1
  130. package/dist/chunk-IL3ZSNJI.js +0 -3748
  131. package/dist/chunk-IL3ZSNJI.js.map +0 -1
  132. package/dist/chunk-J6GNQART.js +0 -122
  133. package/dist/chunk-J6GNQART.js.map +0 -1
  134. package/dist/chunk-M3IOWB4Y.js +0 -280
  135. package/dist/chunk-M3IOWB4Y.js.map +0 -1
  136. package/dist/chunk-QY5GZ7HR.js +0 -39
  137. package/dist/chunk-QY5GZ7HR.js.map +0 -1
  138. package/dist/chunk-R2LJSQUW.js.map +0 -1
  139. package/dist/chunk-RFDVKCIE.js +0 -12
  140. package/dist/chunk-RFDVKCIE.js.map +0 -1
  141. package/dist/chunk-RMUBRRSK.js +0 -34
  142. package/dist/chunk-RMUBRRSK.js.map +0 -1
  143. package/dist/chunk-RXKHOYEH.js +0 -466
  144. package/dist/chunk-RXKHOYEH.js.map +0 -1
  145. package/dist/chunk-XDRSPSR7.js +0 -38
  146. package/dist/chunk-XDRSPSR7.js.map +0 -1
  147. package/dist/chunk-XWUC7CIT.js +0 -1
  148. package/dist/chunk-XWUC7CIT.js.map +0 -1
  149. package/dist/errors-CYKUcU89.d.ts +0 -17
  150. package/dist/json-Zo7K3xmt.d.ts +0 -40
  151. package/dist/loaders/index.d.ts +0 -86
  152. package/dist/loaders/index.js +0 -299
  153. package/dist/loaders/index.js.map +0 -1
  154. package/dist/types-B3A4YxaA.d.ts +0 -354
  155. package/dist/types-BBEGKB9m.d.ts +0 -119
  156. package/dist/types-DT3nEemY.d.ts +0 -79
  157. package/dist/types-DulRCYdB.d.ts +0 -70
  158. package/dist/types-p55Jc-sr.d.ts +0 -47
  159. package/dist/ui/index.d.ts +0 -107
  160. package/dist/ui/index.js +0 -10
  161. /package/dist/{audio-generation → agent/interactions}/index.js.map +0 -0
  162. /package/dist/{ui → speech-generation}/index.js.map +0 -0
@@ -1,13 +1,9 @@
1
- import {
2
- Message
3
- } from "./chunk-ADH7NNCS.js";
4
-
5
1
  // src/completion/documents.ts
6
2
  function normalizeDocuments(documents) {
7
3
  if (documents.length === 0) {
8
4
  return void 0;
9
5
  }
10
- return Message.user(documents.map(formatDocument).join("\n"));
6
+ return { role: "user", content: documents.map(formatDocument).join("\n") };
11
7
  }
12
8
  function formatDocument(document) {
13
9
  return `<file id: ${document.id}>
@@ -38,4 +34,4 @@ export {
38
34
  normalizeDocuments,
39
35
  formatDocument
40
36
  };
41
- //# sourceMappingURL=chunk-I6G7BC42.js.map
37
+ //# sourceMappingURL=chunk-D4PACGPA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/completion/documents.ts"],"sourcesContent":["import type { Document, Message } from \"./types\";\n\nexport function normalizeDocuments(documents: Document[]): Message | undefined {\n if (documents.length === 0) {\n return undefined;\n }\n\n return { role: \"user\", content: documents.map(formatDocument).join(\"\\n\") };\n}\n\nexport function formatDocument(document: Document): string {\n return `<file id: ${document.id}>\\n${formatDocumentBody(document)}\\n</file>\\n`;\n}\n\nfunction formatDocumentBody(document: Document): string {\n const metadata = formatMetadata(document.additionalProps);\n return metadata === undefined ? document.text : `${metadata}\\n${document.text}`;\n}\n\nfunction formatMetadata(additionalProps: Record<string, string> | undefined): string | undefined {\n if (additionalProps === undefined) {\n return undefined;\n }\n\n const entries = Object.entries(additionalProps).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n if (entries.length === 0) {\n return undefined;\n }\n\n const metadata = entries.map(([key, value]) => `${key}: ${JSON.stringify(value)}`).join(\" \");\n return `<metadata ${metadata} />`;\n}\n"],"mappings":";AAEO,SAAS,mBAAmB,WAA4C;AAC7E,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,MAAM,QAAQ,SAAS,UAAU,IAAI,cAAc,EAAE,KAAK,IAAI,EAAE;AAC3E;AAEO,SAAS,eAAe,UAA4B;AACzD,SAAO,aAAa,SAAS,EAAE;AAAA,EAAM,mBAAmB,QAAQ,CAAC;AAAA;AAAA;AACnE;AAEA,SAAS,mBAAmB,UAA4B;AACtD,QAAM,WAAW,eAAe,SAAS,eAAe;AACxD,SAAO,aAAa,SAAY,SAAS,OAAO,GAAG,QAAQ;AAAA,EAAK,SAAS,IAAI;AAC/E;AAEA,SAAS,eAAe,iBAAyE;AAC/F,MAAI,oBAAoB,QAAW;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,OAAO,QAAQ,eAAe,EAAE;AAAA,IAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAClE,KAAK,cAAc,KAAK;AAAA,EAC1B;AACA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,EAAE,KAAK,GAAG;AAC3F,SAAO,aAAa,QAAQ;AAC9B;","names":[]}
@@ -0,0 +1,51 @@
1
+ import {
2
+ assertJsonObject
3
+ } from "./chunk-7JLAIN6E.js";
4
+ import {
5
+ resolveRetryOptions,
6
+ runWithRetries,
7
+ throwIfAborted
8
+ } from "./chunk-3RWESPUG.js";
9
+
10
+ // src/speech-generation/generate-speech.ts
11
+ async function generateSpeech(options) {
12
+ assertNonEmptyString(options.text, "Speech text");
13
+ assertNonEmptyString(options.voice, "Speech voice");
14
+ throwIfAborted(options.abortSignal);
15
+ const speed = options.speed ?? 1;
16
+ if (!Number.isFinite(speed) || speed <= 0) {
17
+ throw new RangeError("Speech speed must be a positive finite number.");
18
+ }
19
+ const request = { text: options.text, voice: options.voice, speed };
20
+ if (options.providerOptions !== void 0) {
21
+ assertJsonObject(options.providerOptions, "providerOptions");
22
+ request.providerOptions = options.providerOptions;
23
+ }
24
+ return runWithRetries(
25
+ () => {
26
+ throwIfAborted(options.abortSignal);
27
+ return options.model.speechGeneration(
28
+ request,
29
+ modelCallOptions(options.abortSignal)
30
+ );
31
+ },
32
+ resolveRetries(options.retries),
33
+ { streaming: false, abortSignal: options.abortSignal }
34
+ );
35
+ }
36
+ function resolveRetries(setting) {
37
+ return setting === void 0 || setting === false ? void 0 : resolveRetryOptions(setting);
38
+ }
39
+ function modelCallOptions(abortSignal) {
40
+ return abortSignal === void 0 ? void 0 : { abortSignal };
41
+ }
42
+ function assertNonEmptyString(value, name) {
43
+ if (typeof value !== "string" || value.trim().length === 0) {
44
+ throw new TypeError(`${name} must be a non-empty string.`);
45
+ }
46
+ }
47
+
48
+ export {
49
+ generateSpeech
50
+ };
51
+ //# sourceMappingURL=chunk-EFLT7XZD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/speech-generation/generate-speech.ts"],"sourcesContent":["import type { JsonObject } from \"../completion/types\";\nimport { throwIfAborted } from \"../internal/abort\";\nimport { assertJsonObject } from \"../internal/json-object\";\nimport type { ModelCallOptions } from \"../model-call-options\";\nimport {\n type ResolvedRetryOptions,\n type RetrySetting,\n resolveRetryOptions,\n runWithRetries,\n} from \"../retry\";\nimport type {\n SpeechGenerationModel,\n SpeechGenerationRequest,\n SpeechGenerationResult,\n} from \"./types\";\n\nexport type GenerateSpeechOptions<Model extends SpeechGenerationModel = SpeechGenerationModel> = {\n model: Model;\n text: string;\n voice: string;\n speed?: number | undefined;\n providerOptions?: JsonObject | undefined;\n retries?: RetrySetting | undefined;\n abortSignal?: AbortSignal | undefined;\n};\n\ntype RawResponseOf<Model> =\n Model extends SpeechGenerationModel<infer RawResponse> ? RawResponse : unknown;\n\nexport async function generateSpeech<Model extends SpeechGenerationModel>(\n options: GenerateSpeechOptions<Model>,\n): Promise<SpeechGenerationResult<RawResponseOf<Model>>> {\n assertNonEmptyString(options.text, \"Speech text\");\n assertNonEmptyString(options.voice, \"Speech voice\");\n throwIfAborted(options.abortSignal);\n const speed = options.speed ?? 1;\n if (!Number.isFinite(speed) || speed <= 0) {\n throw new RangeError(\"Speech speed must be a positive finite number.\");\n }\n\n const request: SpeechGenerationRequest = { text: options.text, voice: options.voice, speed };\n if (options.providerOptions !== undefined) {\n assertJsonObject(options.providerOptions, \"providerOptions\");\n request.providerOptions = options.providerOptions;\n }\n return runWithRetries(\n () => {\n throwIfAborted(options.abortSignal);\n return options.model.speechGeneration(\n request,\n modelCallOptions(options.abortSignal),\n ) as Promise<SpeechGenerationResult<RawResponseOf<Model>>>;\n },\n resolveRetries(options.retries),\n { streaming: false, abortSignal: options.abortSignal },\n );\n}\n\nfunction resolveRetries(setting: RetrySetting | undefined): ResolvedRetryOptions | undefined {\n return setting === undefined || setting === false ? undefined : resolveRetryOptions(setting);\n}\n\nfunction modelCallOptions(abortSignal: AbortSignal | undefined): ModelCallOptions | undefined {\n return abortSignal === undefined ? undefined : { abortSignal };\n}\n\nfunction assertNonEmptyString(value: string, name: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${name} must be a non-empty string.`);\n }\n}\n"],"mappings":";;;;;;;;;;AA6BA,eAAsB,eACpB,SACuD;AACvD,uBAAqB,QAAQ,MAAM,aAAa;AAChD,uBAAqB,QAAQ,OAAO,cAAc;AAClD,iBAAe,QAAQ,WAAW;AAClC,QAAM,QAAQ,QAAQ,SAAS;AAC/B,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,UAAM,IAAI,WAAW,gDAAgD;AAAA,EACvE;AAEA,QAAM,UAAmC,EAAE,MAAM,QAAQ,MAAM,OAAO,QAAQ,OAAO,MAAM;AAC3F,MAAI,QAAQ,oBAAoB,QAAW;AACzC,qBAAiB,QAAQ,iBAAiB,iBAAiB;AAC3D,YAAQ,kBAAkB,QAAQ;AAAA,EACpC;AACA,SAAO;AAAA,IACL,MAAM;AACJ,qBAAe,QAAQ,WAAW;AAClC,aAAO,QAAQ,MAAM;AAAA,QACnB;AAAA,QACA,iBAAiB,QAAQ,WAAW;AAAA,MACtC;AAAA,IACF;AAAA,IACA,eAAe,QAAQ,OAAO;AAAA,IAC9B,EAAE,WAAW,OAAO,aAAa,QAAQ,YAAY;AAAA,EACvD;AACF;AAEA,SAAS,eAAe,SAAqE;AAC3F,SAAO,YAAY,UAAa,YAAY,QAAQ,SAAY,oBAAoB,OAAO;AAC7F;AAEA,SAAS,iBAAiB,aAAoE;AAC5F,SAAO,gBAAgB,SAAY,SAAY,EAAE,YAAY;AAC/D;AAEA,SAAS,qBAAqB,OAAe,MAAoB;AAC/D,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,UAAU,GAAG,IAAI,8BAA8B;AAAA,EAC3D;AACF;","names":[]}
@@ -1,18 +1,38 @@
1
1
  import {
2
2
  cosineSimilarity,
3
+ embedSparseQuery,
3
4
  embedText
4
- } from "./chunk-DZ3CKYTH.js";
5
+ } from "./chunk-ZA564323.js";
5
6
  import {
7
+ parseMessage,
6
8
  toProviderJsonSchema
7
- } from "./chunk-RFDVKCIE.js";
9
+ } from "./chunk-QGX73TSQ.js";
8
10
  import {
9
- isToolResultContentArray,
10
- serializeToolResultOutput
11
- } from "./chunk-ADH7NNCS.js";
11
+ isJsonValue
12
+ } from "./chunk-3XQGVDU5.js";
13
+ import {
14
+ resolveRetryOptions,
15
+ runWithRetries,
16
+ throwIfAborted
17
+ } from "./chunk-3RWESPUG.js";
12
18
 
13
19
  // src/vector-store/index.ts
14
20
  import { z } from "zod";
15
21
 
22
+ // src/internal/vector-search-options.ts
23
+ function assertPositiveSearchLimit(value, name = "topK") {
24
+ if (!Number.isSafeInteger(value) || value <= 0) {
25
+ throw new RangeError(`${name} must be a positive safe integer.`);
26
+ }
27
+ return value;
28
+ }
29
+ function assertFiniteMinScore(value, name = "minScore") {
30
+ if (value !== void 0 && !Number.isFinite(value)) {
31
+ throw new RangeError(`${name} must be a finite number.`);
32
+ }
33
+ return value;
34
+ }
35
+
16
36
  // src/internal/agent-runtime/approval-requirement.ts
17
37
  function toolMayRequireApproval(requirement) {
18
38
  return requirement !== void 0 && requirement !== false;
@@ -62,22 +82,63 @@ var ToolJsonError = class extends Error {
62
82
  };
63
83
 
64
84
  // src/tool/tool.ts
85
+ var richToolOutput = /* @__PURE__ */ Symbol("anvia.tool-output.content");
86
+ var ToolResultSerializationError = class extends TypeError {
87
+ constructor(output) {
88
+ super("Tool output must be a string, a strict JSON value, or ToolOutput.content(...).");
89
+ this.output = output;
90
+ this.name = "ToolResultSerializationError";
91
+ }
92
+ output;
93
+ };
65
94
  var ToolOutput = {
66
95
  content(content) {
67
- return content;
96
+ return { [richToolOutput]: true, content };
68
97
  }
69
98
  };
70
99
  function normalizeToolResultOutput(output) {
71
- return isToolResultContentArray(output) ? output : serializeToolResultOutput(output);
100
+ if (typeof output === "string") {
101
+ return { type: "text", value: output };
102
+ }
103
+ if (isRichToolOutput(output)) {
104
+ try {
105
+ const message = parseMessage({
106
+ role: "tool",
107
+ content: [
108
+ {
109
+ type: "tool-result",
110
+ toolCallId: "validation",
111
+ toolName: "validation",
112
+ output: { type: "content", value: output.content }
113
+ }
114
+ ]
115
+ });
116
+ if (message.role !== "tool") throw new TypeError("Unexpected message role");
117
+ const result = message.content[0];
118
+ if (result?.type !== "tool-result") throw new TypeError("Unexpected tool result part");
119
+ if (result?.output.type !== "content") throw new TypeError("Unexpected tool output");
120
+ return result.output;
121
+ } catch {
122
+ throw new ToolResultSerializationError(output);
123
+ }
124
+ }
125
+ if (isJsonValue(output)) {
126
+ return { type: "json", value: output };
127
+ }
128
+ throw new ToolResultSerializationError(output);
72
129
  }
73
130
  function toolResultContentToText(content) {
74
- return content.map((item) => item.type === "text" ? item.text : `[image:${item.mediaType ?? "image/png"}]`).join("\n");
131
+ return content.map((item) => item.type === "text" ? item.text : `[file:${item.mediaType}]`).join("\n");
132
+ }
133
+ function isRichToolOutput(value) {
134
+ return typeof value === "object" && value !== null && richToolOutput in value;
75
135
  }
76
136
  function parseToolArgs(args) {
77
- if (args.trim() === "") {
78
- return {};
137
+ const value = JSON.parse(args);
138
+ if (!isJsonValue(value)) {
139
+ throw new TypeError("Tool arguments must be a JSON value.");
79
140
  }
80
- return JSON.parse(args);
141
+ return value;
81
142
  }
82
143
 
83
144
  // src/internal/agent-runtime/prepared-tool-call.ts
@@ -119,6 +180,9 @@ function prepareToolCall(tool, args) {
119
180
  } catch (error) {
120
181
  throw asToolCallError(tool.name, error);
121
182
  }
183
+ return prepareToolCallFromInput(tool, input);
184
+ }
185
+ function prepareToolCallFromInput(tool, input) {
122
186
  return {
123
187
  input,
124
188
  async call(context) {
@@ -299,6 +363,75 @@ function seededRandom(seed) {
299
363
  };
300
364
  }
301
365
 
366
+ // src/vector-store/retrieve.ts
367
+ async function retrieveDocuments(options) {
368
+ assertPositiveSearchLimit(options.topK);
369
+ assertFiniteMinScore(options.minScore);
370
+ throwIfAborted(options.abortSignal);
371
+ const retries = resolveRetries(options.retries);
372
+ const search = (operation) => runWithRetries(operation, retries, {
373
+ streaming: false,
374
+ abortSignal: options.abortSignal
375
+ });
376
+ if ("model" in options && options.model !== void 0) {
377
+ const { embedding } = await embedText({
378
+ model: options.model,
379
+ text: options.query,
380
+ retries: options.retries,
381
+ abortSignal: options.abortSignal
382
+ });
383
+ return deduplicateResults(
384
+ await search(
385
+ () => options.store.search({
386
+ vector: embedding.vector,
387
+ topK: options.topK,
388
+ minScore: options.minScore,
389
+ filter: options.filter,
390
+ abortSignal: options.abortSignal
391
+ })
392
+ )
393
+ );
394
+ }
395
+ const [{ embedding: dense }, { embedding: sparse }] = await Promise.all([
396
+ embedText({
397
+ model: options.models.dense,
398
+ text: options.query,
399
+ retries: options.retries,
400
+ abortSignal: options.abortSignal
401
+ }),
402
+ embedSparseQuery({
403
+ model: options.models.sparse,
404
+ query: options.query,
405
+ retries: options.retries,
406
+ abortSignal: options.abortSignal
407
+ })
408
+ ]);
409
+ return deduplicateResults(
410
+ await search(
411
+ () => options.store.searchHybrid({
412
+ vector: dense.vector,
413
+ sparseVector: sparse.vector,
414
+ fusion: options.fusion,
415
+ topK: options.topK,
416
+ minScore: options.minScore,
417
+ filter: options.filter,
418
+ abortSignal: options.abortSignal
419
+ })
420
+ )
421
+ );
422
+ }
423
+ function deduplicateResults(results) {
424
+ const bestById = /* @__PURE__ */ new Map();
425
+ for (const result of results) {
426
+ const current = bestById.get(result.id);
427
+ if (current === void 0 || result.score > current.score) bestById.set(result.id, result);
428
+ }
429
+ return [...bestById.values()].sort((left, right) => right.score - left.score);
430
+ }
431
+ function resolveRetries(setting) {
432
+ return setting === void 0 || setting === false ? void 0 : resolveRetryOptions(setting);
433
+ }
434
+
302
435
  // src/vector-store/index.ts
303
436
  var InMemoryVectorStore = class _InMemoryVectorStore {
304
437
  documents = /* @__PURE__ */ new Map();
@@ -307,22 +440,25 @@ var InMemoryVectorStore = class _InMemoryVectorStore {
307
440
  embeddingDimension;
308
441
  constructor(options = {}) {
309
442
  this.indexStrategy = options.index ?? { type: "bruteForce" };
443
+ if (options.dimensions !== void 0 && (!Number.isSafeInteger(options.dimensions) || options.dimensions < 1)) {
444
+ throw new RangeError("Vector dimensions must be a positive safe integer.");
445
+ }
446
+ this.embeddingDimension = options.dimensions;
310
447
  }
311
- static fromDocuments(documents, options = {}) {
448
+ static fromDocuments(options) {
312
449
  const store = new _InMemoryVectorStore(options);
313
- store.addDocuments(documents);
450
+ store.replaceDocuments(options.documents);
314
451
  return store;
315
452
  }
316
- addDocuments(documents) {
317
- this.validateDocumentDimensions(documents);
318
- for (const document of documents) {
319
- this.documents.set(document.id, document);
320
- }
321
- this.rebuildLshIndex();
322
- return this;
453
+ async ensure() {
454
+ }
455
+ async validate() {
323
456
  }
324
- get(id) {
325
- return this.documents.get(id);
457
+ async upsert(options) {
458
+ this.replaceDocuments(options.documents);
459
+ }
460
+ get(options) {
461
+ return this.documents.get(options.id);
326
462
  }
327
463
  values() {
328
464
  return [...this.documents.values()];
@@ -333,18 +469,75 @@ var InMemoryVectorStore = class _InMemoryVectorStore {
333
469
  isEmpty() {
334
470
  return this.documents.size === 0;
335
471
  }
336
- index(model) {
337
- return new InMemoryVectorIndex(model, this);
472
+ async search(request) {
473
+ throwIfAborted2(request.abortSignal);
474
+ assertPositiveSearchLimit(request.topK);
475
+ assertFiniteMinScore(request.minScore);
476
+ const queryEmbedding = { document: "", vector: request.vector };
477
+ const results = this.candidates(queryEmbedding).filter((document) => matchesVectorFilter(document.metadata, request.filter)).flatMap((document) => {
478
+ const score = bestScore(queryEmbedding, document.embeddings);
479
+ if (score === void 0 || request.minScore !== void 0 && score < request.minScore) {
480
+ return [];
481
+ }
482
+ let result = {
483
+ score,
484
+ id: document.id,
485
+ document: document.document
486
+ };
487
+ if (document.metadata !== void 0) {
488
+ result = { ...result, metadata: document.metadata };
489
+ }
490
+ return [result];
491
+ }).sort((left, right) => right.score - left.score).slice(0, request.topK);
492
+ throwIfAborted2(request.abortSignal);
493
+ return results;
494
+ }
495
+ async inspect(request) {
496
+ throwIfAborted2(request.abortSignal);
497
+ const limit = assertPositiveSearchLimit(request.limit);
498
+ const start = Math.max(0, Math.trunc(Number(request.cursor ?? "0")));
499
+ const documents = this.values().filter(
500
+ (document) => matchesVectorFilter(document.metadata, request.filter)
501
+ );
502
+ const page = documents.slice(start, start + limit);
503
+ const nextOffset = start + page.length;
504
+ const result = {
505
+ items: page.map((document) => {
506
+ let item = {
507
+ id: document.id,
508
+ document: document.document
509
+ };
510
+ if (document.metadata !== void 0) {
511
+ item = { ...item, metadata: document.metadata };
512
+ }
513
+ return item;
514
+ }),
515
+ totalCount: documents.length
516
+ };
517
+ if (nextOffset < documents.length) result.nextCursor = String(nextOffset);
518
+ throwIfAborted2(request.abortSignal);
519
+ return result;
520
+ }
521
+ replaceDocuments(documents) {
522
+ const ids = /* @__PURE__ */ new Set();
523
+ for (const document of documents) {
524
+ if (ids.has(document.id)) throw new TypeError(`Duplicate vector document id: ${document.id}`);
525
+ ids.add(document.id);
526
+ if (document.embeddings.length === 0) {
527
+ throw new TypeError(`Vector document ${document.id} must contain at least one embedding.`);
528
+ }
529
+ for (const embedding of document.embeddings)
530
+ assertFiniteVector(embedding.vector, document.id);
531
+ }
532
+ this.validateDocumentDimensions(documents);
533
+ for (const document of documents) this.documents.set(document.id, document);
534
+ this.rebuildLshIndex();
338
535
  }
339
536
  candidates(queryEmbedding) {
340
537
  this.validateQueryDimension(queryEmbedding);
341
- if (this.indexStrategy.type !== "lsh" || this.lshIndex === void 0) {
342
- return this.values();
343
- }
538
+ if (this.indexStrategy.type !== "lsh" || this.lshIndex === void 0) return this.values();
344
539
  const candidateIds = this.lshIndex.query(queryEmbedding.vector);
345
- if (candidateIds.size === 0) {
346
- return this.values();
347
- }
540
+ if (candidateIds.size === 0) return this.values();
348
541
  return [...candidateIds].flatMap((id) => {
349
542
  const document = this.documents.get(id);
350
543
  return document === void 0 ? [] : [document];
@@ -362,9 +555,7 @@ var InMemoryVectorStore = class _InMemoryVectorStore {
362
555
  }
363
556
  const index = new LshIndex(firstEmbedding.vector.length, this.indexStrategy);
364
557
  for (const document of this.documents.values()) {
365
- for (const embedding of document.embeddings) {
366
- index.insert(document.id, embedding.vector);
367
- }
558
+ for (const embedding of document.embeddings) index.insert(document.id, embedding.vector);
368
559
  }
369
560
  this.lshIndex = index;
370
561
  }
@@ -378,77 +569,26 @@ var InMemoryVectorStore = class _InMemoryVectorStore {
378
569
  this.embeddingDimension = dimension;
379
570
  }
380
571
  validateQueryDimension(queryEmbedding) {
381
- if (this.embeddingDimension === void 0) {
382
- return;
572
+ if (this.embeddingDimension !== void 0) {
573
+ validateEmbeddingDimension(this.embeddingDimension, queryEmbedding, "query");
383
574
  }
384
- validateEmbeddingDimension(this.embeddingDimension, queryEmbedding, "query");
385
575
  }
386
576
  };
387
- var InMemoryVectorIndex = class {
388
- constructor(model, store) {
389
- this.model = model;
390
- this.store = store;
391
- }
392
- model;
393
- store;
394
- async search(request) {
395
- const queryEmbedding = await embedText(this.model, request.query);
396
- return this.store.candidates(queryEmbedding).filter((document) => matchesVectorFilter(document.metadata, request.filter)).flatMap((document) => {
397
- const score = bestScore(queryEmbedding, document.embeddings);
398
- if (score === void 0) {
399
- return [];
400
- }
401
- if (request.threshold !== void 0 && score < request.threshold) {
402
- return [];
403
- }
404
- const result = {
405
- score,
406
- id: document.id,
407
- document: document.document
408
- };
409
- if (document.metadata !== void 0) {
410
- result.metadata = document.metadata;
411
- }
412
- return [result];
413
- }).sort((left, right) => right.score - left.score).slice(0, Math.max(0, Math.trunc(request.topK)));
577
+ function throwIfAborted2(signal) {
578
+ if (signal?.aborted) {
579
+ const error = new Error("The operation was aborted.");
580
+ error.name = "AbortError";
581
+ throw error;
414
582
  }
415
- async searchIds(request) {
416
- return (await this.search(request)).map(({ score, id }) => ({ score, id }));
417
- }
418
- async inspect(request) {
419
- const limit = Math.max(0, Math.trunc(request.limit));
420
- const start = Math.max(0, Math.trunc(Number(request.cursor ?? "0")));
421
- const documents = this.store.values().filter((document) => matchesVectorFilter(document.metadata, request.filter));
422
- const page = documents.slice(start, start + limit);
423
- const nextOffset = start + page.length;
424
- const result = {
425
- items: page.map((document) => {
426
- const item = {
427
- id: document.id,
428
- document: document.document
429
- };
430
- if (document.metadata !== void 0) {
431
- item.metadata = document.metadata;
432
- }
433
- return item;
434
- })
435
- };
436
- if (nextOffset < documents.length) {
437
- result.nextCursor = String(nextOffset);
438
- }
439
- result.totalCount = documents.length;
440
- return result;
441
- }
442
- asTool(options) {
443
- return createVectorSearchTool(this, options);
444
- }
445
- };
446
- function createVectorSearchTool(index, options) {
583
+ }
584
+ function createVectorSearchTool(options) {
585
+ const configuredTopK = assertPositiveSearchLimit(options.topK ?? 5);
586
+ assertFiniteMinScore(options.minScore);
447
587
  return createTool({
448
588
  name: options.name,
449
589
  description: options.description ?? "Search a vector store for documents relevant to the provided query.",
450
590
  inputSchema: z.object({
451
- query: z.string().describe("The query string to search for relevant documents."),
591
+ query: z.string().min(1).describe("The query string to search for relevant documents."),
452
592
  topK: z.number().int().positive().optional().describe("The maximum number of results.")
453
593
  }),
454
594
  outputSchema: z.array(
@@ -459,12 +599,22 @@ function createVectorSearchTool(index, options) {
459
599
  metadata: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional()
460
600
  })
461
601
  ),
462
- execute: ({ query, topK }) => index.search({
463
- query,
464
- topK: topK ?? options.topK ?? 5,
465
- threshold: options.threshold,
466
- filter: options.filter
467
- })
602
+ execute: ({ query, topK }, context) => {
603
+ const request = {
604
+ query,
605
+ topK: topK ?? configuredTopK,
606
+ minScore: options.minScore,
607
+ filter: options.filter,
608
+ retries: options.retries,
609
+ abortSignal: context.abortSignal
610
+ };
611
+ return "models" in options && options.models !== void 0 ? retrieveDocuments({
612
+ ...request,
613
+ store: options.store,
614
+ models: options.models,
615
+ fusion: options.fusion
616
+ }) : retrieveDocuments({ ...request, store: options.store, model: options.model });
617
+ }
468
618
  });
469
619
  }
470
620
  function bestScore(queryEmbedding, embeddings) {
@@ -476,9 +626,8 @@ function bestScore(queryEmbedding, embeddings) {
476
626
  return best;
477
627
  }
478
628
  function validateEmbeddingDimension(expectedDimension, embedding, id) {
479
- if (expectedDimension === void 0) {
480
- return embedding.vector.length;
481
- }
629
+ assertFiniteVector(embedding.vector, id);
630
+ if (expectedDimension === void 0) return embedding.vector.length;
482
631
  if (embedding.vector.length !== expectedDimension) {
483
632
  throw new Error(
484
633
  `Vector dimension mismatch: expected ${expectedDimension} dimensions but received ${embedding.vector.length} for ${id}`
@@ -486,6 +635,12 @@ function validateEmbeddingDimension(expectedDimension, embedding, id) {
486
635
  }
487
636
  return expectedDimension;
488
637
  }
638
+ function assertFiniteVector(vector, id) {
639
+ if (vector.length === 0) throw new TypeError(`Vector for ${id} must not be empty.`);
640
+ if (!vector.every(Number.isFinite)) {
641
+ throw new TypeError(`Vector for ${id} must contain only finite numbers.`);
642
+ }
643
+ }
489
644
 
490
645
  export {
491
646
  toolMayRequireApproval,
@@ -493,15 +648,20 @@ export {
493
648
  ToolCallError,
494
649
  ToolNotFoundError,
495
650
  ToolJsonError,
651
+ ToolResultSerializationError,
496
652
  ToolOutput,
497
653
  normalizeToolResultOutput,
498
654
  toolResultContentToText,
499
655
  parseToolArgs,
500
656
  prepareToolCall,
657
+ prepareToolCallFromInput,
501
658
  createTool,
659
+ assertPositiveSearchLimit,
660
+ assertFiniteMinScore,
502
661
  vectorFilter,
662
+ matchesVectorFilter,
663
+ retrieveDocuments,
503
664
  InMemoryVectorStore,
504
- InMemoryVectorIndex,
505
665
  createVectorSearchTool
506
666
  };
507
- //# sourceMappingURL=chunk-R2LJSQUW.js.map
667
+ //# sourceMappingURL=chunk-EMZKPRE6.js.map