@felan-ai/ext-rtk-optimizer 0.0.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/LICENSE +23 -0
- package/NOTICE +14 -0
- package/README.md +115 -0
- package/dist/command-rewriter.d.ts +27 -0
- package/dist/command-rewriter.d.ts.map +1 -0
- package/dist/command-rewriter.js +126 -0
- package/dist/command-rewriter.js.map +1 -0
- package/dist/command.d.ts +12 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +240 -0
- package/dist/command.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +173 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +306 -0
- package/dist/index.js.map +1 -0
- package/dist/output-compactor.d.ts +31 -0
- package/dist/output-compactor.d.ts.map +1 -0
- package/dist/output-compactor.js +455 -0
- package/dist/output-compactor.js.map +1 -0
- package/dist/output-metrics.d.ts +15 -0
- package/dist/output-metrics.d.ts.map +1 -0
- package/dist/output-metrics.js +50 -0
- package/dist/output-metrics.js.map +1 -0
- package/dist/record-utils.d.ts +12 -0
- package/dist/record-utils.d.ts.map +1 -0
- package/dist/record-utils.js +23 -0
- package/dist/record-utils.js.map +1 -0
- package/dist/runtime-path.d.ts +4 -0
- package/dist/runtime-path.d.ts.map +1 -0
- package/dist/runtime-path.js +73 -0
- package/dist/runtime-path.js.map +1 -0
- package/dist/techniques/ansi.d.ts +3 -0
- package/dist/techniques/ansi.d.ts.map +1 -0
- package/dist/techniques/ansi.js +13 -0
- package/dist/techniques/ansi.js.map +1 -0
- package/dist/techniques/build.d.ts +3 -0
- package/dist/techniques/build.d.ts.map +1 -0
- package/dist/techniques/build.js +127 -0
- package/dist/techniques/build.js.map +1 -0
- package/dist/techniques/command-detection.d.ts +3 -0
- package/dist/techniques/command-detection.d.ts.map +1 -0
- package/dist/techniques/command-detection.js +44 -0
- package/dist/techniques/command-detection.js.map +1 -0
- package/dist/techniques/git.d.ts +6 -0
- package/dist/techniques/git.d.ts.map +1 -0
- package/dist/techniques/git.js +188 -0
- package/dist/techniques/git.js.map +1 -0
- package/dist/techniques/index.d.ts +9 -0
- package/dist/techniques/index.d.ts.map +1 -0
- package/dist/techniques/index.js +9 -0
- package/dist/techniques/index.js.map +1 -0
- package/dist/techniques/linter.d.ts +3 -0
- package/dist/techniques/linter.d.ts.map +1 -0
- package/dist/techniques/linter.js +133 -0
- package/dist/techniques/linter.js.map +1 -0
- package/dist/techniques/path-utils.d.ts +2 -0
- package/dist/techniques/path-utils.d.ts.map +1 -0
- package/dist/techniques/path-utils.js +55 -0
- package/dist/techniques/path-utils.js.map +1 -0
- package/dist/techniques/search.d.ts +2 -0
- package/dist/techniques/search.d.ts.map +1 -0
- package/dist/techniques/search.js +53 -0
- package/dist/techniques/search.js.map +1 -0
- package/dist/techniques/source.d.ts +7 -0
- package/dist/techniques/source.d.ts.map +1 -0
- package/dist/techniques/source.js +250 -0
- package/dist/techniques/source.js.map +1 -0
- package/dist/techniques/test-output.d.ts +3 -0
- package/dist/techniques/test-output.d.ts.map +1 -0
- package/dist/techniques/test-output.js +157 -0
- package/dist/techniques/test-output.js.map +1 -0
- package/dist/techniques/truncate.d.ts +2 -0
- package/dist/techniques/truncate.d.ts.map +1 -0
- package/dist/techniques/truncate.js +10 -0
- package/dist/techniques/truncate.js.map +1 -0
- package/dist/tool-execution-sanitizer.d.ts +6 -0
- package/dist/tool-execution-sanitizer.d.ts.map +1 -0
- package/dist/tool-execution-sanitizer.js +20 -0
- package/dist/tool-execution-sanitizer.js.map +1 -0
- package/dist/tool-shapes.d.ts +11 -0
- package/dist/tool-shapes.d.ts.map +1 -0
- package/dist/tool-shapes.js +41 -0
- package/dist/tool-shapes.js.map +1 -0
- package/dist/types.d.ts +43 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
import { aggregateLinterOutput, aggregateTestOutput, compactGitOutput, detectLanguage, filterBuildOutput, filterSourceCode, groupSearchResults, smartTruncate, stripAnsiFast, truncate, } from './techniques/index.js';
|
|
2
|
+
import { mapTextContentBlocks, toRecord } from './record-utils.js';
|
|
3
|
+
import { isRuntimePathUnderRoot, joinRuntimePath, normalizeRuntimePath } from './runtime-path.js';
|
|
4
|
+
import { isCommandToolName, readToolCommand } from './tool-shapes.js';
|
|
5
|
+
const LOSSY_TECHNIQUE_PREFIXES = [
|
|
6
|
+
'build',
|
|
7
|
+
'test',
|
|
8
|
+
'git',
|
|
9
|
+
'linter',
|
|
10
|
+
'search',
|
|
11
|
+
'truncate',
|
|
12
|
+
'smart-truncate',
|
|
13
|
+
'source:',
|
|
14
|
+
];
|
|
15
|
+
const READ_EXACT_OUTPUT_LINE_THRESHOLD = 80;
|
|
16
|
+
const READ_COMPACTION_BANNER_PREFIX = '[RTK compacted output:';
|
|
17
|
+
const CODEX_OUTPUT_MARKER = '\nOutput:\n';
|
|
18
|
+
const ANCHORED_READ_LINE_MIN_MATCHES = 2;
|
|
19
|
+
const ANCHORED_READ_LINE_MIN_RATIO = 0.5;
|
|
20
|
+
const ANCHORED_READ_LINE_SAMPLE_LIMIT = 200;
|
|
21
|
+
const ANCHORED_READ_LINE_PATTERNS = [
|
|
22
|
+
/^\s*(?:>>>|>>|[>+\-*]+)?\s*(\d+)\s*#\s*[A-Za-z0-9_-]{2,32}:(.*)$/,
|
|
23
|
+
/^\s*(?:>>>|>>|[>+\-*]+)?\s*(\d+)\s*:\s*[A-Za-z0-9_-]{1,32}\|(.*)$/,
|
|
24
|
+
/^\s*(?:>>>|>>|[>+\-*]+)?\s*(\d+)[a-z]{2}\|(.*)$/,
|
|
25
|
+
];
|
|
26
|
+
const ANCHORED_READ_INFORMATIONAL_LINE_PATTERN = /^\s*(?:$|<\/?file>|\.{3}|\[[^\]]+\]|Read\s+.+:\s+\d+\s+lines\b)/;
|
|
27
|
+
function isSkillReadPath(filePath, options) {
|
|
28
|
+
if (!filePath.trim()) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
const resolvedPath = normalizeRuntimePath(filePath, options.cwd);
|
|
32
|
+
const explicitRoots = [joinRuntimePath(options.agentDir, 'skills'), joinRuntimePath(options.cwd, '.pi', 'skills')];
|
|
33
|
+
if (explicitRoots.some((root) => isRuntimePathUnderRoot(resolvedPath, root, options.cwd))) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
return resolvedPath.includes('/.agents/skills/');
|
|
37
|
+
}
|
|
38
|
+
function toArray(value) {
|
|
39
|
+
return Array.isArray(value) ? value : [];
|
|
40
|
+
}
|
|
41
|
+
function normalizePath(input) {
|
|
42
|
+
const raw = input.path;
|
|
43
|
+
if (typeof raw === 'string') {
|
|
44
|
+
return raw;
|
|
45
|
+
}
|
|
46
|
+
return '';
|
|
47
|
+
}
|
|
48
|
+
function hasExplicitReadRange(input) {
|
|
49
|
+
return input.offset !== undefined || input.limit !== undefined;
|
|
50
|
+
}
|
|
51
|
+
function splitReadLines(text) {
|
|
52
|
+
if (!text) {
|
|
53
|
+
return { lines: [], trailingNewline: false };
|
|
54
|
+
}
|
|
55
|
+
const trailingNewline = text.endsWith('\n');
|
|
56
|
+
const lines = text.split(/\r?\n/);
|
|
57
|
+
if (trailingNewline) {
|
|
58
|
+
lines.pop();
|
|
59
|
+
}
|
|
60
|
+
return { lines, trailingNewline };
|
|
61
|
+
}
|
|
62
|
+
function joinReadLines(lines, trailingNewline) {
|
|
63
|
+
const joined = lines.join('\n');
|
|
64
|
+
return trailingNewline && joined ? `${joined}\n` : joined;
|
|
65
|
+
}
|
|
66
|
+
function parseAnchoredReadLine(line) {
|
|
67
|
+
for (const pattern of ANCHORED_READ_LINE_PATTERNS) {
|
|
68
|
+
const match = line.match(pattern);
|
|
69
|
+
if (!match) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const lineNumber = Number.parseInt(match[1] ?? '', 10);
|
|
73
|
+
if (!Number.isSafeInteger(lineNumber) || lineNumber <= 0) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const content = match[2] ?? '';
|
|
77
|
+
return {
|
|
78
|
+
lineNumber,
|
|
79
|
+
content,
|
|
80
|
+
originalLine: line,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
function parseAnchoredReadLineNumber(line) {
|
|
86
|
+
return parseAnchoredReadLine(line)?.lineNumber;
|
|
87
|
+
}
|
|
88
|
+
function looksLikeAnchoredLineOutput(text, parseLineNumber) {
|
|
89
|
+
let matchCount = 0;
|
|
90
|
+
let relevantLineCount = 0;
|
|
91
|
+
let previousMatchedLineNumber;
|
|
92
|
+
let hasIncreasingAnchors = false;
|
|
93
|
+
for (const line of splitReadLines(text).lines.slice(0, ANCHORED_READ_LINE_SAMPLE_LIMIT)) {
|
|
94
|
+
if (!ANCHORED_READ_INFORMATIONAL_LINE_PATTERN.test(line)) {
|
|
95
|
+
relevantLineCount += 1;
|
|
96
|
+
}
|
|
97
|
+
const lineNumber = parseLineNumber(line);
|
|
98
|
+
if (lineNumber === undefined) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
matchCount += 1;
|
|
102
|
+
if (previousMatchedLineNumber !== undefined && lineNumber > previousMatchedLineNumber) {
|
|
103
|
+
hasIncreasingAnchors = true;
|
|
104
|
+
}
|
|
105
|
+
previousMatchedLineNumber = lineNumber;
|
|
106
|
+
}
|
|
107
|
+
if (matchCount < ANCHORED_READ_LINE_MIN_MATCHES || !hasIncreasingAnchors) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
const ratioBase = Math.max(relevantLineCount, matchCount);
|
|
111
|
+
return matchCount / ratioBase >= ANCHORED_READ_LINE_MIN_RATIO;
|
|
112
|
+
}
|
|
113
|
+
function looksLikeAnchoredReadOutput(text) {
|
|
114
|
+
return looksLikeAnchoredLineOutput(text, parseAnchoredReadLineNumber);
|
|
115
|
+
}
|
|
116
|
+
function shouldPreserveExactReadOutput(text, input, config, options) {
|
|
117
|
+
if (!config.outputCompaction.readCompaction.enabled) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
if (hasExplicitReadRange(input)) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
if (config.outputCompaction.preserveExactSkillReads && isSkillReadPath(normalizePath(input), options)) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
return countLines(text) <= READ_EXACT_OUTPUT_LINE_THRESHOLD;
|
|
127
|
+
}
|
|
128
|
+
function shouldApplyReadSourceFiltering(text, config) {
|
|
129
|
+
const compaction = config.outputCompaction;
|
|
130
|
+
const lineCount = countLines(text);
|
|
131
|
+
return ((compaction.smartTruncate.enabled && lineCount > compaction.smartTruncate.maxLines) ||
|
|
132
|
+
(compaction.truncate.enabled && text.length > compaction.truncate.maxChars));
|
|
133
|
+
}
|
|
134
|
+
function extractAnchoredReadParts(text) {
|
|
135
|
+
if (!looksLikeAnchoredReadOutput(text)) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
const { lines, trailingNewline } = splitReadLines(text);
|
|
139
|
+
const parsedLines = lines.map((line) => parseAnchoredReadLine(line));
|
|
140
|
+
const firstAnchorIndex = parsedLines.findIndex((line) => line !== undefined);
|
|
141
|
+
if (firstAnchorIndex === -1) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
let lastAnchorIndex = firstAnchorIndex;
|
|
145
|
+
for (let index = parsedLines.length - 1; index >= firstAnchorIndex; index -= 1) {
|
|
146
|
+
if (parsedLines[index] !== undefined) {
|
|
147
|
+
lastAnchorIndex = index;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const anchoredLines = [];
|
|
152
|
+
for (let index = firstAnchorIndex; index <= lastAnchorIndex; index += 1) {
|
|
153
|
+
const anchoredLine = parsedLines[index];
|
|
154
|
+
if (!anchoredLine) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
anchoredLines.push(anchoredLine);
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
prefixLines: lines.slice(0, firstAnchorIndex),
|
|
161
|
+
anchoredLines,
|
|
162
|
+
suffixLines: lines.slice(lastAnchorIndex + 1),
|
|
163
|
+
trailingNewline,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function toAnchorSafeReadLines(anchoredLines) {
|
|
167
|
+
return anchoredLines.map((line) => ({
|
|
168
|
+
text: line.originalLine,
|
|
169
|
+
content: line.content,
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
function renderAnchorSafeReadBody(lines) {
|
|
173
|
+
return lines.map((line) => line.text).join('\n');
|
|
174
|
+
}
|
|
175
|
+
function renderAnchorSafeReadText(parts, lines) {
|
|
176
|
+
return joinReadLines([...parts.prefixLines, ...lines.map((line) => line.text), ...parts.suffixLines], parts.trailingNewline);
|
|
177
|
+
}
|
|
178
|
+
function remapTransformedContentToAnchorSafeLines(sourceLines, transformedContent) {
|
|
179
|
+
const transformedLines = splitReadLines(transformedContent).lines;
|
|
180
|
+
const remappedLines = [];
|
|
181
|
+
let searchStartIndex = 0;
|
|
182
|
+
for (const transformedLine of transformedLines) {
|
|
183
|
+
let matchedIndex = -1;
|
|
184
|
+
for (let index = searchStartIndex; index < sourceLines.length; index += 1) {
|
|
185
|
+
if (sourceLines[index]?.content === transformedLine) {
|
|
186
|
+
matchedIndex = index;
|
|
187
|
+
break;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (matchedIndex === -1) {
|
|
191
|
+
remappedLines.push({
|
|
192
|
+
text: transformedLine,
|
|
193
|
+
content: transformedLine,
|
|
194
|
+
});
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
remappedLines.push(sourceLines[matchedIndex]);
|
|
198
|
+
searchStartIndex = matchedIndex + 1;
|
|
199
|
+
}
|
|
200
|
+
return remappedLines;
|
|
201
|
+
}
|
|
202
|
+
function truncateAnchorSafeReadLines(lines, maxChars) {
|
|
203
|
+
if (renderAnchorSafeReadBody(lines).length <= maxChars) {
|
|
204
|
+
return lines;
|
|
205
|
+
}
|
|
206
|
+
const marker = '[RTK anchor-safe truncate: remaining anchored read lines omitted to preserve complete anchors]';
|
|
207
|
+
const truncatedLines = [];
|
|
208
|
+
let charCount = 0;
|
|
209
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
210
|
+
const line = lines[index];
|
|
211
|
+
const separatorLength = truncatedLines.length > 0 ? 1 : 0;
|
|
212
|
+
const nextCharCount = charCount + separatorLength + line.text.length;
|
|
213
|
+
const remainingAfter = lines.length - index - 1;
|
|
214
|
+
const markerLength = remainingAfter > 0 ? (nextCharCount > 0 ? 1 : 0) + marker.length : 0;
|
|
215
|
+
if (nextCharCount + markerLength > maxChars) {
|
|
216
|
+
const markerLine = { text: marker, content: marker };
|
|
217
|
+
return truncatedLines.length > 0 ? [...truncatedLines, markerLine] : [markerLine];
|
|
218
|
+
}
|
|
219
|
+
truncatedLines.push(line);
|
|
220
|
+
charCount = nextCharCount;
|
|
221
|
+
}
|
|
222
|
+
return truncatedLines;
|
|
223
|
+
}
|
|
224
|
+
function compactAnchoredReadText(text, filePath, config) {
|
|
225
|
+
const parts = extractAnchoredReadParts(text);
|
|
226
|
+
if (!parts) {
|
|
227
|
+
return { text, techniques: [] };
|
|
228
|
+
}
|
|
229
|
+
let lines = toAnchorSafeReadLines(parts.anchoredLines);
|
|
230
|
+
const techniques = [];
|
|
231
|
+
const compaction = config.outputCompaction;
|
|
232
|
+
const language = detectLanguage(filePath);
|
|
233
|
+
if (compaction.sourceCodeFilteringEnabled &&
|
|
234
|
+
compaction.sourceCodeFiltering !== 'none' &&
|
|
235
|
+
shouldApplyReadSourceFiltering(text, config)) {
|
|
236
|
+
const currentSource = lines.map((line) => line.content).join('\n');
|
|
237
|
+
const filtered = normalizeTechniqueResult(filterSourceCode(currentSource, language, compaction.sourceCodeFiltering), currentSource);
|
|
238
|
+
const filteredLines = remapTransformedContentToAnchorSafeLines(lines, filtered);
|
|
239
|
+
if (renderAnchorSafeReadBody(filteredLines) !== renderAnchorSafeReadBody(lines)) {
|
|
240
|
+
lines = filteredLines;
|
|
241
|
+
techniques.push(`source:${compaction.sourceCodeFiltering}`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (compaction.smartTruncate.enabled && lines.length > compaction.smartTruncate.maxLines) {
|
|
245
|
+
const currentSource = lines.map((line) => line.content).join('\n');
|
|
246
|
+
const compacted = smartTruncate(currentSource, compaction.smartTruncate.maxLines, language);
|
|
247
|
+
const compactedLines = remapTransformedContentToAnchorSafeLines(lines, compacted);
|
|
248
|
+
if (renderAnchorSafeReadBody(compactedLines) !== renderAnchorSafeReadBody(lines)) {
|
|
249
|
+
lines = compactedLines;
|
|
250
|
+
techniques.push('smart-truncate');
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (compaction.truncate.enabled && renderAnchorSafeReadText(parts, lines).length > compaction.truncate.maxChars) {
|
|
254
|
+
const nonBodyOverhead = renderAnchorSafeReadText(parts, []).length;
|
|
255
|
+
const bodyMaxChars = Math.max(1, compaction.truncate.maxChars - nonBodyOverhead);
|
|
256
|
+
const truncatedLines = truncateAnchorSafeReadLines(lines, bodyMaxChars);
|
|
257
|
+
if (renderAnchorSafeReadBody(truncatedLines) !== renderAnchorSafeReadBody(lines)) {
|
|
258
|
+
lines = truncatedLines;
|
|
259
|
+
techniques.push('truncate');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
text: renderAnchorSafeReadText(parts, lines),
|
|
264
|
+
techniques,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
function formatReadCompactionBanner(techniques) {
|
|
268
|
+
return `${READ_COMPACTION_BANNER_PREFIX} ${techniques.join(', ')}]`;
|
|
269
|
+
}
|
|
270
|
+
function countLines(text) {
|
|
271
|
+
if (!text) {
|
|
272
|
+
return 0;
|
|
273
|
+
}
|
|
274
|
+
const normalized = text.endsWith('\n') ? text.slice(0, -1) : text;
|
|
275
|
+
if (!normalized) {
|
|
276
|
+
return 1;
|
|
277
|
+
}
|
|
278
|
+
return normalized.split('\n').length;
|
|
279
|
+
}
|
|
280
|
+
function hasLossyCompaction(techniques) {
|
|
281
|
+
return techniques.some((technique) => LOSSY_TECHNIQUE_PREFIXES.some((prefix) => prefix.endsWith(':') ? technique.startsWith(prefix) : technique === prefix));
|
|
282
|
+
}
|
|
283
|
+
function normalizeTechniqueResult(result, currentText) {
|
|
284
|
+
return result === null ? currentText : result;
|
|
285
|
+
}
|
|
286
|
+
/** Strips ANSI escape codes when enabled, recording the "ansi" technique on change. */
|
|
287
|
+
function applyAnsiStripping(state, compaction) {
|
|
288
|
+
if (!compaction.stripAnsi) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const stripped = stripAnsiFast(state.text);
|
|
292
|
+
if (stripped !== state.text) {
|
|
293
|
+
state.text = stripped;
|
|
294
|
+
state.techniques.push('ansi');
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/** Applies hard character truncation when enabled and the threshold is exceeded. */
|
|
298
|
+
function applyTruncation(state, compaction) {
|
|
299
|
+
if (compaction.truncate.enabled && state.text.length > compaction.truncate.maxChars) {
|
|
300
|
+
state.text = truncate(state.text, compaction.truncate.maxChars);
|
|
301
|
+
state.techniques.push('truncate');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Applies a single nullable-result compaction technique: runs `transform`, keeps
|
|
306
|
+
* its result when it differs from the current text, and records `technique`.
|
|
307
|
+
* Mirrors the `normalizeTechniqueResult(...) !== current → push` idiom shared
|
|
308
|
+
* across the bash/read/grep compactors.
|
|
309
|
+
*/
|
|
310
|
+
function applyNullableTechnique(state, transform, technique) {
|
|
311
|
+
const compacted = normalizeTechniqueResult(transform(state.text), state.text);
|
|
312
|
+
if (compacted !== state.text) {
|
|
313
|
+
state.text = compacted;
|
|
314
|
+
state.techniques.push(technique);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
function applyConditionalTechnique(state, enabled, transform, technique) {
|
|
318
|
+
if (enabled) {
|
|
319
|
+
applyNullableTechnique(state, transform, technique);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function beginCompaction(text, config) {
|
|
323
|
+
const state = { text, techniques: [] };
|
|
324
|
+
const compaction = config.outputCompaction;
|
|
325
|
+
applyAnsiStripping(state, compaction);
|
|
326
|
+
return { state, compaction };
|
|
327
|
+
}
|
|
328
|
+
function applyReadCompactionBanner(state) {
|
|
329
|
+
if (state.techniques.length > 0 && !state.text.startsWith(READ_COMPACTION_BANNER_PREFIX)) {
|
|
330
|
+
state.text = `${formatReadCompactionBanner(state.techniques)}\n${state.text}`;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
function compactCommandText(text, command, config) {
|
|
334
|
+
const { state, compaction } = beginCompaction(text, config);
|
|
335
|
+
applyConditionalTechnique(state, compaction.filterBuildOutput, (t) => filterBuildOutput(t, command), 'build');
|
|
336
|
+
applyConditionalTechnique(state, compaction.aggregateTestOutput, (t) => aggregateTestOutput(t, command), 'test');
|
|
337
|
+
applyConditionalTechnique(state, compaction.compactGitOutput, (t) => compactGitOutput(t, command), 'git');
|
|
338
|
+
applyConditionalTechnique(state, compaction.aggregateLinterOutput, (t) => aggregateLinterOutput(t, command), 'linter');
|
|
339
|
+
applyTruncation(state, compaction);
|
|
340
|
+
return { text: state.text, techniques: state.techniques };
|
|
341
|
+
}
|
|
342
|
+
function compactCodexCommandText(text, command, config) {
|
|
343
|
+
const markerIndex = text.indexOf(CODEX_OUTPUT_MARKER);
|
|
344
|
+
if (markerIndex === -1)
|
|
345
|
+
return compactCommandText(text, command, config);
|
|
346
|
+
const outputStart = markerIndex + CODEX_OUTPUT_MARKER.length;
|
|
347
|
+
const prefix = text.slice(0, outputStart);
|
|
348
|
+
const transformed = compactCommandText(text.slice(outputStart), command, config);
|
|
349
|
+
return { ...transformed, text: `${prefix}${transformed.text}` };
|
|
350
|
+
}
|
|
351
|
+
function compactReadText(text, filePath, config, preserveExactReadOutput) {
|
|
352
|
+
if (preserveExactReadOutput) {
|
|
353
|
+
return { text, techniques: [] };
|
|
354
|
+
}
|
|
355
|
+
const { state, compaction } = beginCompaction(text, config);
|
|
356
|
+
if (looksLikeAnchoredReadOutput(state.text)) {
|
|
357
|
+
const anchored = compactAnchoredReadText(state.text, filePath, config);
|
|
358
|
+
state.text = anchored.text;
|
|
359
|
+
state.techniques.push(...anchored.techniques);
|
|
360
|
+
applyReadCompactionBanner(state);
|
|
361
|
+
return { text: state.text, techniques: state.techniques };
|
|
362
|
+
}
|
|
363
|
+
const language = detectLanguage(filePath);
|
|
364
|
+
// Only apply lossy source filtering when a downstream line/char safeguard would otherwise trigger.
|
|
365
|
+
if (compaction.sourceCodeFilteringEnabled &&
|
|
366
|
+
compaction.sourceCodeFiltering !== 'none' &&
|
|
367
|
+
shouldApplyReadSourceFiltering(text, config)) {
|
|
368
|
+
applyNullableTechnique(state, (t) => filterSourceCode(t, language, compaction.sourceCodeFiltering), `source:${compaction.sourceCodeFiltering}`);
|
|
369
|
+
}
|
|
370
|
+
if (compaction.smartTruncate.enabled) {
|
|
371
|
+
const lineCount = state.text.split('\n').length;
|
|
372
|
+
if (lineCount > compaction.smartTruncate.maxLines) {
|
|
373
|
+
const compacted = smartTruncate(state.text, compaction.smartTruncate.maxLines, language);
|
|
374
|
+
if (compacted !== state.text) {
|
|
375
|
+
state.text = compacted;
|
|
376
|
+
state.techniques.push('smart-truncate');
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
applyTruncation(state, compaction);
|
|
381
|
+
applyReadCompactionBanner(state);
|
|
382
|
+
return { text: state.text, techniques: state.techniques };
|
|
383
|
+
}
|
|
384
|
+
function compactGrepText(text, config) {
|
|
385
|
+
const { state, compaction } = beginCompaction(text, config);
|
|
386
|
+
if (compaction.groupSearchOutput) {
|
|
387
|
+
applyNullableTechnique(state, (t) => groupSearchResults(t), 'search');
|
|
388
|
+
}
|
|
389
|
+
applyTruncation(state, compaction);
|
|
390
|
+
return { text: state.text, techniques: state.techniques };
|
|
391
|
+
}
|
|
392
|
+
export function compactToolResult(event, config, options) {
|
|
393
|
+
if (!config.outputCompaction.enabled) {
|
|
394
|
+
return { changed: false, techniques: [] };
|
|
395
|
+
}
|
|
396
|
+
const input = toRecord(event.input);
|
|
397
|
+
const sourceContent = toArray(event.content);
|
|
398
|
+
if (sourceContent.length === 0) {
|
|
399
|
+
return { changed: false, techniques: [] };
|
|
400
|
+
}
|
|
401
|
+
const allTechniques = new Set();
|
|
402
|
+
const originalChunks = [];
|
|
403
|
+
const filteredChunks = [];
|
|
404
|
+
const { changed, content: nextContent } = mapTextContentBlocks(sourceContent, (contentBlock) => {
|
|
405
|
+
let transformed = { text: contentBlock.text, techniques: [] };
|
|
406
|
+
if (isCommandToolName(event.toolName)) {
|
|
407
|
+
const command = options.command ?? readToolCommand(event.toolName, input);
|
|
408
|
+
transformed =
|
|
409
|
+
event.toolName === 'exec_command'
|
|
410
|
+
? compactCodexCommandText(contentBlock.text, command, config)
|
|
411
|
+
: compactCommandText(contentBlock.text, command, config);
|
|
412
|
+
}
|
|
413
|
+
else if (event.toolName === 'write_stdin') {
|
|
414
|
+
transformed = compactCodexCommandText(contentBlock.text, options.command, config);
|
|
415
|
+
}
|
|
416
|
+
else if (event.toolName === 'read') {
|
|
417
|
+
const normalizedPath = normalizePath(input);
|
|
418
|
+
transformed = compactReadText(contentBlock.text, normalizedPath, config, shouldPreserveExactReadOutput(contentBlock.text, input, config, options));
|
|
419
|
+
}
|
|
420
|
+
else if (event.toolName === 'grep') {
|
|
421
|
+
transformed = compactGrepText(contentBlock.text, config);
|
|
422
|
+
}
|
|
423
|
+
for (const technique of transformed.techniques) {
|
|
424
|
+
allTechniques.add(technique);
|
|
425
|
+
}
|
|
426
|
+
originalChunks.push(contentBlock.text);
|
|
427
|
+
filteredChunks.push(transformed.text);
|
|
428
|
+
return transformed.text !== contentBlock.text ? transformed.text : undefined;
|
|
429
|
+
});
|
|
430
|
+
if (!changed) {
|
|
431
|
+
return { changed: false, techniques: [] };
|
|
432
|
+
}
|
|
433
|
+
const techniques = Array.from(allTechniques);
|
|
434
|
+
const originalText = originalChunks.join('\n');
|
|
435
|
+
const compactedText = filteredChunks.join('\n');
|
|
436
|
+
if (config.outputCompaction.trackSavings) {
|
|
437
|
+
options.metrics?.track(originalText, compactedText, event.toolName, techniques);
|
|
438
|
+
}
|
|
439
|
+
const metadata = {
|
|
440
|
+
applied: true,
|
|
441
|
+
techniques,
|
|
442
|
+
truncated: hasLossyCompaction(techniques),
|
|
443
|
+
originalCharCount: originalText.length,
|
|
444
|
+
compactedCharCount: compactedText.length,
|
|
445
|
+
originalLineCount: countLines(originalText),
|
|
446
|
+
compactedLineCount: countLines(compactedText),
|
|
447
|
+
};
|
|
448
|
+
return {
|
|
449
|
+
changed: true,
|
|
450
|
+
content: nextContent,
|
|
451
|
+
techniques,
|
|
452
|
+
metadata,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
//# sourceMappingURL=output-compactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-compactor.js","sourceRoot":"","sources":["../src/output-compactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface OutputMetricRecord {
|
|
2
|
+
readonly timestamp: string;
|
|
3
|
+
readonly tool: string;
|
|
4
|
+
readonly techniques: string;
|
|
5
|
+
readonly originalChars: number;
|
|
6
|
+
readonly filteredChars: number;
|
|
7
|
+
readonly savingsPercent: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class OutputMetrics {
|
|
10
|
+
#private;
|
|
11
|
+
track(original: string, filtered: string, tool: string, techniques: readonly string[]): OutputMetricRecord;
|
|
12
|
+
clear(): void;
|
|
13
|
+
summary(): string;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=output-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-metrics.d.ts","sourceRoot":"","sources":["../src/output-metrics.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,qBAAa,aAAa;;IAGxB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,kBAAkB;IAiB1G,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,MAAM;CA2BlB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export class OutputMetrics {
|
|
2
|
+
#records = [];
|
|
3
|
+
track(original, filtered, tool, techniques) {
|
|
4
|
+
const originalChars = original.length;
|
|
5
|
+
const filteredChars = filtered.length;
|
|
6
|
+
const savingsPercent = originalChars === 0 ? 0 : Math.round(((originalChars - filteredChars) / originalChars) * 10_000) / 100;
|
|
7
|
+
const record = {
|
|
8
|
+
timestamp: new Date().toISOString(),
|
|
9
|
+
tool,
|
|
10
|
+
techniques: techniques.join(',') || 'none',
|
|
11
|
+
originalChars,
|
|
12
|
+
filteredChars,
|
|
13
|
+
savingsPercent,
|
|
14
|
+
};
|
|
15
|
+
this.#records.push(record);
|
|
16
|
+
return record;
|
|
17
|
+
}
|
|
18
|
+
clear() {
|
|
19
|
+
this.#records.length = 0;
|
|
20
|
+
}
|
|
21
|
+
summary() {
|
|
22
|
+
if (this.#records.length === 0)
|
|
23
|
+
return 'RTK output compaction metrics: no data yet.';
|
|
24
|
+
const totalOriginal = sum(this.#records, (record) => record.originalChars);
|
|
25
|
+
const totalFiltered = sum(this.#records, (record) => record.filteredChars);
|
|
26
|
+
const totalSaved = totalOriginal - totalFiltered;
|
|
27
|
+
const savingsPercent = totalOriginal === 0 ? 0 : (totalSaved / totalOriginal) * 100;
|
|
28
|
+
const byTool = new Map();
|
|
29
|
+
for (const record of this.#records) {
|
|
30
|
+
const current = byTool.get(record.tool) ?? { count: 0, original: 0, filtered: 0 };
|
|
31
|
+
current.count += 1;
|
|
32
|
+
current.original += record.originalChars;
|
|
33
|
+
current.filtered += record.filteredChars;
|
|
34
|
+
byTool.set(record.tool, current);
|
|
35
|
+
}
|
|
36
|
+
return [
|
|
37
|
+
'RTK output compaction metrics',
|
|
38
|
+
`calls=${this.#records.length}, saved=${totalSaved.toLocaleString()} chars (${savingsPercent.toFixed(1)}%)`,
|
|
39
|
+
...[...byTool].map(([tool, current]) => {
|
|
40
|
+
const saved = current.original - current.filtered;
|
|
41
|
+
const percent = current.original === 0 ? 0 : (saved / current.original) * 100;
|
|
42
|
+
return `- ${tool}: ${current.count} calls, saved ${saved.toLocaleString()} chars (${percent.toFixed(1)}%)`;
|
|
43
|
+
}),
|
|
44
|
+
].join('\n');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function sum(values, select) {
|
|
48
|
+
return values.reduce((total, value) => total + select(value), 0);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=output-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-metrics.js","sourceRoot":"","sources":["../src/output-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function toRecord(value: unknown): Record<string, unknown>;
|
|
2
|
+
export interface TextContentBlock {
|
|
3
|
+
readonly type: string;
|
|
4
|
+
readonly text: string;
|
|
5
|
+
readonly [key: string]: unknown;
|
|
6
|
+
}
|
|
7
|
+
export declare function isTextContentBlock(value: unknown): value is TextContentBlock;
|
|
8
|
+
export declare function mapTextContentBlocks(content: readonly unknown[], transform: (block: TextContentBlock) => string | undefined): {
|
|
9
|
+
readonly changed: boolean;
|
|
10
|
+
readonly content: unknown[];
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=record-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-utils.d.ts","sourceRoot":"","sources":["../src/record-utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGhE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAG5E;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,SAAS,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,MAAM,GAAG,SAAS,GACzD;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;CAAE,CAU5D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function toRecord(value) {
|
|
2
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
3
|
+
return {};
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
6
|
+
export function isTextContentBlock(value) {
|
|
7
|
+
const block = toRecord(value);
|
|
8
|
+
return block.type === 'text' && typeof block.text === 'string';
|
|
9
|
+
}
|
|
10
|
+
export function mapTextContentBlocks(content, transform) {
|
|
11
|
+
let changed = false;
|
|
12
|
+
const mapped = content.map((block) => {
|
|
13
|
+
if (!isTextContentBlock(block))
|
|
14
|
+
return block;
|
|
15
|
+
const text = transform(block);
|
|
16
|
+
if (text === undefined || text === block.text)
|
|
17
|
+
return block;
|
|
18
|
+
changed = true;
|
|
19
|
+
return { ...block, text };
|
|
20
|
+
});
|
|
21
|
+
return { changed, content: mapped };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=record-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-utils.js","sourceRoot":"","sources":["../src/record-utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnF,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAQD,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAA2B,EAC3B,SAA0D;IAE1D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC5D,OAAO,GAAG,IAAI,CAAC;QACf,OAAO,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function joinRuntimePath(root: string, ...segments: readonly string[]): string;
|
|
2
|
+
export declare function normalizeRuntimePath(path: string, cwd: string): string;
|
|
3
|
+
export declare function isRuntimePathUnderRoot(target: string, root: string, cwd: string): boolean;
|
|
4
|
+
//# sourceMappingURL=runtime-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-path.d.ts","sourceRoot":"","sources":["../src/runtime-path.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CASpF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAyBtE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAIzF"}
|