@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,205 @@
1
+ // Cascading search-block matcher for apply_workspace_patch.
2
+ // A patch built from a compacted/reformatted read (see ContextSqueezer.squeezeCode)
3
+ // will rarely byte-match the file on disk. Instead of failing immediately, we widen
4
+ // the match strategy in stages, from exact to fuzzy, before giving up.
5
+ const FUZZY_THRESHOLD = 0.85;
6
+ const MAX_FILE_LINES_FOR_FUZZY = 8000; // guard against pathological inputs
7
+ function normalizeWhitespace(line) {
8
+ return line.replace(/\s+/g, " ").trim();
9
+ }
10
+ function trimmed(line) {
11
+ return line.trim();
12
+ }
13
+ function leadingWhitespace(line) {
14
+ const m = line.match(/^[ \t]*/);
15
+ return m ? m[0] : "";
16
+ }
17
+ // Dice coefficient over character bigrams — cheap, good enough to rank near-miss blocks.
18
+ function similarity(a, b) {
19
+ if (a === b)
20
+ return 1;
21
+ if (a.length < 2 || b.length < 2)
22
+ return a === b ? 1 : 0;
23
+ const bigrams = (s) => {
24
+ const m = new Map();
25
+ for (let i = 0; i < s.length - 1; i++) {
26
+ const bg = s.substring(i, i + 2);
27
+ m.set(bg, (m.get(bg) || 0) + 1);
28
+ }
29
+ return m;
30
+ };
31
+ const ba = bigrams(a);
32
+ const bb = bigrams(b);
33
+ let intersection = 0;
34
+ for (const [bg, count] of ba) {
35
+ const other = bb.get(bg);
36
+ if (other)
37
+ intersection += Math.min(count, other);
38
+ }
39
+ const total = [...ba.values()].reduce((s, c) => s + c, 0) + [...bb.values()].reduce((s, c) => s + c, 0);
40
+ return total === 0 ? 0 : (2 * intersection) / total;
41
+ }
42
+ // Reapply the indentation delta observed on the first matched line to every line
43
+ // of the replacement block, so the patch doesn't collapse to the search block's
44
+ // (possibly stale/compacted) indentation.
45
+ export function reindentReplacement(replaceContent, searchContent, matchedFirstLine) {
46
+ const searchFirstLine = searchContent.split("\n")[0] ?? "";
47
+ const searchIndent = leadingWhitespace(searchFirstLine);
48
+ const matchedIndent = leadingWhitespace(matchedFirstLine);
49
+ if (searchIndent === matchedIndent)
50
+ return replaceContent;
51
+ const delta = matchedIndent.length - searchIndent.length;
52
+ if (delta === 0)
53
+ return replaceContent;
54
+ return replaceContent
55
+ .split("\n")
56
+ .map((line) => {
57
+ if (line.trim() === "")
58
+ return line;
59
+ if (delta > 0)
60
+ return matchedIndent.slice(0, delta) + line;
61
+ const strip = Math.min(-delta, leadingWhitespace(line).length);
62
+ return line.slice(strip);
63
+ })
64
+ .join("\n");
65
+ }
66
+ function findExact(content, searchContent) {
67
+ const results = [];
68
+ let fromIndex = 0;
69
+ while (true) {
70
+ const idx = content.indexOf(searchContent, fromIndex);
71
+ if (idx === -1)
72
+ break;
73
+ const startLine = content.slice(0, idx).split("\n").length - 1;
74
+ const endLine = startLine + searchContent.split("\n").length - 1;
75
+ results.push({ strategy: "exact", startLine, endLine, matchedText: searchContent, score: 1 });
76
+ fromIndex = idx + 1;
77
+ }
78
+ return results;
79
+ }
80
+ function findByLineNormalization(contentLines, searchLines, strategy) {
81
+ const normalize = strategy === "whitespace-normalized" ? normalizeWhitespace : trimmed;
82
+ const normSearch = searchLines.map(normalize).join("\n");
83
+ const windowSize = searchLines.length;
84
+ const results = [];
85
+ for (let i = 0; i + windowSize <= contentLines.length; i++) {
86
+ const window = contentLines.slice(i, i + windowSize);
87
+ const normWindow = window.map(normalize).join("\n");
88
+ if (normWindow === normSearch) {
89
+ results.push({
90
+ strategy,
91
+ startLine: i,
92
+ endLine: i + windowSize - 1,
93
+ matchedText: window.join("\n"),
94
+ score: 1,
95
+ });
96
+ }
97
+ }
98
+ return results;
99
+ }
100
+ function findFuzzy(contentLines, searchLines) {
101
+ if (contentLines.length > MAX_FILE_LINES_FOR_FUZZY)
102
+ return [];
103
+ const windowSize = searchLines.length;
104
+ const searchBlock = searchLines.map(trimmed).join("\n");
105
+ const scored = [];
106
+ for (let i = 0; i + windowSize <= contentLines.length; i++) {
107
+ const window = contentLines.slice(i, i + windowSize);
108
+ const windowBlock = window.map(trimmed).join("\n");
109
+ const score = similarity(windowBlock, searchBlock);
110
+ if (score >= FUZZY_THRESHOLD) {
111
+ scored.push({ strategy: "fuzzy", startLine: i, endLine: i + windowSize - 1, matchedText: window.join("\n"), score });
112
+ }
113
+ }
114
+ scored.sort((a, b) => b.score - a.score);
115
+ return scored;
116
+ }
117
+ // Best-effort nearest block, used only to build a helpful diff on total failure.
118
+ function findClosestCandidate(contentLines, searchLines) {
119
+ if (contentLines.length > MAX_FILE_LINES_FOR_FUZZY || searchLines.length === 0)
120
+ return null;
121
+ const windowSize = searchLines.length;
122
+ const searchBlock = searchLines.map(trimmed).join("\n");
123
+ let best = null;
124
+ for (let i = 0; i + windowSize <= contentLines.length; i++) {
125
+ const window = contentLines.slice(i, i + windowSize);
126
+ const score = similarity(window.map(trimmed).join("\n"), searchBlock);
127
+ if (!best || score > best.score) {
128
+ best = { startLine: i, text: window.join("\n"), score };
129
+ }
130
+ }
131
+ return best;
132
+ }
133
+ // Minimal line-level diff (LCS-based), capped for output size.
134
+ export function buildLineDiff(searchLines, candidateLines, maxLines = 40) {
135
+ const n = searchLines.length;
136
+ const m = candidateLines.length;
137
+ const dp = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
138
+ for (let i = n - 1; i >= 0; i--) {
139
+ for (let j = m - 1; j >= 0; j--) {
140
+ dp[i][j] = searchLines[i] === candidateLines[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);
141
+ }
142
+ }
143
+ const out = [];
144
+ let i = 0, j = 0;
145
+ while (i < n && j < m && out.length < maxLines) {
146
+ if (searchLines[i] === candidateLines[j]) {
147
+ out.push(` ${searchLines[i]}`);
148
+ i++;
149
+ j++;
150
+ }
151
+ else if (dp[i + 1][j] >= dp[i][j + 1]) {
152
+ out.push(`- ${searchLines[i]}`);
153
+ i++;
154
+ }
155
+ else {
156
+ out.push(`+ ${candidateLines[j]}`);
157
+ j++;
158
+ }
159
+ }
160
+ while (i < n && out.length < maxLines) {
161
+ out.push(`- ${searchLines[i]}`);
162
+ i++;
163
+ }
164
+ while (j < m && out.length < maxLines) {
165
+ out.push(`+ ${candidateLines[j]}`);
166
+ j++;
167
+ }
168
+ return out.join("\n");
169
+ }
170
+ export function findMatch(content, searchContent) {
171
+ const exact = findExact(content, searchContent);
172
+ if (exact.length === 1)
173
+ return exact;
174
+ if (exact.length > 1)
175
+ return { reason: "ambiguous" };
176
+ const contentLines = content.split("\n");
177
+ const searchLines = searchContent.split("\n");
178
+ const wsNorm = findByLineNormalization(contentLines, searchLines, "whitespace-normalized");
179
+ if (wsNorm.length === 1)
180
+ return wsNorm;
181
+ if (wsNorm.length > 1)
182
+ return { reason: "ambiguous" };
183
+ const indentAnchored = findByLineNormalization(contentLines, searchLines, "indent-anchored");
184
+ if (indentAnchored.length === 1)
185
+ return indentAnchored;
186
+ if (indentAnchored.length > 1)
187
+ return { reason: "ambiguous" };
188
+ const fuzzy = findFuzzy(contentLines, searchLines);
189
+ if (fuzzy.length >= 1) {
190
+ // Only accept if there's a clear winner (no near-tie with the runner-up).
191
+ if (fuzzy.length === 1 || fuzzy[0].score - fuzzy[1].score >= 0.05) {
192
+ return [fuzzy[0]];
193
+ }
194
+ return { reason: "ambiguous" };
195
+ }
196
+ const candidate = findClosestCandidate(contentLines, searchLines);
197
+ if (!candidate)
198
+ return { reason: "not_found" };
199
+ return {
200
+ reason: "not_found",
201
+ candidateDiff: buildLineDiff(searchLines, candidate.text.split("\n")),
202
+ candidateStartLine: candidate.startLine + 1,
203
+ };
204
+ }
205
+ //# 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,24 @@
1
+ import crypto from "crypto";
2
+ // Session-scoped (lives for the MCP server process lifetime, which is normally the
3
+ // whole conversation). Tracks the content hash we last actually sent back to the
4
+ // model for a given (filePath, compact) pair, so a second identical read doesn't
5
+ // resend content the model already has in its own context.
6
+ const lastSent = new Map();
7
+ function sha256(content) {
8
+ return crypto.createHash("sha256").update(content).digest("hex");
9
+ }
10
+ function cacheKey(resolvedPath, compact) {
11
+ return `${resolvedPath}::${compact}`;
12
+ }
13
+ /** Check whether this exact (path, compact) content was already sent this session. */
14
+ export function checkAlreadySent(resolvedPath, compact, rawContent) {
15
+ const hash = sha256(rawContent);
16
+ const key = cacheKey(resolvedPath, compact);
17
+ const unchanged = lastSent.get(key) === hash;
18
+ return { unchanged, hash };
19
+ }
20
+ /** Record that this content was just sent, so future identical reads short-circuit. */
21
+ export function recordSent(resolvedPath, compact, hash) {
22
+ lastSent.set(cacheKey(resolvedPath, compact), hash);
23
+ }
24
+ //# sourceMappingURL=ReadWorkspaceCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReadWorkspaceCache.js","sourceRoot":"","sources":["../../../src/utils/ReadWorkspaceCache.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,mFAAmF;AACnF,iFAAiF;AACjF,iFAAiF;AACjF,2DAA2D;AAC3D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,SAAS,MAAM,CAAC,OAAe;IAC7B,OAAO,MAAM,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,MAAM,UAAU,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,MAAM,UAAU,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,67 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import crypto from "crypto";
4
+ const IGNORED_DIRS = ["node_modules", ".git", "dist", "chroma_data", ".lemma"];
5
+ const MAX_FINGERPRINT_ENTRIES = 20000; // guard against pathological repos
6
+ // Session-scoped cache of the final search_workspace response text, keyed by query
7
+ // params + a cheap repo-state fingerprint. The fingerprint is built from path+mtime+size
8
+ // (stat calls only, no file content reads), so it's far cheaper than the grep it
9
+ // guards, and it changes the instant any tracked file is added/removed/modified —
10
+ // including edits made outside Lemma's own write tools.
11
+ const cache = new Map();
12
+ // Computed once per call and reused across a request; exported for testability.
13
+ export function computeWorkspaceFingerprint(workspaceRoot) {
14
+ const parts = [];
15
+ let count = 0;
16
+ function walk(dir, rel) {
17
+ if (count >= MAX_FINGERPRINT_ENTRIES)
18
+ return;
19
+ let entries;
20
+ try {
21
+ entries = fs.readdirSync(dir, { withFileTypes: true });
22
+ }
23
+ catch {
24
+ return;
25
+ }
26
+ for (const entry of entries) {
27
+ if (count >= MAX_FINGERPRINT_ENTRIES)
28
+ return;
29
+ if (IGNORED_DIRS.includes(entry.name))
30
+ continue;
31
+ const r = rel ? path.join(rel, entry.name) : entry.name;
32
+ const full = path.join(dir, entry.name);
33
+ if (entry.isDirectory()) {
34
+ walk(full, r);
35
+ continue;
36
+ }
37
+ try {
38
+ const stat = fs.statSync(full);
39
+ parts.push(`${r}:${stat.mtimeMs}:${stat.size}`);
40
+ count++;
41
+ }
42
+ catch {
43
+ // unreadable — treat as absent, still contributes to fingerprint via omission
44
+ }
45
+ }
46
+ }
47
+ walk(workspaceRoot, "");
48
+ return crypto.createHash("sha256").update(parts.join("|")).digest("hex");
49
+ }
50
+ function cacheKey(query, extensions, maxResults, fingerprint) {
51
+ return `${query.toLowerCase()}::${(extensions ?? []).join(",")}::${maxResults}::${fingerprint}`;
52
+ }
53
+ export function getCachedSearch(workspaceRoot, query, extensions, maxResults) {
54
+ const fingerprint = computeWorkspaceFingerprint(workspaceRoot);
55
+ const hit = cache.get(cacheKey(query, extensions, maxResults, fingerprint));
56
+ return { text: hit ?? null, fingerprint };
57
+ }
58
+ export function setCachedSearch(query, extensions, maxResults, fingerprint, text) {
59
+ const MAX_CACHE_ENTRIES = 200;
60
+ if (cache.size >= MAX_CACHE_ENTRIES) {
61
+ const oldestKey = cache.keys().next().value;
62
+ if (oldestKey)
63
+ cache.delete(oldestKey);
64
+ }
65
+ cache.set(cacheKey(query, extensions, maxResults, fingerprint), text);
66
+ }
67
+ //# sourceMappingURL=SearchCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchCache.js","sourceRoot":"","sources":["../../../src/utils/SearchCache.ts"],"names":[],"mappings":"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"}
@@ -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,150 @@
1
+ import fs from "fs";
2
+ import * as ts from "typescript";
3
+ const SUPPORTED_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mts", ".cts"];
4
+ export function isStructurallySearchable(filePath) {
5
+ return SUPPORTED_EXTENSIONS.some((ext) => filePath.endsWith(ext));
6
+ }
7
+ function oneLineSignature(text) {
8
+ return text.replace(/\s+/g, " ").trim();
9
+ }
10
+ function collectDeclarations(sourceFile) {
11
+ const declarations = [];
12
+ function lineOf(pos) {
13
+ return sourceFile.getLineAndCharacterOfPosition(pos).line + 1;
14
+ }
15
+ function addFromFunctionLike(node, name, kind) {
16
+ const start = node.getStart(sourceFile);
17
+ const end = node.body ? node.body.getStart(sourceFile) : node.getEnd();
18
+ let sig = sourceFile.text.substring(start, end).trim();
19
+ if (sig.endsWith("{"))
20
+ sig = sig.slice(0, -1).trim();
21
+ declarations.push({ kind, name, signature: oneLineSignature(sig), startLine: lineOf(node.getStart(sourceFile)), endLine: lineOf(node.getEnd()) });
22
+ }
23
+ function visit(node) {
24
+ if (ts.isFunctionDeclaration(node) && node.name) {
25
+ addFromFunctionLike(node, node.name.text, "function");
26
+ }
27
+ else if (ts.isMethodDeclaration(node) && ts.isIdentifier(node.name)) {
28
+ addFromFunctionLike(node, node.name.text, "method");
29
+ }
30
+ else if (ts.isClassDeclaration(node) && node.name) {
31
+ declarations.push({
32
+ kind: "class",
33
+ name: node.name.text,
34
+ signature: `class ${node.name.text}`,
35
+ startLine: lineOf(node.getStart(sourceFile)),
36
+ endLine: lineOf(node.getEnd()),
37
+ });
38
+ }
39
+ else if (ts.isInterfaceDeclaration(node)) {
40
+ declarations.push({
41
+ kind: "interface",
42
+ name: node.name.text,
43
+ signature: `interface ${node.name.text}`,
44
+ startLine: lineOf(node.getStart(sourceFile)),
45
+ endLine: lineOf(node.getEnd()),
46
+ });
47
+ }
48
+ else if (ts.isTypeAliasDeclaration(node)) {
49
+ declarations.push({
50
+ kind: "type",
51
+ name: node.name.text,
52
+ signature: oneLineSignature(node.getText(sourceFile).split("=")[0] + "= ..."),
53
+ startLine: lineOf(node.getStart(sourceFile)),
54
+ endLine: lineOf(node.getEnd()),
55
+ });
56
+ }
57
+ else if (ts.isEnumDeclaration(node)) {
58
+ declarations.push({
59
+ kind: "enum",
60
+ name: node.name.text,
61
+ signature: `enum ${node.name.text}`,
62
+ startLine: lineOf(node.getStart(sourceFile)),
63
+ endLine: lineOf(node.getEnd()),
64
+ });
65
+ }
66
+ else if (ts.isVariableStatement(node) &&
67
+ node.declarationList.declarations.length === 1 &&
68
+ ts.isIdentifier(node.declarationList.declarations[0].name) &&
69
+ node.declarationList.declarations[0].initializer &&
70
+ (ts.isArrowFunction(node.declarationList.declarations[0].initializer) || ts.isFunctionExpression(node.declarationList.declarations[0].initializer))) {
71
+ const decl = node.declarationList.declarations[0];
72
+ const fn = decl.initializer;
73
+ const start = node.getStart(sourceFile);
74
+ const end = fn.body.getStart(sourceFile);
75
+ let sig = sourceFile.text.substring(start, end).trim();
76
+ if (sig.endsWith("{"))
77
+ sig = sig.slice(0, -1).trim();
78
+ declarations.push({
79
+ kind: "arrow",
80
+ name: decl.name.text,
81
+ signature: oneLineSignature(sig),
82
+ startLine: lineOf(node.getStart(sourceFile)),
83
+ endLine: lineOf(node.getEnd()),
84
+ });
85
+ }
86
+ ts.forEachChild(node, visit);
87
+ }
88
+ visit(sourceFile);
89
+ return declarations;
90
+ }
91
+ function scriptKindFor(filePath) {
92
+ if (filePath.endsWith(".tsx"))
93
+ return ts.ScriptKind.TSX;
94
+ if (filePath.endsWith(".jsx"))
95
+ return ts.ScriptKind.JSX;
96
+ if (filePath.endsWith(".js") || filePath.endsWith(".cts") || filePath.endsWith(".mts"))
97
+ return ts.ScriptKind.JS;
98
+ return ts.ScriptKind.TS;
99
+ }
100
+ // Collapses raw line matches into the enclosing symbol they fall within, so a query
101
+ // matching many lines inside the same function reports one symbol entry instead of
102
+ // N separate lines. Matches outside any declaration (imports, top-level statements,
103
+ // comments) are returned separately as "unscoped" line hits.
104
+ export function resolveStructuralMatches(fullPath, relativePath, matches) {
105
+ if (!isStructurallySearchable(relativePath))
106
+ return null;
107
+ let sourceText;
108
+ try {
109
+ sourceText = fs.readFileSync(fullPath, "utf8");
110
+ }
111
+ catch {
112
+ return null;
113
+ }
114
+ let sourceFile;
115
+ try {
116
+ sourceFile = ts.createSourceFile(fullPath, sourceText, ts.ScriptTarget.Latest, true, scriptKindFor(relativePath));
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ const declarations = collectDeclarations(sourceFile);
122
+ if (declarations.length === 0)
123
+ return null;
124
+ const bySymbol = new Map();
125
+ const unscoped = [];
126
+ for (const match of matches) {
127
+ // innermost enclosing declaration = smallest range containing the match line
128
+ let best = null;
129
+ for (const d of declarations) {
130
+ if (match.line >= d.startLine && match.line <= d.endLine) {
131
+ if (!best || d.endLine - d.startLine < best.endLine - best.startLine)
132
+ best = d;
133
+ }
134
+ }
135
+ if (!best) {
136
+ unscoped.push(match);
137
+ continue;
138
+ }
139
+ const key = `${best.kind}:${best.name}:${best.startLine}`;
140
+ const existing = bySymbol.get(key);
141
+ if (existing) {
142
+ existing.matchLines.push(match.line);
143
+ }
144
+ else {
145
+ bySymbol.set(key, { symbol: best, matchLines: [match.line] });
146
+ }
147
+ }
148
+ return { symbolHits: [...bySymbol.values()], unscoped };
149
+ }
150
+ //# sourceMappingURL=StructuralSearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StructuralSearch.js","sourceRoot":"","sources":["../../../src/utils/StructuralSearch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAGjC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAe5E,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,mBAAmB,CAAC,UAAyB;IACpD,MAAM,YAAY,GAAqB,EAAE,CAAC;IAE1C,SAAS,MAAM,CAAC,GAAW;QACzB,OAAO,UAAU,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAChE,CAAC;IAED,SAAS,mBAAmB,CAAC,IAAmD,EAAE,IAAY,EAAE,IAA4B;QAC1H,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACvE,IAAI,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACpJ,CAAC;IAED,SAAS,KAAK,CAAC,IAAa;QAC1B,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAChD,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtE,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC;aAAM,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACpD,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBACpC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC5C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBACxC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC5C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;gBAC7E,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC5C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBACnC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC5C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;aAAM,IACL,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAC5B,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAC9C,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1D,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW;YAChD,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EACnJ,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,EAAE,GAAG,IAAI,CAAC,WAAuD,CAAC;YACxE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACzC,IAAI,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACvD,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAG,IAAI,CAAC,IAAsB,CAAC,IAAI;gBACvC,SAAS,EAAE,gBAAgB,CAAC,GAAG,CAAC;gBAChC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAC5C,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC,CAAC;QACL,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,CAAC;IAClB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;IACxD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;IACxD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;IAChH,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED,oFAAoF;AACpF,mFAAmF;AACnF,oFAAoF;AACpF,6DAA6D;AAC7D,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,YAAoB,EACpB,OAAsB;IAEtB,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzD,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,UAAU,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;IACpH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IACxD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,6EAA6E;QAC7E,IAAI,IAAI,GAA0B,IAAI,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACzD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS;oBAAE,IAAI,GAAG,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC1D,CAAC"}
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxuss/lemma",
3
- "version": "1.3.3",
3
+ "version": "1.5.0",
4
4
  "description": "Intelligent AI Gateway for IDEs & Agents — Semantic cache, Privacy Firewall, Infrastructure Command Center, and Autonomous Cost-Optimization.",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",