@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,7 +1,8 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { AiDoc } from '../classes.aidoc.js';
|
|
3
3
|
import { ProjectContext } from './projectcontext.js';
|
|
4
|
-
import { DiffProcessor } from '../
|
|
4
|
+
import { DiffProcessor } from '../classes.diffprocessor.js';
|
|
5
|
+
import { logger } from '../logging.js';
|
|
5
6
|
export class Commit {
|
|
6
7
|
constructor(aiDocsRef, projectDirArg) {
|
|
7
8
|
this.aiDocsRef = aiDocsRef;
|
|
@@ -84,77 +85,97 @@ export class Commit {
|
|
|
84
85
|
else {
|
|
85
86
|
processedDiffString = 'No changes.';
|
|
86
87
|
}
|
|
87
|
-
// Use
|
|
88
|
-
const taskContextFactory = new (await import('../context/index.js')).TaskContextFactory(this.projectDir, this.aiDocsRef.openaiInstance);
|
|
89
|
-
await taskContextFactory.initialize();
|
|
90
|
-
// Generate context specifically for commit task
|
|
91
|
-
const contextResult = await taskContextFactory.createContextForCommit(processedDiffString);
|
|
92
|
-
// Get the optimized context string
|
|
93
|
-
let contextString = contextResult.context;
|
|
94
|
-
// Log token usage statistics
|
|
95
|
-
console.log(`Token usage - Context: ${contextResult.tokenCount}, Files: ${contextResult.includedFiles.length + contextResult.trimmedFiles.length}, Savings: ${contextResult.tokenSavings}`);
|
|
96
|
-
// Check for token overflow against model limits
|
|
97
|
-
const MODEL_TOKEN_LIMIT = 200000; // o4-mini
|
|
98
|
-
if (contextResult.tokenCount > MODEL_TOKEN_LIMIT * 0.9) {
|
|
99
|
-
console.log(`⚠️ Warning: Context size (${contextResult.tokenCount} tokens) is close to or exceeds model limit (${MODEL_TOKEN_LIMIT} tokens).`);
|
|
100
|
-
console.log(`The model may not be able to process all information effectively.`);
|
|
101
|
-
}
|
|
102
|
-
// Use DualAgentOrchestrator for commit message generation with Guardian validation
|
|
88
|
+
// Use DualAgentOrchestrator for commit message generation
|
|
103
89
|
const commitOrchestrator = new plugins.smartagent.DualAgentOrchestrator({
|
|
104
|
-
|
|
90
|
+
smartAiInstance: this.aiDocsRef.smartAiInstance,
|
|
105
91
|
defaultProvider: 'openai',
|
|
92
|
+
logPrefix: '[Commit]',
|
|
93
|
+
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
106
94
|
guardianPolicyPrompt: `
|
|
107
95
|
You validate commit messages for semantic versioning compliance.
|
|
108
96
|
|
|
109
|
-
APPROVE
|
|
97
|
+
APPROVE tool calls for:
|
|
98
|
+
- Reading package.json or source files to understand project context
|
|
99
|
+
- Using tree to see project structure
|
|
100
|
+
- Listing directory contents
|
|
101
|
+
|
|
102
|
+
REJECT tool calls for:
|
|
103
|
+
- Reading files outside the project directory
|
|
104
|
+
- Writing, deleting, or modifying any files
|
|
105
|
+
- Any destructive operations
|
|
106
|
+
|
|
107
|
+
APPROVE final output if:
|
|
110
108
|
- Version level (fix/feat/BREAKING CHANGE) matches the scope of changes in the diff
|
|
111
109
|
- Commit message is clear, professional, and follows conventional commit conventions
|
|
112
110
|
- No personal information, licensing details, or AI mentions (Claude/Codex) included
|
|
113
111
|
- JSON structure is valid with all required fields
|
|
114
112
|
- Scope accurately reflects the changed modules/files
|
|
115
113
|
|
|
116
|
-
REJECT
|
|
114
|
+
REJECT final output if:
|
|
117
115
|
- Version level doesn't match the scope of changes (e.g., "feat" for a typo fix should be "fix")
|
|
118
116
|
- Message is vague, unprofessional, or contains sensitive information
|
|
119
|
-
- JSON is malformed or missing required fields
|
|
117
|
+
- JSON is malformed or missing required fields
|
|
120
118
|
`,
|
|
121
119
|
});
|
|
120
|
+
// Register scoped filesystem tool for agent exploration
|
|
121
|
+
commitOrchestrator.registerScopedFilesystemTool(this.projectDir, [
|
|
122
|
+
'.nogit/**',
|
|
123
|
+
'node_modules/**',
|
|
124
|
+
'.git/**',
|
|
125
|
+
'dist/**',
|
|
126
|
+
'dist_*/**',
|
|
127
|
+
]);
|
|
122
128
|
await commitOrchestrator.start();
|
|
123
129
|
const commitTaskPrompt = `
|
|
124
130
|
You create a commit message for a git commit.
|
|
125
|
-
|
|
126
|
-
You should not include any licensing information.
|
|
127
|
-
You should not include any personal information.
|
|
131
|
+
Project directory: ${this.projectDir}
|
|
128
132
|
|
|
129
|
-
|
|
133
|
+
You have access to a filesystem tool to explore the project if needed:
|
|
134
|
+
- Use tree to see project structure
|
|
135
|
+
- Use read to read package.json or source files for context
|
|
130
136
|
|
|
131
|
-
|
|
137
|
+
Analyze the git diff below to understand what changed and generate a commit message.
|
|
132
138
|
|
|
133
|
-
|
|
139
|
+
You should not include any licensing information or personal information.
|
|
140
|
+
Never mention CLAUDE code, or codex.
|
|
141
|
+
|
|
142
|
+
Your final output (inside the task_complete tags) must be ONLY valid JSON - the raw JSON object, nothing else.
|
|
143
|
+
No explanations, no summaries, no markdown - just the JSON object that can be parsed with JSON.parse().
|
|
144
|
+
|
|
145
|
+
Here is the structure of the JSON you must return:
|
|
134
146
|
|
|
135
|
-
|
|
136
|
-
recommendedNextVersionLevel:
|
|
137
|
-
recommendedNextVersionScope: string
|
|
138
|
-
recommendedNextVersionMessage: string
|
|
139
|
-
recommendedNextVersionDetails: string
|
|
140
|
-
recommendedNextVersion:
|
|
147
|
+
{
|
|
148
|
+
"recommendedNextVersionLevel": "fix" | "feat" | "BREAKING CHANGE",
|
|
149
|
+
"recommendedNextVersionScope": "string",
|
|
150
|
+
"recommendedNextVersionMessage": "string",
|
|
151
|
+
"recommendedNextVersionDetails": ["string"],
|
|
152
|
+
"recommendedNextVersion": "x.x.x"
|
|
141
153
|
}
|
|
142
154
|
|
|
143
|
-
For
|
|
155
|
+
For recommendedNextVersionDetails, only add entries that have obvious value to the reader.
|
|
144
156
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
157
|
+
Here is the git diff showing what changed:
|
|
158
|
+
|
|
159
|
+
${processedDiffString}
|
|
148
160
|
|
|
149
|
-
|
|
150
|
-
${contextString}
|
|
161
|
+
Analyze these changes and output the JSON commit message object.
|
|
151
162
|
`;
|
|
152
163
|
const commitResult = await commitOrchestrator.run(commitTaskPrompt);
|
|
153
164
|
await commitOrchestrator.stop();
|
|
154
165
|
if (!commitResult.success) {
|
|
155
166
|
throw new Error(`Commit message generation failed: ${commitResult.status}`);
|
|
156
167
|
}
|
|
157
|
-
|
|
168
|
+
// Extract JSON from result - handle cases where AI adds text around it
|
|
169
|
+
let jsonString = commitResult.result
|
|
170
|
+
.replace(/```json\n?/gi, '')
|
|
171
|
+
.replace(/```\n?/gi, '');
|
|
172
|
+
// Try to find JSON object in the result
|
|
173
|
+
const jsonMatch = jsonString.match(/\{[\s\S]*\}/);
|
|
174
|
+
if (!jsonMatch) {
|
|
175
|
+
throw new Error(`Could not find JSON object in result: ${jsonString.substring(0, 100)}...`);
|
|
176
|
+
}
|
|
177
|
+
jsonString = jsonMatch[0];
|
|
178
|
+
const resultObject = JSON.parse(jsonString);
|
|
158
179
|
const previousChangelogPath = plugins.path.join(this.projectDir, 'changelog.md');
|
|
159
180
|
let previousChangelog;
|
|
160
181
|
if (await plugins.fsInstance.file(previousChangelogPath).exists()) {
|
|
@@ -166,8 +187,10 @@ ${contextString}
|
|
|
166
187
|
console.log(JSON.stringify(commitMessages, null, 2));
|
|
167
188
|
// Use DualAgentOrchestrator for changelog generation with Guardian validation
|
|
168
189
|
const changelogOrchestrator = new plugins.smartagent.DualAgentOrchestrator({
|
|
169
|
-
|
|
190
|
+
smartAiInstance: this.aiDocsRef.smartAiInstance,
|
|
170
191
|
defaultProvider: 'openai',
|
|
192
|
+
logPrefix: '[Changelog]',
|
|
193
|
+
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
171
194
|
guardianPolicyPrompt: `
|
|
172
195
|
You validate changelog generation.
|
|
173
196
|
|
|
@@ -225,4 +248,4 @@ ${JSON.stringify(commitMessages, null, 2)}
|
|
|
225
248
|
return resultObject;
|
|
226
249
|
}
|
|
227
250
|
}
|
|
228
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
251
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvY29tbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFXdkMsTUFBTSxPQUFPLE1BQU07SUFJakIsWUFBWSxTQUFnQixFQUFFLGFBQXFCO1FBQ2pELElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pELE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FDL0QsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7UUFFRiwwQ0FBMEM7UUFDMUMsa0RBQWtEO1FBQ2xELE1BQU0sZUFBZSxHQUFHO1lBQ3RCLGFBQWE7WUFDYixnQkFBZ0I7WUFDaEIsbUJBQW1CO1lBQ25CLHFCQUFxQjtZQUNyQixXQUFXO1lBQ1gsV0FBVztZQUNYLFdBQVc7WUFFWCxrREFBa0Q7WUFDbEQsU0FBUztZQUNULFdBQVcsRUFBWSwwQkFBMEI7WUFDakQsVUFBVTtZQUNWLFVBQVU7WUFDVixRQUFRO1lBQ1IsZ0JBQWdC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
|
|
@@ -1,51 +1,90 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { ProjectContext } from './projectcontext.js';
|
|
3
|
+
import { logger } from '../logging.js';
|
|
3
4
|
export class Description {
|
|
4
5
|
constructor(aiDocsRef, projectDirArg) {
|
|
5
6
|
this.aiDocsRef = aiDocsRef;
|
|
6
7
|
this.projectDir = projectDirArg;
|
|
7
8
|
}
|
|
8
9
|
async build() {
|
|
9
|
-
// Use
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
You
|
|
10
|
+
// Use DualAgentOrchestrator with filesystem tool for agent-driven exploration
|
|
11
|
+
const descriptionOrchestrator = new plugins.smartagent.DualAgentOrchestrator({
|
|
12
|
+
smartAiInstance: this.aiDocsRef.smartAiInstance,
|
|
13
|
+
defaultProvider: 'openai',
|
|
14
|
+
maxIterations: 15,
|
|
15
|
+
maxResultChars: 10000, // Limit tool output to prevent token explosion
|
|
16
|
+
maxHistoryMessages: 15, // Limit history window
|
|
17
|
+
logPrefix: '[Description]',
|
|
18
|
+
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
19
|
+
guardianPolicyPrompt: `
|
|
20
|
+
You validate description generation tool calls and outputs.
|
|
21
|
+
|
|
22
|
+
APPROVE tool calls for:
|
|
23
|
+
- Reading package.json, npmextra.json, or source files in the ts/ directory
|
|
24
|
+
- Listing directory contents to understand project structure
|
|
25
|
+
- Using tree to see project structure
|
|
26
|
+
|
|
27
|
+
REJECT tool calls for:
|
|
28
|
+
- Reading files outside the project directory
|
|
29
|
+
- Writing, deleting, or modifying any files
|
|
30
|
+
- Any destructive operations
|
|
31
|
+
|
|
32
|
+
For final output, APPROVE if:
|
|
33
|
+
- JSON is valid and parseable
|
|
34
|
+
- Description is a clear, concise one-sentence summary
|
|
35
|
+
- Keywords are relevant to the project's use cases
|
|
36
|
+
- Both description and keywords fields are present
|
|
37
|
+
|
|
38
|
+
REJECT final output if:
|
|
39
|
+
- JSON is malformed or wrapped in markdown code blocks
|
|
40
|
+
- Description is too long or vague
|
|
41
|
+
- Keywords are irrelevant or generic
|
|
42
|
+
`,
|
|
43
|
+
});
|
|
44
|
+
// Register scoped filesystem tool for agent exploration
|
|
45
|
+
descriptionOrchestrator.registerScopedFilesystemTool(this.projectDir);
|
|
46
|
+
await descriptionOrchestrator.start();
|
|
47
|
+
const descriptionTaskPrompt = `
|
|
48
|
+
You create a project description and keywords for an npm package.
|
|
49
|
+
|
|
50
|
+
PROJECT DIRECTORY: ${this.projectDir}
|
|
51
|
+
|
|
52
|
+
Use the filesystem tool to explore the project and understand what it does:
|
|
53
|
+
1. First, use tree to see the project structure
|
|
54
|
+
2. Read package.json to understand the package name and current description
|
|
55
|
+
3. Read npmextra.json if it exists for additional metadata
|
|
56
|
+
4. Read key source files in ts/ directory to understand the implementation
|
|
57
|
+
|
|
58
|
+
Then generate a description and keywords based on your exploration.
|
|
59
|
+
|
|
60
|
+
Your FINAL response must be valid JSON adhering to this interface:
|
|
20
61
|
{
|
|
21
62
|
description: string; // a sensible short, one sentence description of the project
|
|
22
|
-
keywords: string[]; // an array of tags that describe the project
|
|
63
|
+
keywords: string[]; // an array of tags that describe the project based on use cases
|
|
23
64
|
}
|
|
24
65
|
|
|
25
|
-
The description should be based on what you understand from the project's files.
|
|
26
|
-
The keywords should be based on use cases you see from the files.
|
|
27
|
-
Don't be cheap about the way you think.
|
|
28
|
-
|
|
29
66
|
Important: Answer only in valid JSON.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
67
|
+
Your answer should be parseable with JSON.parse() without modifying anything.
|
|
68
|
+
Don't wrap the JSON in \`\`\`json\`\`\` - just return the raw JSON object.
|
|
69
|
+
`;
|
|
70
|
+
const descriptionResult = await descriptionOrchestrator.run(descriptionTaskPrompt);
|
|
71
|
+
await descriptionOrchestrator.stop();
|
|
72
|
+
if (!descriptionResult.success) {
|
|
73
|
+
throw new Error(`Description generation failed: ${descriptionResult.status}`);
|
|
74
|
+
}
|
|
75
|
+
console.log(descriptionResult.result);
|
|
76
|
+
const resultObject = JSON.parse(descriptionResult.result.replace('```json', '').replace('```', ''));
|
|
77
|
+
// Use ProjectContext to get file handles for writing
|
|
40
78
|
const projectContext = new ProjectContext(this.projectDir);
|
|
41
79
|
const files = await projectContext.gatherFiles();
|
|
80
|
+
// Update npmextra.json
|
|
42
81
|
const npmextraJson = files.smartfilesNpmextraJSON;
|
|
43
82
|
const npmextraJsonContent = JSON.parse(npmextraJson.contents.toString());
|
|
44
83
|
npmextraJsonContent['@git.zone/cli'].module.description = resultObject.description;
|
|
45
84
|
npmextraJsonContent['@git.zone/cli'].module.keywords = resultObject.keywords;
|
|
46
85
|
npmextraJson.contents = Buffer.from(JSON.stringify(npmextraJsonContent, null, 2));
|
|
47
86
|
await npmextraJson.write();
|
|
48
|
-
//
|
|
87
|
+
// Update package.json
|
|
49
88
|
const packageJson = files.smartfilePackageJSON;
|
|
50
89
|
const packageJsonContent = JSON.parse(packageJson.contents.toString());
|
|
51
90
|
packageJsonContent.description = resultObject.description;
|
|
@@ -55,7 +94,7 @@ Don't wrap the JSON in three ticks json!!!
|
|
|
55
94
|
console.log(`\n======================\n`);
|
|
56
95
|
console.log(JSON.stringify(resultObject, null, 2));
|
|
57
96
|
console.log(`\n======================\n`);
|
|
58
|
-
return result
|
|
97
|
+
return descriptionResult.result;
|
|
59
98
|
}
|
|
60
99
|
}
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9kZXNjcmlwdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU92QyxNQUFNLE9BQU8sV0FBVztJQUt0QixZQUFZLFNBQWdCLEVBQUUsYUFBcUI7UUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLDhFQUE4RTtRQUM5RSxNQUFNLHVCQUF1QixHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQztZQUMzRSxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlO1lBQy9DLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLGNBQWMsRUFBRSxLQUFLLEVBQUUsK0NBQStDO1lBQ3RFLGtCQUFrQixFQUFFLEVBQUUsRUFBRSx1QkFBdUI7WUFDL0MsU0FBUyxFQUFFLGVBQWU7WUFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNuRSxvQkFBb0IsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F1QjNCO1NBQ0ksQ0FBQyxDQUFDO1FBRUgsd0RBQXdEO1FBQ3hELHVCQUF1QixDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV0RSxNQUFNLHVCQUF1QixDQUFDLEtB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
|
|
@@ -15,12 +15,12 @@ export declare class ProjectContext {
|
|
|
15
15
|
}>;
|
|
16
16
|
convertFilesToContext(filesArg: plugins.smartfile.SmartFile[]): Promise<string>;
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* @param
|
|
21
|
-
* @returns
|
|
18
|
+
* Estimate token count for a string
|
|
19
|
+
* Uses a rough estimate of 4 characters per token
|
|
20
|
+
* @param text The text to estimate tokens for
|
|
21
|
+
* @returns Estimated number of tokens
|
|
22
22
|
*/
|
|
23
|
-
countTokens(text: string
|
|
23
|
+
countTokens(text: string): number;
|
|
24
24
|
private buildContext;
|
|
25
25
|
/**
|
|
26
26
|
* Get the token count for the current context
|
|
@@ -39,22 +39,14 @@ ${smartfile.contents.toString()}
|
|
|
39
39
|
.join('\n');
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* @param
|
|
45
|
-
* @returns
|
|
42
|
+
* Estimate token count for a string
|
|
43
|
+
* Uses a rough estimate of 4 characters per token
|
|
44
|
+
* @param text The text to estimate tokens for
|
|
45
|
+
* @returns Estimated number of tokens
|
|
46
46
|
*/
|
|
47
|
-
countTokens(text
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const tokens = plugins.gptTokenizer.encode(text);
|
|
51
|
-
return tokens.length;
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
console.error('Error counting tokens:', error);
|
|
55
|
-
// Provide a rough estimate (4 chars per token) if tokenization fails
|
|
56
|
-
return Math.ceil(text.length / 4);
|
|
57
|
-
}
|
|
47
|
+
countTokens(text) {
|
|
48
|
+
// Rough estimate: ~4 characters per token for English text
|
|
49
|
+
return Math.ceil(text.length / 4);
|
|
58
50
|
}
|
|
59
51
|
async buildContext(dirArg) {
|
|
60
52
|
const files = await this.gatherFiles();
|
|
@@ -94,4 +86,4 @@ ${smartfile.contents.toString()}
|
|
|
94
86
|
return result;
|
|
95
87
|
}
|
|
96
88
|
}
|
|
97
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdGNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9haWRvY3NfY2xhc3Nlcy9wcm9qZWN0Y29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxNQUFNLE9BQU8sY0FBYztJQUNsQixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFjLElBQUcsQ0FBQztJQU85QyxZQUFZLGFBQXFCO1FBSHpCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFDdkIsa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFHakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUM7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXO1FBQ3RCLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUN0RSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxFQUNsRCxJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQ2xFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQy9DLElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7UUFFRixNQUFNLHFCQUFxQixHQUFHLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FDdkUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxFQUNyRCxJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO1FBQ0YsTUFBTSxzQkFBc0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQ3hFLE9B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
|