greprag 5.40.1 → 5.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/archive/glyph-font.d.ts +22 -0
- package/dist/archive/glyph-font.js +72 -0
- package/dist/archive/glyph-font.js.map +1 -0
- package/dist/archive/page-renderer.d.ts +67 -0
- package/dist/archive/page-renderer.js +197 -0
- package/dist/archive/page-renderer.js.map +1 -0
- package/dist/archive/png-codec.d.ts +21 -0
- package/dist/archive/png-codec.js +197 -0
- package/dist/archive/png-codec.js.map +1 -0
- package/dist/archive/transcript-extract.d.ts +39 -0
- package/dist/archive/transcript-extract.js +187 -0
- package/dist/archive/transcript-extract.js.map +1 -0
- package/dist/ccr-store.d.ts +49 -0
- package/dist/ccr-store.js +171 -0
- package/dist/ccr-store.js.map +1 -0
- package/dist/commands/archive.d.ts +81 -0
- package/dist/commands/archive.js +358 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/context-governor.d.ts +82 -0
- package/dist/commands/context-governor.js +344 -0
- package/dist/commands/context-governor.js.map +1 -0
- package/dist/commands/crush-stats.d.ts +36 -0
- package/dist/commands/crush-stats.js +142 -0
- package/dist/commands/crush-stats.js.map +1 -0
- package/dist/commands/crush.d.ts +24 -0
- package/dist/commands/crush.js +183 -0
- package/dist/commands/crush.js.map +1 -0
- package/dist/commands/email.js +158 -9
- package/dist/commands/email.js.map +1 -1
- package/dist/commands/inbox-watch-supervisor.js +8 -65
- package/dist/commands/inbox-watch-supervisor.js.map +1 -1
- package/dist/commands/init.js +93 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pipe-wrap.d.ts +75 -0
- package/dist/commands/pipe-wrap.js +255 -0
- package/dist/commands/pipe-wrap.js.map +1 -0
- package/dist/commands/watcher-registry.d.ts +1 -8
- package/dist/commands/watcher-registry.js +10 -47
- package/dist/commands/watcher-registry.js.map +1 -1
- package/dist/crush/adaptive-sizer.d.ts +40 -0
- package/dist/crush/adaptive-sizer.js +156 -0
- package/dist/crush/adaptive-sizer.js.map +1 -0
- package/dist/crush/crush-keywords.d.ts +40 -0
- package/dist/crush/crush-keywords.js +110 -0
- package/dist/crush/crush-keywords.js.map +1 -0
- package/dist/crush/crush-types.d.ts +38 -0
- package/dist/crush/crush-types.js +36 -0
- package/dist/crush/crush-types.js.map +1 -0
- package/dist/crush/index.d.ts +16 -0
- package/dist/crush/index.js +48 -0
- package/dist/crush/index.js.map +1 -0
- package/dist/crush/json-crusher.d.ts +38 -0
- package/dist/crush/json-crusher.js +250 -0
- package/dist/crush/json-crusher.js.map +1 -0
- package/dist/crush/json-detectors.d.ts +48 -0
- package/dist/crush/json-detectors.js +211 -0
- package/dist/crush/json-detectors.js.map +1 -0
- package/dist/crush/log-compressor.d.ts +60 -0
- package/dist/crush/log-compressor.js +394 -0
- package/dist/crush/log-compressor.js.map +1 -0
- package/dist/crush/search-compressor.d.ts +60 -0
- package/dist/crush/search-compressor.js +210 -0
- package/dist/crush/search-compressor.js.map +1 -0
- package/dist/email-pull.d.ts +25 -3
- package/dist/email-pull.js +25 -5
- package/dist/email-pull.js.map +1 -1
- package/dist/email-send.d.ts +4 -0
- package/dist/email-send.js +2 -0
- package/dist/email-send.js.map +1 -1
- package/dist/hook.js +49 -1
- package/dist/hook.js.map +1 -1
- package/dist/index.js +487 -449
- package/dist/index.js.map +1 -1
- package/dist/session-id.js +7 -12
- package/dist/session-id.js.map +1 -1
- package/package.json +2 -2
- package/skill/greprag/SKILL.md +2 -2
- package/skill/greprag/docs/email.md +28 -4
- package/skill/mechanic/SKILL.md +1 -1
- package/skill/templates/chip-spawn.md +4 -2
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MIRRORED FILE — canonical source: packages/core/src/crush/log-compressor.ts.
|
|
4
|
+
* Byte-identical copy lives at packages/cli/src/crush/log-compressor.ts (the CLI is a
|
|
5
|
+
* zero-dep artifact and cannot import @greprag/core). KEEP IN SYNC —
|
|
6
|
+
* the sync guard in tests/test-crush.cjs fails the build on drift.
|
|
7
|
+
*
|
|
8
|
+
* Log/build-output compressor — TypeScript port of Headroom's
|
|
9
|
+
* transforms/log_compressor.rs. Compresses build and test output
|
|
10
|
+
* (pytest/npm/cargo/jest/make/generic): keep errors, stack traces and
|
|
11
|
+
* summary lines + small context windows, drop the passing/INFO bulk.
|
|
12
|
+
* Typical compression: 10-50x.
|
|
13
|
+
*
|
|
14
|
+
* Carries Headroom's documented fixes:
|
|
15
|
+
* - Stack-trace state machine survives blank lines inside chained
|
|
16
|
+
* Python tracebacks (the original terminated on any blank line and
|
|
17
|
+
* dropped the second half of "During handling of the above
|
|
18
|
+
* exception" traces).
|
|
19
|
+
* - Dedupe preserves the message prefix (everything before the first
|
|
20
|
+
* `:` or `=`), so two distinct errors that share a trailing
|
|
21
|
+
* address/id shape stay distinct survivors.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.DEFAULT_LOG_CONFIG = void 0;
|
|
25
|
+
exports.detectFormat = detectFormat;
|
|
26
|
+
exports.classifyLevel = classifyLevel;
|
|
27
|
+
exports.isSummaryLine = isSummaryLine;
|
|
28
|
+
exports.parseLogLines = parseLogLines;
|
|
29
|
+
exports.normalizeForDedupe = normalizeForDedupe;
|
|
30
|
+
exports.crushLog = crushLog;
|
|
31
|
+
const adaptive_sizer_1 = require("./adaptive-sizer");
|
|
32
|
+
const crush_types_1 = require("./crush-types");
|
|
33
|
+
exports.DEFAULT_LOG_CONFIG = {
|
|
34
|
+
maxErrors: 10,
|
|
35
|
+
errorContextLines: 3,
|
|
36
|
+
keepFirstError: true,
|
|
37
|
+
keepLastError: true,
|
|
38
|
+
maxStackTraces: 3,
|
|
39
|
+
stackTraceMaxLines: 20,
|
|
40
|
+
maxWarnings: 5,
|
|
41
|
+
dedupeWarnings: true,
|
|
42
|
+
keepSummaryLines: true,
|
|
43
|
+
maxTotalLines: 100,
|
|
44
|
+
minLinesToCompress: 50,
|
|
45
|
+
bias: 1.0,
|
|
46
|
+
};
|
|
47
|
+
// --- Format detection -------------------------------------------------
|
|
48
|
+
const FORMAT_MARKERS = [
|
|
49
|
+
['pytest', ['=== FAILURES', '=== ERRORS', '=== test session', '=== short test summary', 'PASSED [', 'FAILED [', 'ERROR [', 'SKIPPED [', 'collected ']],
|
|
50
|
+
['npm', ['npm ERR!', 'npm WARN', 'npm info', 'npm http']],
|
|
51
|
+
['cargo', ['Compiling ', 'Finished ', 'Running ', 'warning: ', 'error[E']],
|
|
52
|
+
['jest', ['PASS ', 'FAIL ', 'Test Suites:']],
|
|
53
|
+
['make', ['make[', 'make:', 'gcc ', 'g++ ', 'clang ']],
|
|
54
|
+
];
|
|
55
|
+
function detectFormat(lines) {
|
|
56
|
+
const sample = lines.slice(0, 100);
|
|
57
|
+
let best = null;
|
|
58
|
+
let bestScore = 0;
|
|
59
|
+
for (const [format, markers] of FORMAT_MARKERS) {
|
|
60
|
+
let score = 0;
|
|
61
|
+
for (const line of sample) {
|
|
62
|
+
if (markers.some((m) => line.includes(m)))
|
|
63
|
+
score++; // at most one hit per line
|
|
64
|
+
}
|
|
65
|
+
if (score > bestScore) {
|
|
66
|
+
bestScore = score;
|
|
67
|
+
best = format;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return best ?? 'generic';
|
|
71
|
+
}
|
|
72
|
+
// --- Level classification ---------------------------------------------
|
|
73
|
+
const LEVEL_PATTERNS = [
|
|
74
|
+
['error', /\b(?:ERROR|error|Error|FATAL|fatal|Fatal|CRITICAL|critical)\b/],
|
|
75
|
+
['fail', /\b(?:FAIL|FAILED|fail|failed|Fail|Failed)\b/],
|
|
76
|
+
['warn', /\b(?:WARN|WARNING|warn|warning|Warn|Warning)\b/],
|
|
77
|
+
['info', /\b(?:INFO|info|Info)\b/],
|
|
78
|
+
['debug', /\b(?:DEBUG|debug|Debug)\b/],
|
|
79
|
+
['trace', /\b(?:TRACE|trace|Trace)\b/],
|
|
80
|
+
];
|
|
81
|
+
function classifyLevel(line) {
|
|
82
|
+
for (const [level, re] of LEVEL_PATTERNS) {
|
|
83
|
+
if (re.test(line))
|
|
84
|
+
return level;
|
|
85
|
+
}
|
|
86
|
+
return 'unknown';
|
|
87
|
+
}
|
|
88
|
+
function hasLineColSuffix(s) {
|
|
89
|
+
return /:\d+:\d/.test(s);
|
|
90
|
+
}
|
|
91
|
+
function traceFlavorFor(line) {
|
|
92
|
+
const t = line.trimStart();
|
|
93
|
+
if (t.startsWith('Traceback (most recent call last)'))
|
|
94
|
+
return 'python';
|
|
95
|
+
if (t.startsWith('File "') && t.includes('", line ') && /\d$/.test(t))
|
|
96
|
+
return 'python';
|
|
97
|
+
if (t.startsWith('at ') && t.includes('(') && t.includes(')') && hasLineColSuffix(t))
|
|
98
|
+
return 'js';
|
|
99
|
+
if (t.startsWith('at ') && t.includes('(')) {
|
|
100
|
+
const body = t.slice(3, t.indexOf('('));
|
|
101
|
+
if (body.length > 0 && /^[A-Za-z0-9._$]+$/.test(body))
|
|
102
|
+
return 'java';
|
|
103
|
+
}
|
|
104
|
+
if (t.startsWith('--> ') && hasLineColSuffix(t))
|
|
105
|
+
return 'rust';
|
|
106
|
+
if (/^\s*\d+:\s*0x[0-9a-fA-F]/.test(line))
|
|
107
|
+
return 'go';
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* True when `line` ends the current trace flavor's run. Python
|
|
112
|
+
* tracebacks continue across blank lines and continuation markers
|
|
113
|
+
* (chained-exception fix); JS/Java end at the first non-`at` line.
|
|
114
|
+
*/
|
|
115
|
+
function traceTerminates(flavor, line) {
|
|
116
|
+
const t = line.trimStart();
|
|
117
|
+
switch (flavor) {
|
|
118
|
+
case 'python': {
|
|
119
|
+
const indentedOrBlank = line.startsWith(' ') || line.startsWith('\t') || line.length === 0;
|
|
120
|
+
const continuation = t.startsWith('Traceback') ||
|
|
121
|
+
t.startsWith('File ') ||
|
|
122
|
+
t.startsWith('During handling') ||
|
|
123
|
+
t.startsWith('The above exception');
|
|
124
|
+
if (indentedOrBlank || continuation)
|
|
125
|
+
return false;
|
|
126
|
+
// `ExceptionType: message` terminator lines stay inside the trace.
|
|
127
|
+
return !/^[A-Z]/.test(t);
|
|
128
|
+
}
|
|
129
|
+
case 'js':
|
|
130
|
+
case 'java':
|
|
131
|
+
return !t.startsWith('at ') && line.length > 0;
|
|
132
|
+
case 'rust':
|
|
133
|
+
return !t.startsWith('--> ') && line.length > 0;
|
|
134
|
+
case 'go':
|
|
135
|
+
return !/^\d/.test(t) && line.length > 0;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// --- Summary detection --------------------------------------------------
|
|
139
|
+
function isSummaryLine(line) {
|
|
140
|
+
if (line.startsWith('===') || line.startsWith('---'))
|
|
141
|
+
return true;
|
|
142
|
+
const m = line.match(/^(\d+) /);
|
|
143
|
+
if (m) {
|
|
144
|
+
const rest = line.slice(m[1].length + 1);
|
|
145
|
+
if (/^(passed|failed|skipped|error|warning)/.test(rest))
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
for (const prefix of ['Test ', 'Tests ', 'Tests:', 'Test:', 'Suite ', 'Suites ', 'Suites:', 'Suite:']) {
|
|
149
|
+
if (line.startsWith(prefix)) {
|
|
150
|
+
const rest = line.slice(prefix.length).trimStart();
|
|
151
|
+
return rest.length > 0 && rest[0] >= '0' && rest[0] <= '9';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (/^(TOTAL|Total|Summary)/.test(line))
|
|
155
|
+
return true;
|
|
156
|
+
if (/^(Build|Compile|Test)/.test(line) && /(succeeded|failed|complete)/.test(line))
|
|
157
|
+
return true;
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
// --- Scoring -------------------------------------------------------------
|
|
161
|
+
function scoreLogLine(line) {
|
|
162
|
+
let levelScore;
|
|
163
|
+
switch (line.level) {
|
|
164
|
+
case 'error':
|
|
165
|
+
case 'fail':
|
|
166
|
+
levelScore = 1.0;
|
|
167
|
+
break;
|
|
168
|
+
case 'warn':
|
|
169
|
+
levelScore = 0.5;
|
|
170
|
+
break;
|
|
171
|
+
case 'debug':
|
|
172
|
+
levelScore = 0.05;
|
|
173
|
+
break;
|
|
174
|
+
case 'trace':
|
|
175
|
+
levelScore = 0.02;
|
|
176
|
+
break;
|
|
177
|
+
default:
|
|
178
|
+
levelScore = 0.1;
|
|
179
|
+
}
|
|
180
|
+
const stackBoost = line.isStackTrace ? 0.3 : 0;
|
|
181
|
+
const summaryBoost = line.isSummary ? 0.4 : 0;
|
|
182
|
+
return Math.min(levelScore + stackBoost + summaryBoost, 1.0);
|
|
183
|
+
}
|
|
184
|
+
// --- Parse ---------------------------------------------------------------
|
|
185
|
+
function parseLogLines(lines, config) {
|
|
186
|
+
const out = [];
|
|
187
|
+
let active = null;
|
|
188
|
+
let traceLines = 0;
|
|
189
|
+
for (let i = 0; i < lines.length; i++) {
|
|
190
|
+
const raw = lines[i];
|
|
191
|
+
const entry = {
|
|
192
|
+
lineNumber: i,
|
|
193
|
+
content: raw,
|
|
194
|
+
level: classifyLevel(raw),
|
|
195
|
+
isStackTrace: false,
|
|
196
|
+
isSummary: isSummaryLine(raw),
|
|
197
|
+
score: 0,
|
|
198
|
+
};
|
|
199
|
+
if (active !== null) {
|
|
200
|
+
if (traceLines >= config.stackTraceMaxLines || traceTerminates(active, raw)) {
|
|
201
|
+
active = null;
|
|
202
|
+
traceLines = 0;
|
|
203
|
+
// Chained traces may re-open on the terminating line itself.
|
|
204
|
+
const next = traceFlavorFor(raw);
|
|
205
|
+
if (next) {
|
|
206
|
+
active = next;
|
|
207
|
+
traceLines = 1;
|
|
208
|
+
entry.isStackTrace = true;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
entry.isStackTrace = true;
|
|
213
|
+
traceLines++;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
const flavor = traceFlavorFor(raw);
|
|
218
|
+
if (flavor) {
|
|
219
|
+
active = flavor;
|
|
220
|
+
traceLines = 1;
|
|
221
|
+
entry.isStackTrace = true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
entry.score = scoreLogLine(entry);
|
|
225
|
+
out.push(entry);
|
|
226
|
+
}
|
|
227
|
+
return out;
|
|
228
|
+
}
|
|
229
|
+
// --- Dedupe ----------------------------------------------------------------
|
|
230
|
+
/**
|
|
231
|
+
* Conservative dedupe key: the message prefix (before the first `:` or
|
|
232
|
+
* `=`) survives verbatim; only the trailing variable region is
|
|
233
|
+
* normalized (hex addresses, digits, paths).
|
|
234
|
+
*/
|
|
235
|
+
function normalizeForDedupe(content) {
|
|
236
|
+
const splitAt = content.search(/[:=]/);
|
|
237
|
+
const at = splitAt === -1 ? content.length : splitAt;
|
|
238
|
+
const prefix = content.slice(0, at);
|
|
239
|
+
const suffix = content
|
|
240
|
+
.slice(at)
|
|
241
|
+
.replace(/0x[0-9a-fA-F]+/g, 'ADDR')
|
|
242
|
+
.replace(/\d+/g, 'N')
|
|
243
|
+
.replace(/\/[\w/]+\//g, '/PATH/');
|
|
244
|
+
return prefix + suffix;
|
|
245
|
+
}
|
|
246
|
+
function dedupeSimilar(lines) {
|
|
247
|
+
const seen = new Set();
|
|
248
|
+
const out = [];
|
|
249
|
+
for (const line of lines) {
|
|
250
|
+
const key = normalizeForDedupe(line.content);
|
|
251
|
+
if (!seen.has(key)) {
|
|
252
|
+
seen.add(key);
|
|
253
|
+
out.push(line);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return out;
|
|
257
|
+
}
|
|
258
|
+
// --- Selection ---------------------------------------------------------------
|
|
259
|
+
function selectWithFirstLast(lines, maxCount, config) {
|
|
260
|
+
if (lines.length <= maxCount)
|
|
261
|
+
return [...lines];
|
|
262
|
+
const out = [];
|
|
263
|
+
const seen = new Set();
|
|
264
|
+
const push = (l) => {
|
|
265
|
+
if (!seen.has(l.lineNumber)) {
|
|
266
|
+
seen.add(l.lineNumber);
|
|
267
|
+
out.push(l);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
if (config.keepFirstError)
|
|
271
|
+
push(lines[0]);
|
|
272
|
+
if (config.keepLastError)
|
|
273
|
+
push(lines[lines.length - 1]);
|
|
274
|
+
const byScore = [...lines].sort((a, b) => b.score - a.score || a.lineNumber - b.lineNumber);
|
|
275
|
+
for (const l of byScore) {
|
|
276
|
+
if (out.length >= maxCount)
|
|
277
|
+
break;
|
|
278
|
+
push(l);
|
|
279
|
+
}
|
|
280
|
+
return out;
|
|
281
|
+
}
|
|
282
|
+
function selectLines(logLines, config) {
|
|
283
|
+
const adaptiveMax = (0, adaptive_sizer_1.computeOptimalK)(logLines.map((l) => l.content), config.bias, 10, config.maxTotalLines);
|
|
284
|
+
const errors = [];
|
|
285
|
+
const fails = [];
|
|
286
|
+
let warnings = [];
|
|
287
|
+
const summaries = [];
|
|
288
|
+
const stackTraces = [];
|
|
289
|
+
let currentStack = [];
|
|
290
|
+
for (const line of logLines) {
|
|
291
|
+
if (line.level === 'error')
|
|
292
|
+
errors.push(line);
|
|
293
|
+
else if (line.level === 'fail')
|
|
294
|
+
fails.push(line);
|
|
295
|
+
else if (line.level === 'warn')
|
|
296
|
+
warnings.push(line);
|
|
297
|
+
if (line.isStackTrace) {
|
|
298
|
+
currentStack.push(line);
|
|
299
|
+
}
|
|
300
|
+
else if (currentStack.length > 0) {
|
|
301
|
+
stackTraces.push(currentStack);
|
|
302
|
+
currentStack = [];
|
|
303
|
+
}
|
|
304
|
+
if (line.isSummary)
|
|
305
|
+
summaries.push(line);
|
|
306
|
+
}
|
|
307
|
+
if (currentStack.length > 0)
|
|
308
|
+
stackTraces.push(currentStack);
|
|
309
|
+
const selected = new Map();
|
|
310
|
+
const add = (l) => selected.set(l.lineNumber, l);
|
|
311
|
+
for (const l of selectWithFirstLast(errors, config.maxErrors, config))
|
|
312
|
+
add(l);
|
|
313
|
+
for (const l of selectWithFirstLast(fails, config.maxErrors, config))
|
|
314
|
+
add(l);
|
|
315
|
+
if (config.dedupeWarnings)
|
|
316
|
+
warnings = dedupeSimilar(warnings);
|
|
317
|
+
for (const l of warnings.slice(0, config.maxWarnings))
|
|
318
|
+
add(l);
|
|
319
|
+
for (const stack of stackTraces.slice(0, config.maxStackTraces)) {
|
|
320
|
+
for (const l of stack.slice(0, config.stackTraceMaxLines))
|
|
321
|
+
add(l);
|
|
322
|
+
}
|
|
323
|
+
if (config.keepSummaryLines) {
|
|
324
|
+
for (const l of summaries)
|
|
325
|
+
add(l);
|
|
326
|
+
}
|
|
327
|
+
// Context windows around every selection.
|
|
328
|
+
const anchorIndices = [...selected.keys()];
|
|
329
|
+
for (const idx of anchorIndices) {
|
|
330
|
+
const lo = Math.max(0, idx - config.errorContextLines);
|
|
331
|
+
const hi = Math.min(logLines.length, idx + config.errorContextLines + 1);
|
|
332
|
+
for (let i = lo; i < hi; i++) {
|
|
333
|
+
if (!selected.has(i))
|
|
334
|
+
add(logLines[i]);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
let ordered = [...selected.values()].sort((a, b) => a.lineNumber - b.lineNumber);
|
|
338
|
+
if (ordered.length > adaptiveMax) {
|
|
339
|
+
ordered.sort((a, b) => b.score - a.score || a.lineNumber - b.lineNumber);
|
|
340
|
+
ordered = ordered.slice(0, adaptiveMax);
|
|
341
|
+
ordered.sort((a, b) => a.lineNumber - b.lineNumber);
|
|
342
|
+
}
|
|
343
|
+
return ordered;
|
|
344
|
+
}
|
|
345
|
+
// --- Format output ------------------------------------------------------------
|
|
346
|
+
function formatLogOutput(selected, allLines) {
|
|
347
|
+
const count = (level) => allLines.filter((l) => l.level === level).length;
|
|
348
|
+
const output = selected.map((l) => l.content);
|
|
349
|
+
const omitted = allLines.length - selected.length;
|
|
350
|
+
if (omitted > 0) {
|
|
351
|
+
const parts = [];
|
|
352
|
+
for (const [label, level] of [
|
|
353
|
+
['ERROR', 'error'],
|
|
354
|
+
['FAIL', 'fail'],
|
|
355
|
+
['WARN', 'warn'],
|
|
356
|
+
['INFO', 'info'],
|
|
357
|
+
]) {
|
|
358
|
+
const n = count(level);
|
|
359
|
+
if (n > 0)
|
|
360
|
+
parts.push(`${n} ${label}`);
|
|
361
|
+
}
|
|
362
|
+
if (parts.length > 0) {
|
|
363
|
+
output.push(`[${omitted} lines omitted: ${parts.join(', ')}]`);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
output.push(`[${omitted} lines omitted]`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return output.join('\n');
|
|
370
|
+
}
|
|
371
|
+
/** Compress build/test log output. Short inputs pass through verbatim. */
|
|
372
|
+
function crushLog(content, config = {}) {
|
|
373
|
+
const cfg = { ...exports.DEFAULT_LOG_CONFIG, ...config };
|
|
374
|
+
const lines = content.split('\n');
|
|
375
|
+
if (lines.length < cfg.minLinesToCompress) {
|
|
376
|
+
return (0, crush_types_1.makePassthrough)(content, 'log', 'below min line count', lines.length);
|
|
377
|
+
}
|
|
378
|
+
const logLines = parseLogLines(lines, cfg);
|
|
379
|
+
const selected = selectLines(logLines, cfg);
|
|
380
|
+
const output = formatLogOutput(selected, logLines);
|
|
381
|
+
return {
|
|
382
|
+
output,
|
|
383
|
+
stats: {
|
|
384
|
+
sourceType: 'log',
|
|
385
|
+
originalChars: content.length,
|
|
386
|
+
compressedChars: output.length,
|
|
387
|
+
compressionRatio: output.length / Math.max(content.length, 1),
|
|
388
|
+
originalUnits: lines.length,
|
|
389
|
+
keptUnits: selected.length,
|
|
390
|
+
passthrough: false,
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=log-compressor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-compressor.js","sourceRoot":"","sources":["../../src/crush/log-compressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MIRRORED FILE — canonical source: packages/core/src/crush/search-compressor.ts.
|
|
3
|
+
* Byte-identical copy lives at packages/cli/src/crush/search-compressor.ts (the CLI is a
|
|
4
|
+
* zero-dep artifact and cannot import @greprag/core). KEEP IN SYNC —
|
|
5
|
+
* the sync guard in tests/test-crush.cjs fails the build on drift.
|
|
6
|
+
*
|
|
7
|
+
* Search-results compressor — TypeScript port of Headroom's
|
|
8
|
+
* transforms/search_compressor.rs. Compresses grep/ripgrep output
|
|
9
|
+
* (`file:line:content`, plus rg's `file-line-content` context lines).
|
|
10
|
+
* Typical compression: 5-10x.
|
|
11
|
+
*
|
|
12
|
+
* Pipeline: parse -> score (query-word overlap + error-keyword boosts)
|
|
13
|
+
* -> select (top-N per adaptive budget; always keep first/last per
|
|
14
|
+
* file) -> emit survivors in line order + `[... and N more matches in
|
|
15
|
+
* <file>]` summaries.
|
|
16
|
+
*
|
|
17
|
+
* Carries Headroom's documented parser fixes:
|
|
18
|
+
* - Windows drive paths (`C:\...`): the drive colon is not the
|
|
19
|
+
* line-number marker; the scan starts after it.
|
|
20
|
+
* - Filenames containing `-` (rg context lines): the parser anchors on
|
|
21
|
+
* the leftmost `<sep><digits><sep>` marker, not on a path charset.
|
|
22
|
+
* - Adjacent-separator collapse: `file.py:-1:x` is rejected (negative
|
|
23
|
+
* line numbers are content, not markers).
|
|
24
|
+
*/
|
|
25
|
+
import { CrushResult } from './crush-types';
|
|
26
|
+
export interface SearchMatch {
|
|
27
|
+
file: string;
|
|
28
|
+
lineNumber: number;
|
|
29
|
+
content: string;
|
|
30
|
+
score: number;
|
|
31
|
+
}
|
|
32
|
+
export interface SearchCompressorConfig {
|
|
33
|
+
maxMatchesPerFile: number;
|
|
34
|
+
alwaysKeepFirst: boolean;
|
|
35
|
+
alwaysKeepLast: boolean;
|
|
36
|
+
maxTotalMatches: number;
|
|
37
|
+
maxFiles: number;
|
|
38
|
+
contextKeywords: string[];
|
|
39
|
+
boostErrors: boolean;
|
|
40
|
+
/** Adaptive-budget bias (>1 keep more, <1 compress harder). */
|
|
41
|
+
bias: number;
|
|
42
|
+
}
|
|
43
|
+
export declare const DEFAULT_SEARCH_CONFIG: SearchCompressorConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Parse one grep/ripgrep-style line into a match, or null.
|
|
46
|
+
*
|
|
47
|
+
* Finds the leftmost `<sep><digits><sep>` triplet (sep = `:` or `-`);
|
|
48
|
+
* path is everything before, content everything after. A Windows drive
|
|
49
|
+
* prefix (`C:\` / `C:/`) shifts the scan start past the drive colon.
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseMatchLine(line: string): {
|
|
52
|
+
file: string;
|
|
53
|
+
lineNumber: number;
|
|
54
|
+
content: string;
|
|
55
|
+
} | null;
|
|
56
|
+
/**
|
|
57
|
+
* Compress grep/rg output. `query` (optional) boosts matches containing
|
|
58
|
+
* its words. Unparseable input passes through unchanged.
|
|
59
|
+
*/
|
|
60
|
+
export declare function crushSearch(content: string, query?: string, config?: Partial<SearchCompressorConfig>): CrushResult;
|