@git.zone/tsdoc 1.5.1 → 1.6.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_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/aidocs_classes/commit.js +2 -2
- package/dist_ts/context/config-manager.d.ts +22 -1
- package/dist_ts/context/config-manager.js +114 -4
- package/dist_ts/context/context-analyzer.d.ts +73 -0
- package/dist_ts/context/context-analyzer.js +311 -0
- package/dist_ts/context/context-cache.d.ts +73 -0
- package/dist_ts/context/context-cache.js +238 -0
- package/dist_ts/context/context-trimmer.d.ts +8 -0
- package/dist_ts/context/context-trimmer.js +60 -1
- package/dist_ts/context/enhanced-context.d.ts +12 -1
- package/dist_ts/context/enhanced-context.js +201 -33
- package/dist_ts/context/index.d.ts +6 -3
- package/dist_ts/context/index.js +5 -2
- package/dist_ts/context/lazy-file-loader.d.ts +60 -0
- package/dist_ts/context/lazy-file-loader.js +164 -0
- package/dist_ts/context/types.d.ts +143 -0
- package/package.json +12 -13
- package/readme.md +441 -587
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/aidocs_classes/commit.ts +2 -2
- package/ts/context/config-manager.ts +147 -15
- package/ts/context/context-analyzer.ts +391 -0
- package/ts/context/context-cache.ts +285 -0
- package/ts/context/context-trimmer.ts +64 -0
- package/ts/context/enhanced-context.ts +246 -40
- package/ts/context/index.ts +31 -5
- package/ts/context/lazy-file-loader.ts +191 -0
- package/ts/context/types.ts +153 -0
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { ContextTrimmer } from './context-trimmer.js';
|
|
3
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';
|
|
4
7
|
/**
|
|
5
8
|
* Enhanced ProjectContext that supports context optimization strategies
|
|
6
9
|
*/
|
|
@@ -23,6 +26,9 @@ export class EnhancedContext {
|
|
|
23
26
|
this.projectDir = projectDirArg;
|
|
24
27
|
this.configManager = ConfigManager.getInstance();
|
|
25
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());
|
|
26
32
|
}
|
|
27
33
|
/**
|
|
28
34
|
* Initialize the context builder
|
|
@@ -31,6 +37,7 @@ export class EnhancedContext {
|
|
|
31
37
|
await this.configManager.initialize(this.projectDir);
|
|
32
38
|
this.tokenBudget = this.configManager.getMaxTokens();
|
|
33
39
|
this.trimmer.updateConfig(this.configManager.getTrimConfig());
|
|
40
|
+
await this.cache.init();
|
|
34
41
|
}
|
|
35
42
|
/**
|
|
36
43
|
* Set the context mode
|
|
@@ -97,9 +104,23 @@ export class EnhancedContext {
|
|
|
97
104
|
};
|
|
98
105
|
let totalTokenCount = 0;
|
|
99
106
|
let totalOriginalTokens = 0;
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
107
|
+
// Convert SmartFile objects to IFileMetadata for analysis
|
|
108
|
+
const metadata = files.map(sf => ({
|
|
109
|
+
path: sf.path,
|
|
110
|
+
relativePath: sf.relative,
|
|
111
|
+
size: sf.contents.toString().length,
|
|
112
|
+
mtime: Date.now(), // SmartFile doesn't expose mtime, use current time
|
|
113
|
+
estimatedTokens: this.countTokens(sf.contents.toString()),
|
|
114
|
+
importanceScore: 0
|
|
115
|
+
}));
|
|
116
|
+
// Analyze files using ContextAnalyzer to get smart prioritization
|
|
117
|
+
// (Note: This requires task type which we'll pass from buildContext)
|
|
118
|
+
// For now, sort files by estimated tokens (smaller files first for better efficiency)
|
|
119
|
+
const sortedFiles = [...files].sort((a, b) => {
|
|
120
|
+
const aTokens = this.countTokens(a.contents.toString());
|
|
121
|
+
const bTokens = this.countTokens(b.contents.toString());
|
|
122
|
+
return aTokens - bTokens;
|
|
123
|
+
});
|
|
103
124
|
const processedFiles = [];
|
|
104
125
|
for (const smartfile of sortedFiles) {
|
|
105
126
|
// Calculate original token count
|
|
@@ -156,6 +177,128 @@ ${processedContent}
|
|
|
156
177
|
this.contextResult.tokenCount = totalTokenCount;
|
|
157
178
|
return context;
|
|
158
179
|
}
|
|
180
|
+
/**
|
|
181
|
+
* Convert files to context with smart analysis and prioritization
|
|
182
|
+
* @param metadata - File metadata to analyze
|
|
183
|
+
* @param taskType - Task type for context-aware prioritization
|
|
184
|
+
* @param mode - Context mode to use
|
|
185
|
+
* @returns Context string
|
|
186
|
+
*/
|
|
187
|
+
async convertFilesToContextWithAnalysis(metadata, taskType, mode = this.contextMode) {
|
|
188
|
+
// Reset context result
|
|
189
|
+
this.contextResult = {
|
|
190
|
+
context: '',
|
|
191
|
+
tokenCount: 0,
|
|
192
|
+
includedFiles: [],
|
|
193
|
+
trimmedFiles: [],
|
|
194
|
+
excludedFiles: [],
|
|
195
|
+
tokenSavings: 0
|
|
196
|
+
};
|
|
197
|
+
// Analyze files for smart prioritization
|
|
198
|
+
const analysis = await this.analyzer.analyze(metadata, taskType, []);
|
|
199
|
+
// Sort files by importance score (highest first)
|
|
200
|
+
const sortedAnalysis = [...analysis.files].sort((a, b) => b.importanceScore - a.importanceScore);
|
|
201
|
+
// Filter out excluded tier
|
|
202
|
+
const relevantFiles = sortedAnalysis.filter(f => f.tier !== 'excluded');
|
|
203
|
+
let totalTokenCount = 0;
|
|
204
|
+
let totalOriginalTokens = 0;
|
|
205
|
+
const processedFiles = [];
|
|
206
|
+
// Load files with cache support
|
|
207
|
+
for (const fileAnalysis of relevantFiles) {
|
|
208
|
+
try {
|
|
209
|
+
// Check cache first
|
|
210
|
+
let contents;
|
|
211
|
+
let originalTokenCount;
|
|
212
|
+
const cached = await this.cache.get(fileAnalysis.path);
|
|
213
|
+
if (cached) {
|
|
214
|
+
contents = cached.contents;
|
|
215
|
+
originalTokenCount = cached.tokenCount;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Load file
|
|
219
|
+
const fileData = await plugins.smartfile.fs.toStringSync(fileAnalysis.path);
|
|
220
|
+
contents = fileData;
|
|
221
|
+
originalTokenCount = this.countTokens(contents);
|
|
222
|
+
// Cache it
|
|
223
|
+
await this.cache.set({
|
|
224
|
+
path: fileAnalysis.path,
|
|
225
|
+
contents,
|
|
226
|
+
tokenCount: originalTokenCount,
|
|
227
|
+
mtime: Date.now(),
|
|
228
|
+
cachedAt: Date.now()
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
totalOriginalTokens += originalTokenCount;
|
|
232
|
+
// Apply tier-based trimming
|
|
233
|
+
let processedContent = contents;
|
|
234
|
+
let trimLevel = 'light';
|
|
235
|
+
if (fileAnalysis.tier === 'essential') {
|
|
236
|
+
trimLevel = 'none';
|
|
237
|
+
}
|
|
238
|
+
else if (fileAnalysis.tier === 'important') {
|
|
239
|
+
trimLevel = 'light';
|
|
240
|
+
}
|
|
241
|
+
else if (fileAnalysis.tier === 'optional') {
|
|
242
|
+
trimLevel = 'aggressive';
|
|
243
|
+
}
|
|
244
|
+
// Apply trimming based on mode and tier
|
|
245
|
+
if (mode !== 'full' && trimLevel !== 'none') {
|
|
246
|
+
const relativePath = plugins.path.relative(this.projectDir, fileAnalysis.path);
|
|
247
|
+
processedContent = this.trimmer.trimFileWithLevel(relativePath, contents, trimLevel);
|
|
248
|
+
}
|
|
249
|
+
// Calculate token count
|
|
250
|
+
const processedTokenCount = this.countTokens(processedContent);
|
|
251
|
+
// Check token budget
|
|
252
|
+
if (totalTokenCount + processedTokenCount > this.tokenBudget) {
|
|
253
|
+
// We don't have budget for this file
|
|
254
|
+
const relativePath = plugins.path.relative(this.projectDir, fileAnalysis.path);
|
|
255
|
+
this.contextResult.excludedFiles.push({
|
|
256
|
+
path: fileAnalysis.path,
|
|
257
|
+
contents,
|
|
258
|
+
relativePath,
|
|
259
|
+
tokenCount: originalTokenCount,
|
|
260
|
+
importanceScore: fileAnalysis.importanceScore
|
|
261
|
+
});
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
// Format the file for context
|
|
265
|
+
const relativePath = plugins.path.relative(this.projectDir, fileAnalysis.path);
|
|
266
|
+
const formattedContent = `
|
|
267
|
+
====== START OF FILE ${relativePath} ======
|
|
268
|
+
|
|
269
|
+
${processedContent}
|
|
270
|
+
|
|
271
|
+
====== END OF FILE ${relativePath} ======
|
|
272
|
+
`;
|
|
273
|
+
processedFiles.push(formattedContent);
|
|
274
|
+
totalTokenCount += processedTokenCount;
|
|
275
|
+
// Track file in appropriate list
|
|
276
|
+
const fileInfo = {
|
|
277
|
+
path: fileAnalysis.path,
|
|
278
|
+
contents: processedContent,
|
|
279
|
+
relativePath,
|
|
280
|
+
tokenCount: processedTokenCount,
|
|
281
|
+
importanceScore: fileAnalysis.importanceScore
|
|
282
|
+
};
|
|
283
|
+
if (trimLevel === 'none' || processedContent === contents) {
|
|
284
|
+
this.contextResult.includedFiles.push(fileInfo);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
this.contextResult.trimmedFiles.push(fileInfo);
|
|
288
|
+
this.contextResult.tokenSavings += (originalTokenCount - processedTokenCount);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
console.warn(`Failed to process file ${fileAnalysis.path}:`, error.message);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Join all processed files
|
|
296
|
+
const context = processedFiles.join('\n');
|
|
297
|
+
// Update context result
|
|
298
|
+
this.contextResult.context = context;
|
|
299
|
+
this.contextResult.tokenCount = totalTokenCount;
|
|
300
|
+
return context;
|
|
301
|
+
}
|
|
159
302
|
/**
|
|
160
303
|
* Build context for the project
|
|
161
304
|
* @param taskType Optional task type for task-specific context
|
|
@@ -172,39 +315,64 @@ ${processedContent}
|
|
|
172
315
|
this.setContextMode(taskConfig.mode);
|
|
173
316
|
}
|
|
174
317
|
}
|
|
175
|
-
//
|
|
176
|
-
const
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
318
|
+
// Check if analyzer is enabled in config
|
|
319
|
+
const analyzerConfig = this.configManager.getAnalyzerConfig();
|
|
320
|
+
const useAnalyzer = analyzerConfig.enabled && taskType;
|
|
321
|
+
if (useAnalyzer) {
|
|
322
|
+
// Use new smart context building with lazy loading and analysis
|
|
323
|
+
const taskConfig = this.configManager.getTaskConfig(taskType);
|
|
324
|
+
// Build globs for scanning
|
|
325
|
+
const includeGlobs = taskConfig?.includePaths?.map(p => `${p}/**/*.ts`) || [
|
|
326
|
+
'ts/**/*.ts',
|
|
327
|
+
'ts*/**/*.ts'
|
|
328
|
+
];
|
|
329
|
+
// Add config files
|
|
330
|
+
const configGlobs = [
|
|
331
|
+
'package.json',
|
|
332
|
+
'readme.md',
|
|
333
|
+
'readme.hints.md',
|
|
334
|
+
'npmextra.json'
|
|
335
|
+
];
|
|
336
|
+
// Scan files for metadata (fast, doesn't load contents)
|
|
337
|
+
const metadata = await this.lazyLoader.scanFiles([...configGlobs, ...includeGlobs]);
|
|
338
|
+
// Use analyzer to build context with smart prioritization
|
|
339
|
+
await this.convertFilesToContextWithAnalysis(metadata, taskType, this.contextMode);
|
|
198
340
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
341
|
+
else {
|
|
342
|
+
// Fall back to old method for backward compatibility
|
|
343
|
+
const taskConfig = taskType ? this.configManager.getTaskConfig(taskType) : undefined;
|
|
344
|
+
const files = await this.gatherFiles(taskConfig?.includePaths, taskConfig?.excludePaths);
|
|
345
|
+
// Convert files to context
|
|
346
|
+
// Create an array of all files to process
|
|
347
|
+
const allFiles = [];
|
|
348
|
+
// Add individual files
|
|
349
|
+
if (files.smartfilePackageJSON)
|
|
350
|
+
allFiles.push(files.smartfilePackageJSON);
|
|
351
|
+
if (files.smartfilesReadme)
|
|
352
|
+
allFiles.push(files.smartfilesReadme);
|
|
353
|
+
if (files.smartfilesReadmeHints)
|
|
354
|
+
allFiles.push(files.smartfilesReadmeHints);
|
|
355
|
+
if (files.smartfilesNpmextraJSON)
|
|
356
|
+
allFiles.push(files.smartfilesNpmextraJSON);
|
|
357
|
+
// Add arrays of files
|
|
358
|
+
if (files.smartfilesMod) {
|
|
359
|
+
if (Array.isArray(files.smartfilesMod)) {
|
|
360
|
+
allFiles.push(...files.smartfilesMod);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
allFiles.push(files.smartfilesMod);
|
|
364
|
+
}
|
|
202
365
|
}
|
|
203
|
-
|
|
204
|
-
|
|
366
|
+
if (files.smartfilesTest) {
|
|
367
|
+
if (Array.isArray(files.smartfilesTest)) {
|
|
368
|
+
allFiles.push(...files.smartfilesTest);
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
allFiles.push(files.smartfilesTest);
|
|
372
|
+
}
|
|
205
373
|
}
|
|
374
|
+
await this.convertFilesToContext(allFiles);
|
|
206
375
|
}
|
|
207
|
-
const context = await this.convertFilesToContext(allFiles);
|
|
208
376
|
return this.contextResult;
|
|
209
377
|
}
|
|
210
378
|
/**
|
|
@@ -269,4 +437,4 @@ ${gitDiff}
|
|
|
269
437
|
};
|
|
270
438
|
}
|
|
271
439
|
}
|
|
272
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5oYW5jZWQtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvbnRleHQvZW5oYW5jZWQtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXBEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFlMUI7OztPQUdHO0lBQ0gsWUFBWSxhQUFxQjtRQWZ6QixnQkFBVyxHQUFnQixTQUFTLENBQUM7UUFDckMsZ0JBQVcsR0FBVyxNQUFNLENBQUMsQ0FBQyxzQkFBc0I7UUFDcEQsa0JBQWEsR0FBbUI7WUFDdEMsT0FBTyxFQUFFLEVBQUU7WUFDWCxVQUFVLEVBQUUsQ0FBQztZQUNiLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFlBQVksRUFBRSxDQUFDO1NBQ2hCLENBQUM7UUFPQSxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZ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
|
|
440
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5oYW5jZWQtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvbnRleHQvZW5oYW5jZWQtY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXhEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFrQjFCOzs7T0FHRztJQUNILFlBQVksYUFBcUI7UUFmekIsZ0JBQVcsR0FBZ0IsU0FBUyxDQUFDO1FBQ3JDLGdCQUFXLEdBQVcsTUFBTSxDQUFDLENBQUMsc0JBQXNCO1FBQ3BELGtCQUFhLEdBQW1CO1lBQ3RDLE9BQU8sRUFBRSxFQUFFO1lBQ1gsVUFBVSxFQUFFLENBQUM7WUFDYixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsRUFBRTtZQUNoQixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsQ0FBQztTQUNoQixDQUFDO1FBT0EsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxJQUFJLENB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
|
|
@@ -2,6 +2,9 @@ import { EnhancedContext } from './enhanced-context.js';
|
|
|
2
2
|
import { TaskContextFactory } from './task-context-factory.js';
|
|
3
3
|
import { ConfigManager } from './config-manager.js';
|
|
4
4
|
import { ContextTrimmer } from './context-trimmer.js';
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import { LazyFileLoader } from './lazy-file-loader.js';
|
|
6
|
+
import { ContextCache } from './context-cache.js';
|
|
7
|
+
import { ContextAnalyzer } from './context-analyzer.js';
|
|
8
|
+
import type { ContextMode, IContextConfig, IContextResult, IFileInfo, ITrimConfig, ITaskConfig, TaskType, ICacheConfig, IAnalyzerConfig, IPrioritizationWeights, ITierConfig, ITierSettings, IFileMetadata, ICacheEntry, IFileDependencies, IFileAnalysis, IAnalysisResult } from './types.js';
|
|
9
|
+
export { EnhancedContext, TaskContextFactory, ConfigManager, ContextTrimmer, LazyFileLoader, ContextCache, ContextAnalyzer, };
|
|
10
|
+
export type { ContextMode, IContextConfig, IContextResult, IFileInfo, ITrimConfig, ITaskConfig, TaskType, ICacheConfig, IAnalyzerConfig, IPrioritizationWeights, ITierConfig, ITierSettings, IFileMetadata, ICacheEntry, IFileDependencies, IFileAnalysis, IAnalysisResult };
|
package/dist_ts/context/index.js
CHANGED
|
@@ -2,7 +2,10 @@ import { EnhancedContext } from './enhanced-context.js';
|
|
|
2
2
|
import { TaskContextFactory } from './task-context-factory.js';
|
|
3
3
|
import { ConfigManager } from './config-manager.js';
|
|
4
4
|
import { ContextTrimmer } from './context-trimmer.js';
|
|
5
|
+
import { LazyFileLoader } from './lazy-file-loader.js';
|
|
6
|
+
import { ContextCache } from './context-cache.js';
|
|
7
|
+
import { ContextAnalyzer } from './context-analyzer.js';
|
|
5
8
|
export {
|
|
6
9
|
// Classes
|
|
7
|
-
EnhancedContext, TaskContextFactory, ConfigManager, ContextTrimmer, };
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
EnhancedContext, TaskContextFactory, ConfigManager, ContextTrimmer, LazyFileLoader, ContextCache, ContextAnalyzer, };
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBcUJ4RCxPQUFPO0FBQ0wsVUFBVTtBQUNWLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGNBQWMsRUFDZCxjQUFjLEVBQ2QsWUFBWSxFQUNaLGVBQWUsR0FDaEIsQ0FBQyJ9
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { IFileMetadata, IFileInfo } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* LazyFileLoader handles efficient file loading by:
|
|
4
|
+
* - Scanning files for metadata without loading contents
|
|
5
|
+
* - Providing fast file size and token estimates
|
|
6
|
+
* - Loading contents only when requested
|
|
7
|
+
* - Parallel loading of selected files
|
|
8
|
+
*/
|
|
9
|
+
export declare class LazyFileLoader {
|
|
10
|
+
private projectRoot;
|
|
11
|
+
private metadataCache;
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new LazyFileLoader
|
|
14
|
+
* @param projectRoot - Root directory of the project
|
|
15
|
+
*/
|
|
16
|
+
constructor(projectRoot: string);
|
|
17
|
+
/**
|
|
18
|
+
* Scans files in given globs and creates metadata without loading contents
|
|
19
|
+
* @param globs - File patterns to scan (e.g., ['ts/**\/*.ts', 'test/**\/*.ts'])
|
|
20
|
+
* @returns Array of file metadata
|
|
21
|
+
*/
|
|
22
|
+
scanFiles(globs: string[]): Promise<IFileMetadata[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Gets metadata for a single file without loading contents
|
|
25
|
+
* @param filePath - Absolute path to the file
|
|
26
|
+
* @returns File metadata
|
|
27
|
+
*/
|
|
28
|
+
getMetadata(filePath: string): Promise<IFileMetadata>;
|
|
29
|
+
/**
|
|
30
|
+
* Loads file contents for selected files in parallel
|
|
31
|
+
* @param metadata - Array of file metadata to load
|
|
32
|
+
* @param tokenizer - Function to calculate accurate token count
|
|
33
|
+
* @returns Array of complete file info with contents
|
|
34
|
+
*/
|
|
35
|
+
loadFiles(metadata: IFileMetadata[], tokenizer: (content: string) => number): Promise<IFileInfo[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Loads a single file with contents
|
|
38
|
+
* @param filePath - Absolute path to the file
|
|
39
|
+
* @param tokenizer - Function to calculate accurate token count
|
|
40
|
+
* @returns Complete file info with contents
|
|
41
|
+
*/
|
|
42
|
+
loadFile(filePath: string, tokenizer: (content: string) => number): Promise<IFileInfo>;
|
|
43
|
+
/**
|
|
44
|
+
* Updates importance scores for metadata entries
|
|
45
|
+
* @param scores - Map of file paths to importance scores
|
|
46
|
+
*/
|
|
47
|
+
updateImportanceScores(scores: Map<string, number>): void;
|
|
48
|
+
/**
|
|
49
|
+
* Clears the metadata cache
|
|
50
|
+
*/
|
|
51
|
+
clearCache(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Gets total estimated tokens for all cached metadata
|
|
54
|
+
*/
|
|
55
|
+
getTotalEstimatedTokens(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Gets cached metadata entries
|
|
58
|
+
*/
|
|
59
|
+
getCachedMetadata(): IFileMetadata[];
|
|
60
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
/**
|
|
4
|
+
* LazyFileLoader handles efficient file loading by:
|
|
5
|
+
* - Scanning files for metadata without loading contents
|
|
6
|
+
* - Providing fast file size and token estimates
|
|
7
|
+
* - Loading contents only when requested
|
|
8
|
+
* - Parallel loading of selected files
|
|
9
|
+
*/
|
|
10
|
+
export class LazyFileLoader {
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new LazyFileLoader
|
|
13
|
+
* @param projectRoot - Root directory of the project
|
|
14
|
+
*/
|
|
15
|
+
constructor(projectRoot) {
|
|
16
|
+
this.metadataCache = new Map();
|
|
17
|
+
this.projectRoot = projectRoot;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Scans files in given globs and creates metadata without loading contents
|
|
21
|
+
* @param globs - File patterns to scan (e.g., ['ts/**\/*.ts', 'test/**\/*.ts'])
|
|
22
|
+
* @returns Array of file metadata
|
|
23
|
+
*/
|
|
24
|
+
async scanFiles(globs) {
|
|
25
|
+
const metadata = [];
|
|
26
|
+
for (const globPattern of globs) {
|
|
27
|
+
try {
|
|
28
|
+
const smartFiles = await plugins.smartfile.fs.fileTreeToObject(this.projectRoot, globPattern);
|
|
29
|
+
const fileArray = Array.isArray(smartFiles) ? smartFiles : [smartFiles];
|
|
30
|
+
for (const smartFile of fileArray) {
|
|
31
|
+
try {
|
|
32
|
+
const meta = await this.getMetadata(smartFile.path);
|
|
33
|
+
metadata.push(meta);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// Skip files that can't be read
|
|
37
|
+
console.warn(`Failed to get metadata for ${smartFile.path}:`, error.message);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// Skip patterns that don't match any files
|
|
43
|
+
console.warn(`No files found for pattern ${globPattern}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return metadata;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Gets metadata for a single file without loading contents
|
|
50
|
+
* @param filePath - Absolute path to the file
|
|
51
|
+
* @returns File metadata
|
|
52
|
+
*/
|
|
53
|
+
async getMetadata(filePath) {
|
|
54
|
+
// Check cache first
|
|
55
|
+
if (this.metadataCache.has(filePath)) {
|
|
56
|
+
const cached = this.metadataCache.get(filePath);
|
|
57
|
+
const currentStats = await fs.promises.stat(filePath);
|
|
58
|
+
// Return cached if file hasn't changed
|
|
59
|
+
if (cached.mtime === Math.floor(currentStats.mtimeMs)) {
|
|
60
|
+
return cached;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Get file stats
|
|
64
|
+
const stats = await fs.promises.stat(filePath);
|
|
65
|
+
const relativePath = plugins.path.relative(this.projectRoot, filePath);
|
|
66
|
+
// Estimate tokens: rough estimate of ~4 characters per token
|
|
67
|
+
// This is faster than reading and tokenizing the entire file
|
|
68
|
+
const estimatedTokens = Math.ceil(stats.size / 4);
|
|
69
|
+
const metadata = {
|
|
70
|
+
path: filePath,
|
|
71
|
+
relativePath,
|
|
72
|
+
size: stats.size,
|
|
73
|
+
mtime: Math.floor(stats.mtimeMs),
|
|
74
|
+
estimatedTokens,
|
|
75
|
+
};
|
|
76
|
+
// Cache the metadata
|
|
77
|
+
this.metadataCache.set(filePath, metadata);
|
|
78
|
+
return metadata;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Loads file contents for selected files in parallel
|
|
82
|
+
* @param metadata - Array of file metadata to load
|
|
83
|
+
* @param tokenizer - Function to calculate accurate token count
|
|
84
|
+
* @returns Array of complete file info with contents
|
|
85
|
+
*/
|
|
86
|
+
async loadFiles(metadata, tokenizer) {
|
|
87
|
+
// Load files in parallel
|
|
88
|
+
const loadPromises = metadata.map(async (meta) => {
|
|
89
|
+
try {
|
|
90
|
+
const contents = await plugins.smartfile.fs.toStringSync(meta.path);
|
|
91
|
+
const tokenCount = tokenizer(contents);
|
|
92
|
+
const fileInfo = {
|
|
93
|
+
path: meta.path,
|
|
94
|
+
relativePath: meta.relativePath,
|
|
95
|
+
contents,
|
|
96
|
+
tokenCount,
|
|
97
|
+
importanceScore: meta.importanceScore,
|
|
98
|
+
};
|
|
99
|
+
return fileInfo;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.warn(`Failed to load file ${meta.path}:`, error.message);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// Wait for all loads to complete and filter out failures
|
|
107
|
+
const results = await Promise.all(loadPromises);
|
|
108
|
+
return results.filter((r) => r !== null);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Loads a single file with contents
|
|
112
|
+
* @param filePath - Absolute path to the file
|
|
113
|
+
* @param tokenizer - Function to calculate accurate token count
|
|
114
|
+
* @returns Complete file info with contents
|
|
115
|
+
*/
|
|
116
|
+
async loadFile(filePath, tokenizer) {
|
|
117
|
+
const meta = await this.getMetadata(filePath);
|
|
118
|
+
const contents = await plugins.smartfile.fs.toStringSync(filePath);
|
|
119
|
+
const tokenCount = tokenizer(contents);
|
|
120
|
+
const relativePath = plugins.path.relative(this.projectRoot, filePath);
|
|
121
|
+
return {
|
|
122
|
+
path: filePath,
|
|
123
|
+
relativePath,
|
|
124
|
+
contents,
|
|
125
|
+
tokenCount,
|
|
126
|
+
importanceScore: meta.importanceScore,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Updates importance scores for metadata entries
|
|
131
|
+
* @param scores - Map of file paths to importance scores
|
|
132
|
+
*/
|
|
133
|
+
updateImportanceScores(scores) {
|
|
134
|
+
for (const [path, score] of scores) {
|
|
135
|
+
const meta = this.metadataCache.get(path);
|
|
136
|
+
if (meta) {
|
|
137
|
+
meta.importanceScore = score;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Clears the metadata cache
|
|
143
|
+
*/
|
|
144
|
+
clearCache() {
|
|
145
|
+
this.metadataCache.clear();
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Gets total estimated tokens for all cached metadata
|
|
149
|
+
*/
|
|
150
|
+
getTotalEstimatedTokens() {
|
|
151
|
+
let total = 0;
|
|
152
|
+
for (const meta of this.metadataCache.values()) {
|
|
153
|
+
total += meta.estimatedTokens;
|
|
154
|
+
}
|
|
155
|
+
return total;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Gets cached metadata entries
|
|
159
|
+
*/
|
|
160
|
+
getCachedMetadata() {
|
|
161
|
+
return Array.from(this.metadataCache.values());
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eS1maWxlLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NvbnRleHQvbGF6eS1maWxlLWxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUd6Qjs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sY0FBYztJQUl6Qjs7O09BR0c7SUFDSCxZQUFZLFdBQW1CO1FBTnZCLGtCQUFhLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFPNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQWU7UUFDcEMsTUFBTSxRQUFRLEdBQW9CLEVBQUUsQ0FBQztRQUVyQyxLQUFLLE1BQU0sV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzlGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFeEUsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxDQUFDO3dCQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3BELFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RCLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUs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
|