@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.
@@ -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 smartconfigJson = JSON.parse((await projectContext.gatherFiles()).smartfilesSmartconfigJSON.contents.toString());
15
- const legalInfo = smartconfigJson?.['tsdoc']?.legal;
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
- const error = new Error(`No legal information found in .smartconfig.json`);
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
- // Use runAgent with filesystem tool for agent-driven exploration
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/ directory to understand the API and implementation
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
- Write at least 4000 words. More if necessary.
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 plugins.smartagent.runAgent({
73
- model: this.aiDocsRef.model,
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(paths.cwd);
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(paths.cwd, subModule);
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 = plugins.smartagentTools.filesystemTool({ rootDir: subModulePath });
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
- Write at least 4000 words.
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 plugins.smartagent.runAgent({
145
- model: this.aiDocsRef.model,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvYWlkb2NzX2NsYXNzZXMvcmVhZG1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE1BQU0sT0FBTyxNQUFNO0lBS2pCLFlBQVksU0FBZ0IsRUFBRSxhQUFxQjtRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUs7UUFDaEIsSUFBSSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFFM0IscURBQXFEO1FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNoQyxDQUFDLE1BQU0sY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMseUJBQXlCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUNuRixDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsZUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7WUFDM0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBRUQsaUVBQWlFO1FBQ2pFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxlQUFl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
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 printSanitizedToken;
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>;
@@ -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
- printSanitizedToken() {
9
- // Check if the token length is greater than the sum of startLength and endLength
10
- let printToken;
11
- if (this.openaiToken.length > 6) {
12
- // Extract the beginning and end parts of the token
13
- const start = this.openaiToken.substring(0, 3);
14
- const end = this.openaiToken.substring(this.openaiToken.length - 3);
15
- printToken = `${start}...${end}`;
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
- else {
18
- // If the token is not long enough, return it as is
19
- printToken = this.openaiToken;
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
- console.log(`OpenAI Token on record: ${printToken}`);
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
- const openaiTokenFromEnv = await this.qenvInstance.getEnvVarOnDemand('OPENAI_TOKEN');
28
- if (openaiTokenFromEnv) {
29
- this.openaiToken = openaiTokenFromEnv;
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
- else {
32
- // Migrate old KV store path to new path if needed
33
- const homeDir = plugins.smartpath.get.home();
34
- const oldKvPath = plugins.path.join(homeDir, '.smartconfig/kv/tsdoc.json');
35
- const newKvDir = plugins.path.join(homeDir, '.smartconfig/kv/@git.zone');
36
- const newKvPath = plugins.path.join(newKvDir, 'tsdoc.json');
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.smartconfigKV = new plugins.smartconfig.KeyValueStore({
46
- typeArg: 'userHomeDir',
47
- identityArg: '@git.zone/tsdoc',
48
- mandatoryKeys: ['OPENAI_TOKEN'],
49
- });
50
- const missingKeys = await this.smartconfigKV.getMissingMandatoryKeys();
51
- if (missingKeys.length > 0) {
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
- if (!this.openaiToken && this.smartconfigKV) {
73
- this.openaiToken = await this.smartconfigKV.readKey('OPENAI_TOKEN');
74
- }
75
- // Create model using getModel()
76
- this.model = plugins.smartai.getModel({
77
- provider: 'openai',
78
- model: 'gpt-5.4',
79
- apiKey: this.openaiToken,
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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
@@ -41,6 +41,7 @@ export declare class DiffProcessor {
41
41
  * Parse a single git diff string into file information
42
42
  */
43
43
  private parseDiffFile;
44
+ private normalizeDiffPath;
44
45
  /**
45
46
  * Prioritize files by importance (source files before build artifacts)
46
47
  */