@git.zone/tsdoc 1.4.5 → 1.5.1

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 (41) hide show
  1. package/dist_ts/00_commitinfo_data.js +3 -3
  2. package/dist_ts/aidocs_classes/commit.js +16 -10
  3. package/dist_ts/aidocs_classes/description.js +14 -6
  4. package/dist_ts/aidocs_classes/projectcontext.d.ts +22 -0
  5. package/dist_ts/aidocs_classes/projectcontext.js +41 -1
  6. package/dist_ts/aidocs_classes/readme.js +10 -4
  7. package/dist_ts/classes.aidoc.d.ts +23 -0
  8. package/dist_ts/classes.aidoc.js +34 -1
  9. package/dist_ts/cli.js +110 -1
  10. package/dist_ts/context/config-manager.d.ts +58 -0
  11. package/dist_ts/context/config-manager.js +183 -0
  12. package/dist_ts/context/context-trimmer.d.ts +52 -0
  13. package/dist_ts/context/context-trimmer.js +199 -0
  14. package/dist_ts/context/enhanced-context.d.ts +75 -0
  15. package/dist_ts/context/enhanced-context.js +272 -0
  16. package/dist_ts/context/index.d.ts +7 -0
  17. package/dist_ts/context/index.js +8 -0
  18. package/dist_ts/context/task-context-factory.d.ts +46 -0
  19. package/dist_ts/context/task-context-factory.js +109 -0
  20. package/dist_ts/context/types.d.ts +89 -0
  21. package/dist_ts/context/types.js +2 -0
  22. package/dist_ts/plugins.d.ts +2 -1
  23. package/dist_ts/plugins.js +3 -2
  24. package/npmextra.json +10 -9
  25. package/package.json +25 -23
  26. package/readme.md +588 -174
  27. package/readme.plan.md +314 -0
  28. package/ts/00_commitinfo_data.ts +2 -2
  29. package/ts/aidocs_classes/commit.ts +21 -9
  30. package/ts/aidocs_classes/description.ts +16 -5
  31. package/ts/aidocs_classes/projectcontext.ts +43 -0
  32. package/ts/aidocs_classes/readme.ts +11 -3
  33. package/ts/classes.aidoc.ts +37 -0
  34. package/ts/cli.ts +128 -0
  35. package/ts/context/config-manager.ts +209 -0
  36. package/ts/context/context-trimmer.ts +246 -0
  37. package/ts/context/enhanced-context.ts +343 -0
  38. package/ts/context/index.ts +32 -0
  39. package/ts/context/task-context-factory.ts +138 -0
  40. package/ts/context/types.ts +95 -0
  41. package/ts/plugins.ts +2 -1
@@ -0,0 +1,183 @@
1
+ import * as plugins from '../plugins.js';
2
+ /**
3
+ * Manages configuration for context building
4
+ */
5
+ export class ConfigManager {
6
+ /**
7
+ * Get the singleton instance of ConfigManager
8
+ */
9
+ static getInstance() {
10
+ if (!ConfigManager.instance) {
11
+ ConfigManager.instance = new ConfigManager();
12
+ }
13
+ return ConfigManager.instance;
14
+ }
15
+ /**
16
+ * Private constructor for singleton pattern
17
+ */
18
+ constructor() {
19
+ this.projectDir = '';
20
+ this.config = this.getDefaultConfig();
21
+ }
22
+ /**
23
+ * Initialize the config manager with a project directory
24
+ * @param projectDir The project directory
25
+ */
26
+ async initialize(projectDir) {
27
+ this.projectDir = projectDir;
28
+ await this.loadConfig();
29
+ }
30
+ /**
31
+ * Get the default configuration
32
+ */
33
+ getDefaultConfig() {
34
+ return {
35
+ maxTokens: 190000, // Default for o4-mini with some buffer
36
+ defaultMode: 'trimmed',
37
+ taskSpecificSettings: {
38
+ readme: {
39
+ mode: 'trimmed',
40
+ includePaths: ['ts/', 'src/'],
41
+ excludePaths: ['test/', 'node_modules/']
42
+ },
43
+ commit: {
44
+ mode: 'trimmed',
45
+ focusOnChangedFiles: true
46
+ },
47
+ description: {
48
+ mode: 'trimmed',
49
+ includePackageInfo: true
50
+ }
51
+ },
52
+ trimming: {
53
+ removeImplementations: true,
54
+ preserveInterfaces: true,
55
+ preserveTypeDefs: true,
56
+ preserveJSDoc: true,
57
+ maxFunctionLines: 5,
58
+ removeComments: true,
59
+ removeBlankLines: true
60
+ }
61
+ };
62
+ }
63
+ /**
64
+ * Load configuration from npmextra.json
65
+ */
66
+ async loadConfig() {
67
+ try {
68
+ if (!this.projectDir) {
69
+ return;
70
+ }
71
+ // Create KeyValueStore for this project
72
+ // We'll just use smartfile directly instead of KeyValueStore
73
+ // Read the npmextra.json file
74
+ const npmextraJsonFile = await plugins.smartfile.SmartFile.fromFilePath(plugins.path.join(this.projectDir, 'npmextra.json'));
75
+ const npmextraContent = JSON.parse(npmextraJsonFile.contents.toString());
76
+ // Check for tsdoc context configuration
77
+ if (npmextraContent?.tsdoc?.context) {
78
+ // Merge with default config
79
+ this.config = this.mergeConfigs(this.config, npmextraContent.tsdoc.context);
80
+ }
81
+ }
82
+ catch (error) {
83
+ console.error('Error loading context configuration:', error);
84
+ }
85
+ }
86
+ /**
87
+ * Merge configurations, with userConfig taking precedence
88
+ * @param defaultConfig The default configuration
89
+ * @param userConfig The user configuration
90
+ */
91
+ mergeConfigs(defaultConfig, userConfig) {
92
+ const result = { ...defaultConfig };
93
+ // Merge top-level properties
94
+ if (userConfig.maxTokens !== undefined)
95
+ result.maxTokens = userConfig.maxTokens;
96
+ if (userConfig.defaultMode !== undefined)
97
+ result.defaultMode = userConfig.defaultMode;
98
+ // Merge task-specific settings
99
+ if (userConfig.taskSpecificSettings) {
100
+ result.taskSpecificSettings = result.taskSpecificSettings || {};
101
+ // For each task type, merge settings
102
+ ['readme', 'commit', 'description'].forEach(taskType => {
103
+ if (userConfig.taskSpecificSettings?.[taskType]) {
104
+ result.taskSpecificSettings[taskType] = {
105
+ ...result.taskSpecificSettings[taskType],
106
+ ...userConfig.taskSpecificSettings[taskType]
107
+ };
108
+ }
109
+ });
110
+ }
111
+ // Merge trimming configuration
112
+ if (userConfig.trimming) {
113
+ result.trimming = {
114
+ ...result.trimming,
115
+ ...userConfig.trimming
116
+ };
117
+ }
118
+ return result;
119
+ }
120
+ /**
121
+ * Get the complete configuration
122
+ */
123
+ getConfig() {
124
+ return this.config;
125
+ }
126
+ /**
127
+ * Get the trimming configuration
128
+ */
129
+ getTrimConfig() {
130
+ return this.config.trimming || {};
131
+ }
132
+ /**
133
+ * Get configuration for a specific task
134
+ * @param taskType The type of task
135
+ */
136
+ getTaskConfig(taskType) {
137
+ // Get task-specific config or empty object
138
+ const taskConfig = this.config.taskSpecificSettings?.[taskType] || {};
139
+ // If mode is not specified, use default mode
140
+ if (!taskConfig.mode) {
141
+ taskConfig.mode = this.config.defaultMode;
142
+ }
143
+ return taskConfig;
144
+ }
145
+ /**
146
+ * Get the maximum tokens allowed for context
147
+ */
148
+ getMaxTokens() {
149
+ return this.config.maxTokens || 190000;
150
+ }
151
+ /**
152
+ * Update the configuration
153
+ * @param config The new configuration
154
+ */
155
+ async updateConfig(config) {
156
+ // Merge with existing config
157
+ this.config = this.mergeConfigs(this.config, config);
158
+ try {
159
+ if (!this.projectDir) {
160
+ return;
161
+ }
162
+ // Read the existing npmextra.json file
163
+ const npmextraJsonPath = plugins.path.join(this.projectDir, 'npmextra.json');
164
+ let npmextraContent = {};
165
+ if (await plugins.smartfile.fs.fileExists(npmextraJsonPath)) {
166
+ const npmextraJsonFile = await plugins.smartfile.SmartFile.fromFilePath(npmextraJsonPath);
167
+ npmextraContent = JSON.parse(npmextraJsonFile.contents.toString()) || {};
168
+ }
169
+ // Update the tsdoc context configuration
170
+ const typedContent = npmextraContent;
171
+ if (!typedContent.tsdoc)
172
+ typedContent.tsdoc = {};
173
+ typedContent.tsdoc.context = this.config;
174
+ // Write back to npmextra.json
175
+ const updatedContent = JSON.stringify(npmextraContent, null, 2);
176
+ await plugins.smartfile.memory.toFs(updatedContent, npmextraJsonPath);
177
+ }
178
+ catch (error) {
179
+ console.error('Error updating context configuration:', error);
180
+ }
181
+ }
182
+ }
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb250ZXh0L2NvbmZpZy1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBR3pDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFLeEI7O09BRUc7SUFDSSxNQUFNLENBQUMsV0FBVztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVCLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNIO1FBZlEsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQWdCOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFrQjtRQUN4QyxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxnQkFBZ0I7UUFDdEIsT0FBTztZQUNMLFNBQVMsRUFBRSxNQUFNLEVBQUUsdUNBQXVDO1lBQzFELFdBQVcsRUFBRSxTQUFTO1lBQ3RCLG9CQUFvQixFQUFFO2dCQUNwQixNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLFNBQVM7b0JBQ2YsWUFBWSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztvQkFDN0IsWUFBWSxFQUFFLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQztpQkFDekM7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLElBQUksRUFBRSxTQUFTO29CQUNmLG1CQUFtQixFQUFFLElBQUk7aUJBQzFCO2dC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
@@ -0,0 +1,52 @@
1
+ import type { ITrimConfig, ContextMode } from './types.js';
2
+ /**
3
+ * Class responsible for trimming file contents to reduce token usage
4
+ * while preserving important information for context
5
+ */
6
+ export declare class ContextTrimmer {
7
+ private config;
8
+ /**
9
+ * Create a new ContextTrimmer with the given configuration
10
+ * @param config The trimming configuration
11
+ */
12
+ constructor(config?: ITrimConfig);
13
+ /**
14
+ * Trim a file's contents based on the configuration
15
+ * @param filePath The path to the file
16
+ * @param content The file's contents
17
+ * @param mode The context mode to use
18
+ * @returns The trimmed file contents
19
+ */
20
+ trimFile(filePath: string, content: string, mode?: ContextMode): string;
21
+ /**
22
+ * Trim a TypeScript file to reduce token usage
23
+ * @param content The TypeScript file contents
24
+ * @returns The trimmed file contents
25
+ */
26
+ private trimTypeScriptFile;
27
+ /**
28
+ * Limit a function body to a maximum number of lines
29
+ * @param start The function signature and opening brace
30
+ * @param body The function body
31
+ * @param end The closing brace
32
+ * @returns The limited function body
33
+ */
34
+ private limitFunctionBody;
35
+ /**
36
+ * Trim a Markdown file to reduce token usage
37
+ * @param content The Markdown file contents
38
+ * @returns The trimmed file contents
39
+ */
40
+ private trimMarkdownFile;
41
+ /**
42
+ * Trim a JSON file to reduce token usage
43
+ * @param content The JSON file contents
44
+ * @returns The trimmed file contents
45
+ */
46
+ private trimJsonFile;
47
+ /**
48
+ * Update the trimmer configuration
49
+ * @param config The new configuration to apply
50
+ */
51
+ updateConfig(config: ITrimConfig): void;
52
+ }
@@ -0,0 +1,199 @@
1
+ import * as plugins from '../plugins.js';
2
+ /**
3
+ * Class responsible for trimming file contents to reduce token usage
4
+ * while preserving important information for context
5
+ */
6
+ export class ContextTrimmer {
7
+ /**
8
+ * Create a new ContextTrimmer with the given configuration
9
+ * @param config The trimming configuration
10
+ */
11
+ constructor(config) {
12
+ this.config = {
13
+ removeImplementations: true,
14
+ preserveInterfaces: true,
15
+ preserveTypeDefs: true,
16
+ preserveJSDoc: true,
17
+ maxFunctionLines: 5,
18
+ removeComments: true,
19
+ removeBlankLines: true,
20
+ ...config
21
+ };
22
+ }
23
+ /**
24
+ * Trim a file's contents based on the configuration
25
+ * @param filePath The path to the file
26
+ * @param content The file's contents
27
+ * @param mode The context mode to use
28
+ * @returns The trimmed file contents
29
+ */
30
+ trimFile(filePath, content, mode = 'trimmed') {
31
+ // If mode is 'full', return the original content
32
+ if (mode === 'full') {
33
+ return content;
34
+ }
35
+ // Process based on file type
36
+ if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {
37
+ return this.trimTypeScriptFile(content);
38
+ }
39
+ else if (filePath.endsWith('.md')) {
40
+ return this.trimMarkdownFile(content);
41
+ }
42
+ else if (filePath.endsWith('.json')) {
43
+ return this.trimJsonFile(content);
44
+ }
45
+ // Default to returning the original content for unknown file types
46
+ return content;
47
+ }
48
+ /**
49
+ * Trim a TypeScript file to reduce token usage
50
+ * @param content The TypeScript file contents
51
+ * @returns The trimmed file contents
52
+ */
53
+ trimTypeScriptFile(content) {
54
+ let result = content;
55
+ // Step 1: Preserve JSDoc comments if configured
56
+ const jsDocComments = [];
57
+ if (this.config.preserveJSDoc) {
58
+ const jsDocRegex = /\/\*\*[\s\S]*?\*\//g;
59
+ const matches = result.match(jsDocRegex) || [];
60
+ jsDocComments.push(...matches);
61
+ }
62
+ // Step 2: Remove comments if configured
63
+ if (this.config.removeComments) {
64
+ // Remove single-line comments
65
+ result = result.replace(/\/\/.*$/gm, '');
66
+ // Remove multi-line comments (except JSDoc if preserveJSDoc is true)
67
+ if (!this.config.preserveJSDoc) {
68
+ result = result.replace(/\/\*[\s\S]*?\*\//g, '');
69
+ }
70
+ else {
71
+ // Only remove non-JSDoc comments
72
+ result = result.replace(/\/\*(?!\*)[\s\S]*?\*\//g, '');
73
+ }
74
+ }
75
+ // Step 3: Remove function implementations if configured
76
+ if (this.config.removeImplementations) {
77
+ // Match function and method bodies
78
+ result = result.replace(/(\b(function|constructor|async function)\s+[\w$]*\s*\([^)]*\)\s*{)([\s\S]*?)(})/g, (match, start, funcType, body, end) => {
79
+ // Keep function signature and opening brace, replace body with comment
80
+ return `${start} /* implementation removed */ ${end}`;
81
+ });
82
+ // Match arrow function bodies
83
+ result = result.replace(/(\([^)]*\)\s*=>\s*{)([\s\S]*?)(})/g, (match, start, body, end) => {
84
+ return `${start} /* implementation removed */ ${end}`;
85
+ });
86
+ // Match method declarations
87
+ result = result.replace(/(^\s*[\w$]*\s*\([^)]*\)\s*{)([\s\S]*?)(})/gm, (match, start, body, end) => {
88
+ return `${start} /* implementation removed */ ${end}`;
89
+ });
90
+ // Match class methods
91
+ result = result.replace(/(\b(public|private|protected|static|async)?\s+[\w$]+\s*\([^)]*\)\s*{)([\s\S]*?)(})/g, (match, start, modifier, body, end) => {
92
+ return `${start} /* implementation removed */ ${end}`;
93
+ });
94
+ }
95
+ else if (this.config.maxFunctionLines && this.config.maxFunctionLines > 0) {
96
+ // If not removing implementations completely, limit the number of lines
97
+ // Match function and method bodies
98
+ result = result.replace(/(\b(function|constructor|async function)\s+[\w$]*\s*\([^)]*\)\s*{)([\s\S]*?)(})/g, (match, start, funcType, body, end) => {
99
+ return this.limitFunctionBody(start, body, end);
100
+ });
101
+ // Match arrow function bodies
102
+ result = result.replace(/(\([^)]*\)\s*=>\s*{)([\s\S]*?)(})/g, (match, start, body, end) => {
103
+ return this.limitFunctionBody(start, body, end);
104
+ });
105
+ // Match method declarations
106
+ result = result.replace(/(^\s*[\w$]*\s*\([^)]*\)\s*{)([\s\S]*?)(})/gm, (match, start, body, end) => {
107
+ return this.limitFunctionBody(start, body, end);
108
+ });
109
+ // Match class methods
110
+ result = result.replace(/(\b(public|private|protected|static|async)?\s+[\w$]+\s*\([^)]*\)\s*{)([\s\S]*?)(})/g, (match, start, modifier, body, end) => {
111
+ return this.limitFunctionBody(start, body, end);
112
+ });
113
+ }
114
+ // Step 4: Remove blank lines if configured
115
+ if (this.config.removeBlankLines) {
116
+ result = result.replace(/^\s*[\r\n]/gm, '');
117
+ }
118
+ // Step 5: Restore preserved JSDoc comments
119
+ if (this.config.preserveJSDoc && jsDocComments.length > 0) {
120
+ // This is a placeholder; we already preserved JSDoc comments in the regex steps
121
+ }
122
+ return result;
123
+ }
124
+ /**
125
+ * Limit a function body to a maximum number of lines
126
+ * @param start The function signature and opening brace
127
+ * @param body The function body
128
+ * @param end The closing brace
129
+ * @returns The limited function body
130
+ */
131
+ limitFunctionBody(start, body, end) {
132
+ const lines = body.split('\n');
133
+ if (lines.length > this.config.maxFunctionLines) {
134
+ const limitedBody = lines.slice(0, this.config.maxFunctionLines).join('\n');
135
+ return `${start}${limitedBody}\n // ... (${lines.length - this.config.maxFunctionLines} lines trimmed)\n${end}`;
136
+ }
137
+ return `${start}${body}${end}`;
138
+ }
139
+ /**
140
+ * Trim a Markdown file to reduce token usage
141
+ * @param content The Markdown file contents
142
+ * @returns The trimmed file contents
143
+ */
144
+ trimMarkdownFile(content) {
145
+ // For markdown files, we generally want to keep most content
146
+ // but we can remove lengthy code blocks if needed
147
+ return content;
148
+ }
149
+ /**
150
+ * Trim a JSON file to reduce token usage
151
+ * @param content The JSON file contents
152
+ * @returns The trimmed file contents
153
+ */
154
+ trimJsonFile(content) {
155
+ try {
156
+ // Parse the JSON
157
+ const json = JSON.parse(content);
158
+ // For package.json, keep only essential information
159
+ if ('name' in json && 'version' in json && 'dependencies' in json) {
160
+ const essentialKeys = [
161
+ 'name', 'version', 'description', 'author', 'license',
162
+ 'main', 'types', 'exports', 'type'
163
+ ];
164
+ const trimmedJson = {};
165
+ essentialKeys.forEach(key => {
166
+ if (key in json) {
167
+ trimmedJson[key] = json[key];
168
+ }
169
+ });
170
+ // Add dependency information without versions
171
+ if ('dependencies' in json) {
172
+ trimmedJson.dependencies = Object.keys(json.dependencies).reduce((acc, dep) => {
173
+ acc[dep] = '*'; // Replace version with wildcard
174
+ return acc;
175
+ }, {});
176
+ }
177
+ // Return the trimmed JSON
178
+ return JSON.stringify(trimmedJson, null, 2);
179
+ }
180
+ // For other JSON files, leave as is
181
+ return content;
182
+ }
183
+ catch (error) {
184
+ // If there's an error parsing the JSON, return the original content
185
+ return content;
186
+ }
187
+ }
188
+ /**
189
+ * Update the trimmer configuration
190
+ * @param config The new configuration to apply
191
+ */
192
+ updateConfig(config) {
193
+ this.config = {
194
+ ...this.config,
195
+ ...config
196
+ };
197
+ }
198
+ }
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC10cmltbWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvY29udGV4dC9jb250ZXh0LXRyaW1tZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFHekM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFHekI7OztPQUdHO0lBQ0gsWUFBWSxNQUFvQjtRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1oscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixrQkFBa0IsRUFBRSxJQUFJO1lBQ3hCLGdCQUFnQixFQUFFLElBQUk7WUFDdEIsYUFBYSxFQUFFLElBQUk7WUFDbkIsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixjQUFjLEVBQUUsSUFBSTtZQUNwQixnQkFBZ0IsRUFBRSxJQUFJO1lBQ3RCLEdBQUcsTUFBTTtTQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksUUFBUSxDQUFDLFFBQWdCLEVBQUUsT0FBZSxFQUFFLE9BQW9CLFNBQVM7UUFDOUUsaURBQWlEO1FBQ2pELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCw2QkFBNkI7UUFDN0IsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDO2FBQU0sSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxD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
@@ -0,0 +1,75 @@
1
+ import * as plugins from '../plugins.js';
2
+ import type { ContextMode, IContextResult, TaskType } from './types.js';
3
+ /**
4
+ * Enhanced ProjectContext that supports context optimization strategies
5
+ */
6
+ export declare class EnhancedContext {
7
+ private projectDir;
8
+ private trimmer;
9
+ private configManager;
10
+ private contextMode;
11
+ private tokenBudget;
12
+ private contextResult;
13
+ /**
14
+ * Create a new EnhancedContext
15
+ * @param projectDirArg The project directory
16
+ */
17
+ constructor(projectDirArg: string);
18
+ /**
19
+ * Initialize the context builder
20
+ */
21
+ initialize(): Promise<void>;
22
+ /**
23
+ * Set the context mode
24
+ * @param mode The context mode to use
25
+ */
26
+ setContextMode(mode: ContextMode): void;
27
+ /**
28
+ * Set the token budget
29
+ * @param maxTokens The maximum tokens to use
30
+ */
31
+ setTokenBudget(maxTokens: number): void;
32
+ /**
33
+ * Gather files from the project
34
+ * @param includePaths Optional paths to include
35
+ * @param excludePaths Optional paths to exclude
36
+ */
37
+ gatherFiles(includePaths?: string[], excludePaths?: string[]): Promise<Record<string, plugins.smartfile.SmartFile | plugins.smartfile.SmartFile[]>>;
38
+ /**
39
+ * Convert files to context string
40
+ * @param files The files to convert
41
+ * @param mode The context mode to use
42
+ */
43
+ convertFilesToContext(files: plugins.smartfile.SmartFile[], mode?: ContextMode): Promise<string>;
44
+ /**
45
+ * Build context for the project
46
+ * @param taskType Optional task type for task-specific context
47
+ */
48
+ buildContext(taskType?: TaskType): Promise<IContextResult>;
49
+ /**
50
+ * Update the context with git diff information for commit tasks
51
+ * @param gitDiff The git diff to include
52
+ */
53
+ updateWithGitDiff(gitDiff: string): IContextResult;
54
+ /**
55
+ * Count tokens in a string
56
+ * @param text The text to count tokens for
57
+ * @param model The model to use for token counting
58
+ */
59
+ countTokens(text: string, model?: string): number;
60
+ /**
61
+ * Get the context result
62
+ */
63
+ getContextResult(): IContextResult;
64
+ /**
65
+ * Get the token count for the current context
66
+ */
67
+ getTokenCount(): number;
68
+ /**
69
+ * Get both the context string and its token count
70
+ */
71
+ getContextWithTokenCount(): {
72
+ context: string;
73
+ tokenCount: number;
74
+ };
75
+ }