@git.zone/tsdoc 1.11.1 → 1.11.3
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_ts/aidocs_classes/commit.js +65 -42
- package/dist_ts/aidocs_classes/description.js +68 -29
- package/dist_ts/aidocs_classes/projectcontext.d.ts +5 -5
- package/dist_ts/aidocs_classes/projectcontext.js +8 -16
- package/dist_ts/aidocs_classes/readme.js +156 -88
- package/dist_ts/classes.aidoc.d.ts +10 -6
- package/dist_ts/classes.aidoc.js +17 -11
- package/dist_ts/classes.diffprocessor.js +284 -0
- package/dist_ts/cli.js +21 -92
- package/dist_ts/plugins.d.ts +1 -2
- package/dist_ts/plugins.js +2 -3
- package/package.json +2 -3
- package/ts/aidocs_classes/commit.ts +67 -51
- package/ts/aidocs_classes/description.ts +72 -34
- package/ts/aidocs_classes/projectcontext.ts +7 -14
- package/ts/aidocs_classes/readme.ts +168 -93
- package/ts/classes.aidoc.ts +18 -11
- package/ts/cli.ts +20 -100
- package/ts/plugins.ts +1 -2
- package/dist_ts/context/config-manager.d.ts +0 -83
- package/dist_ts/context/config-manager.js +0 -318
- package/dist_ts/context/context-analyzer.d.ts +0 -73
- package/dist_ts/context/context-analyzer.js +0 -311
- package/dist_ts/context/context-cache.d.ts +0 -73
- package/dist_ts/context/context-cache.js +0 -239
- package/dist_ts/context/context-trimmer.d.ts +0 -60
- package/dist_ts/context/context-trimmer.js +0 -258
- package/dist_ts/context/diff-processor.js +0 -284
- package/dist_ts/context/enhanced-context.d.ts +0 -73
- package/dist_ts/context/enhanced-context.js +0 -275
- package/dist_ts/context/index.d.ts +0 -11
- package/dist_ts/context/index.js +0 -12
- package/dist_ts/context/iterative-context-builder.d.ts +0 -62
- package/dist_ts/context/iterative-context-builder.js +0 -395
- package/dist_ts/context/lazy-file-loader.d.ts +0 -60
- package/dist_ts/context/lazy-file-loader.js +0 -182
- package/dist_ts/context/task-context-factory.d.ts +0 -48
- package/dist_ts/context/task-context-factory.js +0 -86
- package/dist_ts/context/types.d.ts +0 -301
- package/dist_ts/context/types.js +0 -2
- package/dist_ts/tsdoc.classes.typedoc.d.ts +0 -10
- package/dist_ts/tsdoc.classes.typedoc.js +0 -48
- package/dist_ts/tsdoc.cli.d.ts +0 -1
- package/dist_ts/tsdoc.cli.js +0 -32
- package/dist_ts/tsdoc.logging.d.ts +0 -2
- package/dist_ts/tsdoc.logging.js +0 -14
- package/dist_ts/tsdoc.paths.d.ts +0 -8
- package/dist_ts/tsdoc.paths.js +0 -12
- package/dist_ts/tsdoc.plugins.d.ts +0 -11
- package/dist_ts/tsdoc.plugins.js +0 -15
- package/ts/context/config-manager.ts +0 -369
- package/ts/context/context-analyzer.ts +0 -391
- package/ts/context/context-cache.ts +0 -286
- package/ts/context/context-trimmer.ts +0 -310
- package/ts/context/enhanced-context.ts +0 -332
- package/ts/context/index.ts +0 -70
- package/ts/context/iterative-context-builder.ts +0 -512
- package/ts/context/lazy-file-loader.ts +0 -207
- package/ts/context/task-context-factory.ts +0 -120
- package/ts/context/types.ts +0 -324
- /package/dist_ts/{context/diff-processor.d.ts → classes.diffprocessor.d.ts} +0 -0
- /package/ts/{context/diff-processor.ts → classes.diffprocessor.ts} +0 -0
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intelligent git diff processor that handles large diffs by sampling and prioritization
|
|
3
|
-
* instead of blind truncation.
|
|
4
|
-
*/
|
|
5
|
-
export class DiffProcessor {
|
|
6
|
-
constructor(options = {}) {
|
|
7
|
-
this.options = {
|
|
8
|
-
maxDiffTokens: options.maxDiffTokens ?? 100000,
|
|
9
|
-
smallFileLines: options.smallFileLines ?? 50,
|
|
10
|
-
mediumFileLines: options.mediumFileLines ?? 200,
|
|
11
|
-
sampleHeadLines: options.sampleHeadLines ?? 20,
|
|
12
|
-
sampleTailLines: options.sampleTailLines ?? 20,
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Process an array of git diffs into a structured, token-efficient format
|
|
17
|
-
*/
|
|
18
|
-
processDiffs(diffStringArray) {
|
|
19
|
-
// Parse all diffs into file info objects
|
|
20
|
-
const fileInfos = diffStringArray
|
|
21
|
-
.map(diffString => this.parseDiffFile(diffString))
|
|
22
|
-
.filter(info => info !== null);
|
|
23
|
-
// Prioritize files (source files first, build artifacts last)
|
|
24
|
-
const prioritized = this.prioritizeFiles(fileInfos);
|
|
25
|
-
const result = {
|
|
26
|
-
summary: '',
|
|
27
|
-
fullDiffs: [],
|
|
28
|
-
summarizedDiffs: [],
|
|
29
|
-
metadataOnly: [],
|
|
30
|
-
totalFiles: prioritized.length,
|
|
31
|
-
totalTokens: 0,
|
|
32
|
-
};
|
|
33
|
-
let tokensUsed = 0;
|
|
34
|
-
const tokenBudget = this.options.maxDiffTokens;
|
|
35
|
-
// Categorize and include files based on size and token budget
|
|
36
|
-
for (const fileInfo of prioritized) {
|
|
37
|
-
const remainingBudget = tokenBudget - tokensUsed;
|
|
38
|
-
if (remainingBudget <= 0) {
|
|
39
|
-
// Budget exhausted - rest are metadata only
|
|
40
|
-
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
if (fileInfo.totalLines <= this.options.smallFileLines) {
|
|
44
|
-
// Small file - include fully if budget allows
|
|
45
|
-
if (fileInfo.estimatedTokens <= remainingBudget) {
|
|
46
|
-
const statusPrefix = this.getFileStatusPrefix(fileInfo);
|
|
47
|
-
result.fullDiffs.push(`${statusPrefix}${fileInfo.diffContent}`);
|
|
48
|
-
tokensUsed += fileInfo.estimatedTokens;
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
else if (fileInfo.totalLines <= this.options.mediumFileLines) {
|
|
55
|
-
// Medium file - try to include summary with head/tail
|
|
56
|
-
const summary = this.extractDiffSample(fileInfo, this.options.sampleHeadLines, this.options.sampleTailLines);
|
|
57
|
-
const summaryTokens = Math.ceil(summary.length / 4); // Rough estimate
|
|
58
|
-
if (summaryTokens <= remainingBudget) {
|
|
59
|
-
result.summarizedDiffs.push(summary);
|
|
60
|
-
tokensUsed += summaryTokens;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
// Large file - metadata only
|
|
68
|
-
result.metadataOnly.push(this.formatMetadataOnly(fileInfo));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
result.totalTokens = tokensUsed;
|
|
72
|
-
result.summary = this.generateSummary(result);
|
|
73
|
-
return result;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Format the processed diff for inclusion in context
|
|
77
|
-
*/
|
|
78
|
-
formatForContext(processed) {
|
|
79
|
-
const sections = [];
|
|
80
|
-
// Summary section
|
|
81
|
-
sections.push('====== GIT DIFF SUMMARY ======');
|
|
82
|
-
sections.push(processed.summary);
|
|
83
|
-
sections.push('');
|
|
84
|
-
// Full diffs section
|
|
85
|
-
if (processed.fullDiffs.length > 0) {
|
|
86
|
-
sections.push(`====== FULL DIFFS (${processed.fullDiffs.length} files) ======`);
|
|
87
|
-
sections.push(processed.fullDiffs.join('\n\n'));
|
|
88
|
-
sections.push('');
|
|
89
|
-
}
|
|
90
|
-
// Summarized diffs section
|
|
91
|
-
if (processed.summarizedDiffs.length > 0) {
|
|
92
|
-
sections.push(`====== SUMMARIZED DIFFS (${processed.summarizedDiffs.length} files) ======`);
|
|
93
|
-
sections.push(processed.summarizedDiffs.join('\n\n'));
|
|
94
|
-
sections.push('');
|
|
95
|
-
}
|
|
96
|
-
// Metadata only section
|
|
97
|
-
if (processed.metadataOnly.length > 0) {
|
|
98
|
-
sections.push(`====== METADATA ONLY (${processed.metadataOnly.length} files) ======`);
|
|
99
|
-
sections.push(processed.metadataOnly.join('\n'));
|
|
100
|
-
sections.push('');
|
|
101
|
-
}
|
|
102
|
-
sections.push('====== END OF GIT DIFF ======');
|
|
103
|
-
return sections.join('\n');
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Parse a single git diff string into file information
|
|
107
|
-
*/
|
|
108
|
-
parseDiffFile(diffString) {
|
|
109
|
-
if (!diffString || diffString.trim().length === 0) {
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
const lines = diffString.split('\n');
|
|
113
|
-
let filepath = '';
|
|
114
|
-
let status = 'modified';
|
|
115
|
-
let linesAdded = 0;
|
|
116
|
-
let linesRemoved = 0;
|
|
117
|
-
// Parse diff header to extract filepath and status
|
|
118
|
-
for (const line of lines) {
|
|
119
|
-
if (line.startsWith('--- a/')) {
|
|
120
|
-
filepath = line.substring(6);
|
|
121
|
-
}
|
|
122
|
-
else if (line.startsWith('+++ b/')) {
|
|
123
|
-
const newPath = line.substring(6);
|
|
124
|
-
if (newPath === '/dev/null') {
|
|
125
|
-
status = 'deleted';
|
|
126
|
-
}
|
|
127
|
-
else if (filepath === '/dev/null') {
|
|
128
|
-
status = 'added';
|
|
129
|
-
filepath = newPath;
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
filepath = newPath;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
else if (line.startsWith('+') && !line.startsWith('+++')) {
|
|
136
|
-
linesAdded++;
|
|
137
|
-
}
|
|
138
|
-
else if (line.startsWith('-') && !line.startsWith('---')) {
|
|
139
|
-
linesRemoved++;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
const totalLines = linesAdded + linesRemoved;
|
|
143
|
-
const estimatedTokens = Math.ceil(diffString.length / 4);
|
|
144
|
-
return {
|
|
145
|
-
filepath,
|
|
146
|
-
status,
|
|
147
|
-
linesAdded,
|
|
148
|
-
linesRemoved,
|
|
149
|
-
totalLines,
|
|
150
|
-
estimatedTokens,
|
|
151
|
-
diffContent: diffString,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Prioritize files by importance (source files before build artifacts)
|
|
156
|
-
*/
|
|
157
|
-
prioritizeFiles(files) {
|
|
158
|
-
return files.sort((a, b) => {
|
|
159
|
-
const scoreA = this.getFileImportanceScore(a.filepath);
|
|
160
|
-
const scoreB = this.getFileImportanceScore(b.filepath);
|
|
161
|
-
return scoreB - scoreA; // Higher score first
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Calculate importance score for a file path
|
|
166
|
-
*/
|
|
167
|
-
getFileImportanceScore(filepath) {
|
|
168
|
-
// Source files - highest priority
|
|
169
|
-
if (filepath.match(/^(src|lib|app|components|pages|api)\//)) {
|
|
170
|
-
return 100;
|
|
171
|
-
}
|
|
172
|
-
// Test files - high priority
|
|
173
|
-
if (filepath.match(/\.(test|spec)\.(ts|js|tsx|jsx)$/) || filepath.startsWith('test/')) {
|
|
174
|
-
return 80;
|
|
175
|
-
}
|
|
176
|
-
// Configuration files - medium-high priority
|
|
177
|
-
if (filepath.match(/\.(json|yaml|yml|toml|config\.(ts|js))$/)) {
|
|
178
|
-
return 60;
|
|
179
|
-
}
|
|
180
|
-
// Documentation - medium priority
|
|
181
|
-
if (filepath.match(/\.(md|txt|rst)$/)) {
|
|
182
|
-
return 40;
|
|
183
|
-
}
|
|
184
|
-
// Build artifacts - low priority
|
|
185
|
-
if (filepath.match(/^(dist|build|out|\.next|public\/dist)\//)) {
|
|
186
|
-
return 10;
|
|
187
|
-
}
|
|
188
|
-
// Start with default priority
|
|
189
|
-
let score = 50;
|
|
190
|
-
// Boost interface/type files - they're usually small but critical
|
|
191
|
-
if (filepath.includes('interfaces/') || filepath.includes('.types.')) {
|
|
192
|
-
score += 20;
|
|
193
|
-
}
|
|
194
|
-
// Boost entry points
|
|
195
|
-
if (filepath.endsWith('index.ts') || filepath.endsWith('mod.ts')) {
|
|
196
|
-
score += 15;
|
|
197
|
-
}
|
|
198
|
-
return score;
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Extract head and tail lines from a diff, omitting the middle
|
|
202
|
-
*/
|
|
203
|
-
extractDiffSample(fileInfo, headLines, tailLines) {
|
|
204
|
-
const lines = fileInfo.diffContent.split('\n');
|
|
205
|
-
const totalLines = lines.length;
|
|
206
|
-
if (totalLines <= headLines + tailLines) {
|
|
207
|
-
// File is small enough to include fully
|
|
208
|
-
return fileInfo.diffContent;
|
|
209
|
-
}
|
|
210
|
-
// Extract file metadata from diff header
|
|
211
|
-
const headerLines = [];
|
|
212
|
-
let bodyStartIndex = 0;
|
|
213
|
-
for (let i = 0; i < lines.length; i++) {
|
|
214
|
-
if (lines[i].startsWith('@@')) {
|
|
215
|
-
headerLines.push(...lines.slice(0, i + 1));
|
|
216
|
-
bodyStartIndex = i + 1;
|
|
217
|
-
break;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
const bodyLines = lines.slice(bodyStartIndex);
|
|
221
|
-
const head = bodyLines.slice(0, headLines);
|
|
222
|
-
const tail = bodyLines.slice(-tailLines);
|
|
223
|
-
const omittedLines = bodyLines.length - headLines - tailLines;
|
|
224
|
-
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
225
|
-
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
226
|
-
const parts = [];
|
|
227
|
-
parts.push(`${statusEmoji} FILE: ${fileInfo.filepath}`);
|
|
228
|
-
parts.push(`CHANGES: +${fileInfo.linesAdded} lines, -${fileInfo.linesRemoved} lines (${fileInfo.totalLines} total)`);
|
|
229
|
-
parts.push('');
|
|
230
|
-
parts.push(...headerLines);
|
|
231
|
-
parts.push(...head);
|
|
232
|
-
parts.push('');
|
|
233
|
-
parts.push(`[... ${omittedLines} lines omitted - use Read tool to see full file ...]`);
|
|
234
|
-
parts.push('');
|
|
235
|
-
parts.push(...tail);
|
|
236
|
-
return parts.join('\n');
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Get file status prefix with emoji
|
|
240
|
-
*/
|
|
241
|
-
getFileStatusPrefix(fileInfo) {
|
|
242
|
-
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
243
|
-
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
244
|
-
return `${statusEmoji} `;
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Extract filepath from diff content
|
|
248
|
-
*/
|
|
249
|
-
extractFilepathFromDiff(diffContent) {
|
|
250
|
-
const lines = diffContent.split('\n');
|
|
251
|
-
for (const line of lines) {
|
|
252
|
-
if (line.startsWith('+++ b/')) {
|
|
253
|
-
return line.substring(6);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
return 'unknown';
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Format file info as metadata only
|
|
260
|
-
*/
|
|
261
|
-
formatMetadataOnly(fileInfo) {
|
|
262
|
-
const statusEmoji = fileInfo.status === 'added' ? '➕' :
|
|
263
|
-
fileInfo.status === 'deleted' ? '➖' : '📝';
|
|
264
|
-
return `${statusEmoji} ${fileInfo.filepath} (+${fileInfo.linesAdded}, -${fileInfo.linesRemoved})`;
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Generate human-readable summary of processed diff
|
|
268
|
-
*/
|
|
269
|
-
generateSummary(result) {
|
|
270
|
-
const parts = [];
|
|
271
|
-
parts.push(`Files changed: ${result.totalFiles} total`);
|
|
272
|
-
parts.push(`- ${result.fullDiffs.length} included in full`);
|
|
273
|
-
parts.push(`- ${result.summarizedDiffs.length} summarized (head/tail shown)`);
|
|
274
|
-
parts.push(`- ${result.metadataOnly.length} metadata only`);
|
|
275
|
-
parts.push(`Estimated tokens: ~${result.totalTokens.toLocaleString()}`);
|
|
276
|
-
if (result.metadataOnly.length > 0) {
|
|
277
|
-
parts.push('');
|
|
278
|
-
parts.push('NOTE: Some files excluded to stay within token budget.');
|
|
279
|
-
parts.push('Use Read tool with specific file paths to see full content.');
|
|
280
|
-
}
|
|
281
|
-
return parts.join('\n');
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlmZi1wcm9jZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L2RpZmYtcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQTZCSCxNQUFNLE9BQU8sYUFBYTtJQUd4QixZQUFZLFVBQWlDLEVBQUU7UUFDN0MsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxJQUFJLE1BQU07WUFDOUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRTtZQUM1QyxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWUsSUFBSSxHQUFHO1lBQy9DLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZSxJQUFJLEVBQUU7WUFDOUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLElBQUksRUFBRTtTQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLGVBQXlCO1FBQzNDLHlDQUF5QztRQUN6QyxNQUFNLFNBQVMsR0FBb0IsZUFBZTthQUMvQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQW9CLENBQUM7UUFFcEQsOERBQThEO1FBQzlELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEQsTUFBTSxNQUFNLEdBQW1CO1lBQzdCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsU0FBUyxFQUFFLEVBQUU7WUFDYixlQUFlLEVBQUUsRUFBRTtZQUNuQixZQUFZLEVBQUUsRUFBRTtZQUNoQixVQUFVLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDOUIsV0FBVyxFQUFFLENBQUM7U0FDZixDQUFDO1FBRUYsSUFBSSxVQUFVLEdBQUcsQ0FBQyxD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
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type { ContextMode, IContextResult, TaskType, IFileMetadata } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Enhanced ProjectContext that supports context optimization strategies
|
|
4
|
-
*/
|
|
5
|
-
export declare class EnhancedContext {
|
|
6
|
-
private projectDir;
|
|
7
|
-
private trimmer;
|
|
8
|
-
private configManager;
|
|
9
|
-
private lazyLoader;
|
|
10
|
-
private cache;
|
|
11
|
-
private analyzer;
|
|
12
|
-
private contextMode;
|
|
13
|
-
private tokenBudget;
|
|
14
|
-
private contextResult;
|
|
15
|
-
/**
|
|
16
|
-
* Create a new EnhancedContext
|
|
17
|
-
* @param projectDirArg The project directory
|
|
18
|
-
*/
|
|
19
|
-
constructor(projectDirArg: string);
|
|
20
|
-
/**
|
|
21
|
-
* Initialize the context builder
|
|
22
|
-
*/
|
|
23
|
-
initialize(): Promise<void>;
|
|
24
|
-
/**
|
|
25
|
-
* Set the context mode
|
|
26
|
-
* @param mode The context mode to use
|
|
27
|
-
*/
|
|
28
|
-
setContextMode(mode: ContextMode): void;
|
|
29
|
-
/**
|
|
30
|
-
* Set the token budget
|
|
31
|
-
* @param maxTokens The maximum tokens to use
|
|
32
|
-
*/
|
|
33
|
-
setTokenBudget(maxTokens: number): void;
|
|
34
|
-
/**
|
|
35
|
-
* Convert files to context with smart analysis and prioritization
|
|
36
|
-
* @param metadata - File metadata to analyze
|
|
37
|
-
* @param taskType - Task type for context-aware prioritization
|
|
38
|
-
* @param mode - Context mode to use
|
|
39
|
-
* @returns Context string
|
|
40
|
-
*/
|
|
41
|
-
convertFilesToContextWithAnalysis(metadata: IFileMetadata[], taskType: TaskType, mode?: ContextMode): Promise<string>;
|
|
42
|
-
/**
|
|
43
|
-
* Build context for the project using smart analysis
|
|
44
|
-
* @param taskType Task type for context-aware prioritization (defaults to 'description')
|
|
45
|
-
*/
|
|
46
|
-
buildContext(taskType?: TaskType): Promise<IContextResult>;
|
|
47
|
-
/**
|
|
48
|
-
* Update the context with git diff information for commit tasks
|
|
49
|
-
* @param gitDiff The git diff to include
|
|
50
|
-
*/
|
|
51
|
-
updateWithGitDiff(gitDiff: string): IContextResult;
|
|
52
|
-
/**
|
|
53
|
-
* Count tokens in a string
|
|
54
|
-
* @param text The text to count tokens for
|
|
55
|
-
* @param model The model to use for token counting
|
|
56
|
-
*/
|
|
57
|
-
countTokens(text: string, model?: string): number;
|
|
58
|
-
/**
|
|
59
|
-
* Get the context result
|
|
60
|
-
*/
|
|
61
|
-
getContextResult(): IContextResult;
|
|
62
|
-
/**
|
|
63
|
-
* Get the token count for the current context
|
|
64
|
-
*/
|
|
65
|
-
getTokenCount(): number;
|
|
66
|
-
/**
|
|
67
|
-
* Get both the context string and its token count
|
|
68
|
-
*/
|
|
69
|
-
getContextWithTokenCount(): {
|
|
70
|
-
context: string;
|
|
71
|
-
tokenCount: number;
|
|
72
|
-
};
|
|
73
|
-
}
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../plugins.js';
|
|
2
|
-
import { ContextTrimmer } from './context-trimmer.js';
|
|
3
|
-
import { ConfigManager } from './config-manager.js';
|
|
4
|
-
import { LazyFileLoader } from './lazy-file-loader.js';
|
|
5
|
-
import { ContextCache } from './context-cache.js';
|
|
6
|
-
import { ContextAnalyzer } from './context-analyzer.js';
|
|
7
|
-
/**
|
|
8
|
-
* Enhanced ProjectContext that supports context optimization strategies
|
|
9
|
-
*/
|
|
10
|
-
export class EnhancedContext {
|
|
11
|
-
/**
|
|
12
|
-
* Create a new EnhancedContext
|
|
13
|
-
* @param projectDirArg The project directory
|
|
14
|
-
*/
|
|
15
|
-
constructor(projectDirArg) {
|
|
16
|
-
this.contextMode = 'trimmed';
|
|
17
|
-
this.tokenBudget = 190000; // Default for o4-mini
|
|
18
|
-
this.contextResult = {
|
|
19
|
-
context: '',
|
|
20
|
-
tokenCount: 0,
|
|
21
|
-
includedFiles: [],
|
|
22
|
-
trimmedFiles: [],
|
|
23
|
-
excludedFiles: [],
|
|
24
|
-
tokenSavings: 0
|
|
25
|
-
};
|
|
26
|
-
this.projectDir = projectDirArg;
|
|
27
|
-
this.configManager = ConfigManager.getInstance();
|
|
28
|
-
this.trimmer = new ContextTrimmer(this.configManager.getTrimConfig());
|
|
29
|
-
this.lazyLoader = new LazyFileLoader(projectDirArg);
|
|
30
|
-
this.cache = new ContextCache(projectDirArg, this.configManager.getCacheConfig());
|
|
31
|
-
this.analyzer = new ContextAnalyzer(projectDirArg, this.configManager.getPrioritizationWeights(), this.configManager.getTierConfig());
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Initialize the context builder
|
|
35
|
-
*/
|
|
36
|
-
async initialize() {
|
|
37
|
-
await this.configManager.initialize(this.projectDir);
|
|
38
|
-
this.tokenBudget = this.configManager.getMaxTokens();
|
|
39
|
-
this.trimmer.updateConfig(this.configManager.getTrimConfig());
|
|
40
|
-
await this.cache.init();
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Set the context mode
|
|
44
|
-
* @param mode The context mode to use
|
|
45
|
-
*/
|
|
46
|
-
setContextMode(mode) {
|
|
47
|
-
this.contextMode = mode;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Set the token budget
|
|
51
|
-
* @param maxTokens The maximum tokens to use
|
|
52
|
-
*/
|
|
53
|
-
setTokenBudget(maxTokens) {
|
|
54
|
-
this.tokenBudget = maxTokens;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Convert files to context with smart analysis and prioritization
|
|
58
|
-
* @param metadata - File metadata to analyze
|
|
59
|
-
* @param taskType - Task type for context-aware prioritization
|
|
60
|
-
* @param mode - Context mode to use
|
|
61
|
-
* @returns Context string
|
|
62
|
-
*/
|
|
63
|
-
async convertFilesToContextWithAnalysis(metadata, taskType, mode = this.contextMode) {
|
|
64
|
-
// Reset context result
|
|
65
|
-
this.contextResult = {
|
|
66
|
-
context: '',
|
|
67
|
-
tokenCount: 0,
|
|
68
|
-
includedFiles: [],
|
|
69
|
-
trimmedFiles: [],
|
|
70
|
-
excludedFiles: [],
|
|
71
|
-
tokenSavings: 0
|
|
72
|
-
};
|
|
73
|
-
// Analyze files for smart prioritization
|
|
74
|
-
const analysis = await this.analyzer.analyze(metadata, taskType, []);
|
|
75
|
-
// Sort files by importance score (highest first)
|
|
76
|
-
const sortedAnalysis = [...analysis.files].sort((a, b) => b.importanceScore - a.importanceScore);
|
|
77
|
-
// Filter out excluded tier
|
|
78
|
-
const relevantFiles = sortedAnalysis.filter(f => f.tier !== 'excluded');
|
|
79
|
-
let totalTokenCount = 0;
|
|
80
|
-
let totalOriginalTokens = 0;
|
|
81
|
-
const processedFiles = [];
|
|
82
|
-
// Load files with cache support
|
|
83
|
-
for (const fileAnalysis of relevantFiles) {
|
|
84
|
-
try {
|
|
85
|
-
// Check cache first
|
|
86
|
-
let contents;
|
|
87
|
-
let originalTokenCount;
|
|
88
|
-
const cached = await this.cache.get(fileAnalysis.path);
|
|
89
|
-
if (cached) {
|
|
90
|
-
contents = cached.contents;
|
|
91
|
-
originalTokenCount = cached.tokenCount;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
// Load file
|
|
95
|
-
const fileData = await plugins.fsInstance.file(fileAnalysis.path).encoding('utf8').read();
|
|
96
|
-
contents = fileData;
|
|
97
|
-
originalTokenCount = this.countTokens(contents);
|
|
98
|
-
// Cache it
|
|
99
|
-
await this.cache.set({
|
|
100
|
-
path: fileAnalysis.path,
|
|
101
|
-
contents,
|
|
102
|
-
tokenCount: originalTokenCount,
|
|
103
|
-
mtime: Date.now(),
|
|
104
|
-
cachedAt: Date.now()
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
totalOriginalTokens += originalTokenCount;
|
|
108
|
-
// Apply tier-based trimming
|
|
109
|
-
let processedContent = contents;
|
|
110
|
-
let trimLevel = 'light';
|
|
111
|
-
if (fileAnalysis.tier === 'essential') {
|
|
112
|
-
trimLevel = 'none';
|
|
113
|
-
}
|
|
114
|
-
else if (fileAnalysis.tier === 'important') {
|
|
115
|
-
trimLevel = 'light';
|
|
116
|
-
}
|
|
117
|
-
else if (fileAnalysis.tier === 'optional') {
|
|
118
|
-
trimLevel = 'aggressive';
|
|
119
|
-
}
|
|
120
|
-
// Apply trimming based on mode and tier
|
|
121
|
-
if (mode !== 'full' && trimLevel !== 'none') {
|
|
122
|
-
const relativePath = plugins.path.relative(this.projectDir, fileAnalysis.path);
|
|
123
|
-
processedContent = this.trimmer.trimFileWithLevel(relativePath, contents, trimLevel);
|
|
124
|
-
}
|
|
125
|
-
// Calculate token count
|
|
126
|
-
const processedTokenCount = this.countTokens(processedContent);
|
|
127
|
-
// Check token budget
|
|
128
|
-
if (totalTokenCount + processedTokenCount > this.tokenBudget) {
|
|
129
|
-
// We don't have budget for this file
|
|
130
|
-
const relativePath = plugins.path.relative(this.projectDir, fileAnalysis.path);
|
|
131
|
-
this.contextResult.excludedFiles.push({
|
|
132
|
-
path: fileAnalysis.path,
|
|
133
|
-
contents,
|
|
134
|
-
relativePath,
|
|
135
|
-
tokenCount: originalTokenCount,
|
|
136
|
-
importanceScore: fileAnalysis.importanceScore
|
|
137
|
-
});
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
// Format the file for context
|
|
141
|
-
const relativePath = plugins.path.relative(this.projectDir, fileAnalysis.path);
|
|
142
|
-
const formattedContent = `
|
|
143
|
-
====== START OF FILE ${relativePath} ======
|
|
144
|
-
|
|
145
|
-
${processedContent}
|
|
146
|
-
|
|
147
|
-
====== END OF FILE ${relativePath} ======
|
|
148
|
-
`;
|
|
149
|
-
processedFiles.push(formattedContent);
|
|
150
|
-
totalTokenCount += processedTokenCount;
|
|
151
|
-
// Track file in appropriate list
|
|
152
|
-
const fileInfo = {
|
|
153
|
-
path: fileAnalysis.path,
|
|
154
|
-
contents: processedContent,
|
|
155
|
-
relativePath,
|
|
156
|
-
tokenCount: processedTokenCount,
|
|
157
|
-
importanceScore: fileAnalysis.importanceScore
|
|
158
|
-
};
|
|
159
|
-
if (trimLevel === 'none' || processedContent === contents) {
|
|
160
|
-
this.contextResult.includedFiles.push(fileInfo);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
this.contextResult.trimmedFiles.push(fileInfo);
|
|
164
|
-
this.contextResult.tokenSavings += (originalTokenCount - processedTokenCount);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
catch (error) {
|
|
168
|
-
console.warn(`Failed to process file ${fileAnalysis.path}:`, error.message);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
// Join all processed files
|
|
172
|
-
const context = processedFiles.join('\n');
|
|
173
|
-
// Update context result
|
|
174
|
-
this.contextResult.context = context;
|
|
175
|
-
this.contextResult.tokenCount = totalTokenCount;
|
|
176
|
-
return context;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Build context for the project using smart analysis
|
|
180
|
-
* @param taskType Task type for context-aware prioritization (defaults to 'description')
|
|
181
|
-
*/
|
|
182
|
-
async buildContext(taskType) {
|
|
183
|
-
// Initialize if needed
|
|
184
|
-
if (this.tokenBudget === 0) {
|
|
185
|
-
await this.initialize();
|
|
186
|
-
}
|
|
187
|
-
// Smart context building always requires a task type for optimal prioritization
|
|
188
|
-
// Default to 'description' if not provided
|
|
189
|
-
const effectiveTaskType = taskType || 'description';
|
|
190
|
-
// Get task-specific configuration
|
|
191
|
-
const taskConfig = this.configManager.getTaskConfig(effectiveTaskType);
|
|
192
|
-
if (taskConfig.mode) {
|
|
193
|
-
this.setContextMode(taskConfig.mode);
|
|
194
|
-
}
|
|
195
|
-
// Build globs for scanning
|
|
196
|
-
const includeGlobs = taskConfig?.includePaths?.map(p => `${p}/**/*.ts`) || [
|
|
197
|
-
'ts/**/*.ts',
|
|
198
|
-
'ts*/**/*.ts'
|
|
199
|
-
];
|
|
200
|
-
// Add config files
|
|
201
|
-
const configGlobs = [
|
|
202
|
-
'package.json',
|
|
203
|
-
'readme.md',
|
|
204
|
-
'readme.hints.md',
|
|
205
|
-
'npmextra.json'
|
|
206
|
-
];
|
|
207
|
-
// Scan files for metadata (fast, doesn't load contents)
|
|
208
|
-
const metadata = await this.lazyLoader.scanFiles([...configGlobs, ...includeGlobs]);
|
|
209
|
-
// Use smart analyzer to build context with intelligent prioritization
|
|
210
|
-
await this.convertFilesToContextWithAnalysis(metadata, effectiveTaskType, this.contextMode);
|
|
211
|
-
return this.contextResult;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Update the context with git diff information for commit tasks
|
|
215
|
-
* @param gitDiff The git diff to include
|
|
216
|
-
*/
|
|
217
|
-
updateWithGitDiff(gitDiff) {
|
|
218
|
-
// If we don't have a context yet, return empty result
|
|
219
|
-
if (!this.contextResult.context) {
|
|
220
|
-
return this.contextResult;
|
|
221
|
-
}
|
|
222
|
-
// Add git diff to context
|
|
223
|
-
const diffSection = `
|
|
224
|
-
====== GIT DIFF ======
|
|
225
|
-
|
|
226
|
-
${gitDiff}
|
|
227
|
-
|
|
228
|
-
====== END GIT DIFF ======
|
|
229
|
-
`;
|
|
230
|
-
const diffTokenCount = this.countTokens(diffSection);
|
|
231
|
-
// Update context and token count
|
|
232
|
-
this.contextResult.context += diffSection;
|
|
233
|
-
this.contextResult.tokenCount += diffTokenCount;
|
|
234
|
-
return this.contextResult;
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Count tokens in a string
|
|
238
|
-
* @param text The text to count tokens for
|
|
239
|
-
* @param model The model to use for token counting
|
|
240
|
-
*/
|
|
241
|
-
countTokens(text, model = 'gpt-3.5-turbo') {
|
|
242
|
-
try {
|
|
243
|
-
// Use the gpt-tokenizer library to count tokens
|
|
244
|
-
const tokens = plugins.gptTokenizer.encode(text);
|
|
245
|
-
return tokens.length;
|
|
246
|
-
}
|
|
247
|
-
catch (error) {
|
|
248
|
-
console.error('Error counting tokens:', error);
|
|
249
|
-
// Provide a rough estimate if tokenization fails
|
|
250
|
-
return Math.ceil(text.length / 4);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Get the context result
|
|
255
|
-
*/
|
|
256
|
-
getContextResult() {
|
|
257
|
-
return this.contextResult;
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Get the token count for the current context
|
|
261
|
-
*/
|
|
262
|
-
getTokenCount() {
|
|
263
|
-
return this.contextResult.tokenCount;
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Get both the context string and its token count
|
|
267
|
-
*/
|
|
268
|
-
getContextWithTokenCount() {
|
|
269
|
-
return {
|
|
270
|
-
context: this.contextResult.context,
|
|
271
|
-
tokenCount: this.contextResult.tokenCount
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5oYW5jZWQtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvbnRleHQvZW5oYW5jZWQtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXhEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFrQjFCOzs7T0FHRztJQUNILFlBQVksYUFBcUI7UUFmekIsZ0JBQVcsR0FBZ0IsU0FBUyxDQUFDO1FBQ3JDLGdCQUFXLEdBQVcsTUFBTSxDQUFDLENBQUMsc0JBQXNCO1FBQ3BELGtCQUFhLEdBQW1CO1lBQ3RDLE9BQU8sRUFBRSxFQUFFO1lBQ1gsVUFBVSxFQUFFLENBQUM7WUFDYixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsRUFBRTtZQUNoQixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsQ0FBQztTQUNoQixDQUFDO1FBT0EsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxJQUFJLENB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
|