@ssmeo/mcp-local-rag 0.18.6

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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.de.md +441 -0
  3. package/README.es.md +441 -0
  4. package/README.fr.md +441 -0
  5. package/README.md +530 -0
  6. package/README.pt-BR.md +441 -0
  7. package/README.zh-CN.md +441 -0
  8. package/dist/bin/install-skills.d.ts +19 -0
  9. package/dist/bin/install-skills.d.ts.map +1 -0
  10. package/dist/bin/install-skills.js +218 -0
  11. package/dist/bin/install-skills.js.map +1 -0
  12. package/dist/chunker/index.d.ts +24 -0
  13. package/dist/chunker/index.d.ts.map +1 -0
  14. package/dist/chunker/index.js +2 -0
  15. package/dist/chunker/index.js.map +1 -0
  16. package/dist/chunker/semantic-chunker.d.ts +96 -0
  17. package/dist/chunker/semantic-chunker.d.ts.map +1 -0
  18. package/dist/chunker/semantic-chunker.js +362 -0
  19. package/dist/chunker/semantic-chunker.js.map +1 -0
  20. package/dist/chunker/sentence-splitter.d.ts +32 -0
  21. package/dist/chunker/sentence-splitter.d.ts.map +1 -0
  22. package/dist/chunker/sentence-splitter.js +231 -0
  23. package/dist/chunker/sentence-splitter.js.map +1 -0
  24. package/dist/chunker/token-containment.d.ts +39 -0
  25. package/dist/chunker/token-containment.d.ts.map +1 -0
  26. package/dist/chunker/token-containment.js +83 -0
  27. package/dist/chunker/token-containment.js.map +1 -0
  28. package/dist/cli/common.d.ts +34 -0
  29. package/dist/cli/common.d.ts.map +1 -0
  30. package/dist/cli/common.js +121 -0
  31. package/dist/cli/common.js.map +1 -0
  32. package/dist/cli/delete.d.ts +3 -0
  33. package/dist/cli/delete.d.ts.map +1 -0
  34. package/dist/cli/delete.js +169 -0
  35. package/dist/cli/delete.js.map +1 -0
  36. package/dist/cli/file-collection.d.ts +2 -0
  37. package/dist/cli/file-collection.d.ts.map +1 -0
  38. package/dist/cli/file-collection.js +53 -0
  39. package/dist/cli/file-collection.js.map +1 -0
  40. package/dist/cli/ingest.d.ts +69 -0
  41. package/dist/cli/ingest.d.ts.map +1 -0
  42. package/dist/cli/ingest.js +323 -0
  43. package/dist/cli/ingest.js.map +1 -0
  44. package/dist/cli/list.d.ts +27 -0
  45. package/dist/cli/list.d.ts.map +1 -0
  46. package/dist/cli/list.js +207 -0
  47. package/dist/cli/list.js.map +1 -0
  48. package/dist/cli/options.d.ts +89 -0
  49. package/dist/cli/options.d.ts.map +1 -0
  50. package/dist/cli/options.js +244 -0
  51. package/dist/cli/options.js.map +1 -0
  52. package/dist/cli/query.d.ts +17 -0
  53. package/dist/cli/query.d.ts.map +1 -0
  54. package/dist/cli/query.js +194 -0
  55. package/dist/cli/query.js.map +1 -0
  56. package/dist/cli/read-neighbors.d.ts +3 -0
  57. package/dist/cli/read-neighbors.d.ts.map +1 -0
  58. package/dist/cli/read-neighbors.js +192 -0
  59. package/dist/cli/read-neighbors.js.map +1 -0
  60. package/dist/cli/status.d.ts +6 -0
  61. package/dist/cli/status.d.ts.map +1 -0
  62. package/dist/cli/status.js +78 -0
  63. package/dist/cli/status.js.map +1 -0
  64. package/dist/cli/sync.d.ts +6 -0
  65. package/dist/cli/sync.d.ts.map +1 -0
  66. package/dist/cli/sync.js +271 -0
  67. package/dist/cli/sync.js.map +1 -0
  68. package/dist/cli-main.d.ts +9 -0
  69. package/dist/cli-main.d.ts.map +1 -0
  70. package/dist/cli-main.js +60 -0
  71. package/dist/cli-main.js.map +1 -0
  72. package/dist/embedder/index.d.ts +143 -0
  73. package/dist/embedder/index.d.ts.map +1 -0
  74. package/dist/embedder/index.js +429 -0
  75. package/dist/embedder/index.js.map +1 -0
  76. package/dist/embedder/remote.d.ts +51 -0
  77. package/dist/embedder/remote.d.ts.map +1 -0
  78. package/dist/embedder/remote.js +182 -0
  79. package/dist/embedder/remote.js.map +1 -0
  80. package/dist/features/list.d.ts +37 -0
  81. package/dist/features/list.d.ts.map +1 -0
  82. package/dist/features/list.js +41 -0
  83. package/dist/features/list.js.map +1 -0
  84. package/dist/features/sync.d.ts +219 -0
  85. package/dist/features/sync.d.ts.map +1 -0
  86. package/dist/features/sync.js +461 -0
  87. package/dist/features/sync.js.map +1 -0
  88. package/dist/index.d.ts +3 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +56 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/ingest/compute.d.ts +63 -0
  93. package/dist/ingest/compute.d.ts.map +1 -0
  94. package/dist/ingest/compute.js +161 -0
  95. package/dist/ingest/compute.js.map +1 -0
  96. package/dist/ingest/file.d.ts +40 -0
  97. package/dist/ingest/file.d.ts.map +1 -0
  98. package/dist/ingest/file.js +74 -0
  99. package/dist/ingest/file.js.map +1 -0
  100. package/dist/ingest/visual.d.ts +52 -0
  101. package/dist/ingest/visual.d.ts.map +1 -0
  102. package/dist/ingest/visual.js +294 -0
  103. package/dist/ingest/visual.js.map +1 -0
  104. package/dist/parser/docx-parser.d.ts +12 -0
  105. package/dist/parser/docx-parser.d.ts.map +1 -0
  106. package/dist/parser/docx-parser.js +375 -0
  107. package/dist/parser/docx-parser.js.map +1 -0
  108. package/dist/parser/html-parser.d.ts +16 -0
  109. package/dist/parser/html-parser.d.ts.map +1 -0
  110. package/dist/parser/html-parser.js +119 -0
  111. package/dist/parser/html-parser.js.map +1 -0
  112. package/dist/parser/index.d.ts +125 -0
  113. package/dist/parser/index.d.ts.map +1 -0
  114. package/dist/parser/index.js +364 -0
  115. package/dist/parser/index.js.map +1 -0
  116. package/dist/parser/pdf-extract.d.ts +49 -0
  117. package/dist/parser/pdf-extract.d.ts.map +1 -0
  118. package/dist/parser/pdf-extract.js +114 -0
  119. package/dist/parser/pdf-extract.js.map +1 -0
  120. package/dist/parser/pdf-filter.d.ts +91 -0
  121. package/dist/parser/pdf-filter.d.ts.map +1 -0
  122. package/dist/parser/pdf-filter.js +522 -0
  123. package/dist/parser/pdf-filter.js.map +1 -0
  124. package/dist/parser/title-extractor.d.ts +28 -0
  125. package/dist/parser/title-extractor.d.ts.map +1 -0
  126. package/dist/parser/title-extractor.js +105 -0
  127. package/dist/parser/title-extractor.js.map +1 -0
  128. package/dist/pdf-visual/captioner.d.ts +11 -0
  129. package/dist/pdf-visual/captioner.d.ts.map +1 -0
  130. package/dist/pdf-visual/captioner.js +48 -0
  131. package/dist/pdf-visual/captioner.js.map +1 -0
  132. package/dist/pdf-visual/captioners/fast.d.ts +7 -0
  133. package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
  134. package/dist/pdf-visual/captioners/fast.js +108 -0
  135. package/dist/pdf-visual/captioners/fast.js.map +1 -0
  136. package/dist/pdf-visual/captioners/quality.d.ts +7 -0
  137. package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
  138. package/dist/pdf-visual/captioners/quality.js +101 -0
  139. package/dist/pdf-visual/captioners/quality.js.map +1 -0
  140. package/dist/pdf-visual/captioners/shared.d.ts +81 -0
  141. package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
  142. package/dist/pdf-visual/captioners/shared.js +156 -0
  143. package/dist/pdf-visual/captioners/shared.js.map +1 -0
  144. package/dist/pdf-visual/detector.d.ts +9 -0
  145. package/dist/pdf-visual/detector.d.ts.map +1 -0
  146. package/dist/pdf-visual/detector.js +269 -0
  147. package/dist/pdf-visual/detector.js.map +1 -0
  148. package/dist/pdf-visual/index.d.ts +13 -0
  149. package/dist/pdf-visual/index.d.ts.map +1 -0
  150. package/dist/pdf-visual/index.js +53 -0
  151. package/dist/pdf-visual/index.js.map +1 -0
  152. package/dist/pdf-visual/renderer.d.ts +9 -0
  153. package/dist/pdf-visual/renderer.d.ts.map +1 -0
  154. package/dist/pdf-visual/renderer.js +186 -0
  155. package/dist/pdf-visual/renderer.js.map +1 -0
  156. package/dist/pdf-visual/types.d.ts +53 -0
  157. package/dist/pdf-visual/types.d.ts.map +1 -0
  158. package/dist/pdf-visual/types.js +17 -0
  159. package/dist/pdf-visual/types.js.map +1 -0
  160. package/dist/server/error-utils.d.ts +63 -0
  161. package/dist/server/error-utils.d.ts.map +1 -0
  162. package/dist/server/error-utils.js +124 -0
  163. package/dist/server/error-utils.js.map +1 -0
  164. package/dist/server/index.d.ts +216 -0
  165. package/dist/server/index.d.ts.map +1 -0
  166. package/dist/server/index.js +1068 -0
  167. package/dist/server/index.js.map +1 -0
  168. package/dist/server/list-scanner.d.ts +30 -0
  169. package/dist/server/list-scanner.d.ts.map +1 -0
  170. package/dist/server/list-scanner.js +50 -0
  171. package/dist/server/list-scanner.js.map +1 -0
  172. package/dist/server/tool-definitions.d.ts +8 -0
  173. package/dist/server/tool-definitions.d.ts.map +1 -0
  174. package/dist/server/tool-definitions.js +181 -0
  175. package/dist/server/tool-definitions.js.map +1 -0
  176. package/dist/server/tool-input.d.ts +37 -0
  177. package/dist/server/tool-input.d.ts.map +1 -0
  178. package/dist/server/tool-input.js +211 -0
  179. package/dist/server/tool-input.js.map +1 -0
  180. package/dist/server/types.d.ts +307 -0
  181. package/dist/server/types.d.ts.map +1 -0
  182. package/dist/server/types.js +3 -0
  183. package/dist/server/types.js.map +1 -0
  184. package/dist/server-main.d.ts +40 -0
  185. package/dist/server-main.d.ts.map +1 -0
  186. package/dist/server-main.js +254 -0
  187. package/dist/server-main.js.map +1 -0
  188. package/dist/utils/base-dirs.d.ts +145 -0
  189. package/dist/utils/base-dirs.d.ts.map +1 -0
  190. package/dist/utils/base-dirs.js +344 -0
  191. package/dist/utils/base-dirs.js.map +1 -0
  192. package/dist/utils/errors.d.ts +32 -0
  193. package/dist/utils/errors.d.ts.map +1 -0
  194. package/dist/utils/errors.js +61 -0
  195. package/dist/utils/errors.js.map +1 -0
  196. package/dist/utils/limits.d.ts +26 -0
  197. package/dist/utils/limits.d.ts.map +1 -0
  198. package/dist/utils/limits.js +28 -0
  199. package/dist/utils/limits.js.map +1 -0
  200. package/dist/utils/list-sources.d.ts +38 -0
  201. package/dist/utils/list-sources.d.ts.map +1 -0
  202. package/dist/utils/list-sources.js +40 -0
  203. package/dist/utils/list-sources.js.map +1 -0
  204. package/dist/utils/raw-data-utils.d.ts +76 -0
  205. package/dist/utils/raw-data-utils.d.ts.map +1 -0
  206. package/dist/utils/raw-data-utils.js +202 -0
  207. package/dist/utils/raw-data-utils.js.map +1 -0
  208. package/dist/utils/scan.d.ts +114 -0
  209. package/dist/utils/scan.d.ts.map +1 -0
  210. package/dist/utils/scan.js +209 -0
  211. package/dist/utils/scan.js.map +1 -0
  212. package/dist/utils/scope-match.d.ts +38 -0
  213. package/dist/utils/scope-match.d.ts.map +1 -0
  214. package/dist/utils/scope-match.js +86 -0
  215. package/dist/utils/scope-match.js.map +1 -0
  216. package/dist/utils/sensitive-path.d.ts +9 -0
  217. package/dist/utils/sensitive-path.d.ts.map +1 -0
  218. package/dist/utils/sensitive-path.js +78 -0
  219. package/dist/utils/sensitive-path.js.map +1 -0
  220. package/dist/utils/sync-path-key.d.ts +14 -0
  221. package/dist/utils/sync-path-key.d.ts.map +1 -0
  222. package/dist/utils/sync-path-key.js +27 -0
  223. package/dist/utils/sync-path-key.js.map +1 -0
  224. package/dist/utils/type-guards.d.ts +18 -0
  225. package/dist/utils/type-guards.d.ts.map +1 -0
  226. package/dist/utils/type-guards.js +34 -0
  227. package/dist/utils/type-guards.js.map +1 -0
  228. package/dist/utils/visual-profile.d.ts +10 -0
  229. package/dist/utils/visual-profile.d.ts.map +1 -0
  230. package/dist/utils/visual-profile.js +15 -0
  231. package/dist/utils/visual-profile.js.map +1 -0
  232. package/dist/vectordb/index.d.ts +132 -0
  233. package/dist/vectordb/index.d.ts.map +1 -0
  234. package/dist/vectordb/index.js +617 -0
  235. package/dist/vectordb/index.js.map +1 -0
  236. package/dist/vectordb/search-filters.d.ts +15 -0
  237. package/dist/vectordb/search-filters.d.ts.map +1 -0
  238. package/dist/vectordb/search-filters.js +129 -0
  239. package/dist/vectordb/search-filters.js.map +1 -0
  240. package/dist/vectordb/types.d.ts +194 -0
  241. package/dist/vectordb/types.d.ts.map +1 -0
  242. package/dist/vectordb/types.js +237 -0
  243. package/dist/vectordb/types.js.map +1 -0
  244. package/package.json +108 -0
  245. package/skills/mcp-local-rag/SKILL.md +234 -0
  246. package/skills/mcp-local-rag/references/cli-reference.md +190 -0
  247. package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/bin/install-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Indivisible UTF-16 text range in the source passed to semantic chunking.
3
+ */
4
+ export interface AtomicTextRange {
5
+ /** Inclusive UTF-16 offset. */
6
+ start: number;
7
+ /** Exclusive UTF-16 offset. */
8
+ end: number;
9
+ }
10
+ /**
11
+ * Text chunk
12
+ */
13
+ export interface TextChunk {
14
+ /** Chunk text */
15
+ text: string;
16
+ /** Chunk index (zero-based) */
17
+ index: number;
18
+ /** Inclusive UTF-16 offset in the source document. */
19
+ sourceStart: number;
20
+ /** Exclusive UTF-16 offset in the source document. */
21
+ sourceEnd: number;
22
+ }
23
+ export { DEFAULT_MIN_CHUNK_LENGTH, SemanticChunker } from './semantic-chunker.js';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunker/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAA;IACnB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { DEFAULT_MIN_CHUNK_LENGTH, SemanticChunker } from './semantic-chunker.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunker/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,96 @@
1
+ import type { AtomicTextRange, TextChunk } from './index.js';
2
+ /**
3
+ * Semantic Chunker configuration
4
+ * Based on paper recommendations: hardThreshold=0.6, initConst=1.5, c=0.9
5
+ */
6
+ export interface SemanticChunkerConfig {
7
+ /** Hard threshold for minimum similarity (default: 0.6) */
8
+ hardThreshold: number;
9
+ /** Initial constant for first sentence pair (default: 1.5) */
10
+ initConst: number;
11
+ /** Scaling constant for threshold calculation (default: 0.9) */
12
+ c: number;
13
+ /** Minimum chunk length in characters (default: 50) */
14
+ minChunkLength: number;
15
+ }
16
+ /**
17
+ * Embedder interface for generating embeddings.
18
+ *
19
+ * `getTokenLimit` and `countTokens` are optional; without them the chunker
20
+ * skips token containment.
21
+ */
22
+ export interface EmbedderInterface {
23
+ embedBatch(texts: string[]): Promise<number[][]>;
24
+ /** Resolved token cap, or `null` when no limit could be resolved. */
25
+ getTokenLimit?(): Promise<number | null>;
26
+ /** True, unclamped token lengths of each text. */
27
+ countTokens?(texts: string[]): Promise<number[]>;
28
+ }
29
+ /**
30
+ * Garbage chunks, language-agnostically: empty after trimming, only decoration
31
+ * characters (`----`, `====`), or one character repeated over 80% of the text.
32
+ * Anything alphanumeric is kept. Applied after the minChunkLength filter.
33
+ */
34
+ export declare function isGarbageChunk(text: string): boolean;
35
+ /** Default minimum chunk length in characters */
36
+ export declare const DEFAULT_MIN_CHUNK_LENGTH = 50;
37
+ /**
38
+ * Semantic chunker using the Max-Min algorithm: a sentence joins the current
39
+ * chunk when its maximum similarity to any member exceeds the minimum
40
+ * similarity between existing members, adjusted by the threshold.
41
+ */
42
+ export declare class SemanticChunker {
43
+ private readonly config;
44
+ constructor(config?: Partial<SemanticChunkerConfig>);
45
+ /**
46
+ * Split text into semantically coherent chunks
47
+ */
48
+ chunkText(text: string, embedder: EmbedderInterface, atomicRanges?: readonly AtomicTextRange[]): Promise<TextChunk[]>;
49
+ /**
50
+ * Whether a sentence group becomes stored chunks. A group holding a
51
+ * containment piece is already admitted, judged before the split, so neither
52
+ * filter re-runs on a fragment of it. Otherwise garbage is rejected and the
53
+ * minimum length is waived for an atomic unit, which must stay whole.
54
+ */
55
+ private admitsGroup;
56
+ /**
57
+ * Group sentences into chunks using Max-Min algorithm
58
+ */
59
+ /**
60
+ * Whether a sentence continues the group being built: `initConst`-scaled
61
+ * similarity while the group holds one sentence, Max-Min beyond that, and
62
+ * never past `MAX_SENTENCES`.
63
+ */
64
+ private continuesGroup;
65
+ private groupSentences;
66
+ /**
67
+ * Decide if a sentence should be added to the current chunk
68
+ * Based on Max-Min algorithm from the paper
69
+ */
70
+ private shouldAddToChunk;
71
+ /**
72
+ * Minimum pairwise similarity within a chunk, over the last WINDOW_SIZE
73
+ * sentences only. The approximation follows the Max-Min paper: recent
74
+ * sentences are what determine coherence.
75
+ */
76
+ private getMinSimilarity;
77
+ /**
78
+ * Get maximum similarity between a sentence and any sentence in the chunk
79
+ */
80
+ private getMaxSimilarity;
81
+ /**
82
+ * Calculate dynamic threshold based on chunk size
83
+ * threshold = max(c * minSim * sigmoid(|C|), hardThreshold)
84
+ */
85
+ private calculateThreshold;
86
+ /**
87
+ * Sigmoid function
88
+ */
89
+ private sigmoid;
90
+ /**
91
+ * Calculate cosine similarity between two vectors
92
+ * Public for testing
93
+ */
94
+ cosineSimilarity(vec1: number[], vec2: number[]): number;
95
+ }
96
+ //# sourceMappingURL=semantic-chunker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-chunker.d.ts","sourceRoot":"","sources":["../../src/chunker/semantic-chunker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAY5D;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAA;IACrB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAA;IACjB,gEAAgE;IAChE,CAAC,EAAE,MAAM,CAAA;IACT,uDAAuD;IACvD,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAChD,qEAAqE;IACrE,aAAa,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACxC,kDAAkD;IAClD,WAAW,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CACjD;AAoBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA2BpD;AAMD,iDAAiD;AACjD,eAAO,MAAM,wBAAwB,KAAK,CAAA;AA6H1C;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAE9C,YAAY,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM,EAEtD;IAED;;OAEG;IACG,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,EAC3B,YAAY,GAAE,SAAS,eAAe,EAAO,GAC5C,OAAO,CAAC,SAAS,EAAE,CAAC,CA8BtB;IAED;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,cAAc;IAgDtB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA2BxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,OAAO;IAIf;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAuBvD;CACF"}
@@ -0,0 +1,362 @@
1
+ // Semantic Chunker implementation using Max-Min algorithm
2
+ // Based on: "Max–Min semantic chunking of documents for RAG application" (Springer, 2025)
3
+ import { splitIntoSentenceUnits } from './sentence-splitter.js';
4
+ import { splitUnitsIntoFittingRuns, splitUnitToFit, } from './token-containment.js';
5
+ // ============================================
6
+ // Performance Optimization Constants
7
+ // ============================================
8
+ /**
9
+ * Number of recent sentences to compare in getMinSimilarity.
10
+ * Based on Max-Min paper's experimental conditions (median 5 sentences per chunk).
11
+ * Reduces complexity from O(k²) to O(WINDOW_SIZE²) = O(25) = O(1).
12
+ */
13
+ const WINDOW_SIZE = 5;
14
+ /**
15
+ * Maximum number of sentences per chunk before forced split.
16
+ * Safety limit to prevent computational explosion on homogeneous documents.
17
+ * Set to 3x the paper's median chunk size for reasonable margin.
18
+ */
19
+ const MAX_SENTENCES = 15;
20
+ /**
21
+ * Garbage chunks, language-agnostically: empty after trimming, only decoration
22
+ * characters (`----`, `====`), or one character repeated over 80% of the text.
23
+ * Anything alphanumeric is kept. Applied after the minChunkLength filter.
24
+ */
25
+ export function isGarbageChunk(text) {
26
+ const trimmed = text.trim();
27
+ if (trimmed.length === 0) {
28
+ return true;
29
+ }
30
+ // If contains any alphanumeric, consider valid content
31
+ if (/[a-zA-Z0-9]/.test(trimmed)) {
32
+ return false;
33
+ }
34
+ // Decoration line patterns only (----, ====, ****, etc.)
35
+ if (/^[-=_.*#|~`@!%^&*()[\]{}\\/<>:+\s]+$/.test(trimmed)) {
36
+ return true;
37
+ }
38
+ // Excessive repetition of single character (>80%)
39
+ const charCounts = new Map();
40
+ for (const char of trimmed) {
41
+ charCounts.set(char, (charCounts.get(char) ?? 0) + 1);
42
+ }
43
+ const maxCount = Math.max(...charCounts.values());
44
+ if (maxCount / trimmed.length > 0.8) {
45
+ return true;
46
+ }
47
+ return false;
48
+ }
49
+ // ============================================
50
+ // Default Configuration
51
+ // ============================================
52
+ /** Default minimum chunk length in characters */
53
+ export const DEFAULT_MIN_CHUNK_LENGTH = 50;
54
+ // ============================================
55
+ // Token Containment (stages A and C)
56
+ // ============================================
57
+ /** Joins a group's units into the chunk text, which is also what containment measures. */
58
+ function joinUnits(units) {
59
+ return units.map((unit) => unit.text).join(' ');
60
+ }
61
+ /**
62
+ * The embedder's token budget, or `null` when the optional members are absent
63
+ * or no limit could be resolved. Containment is then skipped entirely.
64
+ */
65
+ async function resolveContainmentBudget(embedder) {
66
+ const { getTokenLimit, countTokens } = embedder;
67
+ if (!getTokenLimit || !countTokens) {
68
+ return null;
69
+ }
70
+ const cap = await getTokenLimit.call(embedder);
71
+ if (cap === null) {
72
+ return null;
73
+ }
74
+ return { cap, countTokens: (texts) => countTokens.call(embedder, texts) };
75
+ }
76
+ /** One measurement pass over `texts`, rejecting a counter that drops inputs. */
77
+ async function measureAll(texts, budget) {
78
+ const measured = await budget.countTokens(texts);
79
+ if (measured.length !== texts.length) {
80
+ throw new Error(`Token counter returned ${measured.length} measurements for ${texts.length} texts`);
81
+ }
82
+ return measured;
83
+ }
84
+ /**
85
+ * Reduce sentence units to pieces within the cap, before embedding.
86
+ *
87
+ * Admission is judged here, on the whole unit, and recorded on its pieces: a
88
+ * fragment can be noise by itself — a run of one character reads as pure
89
+ * repetition — so judging pieces would drop text the parent was admitted with.
90
+ */
91
+ async function containUnits(units, budget) {
92
+ const measured = await measureAll(units.map((unit) => unit.text), budget);
93
+ const contained = [];
94
+ for (const [index, unit] of units.entries()) {
95
+ const unitTokens = measured[index] ?? 0;
96
+ if (unitTokens <= budget.cap) {
97
+ contained.push(unit);
98
+ continue;
99
+ }
100
+ const admitted = !isGarbageChunk(unit.text);
101
+ const pieces = await splitUnitToFit(unit, budget);
102
+ contained.push(...pieces.map((piece) => (admitted ? { ...piece, containmentSplit: true } : piece)));
103
+ }
104
+ return contained;
105
+ }
106
+ /**
107
+ * Reduce admitted groups to runs of whole units within the cap. A group that
108
+ * fits is returned untouched, so content inside the window keeps its boundaries.
109
+ */
110
+ async function containGroups(groups, budget) {
111
+ const measured = await measureAll(groups.map(joinUnits), budget);
112
+ const contained = [];
113
+ for (const [index, group] of groups.entries()) {
114
+ if ((measured[index] ?? 0) <= budget.cap) {
115
+ contained.push(group);
116
+ continue;
117
+ }
118
+ contained.push(...(await splitUnitsIntoFittingRuns(group, { ...budget, joinUnits })));
119
+ }
120
+ return contained;
121
+ }
122
+ /**
123
+ * Build the stored chunks. Offsets come from the first and last unit, never from
124
+ * an index into the joined text: the join uses a single space while the source
125
+ * may hold newlines or repeated whitespace.
126
+ */
127
+ function convertPiecesToChunks(pieces) {
128
+ const chunks = [];
129
+ for (const piece of pieces) {
130
+ const firstUnit = piece[0];
131
+ const lastUnit = piece[piece.length - 1];
132
+ if (!firstUnit || !lastUnit) {
133
+ continue;
134
+ }
135
+ chunks.push({
136
+ text: joinUnits(piece),
137
+ index: chunks.length,
138
+ sourceStart: firstUnit.sourceStart,
139
+ sourceEnd: lastUnit.sourceEnd,
140
+ });
141
+ }
142
+ return chunks;
143
+ }
144
+ const DEFAULT_SEMANTIC_CHUNKER_CONFIG = {
145
+ hardThreshold: 0.6,
146
+ initConst: 1.5,
147
+ c: 0.9,
148
+ minChunkLength: DEFAULT_MIN_CHUNK_LENGTH,
149
+ };
150
+ // ============================================
151
+ // SemanticChunker Class
152
+ // ============================================
153
+ /**
154
+ * Semantic chunker using the Max-Min algorithm: a sentence joins the current
155
+ * chunk when its maximum similarity to any member exceeds the minimum
156
+ * similarity between existing members, adjusted by the threshold.
157
+ */
158
+ export class SemanticChunker {
159
+ config;
160
+ constructor(config = {}) {
161
+ this.config = { ...DEFAULT_SEMANTIC_CHUNKER_CONFIG, ...config };
162
+ }
163
+ /**
164
+ * Split text into semantically coherent chunks
165
+ */
166
+ async chunkText(text, embedder, atomicRanges = []) {
167
+ // Handle empty input
168
+ if (!text || text.trim().length === 0) {
169
+ // Supplied ranges are programmer contracts and must fail fast even when
170
+ // ordinary empty text would otherwise return before sentence splitting.
171
+ if (atomicRanges.length > 0) {
172
+ splitIntoSentenceUnits(text, atomicRanges);
173
+ }
174
+ return [];
175
+ }
176
+ // Split into sentences
177
+ const sentenceUnits = splitIntoSentenceUnits(text, atomicRanges);
178
+ if (sentenceUnits.length === 0) {
179
+ return [];
180
+ }
181
+ const budget = await resolveContainmentBudget(embedder);
182
+ const units = budget ? await containUnits(sentenceUnits, budget) : sentenceUnits;
183
+ // Generate embeddings for all sentences
184
+ const embeddings = await embedder.embedBatch(units.map((unit) => unit.text));
185
+ // Apply Max-Min algorithm to group sentences into chunks
186
+ const sentenceGroups = this.groupSentences(units, embeddings);
187
+ const admitted = sentenceGroups.filter((group) => this.admitsGroup(group));
188
+ const pieces = budget ? await containGroups(admitted, budget) : admitted;
189
+ return convertPiecesToChunks(pieces);
190
+ }
191
+ /**
192
+ * Whether a sentence group becomes stored chunks. A group holding a
193
+ * containment piece is already admitted, judged before the split, so neither
194
+ * filter re-runs on a fragment of it. Otherwise garbage is rejected and the
195
+ * minimum length is waived for an atomic unit, which must stay whole.
196
+ */
197
+ admitsGroup(group) {
198
+ if (group.some((unit) => unit.containmentSplit)) {
199
+ return true;
200
+ }
201
+ const groupText = joinUnits(group);
202
+ if (isGarbageChunk(groupText)) {
203
+ return false;
204
+ }
205
+ return group.some((unit) => unit.atomic) || groupText.length >= this.config.minChunkLength;
206
+ }
207
+ /**
208
+ * Group sentences into chunks using Max-Min algorithm
209
+ */
210
+ /**
211
+ * Whether a sentence continues the group being built: `initConst`-scaled
212
+ * similarity while the group holds one sentence, Max-Min beyond that, and
213
+ * never past `MAX_SENTENCES`.
214
+ */
215
+ continuesGroup(embedding, groupEmbeddings) {
216
+ if (groupEmbeddings.length === 1) {
217
+ const firstEmbedding = groupEmbeddings[0];
218
+ if (!firstEmbedding) {
219
+ return false;
220
+ }
221
+ const similarity = this.cosineSimilarity(firstEmbedding, embedding);
222
+ return this.config.initConst * similarity > this.config.hardThreshold;
223
+ }
224
+ if (groupEmbeddings.length >= MAX_SENTENCES) {
225
+ return false;
226
+ }
227
+ return this.shouldAddToChunk(embedding, groupEmbeddings);
228
+ }
229
+ groupSentences(sentences, embeddings) {
230
+ if (sentences.length === 0) {
231
+ return [];
232
+ }
233
+ if (sentences.length === 1) {
234
+ const sentence = sentences[0];
235
+ return sentence ? [[sentence]] : [];
236
+ }
237
+ const groups = [];
238
+ let currentGroup = [];
239
+ let currentGroupEmbeddings = [];
240
+ for (let i = 0; i < sentences.length; i++) {
241
+ const sentence = sentences[i];
242
+ const embedding = embeddings[i];
243
+ if (!sentence || !embedding) {
244
+ continue;
245
+ }
246
+ if (currentGroup.length === 0) {
247
+ // Start new group with first sentence
248
+ currentGroup.push(sentence);
249
+ currentGroupEmbeddings.push(embedding);
250
+ continue;
251
+ }
252
+ if (this.continuesGroup(embedding, currentGroupEmbeddings)) {
253
+ currentGroup.push(sentence);
254
+ currentGroupEmbeddings.push(embedding);
255
+ continue;
256
+ }
257
+ // Start new group
258
+ groups.push([...currentGroup]);
259
+ currentGroup = [sentence];
260
+ currentGroupEmbeddings = [embedding];
261
+ }
262
+ // Don't forget the last group
263
+ if (currentGroup.length > 0) {
264
+ groups.push(currentGroup);
265
+ }
266
+ return groups;
267
+ }
268
+ /**
269
+ * Decide if a sentence should be added to the current chunk
270
+ * Based on Max-Min algorithm from the paper
271
+ */
272
+ shouldAddToChunk(newEmbedding, chunkEmbeddings) {
273
+ // Calculate min similarity within current chunk
274
+ const minSim = this.getMinSimilarity(chunkEmbeddings);
275
+ // Calculate max similarity between new sentence and chunk
276
+ const maxSim = this.getMaxSimilarity(newEmbedding, chunkEmbeddings);
277
+ // Calculate dynamic threshold
278
+ const threshold = this.calculateThreshold(minSim, chunkEmbeddings.length);
279
+ return maxSim > threshold;
280
+ }
281
+ /**
282
+ * Minimum pairwise similarity within a chunk, over the last WINDOW_SIZE
283
+ * sentences only. The approximation follows the Max-Min paper: recent
284
+ * sentences are what determine coherence.
285
+ */
286
+ getMinSimilarity(embeddings) {
287
+ if (embeddings.length < 2) {
288
+ return 1.0;
289
+ }
290
+ // Only compare the last WINDOW_SIZE embeddings to reduce O(k²) to O(1)
291
+ const startIdx = Math.max(0, embeddings.length - WINDOW_SIZE);
292
+ const windowEmbeddings = embeddings.slice(startIdx);
293
+ let minSim = 1.0;
294
+ for (let i = 0; i < windowEmbeddings.length; i++) {
295
+ for (let j = i + 1; j < windowEmbeddings.length; j++) {
296
+ const embI = windowEmbeddings[i];
297
+ const embJ = windowEmbeddings[j];
298
+ if (!embI || !embJ) {
299
+ continue;
300
+ }
301
+ const sim = this.cosineSimilarity(embI, embJ);
302
+ if (sim < minSim) {
303
+ minSim = sim;
304
+ }
305
+ }
306
+ }
307
+ return minSim;
308
+ }
309
+ /**
310
+ * Get maximum similarity between a sentence and any sentence in the chunk
311
+ */
312
+ getMaxSimilarity(embedding, chunkEmbeddings) {
313
+ let maxSim = -1.0;
314
+ for (const chunkEmb of chunkEmbeddings) {
315
+ const sim = this.cosineSimilarity(embedding, chunkEmb);
316
+ if (sim > maxSim) {
317
+ maxSim = sim;
318
+ }
319
+ }
320
+ return maxSim;
321
+ }
322
+ /**
323
+ * Calculate dynamic threshold based on chunk size
324
+ * threshold = max(c * minSim * sigmoid(|C|), hardThreshold)
325
+ */
326
+ calculateThreshold(minSim, chunkSize) {
327
+ const sigmoidValue = this.sigmoid(chunkSize);
328
+ const dynamicThreshold = this.config.c * minSim * sigmoidValue;
329
+ return Math.max(dynamicThreshold, this.config.hardThreshold);
330
+ }
331
+ /**
332
+ * Sigmoid function
333
+ */
334
+ sigmoid(x) {
335
+ return 1 / (1 + Math.exp(-x));
336
+ }
337
+ /**
338
+ * Calculate cosine similarity between two vectors
339
+ * Public for testing
340
+ */
341
+ cosineSimilarity(vec1, vec2) {
342
+ if (vec1.length !== vec2.length || vec1.length === 0) {
343
+ return 0;
344
+ }
345
+ let dotProduct = 0;
346
+ let norm1 = 0;
347
+ let norm2 = 0;
348
+ for (let i = 0; i < vec1.length; i++) {
349
+ const v1 = vec1[i] ?? 0;
350
+ const v2 = vec2[i] ?? 0;
351
+ dotProduct += v1 * v2;
352
+ norm1 += v1 * v1;
353
+ norm2 += v2 * v2;
354
+ }
355
+ const denominator = Math.sqrt(norm1) * Math.sqrt(norm2);
356
+ if (denominator === 0) {
357
+ return 0;
358
+ }
359
+ return dotProduct / denominator;
360
+ }
361
+ }
362
+ //# sourceMappingURL=semantic-chunker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-chunker.js","sourceRoot":"","sources":["../../src/chunker/semantic-chunker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { AtomicTextRange } from './index.js';
2
+ export interface SentenceUnit {
3
+ text: string;
4
+ atomic: boolean;
5
+ sourceStart: number;
6
+ sourceEnd: number;
7
+ /**
8
+ * Set by token containment on pieces of a unit it admitted before splitting,
9
+ * so the group holding a piece is stored without the filters re-running on a
10
+ * fragment. Distinct from `atomic`, which means a range must stay whole; the
11
+ * splitter never sets this flag.
12
+ */
13
+ containmentSplit?: boolean;
14
+ }
15
+ /**
16
+ * Split text into sentences using Intl.Segmenter
17
+ *
18
+ * Uses the Unicode Text Segmentation standard (UAX #29) via Intl.Segmenter.
19
+ * This provides multilingual support for sentence boundary detection.
20
+ *
21
+ * Note: Intl.Segmenter may split on abbreviations like "Mr." or "e.g."
22
+ * These edge cases are acceptable for semantic chunking as:
23
+ * 1. Short fragments will be grouped with adjacent sentences by similarity
24
+ * 2. Fragments below minChunkLength are filtered out
25
+ */
26
+ export declare function splitIntoSentences(text: string): string[];
27
+ /**
28
+ * Split ordinary text while preserving the supplied positional ranges as
29
+ * indivisible sentence units.
30
+ */
31
+ export declare function splitIntoSentenceUnits(text: string, atomicRanges?: readonly AtomicTextRange[]): SentenceUnit[];
32
+ //# sourceMappingURL=sentence-splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentence-splitter.d.ts","sourceRoot":"","sources":["../../src/chunker/sentence-splitter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAyBjD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAwLD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKzD;AAuBD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,SAAS,eAAe,EAAO,GAC5C,YAAY,EAAE,CA6BhB"}