@git.zone/tsdoc 1.11.0 → 1.11.2
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 +27 -34
- 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 +11 -13
- package/ts/aidocs_classes/commit.ts +26 -41
- 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
|
@@ -9,15 +9,7 @@ export class Readme {
|
|
|
9
9
|
}
|
|
10
10
|
async build() {
|
|
11
11
|
let finalReadmeString = ``;
|
|
12
|
-
//
|
|
13
|
-
const taskContextFactory = new (await import('../context/index.js')).TaskContextFactory(this.projectDir, this.aiDocsRef.openaiInstance);
|
|
14
|
-
await taskContextFactory.initialize();
|
|
15
|
-
// Generate context specifically for readme task
|
|
16
|
-
const contextResult = await taskContextFactory.createContextForReadme();
|
|
17
|
-
const contextString = contextResult.context;
|
|
18
|
-
// Log token usage statistics
|
|
19
|
-
console.log(`Token usage - Context: ${contextResult.tokenCount}, Files: ${contextResult.includedFiles.length + contextResult.trimmedFiles.length}, Savings: ${contextResult.tokenSavings}`);
|
|
20
|
-
// lets first check legal before introducung any cost
|
|
12
|
+
// First check legal info before introducing any cost
|
|
21
13
|
const projectContext = new ProjectContext(this.projectDir);
|
|
22
14
|
const npmExtraJson = JSON.parse((await projectContext.gatherFiles()).smartfilesNpmextraJSON.contents.toString());
|
|
23
15
|
const legalInfo = npmExtraJson?.['@git.zone/tsdoc']?.legal;
|
|
@@ -25,48 +17,92 @@ export class Readme {
|
|
|
25
17
|
const error = new Error(`No legal information found in npmextra.json`);
|
|
26
18
|
console.log(error);
|
|
27
19
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
20
|
+
// Use DualAgentOrchestrator with filesystem tool for agent-driven exploration
|
|
21
|
+
const readmeOrchestrator = new plugins.smartagent.DualAgentOrchestrator({
|
|
22
|
+
smartAiInstance: this.aiDocsRef.smartAiInstance,
|
|
23
|
+
defaultProvider: 'openai',
|
|
24
|
+
maxIterations: 25,
|
|
25
|
+
maxResultChars: 15000, // Limit tool output to prevent token explosion
|
|
26
|
+
maxHistoryMessages: 20, // Limit history window
|
|
27
|
+
logPrefix: '[README]',
|
|
28
|
+
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
29
|
+
guardianPolicyPrompt: `
|
|
30
|
+
You validate README generation tool calls and outputs.
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
APPROVE tool calls for:
|
|
33
|
+
- Reading any files within the project directory (package.json, ts/*.ts, readme.md, etc.)
|
|
34
|
+
- Using tree to see project structure
|
|
35
|
+
- Using glob to find source files
|
|
36
|
+
- Listing directory contents
|
|
37
|
+
|
|
38
|
+
REJECT tool calls for:
|
|
39
|
+
- Reading files outside the project directory
|
|
40
|
+
- Writing, deleting, or modifying any files
|
|
41
|
+
- Any destructive operations
|
|
42
|
+
|
|
43
|
+
For final README output, APPROVE if:
|
|
44
|
+
- README follows proper markdown format
|
|
45
|
+
- Contains Install and Usage sections
|
|
46
|
+
- Code examples are correct TypeScript/ESM syntax
|
|
47
|
+
- Documentation is comprehensive and helpful
|
|
48
|
+
|
|
49
|
+
REJECT final output if:
|
|
50
|
+
- README is incomplete or poorly formatted
|
|
51
|
+
- Contains licensing information (added separately)
|
|
52
|
+
- Uses CommonJS syntax instead of ESM
|
|
53
|
+
- Contains "in conclusion" or similar filler
|
|
54
|
+
`,
|
|
55
|
+
});
|
|
56
|
+
// Register scoped filesystem tool for agent exploration
|
|
57
|
+
readmeOrchestrator.registerScopedFilesystemTool(this.projectDir);
|
|
58
|
+
await readmeOrchestrator.start();
|
|
59
|
+
const readmeTaskPrompt = `
|
|
60
|
+
You create markdown READMEs for npm projects. You only output the markdown readme.
|
|
61
|
+
|
|
62
|
+
PROJECT DIRECTORY: ${this.projectDir}
|
|
63
|
+
|
|
64
|
+
Use the filesystem tool to explore the project and understand what it does:
|
|
65
|
+
1. First, use tree to see the project structure (maxDepth: 3)
|
|
66
|
+
2. Read package.json to understand the package name, description, and dependencies
|
|
67
|
+
3. Read the existing readme.md if it exists (use it as a base, improve and expand)
|
|
68
|
+
4. Read readme.hints.md if it exists (contains hints for documentation)
|
|
69
|
+
5. Read key source files in ts/ directory to understand the API and implementation
|
|
70
|
+
6. Focus on exported classes, interfaces, and functions
|
|
71
|
+
|
|
72
|
+
Then generate a comprehensive README following this template:
|
|
33
73
|
|
|
34
74
|
# Project Name
|
|
35
|
-
[
|
|
36
|
-
The name is the module name of package.json
|
|
37
|
-
The description is in the description field of package.json
|
|
38
|
-
]
|
|
75
|
+
[The name from package.json and description]
|
|
39
76
|
|
|
40
77
|
## Install
|
|
41
|
-
[
|
|
42
|
-
Write a short text on how to install the project
|
|
43
|
-
]
|
|
78
|
+
[Short text on how to install the project]
|
|
44
79
|
|
|
45
80
|
## Usage
|
|
46
|
-
[
|
|
81
|
+
[
|
|
47
82
|
Give code examples here.
|
|
48
83
|
Construct sensible scenarios for the user.
|
|
49
84
|
Make sure to show a complete set of features of the module.
|
|
50
85
|
Don't omit use cases.
|
|
51
|
-
It does not matter how much time you need.
|
|
52
86
|
ALWAYS USE ESM SYNTAX AND TYPESCRIPT.
|
|
53
|
-
|
|
54
|
-
If there is already a readme, take the Usage section as base. Remove outdated content,
|
|
55
|
-
|
|
56
|
-
Don't include any licensing information. This will be added
|
|
57
|
-
Avoid "in
|
|
58
|
-
|
|
59
|
-
Good to know:
|
|
60
|
-
* npmextra.json contains overall module information.
|
|
61
|
-
* readme.hints.md provides valuable hints about module ideas.
|
|
87
|
+
Write at least 4000 words. More if necessary.
|
|
88
|
+
If there is already a readme, take the Usage section as base. Remove outdated content, expand and improve.
|
|
89
|
+
Check for completeness.
|
|
90
|
+
Don't include any licensing information. This will be added later.
|
|
91
|
+
Avoid "in conclusion" statements.
|
|
62
92
|
]
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
93
|
+
`;
|
|
94
|
+
const readmeResult = await readmeOrchestrator.run(readmeTaskPrompt);
|
|
95
|
+
await readmeOrchestrator.stop();
|
|
96
|
+
if (!readmeResult.success) {
|
|
97
|
+
throw new Error(`README generation failed: ${readmeResult.status}`);
|
|
98
|
+
}
|
|
99
|
+
// Clean up markdown formatting if wrapped in code blocks
|
|
100
|
+
let resultMessage = readmeResult.result
|
|
101
|
+
.replace(/^```markdown\n?/i, '')
|
|
102
|
+
.replace(/\n?```$/i, '');
|
|
103
|
+
finalReadmeString += resultMessage + '\n' + legalInfo;
|
|
68
104
|
console.log(`\n======================\n`);
|
|
69
|
-
console.log(
|
|
105
|
+
console.log(resultMessage);
|
|
70
106
|
console.log(`\n======================\n`);
|
|
71
107
|
const readme = (await projectContext.gatherFiles()).smartfilesReadme;
|
|
72
108
|
readme.contents = Buffer.from(finalReadmeString);
|
|
@@ -77,58 +113,90 @@ The Readme should follow the following template:
|
|
|
77
113
|
logger.log('info', `Found ${Object.keys(subModules).length} sub modules`);
|
|
78
114
|
for (const subModule of Object.keys(subModules)) {
|
|
79
115
|
logger.log('info', `Building readme for ${subModule}`);
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
ALWAYS USE ESM SYNTAX AND TYPESCRIPT.
|
|
111
|
-
DON'T CHICKEN OUT. Write at least 4000 words. More if necessary.
|
|
112
|
-
If there is already a readme, take the Usage section as base. Remove outdated content, and expand and improve upon the valid parts.
|
|
113
|
-
Super important: Check for completenes.
|
|
114
|
-
Don't include any licensing information. This will be added in a later step.
|
|
115
|
-
Avoid "in conclusions".
|
|
116
|
-
|
|
117
|
-
Good to know:
|
|
118
|
-
* npmextra.json contains overall module information.
|
|
119
|
-
* readme.hints.md provides valuable hints about module ideas.
|
|
120
|
-
* Your output lands directly in the readme.md file.
|
|
121
|
-
* Don't use \`\`\` at the beginning or the end. It'll cause problems. Only use it for codeblocks. You are directly writing markdown. No need to introduce it weirdly.
|
|
122
|
-
]
|
|
123
|
-
`,
|
|
124
|
-
messageHistory: [],
|
|
125
|
-
userMessage: subModuleContextString,
|
|
116
|
+
const subModulePath = plugins.path.join(paths.cwd, subModule);
|
|
117
|
+
const tspublishData = await plugins.fsInstance
|
|
118
|
+
.file(plugins.path.join(subModulePath, 'tspublish.json'))
|
|
119
|
+
.encoding('utf8')
|
|
120
|
+
.read();
|
|
121
|
+
// Create a new orchestrator with filesystem tool for each submodule
|
|
122
|
+
const subModuleOrchestrator = new plugins.smartagent.DualAgentOrchestrator({
|
|
123
|
+
smartAiInstance: this.aiDocsRef.smartAiInstance,
|
|
124
|
+
defaultProvider: 'openai',
|
|
125
|
+
maxIterations: 20,
|
|
126
|
+
maxResultChars: 12000,
|
|
127
|
+
maxHistoryMessages: 15,
|
|
128
|
+
logPrefix: `[README:${subModule}]`,
|
|
129
|
+
onProgress: (event) => logger.log(event.logLevel, event.logMessage),
|
|
130
|
+
guardianPolicyPrompt: `
|
|
131
|
+
You validate README generation for submodules.
|
|
132
|
+
|
|
133
|
+
APPROVE tool calls for:
|
|
134
|
+
- Reading any files within the submodule directory
|
|
135
|
+
- Using tree to see structure
|
|
136
|
+
- Using glob to find source files
|
|
137
|
+
|
|
138
|
+
REJECT tool calls for:
|
|
139
|
+
- Reading files outside the submodule directory
|
|
140
|
+
- Writing, deleting, or modifying any files
|
|
141
|
+
- Any destructive operations
|
|
142
|
+
|
|
143
|
+
APPROVE final README if comprehensive, well-formatted markdown with ESM TypeScript examples.
|
|
144
|
+
REJECT incomplete READMEs or those with licensing info.
|
|
145
|
+
`,
|
|
126
146
|
});
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
147
|
+
// Register scoped filesystem tool for the submodule directory
|
|
148
|
+
subModuleOrchestrator.registerScopedFilesystemTool(subModulePath);
|
|
149
|
+
await subModuleOrchestrator.start();
|
|
150
|
+
const subModulePrompt = `
|
|
151
|
+
You create markdown READMEs for npm projects. You only output the markdown readme.
|
|
152
|
+
SUB MODULE: ${subModule}
|
|
153
|
+
SUB MODULE DIRECTORY: ${subModulePath}
|
|
154
|
+
|
|
155
|
+
IMPORTANT: YOU ARE CREATING THE README FOR THIS SUB MODULE: ${subModule}
|
|
156
|
+
The Sub Module will be published with:
|
|
157
|
+
${JSON.stringify(tspublishData, null, 2)}
|
|
158
|
+
|
|
159
|
+
Use the filesystem tool to explore the submodule:
|
|
160
|
+
1. Use tree to see the submodule structure
|
|
161
|
+
2. Read package.json to understand the submodule
|
|
162
|
+
3. Read source files in ts/ directory to understand the implementation
|
|
163
|
+
|
|
164
|
+
Generate a README following the template:
|
|
165
|
+
|
|
166
|
+
# Project Name
|
|
167
|
+
[name and description from package.json]
|
|
168
|
+
|
|
169
|
+
## Install
|
|
170
|
+
[installation instructions]
|
|
171
|
+
|
|
172
|
+
## Usage
|
|
173
|
+
[
|
|
174
|
+
Code examples with complete features.
|
|
175
|
+
ESM TypeScript syntax only.
|
|
176
|
+
Write at least 4000 words.
|
|
177
|
+
No licensing information.
|
|
178
|
+
No "in conclusion".
|
|
179
|
+
]
|
|
180
|
+
|
|
181
|
+
Don't use \`\`\` at the beginning or end. Only for code blocks.
|
|
182
|
+
`;
|
|
183
|
+
const subModuleResult = await subModuleOrchestrator.run(subModulePrompt);
|
|
184
|
+
await subModuleOrchestrator.stop();
|
|
185
|
+
if (subModuleResult.success) {
|
|
186
|
+
const subModuleReadmeString = subModuleResult.result
|
|
187
|
+
.replace(/^```markdown\n?/i, '')
|
|
188
|
+
.replace(/\n?```$/i, '') + '\n' + legalInfo;
|
|
189
|
+
await plugins.fsInstance
|
|
190
|
+
.file(plugins.path.join(subModulePath, 'readme.md'))
|
|
191
|
+
.encoding('utf8')
|
|
192
|
+
.write(subModuleReadmeString);
|
|
193
|
+
logger.log('success', `Built readme for ${subModule}`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
logger.log('error', `Failed to build readme for ${subModule}: ${subModuleResult.status}`);
|
|
197
|
+
}
|
|
130
198
|
}
|
|
131
|
-
return
|
|
199
|
+
return resultMessage;
|
|
132
200
|
}
|
|
133
201
|
}
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvcmVhZG1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE1BQU0sT0FBTyxNQUFNO0lBS2pCLFlBQVksU0FBZ0IsRUFBRSxhQUFxQjtRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFFM0IscURBQXFEO1FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUM3QixDQUFDLE1BQU0sY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUNoRixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsWUFBWSxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDM0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUN2RSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLE9BQU8s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
|
|
@@ -5,12 +5,17 @@ export declare class AiDoc {
|
|
|
5
5
|
npmextraKV: plugins.npmextra.KeyValueStore;
|
|
6
6
|
qenvInstance: plugins.qenv.Qenv;
|
|
7
7
|
aidocInteract: plugins.smartinteract.SmartInteract;
|
|
8
|
-
|
|
8
|
+
smartAiInstance: plugins.smartai.SmartAi;
|
|
9
9
|
argvArg: any;
|
|
10
10
|
constructor(argvArg?: any);
|
|
11
11
|
private printSanitizedToken;
|
|
12
12
|
start(): Promise<void>;
|
|
13
13
|
stop(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Get the OpenAI provider for direct chat calls
|
|
16
|
+
* This is a convenience getter to access the provider from SmartAi
|
|
17
|
+
*/
|
|
18
|
+
get openaiProvider(): plugins.smartai.OpenAiProvider;
|
|
14
19
|
getOpenaiToken(): string;
|
|
15
20
|
buildReadme(projectDirArg: string): Promise<string>;
|
|
16
21
|
buildDescription(projectDirArg: string): Promise<string>;
|
|
@@ -39,10 +44,9 @@ export declare class AiDoc {
|
|
|
39
44
|
*/
|
|
40
45
|
getProjectContextTokenCount(projectDirArg: string): Promise<number>;
|
|
41
46
|
/**
|
|
42
|
-
*
|
|
43
|
-
* @param text The text to
|
|
44
|
-
* @
|
|
45
|
-
* @returns The number of tokens in the text
|
|
47
|
+
* Estimate token count in a text string
|
|
48
|
+
* @param text The text to estimate tokens for
|
|
49
|
+
* @returns Estimated number of tokens
|
|
46
50
|
*/
|
|
47
|
-
countTokens(text: string
|
|
51
|
+
countTokens(text: string): number;
|
|
48
52
|
}
|
package/dist_ts/classes.aidoc.js
CHANGED
|
@@ -68,18 +68,25 @@ export class AiDoc {
|
|
|
68
68
|
this.openaiToken = await this.npmextraKV.readKey('OPENAI_TOKEN');
|
|
69
69
|
}
|
|
70
70
|
// lets assume we have an OPENAI_Token now
|
|
71
|
-
this.
|
|
71
|
+
this.smartAiInstance = new plugins.smartai.SmartAi({
|
|
72
72
|
openaiToken: this.openaiToken,
|
|
73
73
|
});
|
|
74
|
-
await this.
|
|
74
|
+
await this.smartAiInstance.start();
|
|
75
75
|
}
|
|
76
76
|
async stop() {
|
|
77
|
-
if (this.
|
|
78
|
-
await this.
|
|
77
|
+
if (this.smartAiInstance) {
|
|
78
|
+
await this.smartAiInstance.stop();
|
|
79
79
|
}
|
|
80
80
|
// No explicit cleanup needed for npmextraKV or aidocInteract
|
|
81
81
|
// They don't keep event loop alive
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Get the OpenAI provider for direct chat calls
|
|
85
|
+
* This is a convenience getter to access the provider from SmartAi
|
|
86
|
+
*/
|
|
87
|
+
get openaiProvider() {
|
|
88
|
+
return this.smartAiInstance.openaiProvider;
|
|
89
|
+
}
|
|
83
90
|
getOpenaiToken() {
|
|
84
91
|
return this.openaiToken;
|
|
85
92
|
}
|
|
@@ -120,14 +127,13 @@ export class AiDoc {
|
|
|
120
127
|
return projectContextInstance.getTokenCount();
|
|
121
128
|
}
|
|
122
129
|
/**
|
|
123
|
-
*
|
|
124
|
-
* @param text The text to
|
|
125
|
-
* @
|
|
126
|
-
* @returns The number of tokens in the text
|
|
130
|
+
* Estimate token count in a text string
|
|
131
|
+
* @param text The text to estimate tokens for
|
|
132
|
+
* @returns Estimated number of tokens
|
|
127
133
|
*/
|
|
128
|
-
countTokens(text
|
|
134
|
+
countTokens(text) {
|
|
129
135
|
const projectContextInstance = new aiDocsClasses.ProjectContext('');
|
|
130
|
-
return projectContextInstance.countTokens(text
|
|
136
|
+
return projectContextInstance.countTokens(text);
|
|
131
137
|
}
|
|
132
138
|
}
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5haWRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYWlkb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxLQUFLLGFBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUUzRCxNQUFNLE9BQU8sS0FBSztJQVVoQixZQUFZLE9BQWE7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixpRkFBaUY7UUFDakYsSUFBSSxVQUFrQixDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsbURBQW1EO1lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRSxVQUFVLEdBQUcsR0FBRyxLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixtREFBbUQ7WUFDbkQsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJ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
|