@nxuss/lemma 1.3.3 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +33 -3
  2. package/bin/init.js +1 -1
  3. package/dist/cjs/mcp/prompts.d.ts +1 -1
  4. package/dist/cjs/mcp/prompts.d.ts.map +1 -1
  5. package/dist/cjs/mcp/prompts.js +4 -1
  6. package/dist/cjs/mcp/prompts.js.map +1 -1
  7. package/dist/cjs/mcp/tools.d.ts.map +1 -1
  8. package/dist/cjs/mcp/tools.js +208 -75
  9. package/dist/cjs/mcp/tools.js.map +1 -1
  10. package/dist/cjs/subconscious/TheBrainV2.d.ts +4 -1
  11. package/dist/cjs/subconscious/TheBrainV2.d.ts.map +1 -1
  12. package/dist/cjs/subconscious/TheBrainV2.js +49 -9
  13. package/dist/cjs/subconscious/TheBrainV2.js.map +1 -1
  14. package/dist/cjs/utils/CommandOutputDistiller.d.ts +75 -0
  15. package/dist/cjs/utils/CommandOutputDistiller.d.ts.map +1 -0
  16. package/dist/cjs/utils/CommandOutputDistiller.js +598 -0
  17. package/dist/cjs/utils/CommandOutputDistiller.js.map +1 -0
  18. package/dist/cjs/utils/PatchMatcher.d.ts +17 -0
  19. package/dist/cjs/utils/PatchMatcher.d.ts.map +1 -0
  20. package/dist/cjs/utils/PatchMatcher.js +210 -0
  21. package/dist/cjs/utils/PatchMatcher.js.map +1 -0
  22. package/dist/cjs/utils/ReadWorkspaceCache.d.ts +9 -0
  23. package/dist/cjs/utils/ReadWorkspaceCache.d.ts.map +1 -0
  24. package/dist/cjs/utils/ReadWorkspaceCache.js +31 -0
  25. package/dist/cjs/utils/ReadWorkspaceCache.js.map +1 -0
  26. package/dist/cjs/utils/SearchCache.d.ts +7 -0
  27. package/dist/cjs/utils/SearchCache.d.ts.map +1 -0
  28. package/dist/cjs/utils/SearchCache.js +75 -0
  29. package/dist/cjs/utils/SearchCache.js.map +1 -0
  30. package/dist/cjs/utils/StructuralSearch.d.ts +18 -0
  31. package/dist/cjs/utils/StructuralSearch.d.ts.map +1 -0
  32. package/dist/cjs/utils/StructuralSearch.js +190 -0
  33. package/dist/cjs/utils/StructuralSearch.js.map +1 -0
  34. package/dist/cjs/utils/WorkspaceSearch.d.ts +20 -0
  35. package/dist/cjs/utils/WorkspaceSearch.d.ts.map +1 -0
  36. package/dist/cjs/utils/WorkspaceSearch.js +0 -0
  37. package/dist/cjs/utils/WorkspaceSearch.js.map +1 -0
  38. package/dist/esm/mcp/prompts.d.ts +1 -1
  39. package/dist/esm/mcp/prompts.d.ts.map +1 -1
  40. package/dist/esm/mcp/prompts.js +4 -1
  41. package/dist/esm/mcp/prompts.js.map +1 -1
  42. package/dist/esm/mcp/tools.d.ts.map +1 -1
  43. package/dist/esm/mcp/tools.js +209 -76
  44. package/dist/esm/mcp/tools.js.map +1 -1
  45. package/dist/esm/subconscious/TheBrainV2.d.ts +4 -1
  46. package/dist/esm/subconscious/TheBrainV2.d.ts.map +1 -1
  47. package/dist/esm/subconscious/TheBrainV2.js +49 -9
  48. package/dist/esm/subconscious/TheBrainV2.js.map +1 -1
  49. package/dist/esm/utils/CommandOutputDistiller.d.ts +75 -0
  50. package/dist/esm/utils/CommandOutputDistiller.d.ts.map +1 -0
  51. package/dist/esm/utils/CommandOutputDistiller.js +588 -0
  52. package/dist/esm/utils/CommandOutputDistiller.js.map +1 -0
  53. package/dist/esm/utils/PatchMatcher.d.ts +17 -0
  54. package/dist/esm/utils/PatchMatcher.d.ts.map +1 -0
  55. package/dist/esm/utils/PatchMatcher.js +205 -0
  56. package/dist/esm/utils/PatchMatcher.js.map +1 -0
  57. package/dist/esm/utils/ReadWorkspaceCache.d.ts +9 -0
  58. package/dist/esm/utils/ReadWorkspaceCache.d.ts.map +1 -0
  59. package/dist/esm/utils/ReadWorkspaceCache.js +24 -0
  60. package/dist/esm/utils/ReadWorkspaceCache.js.map +1 -0
  61. package/dist/esm/utils/SearchCache.d.ts +7 -0
  62. package/dist/esm/utils/SearchCache.d.ts.map +1 -0
  63. package/dist/esm/utils/SearchCache.js +67 -0
  64. package/dist/esm/utils/SearchCache.js.map +1 -0
  65. package/dist/esm/utils/StructuralSearch.d.ts +18 -0
  66. package/dist/esm/utils/StructuralSearch.d.ts.map +1 -0
  67. package/dist/esm/utils/StructuralSearch.js +150 -0
  68. package/dist/esm/utils/StructuralSearch.js.map +1 -0
  69. package/dist/esm/utils/WorkspaceSearch.d.ts +20 -0
  70. package/dist/esm/utils/WorkspaceSearch.d.ts.map +1 -0
  71. package/dist/esm/utils/WorkspaceSearch.js +0 -0
  72. package/dist/esm/utils/WorkspaceSearch.js.map +1 -0
  73. package/package.json +1 -1
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ // Cascading search-block matcher for apply_workspace_patch.
3
+ // A patch built from a compacted/reformatted read (see ContextSqueezer.squeezeCode)
4
+ // will rarely byte-match the file on disk. Instead of failing immediately, we widen
5
+ // the match strategy in stages, from exact to fuzzy, before giving up.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.reindentReplacement = reindentReplacement;
8
+ exports.buildLineDiff = buildLineDiff;
9
+ exports.findMatch = findMatch;
10
+ const FUZZY_THRESHOLD = 0.85;
11
+ const MAX_FILE_LINES_FOR_FUZZY = 8000; // guard against pathological inputs
12
+ function normalizeWhitespace(line) {
13
+ return line.replace(/\s+/g, " ").trim();
14
+ }
15
+ function trimmed(line) {
16
+ return line.trim();
17
+ }
18
+ function leadingWhitespace(line) {
19
+ const m = line.match(/^[ \t]*/);
20
+ return m ? m[0] : "";
21
+ }
22
+ // Dice coefficient over character bigrams — cheap, good enough to rank near-miss blocks.
23
+ function similarity(a, b) {
24
+ if (a === b)
25
+ return 1;
26
+ if (a.length < 2 || b.length < 2)
27
+ return a === b ? 1 : 0;
28
+ const bigrams = (s) => {
29
+ const m = new Map();
30
+ for (let i = 0; i < s.length - 1; i++) {
31
+ const bg = s.substring(i, i + 2);
32
+ m.set(bg, (m.get(bg) || 0) + 1);
33
+ }
34
+ return m;
35
+ };
36
+ const ba = bigrams(a);
37
+ const bb = bigrams(b);
38
+ let intersection = 0;
39
+ for (const [bg, count] of ba) {
40
+ const other = bb.get(bg);
41
+ if (other)
42
+ intersection += Math.min(count, other);
43
+ }
44
+ const total = [...ba.values()].reduce((s, c) => s + c, 0) + [...bb.values()].reduce((s, c) => s + c, 0);
45
+ return total === 0 ? 0 : (2 * intersection) / total;
46
+ }
47
+ // Reapply the indentation delta observed on the first matched line to every line
48
+ // of the replacement block, so the patch doesn't collapse to the search block's
49
+ // (possibly stale/compacted) indentation.
50
+ function reindentReplacement(replaceContent, searchContent, matchedFirstLine) {
51
+ const searchFirstLine = searchContent.split("\n")[0] ?? "";
52
+ const searchIndent = leadingWhitespace(searchFirstLine);
53
+ const matchedIndent = leadingWhitespace(matchedFirstLine);
54
+ if (searchIndent === matchedIndent)
55
+ return replaceContent;
56
+ const delta = matchedIndent.length - searchIndent.length;
57
+ if (delta === 0)
58
+ return replaceContent;
59
+ return replaceContent
60
+ .split("\n")
61
+ .map((line) => {
62
+ if (line.trim() === "")
63
+ return line;
64
+ if (delta > 0)
65
+ return matchedIndent.slice(0, delta) + line;
66
+ const strip = Math.min(-delta, leadingWhitespace(line).length);
67
+ return line.slice(strip);
68
+ })
69
+ .join("\n");
70
+ }
71
+ function findExact(content, searchContent) {
72
+ const results = [];
73
+ let fromIndex = 0;
74
+ while (true) {
75
+ const idx = content.indexOf(searchContent, fromIndex);
76
+ if (idx === -1)
77
+ break;
78
+ const startLine = content.slice(0, idx).split("\n").length - 1;
79
+ const endLine = startLine + searchContent.split("\n").length - 1;
80
+ results.push({ strategy: "exact", startLine, endLine, matchedText: searchContent, score: 1 });
81
+ fromIndex = idx + 1;
82
+ }
83
+ return results;
84
+ }
85
+ function findByLineNormalization(contentLines, searchLines, strategy) {
86
+ const normalize = strategy === "whitespace-normalized" ? normalizeWhitespace : trimmed;
87
+ const normSearch = searchLines.map(normalize).join("\n");
88
+ const windowSize = searchLines.length;
89
+ const results = [];
90
+ for (let i = 0; i + windowSize <= contentLines.length; i++) {
91
+ const window = contentLines.slice(i, i + windowSize);
92
+ const normWindow = window.map(normalize).join("\n");
93
+ if (normWindow === normSearch) {
94
+ results.push({
95
+ strategy,
96
+ startLine: i,
97
+ endLine: i + windowSize - 1,
98
+ matchedText: window.join("\n"),
99
+ score: 1,
100
+ });
101
+ }
102
+ }
103
+ return results;
104
+ }
105
+ function findFuzzy(contentLines, searchLines) {
106
+ if (contentLines.length > MAX_FILE_LINES_FOR_FUZZY)
107
+ return [];
108
+ const windowSize = searchLines.length;
109
+ const searchBlock = searchLines.map(trimmed).join("\n");
110
+ const scored = [];
111
+ for (let i = 0; i + windowSize <= contentLines.length; i++) {
112
+ const window = contentLines.slice(i, i + windowSize);
113
+ const windowBlock = window.map(trimmed).join("\n");
114
+ const score = similarity(windowBlock, searchBlock);
115
+ if (score >= FUZZY_THRESHOLD) {
116
+ scored.push({ strategy: "fuzzy", startLine: i, endLine: i + windowSize - 1, matchedText: window.join("\n"), score });
117
+ }
118
+ }
119
+ scored.sort((a, b) => b.score - a.score);
120
+ return scored;
121
+ }
122
+ // Best-effort nearest block, used only to build a helpful diff on total failure.
123
+ function findClosestCandidate(contentLines, searchLines) {
124
+ if (contentLines.length > MAX_FILE_LINES_FOR_FUZZY || searchLines.length === 0)
125
+ return null;
126
+ const windowSize = searchLines.length;
127
+ const searchBlock = searchLines.map(trimmed).join("\n");
128
+ let best = null;
129
+ for (let i = 0; i + windowSize <= contentLines.length; i++) {
130
+ const window = contentLines.slice(i, i + windowSize);
131
+ const score = similarity(window.map(trimmed).join("\n"), searchBlock);
132
+ if (!best || score > best.score) {
133
+ best = { startLine: i, text: window.join("\n"), score };
134
+ }
135
+ }
136
+ return best;
137
+ }
138
+ // Minimal line-level diff (LCS-based), capped for output size.
139
+ function buildLineDiff(searchLines, candidateLines, maxLines = 40) {
140
+ const n = searchLines.length;
141
+ const m = candidateLines.length;
142
+ const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
143
+ for (let i = n - 1; i >= 0; i--) {
144
+ for (let j = m - 1; j >= 0; j--) {
145
+ dp[i][j] = searchLines[i] === candidateLines[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);
146
+ }
147
+ }
148
+ const out = [];
149
+ let i = 0, j = 0;
150
+ while (i < n && j < m && out.length < maxLines) {
151
+ if (searchLines[i] === candidateLines[j]) {
152
+ out.push(` ${searchLines[i]}`);
153
+ i++;
154
+ j++;
155
+ }
156
+ else if (dp[i + 1][j] >= dp[i][j + 1]) {
157
+ out.push(`- ${searchLines[i]}`);
158
+ i++;
159
+ }
160
+ else {
161
+ out.push(`+ ${candidateLines[j]}`);
162
+ j++;
163
+ }
164
+ }
165
+ while (i < n && out.length < maxLines) {
166
+ out.push(`- ${searchLines[i]}`);
167
+ i++;
168
+ }
169
+ while (j < m && out.length < maxLines) {
170
+ out.push(`+ ${candidateLines[j]}`);
171
+ j++;
172
+ }
173
+ return out.join("\n");
174
+ }
175
+ function findMatch(content, searchContent) {
176
+ const exact = findExact(content, searchContent);
177
+ if (exact.length === 1)
178
+ return exact;
179
+ if (exact.length > 1)
180
+ return { reason: "ambiguous" };
181
+ const contentLines = content.split("\n");
182
+ const searchLines = searchContent.split("\n");
183
+ const wsNorm = findByLineNormalization(contentLines, searchLines, "whitespace-normalized");
184
+ if (wsNorm.length === 1)
185
+ return wsNorm;
186
+ if (wsNorm.length > 1)
187
+ return { reason: "ambiguous" };
188
+ const indentAnchored = findByLineNormalization(contentLines, searchLines, "indent-anchored");
189
+ if (indentAnchored.length === 1)
190
+ return indentAnchored;
191
+ if (indentAnchored.length > 1)
192
+ return { reason: "ambiguous" };
193
+ const fuzzy = findFuzzy(contentLines, searchLines);
194
+ if (fuzzy.length >= 1) {
195
+ // Only accept if there's a clear winner (no near-tie with the runner-up).
196
+ if (fuzzy.length === 1 || fuzzy[0].score - fuzzy[1].score >= 0.05) {
197
+ return [fuzzy[0]];
198
+ }
199
+ return { reason: "ambiguous" };
200
+ }
201
+ const candidate = findClosestCandidate(contentLines, searchLines);
202
+ if (!candidate)
203
+ return { reason: "not_found" };
204
+ return {
205
+ reason: "not_found",
206
+ candidateDiff: buildLineDiff(searchLines, candidate.text.split("\n")),
207
+ candidateStartLine: candidate.startLine + 1,
208
+ };
209
+ }
210
+ //# sourceMappingURL=PatchMatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PatchMatcher.js","sourceRoot":"","sources":["../../../src/utils/PatchMatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface ReadDedupCheck {
2
+ unchanged: boolean;
3
+ hash: string;
4
+ }
5
+ /** Check whether this exact (path, compact) content was already sent this session. */
6
+ export declare function checkAlreadySent(resolvedPath: string, compact: boolean, rawContent: string): ReadDedupCheck;
7
+ /** Record that this content was just sent, so future identical reads short-circuit. */
8
+ export declare function recordSent(resolvedPath: string, compact: boolean, hash: string): void;
9
+ //# sourceMappingURL=ReadWorkspaceCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadWorkspaceCache.d.ts","sourceRoot":"","sources":["../../../src/utils/ReadWorkspaceCache.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAK3G;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAErF"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.checkAlreadySent = checkAlreadySent;
7
+ exports.recordSent = recordSent;
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ // Session-scoped (lives for the MCP server process lifetime, which is normally the
10
+ // whole conversation). Tracks the content hash we last actually sent back to the
11
+ // model for a given (filePath, compact) pair, so a second identical read doesn't
12
+ // resend content the model already has in its own context.
13
+ const lastSent = new Map();
14
+ function sha256(content) {
15
+ return crypto_1.default.createHash("sha256").update(content).digest("hex");
16
+ }
17
+ function cacheKey(resolvedPath, compact) {
18
+ return `${resolvedPath}::${compact}`;
19
+ }
20
+ /** Check whether this exact (path, compact) content was already sent this session. */
21
+ function checkAlreadySent(resolvedPath, compact, rawContent) {
22
+ const hash = sha256(rawContent);
23
+ const key = cacheKey(resolvedPath, compact);
24
+ const unchanged = lastSent.get(key) === hash;
25
+ return { unchanged, hash };
26
+ }
27
+ /** Record that this content was just sent, so future identical reads short-circuit. */
28
+ function recordSent(resolvedPath, compact, hash) {
29
+ lastSent.set(cacheKey(resolvedPath, compact), hash);
30
+ }
31
+ //# sourceMappingURL=ReadWorkspaceCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadWorkspaceCache.js","sourceRoot":"","sources":["../../../src/utils/ReadWorkspaceCache.ts"],"names":[],"mappings":";;;;;AAsBA,4CAKC;AAGD,gCAEC;AAhCD,oDAA4B;AAE5B,mFAAmF;AACnF,iFAAiF;AACjF,iFAAiF;AACjF,2DAA2D;AAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,SAAS,MAAM,CAAC,OAAe;IAC7B,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,QAAQ,CAAC,YAAoB,EAAE,OAAgB;IACtD,OAAO,GAAG,YAAY,KAAK,OAAO,EAAE,CAAC;AACvC,CAAC;AAOD,sFAAsF;AACtF,SAAgB,gBAAgB,CAAC,YAAoB,EAAE,OAAgB,EAAE,UAAkB;IACzF,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAC7C,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,uFAAuF;AACvF,SAAgB,UAAU,CAAC,YAAoB,EAAE,OAAgB,EAAE,IAAY;IAC7E,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function computeWorkspaceFingerprint(workspaceRoot: string): string;
2
+ export declare function getCachedSearch(workspaceRoot: string, query: string, extensions: string[] | undefined, maxResults: number): {
3
+ text: string | null;
4
+ fingerprint: string;
5
+ };
6
+ export declare function setCachedSearch(query: string, extensions: string[] | undefined, maxResults: number, fingerprint: string, text: string): void;
7
+ //# sourceMappingURL=SearchCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchCache.d.ts","sourceRoot":"","sources":["../../../src/utils/SearchCache.ts"],"names":[],"mappings":"AAeA,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAiCzE;AAMD,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,GACjB;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAI9C;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,IAAI,CAON"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.computeWorkspaceFingerprint = computeWorkspaceFingerprint;
7
+ exports.getCachedSearch = getCachedSearch;
8
+ exports.setCachedSearch = setCachedSearch;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const crypto_1 = __importDefault(require("crypto"));
12
+ const IGNORED_DIRS = ["node_modules", ".git", "dist", "chroma_data", ".lemma"];
13
+ const MAX_FINGERPRINT_ENTRIES = 20000; // guard against pathological repos
14
+ // Session-scoped cache of the final search_workspace response text, keyed by query
15
+ // params + a cheap repo-state fingerprint. The fingerprint is built from path+mtime+size
16
+ // (stat calls only, no file content reads), so it's far cheaper than the grep it
17
+ // guards, and it changes the instant any tracked file is added/removed/modified —
18
+ // including edits made outside Lemma's own write tools.
19
+ const cache = new Map();
20
+ // Computed once per call and reused across a request; exported for testability.
21
+ function computeWorkspaceFingerprint(workspaceRoot) {
22
+ const parts = [];
23
+ let count = 0;
24
+ function walk(dir, rel) {
25
+ if (count >= MAX_FINGERPRINT_ENTRIES)
26
+ return;
27
+ let entries;
28
+ try {
29
+ entries = fs_1.default.readdirSync(dir, { withFileTypes: true });
30
+ }
31
+ catch {
32
+ return;
33
+ }
34
+ for (const entry of entries) {
35
+ if (count >= MAX_FINGERPRINT_ENTRIES)
36
+ return;
37
+ if (IGNORED_DIRS.includes(entry.name))
38
+ continue;
39
+ const r = rel ? path_1.default.join(rel, entry.name) : entry.name;
40
+ const full = path_1.default.join(dir, entry.name);
41
+ if (entry.isDirectory()) {
42
+ walk(full, r);
43
+ continue;
44
+ }
45
+ try {
46
+ const stat = fs_1.default.statSync(full);
47
+ parts.push(`${r}:${stat.mtimeMs}:${stat.size}`);
48
+ count++;
49
+ }
50
+ catch {
51
+ // unreadable — treat as absent, still contributes to fingerprint via omission
52
+ }
53
+ }
54
+ }
55
+ walk(workspaceRoot, "");
56
+ return crypto_1.default.createHash("sha256").update(parts.join("|")).digest("hex");
57
+ }
58
+ function cacheKey(query, extensions, maxResults, fingerprint) {
59
+ return `${query.toLowerCase()}::${(extensions ?? []).join(",")}::${maxResults}::${fingerprint}`;
60
+ }
61
+ function getCachedSearch(workspaceRoot, query, extensions, maxResults) {
62
+ const fingerprint = computeWorkspaceFingerprint(workspaceRoot);
63
+ const hit = cache.get(cacheKey(query, extensions, maxResults, fingerprint));
64
+ return { text: hit ?? null, fingerprint };
65
+ }
66
+ function setCachedSearch(query, extensions, maxResults, fingerprint, text) {
67
+ const MAX_CACHE_ENTRIES = 200;
68
+ if (cache.size >= MAX_CACHE_ENTRIES) {
69
+ const oldestKey = cache.keys().next().value;
70
+ if (oldestKey)
71
+ cache.delete(oldestKey);
72
+ }
73
+ cache.set(cacheKey(query, extensions, maxResults, fingerprint), text);
74
+ }
75
+ //# sourceMappingURL=SearchCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchCache.js","sourceRoot":"","sources":["../../../src/utils/SearchCache.ts"],"names":[],"mappings":";;;;;AAeA,kEAiCC;AAMD,0CASC;AAED,0CAaC;AA9ED,4CAAoB;AACpB,gDAAwB;AACxB,oDAA4B;AAE5B,MAAM,YAAY,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAC/E,MAAM,uBAAuB,GAAG,KAAK,CAAC,CAAC,mCAAmC;AAE1E,mFAAmF;AACnF,yFAAyF;AACzF,iFAAiF;AACjF,kFAAkF;AAClF,wDAAwD;AACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;AAExC,gFAAgF;AAChF,SAAgB,2BAA2B,CAAC,aAAqB;IAC/D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,SAAS,IAAI,CAAC,GAAW,EAAE,GAAW;QACpC,IAAI,KAAK,IAAI,uBAAuB;YAAE,OAAO;QAC7C,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,IAAI,uBAAuB;gBAAE,OAAO;YAC7C,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChD,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACxD,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChD,KAAK,EAAE,CAAC;YACV,CAAC;YAAC,MAAM,CAAC;gBACP,8EAA8E;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACxB,OAAO,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,UAAgC,EAAE,UAAkB,EAAE,WAAmB;IACxG,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,UAAU,KAAK,WAAW,EAAE,CAAC;AAClG,CAAC;AAED,SAAgB,eAAe,CAC7B,aAAqB,EACrB,KAAa,EACb,UAAgC,EAChC,UAAkB;IAElB,MAAM,WAAW,GAAG,2BAA2B,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAC5E,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;AAC5C,CAAC;AAED,SAAgB,eAAe,CAC7B,KAAa,EACb,UAAgC,EAChC,UAAkB,EAClB,WAAmB,EACnB,IAAY;IAEZ,MAAM,iBAAiB,GAAG,GAAG,CAAC;IAC9B,IAAI,KAAK,CAAC,IAAI,IAAI,iBAAiB,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC5C,IAAI,SAAS;YAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { SearchMatch } from "./WorkspaceSearch";
2
+ export interface DeclaredSymbol {
3
+ kind: "function" | "class" | "method" | "interface" | "type" | "enum" | "arrow";
4
+ name: string;
5
+ signature: string;
6
+ startLine: number;
7
+ endLine: number;
8
+ }
9
+ export interface StructuralFileMatch {
10
+ symbol: DeclaredSymbol;
11
+ matchLines: number[];
12
+ }
13
+ export declare function isStructurallySearchable(filePath: string): boolean;
14
+ export declare function resolveStructuralMatches(fullPath: string, relativePath: string, matches: SearchMatch[]): {
15
+ symbolHits: StructuralFileMatch[];
16
+ unscoped: SearchMatch[];
17
+ } | null;
18
+ //# sourceMappingURL=StructuralSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StructuralSearch.d.ts","sourceRoot":"","sources":["../../../src/utils/StructuralSearch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAElE;AAiGD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,WAAW,EAAE,GACrB;IAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,IAAI,CA6CvE"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.isStructurallySearchable = isStructurallySearchable;
40
+ exports.resolveStructuralMatches = resolveStructuralMatches;
41
+ const fs_1 = __importDefault(require("fs"));
42
+ const ts = __importStar(require("typescript"));
43
+ const SUPPORTED_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mts", ".cts"];
44
+ function isStructurallySearchable(filePath) {
45
+ return SUPPORTED_EXTENSIONS.some((ext) => filePath.endsWith(ext));
46
+ }
47
+ function oneLineSignature(text) {
48
+ return text.replace(/\s+/g, " ").trim();
49
+ }
50
+ function collectDeclarations(sourceFile) {
51
+ const declarations = [];
52
+ function lineOf(pos) {
53
+ return sourceFile.getLineAndCharacterOfPosition(pos).line + 1;
54
+ }
55
+ function addFromFunctionLike(node, name, kind) {
56
+ const start = node.getStart(sourceFile);
57
+ const end = node.body ? node.body.getStart(sourceFile) : node.getEnd();
58
+ let sig = sourceFile.text.substring(start, end).trim();
59
+ if (sig.endsWith("{"))
60
+ sig = sig.slice(0, -1).trim();
61
+ declarations.push({ kind, name, signature: oneLineSignature(sig), startLine: lineOf(node.getStart(sourceFile)), endLine: lineOf(node.getEnd()) });
62
+ }
63
+ function visit(node) {
64
+ if (ts.isFunctionDeclaration(node) && node.name) {
65
+ addFromFunctionLike(node, node.name.text, "function");
66
+ }
67
+ else if (ts.isMethodDeclaration(node) && ts.isIdentifier(node.name)) {
68
+ addFromFunctionLike(node, node.name.text, "method");
69
+ }
70
+ else if (ts.isClassDeclaration(node) && node.name) {
71
+ declarations.push({
72
+ kind: "class",
73
+ name: node.name.text,
74
+ signature: `class ${node.name.text}`,
75
+ startLine: lineOf(node.getStart(sourceFile)),
76
+ endLine: lineOf(node.getEnd()),
77
+ });
78
+ }
79
+ else if (ts.isInterfaceDeclaration(node)) {
80
+ declarations.push({
81
+ kind: "interface",
82
+ name: node.name.text,
83
+ signature: `interface ${node.name.text}`,
84
+ startLine: lineOf(node.getStart(sourceFile)),
85
+ endLine: lineOf(node.getEnd()),
86
+ });
87
+ }
88
+ else if (ts.isTypeAliasDeclaration(node)) {
89
+ declarations.push({
90
+ kind: "type",
91
+ name: node.name.text,
92
+ signature: oneLineSignature(node.getText(sourceFile).split("=")[0] + "= ..."),
93
+ startLine: lineOf(node.getStart(sourceFile)),
94
+ endLine: lineOf(node.getEnd()),
95
+ });
96
+ }
97
+ else if (ts.isEnumDeclaration(node)) {
98
+ declarations.push({
99
+ kind: "enum",
100
+ name: node.name.text,
101
+ signature: `enum ${node.name.text}`,
102
+ startLine: lineOf(node.getStart(sourceFile)),
103
+ endLine: lineOf(node.getEnd()),
104
+ });
105
+ }
106
+ else if (ts.isVariableStatement(node) &&
107
+ node.declarationList.declarations.length === 1 &&
108
+ ts.isIdentifier(node.declarationList.declarations[0].name) &&
109
+ node.declarationList.declarations[0].initializer &&
110
+ (ts.isArrowFunction(node.declarationList.declarations[0].initializer) || ts.isFunctionExpression(node.declarationList.declarations[0].initializer))) {
111
+ const decl = node.declarationList.declarations[0];
112
+ const fn = decl.initializer;
113
+ const start = node.getStart(sourceFile);
114
+ const end = fn.body.getStart(sourceFile);
115
+ let sig = sourceFile.text.substring(start, end).trim();
116
+ if (sig.endsWith("{"))
117
+ sig = sig.slice(0, -1).trim();
118
+ declarations.push({
119
+ kind: "arrow",
120
+ name: decl.name.text,
121
+ signature: oneLineSignature(sig),
122
+ startLine: lineOf(node.getStart(sourceFile)),
123
+ endLine: lineOf(node.getEnd()),
124
+ });
125
+ }
126
+ ts.forEachChild(node, visit);
127
+ }
128
+ visit(sourceFile);
129
+ return declarations;
130
+ }
131
+ function scriptKindFor(filePath) {
132
+ if (filePath.endsWith(".tsx"))
133
+ return ts.ScriptKind.TSX;
134
+ if (filePath.endsWith(".jsx"))
135
+ return ts.ScriptKind.JSX;
136
+ if (filePath.endsWith(".js") || filePath.endsWith(".cts") || filePath.endsWith(".mts"))
137
+ return ts.ScriptKind.JS;
138
+ return ts.ScriptKind.TS;
139
+ }
140
+ // Collapses raw line matches into the enclosing symbol they fall within, so a query
141
+ // matching many lines inside the same function reports one symbol entry instead of
142
+ // N separate lines. Matches outside any declaration (imports, top-level statements,
143
+ // comments) are returned separately as "unscoped" line hits.
144
+ function resolveStructuralMatches(fullPath, relativePath, matches) {
145
+ if (!isStructurallySearchable(relativePath))
146
+ return null;
147
+ let sourceText;
148
+ try {
149
+ sourceText = fs_1.default.readFileSync(fullPath, "utf8");
150
+ }
151
+ catch {
152
+ return null;
153
+ }
154
+ let sourceFile;
155
+ try {
156
+ sourceFile = ts.createSourceFile(fullPath, sourceText, ts.ScriptTarget.Latest, true, scriptKindFor(relativePath));
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ const declarations = collectDeclarations(sourceFile);
162
+ if (declarations.length === 0)
163
+ return null;
164
+ const bySymbol = new Map();
165
+ const unscoped = [];
166
+ for (const match of matches) {
167
+ // innermost enclosing declaration = smallest range containing the match line
168
+ let best = null;
169
+ for (const d of declarations) {
170
+ if (match.line >= d.startLine && match.line <= d.endLine) {
171
+ if (!best || d.endLine - d.startLine < best.endLine - best.startLine)
172
+ best = d;
173
+ }
174
+ }
175
+ if (!best) {
176
+ unscoped.push(match);
177
+ continue;
178
+ }
179
+ const key = `${best.kind}:${best.name}:${best.startLine}`;
180
+ const existing = bySymbol.get(key);
181
+ if (existing) {
182
+ existing.matchLines.push(match.line);
183
+ }
184
+ else {
185
+ bySymbol.set(key, { symbol: best, matchLines: [match.line] });
186
+ }
187
+ }
188
+ return { symbolHits: [...bySymbol.values()], unscoped };
189
+ }
190
+ //# sourceMappingURL=StructuralSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StructuralSearch.js","sourceRoot":"","sources":["../../../src/utils/StructuralSearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface SearchMatch {
2
+ filePath: string;
3
+ line: number;
4
+ text: string;
5
+ }
6
+ export interface GroupedSearchResult {
7
+ totalMatches: number;
8
+ filesMatched: number;
9
+ truncated: boolean;
10
+ formatted: string;
11
+ }
12
+ export declare function loadGitignorePatterns(workspaceRoot: string): RegExp[];
13
+ export declare function parseExtensionFilter(extension?: string): string[] | undefined;
14
+ export interface SearchWorkspaceResult {
15
+ matches: SearchMatch[];
16
+ truncated: boolean;
17
+ }
18
+ export declare function searchWorkspace(workspaceRoot: string, query: string, extensions?: string[], maxResults?: number): SearchWorkspaceResult;
19
+ export declare function groupSearchResults(matches: SearchMatch[], truncated: boolean, maxPerFile?: number, workspaceRoot?: string): GroupedSearchResult;
20
+ //# sourceMappingURL=WorkspaceSearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceSearch.d.ts","sourceRoot":"","sources":["../../../src/utils/WorkspaceSearch.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAwBD,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAYrE;AAcD,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAM7E;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EAAE,EACrB,UAAU,SAAsB,GAC/B,qBAAqB,CAiEvB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,WAAW,EAAE,EACtB,SAAS,EAAE,OAAO,EAClB,UAAU,SAAuB,EACjC,aAAa,CAAC,EAAE,MAAM,GACrB,mBAAmB,CA6BrB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceSearch.js","sourceRoot":"","sources":["../../../src/utils/WorkspaceSearch.ts"],"names":[],"mappings":";;;;;AA4CA,sDAYC;AAcD,oDAMC;AAOD,0CAsEC;AAED,gDAkCC;AA7LD,4CAAoB;AACpB,gDAAwB;AACxB,yDAAwF;AAExF,MAAM,oBAAoB,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AACvF,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,8BAA8B;AACvE,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAe/B,0FAA0F;AAC1F,uFAAuF;AACvF,wFAAwF;AACxF,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,QAAQ;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,OAAO;QAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5C,IAAI,EAAE,GAAG,OAAO;SACb,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAE1B,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;IACxC,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAClC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,qBAAqB,CAAC,aAAqB;IACzD,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,OAAO;aACX,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aAC5D,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe,EAAE,QAAkB;IAC/D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,oBAAoB,CAAC,SAAkB;IACrD,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,SAAS;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SACvC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAOD,SAAgB,eAAe,CAC7B,aAAqB,EACrB,KAAa,EACb,UAAqB,EACrB,UAAU,GAAG,mBAAmB;IAEhC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,SAAS,IAAI,CAAC,UAAkB,EAAE,YAAoB;QACpD,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;YACjC,SAAS,GAAG,IAAI,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,OAAoB,CAAC;QACzB,IAAI,CAAC;YACH,OAAO,GAAG,YAAE,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;gBACjC,SAAS,GAAG,IAAI,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAExD,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5E,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC1D,IAAI,oBAAoB,CAAC,WAAW,EAAE,iBAAiB,CAAC;gBAAE,SAAS;YAEnE,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAChB,SAAS;YACX,CAAC;YAED,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;gBAAE,SAAS;YAEtF,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,IAAI,GAAG,oBAAoB;oBAAE,SAAS;gBAE/C,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAClC,IAAI,cAAc,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAElC,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAAE,SAAS;gBAE1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;oBAC5C,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;wBACjC,SAAS,GAAG,IAAI,CAAC;wBACjB,MAAM;oBACR,CAAC;oBACD,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAClD,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC1E,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACxB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACzC,CAAC;AAED,SAAgB,kBAAkB,CAChC,OAAsB,EACtB,SAAkB,EAClB,UAAU,GAAG,oBAAoB,EACjC,aAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,EAAE,CAAC;QACzC,MAAM,eAAe,GAAG,aAAa,CAAC,CAAC,CAAC,qBAAqB,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnH,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACpD,IAAI,SAAS,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,SAAS,OAAO,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,YAAY,EAAE,MAAM,CAAC,IAAI;QACzB,SAAS;QACT,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,uFAAuF;AACvF,yFAAyF;AACzF,2CAA2C;AAC3C,SAAS,qBAAqB,CAAC,aAAqB,EAAE,IAAY,EAAE,WAA0B,EAAE,UAAkB;IAChH,IAAI,CAAC,IAAA,2CAAwB,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAA,2CAAwB,EAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACvE,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAC1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACjF,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,cAAc,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACpI,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,UAAU,GAAG,CAAC;IACpH,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACnD,IAAI,SAAS,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,SAAS,eAAe,CAAC,CAAC;IAE9D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,sBAAsB,CAAC,CAAC;IAC7H,CAAC;IAED,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACxC,CAAC"}