mcp-rag-memory 2.3.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.
- package/.env.example +35 -0
- package/README.md +475 -0
- package/dist/db/database.d.ts +22 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +144 -0
- package/dist/db/database.js.map +1 -0
- package/dist/env.js +48 -0
- package/dist/index.js +12 -0
- package/dist/mcp/rag-server.d.ts +3 -0
- package/dist/mcp/rag-server.d.ts.map +1 -0
- package/dist/mcp/rag-server.js +275 -0
- package/dist/mcp/rag-server.js.map +1 -0
- package/dist/memory/memory.d.ts +69 -0
- package/dist/memory/memory.d.ts.map +1 -0
- package/dist/memory/memory.js +221 -0
- package/dist/memory/memory.js.map +1 -0
- package/dist/rag/chunker.d.ts +16 -0
- package/dist/rag/chunker.d.ts.map +1 -0
- package/dist/rag/chunker.js +109 -0
- package/dist/rag/chunker.js.map +1 -0
- package/dist/rag/embedder.d.ts +19 -0
- package/dist/rag/embedder.d.ts.map +1 -0
- package/dist/rag/embedder.js +96 -0
- package/dist/rag/embedder.js.map +1 -0
- package/dist/rag/embeddings.d.ts +14 -0
- package/dist/rag/embeddings.d.ts.map +1 -0
- package/dist/rag/embeddings.js +71 -0
- package/dist/rag/embeddings.js.map +1 -0
- package/dist/rag/pipeline.d.ts +49 -0
- package/dist/rag/pipeline.d.ts.map +1 -0
- package/dist/rag/pipeline.js +181 -0
- package/dist/rag/pipeline.js.map +1 -0
- package/dist/rag/vector-search.d.ts +39 -0
- package/dist/rag/vector-search.d.ts.map +1 -0
- package/dist/rag/vector-search.js +164 -0
- package/dist/rag/vector-search.js.map +1 -0
- package/dist/session/transcript.d.ts +75 -0
- package/dist/session/transcript.d.ts.map +1 -0
- package/dist/session/transcript.js +268 -0
- package/dist/session/transcript.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/memory/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart text chunking with paragraph / code-block awareness and overlap.
|
|
3
|
+
*/
|
|
4
|
+
export interface Chunk {
|
|
5
|
+
text: string;
|
|
6
|
+
index: number;
|
|
7
|
+
tokenCount: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ChunkOptions {
|
|
10
|
+
maxChars?: number;
|
|
11
|
+
overlapChars?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function chunkText(text: string, options?: ChunkOptions): Chunk[];
|
|
14
|
+
/** Rough token estimate: ~4 chars per token for latin, ~1.5 for CJK. */
|
|
15
|
+
export declare function estimateTokens(text: string): number;
|
|
16
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/rag/chunker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,KAAK,EAAE,CA6C3E;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart text chunking with paragraph / code-block awareness and overlap.
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_MAX = 900;
|
|
5
|
+
const DEFAULT_OVERLAP = 120;
|
|
6
|
+
function isCodeLine(line) {
|
|
7
|
+
const t = line.trim();
|
|
8
|
+
if (/^(```|---|\+\+\+|\{\{\{|<\/?(table|script|style|pre|code)>)/.test(t))
|
|
9
|
+
return true;
|
|
10
|
+
if (/^[a-zA-Z_$][\w$]*\s*(\([^)]*\)\s*)?\{$/.test(t))
|
|
11
|
+
return true;
|
|
12
|
+
if (/^(import|export|const|let|var|function|class|def|func|public|private|package|using|include)\b/.test(t))
|
|
13
|
+
return true;
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
function splitIntoParagraphs(text) {
|
|
17
|
+
const blocks = [];
|
|
18
|
+
let current = "";
|
|
19
|
+
let inCode = false;
|
|
20
|
+
for (const line of text.split(/\r?\n/)) {
|
|
21
|
+
const codeBoundary = /^\s*(```|~~~|---)/.test(line.trim());
|
|
22
|
+
if (codeBoundary)
|
|
23
|
+
inCode = !inCode;
|
|
24
|
+
if (inCode || isCodeLine(line)) {
|
|
25
|
+
current += line + "\n";
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (line.trim() === "") {
|
|
29
|
+
if (current.trim()) {
|
|
30
|
+
blocks.push(current.trimEnd());
|
|
31
|
+
current = "";
|
|
32
|
+
}
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
current += line + "\n";
|
|
36
|
+
}
|
|
37
|
+
if (current.trim())
|
|
38
|
+
blocks.push(current.trimEnd());
|
|
39
|
+
return blocks.filter((b) => b.trim().length > 0);
|
|
40
|
+
}
|
|
41
|
+
function splitIntoSentences(block) {
|
|
42
|
+
const sentences = block.match(/[^.!?。!?\n]+[.!?。!?]?/g) ?? [];
|
|
43
|
+
return sentences.map((s) => s.trim()).filter((s) => s.length > 0);
|
|
44
|
+
}
|
|
45
|
+
function splitLongText(text, max) {
|
|
46
|
+
const parts = [];
|
|
47
|
+
let rest = text;
|
|
48
|
+
while (rest.length > max) {
|
|
49
|
+
const candidate = rest.slice(0, max);
|
|
50
|
+
const cut = Math.max(candidate.lastIndexOf(". "), candidate.lastIndexOf(".\n"), candidate.lastIndexOf("。"), candidate.lastIndexOf("\n"), candidate.lastIndexOf(", "));
|
|
51
|
+
const pos = cut > Math.floor(max * 0.6) ? cut + 1 : max;
|
|
52
|
+
parts.push(rest.slice(0, pos).trim());
|
|
53
|
+
rest = rest.slice(pos);
|
|
54
|
+
}
|
|
55
|
+
if (rest.trim())
|
|
56
|
+
parts.push(rest.trim());
|
|
57
|
+
return parts;
|
|
58
|
+
}
|
|
59
|
+
export function chunkText(text, options = {}) {
|
|
60
|
+
const maxChars = options.maxChars ?? DEFAULT_MAX;
|
|
61
|
+
const overlapChars = options.overlapChars ?? DEFAULT_OVERLAP;
|
|
62
|
+
const chunks = [];
|
|
63
|
+
let cursor = 0;
|
|
64
|
+
const emit = (content) => {
|
|
65
|
+
const trimmed = content.trim();
|
|
66
|
+
if (!trimmed)
|
|
67
|
+
return;
|
|
68
|
+
chunks.push({
|
|
69
|
+
text: trimmed,
|
|
70
|
+
index: cursor++,
|
|
71
|
+
tokenCount: estimateTokens(trimmed),
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
const paragraphs = splitIntoParagraphs(text);
|
|
75
|
+
let window = "";
|
|
76
|
+
for (const para of paragraphs) {
|
|
77
|
+
let pieces = [];
|
|
78
|
+
if (para.length > maxChars) {
|
|
79
|
+
pieces = splitLongText(para, maxChars);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const sents = splitIntoSentences(para);
|
|
83
|
+
pieces = sents.length > 0 ? sents : [para];
|
|
84
|
+
}
|
|
85
|
+
for (const piece of pieces) {
|
|
86
|
+
if (piece.length > maxChars) {
|
|
87
|
+
// Rare pathological case: keep as-is, hard split.
|
|
88
|
+
for (const hard of splitLongText(piece, maxChars))
|
|
89
|
+
emit(hard);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (window.length + piece.length + 1 > maxChars && window.length >= overlapChars) {
|
|
93
|
+
emit(window);
|
|
94
|
+
window = window.slice(-overlapChars);
|
|
95
|
+
}
|
|
96
|
+
window += (window ? " " : "") + piece;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (window.trim())
|
|
100
|
+
emit(window);
|
|
101
|
+
return chunks;
|
|
102
|
+
}
|
|
103
|
+
/** Rough token estimate: ~4 chars per token for latin, ~1.5 for CJK. */
|
|
104
|
+
export function estimateTokens(text) {
|
|
105
|
+
const cjk = (text.match(/[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]/g) ?? []).length;
|
|
106
|
+
const rest = text.length - cjk;
|
|
107
|
+
return Math.ceil(cjk * 1.5) + Math.ceil(rest / 4);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/rag/chunker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local hashing embedder — no external API, no native deps.
|
|
3
|
+
*
|
|
4
|
+
* Produces a normalized 1024-dimensional vector using the hashing trick:
|
|
5
|
+
* - Tokenize text into character 1/2/3-grams (robust for CJK + Latin mixed text)
|
|
6
|
+
* plus whole words for ASCII runs.
|
|
7
|
+
* - Map each feature to a bucket via FNV-1a, with a deterministic sign.
|
|
8
|
+
* - Value per bucket = sqrt(feature count) * sign, then L2-normalized.
|
|
9
|
+
*
|
|
10
|
+
* Deterministic across processes and platforms.
|
|
11
|
+
*/
|
|
12
|
+
export declare const EMBED_DIM = 1024;
|
|
13
|
+
/** Embed text into a normalized Float64Array of EMBED_DIM. */
|
|
14
|
+
export declare function embed(text: string): Float64Array;
|
|
15
|
+
/** Dot product of two same-length vectors. For pre-normalized vectors this equals cosine similarity. */
|
|
16
|
+
export declare function dotProduct(a: Float64Array, b: Float64Array): number;
|
|
17
|
+
/** Cosine similarity between two normalized vectors. Returns 0 for degenerate inputs. */
|
|
18
|
+
export declare function cosineSimilarity(a: Float64Array, b: Float64Array): number;
|
|
19
|
+
//# sourceMappingURL=embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/rag/embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,SAAS,OAAO,CAAC;AAwC9B,8DAA8D;AAC9D,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAoBhD;AAED,wGAAwG;AACxG,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAKnE;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAYzE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local hashing embedder — no external API, no native deps.
|
|
3
|
+
*
|
|
4
|
+
* Produces a normalized 1024-dimensional vector using the hashing trick:
|
|
5
|
+
* - Tokenize text into character 1/2/3-grams (robust for CJK + Latin mixed text)
|
|
6
|
+
* plus whole words for ASCII runs.
|
|
7
|
+
* - Map each feature to a bucket via FNV-1a, with a deterministic sign.
|
|
8
|
+
* - Value per bucket = sqrt(feature count) * sign, then L2-normalized.
|
|
9
|
+
*
|
|
10
|
+
* Deterministic across processes and platforms.
|
|
11
|
+
*/
|
|
12
|
+
export const EMBED_DIM = 1024;
|
|
13
|
+
function fnv1a(str, seed = 2166136261) {
|
|
14
|
+
let hash = seed >>> 0;
|
|
15
|
+
for (let i = 0; i < str.length; i++) {
|
|
16
|
+
hash ^= str.charCodeAt(i);
|
|
17
|
+
hash = Math.imul(hash, 16777619) >>> 0;
|
|
18
|
+
}
|
|
19
|
+
return hash >>> 0;
|
|
20
|
+
}
|
|
21
|
+
function* charNgrams(text, n) {
|
|
22
|
+
for (let i = 0; i <= text.length - n; i++) {
|
|
23
|
+
yield text.slice(i, i + n);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function* tokenize(text) {
|
|
27
|
+
const lowered = text.toLowerCase();
|
|
28
|
+
// Whole words for latin/digit runs
|
|
29
|
+
const words = lowered.match(/[a-z0-9_]+/g);
|
|
30
|
+
if (words)
|
|
31
|
+
for (const w of words)
|
|
32
|
+
if (w.length >= 2)
|
|
33
|
+
yield w;
|
|
34
|
+
// Character bigrams + trigrams cover CJK and subword info
|
|
35
|
+
for (const g of charNgrams(lowered, 2))
|
|
36
|
+
yield "g2:" + g;
|
|
37
|
+
for (const g of charNgrams(lowered, 3))
|
|
38
|
+
yield "g3:" + g;
|
|
39
|
+
// Single CJK characters carry meaning on their own — include the
|
|
40
|
+
// most informative punctuation-safe ones.
|
|
41
|
+
for (const ch of lowered) {
|
|
42
|
+
if (/[\u4e00-\u9fff\u3040-\u30ff\uac00-\ud7af]/.test(ch))
|
|
43
|
+
yield "cjk:" + ch;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function hashToBucket(feature) {
|
|
47
|
+
const h = fnv1a(feature);
|
|
48
|
+
return { bucket: h % EMBED_DIM, sign: h & 1 ? 1 : -1 };
|
|
49
|
+
}
|
|
50
|
+
/** Embed text into a normalized Float64Array of EMBED_DIM. */
|
|
51
|
+
export function embed(text) {
|
|
52
|
+
const vec = new Float64Array(EMBED_DIM);
|
|
53
|
+
const counts = new Map();
|
|
54
|
+
for (const feature of tokenize(text)) {
|
|
55
|
+
const { bucket, sign } = hashToBucket(feature);
|
|
56
|
+
counts.set(bucket, (counts.get(bucket) ?? 0) + sign);
|
|
57
|
+
}
|
|
58
|
+
for (const [bucket, count] of counts) {
|
|
59
|
+
// Signed sqrt preserves direction, damps extreme values
|
|
60
|
+
vec[bucket] = Math.sign(count) * Math.sqrt(Math.abs(count));
|
|
61
|
+
}
|
|
62
|
+
let norm = 0;
|
|
63
|
+
for (let i = 0; i < EMBED_DIM; i++)
|
|
64
|
+
norm += vec[i] * vec[i];
|
|
65
|
+
norm = Math.sqrt(norm);
|
|
66
|
+
if (norm > 0)
|
|
67
|
+
for (let i = 0; i < EMBED_DIM; i++)
|
|
68
|
+
vec[i] /= norm;
|
|
69
|
+
return vec;
|
|
70
|
+
}
|
|
71
|
+
/** Dot product of two same-length vectors. For pre-normalized vectors this equals cosine similarity. */
|
|
72
|
+
export function dotProduct(a, b) {
|
|
73
|
+
if (a.length !== b.length)
|
|
74
|
+
return 0;
|
|
75
|
+
let dot = 0;
|
|
76
|
+
for (let i = 0; i < a.length; i++)
|
|
77
|
+
dot += a[i] * b[i];
|
|
78
|
+
return dot;
|
|
79
|
+
}
|
|
80
|
+
/** Cosine similarity between two normalized vectors. Returns 0 for degenerate inputs. */
|
|
81
|
+
export function cosineSimilarity(a, b) {
|
|
82
|
+
if (a.length !== b.length)
|
|
83
|
+
return 0;
|
|
84
|
+
let dot = 0;
|
|
85
|
+
let na = 0;
|
|
86
|
+
let nb = 0;
|
|
87
|
+
for (let i = 0; i < a.length; i++) {
|
|
88
|
+
dot += a[i] * b[i];
|
|
89
|
+
na += a[i] * a[i];
|
|
90
|
+
nb += b[i] * b[i];
|
|
91
|
+
}
|
|
92
|
+
if (na === 0 || nb === 0)
|
|
93
|
+
return 0;
|
|
94
|
+
return dot / (Math.sqrt(na) * Math.sqrt(nb));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/rag/embedder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const EMBED_DIM_LOCAL = 1024;
|
|
2
|
+
export type EmbeddingProvider = "local" | "transformers";
|
|
3
|
+
export declare const EMBEDDING_PROVIDER: EmbeddingProvider;
|
|
4
|
+
export declare const EMBEDDING_MODEL: string;
|
|
5
|
+
export declare function expectedDim(): number;
|
|
6
|
+
export declare function modelName(): string;
|
|
7
|
+
export declare function embeddingInfo(): {
|
|
8
|
+
provider: EmbeddingProvider;
|
|
9
|
+
dim: number;
|
|
10
|
+
model: string;
|
|
11
|
+
};
|
|
12
|
+
/** Embed text into a normalized Float64Array. Async for provider parity. */
|
|
13
|
+
export declare function embedText(text: string): Promise<Float64Array>;
|
|
14
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/rag/embeddings.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,cAAc,CAAC;AAEzD,eAAO,MAAM,kBAAkB,EAAE,iBAC6C,CAAC;AAE/E,eAAO,MAAM,eAAe,QAA2D,CAAC;AAYxF,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,aAAa,IAAI;IAAE,QAAQ,EAAE,iBAAiB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM3F;AAoBD,4EAA4E;AAC5E,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAenE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding backends.
|
|
3
|
+
*
|
|
4
|
+
* EMBEDDING_PROVIDER:
|
|
5
|
+
* - "local" (default) — zero-dependency local hashing embedder (1024-dim).
|
|
6
|
+
* - "transformers" — offline ONNX model via @huggingface/transformers (higher quality).
|
|
7
|
+
* Install the optional dependency yourself: npm i @huggingface/transformers
|
|
8
|
+
*
|
|
9
|
+
* All stored vectors must share one dimension (guarded by ensureDim).
|
|
10
|
+
*/
|
|
11
|
+
import { embed } from "./embedder.js";
|
|
12
|
+
import { ensureDim, getEmbedDim } from "../db/database.js";
|
|
13
|
+
export const EMBED_DIM_LOCAL = 1024;
|
|
14
|
+
export const EMBEDDING_PROVIDER = process.env.EMBEDDING_PROVIDER === "transformers" ? "transformers" : "local";
|
|
15
|
+
export const EMBEDDING_MODEL = process.env.EMBEDDING_MODEL ?? "Xenova/all-MiniLM-L6-v2";
|
|
16
|
+
/** Known output dims for common models; 0 = unknown (locked after first embed). */
|
|
17
|
+
const KNOWN_DIMS = {
|
|
18
|
+
"Xenova/all-MiniLM-L6-v2": 384,
|
|
19
|
+
"Xenova/paraphrase-multilingual-MiniLM-L12-v2": 384,
|
|
20
|
+
"Xenova/multilingual-e5-small": 384,
|
|
21
|
+
"Xenova/gte-small": 384,
|
|
22
|
+
"Xenova/bge-small-en-v1.5": 384,
|
|
23
|
+
"Xenova/multilingual-e5-base": 768,
|
|
24
|
+
};
|
|
25
|
+
export function expectedDim() {
|
|
26
|
+
return EMBEDDING_PROVIDER === "local" ? EMBED_DIM_LOCAL : KNOWN_DIMS[EMBEDDING_MODEL] ?? 0;
|
|
27
|
+
}
|
|
28
|
+
export function modelName() {
|
|
29
|
+
return EMBEDDING_PROVIDER === "local" ? "local-hash-1024" : EMBEDDING_MODEL;
|
|
30
|
+
}
|
|
31
|
+
export function embeddingInfo() {
|
|
32
|
+
return {
|
|
33
|
+
provider: EMBEDDING_PROVIDER,
|
|
34
|
+
dim: getEmbedDim() || expectedDim() || EMBED_DIM_LOCAL,
|
|
35
|
+
model: modelName(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
39
|
+
let extractorPromise = null;
|
|
40
|
+
async function getExtractor() {
|
|
41
|
+
if (!extractorPromise) {
|
|
42
|
+
extractorPromise = (async () => {
|
|
43
|
+
// @ts-expect-error — @huggingface/transformers is an optional dependency
|
|
44
|
+
const mod = await import("@huggingface/transformers");
|
|
45
|
+
const { pipeline } = mod;
|
|
46
|
+
if (typeof pipeline !== "function") {
|
|
47
|
+
throw new Error("@huggingface/transformers did not expose a pipeline() function");
|
|
48
|
+
}
|
|
49
|
+
return pipeline("feature-extraction", EMBEDDING_MODEL, { quantized: true });
|
|
50
|
+
})();
|
|
51
|
+
}
|
|
52
|
+
return extractorPromise;
|
|
53
|
+
}
|
|
54
|
+
/** Embed text into a normalized Float64Array. Async for provider parity. */
|
|
55
|
+
export async function embedText(text) {
|
|
56
|
+
if (EMBEDDING_PROVIDER === "local") {
|
|
57
|
+
const vec = embed(text);
|
|
58
|
+
ensureDim(vec, modelName());
|
|
59
|
+
return vec;
|
|
60
|
+
}
|
|
61
|
+
const extractor = await getExtractor();
|
|
62
|
+
const out = await extractor(text, { pooling: "mean", normalize: true });
|
|
63
|
+
const data = out?.data ?? (Array.isArray(out) ? out[0]?.data : undefined);
|
|
64
|
+
if (!data || typeof data.length !== "number") {
|
|
65
|
+
throw new Error("transformers embed returned an unexpected shape");
|
|
66
|
+
}
|
|
67
|
+
const vec = Float64Array.from(data);
|
|
68
|
+
ensureDim(vec, modelName());
|
|
69
|
+
return vec;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/rag/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { vectorSearch, invalidateVectorCache } from "./vector-search.js";
|
|
2
|
+
import type { SearchHit } from "./vector-search.js";
|
|
3
|
+
export interface IngestResult {
|
|
4
|
+
docId: string;
|
|
5
|
+
title: string;
|
|
6
|
+
chunks: number;
|
|
7
|
+
tokens: number;
|
|
8
|
+
deduplicated: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface RetrievedContext {
|
|
11
|
+
chunks: Array<{
|
|
12
|
+
docTitle: string;
|
|
13
|
+
chunkIndex: number;
|
|
14
|
+
content: string;
|
|
15
|
+
score: number;
|
|
16
|
+
tokenCount: number;
|
|
17
|
+
}>;
|
|
18
|
+
totalTokens: number;
|
|
19
|
+
}
|
|
20
|
+
export interface IngestFileOptions {
|
|
21
|
+
source?: string;
|
|
22
|
+
contentType?: string;
|
|
23
|
+
metadata?: Record<string, unknown>;
|
|
24
|
+
}
|
|
25
|
+
export interface IngestDirectoryOptions {
|
|
26
|
+
extensions?: string[];
|
|
27
|
+
recursive?: boolean;
|
|
28
|
+
metadata?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
export declare function ingestText(content: string, title: string, opts?: IngestFileOptions): Promise<IngestResult>;
|
|
31
|
+
export declare function ingestFile(filePath: string, opts?: IngestFileOptions): Promise<IngestResult>;
|
|
32
|
+
export declare function ingestDirectory(dirPath: string, opts?: IngestDirectoryOptions): Promise<{
|
|
33
|
+
ingested: IngestResult[];
|
|
34
|
+
skipped: string[];
|
|
35
|
+
}>;
|
|
36
|
+
export declare function searchDocs(query: string, topK?: number, minScore?: number): Promise<SearchHit[]>;
|
|
37
|
+
export declare function retrieve(query: string, topK?: number, minScore?: number): Promise<RetrievedContext>;
|
|
38
|
+
export declare function listDocuments(): Array<Record<string, unknown>>;
|
|
39
|
+
export declare function deleteDocument(docId: string): {
|
|
40
|
+
deleted: boolean;
|
|
41
|
+
};
|
|
42
|
+
export declare function documentStats(): {
|
|
43
|
+
documents: number;
|
|
44
|
+
chunks: number;
|
|
45
|
+
tokens: number;
|
|
46
|
+
};
|
|
47
|
+
/** Raw vector search over chunk keys (used by CLI/tests). */
|
|
48
|
+
export { vectorSearch, invalidateVectorCache };
|
|
49
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/rag/pipeline.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5G,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAWD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAsDvB;AAgBD,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsBtG;AAOD,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAoC1D;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAK,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGhG;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAI,EAAE,QAAQ,SAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAalG;AAED,wBAAgB,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQ9D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAMlE;AAED,wBAAgB,aAAa,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAMrF;AAYD,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { contentHash, getDB, newId, nowMs, packVector } from "../db/database.js";
|
|
4
|
+
import { chunkText } from "./chunker.js";
|
|
5
|
+
import { embedText } from "./embeddings.js";
|
|
6
|
+
import { searchChunks, vectorSearch, invalidateVectorCache } from "./vector-search.js";
|
|
7
|
+
/** Insert a FTS row, tolerating an unavailable FTS5 backend. */
|
|
8
|
+
function insertFtsRow(docId, rowid, text) {
|
|
9
|
+
try {
|
|
10
|
+
getDB().prepare("INSERT INTO chunks_fts(rowid, content) VALUES (?, ?)").run(rowid, text);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// FTS missing — hybrid degrades to vector-only.
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function ingestText(content, title, opts = {}) {
|
|
17
|
+
const db = getDB();
|
|
18
|
+
const ts = nowMs();
|
|
19
|
+
// Content-hash dedup: identical documents are never re-embedded.
|
|
20
|
+
const hash = contentHash(content);
|
|
21
|
+
const existing = db
|
|
22
|
+
.prepare("SELECT id, title, chunk_count FROM documents WHERE content_hash = ?")
|
|
23
|
+
.get(hash);
|
|
24
|
+
if (existing) {
|
|
25
|
+
const tokens = db
|
|
26
|
+
.prepare("SELECT COALESCE(SUM(token_count), 0) AS t FROM chunks WHERE doc_id = ?")
|
|
27
|
+
.get(existing.id);
|
|
28
|
+
return {
|
|
29
|
+
docId: existing.id,
|
|
30
|
+
title: existing.title,
|
|
31
|
+
chunks: existing.chunk_count,
|
|
32
|
+
tokens: tokens.t,
|
|
33
|
+
deduplicated: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const docId = newId();
|
|
37
|
+
const chunks = chunkText(content);
|
|
38
|
+
db.prepare(`INSERT INTO documents (id, title, source, content_type, metadata, content_hash, chunk_count, created_at, updated_at)
|
|
39
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(docId, title, opts.source ?? null, opts.contentType ?? "text", JSON.stringify(opts.metadata ?? {}), hash, chunks.length, ts, ts);
|
|
40
|
+
let tokens = 0;
|
|
41
|
+
const insertChunk = db.prepare(`INSERT INTO chunks (id, doc_id, idx, content, embedding, token_count, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)`);
|
|
42
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
43
|
+
const chunk = chunks[i];
|
|
44
|
+
const vec = await embedText(chunk.text);
|
|
45
|
+
tokens += chunk.tokenCount;
|
|
46
|
+
const res = insertChunk.run(newId(), docId, chunk.index, chunk.text, packVector(vec), chunk.tokenCount, ts);
|
|
47
|
+
insertFtsRow(docId, Number(res.lastInsertRowid), chunk.text);
|
|
48
|
+
}
|
|
49
|
+
invalidateVectorCache();
|
|
50
|
+
return { docId, title, chunks: chunks.length, tokens, deduplicated: false };
|
|
51
|
+
}
|
|
52
|
+
function assertAllowedPath(abs) {
|
|
53
|
+
const raw = process.env.RAG_ALLOWED_DIRS;
|
|
54
|
+
if (!raw)
|
|
55
|
+
return;
|
|
56
|
+
const roots = raw
|
|
57
|
+
.split(/[;|,]/)
|
|
58
|
+
.map((p) => path.resolve(p.trim()))
|
|
59
|
+
.filter(Boolean);
|
|
60
|
+
if (roots.length === 0)
|
|
61
|
+
return;
|
|
62
|
+
const real = fs.realpathSync(abs);
|
|
63
|
+
if (!roots.some((r) => real === r || real.startsWith(r + path.sep))) {
|
|
64
|
+
throw new Error(`Path not allowed by RAG_ALLOWED_DIRS: ${abs}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function ingestFile(filePath, opts = {}) {
|
|
68
|
+
const abs = path.resolve(filePath);
|
|
69
|
+
if (!fs.existsSync(abs))
|
|
70
|
+
throw new Error(`File not found: ${abs}`);
|
|
71
|
+
const st = fs.statSync(abs);
|
|
72
|
+
if (!st.isFile())
|
|
73
|
+
throw new Error(`Not a file: ${abs}`);
|
|
74
|
+
const maxMb = Number(process.env.RAG_MAX_FILE_MB ?? 10);
|
|
75
|
+
const maxBytes = Math.max(1024, Math.floor(maxMb * 1024 * 1024));
|
|
76
|
+
if (st.size > maxBytes) {
|
|
77
|
+
throw new Error(`File too large (${st.size} bytes > limit ${maxBytes}): ${abs}. Raise RAG_MAX_FILE_MB to allow bigger files.`);
|
|
78
|
+
}
|
|
79
|
+
assertAllowedPath(abs);
|
|
80
|
+
const content = fs.readFileSync(abs, "utf-8");
|
|
81
|
+
const title = path.basename(abs);
|
|
82
|
+
return ingestText(content, title, {
|
|
83
|
+
source: abs,
|
|
84
|
+
contentType: opts.contentType ?? guessContentType(abs),
|
|
85
|
+
metadata: opts.metadata ?? { path: abs },
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/** Let the event loop breathe every N files during large directory ingests. */
|
|
89
|
+
function yieldLoop() {
|
|
90
|
+
return new Promise((resolve) => setImmediate(resolve));
|
|
91
|
+
}
|
|
92
|
+
export async function ingestDirectory(dirPath, opts = {}) {
|
|
93
|
+
const root = path.resolve(dirPath);
|
|
94
|
+
if (!fs.existsSync(root) || !fs.statSync(root).isDirectory()) {
|
|
95
|
+
throw new Error(`Not a directory: ${dirPath}`);
|
|
96
|
+
}
|
|
97
|
+
assertAllowedPath(root);
|
|
98
|
+
const exts = opts.extensions?.map((e) => (e.startsWith(".") ? e : `.${e}`)) ?? [
|
|
99
|
+
".ts", ".tsx", ".js", ".jsx", ".json", ".md", ".txt", ".py", ".go", ".rs", ".java", ".c", ".h", ".cpp", ".html", ".css",
|
|
100
|
+
];
|
|
101
|
+
const skipDirs = new Set([".git", "dist", "node_modules", ".rag-data", ".test-data", ".venv"]);
|
|
102
|
+
const files = [];
|
|
103
|
+
const walk = (dir) => {
|
|
104
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
105
|
+
const full = path.join(dir, entry.name);
|
|
106
|
+
if (entry.isDirectory()) {
|
|
107
|
+
if (opts.recursive && !skipDirs.has(entry.name) && !entry.name.startsWith("."))
|
|
108
|
+
walk(full);
|
|
109
|
+
}
|
|
110
|
+
else if (entry.isFile() && exts.some((e) => full.endsWith(e))) {
|
|
111
|
+
files.push(full);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
walk(root);
|
|
116
|
+
const ingested = [];
|
|
117
|
+
const skipped = [];
|
|
118
|
+
for (let i = 0; i < files.sort().length; i++) {
|
|
119
|
+
const f = files[i];
|
|
120
|
+
try {
|
|
121
|
+
ingested.push(await ingestFile(f, { metadata: opts.metadata ?? { ingestDir: root } }));
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
skipped.push(`${f} (${e.message})`);
|
|
125
|
+
}
|
|
126
|
+
if (i % 10 === 9)
|
|
127
|
+
await yieldLoop();
|
|
128
|
+
}
|
|
129
|
+
return { ingested, skipped };
|
|
130
|
+
}
|
|
131
|
+
export async function searchDocs(query, topK = 10, minScore = 0.08) {
|
|
132
|
+
const q = await embedText(query);
|
|
133
|
+
return searchChunks(q, { queryText: query, topK, minScore });
|
|
134
|
+
}
|
|
135
|
+
export async function retrieve(query, topK = 6, minScore = 0.08) {
|
|
136
|
+
const hits = await searchDocs(query, topK, minScore);
|
|
137
|
+
const withTokens = hits.map((h) => ({
|
|
138
|
+
docTitle: h.docTitle,
|
|
139
|
+
chunkIndex: h.chunkIndex,
|
|
140
|
+
content: h.content,
|
|
141
|
+
score: h.score,
|
|
142
|
+
tokenCount: h.tokenCount,
|
|
143
|
+
}));
|
|
144
|
+
return {
|
|
145
|
+
chunks: withTokens,
|
|
146
|
+
totalTokens: withTokens.reduce((acc, c) => acc + c.tokenCount, 0),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export function listDocuments() {
|
|
150
|
+
const db = getDB();
|
|
151
|
+
const rows = db
|
|
152
|
+
.prepare(`SELECT id, title, source, content_type, chunk_count, created_at, updated_at, metadata FROM documents ORDER BY updated_at DESC`)
|
|
153
|
+
.all();
|
|
154
|
+
return rows;
|
|
155
|
+
}
|
|
156
|
+
export function deleteDocument(docId) {
|
|
157
|
+
const db = getDB();
|
|
158
|
+
db.prepare("DELETE FROM chunks_fts WHERE rowid IN (SELECT rowid FROM chunks WHERE doc_id = ?)").run(docId);
|
|
159
|
+
const res = db.prepare("DELETE FROM documents WHERE id = ?").run(docId);
|
|
160
|
+
invalidateVectorCache();
|
|
161
|
+
return { deleted: Number(res.changes) > 0 };
|
|
162
|
+
}
|
|
163
|
+
export function documentStats() {
|
|
164
|
+
const db = getDB();
|
|
165
|
+
const docs = db.prepare("SELECT COUNT(*) AS c FROM documents").get();
|
|
166
|
+
const chunks = db.prepare("SELECT COUNT(*) AS c FROM chunks").get();
|
|
167
|
+
const tokens = db.prepare("SELECT COALESCE(SUM(token_count),0) AS c FROM chunks").get();
|
|
168
|
+
return { documents: docs.c, chunks: chunks.c, tokens: tokens.c };
|
|
169
|
+
}
|
|
170
|
+
function guessContentType(file) {
|
|
171
|
+
const ext = path.extname(file).toLowerCase();
|
|
172
|
+
const map = {
|
|
173
|
+
".ts": "typescript", ".tsx": "tsx", ".js": "javascript", ".jsx": "jsx", ".json": "json",
|
|
174
|
+
".md": "markdown", ".txt": "text", ".py": "python", ".go": "go", ".rs": "rust", ".toml": "toml",
|
|
175
|
+
".yaml": "yaml", ".yml": "yaml", ".html": "html", ".css": "css", ".sql": "sql", ".jsonl": "jsonl", ".log": "log",
|
|
176
|
+
};
|
|
177
|
+
return map[ext] ?? "text";
|
|
178
|
+
}
|
|
179
|
+
/** Raw vector search over chunk keys (used by CLI/tests). */
|
|
180
|
+
export { vectorSearch, invalidateVectorCache };
|
|
181
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/rag/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AA4BvF,gEAAgE;AAChE,SAAS,YAAY,CAAC,KAAa,EAAE,KAAa,EAAE,IAAY;IAC9D,IAAI,CAAC;QACH,KAAK,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,KAAa,EACb,OAA0B,EAAE;IAE5B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IAEnB,iEAAiE;IACjE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,EAAE;SAChB,OAAO,CAAC,qEAAqE,CAAC;SAC9E,GAAG,CAAC,IAAI,CAAmE,CAAC;IAC/E,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,wEAAwE,CAAC;aACjF,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAkB,CAAC;QACrC,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,EAAE;YAClB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,QAAQ,CAAC,WAAW;YAC5B,MAAM,EAAE,MAAM,CAAC,CAAC;YAChB,YAAY,EAAE,IAAI;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC;IACtB,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,EAAE,CAAC,OAAO,CACR;wCACoC,CACrC,CAAC,GAAG,CACH,KAAK,EACL,KAAK,EACL,IAAI,CAAC,MAAM,IAAI,IAAI,EACnB,IAAI,CAAC,WAAW,IAAI,MAAM,EAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EACnC,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,EAAE,EACF,EAAE,CACH,CAAC;IAEF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,gHAAgH,CACjH,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;QAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5G,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IACD,qBAAqB,EAAE,CAAC;IAExB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,KAAK,GAAG,GAAG;SACd,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,OAA0B,EAAE;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;IACnE,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;IAExD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;IACjE,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,mBAAmB,EAAE,CAAC,IAAI,kBAAkB,QAAQ,MAAM,GAAG,gDAAgD,CAC9G,CAAC;IACJ,CAAC;IACD,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAEvB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE;QAChC,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAC,GAAG,CAAC;QACtD,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;KACzC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAC/E,SAAS,SAAS;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,OAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI;QAC7E,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;KACxH,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7F,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;IAEX,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACzF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAM,CAAW,CAAC,OAAO,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC;YAAE,MAAM,SAAS,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,GAAG,IAAI;IACxE,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,YAAY,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI;IACrE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,UAAU,EAAE,CAAC,CAAC,UAAU;KACzB,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN,+HAA+H,CAChI;SACA,GAAG,EAA+C,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,EAAE,CAAC,OAAO,CAAC,mFAAmF,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3G,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxE,qBAAqB,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAmB,CAAC;IACtF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,EAAmB,CAAC;IACrF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAAmB,CAAC;IACzG,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,GAAG,GAA2B;QAClC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM;QACvF,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;QAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;KACjH,CAAC;IACF,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC;AAC5B,CAAC;AAED,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAC"}
|