@git.zone/tsdoc 2.0.4 → 2.0.6
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/.smartconfig.json +21 -2
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/aidocs_classes/commit.d.ts +3 -0
- package/dist_ts/aidocs_classes/commit.js +122 -115
- package/dist_ts/aidocs_classes/description.js +58 -14
- package/dist_ts/aidocs_classes/projectcontext.d.ts +2 -1
- package/dist_ts/aidocs_classes/projectcontext.js +24 -8
- package/dist_ts/aidocs_classes/readme.js +28 -20
- package/dist_ts/classes.aidoc.d.ts +39 -1
- package/dist_ts/classes.aidoc.js +260 -62
- package/dist_ts/classes.diffprocessor.d.ts +1 -0
- package/dist_ts/classes.diffprocessor.js +25 -16
- package/dist_ts/classes.typedoc.js +33 -11
- package/dist_ts/cli.js +69 -11
- package/dist_ts/helpers.agenttools.d.ts +2 -0
- package/dist_ts/helpers.agenttools.js +112 -0
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +2 -1
- package/dist_ts/plugins.d.ts +5 -2
- package/dist_ts/plugins.js +6 -3
- package/package.json +11 -12
- package/readme.md +35 -14
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/aidocs_classes/commit.ts +134 -134
- package/ts/aidocs_classes/description.ts +60 -17
- package/ts/aidocs_classes/projectcontext.ts +24 -24
- package/ts/aidocs_classes/readme.ts +28 -21
- package/ts/classes.aidoc.ts +315 -63
- package/ts/classes.diffprocessor.ts +23 -13
- package/ts/classes.typedoc.ts +35 -12
- package/ts/cli.ts +72 -10
- package/ts/helpers.agenttools.ts +125 -0
- package/ts/index.ts +1 -0
- package/ts/plugins.ts +6 -1
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
|
-
import * as paths from '../paths.js';
|
|
3
2
|
import { ProjectContext } from './projectcontext.js';
|
|
4
3
|
import { logger } from '../logging.js';
|
|
4
|
+
import { createReadOnlyFileSystemTools } from '../helpers.agenttools.js';
|
|
5
|
+
const getLegalInfo = (smartconfigJson) => {
|
|
6
|
+
return smartconfigJson?.['@git.zone/tsdoc']?.legal ?? smartconfigJson?.tsdoc?.legal;
|
|
7
|
+
};
|
|
5
8
|
export class Readme {
|
|
6
9
|
constructor(aiDocsRef, projectDirArg) {
|
|
7
10
|
this.aiDocsRef = aiDocsRef;
|
|
@@ -11,14 +14,15 @@ export class Readme {
|
|
|
11
14
|
let finalReadmeString = ``;
|
|
12
15
|
// First check legal info before introducing any cost
|
|
13
16
|
const projectContext = new ProjectContext(this.projectDir);
|
|
14
|
-
const
|
|
15
|
-
const
|
|
17
|
+
const smartconfigFile = (await projectContext.gatherFiles()).smartfilesSmartconfigJSON;
|
|
18
|
+
const smartconfigJson = smartconfigFile.contents.length > 0
|
|
19
|
+
? JSON.parse(smartconfigFile.contents.toString())
|
|
20
|
+
: {};
|
|
21
|
+
const legalInfo = getLegalInfo(smartconfigJson);
|
|
16
22
|
if (!legalInfo) {
|
|
17
|
-
|
|
18
|
-
console.log(error);
|
|
23
|
+
throw new Error('No legal information found in .smartconfig.json under @git.zone/tsdoc.legal or tsdoc.legal.');
|
|
19
24
|
}
|
|
20
|
-
|
|
21
|
-
const fsTools = plugins.smartagentTools.filesystemTool({ rootDir: this.projectDir });
|
|
25
|
+
const fsTools = createReadOnlyFileSystemTools(this.projectDir);
|
|
22
26
|
const readmeSystemPrompt = `
|
|
23
27
|
You create markdown READMEs for npm projects. You only output the markdown readme.
|
|
24
28
|
|
|
@@ -30,7 +34,7 @@ IMPORTANT RULES:
|
|
|
30
34
|
- README must follow proper markdown format
|
|
31
35
|
- Must contain Install and Usage sections
|
|
32
36
|
- Code examples must use correct TypeScript/ESM syntax
|
|
33
|
-
- Documentation must be comprehensive and helpful
|
|
37
|
+
- Documentation must be comprehensive and helpful without unnecessary filler
|
|
34
38
|
- Do NOT include licensing information (added separately)
|
|
35
39
|
- Do NOT use CommonJS syntax - only ESM
|
|
36
40
|
- Do NOT include "in conclusion" or similar filler
|
|
@@ -43,7 +47,7 @@ Use the filesystem tools to explore the project and understand what it does:
|
|
|
43
47
|
2. Read package.json to understand the package name, description, and dependencies
|
|
44
48
|
3. Read the existing readme.md if it exists (use it as a base, improve and expand)
|
|
45
49
|
4. Read readme.hints.md if it exists (contains hints for documentation)
|
|
46
|
-
5. Read key source files in ts/
|
|
50
|
+
5. Read key source files in ts/ and ts_web/ directories to understand the API and implementation
|
|
47
51
|
6. Focus on exported classes, interfaces, and functions
|
|
48
52
|
|
|
49
53
|
Then generate a comprehensive README following this template:
|
|
@@ -61,7 +65,7 @@ Then generate a comprehensive README following this template:
|
|
|
61
65
|
Make sure to show a complete set of features of the module.
|
|
62
66
|
Don't omit use cases.
|
|
63
67
|
ALWAYS USE ESM SYNTAX AND TYPESCRIPT.
|
|
64
|
-
|
|
68
|
+
Size the documentation to the actual project. Do not pad with filler.
|
|
65
69
|
If there is already a readme, take the Usage section as base. Remove outdated content, expand and improve.
|
|
66
70
|
Check for completeness.
|
|
67
71
|
Don't include any licensing information. This will be added later.
|
|
@@ -69,12 +73,14 @@ Then generate a comprehensive README following this template:
|
|
|
69
73
|
]
|
|
70
74
|
`;
|
|
71
75
|
logger.log('info', 'Starting README generation with agent...');
|
|
72
|
-
const readmeResult = await
|
|
73
|
-
|
|
76
|
+
const readmeResult = await this.aiDocsRef.runAgent({
|
|
77
|
+
taskName: 'readme',
|
|
78
|
+
projectDir: this.projectDir,
|
|
74
79
|
prompt: readmeTaskPrompt,
|
|
75
80
|
system: readmeSystemPrompt,
|
|
76
81
|
tools: fsTools,
|
|
77
82
|
maxSteps: 25,
|
|
83
|
+
useCompaction: true,
|
|
78
84
|
onToolCall: (toolName) => logger.log('info', `[README] Tool call: ${toolName}`),
|
|
79
85
|
});
|
|
80
86
|
// Clean up markdown formatting if wrapped in code blocks
|
|
@@ -90,23 +96,23 @@ Then generate a comprehensive README following this template:
|
|
|
90
96
|
await readme.write();
|
|
91
97
|
// lets care about monorepo aspects
|
|
92
98
|
const tsPublishInstance = new plugins.tspublish.TsPublish();
|
|
93
|
-
const subModules = await tsPublishInstance.getModuleSubDirs(
|
|
99
|
+
const subModules = await tsPublishInstance.getModuleSubDirs(this.projectDir);
|
|
94
100
|
logger.log('info', `Found ${Object.keys(subModules).length} sub modules`);
|
|
95
101
|
for (const subModule of Object.keys(subModules)) {
|
|
96
102
|
logger.log('info', `Building readme for ${subModule}`);
|
|
97
|
-
const subModulePath = plugins.path.join(
|
|
103
|
+
const subModulePath = plugins.path.join(this.projectDir, subModule);
|
|
98
104
|
const tspublishData = await plugins.fsInstance
|
|
99
105
|
.file(plugins.path.join(subModulePath, 'tspublish.json'))
|
|
100
106
|
.encoding('utf8')
|
|
101
107
|
.read();
|
|
102
|
-
const subModuleFsTools =
|
|
108
|
+
const subModuleFsTools = createReadOnlyFileSystemTools(subModulePath);
|
|
103
109
|
const subModuleSystemPrompt = `
|
|
104
110
|
You create markdown READMEs for npm projects. You only output the markdown readme.
|
|
105
111
|
|
|
106
112
|
IMPORTANT RULES:
|
|
107
113
|
- Only READ files within the submodule directory
|
|
108
114
|
- Do NOT write, delete, or modify any files
|
|
109
|
-
- README must be comprehensive, well-formatted markdown with ESM TypeScript examples
|
|
115
|
+
- README must be comprehensive, well-formatted markdown with ESM TypeScript examples and no filler
|
|
110
116
|
- Do NOT include licensing information (added separately)
|
|
111
117
|
`;
|
|
112
118
|
const subModulePrompt = `
|
|
@@ -134,19 +140,21 @@ Generate a README following the template:
|
|
|
134
140
|
[
|
|
135
141
|
Code examples with complete features.
|
|
136
142
|
ESM TypeScript syntax only.
|
|
137
|
-
|
|
143
|
+
Size the documentation to the submodule. Do not pad with filler.
|
|
138
144
|
No licensing information.
|
|
139
145
|
No "in conclusion".
|
|
140
146
|
]
|
|
141
147
|
|
|
142
148
|
Don't use \`\`\` at the beginning or end. Only for code blocks.
|
|
143
149
|
`;
|
|
144
|
-
const subModuleResult = await
|
|
145
|
-
|
|
150
|
+
const subModuleResult = await this.aiDocsRef.runAgent({
|
|
151
|
+
taskName: `readme:${subModule}`,
|
|
152
|
+
projectDir: subModulePath,
|
|
146
153
|
prompt: subModulePrompt,
|
|
147
154
|
system: subModuleSystemPrompt,
|
|
148
155
|
tools: subModuleFsTools,
|
|
149
156
|
maxSteps: 20,
|
|
157
|
+
useCompaction: true,
|
|
150
158
|
onToolCall: (toolName) => logger.log('info', `[README:${subModule}] Tool call: ${toolName}`),
|
|
151
159
|
});
|
|
152
160
|
const subModuleReadmeString = subModuleResult.text
|
|
@@ -161,4 +169,4 @@ Don't use \`\`\` at the beginning or end. Only for code blocks.
|
|
|
161
169
|
return resultMessage;
|
|
162
170
|
}
|
|
163
171
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvcmVhZG1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpFLE1BQU0sWUFBWSxHQUFHLENBQUMsZUFBb0IsRUFBc0IsRUFBRTtJQUNoRSxPQUFPLGVBQWUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxJQUFJLGVBQWUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO0FBQ3RGLENBQUMsQ0FBQztBQUVGLE1BQU0sT0FBTyxNQUFNO0lBS2pCLFlBQVksU0FBZ0IsRUFBRSxhQUFxQjtRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFFM0IscURBQXFEO1FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxNQUFNLGVBQWUsR0FBRyxDQUFDLE1BQU0sY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMseUJBQXlCLENBQUM7UUFDdkYsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUN6RCxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pELENBQUMsQ0FBQyxF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
|
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import * as aiDocsClasses from './aidocs_classes/index.js';
|
|
3
|
+
export type TAiDocAuthMode = 'auto' | 'chatgpt' | 'apiKey';
|
|
4
|
+
export interface IAiDocConfig {
|
|
5
|
+
provider?: plugins.smartai.TProvider;
|
|
6
|
+
model?: string;
|
|
7
|
+
authMode?: TAiDocAuthMode;
|
|
8
|
+
chatGptAuthSources?: plugins.smartaiOpenAiChatGptAuth.TOpenAiChatGptAuthSource[];
|
|
9
|
+
chatGptAuthWriteBack?: Partial<Record<plugins.smartaiOpenAiChatGptAuth.TOpenAiChatGptAuthSource, boolean>>;
|
|
10
|
+
providerOptions?: plugins.smartai.TSmartAiProviderOptions;
|
|
11
|
+
cache?: plugins.smartagent.TAgentCacheSetting;
|
|
12
|
+
promptCaching?: boolean | plugins.smartai.ISmartAiCacheOptions;
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
ollamaOptions?: plugins.smartai.IOllamaModelOptions;
|
|
16
|
+
}
|
|
17
|
+
export interface IAiDocResolvedConfig extends Required<Pick<IAiDocConfig, 'provider' | 'model' | 'authMode' | 'chatGptAuthSources'>> {
|
|
18
|
+
chatGptAuthWriteBack: Partial<Record<plugins.smartaiOpenAiChatGptAuth.TOpenAiChatGptAuthSource, boolean>>;
|
|
19
|
+
providerOptions?: plugins.smartai.TSmartAiProviderOptions;
|
|
20
|
+
cache: plugins.smartagent.TAgentCacheSetting;
|
|
21
|
+
promptCaching?: boolean | plugins.smartai.ISmartAiCacheOptions;
|
|
22
|
+
apiKey?: string;
|
|
23
|
+
baseUrl?: string;
|
|
24
|
+
ollamaOptions?: plugins.smartai.IOllamaModelOptions;
|
|
25
|
+
}
|
|
26
|
+
export declare const defaultAiDocConfig: IAiDocResolvedConfig;
|
|
3
27
|
export declare class AiDoc {
|
|
4
28
|
private openaiToken;
|
|
5
29
|
smartconfigKV?: plugins.smartconfig.KeyValueStore<{
|
|
@@ -8,12 +32,26 @@ export declare class AiDoc {
|
|
|
8
32
|
qenvInstance: plugins.qenv.Qenv;
|
|
9
33
|
aidocInteract: plugins.smartinteract.SmartInteract;
|
|
10
34
|
model: plugins.smartai.LanguageModelV3;
|
|
35
|
+
providerOptions?: plugins.smartai.TSmartAiProviderOptions;
|
|
36
|
+
config: IAiDocResolvedConfig;
|
|
37
|
+
selectedAuthSource: string;
|
|
11
38
|
argvArg: any;
|
|
12
39
|
constructor(argvArg?: any);
|
|
13
|
-
private
|
|
40
|
+
private get isInteractive();
|
|
41
|
+
private migrateKeyValueStore;
|
|
42
|
+
private getStoredOpenAiToken;
|
|
43
|
+
private resolveApiKey;
|
|
44
|
+
private promptForOpenAiToken;
|
|
45
|
+
private runChatGptDeviceLogin;
|
|
46
|
+
private resolveConfig;
|
|
14
47
|
start(): Promise<void>;
|
|
15
48
|
stop(): Promise<void>;
|
|
16
49
|
getOpenaiToken(): string;
|
|
50
|
+
runAgent(options: Omit<plugins.smartagent.IAgentRunOptions, 'model'> & {
|
|
51
|
+
projectDir: string;
|
|
52
|
+
taskName: string;
|
|
53
|
+
useCompaction?: boolean;
|
|
54
|
+
}): Promise<plugins.smartagent.IAgentRunResult>;
|
|
17
55
|
buildReadme(projectDirArg: string): Promise<string>;
|
|
18
56
|
buildDescription(projectDirArg: string): Promise<string>;
|
|
19
57
|
buildNextCommitObject(projectDirArg: string): Promise<aiDocsClasses.INextCommitObject>;
|
package/dist_ts/classes.aidoc.js
CHANGED
|
@@ -1,83 +1,260 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
2
|
import * as aiDocsClasses from './aidocs_classes/index.js';
|
|
3
|
+
import { logger } from './logging.js';
|
|
4
|
+
export const defaultAiDocConfig = {
|
|
5
|
+
provider: 'openai',
|
|
6
|
+
model: 'gpt-5.5',
|
|
7
|
+
authMode: 'auto',
|
|
8
|
+
chatGptAuthSources: ['opencode', 'codex', 'smartai'],
|
|
9
|
+
chatGptAuthWriteBack: {
|
|
10
|
+
smartai: true,
|
|
11
|
+
opencode: false,
|
|
12
|
+
codex: false,
|
|
13
|
+
},
|
|
14
|
+
providerOptions: {
|
|
15
|
+
openai: {
|
|
16
|
+
reasoningEffort: 'xhigh',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
cache: 'auto',
|
|
20
|
+
};
|
|
21
|
+
const isPlainObject = (value) => {
|
|
22
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
23
|
+
};
|
|
24
|
+
const mergeProviderOptions = (base, override) => {
|
|
25
|
+
if (!base && !override)
|
|
26
|
+
return undefined;
|
|
27
|
+
const result = { ...(base ?? {}) };
|
|
28
|
+
for (const [provider, options] of Object.entries(override ?? {})) {
|
|
29
|
+
result[provider] = {
|
|
30
|
+
...(isPlainObject(result[provider]) ? result[provider] : {}),
|
|
31
|
+
...(isPlainObject(options) ? options : {}),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
const normalizeAuthMode = (value) => {
|
|
37
|
+
return value === 'auto' || value === 'chatgpt' || value === 'apiKey' ? value : undefined;
|
|
38
|
+
};
|
|
39
|
+
const normalizeProvider = (value) => {
|
|
40
|
+
return ['anthropic', 'openai', 'google', 'groq', 'mistral', 'xai', 'perplexity', 'ollama'].includes(String(value))
|
|
41
|
+
? value
|
|
42
|
+
: undefined;
|
|
43
|
+
};
|
|
44
|
+
const normalizeChatGptSources = (value) => {
|
|
45
|
+
const input = typeof value === 'string' ? value.split(',').map(source => source.trim()) : value;
|
|
46
|
+
if (!Array.isArray(input))
|
|
47
|
+
return undefined;
|
|
48
|
+
const sources = input.filter((source) => {
|
|
49
|
+
return source === 'opencode' || source === 'codex' || source === 'smartai';
|
|
50
|
+
});
|
|
51
|
+
return sources.length > 0 ? sources : undefined;
|
|
52
|
+
};
|
|
53
|
+
const normalizeOpenAiReasoningEffort = (value) => {
|
|
54
|
+
return ['none', 'minimal', 'low', 'medium', 'high', 'xhigh'].includes(String(value))
|
|
55
|
+
? value
|
|
56
|
+
: undefined;
|
|
57
|
+
};
|
|
58
|
+
const getProjectTsdocConfig = async (projectDirArg) => {
|
|
59
|
+
const smartconfigPath = plugins.path.join(projectDirArg, '.smartconfig.json');
|
|
60
|
+
if (!(await plugins.fsInstance.file(smartconfigPath).exists())) {
|
|
61
|
+
return {};
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const smartconfigJson = JSON.parse(String(await plugins.fsInstance.file(smartconfigPath).encoding('utf8').read()));
|
|
65
|
+
const legacyConfig = isPlainObject(smartconfigJson.tsdoc) ? smartconfigJson.tsdoc : {};
|
|
66
|
+
const namespacedConfig = isPlainObject(smartconfigJson['@git.zone/tsdoc']) ? smartconfigJson['@git.zone/tsdoc'] : {};
|
|
67
|
+
const config = {
|
|
68
|
+
...legacyConfig,
|
|
69
|
+
...namespacedConfig,
|
|
70
|
+
...(isPlainObject(legacyConfig.ai) ? legacyConfig.ai : {}),
|
|
71
|
+
...(isPlainObject(namespacedConfig.ai) ? namespacedConfig.ai : {}),
|
|
72
|
+
};
|
|
73
|
+
return config;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
throw new Error(`Could not parse .smartconfig.json: ${error instanceof Error ? error.message : String(error)}`);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
3
79
|
export class AiDoc {
|
|
4
80
|
constructor(argvArg) {
|
|
5
81
|
this.openaiToken = '';
|
|
82
|
+
this.config = defaultAiDocConfig;
|
|
83
|
+
this.selectedAuthSource = 'none';
|
|
6
84
|
this.argvArg = argvArg;
|
|
7
85
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
86
|
+
get isInteractive() {
|
|
87
|
+
return process.stdin.isTTY === true && process.stdout.isTTY === true && !this.argvArg?.ci && !this.argvArg?.json;
|
|
88
|
+
}
|
|
89
|
+
async migrateKeyValueStore() {
|
|
90
|
+
const homeDir = plugins.smartpath.get.home();
|
|
91
|
+
const oldKvPath = plugins.path.join(homeDir, '.smartconfig/kv/tsdoc.json');
|
|
92
|
+
const newKvDir = plugins.path.join(homeDir, '.smartconfig/kv/@git.zone');
|
|
93
|
+
const newKvPath = plugins.path.join(newKvDir, 'tsdoc.json');
|
|
94
|
+
if (await plugins.fsInstance.file(oldKvPath).exists() &&
|
|
95
|
+
!(await plugins.fsInstance.file(newKvPath).exists())) {
|
|
96
|
+
logger.log('info', 'Migrating tsdoc KeyValueStore to @git.zone/tsdoc...');
|
|
97
|
+
await plugins.fsInstance.directory(newKvDir).recursive().create();
|
|
98
|
+
await plugins.fsInstance.file(oldKvPath).copy(newKvPath);
|
|
99
|
+
await plugins.fsInstance.file(oldKvPath).delete();
|
|
100
|
+
logger.log('success', 'Migration complete: tsdoc.json -> @git.zone/tsdoc.json');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async getStoredOpenAiToken() {
|
|
104
|
+
if (!this.smartconfigKV)
|
|
105
|
+
return undefined;
|
|
106
|
+
try {
|
|
107
|
+
const token = await this.smartconfigKV.readKey('OPENAI_TOKEN');
|
|
108
|
+
return token || undefined;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async resolveApiKey(provider) {
|
|
115
|
+
const argvToken = this.argvArg?.OPENAI_TOKEN || this.argvArg?.OPENAI_API_KEY || this.argvArg?.apiKey;
|
|
116
|
+
if (argvToken)
|
|
117
|
+
return argvToken;
|
|
118
|
+
if (this.config.apiKey)
|
|
119
|
+
return this.config.apiKey;
|
|
120
|
+
const envNames = provider === 'openai'
|
|
121
|
+
? ['OPENAI_TOKEN', 'OPENAI_API_KEY']
|
|
122
|
+
: [`${provider.toUpperCase()}_TOKEN`, `${provider.toUpperCase()}_API_KEY`];
|
|
123
|
+
for (const envName of envNames) {
|
|
124
|
+
const value = await this.qenvInstance.getEnvVarOnDemand(envName);
|
|
125
|
+
if (value)
|
|
126
|
+
return value;
|
|
127
|
+
}
|
|
128
|
+
if (provider === 'openai') {
|
|
129
|
+
const storedToken = await this.getStoredOpenAiToken();
|
|
130
|
+
if (storedToken)
|
|
131
|
+
return storedToken;
|
|
132
|
+
}
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
async promptForOpenAiToken() {
|
|
136
|
+
if (!this.isInteractive) {
|
|
137
|
+
throw new Error('OpenAI API key is required. Set OPENAI_TOKEN/OPENAI_API_KEY or configure ChatGPT subscription auth.');
|
|
16
138
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
139
|
+
await plugins.smartdelay.delayFor(1000);
|
|
140
|
+
const answerObject = await this.aidocInteract.askQuestion({
|
|
141
|
+
type: 'input',
|
|
142
|
+
message: 'Please provide your OpenAI token. This will be persisted in your home directory.',
|
|
143
|
+
name: 'OPENAI_TOKEN',
|
|
144
|
+
default: '',
|
|
145
|
+
});
|
|
146
|
+
const token = answerObject.value;
|
|
147
|
+
await this.smartconfigKV?.writeKey('OPENAI_TOKEN', token);
|
|
148
|
+
return token;
|
|
149
|
+
}
|
|
150
|
+
async runChatGptDeviceLogin() {
|
|
151
|
+
if (!this.isInteractive) {
|
|
152
|
+
throw new Error('ChatGPT subscription auth is required, but no usable auth file was found in non-interactive mode.');
|
|
20
153
|
}
|
|
21
|
-
|
|
154
|
+
const deviceCode = await plugins.smartai.requestOpenAiChatGptDeviceCode();
|
|
155
|
+
console.log(`Open ${deviceCode.verificationUrl} and enter code ${deviceCode.userCode}`);
|
|
156
|
+
const tokenData = await plugins.smartai.completeOpenAiChatGptDeviceCodeLogin(deviceCode);
|
|
157
|
+
const authFilePath = plugins.smartaiOpenAiChatGptAuth.getDefaultOpenAiChatGptAuthPath('smartai');
|
|
158
|
+
await plugins.smartaiOpenAiChatGptAuth.writeOpenAiChatGptAuthFile(authFilePath, tokenData, 'smartai');
|
|
159
|
+
return tokenData;
|
|
160
|
+
}
|
|
161
|
+
async resolveConfig() {
|
|
162
|
+
const projectConfig = await getProjectTsdocConfig(process.cwd());
|
|
163
|
+
const envProvider = normalizeProvider(await this.qenvInstance.getEnvVarOnDemand('TSDOC_AI_PROVIDER'));
|
|
164
|
+
const envModel = await this.qenvInstance.getEnvVarOnDemand('TSDOC_AI_MODEL');
|
|
165
|
+
const envAuthMode = normalizeAuthMode(await this.qenvInstance.getEnvVarOnDemand('TSDOC_AUTH_MODE'));
|
|
166
|
+
const envChatGptSources = normalizeChatGptSources(await this.qenvInstance.getEnvVarOnDemand('TSDOC_CHATGPT_AUTH_SOURCES'));
|
|
167
|
+
const envReasoningEffort = normalizeOpenAiReasoningEffort(await this.qenvInstance.getEnvVarOnDemand('TSDOC_OPENAI_REASONING_EFFORT'));
|
|
168
|
+
const envProviderOptions = envReasoningEffort ? {
|
|
169
|
+
openai: {
|
|
170
|
+
reasoningEffort: envReasoningEffort,
|
|
171
|
+
},
|
|
172
|
+
} : undefined;
|
|
173
|
+
const argvConfig = {
|
|
174
|
+
provider: normalizeProvider(this.argvArg?.provider),
|
|
175
|
+
model: typeof this.argvArg?.model === 'string' ? this.argvArg.model : undefined,
|
|
176
|
+
authMode: normalizeAuthMode(this.argvArg?.authMode),
|
|
177
|
+
chatGptAuthSources: normalizeChatGptSources(this.argvArg?.chatGptAuthSources),
|
|
178
|
+
};
|
|
179
|
+
const provider = argvConfig.provider ?? envProvider ?? normalizeProvider(projectConfig.provider) ?? defaultAiDocConfig.provider;
|
|
180
|
+
const model = argvConfig.model ?? envModel ?? projectConfig.model ?? defaultAiDocConfig.model;
|
|
181
|
+
const authMode = argvConfig.authMode ?? envAuthMode ?? normalizeAuthMode(projectConfig.authMode) ?? defaultAiDocConfig.authMode;
|
|
182
|
+
const chatGptAuthSources = argvConfig.chatGptAuthSources
|
|
183
|
+
?? envChatGptSources
|
|
184
|
+
?? normalizeChatGptSources(projectConfig.chatGptAuthSources)
|
|
185
|
+
?? defaultAiDocConfig.chatGptAuthSources;
|
|
186
|
+
const providerOptions = mergeProviderOptions(mergeProviderOptions(defaultAiDocConfig.providerOptions, projectConfig.providerOptions), envProviderOptions);
|
|
187
|
+
return {
|
|
188
|
+
...defaultAiDocConfig,
|
|
189
|
+
...projectConfig,
|
|
190
|
+
provider,
|
|
191
|
+
model,
|
|
192
|
+
authMode,
|
|
193
|
+
chatGptAuthSources,
|
|
194
|
+
chatGptAuthWriteBack: {
|
|
195
|
+
...defaultAiDocConfig.chatGptAuthWriteBack,
|
|
196
|
+
...(projectConfig.chatGptAuthWriteBack ?? {}),
|
|
197
|
+
},
|
|
198
|
+
providerOptions,
|
|
199
|
+
cache: projectConfig.cache ?? defaultAiDocConfig.cache,
|
|
200
|
+
};
|
|
22
201
|
}
|
|
23
202
|
async start() {
|
|
24
|
-
// lets care about prerequisites
|
|
25
203
|
this.aidocInteract = new plugins.smartinteract.SmartInteract();
|
|
26
204
|
this.qenvInstance = new plugins.qenv.Qenv();
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
205
|
+
await this.migrateKeyValueStore();
|
|
206
|
+
this.smartconfigKV = new plugins.smartconfig.KeyValueStore({
|
|
207
|
+
typeArg: 'userHomeDir',
|
|
208
|
+
identityArg: '@git.zone/tsdoc',
|
|
209
|
+
mandatoryKeys: ['OPENAI_TOKEN'],
|
|
210
|
+
});
|
|
211
|
+
this.config = await this.resolveConfig();
|
|
212
|
+
let openAiChatGptAuth;
|
|
213
|
+
if (this.config.provider === 'openai' && this.config.authMode !== 'apiKey') {
|
|
214
|
+
const resolvedAuth = await plugins.smartaiOpenAiChatGptAuth.resolveOpenAiChatGptAuth({
|
|
215
|
+
sources: this.config.chatGptAuthSources,
|
|
216
|
+
refresh: 'ifNeeded',
|
|
217
|
+
writeBack: this.config.chatGptAuthWriteBack,
|
|
218
|
+
});
|
|
219
|
+
if (resolvedAuth) {
|
|
220
|
+
openAiChatGptAuth = resolvedAuth.tokenData;
|
|
221
|
+
this.selectedAuthSource = resolvedAuth.source;
|
|
222
|
+
logger.log('info', `Using OpenAI ChatGPT auth from ${resolvedAuth.source}.`);
|
|
223
|
+
}
|
|
224
|
+
else if (this.config.authMode === 'chatgpt') {
|
|
225
|
+
openAiChatGptAuth = await this.runChatGptDeviceLogin();
|
|
226
|
+
this.selectedAuthSource = 'smartai';
|
|
227
|
+
}
|
|
30
228
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (await plugins.fsInstance.file(oldKvPath).exists() &&
|
|
38
|
-
!(await plugins.fsInstance.file(newKvPath).exists())) {
|
|
39
|
-
console.log('Migrating tsdoc KeyValueStore to @git.zone/tsdoc...');
|
|
40
|
-
await plugins.fsInstance.directory(newKvDir).recursive().create();
|
|
41
|
-
await plugins.fsInstance.file(oldKvPath).copy(newKvPath);
|
|
42
|
-
await plugins.fsInstance.file(oldKvPath).delete();
|
|
43
|
-
console.log('Migration complete: tsdoc.json -> @git.zone/tsdoc.json');
|
|
229
|
+
let apiKey;
|
|
230
|
+
if (!openAiChatGptAuth) {
|
|
231
|
+
apiKey = await this.resolveApiKey(this.config.provider);
|
|
232
|
+
if (!apiKey && this.config.provider === 'openai' && this.config.authMode === 'auto' && this.isInteractive) {
|
|
233
|
+
openAiChatGptAuth = await this.runChatGptDeviceLogin();
|
|
234
|
+
this.selectedAuthSource = 'smartai';
|
|
44
235
|
}
|
|
45
|
-
this.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
// lets try argv
|
|
53
|
-
if (this.argvArg?.OPENAI_TOKEN) {
|
|
54
|
-
this.openaiToken = this.argvArg.OPENAI_TOKEN;
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
// lets try smartinteract
|
|
58
|
-
// wait for a second until OpenAI fixes punycode problem...
|
|
59
|
-
await plugins.smartdelay.delayFor(1000);
|
|
60
|
-
const answerObject = await this.aidocInteract.askQuestion({
|
|
61
|
-
type: 'input',
|
|
62
|
-
message: `Please provide your OpenAI token. This will be persisted in your home directory.`,
|
|
63
|
-
name: 'OPENAI_TOKEN',
|
|
64
|
-
default: '',
|
|
65
|
-
});
|
|
66
|
-
this.openaiToken = answerObject.value;
|
|
236
|
+
if (!apiKey && !openAiChatGptAuth && this.config.provider === 'openai' && this.config.authMode !== 'chatgpt') {
|
|
237
|
+
apiKey = await this.promptForOpenAiToken();
|
|
238
|
+
}
|
|
239
|
+
if (apiKey) {
|
|
240
|
+
this.selectedAuthSource = 'apiKey';
|
|
241
|
+
if (this.config.provider === 'openai') {
|
|
242
|
+
this.openaiToken = apiKey;
|
|
67
243
|
}
|
|
68
|
-
this.printSanitizedToken();
|
|
69
|
-
await this.smartconfigKV.writeKey('OPENAI_TOKEN', this.openaiToken);
|
|
70
244
|
}
|
|
71
245
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
246
|
+
const setup = plugins.smartai.getModelSetup({
|
|
247
|
+
provider: this.config.provider,
|
|
248
|
+
model: this.config.model,
|
|
249
|
+
apiKey,
|
|
250
|
+
openAiChatGptAuth,
|
|
251
|
+
providerOptions: this.config.providerOptions,
|
|
252
|
+
promptCaching: this.config.promptCaching,
|
|
253
|
+
baseUrl: this.config.baseUrl,
|
|
254
|
+
ollamaOptions: this.config.ollamaOptions,
|
|
80
255
|
});
|
|
256
|
+
this.model = setup.model;
|
|
257
|
+
this.providerOptions = setup.providerOptions;
|
|
81
258
|
}
|
|
82
259
|
async stop() {
|
|
83
260
|
// No lifecycle management needed with getModel() API
|
|
@@ -85,6 +262,27 @@ export class AiDoc {
|
|
|
85
262
|
getOpenaiToken() {
|
|
86
263
|
return this.openaiToken;
|
|
87
264
|
}
|
|
265
|
+
async runAgent(options) {
|
|
266
|
+
const providerOptions = this.config.provider === 'openai' && this.selectedAuthSource !== 'apiKey' && options.system
|
|
267
|
+
? mergeProviderOptions(this.providerOptions, {
|
|
268
|
+
openai: {
|
|
269
|
+
instructions: options.system,
|
|
270
|
+
},
|
|
271
|
+
})
|
|
272
|
+
: this.providerOptions;
|
|
273
|
+
const result = await plugins.smartagent.runAgent({
|
|
274
|
+
...options,
|
|
275
|
+
model: this.model,
|
|
276
|
+
providerOptions,
|
|
277
|
+
cache: this.config.cache,
|
|
278
|
+
sessionId: options.sessionId ?? `tsdoc:${options.taskName}:${plugins.path.resolve(options.projectDir)}`,
|
|
279
|
+
onContextOverflow: options.useCompaction
|
|
280
|
+
? async (messages) => plugins.smartagentCompaction.compactMessages(this.model, messages)
|
|
281
|
+
: options.onContextOverflow,
|
|
282
|
+
});
|
|
283
|
+
logger.log('info', `[${options.taskName}] tokens input=${result.usage.inputTokens} output=${result.usage.outputTokens} total=${result.usage.totalTokens} cacheRead=${result.usage.cacheReadTokens} cacheWrite=${result.usage.cacheWriteTokens}`);
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
88
286
|
async buildReadme(projectDirArg) {
|
|
89
287
|
const readmeInstance = new aiDocsClasses.Readme(this, projectDirArg);
|
|
90
288
|
return await readmeInstance.build();
|
|
@@ -131,4 +329,4 @@ export class AiDoc {
|
|
|
131
329
|
return projectContextInstance.countTokens(text);
|
|
132
330
|
}
|
|
133
331
|
}
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5haWRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYWlkb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxLQUFLLGFBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUUzRCxNQUFNLE9BQU8sS0FBSztJQVVoQixZQUFZLE9BQWE7UUFUakIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFVdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixpRkFBaUY7UUFDakYsSUFBSSxVQUFrQixDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsbURBQW1EO1lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRSxVQUFVLEdBQUcsR0FBRyxLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixtREFBbUQ7WUFDbkQsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxHQUFH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
|
|
332
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5haWRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYWlkb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxLQUFLLGFBQWEsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBOEJ0QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBeUI7SUFDdEQsUUFBUSxFQUFFLFFBQVE7SUFDbEIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsUUFBUSxFQUFFLE1BQU07SUFDaEIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQztJQUNwRCxvQkFBb0IsRUFBRTtRQUNwQixPQUFPLEVBQUUsSUFBSTtRQUNiLFFBQVEsRUFBRSxLQUFLO1FBQ2YsS0FBSyxFQUFFLEtBQUs7S0FDYjtJQUNELGVBQWUsRUFBRTtRQUNmLE1BQU0sRUFBRTtZQUNOLGVBQWUsRUFBRSxPQUFPO1NBQ3pCO0tBQ0Y7SUFDRCxLQUFLLEVBQUUsTUFBTTtDQUNkLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWMsRUFBZ0MsRUFBRTtJQUNyRSxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDLENBQUM7QUFFRixNQUFNLG9CQUFvQixHQUFHLENBQzNCLElBQThDLEVBQzlDLFFBQWtELEVBQ0csRUFBRTtJQUN2RCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUF3QixFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN4RCxLQUFLLE1B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
|