@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,654 @@
1
+ import {
2
+ cosineSimilarity,
3
+ embedSparseQuery,
4
+ embedText
5
+ } from "./chunk-FMHLROPQ.js";
6
+ import {
7
+ isJsonValue,
8
+ parseMessage,
9
+ toProviderJsonSchema
10
+ } from "./chunk-TIZYTPJO.js";
11
+ import {
12
+ resolveRetryOptions,
13
+ runWithRetries,
14
+ throwIfAborted
15
+ } from "./chunk-FN7HLLAZ.js";
16
+
17
+ // src/vector-store/index.ts
18
+ import { z } from "zod";
19
+
20
+ // src/internal/vector-search-options.ts
21
+ function assertPositiveSearchLimit(value, name = "topK") {
22
+ if (!Number.isSafeInteger(value) || value <= 0) {
23
+ throw new RangeError(`${name} must be a positive safe integer.`);
24
+ }
25
+ return value;
26
+ }
27
+ function assertFiniteMinScore(value, name = "minScore") {
28
+ if (value !== void 0 && !Number.isFinite(value)) {
29
+ throw new RangeError(`${name} must be a finite number.`);
30
+ }
31
+ return value;
32
+ }
33
+
34
+ // src/internal/agent-runtime/approval-requirement.ts
35
+ function toolMayRequireApproval(requirement) {
36
+ return requirement !== void 0 && requirement !== false;
37
+ }
38
+ function assertToolApprovalRequirement(requirement, options) {
39
+ if (typeof requirement === "boolean") {
40
+ return;
41
+ }
42
+ if (options.allowFunction && typeof requirement === "function") {
43
+ return;
44
+ }
45
+ if (typeof requirement !== "object" || requirement === null || Array.isArray(requirement)) {
46
+ throw new TypeError(
47
+ 'Tool "requiresApproval" must be a boolean, a function, or an object with an optional string reason.'
48
+ );
49
+ }
50
+ const reason = requirement.reason;
51
+ if (reason !== void 0 && typeof reason !== "string") {
52
+ throw new TypeError('Tool "requiresApproval.reason" must be a string.');
53
+ }
54
+ }
55
+
56
+ // src/tool/errors.ts
57
+ var ToolCallError = class extends Error {
58
+ constructor(message, cause) {
59
+ super(message);
60
+ this.cause = cause;
61
+ this.name = "ToolCallError";
62
+ }
63
+ cause;
64
+ };
65
+ var ToolNotFoundError = class extends Error {
66
+ constructor(toolName) {
67
+ super(`Tool not found: ${toolName}`);
68
+ this.toolName = toolName;
69
+ this.name = "ToolNotFoundError";
70
+ }
71
+ toolName;
72
+ };
73
+ var ToolJsonError = class extends Error {
74
+ constructor(message, cause) {
75
+ super(message);
76
+ this.cause = cause;
77
+ this.name = "ToolJsonError";
78
+ }
79
+ cause;
80
+ };
81
+
82
+ // src/tool/tool.ts
83
+ var richToolOutput = /* @__PURE__ */ Symbol("anvia.tool-output.content");
84
+ var ToolResultSerializationError = class extends TypeError {
85
+ constructor(output) {
86
+ super("Tool output must be a string, a strict JSON value, or ToolOutput.content(...).");
87
+ this.output = output;
88
+ this.name = "ToolResultSerializationError";
89
+ }
90
+ output;
91
+ };
92
+ var ToolOutput = {
93
+ content(content) {
94
+ return { [richToolOutput]: true, content };
95
+ }
96
+ };
97
+ function normalizeToolResultOutput(output) {
98
+ if (typeof output === "string") {
99
+ return { type: "text", value: output };
100
+ }
101
+ if (isRichToolOutput(output)) {
102
+ try {
103
+ const message = parseMessage({
104
+ role: "tool",
105
+ content: [
106
+ {
107
+ type: "tool-result",
108
+ toolCallId: "validation",
109
+ toolName: "validation",
110
+ output: { type: "content", value: output.content }
111
+ }
112
+ ]
113
+ });
114
+ if (message.role !== "tool") throw new TypeError("Unexpected message role");
115
+ const result = message.content[0];
116
+ if (result?.output.type !== "content") throw new TypeError("Unexpected tool output");
117
+ return result.output;
118
+ } catch {
119
+ throw new ToolResultSerializationError(output);
120
+ }
121
+ }
122
+ if (isJsonValue(output)) {
123
+ return { type: "json", value: output };
124
+ }
125
+ throw new ToolResultSerializationError(output);
126
+ }
127
+ function toolResultContentToText(content) {
128
+ return content.map((item) => item.type === "text" ? item.text : `[file:${item.mediaType}]`).join("\n");
129
+ }
130
+ function isRichToolOutput(value) {
131
+ return typeof value === "object" && value !== null && richToolOutput in value;
132
+ }
133
+ function parseToolArgs(args) {
134
+ if (args.trim() === "") {
135
+ return {};
136
+ }
137
+ return JSON.parse(args);
138
+ }
139
+
140
+ // src/internal/agent-runtime/prepared-tool-call.ts
141
+ var preparedToolInputSymbol = /* @__PURE__ */ Symbol("preparedToolInput");
142
+ var preparedToolOwnerSymbol = /* @__PURE__ */ Symbol("preparedToolOwner");
143
+ function attachPreparedToolOwner(tool, owner) {
144
+ Object.defineProperty(tool, preparedToolOwnerSymbol, {
145
+ configurable: false,
146
+ enumerable: true,
147
+ value: owner,
148
+ writable: false
149
+ });
150
+ return tool;
151
+ }
152
+ function preparedToolInput(context, owner) {
153
+ if (context === void 0 || !(preparedToolInputSymbol in context)) {
154
+ return void 0;
155
+ }
156
+ const prepared = context[preparedToolInputSymbol];
157
+ return prepared?.owner === owner ? { input: prepared.input } : void 0;
158
+ }
159
+ function withoutPreparedToolInput(context) {
160
+ if (!(preparedToolInputSymbol in context)) {
161
+ return context;
162
+ }
163
+ const { [preparedToolInputSymbol]: _prepared, ...publicContext } = context;
164
+ return publicContext;
165
+ }
166
+ function prepareToolCall(tool, args) {
167
+ let rawInput;
168
+ try {
169
+ rawInput = parseToolArgs(args);
170
+ } catch (error) {
171
+ throw new ToolJsonError(`Invalid JSON arguments for tool ${tool.name}`, error);
172
+ }
173
+ let input;
174
+ try {
175
+ input = tool.parseInput === void 0 ? rawInput : tool.parseInput(rawInput);
176
+ } catch (error) {
177
+ throw asToolCallError(tool.name, error);
178
+ }
179
+ return {
180
+ input,
181
+ async call(context) {
182
+ try {
183
+ const owner = tool[preparedToolOwnerSymbol];
184
+ return normalizeToolResultOutput(
185
+ await tool.call(
186
+ input,
187
+ owner === void 0 ? context : withPreparedToolInput(context, owner, input)
188
+ )
189
+ );
190
+ } catch (error) {
191
+ throw asToolCallError(tool.name, error);
192
+ }
193
+ }
194
+ };
195
+ }
196
+ function withPreparedToolInput(context, owner, input) {
197
+ const preparedContext = { ...context };
198
+ Object.defineProperty(preparedContext, preparedToolInputSymbol, {
199
+ configurable: false,
200
+ enumerable: true,
201
+ value: { owner, input },
202
+ writable: false
203
+ });
204
+ return preparedContext;
205
+ }
206
+ function asToolCallError(toolName, error) {
207
+ if (error instanceof ToolCallError) {
208
+ return error;
209
+ }
210
+ return error instanceof Error ? new ToolCallError(error.message, error) : new ToolCallError(`Tool ${toolName} failed`, error);
211
+ }
212
+
213
+ // src/tool/create-tool.ts
214
+ function createTool(options) {
215
+ const { name, description, inputSchema, outputSchema, execute } = options;
216
+ const requiresApproval = snapshotApprovalRequirement(options.requiresApproval);
217
+ if (requiresApproval !== void 0) {
218
+ assertToolApprovalRequirement(requiresApproval, { allowFunction: true });
219
+ }
220
+ const parameters = toProviderJsonSchema(inputSchema);
221
+ const preparedInputOwner = {};
222
+ const definition = () => ({
223
+ name,
224
+ description,
225
+ parameters: globalThis.structuredClone(parameters)
226
+ });
227
+ const call = async (args, context = {}) => {
228
+ const prepared = preparedToolInput(context, preparedInputOwner);
229
+ const parsedArgs = prepared === void 0 ? inputSchema.parse(args) : prepared.input;
230
+ const executionContext = prepared === void 0 ? context : withoutPreparedToolInput(context);
231
+ const result = await execute(parsedArgs, executionContext);
232
+ return outputSchema === void 0 ? result : outputSchema.parse(result);
233
+ };
234
+ const parseInput = (args) => inputSchema.parse(args);
235
+ const tool = {
236
+ name,
237
+ definition,
238
+ call,
239
+ parseInput
240
+ };
241
+ if (requiresApproval !== void 0) {
242
+ Object.defineProperty(tool, "requiresApproval", {
243
+ configurable: false,
244
+ enumerable: true,
245
+ value: requiresApproval,
246
+ writable: false
247
+ });
248
+ }
249
+ return attachPreparedToolOwner(tool, preparedInputOwner);
250
+ }
251
+ function snapshotApprovalRequirement(requirement) {
252
+ return typeof requirement === "object" && requirement !== null ? Object.freeze({ ...requirement }) : requirement;
253
+ }
254
+
255
+ // src/vector-store/filter.ts
256
+ var vectorFilter = {
257
+ eq(key, value) {
258
+ return { type: "eq", key, value };
259
+ },
260
+ gt(key, value) {
261
+ return { type: "gt", key, value };
262
+ },
263
+ lt(key, value) {
264
+ return { type: "lt", key, value };
265
+ },
266
+ and(left, right) {
267
+ return { type: "and", filters: [left, right] };
268
+ },
269
+ or(left, right) {
270
+ return { type: "or", filters: [left, right] };
271
+ }
272
+ };
273
+ function matchesVectorFilter(metadata, filter) {
274
+ if (filter === void 0) {
275
+ return true;
276
+ }
277
+ if (metadata === void 0) {
278
+ return false;
279
+ }
280
+ switch (filter.type) {
281
+ case "eq":
282
+ return metadata[filter.key] === filter.value;
283
+ case "gt":
284
+ return compare(metadata[filter.key], filter.value) > 0;
285
+ case "lt":
286
+ return compare(metadata[filter.key], filter.value) < 0;
287
+ case "and":
288
+ return matchesVectorFilter(metadata, filter.filters[0]) && matchesVectorFilter(metadata, filter.filters[1]);
289
+ case "or":
290
+ return matchesVectorFilter(metadata, filter.filters[0]) || matchesVectorFilter(metadata, filter.filters[1]);
291
+ }
292
+ }
293
+ function compare(left, right) {
294
+ if (typeof left === "number" && typeof right === "number") {
295
+ return left - right;
296
+ }
297
+ if (typeof left === "string" && typeof right === "string") {
298
+ return left.localeCompare(right);
299
+ }
300
+ if (typeof left === "boolean" && typeof right === "boolean") {
301
+ return Number(left) - Number(right);
302
+ }
303
+ return 0;
304
+ }
305
+
306
+ // src/vector-store/lsh.ts
307
+ var LshIndex = class {
308
+ constructor(dimensions, options) {
309
+ this.options = options;
310
+ const rng = seededRandom(options.seed ?? 42);
311
+ this.hyperplanes = [];
312
+ for (let index = 0; index < options.numTables * options.numHyperplanes; index += 1) {
313
+ const plane = Array.from({ length: dimensions }, () => rng() * 2 - 1);
314
+ const norm = Math.sqrt(plane.reduce((sum, value) => sum + value ** 2, 0));
315
+ this.hyperplanes.push(norm === 0 ? plane : plane.map((value) => value / norm));
316
+ }
317
+ this.tables = Array.from({ length: options.numTables }, () => /* @__PURE__ */ new Map());
318
+ }
319
+ options;
320
+ hyperplanes;
321
+ tables;
322
+ insert(id, vector) {
323
+ for (let table = 0; table < this.options.numTables; table += 1) {
324
+ const hash = this.hash(vector, table);
325
+ const bucket = this.tables[table]?.get(hash) ?? /* @__PURE__ */ new Set();
326
+ bucket.add(id);
327
+ this.tables[table]?.set(hash, bucket);
328
+ }
329
+ }
330
+ query(vector) {
331
+ const candidates = /* @__PURE__ */ new Set();
332
+ for (let table = 0; table < this.options.numTables; table += 1) {
333
+ const hash = this.hash(vector, table);
334
+ for (const id of this.tables[table]?.get(hash) ?? []) {
335
+ candidates.add(id);
336
+ }
337
+ }
338
+ return candidates;
339
+ }
340
+ hash(vector, table) {
341
+ let hash = "";
342
+ const start = table * this.options.numHyperplanes;
343
+ for (let offset = 0; offset < this.options.numHyperplanes; offset += 1) {
344
+ const plane = this.hyperplanes[start + offset];
345
+ const dot = vector.reduce((sum, value, index) => sum + value * (plane[index] ?? 0), 0);
346
+ hash += dot >= 0 ? "1" : "0";
347
+ }
348
+ return hash;
349
+ }
350
+ };
351
+ function seededRandom(seed) {
352
+ let state = seed >>> 0;
353
+ return () => {
354
+ state = state * 1664525 + 1013904223 >>> 0;
355
+ return state / 4294967296;
356
+ };
357
+ }
358
+
359
+ // src/vector-store/retrieve.ts
360
+ async function retrieveDocuments(options) {
361
+ assertPositiveSearchLimit(options.topK);
362
+ assertFiniteMinScore(options.minScore);
363
+ throwIfAborted(options.abortSignal);
364
+ const retries = resolveRetries(options.retries);
365
+ const search = (operation) => runWithRetries(operation, retries, {
366
+ streaming: false,
367
+ abortSignal: options.abortSignal
368
+ });
369
+ if ("model" in options && options.model !== void 0) {
370
+ const { embedding } = await embedText({
371
+ model: options.model,
372
+ text: options.query,
373
+ retries: options.retries,
374
+ abortSignal: options.abortSignal
375
+ });
376
+ return deduplicateResults(
377
+ await search(
378
+ () => options.store.search({
379
+ vector: embedding.vector,
380
+ topK: options.topK,
381
+ minScore: options.minScore,
382
+ filter: options.filter,
383
+ abortSignal: options.abortSignal
384
+ })
385
+ )
386
+ );
387
+ }
388
+ const [{ embedding: dense }, { embedding: sparse }] = await Promise.all([
389
+ embedText({
390
+ model: options.models.dense,
391
+ text: options.query,
392
+ retries: options.retries,
393
+ abortSignal: options.abortSignal
394
+ }),
395
+ embedSparseQuery({
396
+ model: options.models.sparse,
397
+ query: options.query,
398
+ retries: options.retries,
399
+ abortSignal: options.abortSignal
400
+ })
401
+ ]);
402
+ return deduplicateResults(
403
+ await search(
404
+ () => options.store.searchHybrid({
405
+ vector: dense.vector,
406
+ sparseVector: sparse.vector,
407
+ fusion: options.fusion,
408
+ topK: options.topK,
409
+ minScore: options.minScore,
410
+ filter: options.filter,
411
+ abortSignal: options.abortSignal
412
+ })
413
+ )
414
+ );
415
+ }
416
+ function deduplicateResults(results) {
417
+ const bestById = /* @__PURE__ */ new Map();
418
+ for (const result of results) {
419
+ const current = bestById.get(result.id);
420
+ if (current === void 0 || result.score > current.score) bestById.set(result.id, result);
421
+ }
422
+ return [...bestById.values()].sort((left, right) => right.score - left.score);
423
+ }
424
+ function resolveRetries(setting) {
425
+ return setting === void 0 || setting === false ? void 0 : resolveRetryOptions(setting);
426
+ }
427
+
428
+ // src/vector-store/index.ts
429
+ var InMemoryVectorStore = class _InMemoryVectorStore {
430
+ documents = /* @__PURE__ */ new Map();
431
+ indexStrategy;
432
+ lshIndex;
433
+ embeddingDimension;
434
+ constructor(options = {}) {
435
+ this.indexStrategy = options.index ?? { type: "bruteForce" };
436
+ if (options.dimensions !== void 0 && (!Number.isSafeInteger(options.dimensions) || options.dimensions < 1)) {
437
+ throw new RangeError("Vector dimensions must be a positive safe integer.");
438
+ }
439
+ this.embeddingDimension = options.dimensions;
440
+ }
441
+ static fromDocuments(options) {
442
+ const store = new _InMemoryVectorStore(options);
443
+ store.replaceDocuments(options.documents);
444
+ return store;
445
+ }
446
+ async ensure() {
447
+ }
448
+ async validate() {
449
+ }
450
+ async upsert(options) {
451
+ this.replaceDocuments(options.documents);
452
+ }
453
+ get(options) {
454
+ return this.documents.get(options.id);
455
+ }
456
+ values() {
457
+ return [...this.documents.values()];
458
+ }
459
+ len() {
460
+ return this.documents.size;
461
+ }
462
+ isEmpty() {
463
+ return this.documents.size === 0;
464
+ }
465
+ async search(request) {
466
+ throwIfAborted2(request.abortSignal);
467
+ assertPositiveSearchLimit(request.topK);
468
+ assertFiniteMinScore(request.minScore);
469
+ const queryEmbedding = { document: "", vector: request.vector };
470
+ const results = this.candidates(queryEmbedding).filter((document) => matchesVectorFilter(document.metadata, request.filter)).flatMap((document) => {
471
+ const score = bestScore(queryEmbedding, document.embeddings);
472
+ if (score === void 0 || request.minScore !== void 0 && score < request.minScore) {
473
+ return [];
474
+ }
475
+ return [
476
+ {
477
+ score,
478
+ id: document.id,
479
+ document: document.document,
480
+ ...document.metadata === void 0 ? {} : { metadata: document.metadata }
481
+ }
482
+ ];
483
+ }).sort((left, right) => right.score - left.score).slice(0, request.topK);
484
+ throwIfAborted2(request.abortSignal);
485
+ return results;
486
+ }
487
+ async inspect(request) {
488
+ throwIfAborted2(request.abortSignal);
489
+ const limit = assertPositiveSearchLimit(request.limit);
490
+ const start = Math.max(0, Math.trunc(Number(request.cursor ?? "0")));
491
+ const documents = this.values().filter(
492
+ (document) => matchesVectorFilter(document.metadata, request.filter)
493
+ );
494
+ const page = documents.slice(start, start + limit);
495
+ const nextOffset = start + page.length;
496
+ const result = {
497
+ items: page.map(
498
+ (document) => ({
499
+ id: document.id,
500
+ document: document.document,
501
+ ...document.metadata === void 0 ? {} : { metadata: document.metadata }
502
+ })
503
+ ),
504
+ totalCount: documents.length
505
+ };
506
+ if (nextOffset < documents.length) result.nextCursor = String(nextOffset);
507
+ throwIfAborted2(request.abortSignal);
508
+ return result;
509
+ }
510
+ replaceDocuments(documents) {
511
+ const ids = /* @__PURE__ */ new Set();
512
+ for (const document of documents) {
513
+ if (ids.has(document.id)) throw new TypeError(`Duplicate vector document id: ${document.id}`);
514
+ ids.add(document.id);
515
+ if (document.embeddings.length === 0) {
516
+ throw new TypeError(`Vector document ${document.id} must contain at least one embedding.`);
517
+ }
518
+ for (const embedding of document.embeddings)
519
+ assertFiniteVector(embedding.vector, document.id);
520
+ }
521
+ this.validateDocumentDimensions(documents);
522
+ for (const document of documents) this.documents.set(document.id, document);
523
+ this.rebuildLshIndex();
524
+ }
525
+ candidates(queryEmbedding) {
526
+ this.validateQueryDimension(queryEmbedding);
527
+ if (this.indexStrategy.type !== "lsh" || this.lshIndex === void 0) return this.values();
528
+ const candidateIds = this.lshIndex.query(queryEmbedding.vector);
529
+ if (candidateIds.size === 0) return this.values();
530
+ return [...candidateIds].flatMap((id) => {
531
+ const document = this.documents.get(id);
532
+ return document === void 0 ? [] : [document];
533
+ });
534
+ }
535
+ rebuildLshIndex() {
536
+ if (this.indexStrategy.type !== "lsh") {
537
+ this.lshIndex = void 0;
538
+ return;
539
+ }
540
+ const firstEmbedding = this.values().flatMap((document) => document.embeddings)[0];
541
+ if (firstEmbedding === void 0) {
542
+ this.lshIndex = void 0;
543
+ return;
544
+ }
545
+ const index = new LshIndex(firstEmbedding.vector.length, this.indexStrategy);
546
+ for (const document of this.documents.values()) {
547
+ for (const embedding of document.embeddings) index.insert(document.id, embedding.vector);
548
+ }
549
+ this.lshIndex = index;
550
+ }
551
+ validateDocumentDimensions(documents) {
552
+ let dimension = this.embeddingDimension;
553
+ for (const document of documents) {
554
+ for (const embedding of document.embeddings) {
555
+ dimension = validateEmbeddingDimension(dimension, embedding, document.id);
556
+ }
557
+ }
558
+ this.embeddingDimension = dimension;
559
+ }
560
+ validateQueryDimension(queryEmbedding) {
561
+ if (this.embeddingDimension !== void 0) {
562
+ validateEmbeddingDimension(this.embeddingDimension, queryEmbedding, "query");
563
+ }
564
+ }
565
+ };
566
+ function throwIfAborted2(signal) {
567
+ if (signal?.aborted) {
568
+ const error = new Error("The operation was aborted.");
569
+ error.name = "AbortError";
570
+ throw error;
571
+ }
572
+ }
573
+ function createVectorSearchTool(options) {
574
+ const configuredTopK = assertPositiveSearchLimit(options.topK ?? 5);
575
+ assertFiniteMinScore(options.minScore);
576
+ return createTool({
577
+ name: options.name,
578
+ description: options.description ?? "Search a vector store for documents relevant to the provided query.",
579
+ inputSchema: z.object({
580
+ query: z.string().min(1).describe("The query string to search for relevant documents."),
581
+ topK: z.number().int().positive().optional().describe("The maximum number of results.")
582
+ }),
583
+ outputSchema: z.array(
584
+ z.object({
585
+ score: z.number(),
586
+ id: z.string(),
587
+ document: z.any(),
588
+ metadata: z.record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])).optional()
589
+ })
590
+ ),
591
+ execute: ({ query, topK }, context) => {
592
+ const request = {
593
+ query,
594
+ topK: topK ?? configuredTopK,
595
+ minScore: options.minScore,
596
+ filter: options.filter,
597
+ retries: options.retries,
598
+ abortSignal: context.abortSignal
599
+ };
600
+ return "models" in options && options.models !== void 0 ? retrieveDocuments({
601
+ ...request,
602
+ store: options.store,
603
+ models: options.models,
604
+ fusion: options.fusion
605
+ }) : retrieveDocuments({ ...request, store: options.store, model: options.model });
606
+ }
607
+ });
608
+ }
609
+ function bestScore(queryEmbedding, embeddings) {
610
+ let best;
611
+ for (const embedding of embeddings) {
612
+ const score = cosineSimilarity(queryEmbedding.vector, embedding.vector);
613
+ best = best === void 0 ? score : Math.max(best, score);
614
+ }
615
+ return best;
616
+ }
617
+ function validateEmbeddingDimension(expectedDimension, embedding, id) {
618
+ assertFiniteVector(embedding.vector, id);
619
+ if (expectedDimension === void 0) return embedding.vector.length;
620
+ if (embedding.vector.length !== expectedDimension) {
621
+ throw new Error(
622
+ `Vector dimension mismatch: expected ${expectedDimension} dimensions but received ${embedding.vector.length} for ${id}`
623
+ );
624
+ }
625
+ return expectedDimension;
626
+ }
627
+ function assertFiniteVector(vector, id) {
628
+ if (vector.length === 0) throw new TypeError(`Vector for ${id} must not be empty.`);
629
+ if (!vector.every(Number.isFinite)) {
630
+ throw new TypeError(`Vector for ${id} must contain only finite numbers.`);
631
+ }
632
+ }
633
+
634
+ export {
635
+ toolMayRequireApproval,
636
+ assertToolApprovalRequirement,
637
+ assertPositiveSearchLimit,
638
+ assertFiniteMinScore,
639
+ ToolCallError,
640
+ ToolNotFoundError,
641
+ ToolJsonError,
642
+ ToolResultSerializationError,
643
+ ToolOutput,
644
+ normalizeToolResultOutput,
645
+ toolResultContentToText,
646
+ parseToolArgs,
647
+ prepareToolCall,
648
+ createTool,
649
+ vectorFilter,
650
+ retrieveDocuments,
651
+ InMemoryVectorStore,
652
+ createVectorSearchTool
653
+ };
654
+ //# sourceMappingURL=chunk-77AIYARB.js.map