@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.
Files changed (62) hide show
  1. package/dist_ts/aidocs_classes/commit.js +65 -42
  2. package/dist_ts/aidocs_classes/description.js +68 -29
  3. package/dist_ts/aidocs_classes/projectcontext.d.ts +5 -5
  4. package/dist_ts/aidocs_classes/projectcontext.js +8 -16
  5. package/dist_ts/aidocs_classes/readme.js +156 -88
  6. package/dist_ts/classes.aidoc.d.ts +10 -6
  7. package/dist_ts/classes.aidoc.js +17 -11
  8. package/dist_ts/classes.diffprocessor.js +284 -0
  9. package/dist_ts/cli.js +21 -92
  10. package/dist_ts/plugins.d.ts +1 -2
  11. package/dist_ts/plugins.js +2 -3
  12. package/package.json +2 -3
  13. package/ts/aidocs_classes/commit.ts +67 -51
  14. package/ts/aidocs_classes/description.ts +72 -34
  15. package/ts/aidocs_classes/projectcontext.ts +7 -14
  16. package/ts/aidocs_classes/readme.ts +168 -93
  17. package/ts/classes.aidoc.ts +18 -11
  18. package/ts/cli.ts +20 -100
  19. package/ts/plugins.ts +1 -2
  20. package/dist_ts/context/config-manager.d.ts +0 -83
  21. package/dist_ts/context/config-manager.js +0 -318
  22. package/dist_ts/context/context-analyzer.d.ts +0 -73
  23. package/dist_ts/context/context-analyzer.js +0 -311
  24. package/dist_ts/context/context-cache.d.ts +0 -73
  25. package/dist_ts/context/context-cache.js +0 -239
  26. package/dist_ts/context/context-trimmer.d.ts +0 -60
  27. package/dist_ts/context/context-trimmer.js +0 -258
  28. package/dist_ts/context/diff-processor.js +0 -284
  29. package/dist_ts/context/enhanced-context.d.ts +0 -73
  30. package/dist_ts/context/enhanced-context.js +0 -275
  31. package/dist_ts/context/index.d.ts +0 -11
  32. package/dist_ts/context/index.js +0 -12
  33. package/dist_ts/context/iterative-context-builder.d.ts +0 -62
  34. package/dist_ts/context/iterative-context-builder.js +0 -395
  35. package/dist_ts/context/lazy-file-loader.d.ts +0 -60
  36. package/dist_ts/context/lazy-file-loader.js +0 -182
  37. package/dist_ts/context/task-context-factory.d.ts +0 -48
  38. package/dist_ts/context/task-context-factory.js +0 -86
  39. package/dist_ts/context/types.d.ts +0 -301
  40. package/dist_ts/context/types.js +0 -2
  41. package/dist_ts/tsdoc.classes.typedoc.d.ts +0 -10
  42. package/dist_ts/tsdoc.classes.typedoc.js +0 -48
  43. package/dist_ts/tsdoc.cli.d.ts +0 -1
  44. package/dist_ts/tsdoc.cli.js +0 -32
  45. package/dist_ts/tsdoc.logging.d.ts +0 -2
  46. package/dist_ts/tsdoc.logging.js +0 -14
  47. package/dist_ts/tsdoc.paths.d.ts +0 -8
  48. package/dist_ts/tsdoc.paths.js +0 -12
  49. package/dist_ts/tsdoc.plugins.d.ts +0 -11
  50. package/dist_ts/tsdoc.plugins.js +0 -15
  51. package/ts/context/config-manager.ts +0 -369
  52. package/ts/context/context-analyzer.ts +0 -391
  53. package/ts/context/context-cache.ts +0 -286
  54. package/ts/context/context-trimmer.ts +0 -310
  55. package/ts/context/enhanced-context.ts +0 -332
  56. package/ts/context/index.ts +0 -70
  57. package/ts/context/iterative-context-builder.ts +0 -512
  58. package/ts/context/lazy-file-loader.ts +0 -207
  59. package/ts/context/task-context-factory.ts +0 -120
  60. package/ts/context/types.ts +0 -324
  61. /package/dist_ts/{context/diff-processor.d.ts → classes.diffprocessor.d.ts} +0 -0
  62. /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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