@anvia/core 1.0.1 → 1.0.3

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 (38) hide show
  1. package/README.md +28 -0
  2. package/dist/agent/index.d.ts +3 -3
  3. package/dist/agent/index.js +5 -4
  4. package/dist/{agent-qRKa3ibC.d.ts → agent-DYfzP-n5.d.ts} +1 -1
  5. package/dist/chunk-4EWTDOLR.js +412 -0
  6. package/dist/chunk-4EWTDOLR.js.map +1 -0
  7. package/dist/{chunk-E2J7MLAB.js → chunk-5TIXGU5U.js} +8 -6
  8. package/dist/chunk-5TIXGU5U.js.map +1 -0
  9. package/dist/{chunk-GBCKSWQF.js → chunk-AR2K73CJ.js} +2 -1
  10. package/dist/chunk-AR2K73CJ.js.map +1 -0
  11. package/dist/{chunk-YFJ4NHV6.js → chunk-LZD36ZAP.js} +86 -1
  12. package/dist/chunk-LZD36ZAP.js.map +1 -0
  13. package/dist/{chunk-EO2GECYH.js → chunk-OIB3URVG.js} +2 -2
  14. package/dist/{chunk-IWJK7JB5.js → chunk-VSTJNHOZ.js} +2 -2
  15. package/dist/documents/index.d.ts +2 -0
  16. package/dist/documents/index.js +6 -335
  17. package/dist/documents/index.js.map +1 -1
  18. package/dist/evals/index.d.ts +1 -1
  19. package/dist/index.d.ts +2 -2
  20. package/dist/index.js +6 -5
  21. package/dist/internal/agent.d.ts +2 -2
  22. package/dist/internal/agent.js +5 -4
  23. package/dist/internal/agent.js.map +1 -1
  24. package/dist/observability/index.d.ts +1 -1
  25. package/dist/observability/index.js +1 -1
  26. package/dist/pipeline/index.d.ts +2 -2
  27. package/dist/skills/index.js +4 -3
  28. package/dist/text-document-B-X7Vxq1.d.ts +32 -0
  29. package/dist/tool/index.js +3 -2
  30. package/dist/{types-CLCLFpAL.d.ts → types-BUEZMBhO.d.ts} +1 -0
  31. package/dist/vector-store/index.d.ts +25 -5
  32. package/dist/vector-store/index.js +6 -1
  33. package/package.json +1 -1
  34. package/dist/chunk-E2J7MLAB.js.map +0 -1
  35. package/dist/chunk-GBCKSWQF.js.map +0 -1
  36. package/dist/chunk-YFJ4NHV6.js.map +0 -1
  37. /package/dist/{chunk-EO2GECYH.js.map → chunk-OIB3URVG.js.map} +0 -0
  38. /package/dist/{chunk-IWJK7JB5.js.map → chunk-VSTJNHOZ.js.map} +0 -0
package/README.md CHANGED
@@ -327,6 +327,8 @@ Use `stream.textStream` instead of `stream.events` when only text deltas are nee
327
327
  iteration share one underlying stream and therefore cannot be consumed independently.
328
328
 
329
329
  Pass `abortSignal` on a run to cancel the active provider call, tools, and nested Agent tools.
330
+ Run observers receive terminal errors with `status: "cancelled"` for cancellation and
331
+ `status: "failed"` for other failures.
330
332
 
331
333
  ## Memory
332
334
 
@@ -536,6 +538,32 @@ slice. PDF pages are one-based, and the parser task is disposed before extractio
536
538
  If parsing or abort handling fails together with parser cleanup, extraction rejects with an
537
539
  `AggregateError` containing the operation failure first and the cleanup failure second.
538
540
 
541
+ For the common vector ingestion path, embed and upsert raw text with one call:
542
+
543
+ ```ts
544
+ import { ingestVectorText } from "@anvia/core/vector-store";
545
+
546
+ await ingestVectorText({
547
+ store,
548
+ document: {
549
+ id: "incident-42",
550
+ text,
551
+ metadata: { tenant: "acme" },
552
+ },
553
+ embeddingModel,
554
+ chunking: {
555
+ strategy: "recursive",
556
+ maxSize: 1_000,
557
+ overlap: 100,
558
+ separators: ["\n\n", "\n", " "],
559
+ },
560
+ });
561
+ ```
562
+
563
+ `ingestVectorDocuments()` accepts the same document shape for batches. Without `chunking`, each
564
+ source document is embedded as one chunk. Chunk embeddings remain grouped under the source document
565
+ ID so re-ingestion replaces its complete vector representation instead of leaving stale chunks.
566
+
539
567
  ## Media
540
568
 
541
569
  Media helpers follow the same one-object API and share `providerOptions`, `retries`, and
@@ -1,9 +1,9 @@
1
1
  export { M as ModelCallOptions } from '../model-call-options-CZkSw_xN.js';
2
2
  export { R as RetryContext, a as RetryOptions, b as RetrySetting } from '../retry-CjvSlKGW.js';
3
- export { A as Agent, a as AgentContextInput, b as AgentMemory, c as AgentMemoryOptions, d as AgentOptions, e as AgentToolInput, f as AgentToolOptions, C as CreateHybridVectorContextOptions, g as CreateVectorContextOptions, V as VectorContext, h as VectorContextBaseOptions, i as createVectorContext, j as isVectorContext } from '../agent-qRKa3ibC.js';
3
+ export { A as Agent, a as AgentContextInput, b as AgentMemory, c as AgentMemoryOptions, d as AgentOptions, e as AgentToolInput, f as AgentToolOptions, C as CreateHybridVectorContextOptions, g as CreateVectorContextOptions, V as VectorContext, h as VectorContextBaseOptions, i as createVectorContext, j as isVectorContext } from '../agent-DYfzP-n5.js';
4
4
  import { M as Message, U as Usage, C as CompletionFinishReason } from '../types-DgvozfPc.js';
5
- import { A as AgentBlockedOutcome, g as AgentInteractionOutcome } from '../types-CLCLFpAL.js';
6
- export { a as AgentChildStreamEvent, b as AgentDeltaEvent, c as AgentErrorEvent, d as AgentErrorStreamEvent, e as AgentFinishEvent, f as AgentInput, h as AgentLifecycle, i as AgentMemoryCompactionEvent, j as AgentMemoryCompactionOptions, k as AgentOutcome, l as AgentPrompt, m as AgentResponse, n as AgentRunOptions, o as AgentRunSettings, p as AgentStartEvent, q as AgentSteerInput, r as AgentSteerReceipt, s as AgentStepFinishEvent, t as AgentStream, u as AgentStreamEvent, v as AgentToolCallDeltaEvent, w as AgentToolFinishEvent, x as AgentToolStartEvent } from '../types-CLCLFpAL.js';
5
+ import { A as AgentBlockedOutcome, g as AgentInteractionOutcome } from '../types-BUEZMBhO.js';
6
+ export { a as AgentChildStreamEvent, b as AgentDeltaEvent, c as AgentErrorEvent, d as AgentErrorStreamEvent, e as AgentFinishEvent, f as AgentInput, h as AgentLifecycle, i as AgentMemoryCompactionEvent, j as AgentMemoryCompactionOptions, k as AgentOutcome, l as AgentPrompt, m as AgentResponse, n as AgentRunOptions, o as AgentRunSettings, p as AgentStartEvent, q as AgentSteerInput, r as AgentSteerReceipt, s as AgentStepFinishEvent, t as AgentStream, u as AgentStreamEvent, v as AgentToolCallDeltaEvent, w as AgentToolFinishEvent, x as AgentToolStartEvent } from '../types-BUEZMBhO.js';
7
7
  import '../zod-schema-C7F4clpm.js';
8
8
  import 'zod';
9
9
  import '../types-DhkodEft.js';
@@ -2,14 +2,15 @@ import {
2
2
  Agent,
3
3
  createVectorContext,
4
4
  isVectorContext
5
- } from "../chunk-E2J7MLAB.js";
5
+ } from "../chunk-5TIXGU5U.js";
6
6
  import "../chunk-OJBFDBLG.js";
7
7
  import "../chunk-J6LVLV6P.js";
8
8
  import "../chunk-XMVOBX43.js";
9
- import "../chunk-GBCKSWQF.js";
9
+ import "../chunk-AR2K73CJ.js";
10
10
  import "../chunk-YK4WAAS4.js";
11
- import "../chunk-EO2GECYH.js";
12
- import "../chunk-YFJ4NHV6.js";
11
+ import "../chunk-OIB3URVG.js";
12
+ import "../chunk-LZD36ZAP.js";
13
+ import "../chunk-4EWTDOLR.js";
13
14
  import {
14
15
  AgentRunBlockedError,
15
16
  AgentRunCancelledError,
@@ -4,7 +4,7 @@ import { Z as ZodSchema } from './zod-schema-C7F4clpm.js';
4
4
  import { d as GuardrailPolicyInput, c as GuardrailPolicy } from './types-DhkodEft.js';
5
5
  import { a as McpServer } from './types-DjqRHeAi.js';
6
6
  import { E as MemoryStore, z as MemorySavePolicy, F as MemoryTokenCounter, n as MemoryCompactor, d as MemoryCompactionConflictRetryOptions, y as MemoryOptions, k as MemoryCompactionResult } from './types-CSYt7-It.js';
7
- import { h as AgentLifecycle, F as AgentObservabilityOptions, n as AgentRunOptions, k as AgentOutcome, o as AgentRunSettings, t as AgentStream, j as AgentMemoryCompactionOptions } from './types-CLCLFpAL.js';
7
+ import { h as AgentLifecycle, F as AgentObservabilityOptions, n as AgentRunOptions, k as AgentOutcome, o as AgentRunSettings, t as AgentStream, j as AgentMemoryCompactionOptions } from './types-BUEZMBhO.js';
8
8
  import { A as AgentMiddleware } from './middleware-kcF8AusP.js';
9
9
  import { A as AnyTool, T as Tool, c as ToolCallContext, N as NormalizedToolOutput } from './tool-BpqpoRSE.js';
10
10
  import { AgentContinuation, AgentInteractionResponse } from './agent/interactions/index.js';
@@ -0,0 +1,412 @@
1
+ // src/documents/chunk-text.ts
2
+ function chunkText(options) {
3
+ const validated = validateOptions(options);
4
+ if (validated.text.length === 0) {
5
+ return [];
6
+ }
7
+ if (validated.strategy === "fixed") {
8
+ return chunkFixed(validated.text, validated.maxSize, validated.overlap);
9
+ }
10
+ const ranges = resolveRecursiveRanges(
11
+ validated.text,
12
+ { start: 0, end: validated.text.length },
13
+ validated.maxSize,
14
+ validated.separators
15
+ );
16
+ return applyRecursiveOverlap(validated.text, ranges, validated.maxSize, validated.overlap);
17
+ }
18
+ function validateOptions(options) {
19
+ if (typeof options !== "object" || options === null) {
20
+ throw new TypeError("chunkText options must be an object");
21
+ }
22
+ const value = options;
23
+ if (typeof value.text !== "string") {
24
+ throw new TypeError("chunkText text must be a string");
25
+ }
26
+ if (!Number.isSafeInteger(value.maxSize) || value.maxSize <= 0) {
27
+ throw new RangeError("chunkText maxSize must be a positive safe integer");
28
+ }
29
+ const maxSize = value.maxSize;
30
+ const overlap = value.overlap === void 0 ? 0 : value.overlap;
31
+ if (!Number.isSafeInteger(overlap) || overlap < 0 || overlap >= maxSize) {
32
+ throw new RangeError(
33
+ "chunkText overlap must be a non-negative safe integer smaller than maxSize"
34
+ );
35
+ }
36
+ if (value.strategy === "fixed") {
37
+ if ("separators" in value) {
38
+ throw new TypeError("chunkText fixed strategy does not accept separators");
39
+ }
40
+ return {
41
+ text: value.text,
42
+ strategy: "fixed",
43
+ maxSize,
44
+ overlap
45
+ };
46
+ }
47
+ if (value.strategy !== "recursive") {
48
+ throw new TypeError('chunkText strategy must be either "fixed" or "recursive"');
49
+ }
50
+ if (!Array.isArray(value.separators) || value.separators.length === 0) {
51
+ throw new TypeError("chunkText recursive separators must be a non-empty array");
52
+ }
53
+ const separators = value.separators;
54
+ const seen = /* @__PURE__ */ new Set();
55
+ for (const separator of separators) {
56
+ if (typeof separator !== "string" || separator.length === 0) {
57
+ throw new TypeError("chunkText recursive separators must contain non-empty strings");
58
+ }
59
+ if (seen.has(separator)) {
60
+ throw new TypeError("chunkText recursive separators must not contain duplicates");
61
+ }
62
+ seen.add(separator);
63
+ }
64
+ return {
65
+ text: value.text,
66
+ strategy: "recursive",
67
+ maxSize,
68
+ overlap,
69
+ separators
70
+ };
71
+ }
72
+ function chunkFixed(text, maxSize, overlap) {
73
+ const chunks = [];
74
+ let start = 0;
75
+ while (start < text.length) {
76
+ const end = Math.min(start + maxSize, text.length);
77
+ chunks.push(createChunk(text, chunks.length, start, end));
78
+ if (end === text.length) {
79
+ break;
80
+ }
81
+ start = end - overlap;
82
+ }
83
+ return chunks;
84
+ }
85
+ function resolveRecursiveRanges(text, initialRange, maxSize, separators) {
86
+ const resolved = [];
87
+ const pending = [
88
+ { range: initialRange, separatorIndex: 0 }
89
+ ];
90
+ while (pending.length > 0) {
91
+ const current = pending.pop();
92
+ if (current === void 0) {
93
+ break;
94
+ }
95
+ if (current.range.end - current.range.start <= maxSize) {
96
+ resolved.push(current.range);
97
+ continue;
98
+ }
99
+ let pieces;
100
+ let nextSeparatorIndex = separators.length;
101
+ for (let index = current.separatorIndex; index < separators.length; index += 1) {
102
+ const candidate = splitAfterSeparator(text, current.range, separators[index]);
103
+ if (candidate.length > 1) {
104
+ pieces = candidate;
105
+ nextSeparatorIndex = index + 1;
106
+ break;
107
+ }
108
+ }
109
+ if (pieces === void 0) {
110
+ resolved.push(...hardSplit(current.range, maxSize));
111
+ continue;
112
+ }
113
+ for (let index = pieces.length - 1; index >= 0; index -= 1) {
114
+ pending.push({ range: pieces[index], separatorIndex: nextSeparatorIndex });
115
+ }
116
+ }
117
+ return resolved;
118
+ }
119
+ function splitAfterSeparator(text, range, separator) {
120
+ const ranges = [];
121
+ let start = range.start;
122
+ let searchFrom = range.start;
123
+ while (searchFrom < range.end) {
124
+ const separatorStart = text.indexOf(separator, searchFrom);
125
+ if (separatorStart < 0 || separatorStart + separator.length > range.end) {
126
+ break;
127
+ }
128
+ const end = separatorStart + separator.length;
129
+ if (end > start) {
130
+ ranges.push({ start, end });
131
+ }
132
+ start = end;
133
+ searchFrom = end;
134
+ }
135
+ if (start < range.end) {
136
+ ranges.push({ start, end: range.end });
137
+ }
138
+ return ranges;
139
+ }
140
+ function hardSplit(range, maxSize) {
141
+ const ranges = [];
142
+ for (let start = range.start; start < range.end; start += maxSize) {
143
+ ranges.push({ start, end: Math.min(start + maxSize, range.end) });
144
+ }
145
+ return ranges;
146
+ }
147
+ function applyRecursiveOverlap(text, ranges, maxSize, overlap) {
148
+ const boundaries = ranges.map((range) => range.end);
149
+ const chunks = [];
150
+ let start = 0;
151
+ let previousEnd = 0;
152
+ while (start < text.length) {
153
+ const limit = Math.min(start + maxSize, text.length);
154
+ const boundary = findLastBoundaryAtMost(boundaries, limit);
155
+ const end = boundary !== void 0 && boundary > previousEnd ? boundary : limit;
156
+ chunks.push(createChunk(text, chunks.length, start, end));
157
+ if (end === text.length) {
158
+ break;
159
+ }
160
+ previousEnd = end;
161
+ start = Math.max(0, end - overlap);
162
+ }
163
+ return chunks;
164
+ }
165
+ function findLastBoundaryAtMost(boundaries, limit) {
166
+ let low = 0;
167
+ let high = boundaries.length;
168
+ while (low < high) {
169
+ const middle = low + Math.floor((high - low) / 2);
170
+ if (boundaries[middle] <= limit) {
171
+ low = middle + 1;
172
+ } else {
173
+ high = middle;
174
+ }
175
+ }
176
+ return boundaries[low - 1];
177
+ }
178
+ function createChunk(text, index, start, end) {
179
+ return { index, text: text.slice(start, end), start, end };
180
+ }
181
+
182
+ // src/documents/pdf.ts
183
+ async function extractPdfText(options) {
184
+ if (typeof options !== "object" || options === null) {
185
+ throw new TypeError("extractPdfText options must be an object");
186
+ }
187
+ if (!(options.data instanceof Uint8Array)) {
188
+ throw new TypeError("extractPdfText data must be a Uint8Array");
189
+ }
190
+ if (options.abortSignal !== void 0 && !isAbortSignal(options.abortSignal)) {
191
+ throw new TypeError("extractPdfText abortSignal must be an AbortSignal");
192
+ }
193
+ const { abortSignal } = options;
194
+ abortSignal?.throwIfAborted();
195
+ const data = new Uint8Array(options.data);
196
+ const pdfjs = await loadPdfjs();
197
+ abortSignal?.throwIfAborted();
198
+ const loadingTask = pdfjs.getDocument({ data });
199
+ let destroyPromise;
200
+ const destroy = () => {
201
+ destroyPromise ??= loadingTask.destroy();
202
+ return destroyPromise;
203
+ };
204
+ const abort = createAbortPromise(abortSignal, destroy);
205
+ return runWithCleanup(
206
+ async () => {
207
+ const document = await abort.wait(loadingTask.promise);
208
+ const pages = [];
209
+ for (let pageNumber = 1; pageNumber <= document.numPages; pageNumber += 1) {
210
+ abortSignal?.throwIfAborted();
211
+ const page = await abort.wait(document.getPage(pageNumber));
212
+ const content = await abort.wait(page.getTextContent());
213
+ pages.push({ pageNumber, text: extractPageText(content.items) });
214
+ }
215
+ return { pages };
216
+ },
217
+ async () => {
218
+ abort.dispose();
219
+ await destroy();
220
+ }
221
+ );
222
+ }
223
+ async function loadPdfjs() {
224
+ try {
225
+ return await import("pdfjs-dist/legacy/build/pdf.mjs");
226
+ } catch (cause) {
227
+ if (!isMissingPdfjsDependency(cause)) {
228
+ throw cause;
229
+ }
230
+ throw new Error(
231
+ 'PDF extraction requires the optional "pdfjs-dist" package. Install it in your application to use extractPdfText().',
232
+ { cause }
233
+ );
234
+ }
235
+ }
236
+ function isMissingPdfjsDependency(error) {
237
+ const seen = /* @__PURE__ */ new Set();
238
+ let current = error;
239
+ while (current instanceof Error && !seen.has(current)) {
240
+ seen.add(current);
241
+ if (current.message.includes("pdfjs-dist") && "code" in current && current.code === "ERR_MODULE_NOT_FOUND") {
242
+ return true;
243
+ }
244
+ current = "cause" in current ? current.cause : void 0;
245
+ }
246
+ return false;
247
+ }
248
+ async function runWithCleanup(operation, cleanup) {
249
+ let outcome;
250
+ try {
251
+ outcome = { ok: true, value: await operation() };
252
+ } catch (error) {
253
+ outcome = { ok: false, error };
254
+ }
255
+ let cleanupError;
256
+ let cleanupFailed = false;
257
+ try {
258
+ await cleanup();
259
+ } catch (error) {
260
+ cleanupFailed = true;
261
+ cleanupError = error;
262
+ }
263
+ if (!outcome.ok) {
264
+ if (cleanupFailed) {
265
+ throw new AggregateError(
266
+ [outcome.error, cleanupError],
267
+ "PDF extraction and cleanup both failed",
268
+ { cause: outcome.error }
269
+ );
270
+ }
271
+ throw outcome.error;
272
+ }
273
+ if (cleanupFailed) {
274
+ throw cleanupError;
275
+ }
276
+ return outcome.value;
277
+ }
278
+ function isAbortSignal(value) {
279
+ if (typeof value !== "object" || value === null) {
280
+ return false;
281
+ }
282
+ const candidate = value;
283
+ return typeof candidate.aborted === "boolean" && typeof candidate.addEventListener === "function" && typeof candidate.removeEventListener === "function" && typeof candidate.throwIfAborted === "function";
284
+ }
285
+ function extractPageText(items) {
286
+ let text = "";
287
+ for (const item of items) {
288
+ if (typeof item !== "object" || item === null) {
289
+ throw new TypeError("PDF text content contains a malformed item");
290
+ }
291
+ if (!("str" in item)) {
292
+ if ("type" in item && (item.type === "beginMarkedContent" || item.type === "beginMarkedContentProps" || item.type === "endMarkedContent")) {
293
+ continue;
294
+ }
295
+ throw new TypeError("PDF text content contains an unknown non-text item");
296
+ }
297
+ if (typeof item.str !== "string") {
298
+ throw new TypeError("PDF text content item str must be a string");
299
+ }
300
+ if (!("hasEOL" in item) || typeof item.hasEOL !== "boolean") {
301
+ throw new TypeError("PDF text content item hasEOL must be a boolean");
302
+ }
303
+ text += item.str;
304
+ if (item.hasEOL) {
305
+ text += "\n";
306
+ }
307
+ }
308
+ return text;
309
+ }
310
+ function createAbortPromise(abortSignal, destroy) {
311
+ if (abortSignal === void 0) {
312
+ return {
313
+ wait: (promise) => promise,
314
+ dispose: () => void 0
315
+ };
316
+ }
317
+ let rejectAbort;
318
+ const aborted = new Promise((_resolve, reject) => {
319
+ rejectAbort = reject;
320
+ });
321
+ const onAbort = () => {
322
+ void destroy();
323
+ rejectAbort?.(
324
+ abortSignal.reason ?? new DOMException("The operation was aborted", "AbortError")
325
+ );
326
+ };
327
+ abortSignal.addEventListener("abort", onAbort, { once: true });
328
+ if (abortSignal.aborted) {
329
+ onAbort();
330
+ }
331
+ return {
332
+ wait: (promise) => Promise.race([promise, aborted]),
333
+ dispose: () => abortSignal.removeEventListener("abort", onAbort)
334
+ };
335
+ }
336
+
337
+ // src/documents/text-document.ts
338
+ function chunkTextDocuments(options) {
339
+ if (typeof options !== "object" || options === null) {
340
+ throw new TypeError("chunkTextDocuments options must contain a documents array");
341
+ }
342
+ const documents = options.documents;
343
+ if (!Array.isArray(documents)) {
344
+ throw new TypeError("chunkTextDocuments options must contain a documents array");
345
+ }
346
+ const ids = /* @__PURE__ */ new Set();
347
+ const chunks = [];
348
+ for (const document of documents) {
349
+ validateDocument(document, ids);
350
+ chunks.push(...chunkDocument(document, options.chunking));
351
+ }
352
+ return chunks;
353
+ }
354
+ function validateDocument(document, ids) {
355
+ if (typeof document !== "object" || document === null) {
356
+ throw new TypeError("Text documents must be objects");
357
+ }
358
+ if (typeof document.id !== "string" || document.id.length === 0) {
359
+ throw new TypeError("Text document ids must be non-empty strings");
360
+ }
361
+ if (ids.has(document.id)) {
362
+ throw new TypeError(`Duplicate text document id: ${document.id}`);
363
+ }
364
+ if (typeof document.text !== "string" || document.text.length === 0) {
365
+ throw new TypeError(`Text document ${document.id} must contain non-empty text`);
366
+ }
367
+ ids.add(document.id);
368
+ }
369
+ function chunkDocument(document, chunking) {
370
+ if (chunking === void 0 || chunking.strategy === "none") {
371
+ return [createDocumentChunk(document, 0, document.text)];
372
+ }
373
+ const textChunks = chunkDocumentText(document.text, chunking);
374
+ return textChunks.map((chunk) => createDocumentChunk(document, chunk.index, chunk.text));
375
+ }
376
+ function chunkDocumentText(text, chunking) {
377
+ const overlap = chunking.overlap ?? 0;
378
+ if (chunking.strategy === "fixed") {
379
+ return chunkText({
380
+ text,
381
+ strategy: "fixed",
382
+ maxSize: chunking.maxSize,
383
+ overlap
384
+ });
385
+ }
386
+ return chunkText({
387
+ text,
388
+ strategy: "recursive",
389
+ maxSize: chunking.maxSize,
390
+ overlap,
391
+ separators: chunking.separators
392
+ });
393
+ }
394
+ function createDocumentChunk(document, index, text) {
395
+ const chunk = {
396
+ id: `${document.id}:chunk:${index}`,
397
+ documentId: document.id,
398
+ index,
399
+ text
400
+ };
401
+ if (document.metadata === void 0) {
402
+ return chunk;
403
+ }
404
+ return { ...chunk, metadata: document.metadata };
405
+ }
406
+
407
+ export {
408
+ chunkText,
409
+ extractPdfText,
410
+ chunkTextDocuments
411
+ };
412
+ //# sourceMappingURL=chunk-4EWTDOLR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/documents/chunk-text.ts","../src/documents/pdf.ts","../src/documents/text-document.ts"],"sourcesContent":["export type TextChunk = Readonly<{\n index: number;\n text: string;\n start: number;\n end: number;\n}>;\n\nexport type ChunkTextOptions =\n | Readonly<{\n text: string;\n strategy: \"fixed\";\n maxSize: number;\n overlap?: number;\n }>\n | Readonly<{\n text: string;\n strategy: \"recursive\";\n maxSize: number;\n overlap?: number;\n separators: readonly string[];\n }>;\n\ntype TextRange = Readonly<{\n start: number;\n end: number;\n}>;\n\nexport function chunkText(options: ChunkTextOptions): readonly TextChunk[] {\n const validated = validateOptions(options);\n if (validated.text.length === 0) {\n return [];\n }\n\n if (validated.strategy === \"fixed\") {\n return chunkFixed(validated.text, validated.maxSize, validated.overlap);\n }\n\n const ranges = resolveRecursiveRanges(\n validated.text,\n { start: 0, end: validated.text.length },\n validated.maxSize,\n validated.separators,\n );\n return applyRecursiveOverlap(validated.text, ranges, validated.maxSize, validated.overlap);\n}\n\nfunction validateOptions(options: ChunkTextOptions):\n | Readonly<{\n text: string;\n strategy: \"fixed\";\n maxSize: number;\n overlap: number;\n }>\n | Readonly<{\n text: string;\n strategy: \"recursive\";\n maxSize: number;\n overlap: number;\n separators: readonly string[];\n }> {\n if (typeof options !== \"object\" || options === null) {\n throw new TypeError(\"chunkText options must be an object\");\n }\n\n const value = options as unknown as Record<string, unknown>;\n if (typeof value.text !== \"string\") {\n throw new TypeError(\"chunkText text must be a string\");\n }\n if (!Number.isSafeInteger(value.maxSize) || (value.maxSize as number) <= 0) {\n throw new RangeError(\"chunkText maxSize must be a positive safe integer\");\n }\n\n const maxSize = value.maxSize as number;\n const overlap = value.overlap === undefined ? 0 : value.overlap;\n if (!Number.isSafeInteger(overlap) || (overlap as number) < 0 || (overlap as number) >= maxSize) {\n throw new RangeError(\n \"chunkText overlap must be a non-negative safe integer smaller than maxSize\",\n );\n }\n\n if (value.strategy === \"fixed\") {\n if (\"separators\" in value) {\n throw new TypeError(\"chunkText fixed strategy does not accept separators\");\n }\n return {\n text: value.text,\n strategy: \"fixed\",\n maxSize,\n overlap: overlap as number,\n };\n }\n\n if (value.strategy !== \"recursive\") {\n throw new TypeError('chunkText strategy must be either \"fixed\" or \"recursive\"');\n }\n if (!Array.isArray(value.separators) || value.separators.length === 0) {\n throw new TypeError(\"chunkText recursive separators must be a non-empty array\");\n }\n\n const separators = value.separators as unknown[];\n const seen = new Set<string>();\n for (const separator of separators) {\n if (typeof separator !== \"string\" || separator.length === 0) {\n throw new TypeError(\"chunkText recursive separators must contain non-empty strings\");\n }\n if (seen.has(separator)) {\n throw new TypeError(\"chunkText recursive separators must not contain duplicates\");\n }\n seen.add(separator);\n }\n\n return {\n text: value.text,\n strategy: \"recursive\",\n maxSize,\n overlap: overlap as number,\n separators: separators as string[],\n };\n}\n\nfunction chunkFixed(text: string, maxSize: number, overlap: number): readonly TextChunk[] {\n const chunks: TextChunk[] = [];\n let start = 0;\n\n while (start < text.length) {\n const end = Math.min(start + maxSize, text.length);\n chunks.push(createChunk(text, chunks.length, start, end));\n if (end === text.length) {\n break;\n }\n start = end - overlap;\n }\n\n return chunks;\n}\n\nfunction resolveRecursiveRanges(\n text: string,\n initialRange: TextRange,\n maxSize: number,\n separators: readonly string[],\n): readonly TextRange[] {\n const resolved: TextRange[] = [];\n const pending: Array<Readonly<{ range: TextRange; separatorIndex: number }>> = [\n { range: initialRange, separatorIndex: 0 },\n ];\n\n while (pending.length > 0) {\n const current = pending.pop();\n if (current === undefined) {\n break;\n }\n if (current.range.end - current.range.start <= maxSize) {\n resolved.push(current.range);\n continue;\n }\n\n let pieces: readonly TextRange[] | undefined;\n let nextSeparatorIndex = separators.length;\n for (let index = current.separatorIndex; index < separators.length; index += 1) {\n const candidate = splitAfterSeparator(text, current.range, separators[index] as string);\n if (candidate.length > 1) {\n pieces = candidate;\n nextSeparatorIndex = index + 1;\n break;\n }\n }\n\n if (pieces === undefined) {\n resolved.push(...hardSplit(current.range, maxSize));\n continue;\n }\n\n for (let index = pieces.length - 1; index >= 0; index -= 1) {\n pending.push({ range: pieces[index] as TextRange, separatorIndex: nextSeparatorIndex });\n }\n }\n\n return resolved;\n}\n\nfunction splitAfterSeparator(text: string, range: TextRange, separator: string): TextRange[] {\n const ranges: TextRange[] = [];\n let start = range.start;\n let searchFrom = range.start;\n\n while (searchFrom < range.end) {\n const separatorStart = text.indexOf(separator, searchFrom);\n if (separatorStart < 0 || separatorStart + separator.length > range.end) {\n break;\n }\n const end = separatorStart + separator.length;\n if (end > start) {\n ranges.push({ start, end });\n }\n start = end;\n searchFrom = end;\n }\n\n if (start < range.end) {\n ranges.push({ start, end: range.end });\n }\n return ranges;\n}\n\nfunction hardSplit(range: TextRange, maxSize: number): readonly TextRange[] {\n const ranges: TextRange[] = [];\n for (let start = range.start; start < range.end; start += maxSize) {\n ranges.push({ start, end: Math.min(start + maxSize, range.end) });\n }\n return ranges;\n}\n\nfunction applyRecursiveOverlap(\n text: string,\n ranges: readonly TextRange[],\n maxSize: number,\n overlap: number,\n): readonly TextChunk[] {\n const boundaries = ranges.map((range) => range.end);\n const chunks: TextChunk[] = [];\n let start = 0;\n let previousEnd = 0;\n\n while (start < text.length) {\n const limit = Math.min(start + maxSize, text.length);\n const boundary = findLastBoundaryAtMost(boundaries, limit);\n const end = boundary !== undefined && boundary > previousEnd ? boundary : limit;\n\n chunks.push(createChunk(text, chunks.length, start, end));\n if (end === text.length) {\n break;\n }\n previousEnd = end;\n start = Math.max(0, end - overlap);\n }\n\n return chunks;\n}\n\nfunction findLastBoundaryAtMost(boundaries: readonly number[], limit: number): number | undefined {\n let low = 0;\n let high = boundaries.length;\n while (low < high) {\n const middle = low + Math.floor((high - low) / 2);\n if ((boundaries[middle] as number) <= limit) {\n low = middle + 1;\n } else {\n high = middle;\n }\n }\n return boundaries[low - 1];\n}\n\nfunction createChunk(text: string, index: number, start: number, end: number): TextChunk {\n return { index, text: text.slice(start, end), start, end };\n}\n","export type PdfTextPage = Readonly<{\n pageNumber: number;\n text: string;\n}>;\n\nexport type ExtractPdfTextOptions = Readonly<{\n data: Uint8Array;\n abortSignal?: AbortSignal;\n}>;\n\nexport type ExtractPdfTextResult = Readonly<{\n pages: readonly PdfTextPage[];\n}>;\n\nexport async function extractPdfText(\n options: ExtractPdfTextOptions,\n): Promise<ExtractPdfTextResult> {\n if (typeof options !== \"object\" || options === null) {\n throw new TypeError(\"extractPdfText options must be an object\");\n }\n if (!(options.data instanceof Uint8Array)) {\n throw new TypeError(\"extractPdfText data must be a Uint8Array\");\n }\n if (options.abortSignal !== undefined && !isAbortSignal(options.abortSignal)) {\n throw new TypeError(\"extractPdfText abortSignal must be an AbortSignal\");\n }\n\n const { abortSignal } = options;\n abortSignal?.throwIfAborted();\n const data = new Uint8Array(options.data);\n const pdfjs = await loadPdfjs();\n abortSignal?.throwIfAborted();\n\n const loadingTask = pdfjs.getDocument({ data });\n let destroyPromise: Promise<void> | undefined;\n const destroy = (): Promise<void> => {\n destroyPromise ??= loadingTask.destroy();\n return destroyPromise;\n };\n const abort = createAbortPromise(abortSignal, destroy);\n\n return runWithCleanup(\n async () => {\n const document = await abort.wait(loadingTask.promise);\n const pages: PdfTextPage[] = [];\n for (let pageNumber = 1; pageNumber <= document.numPages; pageNumber += 1) {\n abortSignal?.throwIfAborted();\n const page = await abort.wait(document.getPage(pageNumber));\n const content = await abort.wait(page.getTextContent());\n pages.push({ pageNumber, text: extractPageText(content.items) });\n }\n return { pages };\n },\n async () => {\n abort.dispose();\n await destroy();\n },\n );\n}\n\nasync function loadPdfjs(): Promise<typeof import(\"pdfjs-dist/legacy/build/pdf.mjs\")> {\n try {\n return await import(\"pdfjs-dist/legacy/build/pdf.mjs\");\n } catch (cause) {\n if (!isMissingPdfjsDependency(cause)) {\n throw cause;\n }\n throw new Error(\n 'PDF extraction requires the optional \"pdfjs-dist\" package. Install it in your application to use extractPdfText().',\n { cause },\n );\n }\n}\n\nfunction isMissingPdfjsDependency(error: unknown): boolean {\n const seen = new Set<unknown>();\n let current = error;\n while (current instanceof Error && !seen.has(current)) {\n seen.add(current);\n if (\n current.message.includes(\"pdfjs-dist\") &&\n \"code\" in current &&\n current.code === \"ERR_MODULE_NOT_FOUND\"\n ) {\n return true;\n }\n current = \"cause\" in current ? current.cause : undefined;\n }\n return false;\n}\n\nasync function runWithCleanup<Result>(\n operation: () => Promise<Result>,\n cleanup: () => Promise<void>,\n): Promise<Result> {\n let outcome: { ok: true; value: Result } | { ok: false; error: unknown };\n try {\n outcome = { ok: true, value: await operation() };\n } catch (error) {\n outcome = { ok: false, error };\n }\n\n let cleanupError: unknown;\n let cleanupFailed = false;\n try {\n await cleanup();\n } catch (error) {\n cleanupFailed = true;\n cleanupError = error;\n }\n\n if (!outcome.ok) {\n if (cleanupFailed) {\n throw new AggregateError(\n [outcome.error, cleanupError],\n \"PDF extraction and cleanup both failed\",\n { cause: outcome.error },\n );\n }\n throw outcome.error;\n }\n if (cleanupFailed) {\n throw cleanupError;\n }\n return outcome.value;\n}\n\nfunction isAbortSignal(value: unknown): value is AbortSignal {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const candidate = value as Partial<AbortSignal>;\n return (\n typeof candidate.aborted === \"boolean\" &&\n typeof candidate.addEventListener === \"function\" &&\n typeof candidate.removeEventListener === \"function\" &&\n typeof candidate.throwIfAborted === \"function\"\n );\n}\n\nfunction extractPageText(items: readonly unknown[]): string {\n let text = \"\";\n for (const item of items) {\n if (typeof item !== \"object\" || item === null) {\n throw new TypeError(\"PDF text content contains a malformed item\");\n }\n if (!(\"str\" in item)) {\n if (\n \"type\" in item &&\n (item.type === \"beginMarkedContent\" ||\n item.type === \"beginMarkedContentProps\" ||\n item.type === \"endMarkedContent\")\n ) {\n continue;\n }\n throw new TypeError(\"PDF text content contains an unknown non-text item\");\n }\n if (typeof item.str !== \"string\") {\n throw new TypeError(\"PDF text content item str must be a string\");\n }\n if (!(\"hasEOL\" in item) || typeof item.hasEOL !== \"boolean\") {\n throw new TypeError(\"PDF text content item hasEOL must be a boolean\");\n }\n text += item.str;\n if (item.hasEOL) {\n text += \"\\n\";\n }\n }\n return text;\n}\n\nfunction createAbortPromise(\n abortSignal: AbortSignal | undefined,\n destroy: () => Promise<void>,\n): {\n wait<T>(promise: Promise<T>): Promise<T>;\n dispose(): void;\n} {\n if (abortSignal === undefined) {\n return {\n wait: (promise) => promise,\n dispose: () => undefined,\n };\n }\n\n let rejectAbort: ((reason?: unknown) => void) | undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n rejectAbort = reject;\n });\n const onAbort = () => {\n void destroy();\n rejectAbort?.(\n abortSignal.reason ?? new DOMException(\"The operation was aborted\", \"AbortError\"),\n );\n };\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n if (abortSignal.aborted) {\n onAbort();\n }\n\n return {\n wait: (promise) => Promise.race([promise, aborted]),\n dispose: () => abortSignal.removeEventListener(\"abort\", onAbort),\n };\n}\n","import { chunkText } from \"./chunk-text\";\n\nexport type TextDocumentMetadata = Record<string, string | number | boolean>;\n\nexport type TextDocument<Metadata = TextDocumentMetadata> = Readonly<{\n id: string;\n text: string;\n metadata?: Metadata | undefined;\n}>;\n\nexport type TextDocumentChunk<Metadata = TextDocumentMetadata> = Readonly<{\n id: string;\n documentId: string;\n index: number;\n text: string;\n metadata?: Metadata | undefined;\n}>;\n\nexport type TextDocumentChunkingOptions =\n | Readonly<{ strategy: \"none\" }>\n | Readonly<{\n strategy: \"fixed\";\n maxSize: number;\n overlap?: number | undefined;\n }>\n | Readonly<{\n strategy: \"recursive\";\n maxSize: number;\n overlap?: number | undefined;\n separators: readonly string[];\n }>;\n\nexport type ChunkTextDocumentsOptions<Metadata = TextDocumentMetadata> = Readonly<{\n documents: readonly TextDocument<Metadata>[];\n chunking?: TextDocumentChunkingOptions | undefined;\n}>;\n\nexport function chunkTextDocuments<Metadata>(\n options: ChunkTextDocumentsOptions<Metadata>,\n): readonly TextDocumentChunk<Metadata>[] {\n if (typeof options !== \"object\" || options === null) {\n throw new TypeError(\"chunkTextDocuments options must contain a documents array\");\n }\n const documents = options.documents;\n if (!Array.isArray(documents)) {\n throw new TypeError(\"chunkTextDocuments options must contain a documents array\");\n }\n\n const ids = new Set<string>();\n const chunks: TextDocumentChunk<Metadata>[] = [];\n for (const document of documents as readonly TextDocument<Metadata>[]) {\n validateDocument(document, ids);\n chunks.push(...chunkDocument(document, options.chunking));\n }\n return chunks;\n}\n\nfunction validateDocument<Metadata>(document: TextDocument<Metadata>, ids: Set<string>): void {\n if (typeof document !== \"object\" || document === null) {\n throw new TypeError(\"Text documents must be objects\");\n }\n if (typeof document.id !== \"string\" || document.id.length === 0) {\n throw new TypeError(\"Text document ids must be non-empty strings\");\n }\n if (ids.has(document.id)) {\n throw new TypeError(`Duplicate text document id: ${document.id}`);\n }\n if (typeof document.text !== \"string\" || document.text.length === 0) {\n throw new TypeError(`Text document ${document.id} must contain non-empty text`);\n }\n ids.add(document.id);\n}\n\nfunction chunkDocument<Metadata>(\n document: TextDocument<Metadata>,\n chunking: TextDocumentChunkingOptions | undefined,\n): readonly TextDocumentChunk<Metadata>[] {\n if (chunking === undefined || chunking.strategy === \"none\") {\n return [createDocumentChunk(document, 0, document.text)];\n }\n\n const textChunks = chunkDocumentText(document.text, chunking);\n return textChunks.map((chunk) => createDocumentChunk(document, chunk.index, chunk.text));\n}\n\nfunction chunkDocumentText(\n text: string,\n chunking: Exclude<TextDocumentChunkingOptions, Readonly<{ strategy: \"none\" }>>,\n) {\n const overlap = chunking.overlap ?? 0;\n if (chunking.strategy === \"fixed\") {\n return chunkText({\n text,\n strategy: \"fixed\",\n maxSize: chunking.maxSize,\n overlap,\n });\n }\n return chunkText({\n text,\n strategy: \"recursive\",\n maxSize: chunking.maxSize,\n overlap,\n separators: chunking.separators,\n });\n}\n\nfunction createDocumentChunk<Metadata>(\n document: TextDocument<Metadata>,\n index: number,\n text: string,\n): TextDocumentChunk<Metadata> {\n const chunk = {\n id: `${document.id}:chunk:${index}`,\n documentId: document.id,\n index,\n text,\n };\n if (document.metadata === undefined) {\n return chunk;\n }\n return { ...chunk, metadata: document.metadata };\n}\n"],"mappings":"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","names":[]}
@@ -16,14 +16,14 @@ import {
16
16
  } from "./chunk-XMVOBX43.js";
17
17
  import {
18
18
  startAgentRunObservers
19
- } from "./chunk-GBCKSWQF.js";
19
+ } from "./chunk-AR2K73CJ.js";
20
20
  import {
21
21
  isSkillTool
22
22
  } from "./chunk-YK4WAAS4.js";
23
23
  import {
24
24
  isQuestionTool,
25
25
  isToolIndex
26
- } from "./chunk-EO2GECYH.js";
26
+ } from "./chunk-OIB3URVG.js";
27
27
  import {
28
28
  ToolNotFoundError,
29
29
  ToolOutput,
@@ -38,7 +38,7 @@ import {
38
38
  retrieveDocuments,
39
39
  toolMayRequireApproval,
40
40
  toolResultContentToText
41
- } from "./chunk-YFJ4NHV6.js";
41
+ } from "./chunk-LZD36ZAP.js";
42
42
  import {
43
43
  AgentRunBlockedError,
44
44
  AgentRunCancelledError,
@@ -3272,6 +3272,7 @@ var AgentRun = class _AgentRun {
3272
3272
  messages: lifecycleSnapshot(messages)
3273
3273
  }),
3274
3274
  () => runObservers?.error({
3275
+ status: reportedError instanceof AgentRunCancelledError ? "cancelled" : "failed",
3275
3276
  error: reportedError,
3276
3277
  usage,
3277
3278
  messages: [...messages]
@@ -3285,8 +3286,9 @@ var AgentRun = class _AgentRun {
3285
3286
  await this.runRunErrorHook(error, usage, messages);
3286
3287
  } catch {
3287
3288
  }
3288
- await this.runLifecycleError(error, runId, usage, messages);
3289
- return error;
3289
+ const reportedError = this.cancellationError ?? error;
3290
+ await this.runLifecycleError(reportedError, runId, usage, messages);
3291
+ return reportedError;
3290
3292
  }
3291
3293
  async runOutputGuardrailsForResponse(runId, usage, response, messages, runObservers) {
3292
3294
  const originalOutput = textFromAssistantContent(response.choice);
@@ -4770,4 +4772,4 @@ export {
4770
4772
  markResolvedAgentOptions,
4771
4773
  Agent
4772
4774
  };
4773
- //# sourceMappingURL=chunk-E2J7MLAB.js.map
4775
+ //# sourceMappingURL=chunk-5TIXGU5U.js.map