@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.
- package/LICENSE +21 -0
- package/README.de.md +441 -0
- package/README.es.md +441 -0
- package/README.fr.md +441 -0
- package/README.md +530 -0
- package/README.pt-BR.md +441 -0
- package/README.zh-CN.md +441 -0
- package/dist/bin/install-skills.d.ts +19 -0
- package/dist/bin/install-skills.d.ts.map +1 -0
- package/dist/bin/install-skills.js +218 -0
- package/dist/bin/install-skills.js.map +1 -0
- package/dist/chunker/index.d.ts +24 -0
- package/dist/chunker/index.d.ts.map +1 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/chunker/semantic-chunker.d.ts +96 -0
- package/dist/chunker/semantic-chunker.d.ts.map +1 -0
- package/dist/chunker/semantic-chunker.js +362 -0
- package/dist/chunker/semantic-chunker.js.map +1 -0
- package/dist/chunker/sentence-splitter.d.ts +32 -0
- package/dist/chunker/sentence-splitter.d.ts.map +1 -0
- package/dist/chunker/sentence-splitter.js +231 -0
- package/dist/chunker/sentence-splitter.js.map +1 -0
- package/dist/chunker/token-containment.d.ts +39 -0
- package/dist/chunker/token-containment.d.ts.map +1 -0
- package/dist/chunker/token-containment.js +83 -0
- package/dist/chunker/token-containment.js.map +1 -0
- package/dist/cli/common.d.ts +34 -0
- package/dist/cli/common.d.ts.map +1 -0
- package/dist/cli/common.js +121 -0
- package/dist/cli/common.js.map +1 -0
- package/dist/cli/delete.d.ts +3 -0
- package/dist/cli/delete.d.ts.map +1 -0
- package/dist/cli/delete.js +169 -0
- package/dist/cli/delete.js.map +1 -0
- package/dist/cli/file-collection.d.ts +2 -0
- package/dist/cli/file-collection.d.ts.map +1 -0
- package/dist/cli/file-collection.js +53 -0
- package/dist/cli/file-collection.js.map +1 -0
- package/dist/cli/ingest.d.ts +69 -0
- package/dist/cli/ingest.d.ts.map +1 -0
- package/dist/cli/ingest.js +323 -0
- package/dist/cli/ingest.js.map +1 -0
- package/dist/cli/list.d.ts +27 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +207 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/options.d.ts +89 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +244 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/query.d.ts +17 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +194 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/read-neighbors.d.ts +3 -0
- package/dist/cli/read-neighbors.d.ts.map +1 -0
- package/dist/cli/read-neighbors.js +192 -0
- package/dist/cli/read-neighbors.js.map +1 -0
- package/dist/cli/status.d.ts +6 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +78 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/sync.d.ts +6 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +271 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli-main.d.ts +9 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +60 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/embedder/index.d.ts +143 -0
- package/dist/embedder/index.d.ts.map +1 -0
- package/dist/embedder/index.js +429 -0
- package/dist/embedder/index.js.map +1 -0
- package/dist/embedder/remote.d.ts +51 -0
- package/dist/embedder/remote.d.ts.map +1 -0
- package/dist/embedder/remote.js +182 -0
- package/dist/embedder/remote.js.map +1 -0
- package/dist/features/list.d.ts +37 -0
- package/dist/features/list.d.ts.map +1 -0
- package/dist/features/list.js +41 -0
- package/dist/features/list.js.map +1 -0
- package/dist/features/sync.d.ts +219 -0
- package/dist/features/sync.d.ts.map +1 -0
- package/dist/features/sync.js +461 -0
- package/dist/features/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/compute.d.ts +63 -0
- package/dist/ingest/compute.d.ts.map +1 -0
- package/dist/ingest/compute.js +161 -0
- package/dist/ingest/compute.js.map +1 -0
- package/dist/ingest/file.d.ts +40 -0
- package/dist/ingest/file.d.ts.map +1 -0
- package/dist/ingest/file.js +74 -0
- package/dist/ingest/file.js.map +1 -0
- package/dist/ingest/visual.d.ts +52 -0
- package/dist/ingest/visual.d.ts.map +1 -0
- package/dist/ingest/visual.js +294 -0
- package/dist/ingest/visual.js.map +1 -0
- package/dist/parser/docx-parser.d.ts +12 -0
- package/dist/parser/docx-parser.d.ts.map +1 -0
- package/dist/parser/docx-parser.js +375 -0
- package/dist/parser/docx-parser.js.map +1 -0
- package/dist/parser/html-parser.d.ts +16 -0
- package/dist/parser/html-parser.d.ts.map +1 -0
- package/dist/parser/html-parser.js +119 -0
- package/dist/parser/html-parser.js.map +1 -0
- package/dist/parser/index.d.ts +125 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +364 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/pdf-extract.d.ts +49 -0
- package/dist/parser/pdf-extract.d.ts.map +1 -0
- package/dist/parser/pdf-extract.js +114 -0
- package/dist/parser/pdf-extract.js.map +1 -0
- package/dist/parser/pdf-filter.d.ts +91 -0
- package/dist/parser/pdf-filter.d.ts.map +1 -0
- package/dist/parser/pdf-filter.js +522 -0
- package/dist/parser/pdf-filter.js.map +1 -0
- package/dist/parser/title-extractor.d.ts +28 -0
- package/dist/parser/title-extractor.d.ts.map +1 -0
- package/dist/parser/title-extractor.js +105 -0
- package/dist/parser/title-extractor.js.map +1 -0
- package/dist/pdf-visual/captioner.d.ts +11 -0
- package/dist/pdf-visual/captioner.d.ts.map +1 -0
- package/dist/pdf-visual/captioner.js +48 -0
- package/dist/pdf-visual/captioner.js.map +1 -0
- package/dist/pdf-visual/captioners/fast.d.ts +7 -0
- package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/fast.js +108 -0
- package/dist/pdf-visual/captioners/fast.js.map +1 -0
- package/dist/pdf-visual/captioners/quality.d.ts +7 -0
- package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/quality.js +101 -0
- package/dist/pdf-visual/captioners/quality.js.map +1 -0
- package/dist/pdf-visual/captioners/shared.d.ts +81 -0
- package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/shared.js +156 -0
- package/dist/pdf-visual/captioners/shared.js.map +1 -0
- package/dist/pdf-visual/detector.d.ts +9 -0
- package/dist/pdf-visual/detector.d.ts.map +1 -0
- package/dist/pdf-visual/detector.js +269 -0
- package/dist/pdf-visual/detector.js.map +1 -0
- package/dist/pdf-visual/index.d.ts +13 -0
- package/dist/pdf-visual/index.d.ts.map +1 -0
- package/dist/pdf-visual/index.js +53 -0
- package/dist/pdf-visual/index.js.map +1 -0
- package/dist/pdf-visual/renderer.d.ts +9 -0
- package/dist/pdf-visual/renderer.d.ts.map +1 -0
- package/dist/pdf-visual/renderer.js +186 -0
- package/dist/pdf-visual/renderer.js.map +1 -0
- package/dist/pdf-visual/types.d.ts +53 -0
- package/dist/pdf-visual/types.d.ts.map +1 -0
- package/dist/pdf-visual/types.js +17 -0
- package/dist/pdf-visual/types.js.map +1 -0
- package/dist/server/error-utils.d.ts +63 -0
- package/dist/server/error-utils.d.ts.map +1 -0
- package/dist/server/error-utils.js +124 -0
- package/dist/server/error-utils.js.map +1 -0
- package/dist/server/index.d.ts +216 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1068 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/list-scanner.d.ts +30 -0
- package/dist/server/list-scanner.d.ts.map +1 -0
- package/dist/server/list-scanner.js +50 -0
- package/dist/server/list-scanner.js.map +1 -0
- package/dist/server/tool-definitions.d.ts +8 -0
- package/dist/server/tool-definitions.d.ts.map +1 -0
- package/dist/server/tool-definitions.js +181 -0
- package/dist/server/tool-definitions.js.map +1 -0
- package/dist/server/tool-input.d.ts +37 -0
- package/dist/server/tool-input.d.ts.map +1 -0
- package/dist/server/tool-input.js +211 -0
- package/dist/server/tool-input.js.map +1 -0
- package/dist/server/types.d.ts +307 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server-main.d.ts +40 -0
- package/dist/server-main.d.ts.map +1 -0
- package/dist/server-main.js +254 -0
- package/dist/server-main.js.map +1 -0
- package/dist/utils/base-dirs.d.ts +145 -0
- package/dist/utils/base-dirs.d.ts.map +1 -0
- package/dist/utils/base-dirs.js +344 -0
- package/dist/utils/base-dirs.js.map +1 -0
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +61 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/limits.d.ts +26 -0
- package/dist/utils/limits.d.ts.map +1 -0
- package/dist/utils/limits.js +28 -0
- package/dist/utils/limits.js.map +1 -0
- package/dist/utils/list-sources.d.ts +38 -0
- package/dist/utils/list-sources.d.ts.map +1 -0
- package/dist/utils/list-sources.js +40 -0
- package/dist/utils/list-sources.js.map +1 -0
- package/dist/utils/raw-data-utils.d.ts +76 -0
- package/dist/utils/raw-data-utils.d.ts.map +1 -0
- package/dist/utils/raw-data-utils.js +202 -0
- package/dist/utils/raw-data-utils.js.map +1 -0
- package/dist/utils/scan.d.ts +114 -0
- package/dist/utils/scan.d.ts.map +1 -0
- package/dist/utils/scan.js +209 -0
- package/dist/utils/scan.js.map +1 -0
- package/dist/utils/scope-match.d.ts +38 -0
- package/dist/utils/scope-match.d.ts.map +1 -0
- package/dist/utils/scope-match.js +86 -0
- package/dist/utils/scope-match.js.map +1 -0
- package/dist/utils/sensitive-path.d.ts +9 -0
- package/dist/utils/sensitive-path.d.ts.map +1 -0
- package/dist/utils/sensitive-path.js +78 -0
- package/dist/utils/sensitive-path.js.map +1 -0
- package/dist/utils/sync-path-key.d.ts +14 -0
- package/dist/utils/sync-path-key.d.ts.map +1 -0
- package/dist/utils/sync-path-key.js +27 -0
- package/dist/utils/sync-path-key.js.map +1 -0
- package/dist/utils/type-guards.d.ts +18 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +34 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/utils/visual-profile.d.ts +10 -0
- package/dist/utils/visual-profile.d.ts.map +1 -0
- package/dist/utils/visual-profile.js +15 -0
- package/dist/utils/visual-profile.js.map +1 -0
- package/dist/vectordb/index.d.ts +132 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +617 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/search-filters.d.ts +15 -0
- package/dist/vectordb/search-filters.d.ts.map +1 -0
- package/dist/vectordb/search-filters.js +129 -0
- package/dist/vectordb/search-filters.js.map +1 -0
- package/dist/vectordb/types.d.ts +194 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +237 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +108 -0
- package/skills/mcp-local-rag/SKILL.md +234 -0
- package/skills/mcp-local-rag/references/cli-reference.md +190 -0
- 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 @@
|
|
|
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"}
|