@cogitator-ai/rag 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/README.md +66 -31
  2. package/dist/chunkers/create-chunker.js.map +1 -1
  3. package/dist/chunkers/index.d.ts.map +1 -1
  4. package/dist/chunkers/index.js.map +1 -1
  5. package/dist/chunkers/recursive-chunker.d.ts +2 -3
  6. package/dist/chunkers/recursive-chunker.d.ts.map +1 -1
  7. package/dist/chunkers/recursive-chunker.js +89 -118
  8. package/dist/chunkers/recursive-chunker.js.map +1 -1
  9. package/dist/chunkers/semantic-chunker.d.ts +2 -0
  10. package/dist/chunkers/semantic-chunker.d.ts.map +1 -1
  11. package/dist/chunkers/semantic-chunker.js +72 -38
  12. package/dist/chunkers/semantic-chunker.js.map +1 -1
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/loaders/csv-loader.d.ts.map +1 -1
  18. package/dist/loaders/csv-loader.js +12 -4
  19. package/dist/loaders/csv-loader.js.map +1 -1
  20. package/dist/loaders/html-loader.d.ts +4 -0
  21. package/dist/loaders/html-loader.d.ts.map +1 -1
  22. package/dist/loaders/html-loader.js +26 -2
  23. package/dist/loaders/html-loader.js.map +1 -1
  24. package/dist/loaders/index.d.ts.map +1 -1
  25. package/dist/loaders/index.js.map +1 -1
  26. package/dist/loaders/json-loader.d.ts +1 -0
  27. package/dist/loaders/json-loader.d.ts.map +1 -1
  28. package/dist/loaders/json-loader.js +15 -3
  29. package/dist/loaders/json-loader.js.map +1 -1
  30. package/dist/loaders/markdown-loader.d.ts.map +1 -1
  31. package/dist/loaders/markdown-loader.js +8 -4
  32. package/dist/loaders/markdown-loader.js.map +1 -1
  33. package/dist/loaders/pdf-loader.d.ts +1 -0
  34. package/dist/loaders/pdf-loader.d.ts.map +1 -1
  35. package/dist/loaders/pdf-loader.js +22 -3
  36. package/dist/loaders/pdf-loader.js.map +1 -1
  37. package/dist/loaders/text-loader.js +1 -1
  38. package/dist/loaders/text-loader.js.map +1 -1
  39. package/dist/loaders/web-loader.d.ts +33 -0
  40. package/dist/loaders/web-loader.d.ts.map +1 -1
  41. package/dist/loaders/web-loader.js +262 -8
  42. package/dist/loaders/web-loader.js.map +1 -1
  43. package/dist/rag-builder.d.ts +10 -1
  44. package/dist/rag-builder.d.ts.map +1 -1
  45. package/dist/rag-builder.js +71 -6
  46. package/dist/rag-builder.js.map +1 -1
  47. package/dist/rag-pipeline.d.ts +2 -1
  48. package/dist/rag-pipeline.d.ts.map +1 -1
  49. package/dist/rag-pipeline.js +58 -23
  50. package/dist/rag-pipeline.js.map +1 -1
  51. package/dist/rerankers/cohere-reranker.d.ts +2 -2
  52. package/dist/rerankers/cohere-reranker.d.ts.map +1 -1
  53. package/dist/rerankers/cohere-reranker.js +5 -0
  54. package/dist/rerankers/cohere-reranker.js.map +1 -1
  55. package/dist/rerankers/index.d.ts.map +1 -1
  56. package/dist/rerankers/index.js.map +1 -1
  57. package/dist/rerankers/llm-reranker.d.ts +1 -1
  58. package/dist/rerankers/llm-reranker.d.ts.map +1 -1
  59. package/dist/rerankers/llm-reranker.js +26 -13
  60. package/dist/rerankers/llm-reranker.js.map +1 -1
  61. package/dist/retrievers/chunk-indexer.d.ts +19 -0
  62. package/dist/retrievers/chunk-indexer.d.ts.map +1 -0
  63. package/dist/retrievers/chunk-indexer.js +8 -0
  64. package/dist/retrievers/chunk-indexer.js.map +1 -0
  65. package/dist/retrievers/create-retriever.d.ts +2 -0
  66. package/dist/retrievers/create-retriever.d.ts.map +1 -1
  67. package/dist/retrievers/create-retriever.js +6 -0
  68. package/dist/retrievers/create-retriever.js.map +1 -1
  69. package/dist/retrievers/hybrid-retriever.d.ts +8 -1
  70. package/dist/retrievers/hybrid-retriever.d.ts.map +1 -1
  71. package/dist/retrievers/hybrid-retriever.js +18 -5
  72. package/dist/retrievers/hybrid-retriever.js.map +1 -1
  73. package/dist/retrievers/index.d.ts +2 -0
  74. package/dist/retrievers/index.d.ts.map +1 -1
  75. package/dist/retrievers/index.js +1 -0
  76. package/dist/retrievers/index.js.map +1 -1
  77. package/dist/retrievers/mmr-retriever.d.ts +5 -0
  78. package/dist/retrievers/mmr-retriever.d.ts.map +1 -1
  79. package/dist/retrievers/mmr-retriever.js +34 -8
  80. package/dist/retrievers/mmr-retriever.js.map +1 -1
  81. package/dist/retrievers/multi-query-retriever.d.ts +14 -1
  82. package/dist/retrievers/multi-query-retriever.d.ts.map +1 -1
  83. package/dist/retrievers/multi-query-retriever.js +50 -6
  84. package/dist/retrievers/multi-query-retriever.js.map +1 -1
  85. package/dist/retrievers/similarity-retriever.d.ts.map +1 -1
  86. package/dist/retrievers/similarity-retriever.js +2 -1
  87. package/dist/retrievers/similarity-retriever.js.map +1 -1
  88. package/dist/schema.d.ts.map +1 -1
  89. package/dist/schema.js +16 -2
  90. package/dist/schema.js.map +1 -1
  91. package/dist/tools.d.ts +11 -2
  92. package/dist/tools.d.ts.map +1 -1
  93. package/dist/tools.js +43 -9
  94. package/dist/tools.js.map +1 -1
  95. package/package.json +5 -5
package/README.md CHANGED
@@ -52,23 +52,42 @@ await pipeline.ingest('./docs');
52
52
  const results = await pipeline.query('How does authentication work?');
53
53
 
54
54
  for (const r of results) {
55
- console.log(`[${r.score.toFixed(3)}] ${r.content.slice(0, 100)}...`);
55
+ console.log(`[${r.score.toFixed(3)}] ${r.source}: ${r.content.slice(0, 100)}...`);
56
56
  }
57
57
  ```
58
58
 
59
+ Every stored chunk carries the document's loader metadata (e.g. Markdown frontmatter, PDF page numbers, CSV metadata columns, page title/URL) plus `documentId`, `source`, `sourceType`, `order`, `startOffset` and `endOffset`. Retrieval results expose the document path/URL as `result.source` and the rest in `result.metadata`.
60
+
59
61
  ---
60
62
 
61
63
  ## Document Loaders
62
64
 
63
- | Loader | Formats | Optional Dep | Notes |
64
- | ---------------- | --------------------- | ------------ | ----------------------------- |
65
- | `TextLoader` | `.txt` | — | Files and directories |
66
- | `MarkdownLoader` | `.md` | — | Strips frontmatter by default |
67
- | `JSONLoader` | `.json` | — | Configurable content field |
68
- | `CSVLoader` | `.csv` | `papaparse` | Column selection, row mapping |
69
- | `HTMLLoader` | `.html`, `.htm` | `cheerio` | CSS selector support |
70
- | `PDFLoader` | `.pdf` | `pdf-parse` | Text extraction from PDFs |
71
- | `WebLoader` | `http://`, `https://` | `cheerio` | Fetches and parses web pages |
65
+ | Loader | Formats | Optional Dep | Notes |
66
+ | ---------------- | --------------------- | ------------ | ------------------------------------------------------ |
67
+ | `TextLoader` | `.txt` | — | Files and directories |
68
+ | `MarkdownLoader` | `.md`, `.mdx` | — | Optional frontmatter -> metadata |
69
+ | `JSONLoader` | `.json` | — | Configurable content field |
70
+ | `CSVLoader` | `.csv` | `papaparse` | Column selection, `row` number in metadata |
71
+ | `HTMLLoader` | `.html`, `.htm` | `cheerio` | CSS selector, scripts/styles removed, block-aware text |
72
+ | `PDFLoader` | `.pdf` | `pdf-parse` | Whole document or one document per page |
73
+ | `WebLoader` | `http://`, `https://` | `cheerio` | HTML, plain text and JSON pages; SSRF-protected |
74
+
75
+ Directory sources (`TextLoader`, `MarkdownLoader`) are loaded in sorted file-name order.
76
+
77
+ ### WebLoader security
78
+
79
+ `WebLoader` blocks loopback, private, link-local, CGNAT, multicast and cloud-metadata addresses — including IPv4-mapped IPv6 forms and hostnames that **resolve** to such addresses. The check runs at connect time for every redirect hop, so DNS rebinding cannot bypass it. To ingest an intranet site, opt in explicitly:
80
+
81
+ ```typescript
82
+ const intranet = new WebLoader({
83
+ allowPrivateNetwork: true,
84
+ headers: { Authorization: `Bearer ${process.env.WIKI_TOKEN}` },
85
+ timeoutMs: 15_000,
86
+ maxResponseBytes: 10 * 1024 * 1024,
87
+ });
88
+ ```
89
+
90
+ Responses are decompressed (gzip, deflate, br), decoded using the declared charset, and limited to `maxResponseBytes` (50MB by default). Non-text content types are rejected.
72
91
 
73
92
  ```typescript
74
93
  import { MarkdownLoader, WebLoader, CSVLoader } from '@cogitator-ai/rag';
@@ -101,7 +120,7 @@ const chunks = chunker.chunk(text, documentId);
101
120
 
102
121
  ### Recursive
103
122
 
104
- Splits on configurable separators (`\n\n`, `\n`, `. `, ` `) trying to keep paragraphs and sentences intact.
123
+ Splits on configurable separators (`\n\n`, `\n`, `. `, ` `) trying to keep paragraphs and sentences intact. Chunk offsets always point into the original text, chunks never exceed `chunkSize`, sentence punctuation is kept and overlap never produces a chunk fully contained in the previous one.
105
124
 
106
125
  ```typescript
107
126
  import { RecursiveChunker } from '@cogitator-ai/rag';
@@ -115,7 +134,7 @@ const chunker = new RecursiveChunker({
115
134
 
116
135
  ### Semantic
117
136
 
118
- Uses embedding similarity between sentences to find natural breakpoints. Async — requires an `EmbeddingService`.
137
+ Uses embedding similarity between sentences (and blank-line separated blocks) to find natural breakpoints. Async — requires an `EmbeddingService`.
119
138
 
120
139
  ```typescript
121
140
  import { SemanticChunker } from '@cogitator-ai/rag';
@@ -152,6 +171,29 @@ const chunker = createChunker(
152
171
  | `hybrid` | `HybridRetriever` | Combines BM25 keyword search with vector search (RRF) |
153
172
  | `multi-query` | `MultiQueryRetriever` | Expands query into variants, merges results |
154
173
 
174
+ `RAGPipelineBuilder` builds the retriever matching `retrieval.strategy` when no custom `withRetriever()` is given:
175
+
176
+ ```typescript
177
+ const pipeline = new RAGPipelineBuilder()
178
+ .withLoader(loader)
179
+ .withEmbeddingService(embeddingService)
180
+ .withEmbeddingAdapter(embeddingAdapter)
181
+ .withHybridSearch(new HybridSearch({ embeddingAdapter, embeddingService })) // 'hybrid'
182
+ .withQueryExpander(expandWithLLM) // 'multi-query'
183
+ .withConfig({
184
+ chunking: { strategy: 'recursive', chunkSize: 500, chunkOverlap: 50 },
185
+ retrieval: { strategy: 'multi-query', multiQueryCount: 3, topK: 5 },
186
+ })
187
+ .build();
188
+ ```
189
+
190
+ | Strategy | Builder requirement | Config used |
191
+ | ------------- | ------------------------------------------ | --------------------------------------------------------------------------------------------------------------- |
192
+ | `similarity` | — | `topK`, `threshold` |
193
+ | `mmr` | — | `mmrLambda`, `topK`, `threshold` |
194
+ | `hybrid` | `withHybridSearch(hybridSearch, weights?)` | `topK`, `threshold` |
195
+ | `multi-query` | `withQueryExpander(fn)` | `multiQueryCount` (max variants), `topK`; base is hybrid when `withHybridSearch()` is set, similarity otherwise |
196
+
155
197
  ### Similarity
156
198
 
157
199
  ```typescript
@@ -169,7 +211,7 @@ const results = await retriever.retrieve('What is TypeScript?');
169
211
 
170
212
  ### MMR
171
213
 
172
- Reduces redundancy by penalizing results that are too similar to already-selected ones.
214
+ Reduces redundancy by penalizing results that are too similar to already-selected ones. If the vector store does not return stored vectors (e.g. Qdrant), candidates are re-embedded to compute diversity.
173
215
 
174
216
  ```typescript
175
217
  import { MMRRetriever } from '@cogitator-ai/rag';
@@ -184,7 +226,7 @@ const retriever = new MMRRetriever({
184
226
 
185
227
  ### Hybrid
186
228
 
187
- Requires `HybridSearch` from `@cogitator-ai/memory`.
229
+ Requires `HybridSearch` from `@cogitator-ai/memory`. Chunks ingested through `RAGPipeline` are added to the HybridSearch BM25 index automatically (any retriever implementing `ChunkIndexer.indexChunk()` is notified on ingest), and keyword-only hits are mapped back to their chunk, document and metadata.
188
230
 
189
231
  ```typescript
190
232
  import { HybridRetriever } from '@cogitator-ai/rag';
@@ -198,7 +240,7 @@ const retriever = new HybridRetriever({
198
240
 
199
241
  ### Multi-Query
200
242
 
201
- Generates query variations and merges results. You provide the expansion function (typically an LLM call).
243
+ Generates query variations and merges results (best score per chunk). You provide the expansion function (typically an LLM call). The original query is always searched; variants are de-duplicated and capped by `defaultMaxQueries` / `multiQueryCount`. If expansion fails the original query is used alone; if every retrieval fails the error is thrown.
202
244
 
203
245
  ```typescript
204
246
  import { MultiQueryRetriever } from '@cogitator-ai/rag';
@@ -211,6 +253,7 @@ const retriever = new MultiQueryRetriever({
211
253
  );
212
254
  return response.split('\n').filter(Boolean);
213
255
  },
256
+ defaultMaxQueries: 3,
214
257
  });
215
258
  ```
216
259
 
@@ -279,9 +322,8 @@ Use `ragTools()` to give a Cogitator agent access to your knowledge base.
279
322
 
280
323
  ```typescript
281
324
  import { Agent, tool } from '@cogitator-ai/core';
282
- import { RAGPipelineBuilder, TextLoader, createSearchTool } from '@cogitator-ai/rag';
325
+ import { RAGPipelineBuilder, TextLoader, ragTools } from '@cogitator-ai/rag';
283
326
  import { InMemoryEmbeddingAdapter, OpenAIEmbeddingService } from '@cogitator-ai/memory';
284
- import { z } from 'zod';
285
327
 
286
328
  const pipeline = new RAGPipelineBuilder()
287
329
  .withLoader(new TextLoader())
@@ -295,27 +337,20 @@ const pipeline = new RAGPipelineBuilder()
295
337
 
296
338
  await pipeline.ingest('./knowledge-base');
297
339
 
298
- const ragSearch = createSearchTool(pipeline);
299
-
300
- const searchKB = tool({
301
- name: ragSearch.name,
302
- description: ragSearch.description,
303
- parameters: z.object({
304
- query: z.string().describe('Search query'),
305
- limit: z.number().int().positive().optional(),
306
- threshold: z.number().min(0).max(1).optional(),
307
- }),
308
- execute: async (params) => ragSearch.execute(params),
309
- });
340
+ const [ragSearch, ragIngest] = ragTools(pipeline, { allowedRoots: ['./knowledge-base'] });
310
341
 
311
342
  const agent = new Agent({
312
343
  name: 'docs-assistant',
313
- model: 'gpt-4o',
344
+ model: 'openai/gpt-4o',
314
345
  instructions: 'Use rag_search to find information before answering.',
315
- tools: [searchKB],
346
+ tools: [tool(ragSearch), tool(ragIngest)],
316
347
  });
317
348
  ```
318
349
 
350
+ `RAGTool` objects carry Zod parameter schemas and can be passed to `tool()` directly. `rag_search` falls back to the pipeline's configured `topK`/`threshold` when the model omits `limit`/`threshold`.
351
+
352
+ **Security:** `rag_ingest` reads whatever source the model passes. When the tool is exposed to an LLM, restrict it with `allowedRoots` (paths are canonicalized, so `..` traversal and symlink escapes are rejected) and `allowUrls: false` if web ingestion is not needed. URL ingestion goes through the SSRF-protected `WebLoader` when the pipeline uses one.
353
+
319
354
  ---
320
355
 
321
356
  ## Pipeline Stats
@@ -1 +1 @@
1
- {"version":3,"file":"create-chunker.js","sourceRoot":"","sources":["../../src/chunkers/create-chunker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,UAAU,aAAa,CAC3B,MAAsB,EACtB,gBAAmC;IAEnC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC,CAAC;QAEL,KAAK,WAAW;YACd,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QAEL,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,IAAI,eAAe,CAAC;gBACzB,gBAAgB;gBAChB,YAAY,EAAE,MAAM,CAAC,SAAS;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC,QAAQ,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"create-chunker.js","sourceRoot":"","sources":["../../src/chunkers/create-chunker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,UAAU,aAAa,CAC3B,MAAsB,EACtB,gBAAmC;IAEnC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC,CAAC;QAEL,KAAK,WAAW;YACd,OAAO,IAAI,gBAAgB,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QAEL,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,IAAI,eAAe,CAAC;gBACzB,gBAAgB;gBAChB,YAAY,EAAE,MAAM,CAAC,SAAS;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC,QAAQ,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgC,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAgC,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,eAAe,EAA+B,MAAM,oBAAoB,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunkers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgC,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAgC,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,eAAe,EAA+B,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -10,9 +10,8 @@ export declare class RecursiveChunker implements Chunker {
10
10
  private readonly separators;
11
11
  constructor(options: RecursiveChunkerOptions);
12
12
  chunk(text: string, documentId: string): DocumentChunk[];
13
- private splitText;
13
+ private mergePieces;
14
+ private splitSpan;
14
15
  private charSplit;
15
- private mergeWithOverlap;
16
- private mergeWithOverlapSimple;
17
16
  }
18
17
  //# sourceMappingURL=recursive-chunker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recursive-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIlE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;gBAE1B,OAAO,EAAE,uBAAuB;IAe5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;IAOxD,OAAO,CAAC,SAAS;IA+CjB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,gBAAgB;IAwFxB,OAAO,CAAC,sBAAsB;CAwB/B"}
1
+ {"version":3,"file":"recursive-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIlE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,OAAO;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;gBAE1B,OAAO,EAAE,uBAAuB;IAe5C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;IAOxD,OAAO,CAAC,WAAW;IAwCnB,OAAO,CAAC,SAAS;IAyDjB,OAAO,CAAC,SAAS;CAOlB"}
@@ -21,141 +21,112 @@ export class RecursiveChunker {
21
21
  chunk(text, documentId) {
22
22
  if (text.length === 0)
23
23
  return [];
24
- const texts = this.splitText(text, 0);
25
- return this.mergeWithOverlap(texts, documentId);
24
+ const pieces = this.splitSpan(text, { start: 0, end: text.length }, 0);
25
+ return this.mergePieces(pieces, text, documentId);
26
26
  }
27
- splitText(text, separatorIndex) {
28
- if (text.length <= this.chunkSize)
29
- return [text];
30
- if (separatorIndex >= this.separators.length) {
31
- return this.charSplit(text);
27
+ mergePieces(pieces, text, documentId) {
28
+ const chunks = [];
29
+ let i = 0;
30
+ while (i < pieces.length) {
31
+ const chunkStart = pieces[i].start;
32
+ let j = i + 1;
33
+ while (j < pieces.length && pieces[j].end - chunkStart <= this.chunkSize) {
34
+ j++;
35
+ }
36
+ const chunkEnd = pieces[j - 1].end;
37
+ chunks.push({
38
+ id: nanoid(),
39
+ documentId,
40
+ content: text.slice(chunkStart, chunkEnd),
41
+ startOffset: chunkStart,
42
+ endOffset: chunkEnd,
43
+ order: chunks.length,
44
+ });
45
+ if (j >= pieces.length)
46
+ break;
47
+ let next = j;
48
+ if (this.chunkOverlap > 0) {
49
+ const overlapTarget = chunkEnd - this.chunkOverlap;
50
+ while (next > i + 1 && pieces[next - 1].start >= overlapTarget) {
51
+ next--;
52
+ }
53
+ while (next < j && pieces[j].end - pieces[next].start > this.chunkSize) {
54
+ next++;
55
+ }
56
+ }
57
+ i = next;
32
58
  }
33
- const separator = this.separators[separatorIndex];
34
- if (separator === '') {
35
- return this.charSplit(text);
59
+ return chunks;
60
+ }
61
+ splitSpan(text, span, separatorIndex) {
62
+ const trimmed = trimSpan(text, span);
63
+ if (!trimmed)
64
+ return [];
65
+ if (trimmed.end - trimmed.start <= this.chunkSize)
66
+ return [trimmed];
67
+ let index = separatorIndex;
68
+ while (index < this.separators.length) {
69
+ const separator = this.separators[index];
70
+ if (separator === '')
71
+ break;
72
+ if (text.slice(trimmed.start, trimmed.end).includes(separator))
73
+ break;
74
+ index++;
36
75
  }
37
- const parts = text.split(separator);
38
- if (parts.length === 1) {
39
- return this.splitText(text, separatorIndex + 1);
76
+ const separator = this.separators[index];
77
+ if (separator === undefined || separator === '') {
78
+ return this.charSplit(trimmed);
79
+ }
80
+ const kept = /^\S*/.exec(separator)[0].length;
81
+ const segments = [];
82
+ let cursor = trimmed.start;
83
+ for (;;) {
84
+ const at = text.indexOf(separator, cursor);
85
+ if (at === -1 || at >= trimmed.end) {
86
+ segments.push({ start: cursor, end: trimmed.end });
87
+ break;
88
+ }
89
+ segments.push({ start: cursor, end: Math.min(at + kept, trimmed.end) });
90
+ cursor = at + separator.length;
40
91
  }
41
92
  const merged = [];
42
- let current = '';
43
- for (const part of parts) {
44
- if (part.length === 0)
93
+ let current = null;
94
+ for (const raw of segments) {
95
+ const segment = trimSpan(text, raw);
96
+ if (!segment)
45
97
  continue;
46
- const candidate = current ? current + separator + part : part;
47
- if (candidate.length <= this.chunkSize) {
48
- current = candidate;
98
+ if (current && segment.end - current.start <= this.chunkSize) {
99
+ current = { start: current.start, end: segment.end };
100
+ continue;
101
+ }
102
+ if (current)
103
+ merged.push(current);
104
+ if (segment.end - segment.start > this.chunkSize) {
105
+ merged.push(...this.splitSpan(text, segment, index + 1));
106
+ current = null;
49
107
  }
50
108
  else {
51
- if (current)
52
- merged.push(current);
53
- if (part.length > this.chunkSize) {
54
- const subParts = this.splitText(part, separatorIndex + 1);
55
- merged.push(...subParts);
56
- current = '';
57
- }
58
- else {
59
- current = part;
60
- }
109
+ current = segment;
61
110
  }
62
111
  }
63
112
  if (current)
64
113
  merged.push(current);
65
114
  return merged;
66
115
  }
67
- charSplit(text) {
116
+ charSplit(span) {
68
117
  const result = [];
69
- for (let i = 0; i < text.length; i += this.chunkSize) {
70
- result.push(text.slice(i, i + this.chunkSize));
118
+ for (let start = span.start; start < span.end; start += this.chunkSize) {
119
+ result.push({ start, end: Math.min(start + this.chunkSize, span.end) });
71
120
  }
72
121
  return result;
73
122
  }
74
- mergeWithOverlap(texts, documentId) {
75
- if (this.chunkOverlap === 0) {
76
- let offset = 0;
77
- return texts.map((content, i) => {
78
- const chunk = {
79
- id: nanoid(),
80
- documentId,
81
- content,
82
- startOffset: offset,
83
- endOffset: offset + content.length,
84
- order: i,
85
- };
86
- offset += content.length;
87
- return chunk;
88
- });
89
- }
90
- const joined = texts.join('');
91
- const chunks = [];
92
- let order = 0;
93
- let textIndex = 0;
94
- let i = 0;
95
- while (i < texts.length) {
96
- let content = texts[i];
97
- let consumed = 1;
98
- while (i + consumed < texts.length) {
99
- const next = content + texts[i + consumed];
100
- if (next.length <= this.chunkSize) {
101
- content = next;
102
- consumed++;
103
- }
104
- else {
105
- break;
106
- }
107
- }
108
- const startOffset = joined.indexOf(content, textIndex > 0 ? Math.max(0, textIndex - this.chunkOverlap) : 0);
109
- chunks.push({
110
- id: nanoid(),
111
- documentId,
112
- content,
113
- startOffset: startOffset >= 0 ? startOffset : textIndex,
114
- endOffset: (startOffset >= 0 ? startOffset : textIndex) + content.length,
115
- order: order++,
116
- });
117
- textIndex += content.length;
118
- const overlapChars = Math.min(this.chunkOverlap, content.length);
119
- const overlapText = content.slice(content.length - overlapChars);
120
- i += consumed;
121
- if (i < texts.length) {
122
- const remaining = texts.slice(i);
123
- const withOverlap = overlapText + remaining.join('');
124
- if (withOverlap.length <= this.chunkSize) {
125
- chunks.push({
126
- id: nanoid(),
127
- documentId,
128
- content: withOverlap,
129
- startOffset: textIndex - overlapChars,
130
- endOffset: textIndex - overlapChars + withOverlap.length,
131
- order: order++,
132
- });
133
- break;
134
- }
135
- const reSplit = this.splitText(withOverlap, 0);
136
- const subChunks = this.mergeWithOverlapSimple(reSplit, documentId, textIndex - overlapChars, order);
137
- chunks.push(...subChunks);
138
- break;
139
- }
140
- }
141
- return chunks;
142
- }
143
- mergeWithOverlapSimple(texts, documentId, baseOffset, startOrder) {
144
- const chunks = [];
145
- let offset = baseOffset;
146
- let order = startOrder;
147
- for (const content of texts) {
148
- chunks.push({
149
- id: nanoid(),
150
- documentId,
151
- content,
152
- startOffset: offset,
153
- endOffset: offset + content.length,
154
- order: order++,
155
- });
156
- offset += content.length;
157
- }
158
- return chunks;
159
- }
123
+ }
124
+ function trimSpan(text, span) {
125
+ let { start, end } = span;
126
+ while (start < end && /\s/.test(text[start]))
127
+ start++;
128
+ while (end > start && /\s/.test(text[end - 1]))
129
+ end--;
130
+ return start < end ? { start, end } : null;
160
131
  }
161
132
  //# sourceMappingURL=recursive-chunker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recursive-chunker.js","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recursive-chunker.js","sourceRoot":"","sources":["../../src/chunkers/recursive-chunker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;AAQzD,MAAM,OAAO,gBAAgB;IACV,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,UAAU,CAAW;IAEtC,YAAY,OAAgC;QAC1C,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,UAAkB;QACpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACpD,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,UAAkB;QAClE,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;YAEpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1E,CAAC,EAAE,CAAC;YACN,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,MAAM,EAAE;gBACZ,UAAU;gBACV,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC;gBACzC,WAAW,EAAE,UAAU;gBACvB,SAAS,EAAE,QAAQ;gBACnB,KAAK,EAAE,MAAM,CAAC,MAAM;aACrB,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM;YAE9B,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,aAAa,GAAG,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC;gBACnD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC;oBAChE,IAAI,EAAE,CAAC;gBACT,CAAC;gBACD,OAAO,IAAI,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;oBACzE,IAAI,EAAE,CAAC;gBACT,CAAC;YACH,CAAC;YACD,CAAC,GAAG,IAAI,CAAC;QACX,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,SAAS,CAAC,IAAY,EAAE,IAAU,EAAE,cAAsB;QAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAEpE,IAAI,KAAK,GAAG,cAAc,CAAC;QAC3B,OAAO,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAE,CAAC;YAC1C,IAAI,SAAS,KAAK,EAAE;gBAAE,MAAM;YAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAAE,MAAM;YACtE,KAAK,EAAE,CAAC;QACV,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/C,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,IAAI,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,SAAS,CAAC;YACR,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC3C,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;gBACnD,MAAM;YACR,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM,GAAG,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC;QACjC,CAAC;QAED,MAAM,MAAM,GAAW,EAAE,CAAC;QAC1B,IAAI,OAAO,GAAgB,IAAI,CAAC;QAEhC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC7D,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;gBACrD,SAAS;YACX,CAAC;YAED,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAElC,IAAI,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBACzD,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,OAAO,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,SAAS,CAAC,IAAU;QAC1B,MAAM,MAAM,GAAW,EAAE,CAAC;QAC1B,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAOD,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAU;IACxC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1B,OAAO,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;QAAE,KAAK,EAAE,CAAC;IACvD,OAAO,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC;QAAE,GAAG,EAAE,CAAC;IACvD,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC"}
@@ -13,7 +13,9 @@ export declare class SemanticChunker implements AsyncChunker {
13
13
  constructor(options: SemanticChunkerOptions);
14
14
  chunk(text: string, documentId: string): Promise<DocumentChunk[]>;
15
15
  private mergeSmallGroups;
16
+ private findSentenceOffset;
16
17
  private buildChunks;
17
18
  private splitLargeGroup;
19
+ private emitSentenceGroup;
18
20
  }
19
21
  //# sourceMappingURL=semantic-chunker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/semantic-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyBD,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,EAAE,sBAAsB;IAOrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAkCvE,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,WAAW;IA8CnB,OAAO,CAAC,eAAe;CA8DxB"}
1
+ {"version":3,"file":"semantic-chunker.d.ts","sourceRoot":"","sources":["../../src/chunkers/semantic-chunker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA8BD,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,EAAE,sBAAsB;IAqBrC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAuCvE,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,WAAW;IA4CnB,OAAO,CAAC,eAAe;IA2EvB,OAAO,CAAC,iBAAiB;CAqB1B"}