@untangle-code/search 0.0.0-stage → 0.1.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 (140) hide show
  1. package/LICENSE +661 -0
  2. package/NOTICE +90 -0
  3. package/README.md +433 -2
  4. package/THIRD_PARTY_LICENSES.md +29 -0
  5. package/dist/benchmark-integrity.d.ts +12 -0
  6. package/dist/benchmark-integrity.d.ts.map +1 -0
  7. package/dist/benchmark-integrity.js +10 -0
  8. package/dist/benchmark-integrity.js.map +1 -0
  9. package/dist/bm25.d.ts +46 -0
  10. package/dist/bm25.d.ts.map +1 -0
  11. package/dist/bm25.js +105 -0
  12. package/dist/bm25.js.map +1 -0
  13. package/dist/deadline.d.ts +4 -0
  14. package/dist/deadline.d.ts.map +1 -0
  15. package/dist/deadline.js +54 -0
  16. package/dist/deadline.js.map +1 -0
  17. package/dist/dedupe.d.ts +48 -0
  18. package/dist/dedupe.d.ts.map +1 -0
  19. package/dist/dedupe.js +58 -0
  20. package/dist/dedupe.js.map +1 -0
  21. package/dist/diversify.d.ts +45 -0
  22. package/dist/diversify.d.ts.map +1 -0
  23. package/dist/diversify.js +30 -0
  24. package/dist/diversify.js.map +1 -0
  25. package/dist/engine.d.ts +157 -0
  26. package/dist/engine.d.ts.map +1 -0
  27. package/dist/engine.js +1498 -0
  28. package/dist/engine.js.map +1 -0
  29. package/dist/enrichment.d.ts +16 -0
  30. package/dist/enrichment.d.ts.map +1 -0
  31. package/dist/enrichment.js +92 -0
  32. package/dist/enrichment.js.map +1 -0
  33. package/dist/filter.d.ts +86 -0
  34. package/dist/filter.d.ts.map +1 -0
  35. package/dist/filter.js +166 -0
  36. package/dist/filter.js.map +1 -0
  37. package/dist/findability.d.ts +144 -0
  38. package/dist/findability.d.ts.map +1 -0
  39. package/dist/findability.js +393 -0
  40. package/dist/findability.js.map +1 -0
  41. package/dist/format.d.ts +28 -0
  42. package/dist/format.d.ts.map +1 -0
  43. package/dist/format.js +172 -0
  44. package/dist/format.js.map +1 -0
  45. package/dist/fusion.d.ts +47 -0
  46. package/dist/fusion.d.ts.map +1 -0
  47. package/dist/fusion.js +84 -0
  48. package/dist/fusion.js.map +1 -0
  49. package/dist/glob.d.ts +50 -0
  50. package/dist/glob.d.ts.map +1 -0
  51. package/dist/glob.js +144 -0
  52. package/dist/glob.js.map +1 -0
  53. package/dist/grep.d.ts +76 -0
  54. package/dist/grep.d.ts.map +1 -0
  55. package/dist/grep.js +475 -0
  56. package/dist/grep.js.map +1 -0
  57. package/dist/index.d.ts +42 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +63 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/ledger.d.ts +45 -0
  62. package/dist/ledger.d.ts.map +1 -0
  63. package/dist/ledger.js +39 -0
  64. package/dist/ledger.js.map +1 -0
  65. package/dist/payload.d.ts +108 -0
  66. package/dist/payload.d.ts.map +1 -0
  67. package/dist/payload.js +263 -0
  68. package/dist/payload.js.map +1 -0
  69. package/dist/port.d.ts +112 -0
  70. package/dist/port.d.ts.map +1 -0
  71. package/dist/port.js +2 -0
  72. package/dist/port.js.map +1 -0
  73. package/dist/product-complexity.d.ts +89 -0
  74. package/dist/product-complexity.d.ts.map +1 -0
  75. package/dist/product-complexity.js +1367 -0
  76. package/dist/product-complexity.js.map +1 -0
  77. package/dist/regex-safety.d.ts +75 -0
  78. package/dist/regex-safety.d.ts.map +1 -0
  79. package/dist/regex-safety.js +902 -0
  80. package/dist/regex-safety.js.map +1 -0
  81. package/dist/relevance-prerequisites.d.ts +21 -0
  82. package/dist/relevance-prerequisites.d.ts.map +1 -0
  83. package/dist/relevance-prerequisites.js +47 -0
  84. package/dist/relevance-prerequisites.js.map +1 -0
  85. package/dist/relevance.d.ts +107 -0
  86. package/dist/relevance.d.ts.map +1 -0
  87. package/dist/relevance.js +199 -0
  88. package/dist/relevance.js.map +1 -0
  89. package/dist/retrieval.d.ts +46 -0
  90. package/dist/retrieval.d.ts.map +1 -0
  91. package/dist/retrieval.js +182 -0
  92. package/dist/retrieval.js.map +1 -0
  93. package/dist/scoring.d.ts +102 -0
  94. package/dist/scoring.d.ts.map +1 -0
  95. package/dist/scoring.js +175 -0
  96. package/dist/scoring.js.map +1 -0
  97. package/dist/sort.d.ts +21 -0
  98. package/dist/sort.d.ts.map +1 -0
  99. package/dist/sort.js +53 -0
  100. package/dist/sort.js.map +1 -0
  101. package/dist/symbol-match.d.ts +21 -0
  102. package/dist/symbol-match.d.ts.map +1 -0
  103. package/dist/symbol-match.js +72 -0
  104. package/dist/symbol-match.js.map +1 -0
  105. package/dist/tokenize.d.ts +41 -0
  106. package/dist/tokenize.d.ts.map +1 -0
  107. package/dist/tokenize.js +202 -0
  108. package/dist/tokenize.js.map +1 -0
  109. package/dist/types.d.ts +173 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +42 -0
  112. package/dist/types.js.map +1 -0
  113. package/package.json +61 -3
  114. package/src/benchmark-integrity.ts +25 -0
  115. package/src/bm25.ts +135 -0
  116. package/src/deadline.ts +59 -0
  117. package/src/dedupe.ts +99 -0
  118. package/src/diversify.ts +71 -0
  119. package/src/engine.ts +1957 -0
  120. package/src/enrichment.ts +115 -0
  121. package/src/filter.ts +267 -0
  122. package/src/findability.ts +580 -0
  123. package/src/format.ts +228 -0
  124. package/src/fusion.ts +121 -0
  125. package/src/glob.ts +151 -0
  126. package/src/grep.ts +618 -0
  127. package/src/index.ts +83 -0
  128. package/src/ledger.ts +72 -0
  129. package/src/payload.ts +382 -0
  130. package/src/port.ts +133 -0
  131. package/src/product-complexity.ts +2168 -0
  132. package/src/regex-safety.ts +1002 -0
  133. package/src/relevance-prerequisites.ts +83 -0
  134. package/src/relevance.ts +328 -0
  135. package/src/retrieval.ts +299 -0
  136. package/src/scoring.ts +321 -0
  137. package/src/sort.ts +86 -0
  138. package/src/symbol-match.ts +87 -0
  139. package/src/tokenize.ts +213 -0
  140. package/src/types.ts +206 -0
package/dist/grep.js ADDED
@@ -0,0 +1,475 @@
1
+ import { compareCodepoints } from "@untangle-code/domain";
2
+ import { assertValidGlobPatterns, isPathSelected } from "./glob.js";
3
+ import { SearchSkipLedger } from "./ledger.js";
4
+ import { readCodeChunkPayload } from "./payload.js";
5
+ import { assertSafeGrepPattern } from "./regex-safety.js";
6
+ /** Voreinstellungen der Budgets — jede Ueberschreitung ist ein benannter Abbruchgrund. */
7
+ export const GREP_DEFAULTS = {
8
+ maxMatches: 200,
9
+ maxMatchesPerFile: 50,
10
+ maxScannedChunks: 5000,
11
+ /** Seitengroesse des Scroll-Laufs ueber die Collection. */
12
+ scrollPageSize: 256,
13
+ };
14
+ /**
15
+ * Wie viele glob-ausgeschlossene Chunks EINZELN im Ledger stehen.
16
+ *
17
+ * Jeder ausgeschlossene Chunk gehoert in den Ledger (E4) — bei einem Budget
18
+ * von 5000 gescannten Chunks waere eine Liste mit 5000 Eintraegen aber selbst
19
+ * ein Problem fuer den Leser. Also: die ersten `GREP_GLOB_LEDGER_DETAIL_LIMIT`
20
+ * einzeln, danach EIN Sammeleintrag mit der vollstaendigen Zahl. Verschwiegen
21
+ * wird nichts; die Zahl stimmt in jedem Fall.
22
+ */
23
+ export const GREP_GLOB_LEDGER_DETAIL_LIMIT = 50;
24
+ /** Maskiert einen Literaltext, damit er als regulaerer Ausdruck sich selbst bedeutet. */
25
+ export function escapeRegExpLiteral(text) {
26
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
27
+ }
28
+ /**
29
+ * Baut den Suchausdruck.
30
+ *
31
+ * `wholeWord` verwendet bewusst Lookarounds ueber Bezeichnerzeichen statt
32
+ * `\b`: `\b` kennt nur ASCII-Wortzeichen, und ein Bezeichner mit Umlaut oder
33
+ * `$` waere damit an der falschen Stelle „ganzes Wort".
34
+ */
35
+ export function buildGrepRegExp(request) {
36
+ const pattern = request.pattern;
37
+ if (pattern === "") {
38
+ throw new Error("grep pattern must not be empty");
39
+ }
40
+ if (request.regex === true) {
41
+ // Das `i`-Flag geht in die Pruefung ein: `(a|A)+` ist ohne `i` eindeutig
42
+ // und mit `i` mehrdeutig. Wer das Flag hier vergisst, prueft ein anderes
43
+ // Muster als das, das gleich laeuft.
44
+ assertSafeGrepPattern(pattern, { caseInsensitive: request.caseSensitive === false });
45
+ }
46
+ const body = request.regex === true ? pattern : escapeRegExpLiteral(pattern);
47
+ const wrapped = request.wholeWord === true ? `(?<![\\p{L}\\p{N}_$])(?:${body})(?![\\p{L}\\p{N}_$])` : body;
48
+ const flags = request.caseSensitive === false ? "gui" : "gu";
49
+ try {
50
+ return new RegExp(wrapped, flags);
51
+ }
52
+ catch (error) {
53
+ const message = error instanceof Error ? error.message : String(error);
54
+ throw new Error(`grep pattern is not a valid regular expression: ${message}`);
55
+ }
56
+ }
57
+ function keywordIn(field, values) {
58
+ if (values === undefined || values.length === 0) {
59
+ return undefined;
60
+ }
61
+ const unique = [...new Set(values)].sort(compareCodepoints);
62
+ if (unique.length === 1) {
63
+ return { field, match: { eq: unique[0] } };
64
+ }
65
+ return { field, match: { in: unique } };
66
+ }
67
+ function buildGrepFilter(request, scope = {}) {
68
+ const must = [{ field: "point_type", match: { eq: "code_chunk" } }];
69
+ // WP-190, dieselbe Ursache wie in `normalizeSearchQuery`: getrimmt, damit
70
+ // Speicherfilter und Gegenpruefung denselben Wert benutzen.
71
+ const workspaceId = (request.workspaceId ?? scope.workspaceId)?.trim();
72
+ let unscopedWarning;
73
+ if (workspaceId === undefined || workspaceId === "") {
74
+ // E4: „ueber alles gesucht" und „im eigenen Workspace gesucht" duerfen
75
+ // nicht gleich aussehen.
76
+ unscopedWarning =
77
+ "grep ran without a workspaceId; the scan covers every workspace stored in the searched collections";
78
+ }
79
+ else {
80
+ must.push({ field: "workspace_id", match: { eq: workspaceId } });
81
+ }
82
+ const requested = request.repositories ?? [];
83
+ const declared = scope.repoIds ?? [];
84
+ let repoIds;
85
+ // WP-176: dieselbe Luecke wie bei `search` — angefragte Repositories, die
86
+ // keine Collection fuehrt, fielen lautlos heraus, solange wenigstens EINES
87
+ // uebrig blieb. Nur der vollstaendig leere Durchschnitt kam in den Ledger.
88
+ let outOfScopeRepoIds = [];
89
+ if (requested.length === 0) {
90
+ repoIds = [...new Set(declared)].sort(compareCodepoints);
91
+ }
92
+ else if (declared.length === 0) {
93
+ repoIds = [...new Set(requested)].sort(compareCodepoints);
94
+ }
95
+ else {
96
+ const declaredSet = new Set(declared);
97
+ repoIds = [...new Set(requested.filter((repoId) => declaredSet.has(repoId)))].sort(compareCodepoints);
98
+ outOfScopeRepoIds = [...new Set(requested.filter((repoId) => !declaredSet.has(repoId)))].sort(compareCodepoints);
99
+ if (repoIds.length === 0) {
100
+ return {
101
+ filter: { must },
102
+ repoIds,
103
+ outOfScopeRepoIds,
104
+ ...(workspaceId === undefined || workspaceId === "" ? {} : { workspaceId }),
105
+ emptyScopeReason: `the requested repositories [${[...new Set(requested)].sort(compareCodepoints).join(", ")}] are not part of the searched collections [${[...declaredSet].sort(compareCodepoints).join(", ")}]; nothing was scanned`,
106
+ ...(unscopedWarning === undefined ? {} : { unscopedWarning }),
107
+ };
108
+ }
109
+ }
110
+ for (const condition of [
111
+ keywordIn("repo_id", repoIds),
112
+ keywordIn("ref_id", request.refs),
113
+ keywordIn("language", request.languages),
114
+ ]) {
115
+ if (condition !== undefined) {
116
+ must.push(condition);
117
+ }
118
+ }
119
+ return {
120
+ filter: { must },
121
+ repoIds,
122
+ outOfScopeRepoIds,
123
+ ...(workspaceId === undefined || workspaceId === "" ? {} : { workspaceId }),
124
+ ...(unscopedWarning === undefined ? {} : { unscopedWarning }),
125
+ };
126
+ }
127
+ function collectMatchesInChunk(expression, text, startLine, contextBefore, contextAfter) {
128
+ const lines = text.split("\n");
129
+ const results = [];
130
+ lines.forEach((lineText, index) => {
131
+ // `lastIndex` je Zeile zuruecksetzen: der Ausdruck ist global, und ein
132
+ // stehengebliebener Zeiger wuerde Treffer in der naechsten Zeile
133
+ // ueberspringen — ein klassischer, still wirkender Fehler.
134
+ expression.lastIndex = 0;
135
+ let match = expression.exec(lineText);
136
+ while (match !== null) {
137
+ const matchText = match[0];
138
+ results.push({
139
+ line: startLine + index,
140
+ column: match.index + 1,
141
+ matchText,
142
+ lineText,
143
+ before: sliceContext(lines, index - contextBefore, index, startLine),
144
+ after: sliceContext(lines, index + 1, index + 1 + contextAfter, startLine),
145
+ });
146
+ if (matchText === "") {
147
+ // Nulllaengen-Treffer wuerden sonst endlos an derselben Stelle stehen.
148
+ expression.lastIndex += 1;
149
+ }
150
+ if (expression.lastIndex > lineText.length) {
151
+ break;
152
+ }
153
+ match = expression.exec(lineText);
154
+ }
155
+ });
156
+ return results;
157
+ }
158
+ function sliceContext(lines, from, to, startLine) {
159
+ const begin = Math.max(0, from);
160
+ const end = Math.min(lines.length, to);
161
+ const context = [];
162
+ for (let index = begin; index < end; index += 1) {
163
+ context.push({ line: startLine + index, text: lines[index] });
164
+ }
165
+ return context;
166
+ }
167
+ /**
168
+ * Durchsucht die angegebenen Collections mit einem Muster.
169
+ *
170
+ * Der Ablauf ist bewusst ein Scroll und kein `hybridQuery`: eine Regex-Suche
171
+ * hat kein Ranking-Signal, sie hat einen VOLLSTAENDIGKEITSANSPRUCH. Also wird
172
+ * gefiltert und durchlaufen, bis das Budget greift — und wenn es greift, steht
173
+ * das im Ergebnis.
174
+ */
175
+ export async function grepIndexedChunks(store, collections, request, options, scope = {}) {
176
+ options?.signal?.throwIfAborted();
177
+ const expression = buildGrepRegExp(request);
178
+ const includeGlobsRaw = request.pathGlob ?? [];
179
+ const excludeGlobsRaw = request.pathExclude ?? [];
180
+ // Vor dem ersten Speicherzugriff pruefen: ein fehlerhaftes Muster ist ein
181
+ // Eingabefehler und darf nicht mitten im Scan als Ausfall erscheinen.
182
+ assertValidGlobPatterns(includeGlobsRaw, "pathGlob");
183
+ assertValidGlobPatterns(excludeGlobsRaw, "pathExclude");
184
+ const resolved = buildGrepFilter(request, scope);
185
+ const filter = resolved.filter;
186
+ const ledger = new SearchSkipLedger();
187
+ const warnings = [];
188
+ if (resolved.unscopedWarning !== undefined) {
189
+ warnings.push({ code: "WORKSPACE_UNSCOPED", message: resolved.unscopedWarning });
190
+ }
191
+ const maxMatches = request.maxMatches ?? GREP_DEFAULTS.maxMatches;
192
+ const maxMatchesPerFile = request.maxMatchesPerFile ?? GREP_DEFAULTS.maxMatchesPerFile;
193
+ const maxScannedChunks = request.maxScannedChunks ?? GREP_DEFAULTS.maxScannedChunks;
194
+ const contextBefore = Math.max(0, request.contextLinesBefore ?? 0);
195
+ const contextAfter = Math.max(0, request.contextLinesAfter ?? 0);
196
+ const includeGlobs = includeGlobsRaw;
197
+ const excludeGlobs = excludeGlobsRaw;
198
+ const matches = [];
199
+ const seen = new Set();
200
+ const perFileCounts = new Map();
201
+ let scannedChunks = 0;
202
+ let truncated = false;
203
+ let truncationReason;
204
+ let globExcludedChunks = 0;
205
+ if (resolved.emptyScopeReason !== undefined) {
206
+ ledger.add({
207
+ subjectKind: "chunk",
208
+ reason: "excluded_by_configuration",
209
+ detail: resolved.emptyScopeReason,
210
+ recoverable: true,
211
+ });
212
+ }
213
+ if (resolved.outOfScopeRepoIds.length > 0) {
214
+ const detail = `the requested repositories [${resolved.outOfScopeRepoIds.join(", ")}] are not part of the searched collections; they were NOT scanned`;
215
+ warnings.push({
216
+ code: "REPOSITORY_OUT_OF_SCOPE",
217
+ message: detail,
218
+ details: { repoIds: resolved.outOfScopeRepoIds },
219
+ });
220
+ for (const repoId of resolved.outOfScopeRepoIds) {
221
+ ledger.add({
222
+ subjectKind: "chunk",
223
+ subjectId: repoId,
224
+ repoId,
225
+ reason: "excluded_by_configuration",
226
+ detail,
227
+ recoverable: true,
228
+ });
229
+ }
230
+ }
231
+ scan: for (const collection of resolved.emptyScopeReason === undefined ? collections : []) {
232
+ let offset;
233
+ for (;;) {
234
+ options?.signal?.throwIfAborted();
235
+ const page = await store.scroll(collection, {
236
+ filter,
237
+ limit: GREP_DEFAULTS.scrollPageSize,
238
+ ...(offset === undefined ? {} : { offset }),
239
+ }, options);
240
+ for (const point of page.points) {
241
+ // Je Chunk pruefen, nicht nur je Seite: eine Seite sind bis zu 256
242
+ // Punkte, und ein Abbruch, der erst danach wirkt, ist keiner.
243
+ options?.signal?.throwIfAborted();
244
+ if (scannedChunks >= maxScannedChunks) {
245
+ truncated = true;
246
+ truncationReason = "max_scanned_chunks";
247
+ ledger.add({
248
+ subjectKind: "chunk",
249
+ subjectId: point.id,
250
+ reason: "time_budget_exceeded",
251
+ detail: `grep stopped after scanning ${maxScannedChunks} chunks; the remainder of "${collection}" was not searched`,
252
+ recoverable: true,
253
+ });
254
+ break scan;
255
+ }
256
+ scannedChunks += 1;
257
+ const read = readCodeChunkPayload(point.payload);
258
+ if (!read.ok) {
259
+ ledger.add({
260
+ subjectKind: "chunk",
261
+ subjectId: point.id,
262
+ reason: "missing_index_entry",
263
+ detail: `point "${point.id}" could not be read as a code chunk: ${read.reason}`,
264
+ });
265
+ continue;
266
+ }
267
+ const payload = read.payload;
268
+ // WP-177 (E4): DIE ZWEITE VERTEIDIGUNGSLINIE, die grep bisher nicht
269
+ // hatte. `search` prueft den Geltungsbereich nach dem Abruf ein
270
+ // zweites Mal, weil ein Speicher, der den Payloadfilter nicht oder
271
+ // anders auswertet, sonst fremden Inhalt als eigenen ausliefert. Fuer
272
+ // grep galt dieselbe Gefahr und keine Pruefung: ein solcher Speicher
273
+ // haette hier Zeilen aus einem fremden Workspace ausgedruckt, ohne
274
+ // Warnung und ohne Ledger-Eintrag. Das ist kein ungenaues Ergebnis,
275
+ // sondern ein Datenleck.
276
+ if (resolved.workspaceId !== undefined && payload.workspace_id !== resolved.workspaceId) {
277
+ ledger.add({
278
+ subjectKind: "chunk",
279
+ subjectId: payload.chunk_id,
280
+ path: payload.file_path,
281
+ repoId: payload.repo_id,
282
+ refId: payload.ref_id,
283
+ reason: "excluded_by_configuration",
284
+ detail: `chunk belongs to workspace "${payload.workspace_id}", but this grep is scoped to workspace "${resolved.workspaceId}" — the store returned it anyway`,
285
+ });
286
+ continue;
287
+ }
288
+ if (resolved.repoIds.length > 0 && !resolved.repoIds.includes(payload.repo_id)) {
289
+ ledger.add({
290
+ subjectKind: "chunk",
291
+ subjectId: payload.chunk_id,
292
+ path: payload.file_path,
293
+ repoId: payload.repo_id,
294
+ refId: payload.ref_id,
295
+ reason: "excluded_by_configuration",
296
+ detail: `chunk belongs to repository "${payload.repo_id}", which is not among the scanned repositories [${resolved.repoIds.join(", ")}] — the store returned it anyway`,
297
+ });
298
+ continue;
299
+ }
300
+ if (!isPathSelected(payload.file_path, includeGlobs, excludeGlobs)) {
301
+ // E4: derselbe Ausschluss, den search() in den Ledger schreibt,
302
+ // gehoert auch hier hinein. Sonst meldet grep 12 durchsuchte Chunks
303
+ // und einen leeren Ledger, obwohl 4 davon nie angesehen wurden.
304
+ globExcludedChunks += 1;
305
+ if (globExcludedChunks <= GREP_GLOB_LEDGER_DETAIL_LIMIT) {
306
+ ledger.add({
307
+ subjectKind: "chunk",
308
+ subjectId: payload.chunk_id,
309
+ path: payload.file_path,
310
+ repoId: payload.repo_id,
311
+ refId: payload.ref_id,
312
+ reason: "excluded_by_configuration",
313
+ detail: `path "${payload.file_path}" does not pass the include/exclude globs (include: [${includeGlobs.join(", ")}], exclude: [${excludeGlobs.join(", ")}])`,
314
+ recoverable: true,
315
+ });
316
+ }
317
+ continue;
318
+ }
319
+ if (read.substitutedFields.includes("start_line")) {
320
+ // Ohne `start_line` zaehlt der Chunk ab Zeile 1 — die gemeldeten
321
+ // Zeilennummern waeren dann falsch, ohne dass man es sieht.
322
+ ledger.add({
323
+ subjectKind: "chunk",
324
+ subjectId: payload.chunk_id,
325
+ path: payload.file_path,
326
+ repoId: payload.repo_id,
327
+ refId: payload.ref_id,
328
+ reason: "missing_index_entry",
329
+ detail: "chunk payload carries no start_line; the reported line numbers of its matches count from line 1 of the chunk, not of the file",
330
+ recoverable: true,
331
+ });
332
+ }
333
+ if (payload.content === "") {
334
+ ledger.add({
335
+ subjectKind: "chunk",
336
+ subjectId: payload.chunk_id,
337
+ path: payload.file_path,
338
+ repoId: payload.repo_id,
339
+ refId: payload.ref_id,
340
+ reason: "missing_index_entry",
341
+ detail: "chunk carries no stored content; a regex search cannot inspect it",
342
+ });
343
+ continue;
344
+ }
345
+ const fileKey = `${payload.repo_id}/${payload.ref_id}/${payload.file_id}`;
346
+ for (const found of collectMatchesInChunk(expression, payload.content, payload.start_line, contextBefore, contextAfter)) {
347
+ const key = `${fileKey}:${found.line}:${found.column}:${found.matchText}`;
348
+ if (seen.has(key)) {
349
+ // Ueberlappende Fragmente desselben Symbols liefern denselben
350
+ // Treffer mehrfach; er zaehlt einmal.
351
+ continue;
352
+ }
353
+ const perFile = perFileCounts.get(fileKey) ?? 0;
354
+ if (perFile >= maxMatchesPerFile) {
355
+ truncated = true;
356
+ truncationReason = truncationReason ?? "max_matches_per_file";
357
+ ledger.add({
358
+ subjectKind: "file",
359
+ subjectId: payload.file_id,
360
+ path: payload.file_path,
361
+ repoId: payload.repo_id,
362
+ refId: payload.ref_id,
363
+ reason: "excluded_by_configuration",
364
+ detail: `more than maxMatchesPerFile=${maxMatchesPerFile} matches in this file; further matches were not returned`,
365
+ recoverable: true,
366
+ });
367
+ break;
368
+ }
369
+ seen.add(key);
370
+ perFileCounts.set(fileKey, perFile + 1);
371
+ matches.push({
372
+ key,
373
+ repoId: payload.repo_id,
374
+ repoLabel: payload.repo_label,
375
+ refId: payload.ref_id,
376
+ refName: payload.ref_name,
377
+ ...(payload.commit_sha === undefined ? {} : { commitSha: payload.commit_sha }),
378
+ fileId: payload.file_id,
379
+ filePath: payload.file_path,
380
+ language: payload.language,
381
+ chunkId: payload.chunk_id,
382
+ ...(payload.symbol_name === undefined ? {} : { symbolName: payload.symbol_name }),
383
+ line: found.line,
384
+ column: found.column,
385
+ matchText: found.matchText,
386
+ lineText: found.lineText,
387
+ before: found.before,
388
+ after: found.after,
389
+ });
390
+ if (matches.length >= maxMatches) {
391
+ truncated = true;
392
+ truncationReason = "max_matches";
393
+ ledger.add({
394
+ subjectKind: "chunk",
395
+ subjectId: payload.chunk_id,
396
+ path: payload.file_path,
397
+ repoId: payload.repo_id,
398
+ refId: payload.ref_id,
399
+ reason: "excluded_by_configuration",
400
+ detail: `grep stopped at maxMatches=${maxMatches}; further matches exist but were not returned`,
401
+ recoverable: true,
402
+ });
403
+ break scan;
404
+ }
405
+ }
406
+ }
407
+ if (page.nextOffset === undefined) {
408
+ break;
409
+ }
410
+ offset = page.nextOffset;
411
+ }
412
+ }
413
+ if (globExcludedChunks > GREP_GLOB_LEDGER_DETAIL_LIMIT) {
414
+ ledger.add({
415
+ subjectKind: "chunk",
416
+ reason: "excluded_by_configuration",
417
+ detail: `${globExcludedChunks} scanned chunks were excluded by the include/exclude globs; the first ${GREP_GLOB_LEDGER_DETAIL_LIMIT} are listed individually above`,
418
+ recoverable: true,
419
+ });
420
+ }
421
+ if (collections.length === 0) {
422
+ warnings.push({
423
+ code: "NO_COLLECTIONS",
424
+ message: "grep ran without a single collection to search; the empty result says nothing about the code",
425
+ });
426
+ }
427
+ const sorted = sortGrepMatches(matches, request.sort ?? "path");
428
+ return {
429
+ schemaVersion: 1,
430
+ pattern: request.pattern,
431
+ isRegex: request.regex === true,
432
+ matches: sorted.map(({ key: _key, ...match }) => match),
433
+ totalMatches: sorted.length,
434
+ truncated,
435
+ ...(truncationReason === undefined ? {} : { truncationReason }),
436
+ scannedChunks,
437
+ skipped: ledger.toArray(),
438
+ warnings,
439
+ };
440
+ }
441
+ /** Sortiert grep-Treffer deterministisch. */
442
+ export function sortGrepMatches(matches, sort) {
443
+ const byPath = (a, b) => {
444
+ const byRepo = compareCodepoints(a.repoId, b.repoId);
445
+ if (byRepo !== 0) {
446
+ return byRepo;
447
+ }
448
+ const byRef = compareCodepoints(a.refId, b.refId);
449
+ if (byRef !== 0) {
450
+ return byRef;
451
+ }
452
+ const byFile = compareCodepoints(a.filePath, b.filePath);
453
+ if (byFile !== 0) {
454
+ return byFile;
455
+ }
456
+ if (a.line !== b.line) {
457
+ return a.line - b.line;
458
+ }
459
+ return a.column - b.column;
460
+ };
461
+ if (sort === "path") {
462
+ return [...matches].sort(byPath);
463
+ }
464
+ const counts = new Map();
465
+ for (const match of matches) {
466
+ const key = `${match.repoId}/${match.refId}/${match.fileId}`;
467
+ counts.set(key, (counts.get(key) ?? 0) + 1);
468
+ }
469
+ return [...matches].sort((a, b) => {
470
+ const countA = counts.get(`${a.repoId}/${a.refId}/${a.fileId}`) ?? 0;
471
+ const countB = counts.get(`${b.repoId}/${b.refId}/${b.fileId}`) ?? 0;
472
+ return countA === countB ? byPath(a, b) : countB - countA;
473
+ });
474
+ }
475
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../src/grep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @untangle-code/search — der Abrufkern von Untangle (spec.md §13,
3
+ * architecture.md §18, vision.md §1b/§1d).
4
+ *
5
+ * Das Paket beantwortet die Frage, mit der der Nutzer das Produkt beschrieben
6
+ * hat: „wenn ich nach ‚Funktion X' suche sollte ich schnell an der richtigen
7
+ * Stelle landen, wenn nicht ist der Code vielleicht zu komplex bzw nicht
8
+ * richtig dokumentiert." Beide Haelften stecken hier drin:
9
+ *
10
+ * - die SUCHE — hybrid aus dichtem Vektor, eigenem BM25 und exakten
11
+ * Symbolnamen, fusioniert per RRF, mit einer Score-Zerlegung, die jeden
12
+ * Rang begruendet;
13
+ * - der BEFUND — dieselbe Zerlegung, gelesen als Aussage ueber den Code:
14
+ * `findability.ts` laesst ein Symbol sich selbst suchen und benennt die
15
+ * Ursache, wenn es sich nicht findet.
16
+ *
17
+ * Dieses Modul ist der EINZIGE oeffentliche Export des Pakets.
18
+ */
19
+ export * from "./tokenize.js";
20
+ export * from "./bm25.js";
21
+ export * from "./glob.js";
22
+ export * from "./ledger.js";
23
+ export * from "./payload.js";
24
+ export * from "./filter.js";
25
+ export * from "./symbol-match.js";
26
+ export * from "./fusion.js";
27
+ export * from "./scoring.js";
28
+ export * from "./relevance.js";
29
+ export * from "./dedupe.js";
30
+ export * from "./diversify.js";
31
+ export * from "./sort.js";
32
+ export * from "./types.js";
33
+ export * from "./port.js";
34
+ export * from "./enrichment.js";
35
+ export * from "./engine.js";
36
+ export * from "./regex-safety.js";
37
+ export * from "./grep.js";
38
+ export * from "./format.js";
39
+ export * from "./findability.js";
40
+ export * from "./product-complexity.js";
41
+ export * from "./benchmark-integrity.js";
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,cAAc,eAAe,CAAC;AAG9B,cAAc,WAAW,CAAC;AAG1B,cAAc,WAAW,CAAC;AAG1B,cAAc,aAAa,CAAC;AAG5B,cAAc,cAAc,CAAC;AAG7B,cAAc,aAAa,CAAC;AAG5B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,aAAa,CAAC;AAG5B,cAAc,cAAc,CAAC;AAG7B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,WAAW,CAAC;AAG1B,cAAc,YAAY,CAAC;AAG3B,cAAc,WAAW,CAAC;AAG1B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,aAAa,CAAC;AAG5B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,WAAW,CAAC;AAG1B,cAAc,aAAa,CAAC;AAG5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,0BAA0B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @untangle-code/search — der Abrufkern von Untangle (spec.md §13,
3
+ * architecture.md §18, vision.md §1b/§1d).
4
+ *
5
+ * Das Paket beantwortet die Frage, mit der der Nutzer das Produkt beschrieben
6
+ * hat: „wenn ich nach ‚Funktion X' suche sollte ich schnell an der richtigen
7
+ * Stelle landen, wenn nicht ist der Code vielleicht zu komplex bzw nicht
8
+ * richtig dokumentiert." Beide Haelften stecken hier drin:
9
+ *
10
+ * - die SUCHE — hybrid aus dichtem Vektor, eigenem BM25 und exakten
11
+ * Symbolnamen, fusioniert per RRF, mit einer Score-Zerlegung, die jeden
12
+ * Rang begruendet;
13
+ * - der BEFUND — dieselbe Zerlegung, gelesen als Aussage ueber den Code:
14
+ * `findability.ts` laesst ein Symbol sich selbst suchen und benennt die
15
+ * Ursache, wenn es sich nicht findet.
16
+ *
17
+ * Dieses Modul ist der EINZIGE oeffentliche Export des Pakets.
18
+ */
19
+ // Bezeichner-bewusste Tokenisierung (Grundlage des lexikalischen Zweigs).
20
+ export * from "./tokenize.js";
21
+ // Deterministisches BM25 ueber den Kandidatenpool.
22
+ export * from "./bm25.js";
23
+ // Glob-Abgleich fuer Pfad-Ein-/Ausschluss.
24
+ export * from "./glob.js";
25
+ // Skip-Ledger-Sammler (E4).
26
+ export * from "./ledger.js";
27
+ // Gespeicherter Chunk-Payload → Kandidat.
28
+ export * from "./payload.js";
29
+ // Normalisierte Filter → PayloadFilter (plus die Filter, die nicht pushdown-faehig sind).
30
+ export * from "./filter.js";
31
+ // Exakte und nahe Symbolnamen-Treffer.
32
+ export * from "./symbol-match.js";
33
+ // Reciprocal Rank Fusion der drei Ranglisten.
34
+ export * from "./fusion.js";
35
+ // Score-Zerlegung samt Boost-Begrenzung (spec.md §13.3).
36
+ export * from "./scoring.js";
37
+ // Belegbare Relevanzentscheidung und Abwesenheitsaussage (WP-231).
38
+ export * from "./relevance.js";
39
+ // Dedupe (spec.md §13.5) und Diversifizierung (architecture.md §18.5).
40
+ export * from "./dedupe.js";
41
+ export * from "./diversify.js";
42
+ // Sortierung der Trefferliste.
43
+ export * from "./sort.js";
44
+ // Paket-eigene Vertraege (Modus, grep, Formate).
45
+ export * from "./types.js";
46
+ // Der Port und seine Injektionspunkte.
47
+ export * from "./port.js";
48
+ // Post-Ranking-Anreicherung aus persistierten Graphen.
49
+ export * from "./enrichment.js";
50
+ // Die Referenzimplementierung.
51
+ export * from "./engine.js";
52
+ // Ablehnung von Suchmustern mit exponentiellem Zurueckziehen.
53
+ export * from "./regex-safety.js";
54
+ // grep-Modus ueber den indexierten Inhalt.
55
+ export * from "./grep.js";
56
+ // Ausgabeformate (Text, JSON, JSONL).
57
+ export * from "./format.js";
58
+ // Findability je Symbol (vision.md §1d).
59
+ export * from "./findability.js";
60
+ export * from "./product-complexity.js";
61
+ // Harte Gueltigkeitsgrenze fuer reproduzierbare Live-Benchmarks.
62
+ export * from "./benchmark-integrity.js";
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,0EAA0E;AAC1E,cAAc,eAAe,CAAC;AAE9B,mDAAmD;AACnD,cAAc,WAAW,CAAC;AAE1B,2CAA2C;AAC3C,cAAc,WAAW,CAAC;AAE1B,4BAA4B;AAC5B,cAAc,aAAa,CAAC;AAE5B,0CAA0C;AAC1C,cAAc,cAAc,CAAC;AAE7B,0FAA0F;AAC1F,cAAc,aAAa,CAAC;AAE5B,uCAAuC;AACvC,cAAc,mBAAmB,CAAC;AAElC,8CAA8C;AAC9C,cAAc,aAAa,CAAC;AAE5B,yDAAyD;AACzD,cAAc,cAAc,CAAC;AAE7B,mEAAmE;AACnE,cAAc,gBAAgB,CAAC;AAE/B,uEAAuE;AACvE,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAE/B,+BAA+B;AAC/B,cAAc,WAAW,CAAC;AAE1B,iDAAiD;AACjD,cAAc,YAAY,CAAC;AAE3B,uCAAuC;AACvC,cAAc,WAAW,CAAC;AAE1B,uDAAuD;AACvD,cAAc,iBAAiB,CAAC;AAEhC,+BAA+B;AAC/B,cAAc,aAAa,CAAC;AAE5B,8DAA8D;AAC9D,cAAc,mBAAmB,CAAC;AAElC,2CAA2C;AAC3C,cAAc,WAAW,CAAC;AAE1B,sCAAsC;AACtC,cAAc,aAAa,CAAC;AAE5B,yCAAyC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AAExC,iEAAiE;AACjE,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Sammler fuer den Skip-Ledger der Suche (docs/BUILD_PLAN.md E4).
3
+ *
4
+ * E4 ist im Abrufkern besonders leicht zu verletzen: eine Suche wirft
5
+ * staendig Kandidaten weg — durch Nachfilter, durch `minScore`, durch
6
+ * Dedupe, durch `limit`. Jedes dieser Wegwerfen ist eine ENTSCHEIDUNG und
7
+ * muss benannt werden, sonst sieht der Nutzer eine kurze Trefferliste und
8
+ * haelt sie fuer die ganze Wahrheit.
9
+ *
10
+ * Der Sammler haelt die Eintraege in Einfuegereihenfolge; die Einfuegereihen-
11
+ * folge ist ihrerseits deterministisch, weil jede Stufe ihre Kandidaten in
12
+ * einer stabilen Ordnung abarbeitet.
13
+ */
14
+ import type { SkipLedgerEntryV1, SkipReason } from "@untangle-code/domain";
15
+ /** Eingabe eines Suchstufen-Eintrags; `stage` ist immer `"search"`. */
16
+ export interface SearchSkipInput {
17
+ subjectKind: SkipLedgerEntryV1["subjectKind"];
18
+ subjectId?: string;
19
+ path?: string;
20
+ repoId?: string;
21
+ refId?: string;
22
+ reason: SkipReason;
23
+ detail: string;
24
+ recoverable?: boolean;
25
+ }
26
+ /**
27
+ * Sammelt Ledger-Eintraege einer einzelnen Suchausfuehrung.
28
+ *
29
+ * `add()` verweigert (ueber `buildSkipLedgerEntry`) eine leere Begruendung —
30
+ * ein Uebersprungeintrag ohne Grund taeuscht Diagnose vor, wo keine ist.
31
+ */
32
+ export declare class SearchSkipLedger {
33
+ private readonly entries;
34
+ add(input: SearchSkipInput): void;
35
+ /** Ein Kandidat, der die Trefferliste nicht erreicht hat. */
36
+ addCandidate(input: Omit<SearchSkipInput, "subjectKind"> & {
37
+ subjectId: string;
38
+ }): void;
39
+ get size(): number;
40
+ /** Kopie der gesammelten Eintraege in Einfuegereihenfolge. */
41
+ toArray(): SkipLedgerEntryV1[];
42
+ /** Zaehlung je Grund — dieselbe Form wie `SkipLedgerV1.countsByReason`. */
43
+ countsByReason(): Partial<Record<SkipReason, number>>;
44
+ }
45
+ //# sourceMappingURL=ledger.d.ts.map