@untangle-code/search 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +433 -2
- package/THIRD_PARTY_LICENSES.md +29 -0
- package/dist/benchmark-integrity.d.ts +12 -0
- package/dist/benchmark-integrity.d.ts.map +1 -0
- package/dist/benchmark-integrity.js +10 -0
- package/dist/benchmark-integrity.js.map +1 -0
- package/dist/bm25.d.ts +46 -0
- package/dist/bm25.d.ts.map +1 -0
- package/dist/bm25.js +105 -0
- package/dist/bm25.js.map +1 -0
- package/dist/deadline.d.ts +4 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +54 -0
- package/dist/deadline.js.map +1 -0
- package/dist/dedupe.d.ts +48 -0
- package/dist/dedupe.d.ts.map +1 -0
- package/dist/dedupe.js +58 -0
- package/dist/dedupe.js.map +1 -0
- package/dist/diversify.d.ts +45 -0
- package/dist/diversify.d.ts.map +1 -0
- package/dist/diversify.js +30 -0
- package/dist/diversify.js.map +1 -0
- package/dist/engine.d.ts +157 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +1498 -0
- package/dist/engine.js.map +1 -0
- package/dist/enrichment.d.ts +16 -0
- package/dist/enrichment.d.ts.map +1 -0
- package/dist/enrichment.js +92 -0
- package/dist/enrichment.js.map +1 -0
- package/dist/filter.d.ts +86 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +166 -0
- package/dist/filter.js.map +1 -0
- package/dist/findability.d.ts +144 -0
- package/dist/findability.d.ts.map +1 -0
- package/dist/findability.js +393 -0
- package/dist/findability.js.map +1 -0
- package/dist/format.d.ts +28 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +172 -0
- package/dist/format.js.map +1 -0
- package/dist/fusion.d.ts +47 -0
- package/dist/fusion.d.ts.map +1 -0
- package/dist/fusion.js +84 -0
- package/dist/fusion.js.map +1 -0
- package/dist/glob.d.ts +50 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +144 -0
- package/dist/glob.js.map +1 -0
- package/dist/grep.d.ts +76 -0
- package/dist/grep.d.ts.map +1 -0
- package/dist/grep.js +475 -0
- package/dist/grep.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger.d.ts +45 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +39 -0
- package/dist/ledger.js.map +1 -0
- package/dist/payload.d.ts +108 -0
- package/dist/payload.d.ts.map +1 -0
- package/dist/payload.js +263 -0
- package/dist/payload.js.map +1 -0
- package/dist/port.d.ts +112 -0
- package/dist/port.d.ts.map +1 -0
- package/dist/port.js +2 -0
- package/dist/port.js.map +1 -0
- package/dist/product-complexity.d.ts +89 -0
- package/dist/product-complexity.d.ts.map +1 -0
- package/dist/product-complexity.js +1367 -0
- package/dist/product-complexity.js.map +1 -0
- package/dist/regex-safety.d.ts +75 -0
- package/dist/regex-safety.d.ts.map +1 -0
- package/dist/regex-safety.js +902 -0
- package/dist/regex-safety.js.map +1 -0
- package/dist/relevance-prerequisites.d.ts +21 -0
- package/dist/relevance-prerequisites.d.ts.map +1 -0
- package/dist/relevance-prerequisites.js +47 -0
- package/dist/relevance-prerequisites.js.map +1 -0
- package/dist/relevance.d.ts +107 -0
- package/dist/relevance.d.ts.map +1 -0
- package/dist/relevance.js +199 -0
- package/dist/relevance.js.map +1 -0
- package/dist/retrieval.d.ts +46 -0
- package/dist/retrieval.d.ts.map +1 -0
- package/dist/retrieval.js +182 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/scoring.d.ts +102 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +175 -0
- package/dist/scoring.js.map +1 -0
- package/dist/sort.d.ts +21 -0
- package/dist/sort.d.ts.map +1 -0
- package/dist/sort.js +53 -0
- package/dist/sort.js.map +1 -0
- package/dist/symbol-match.d.ts +21 -0
- package/dist/symbol-match.d.ts.map +1 -0
- package/dist/symbol-match.js +72 -0
- package/dist/symbol-match.js.map +1 -0
- package/dist/tokenize.d.ts +41 -0
- package/dist/tokenize.d.ts.map +1 -0
- package/dist/tokenize.js +202 -0
- package/dist/tokenize.js.map +1 -0
- package/dist/types.d.ts +173 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +42 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -3
- package/src/benchmark-integrity.ts +25 -0
- package/src/bm25.ts +135 -0
- package/src/deadline.ts +59 -0
- package/src/dedupe.ts +99 -0
- package/src/diversify.ts +71 -0
- package/src/engine.ts +1957 -0
- package/src/enrichment.ts +115 -0
- package/src/filter.ts +267 -0
- package/src/findability.ts +580 -0
- package/src/format.ts +228 -0
- package/src/fusion.ts +121 -0
- package/src/glob.ts +151 -0
- package/src/grep.ts +618 -0
- package/src/index.ts +83 -0
- package/src/ledger.ts +72 -0
- package/src/payload.ts +382 -0
- package/src/port.ts +133 -0
- package/src/product-complexity.ts +2168 -0
- package/src/regex-safety.ts +1002 -0
- package/src/relevance-prerequisites.ts +83 -0
- package/src/relevance.ts +328 -0
- package/src/retrieval.ts +299 -0
- package/src/scoring.ts +321 -0
- package/src/sort.ts +86 -0
- package/src/symbol-match.ts +87 -0
- package/src/tokenize.ts +213 -0
- 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
|
package/dist/grep.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../src/grep.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/ledger.d.ts
ADDED
|
@@ -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
|