@git.zone/tsagent 1.1.0
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 +46 -0
- package/cli.js +4 -0
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/classes.tsagent.d.ts +79 -0
- package/dist_ts/classes.tsagent.js +346 -0
- package/dist_ts/cli.d.ts +3 -0
- package/dist_ts/cli.js +129 -0
- package/dist_ts/index.d.ts +3 -0
- package/dist_ts/index.js +4 -0
- package/dist_ts/paths.d.ts +2 -0
- package/dist_ts/paths.js +4 -0
- package/dist_ts/plugins.d.ts +14 -0
- package/dist_ts/plugins.js +17 -0
- package/dist_ts/tools.project.d.ts +2 -0
- package/dist_ts/tools.project.js +126 -0
- package/license.md +21 -0
- package/package.json +68 -0
- package/readme.md +126 -0
- package/ts/00_commitinfo_data.ts +8 -0
- package/ts/classes.tsagent.ts +424 -0
- package/ts/cli.ts +133 -0
- package/ts/index.ts +3 -0
- package/ts/paths.ts +4 -0
- package/ts/plugins.ts +30 -0
- package/ts/tools.project.ts +143 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"@git.zone/cli": {
|
|
3
|
+
"schemaVersion": 2,
|
|
4
|
+
"projectType": "npm",
|
|
5
|
+
"module": {
|
|
6
|
+
"githost": "code.foss.global",
|
|
7
|
+
"gitscope": "git.zone",
|
|
8
|
+
"gitrepo": "tsagent",
|
|
9
|
+
"description": "Shared AI agent runtime, authentication, and CLI for git.zone TypeScript tooling.",
|
|
10
|
+
"npmPackagename": "@git.zone/tsagent",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"AI",
|
|
14
|
+
"agent",
|
|
15
|
+
"smartagent",
|
|
16
|
+
"smartai",
|
|
17
|
+
"TypeScript",
|
|
18
|
+
"CLI",
|
|
19
|
+
"tooling",
|
|
20
|
+
"git.zone"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"release": {
|
|
24
|
+
"targets": {
|
|
25
|
+
"git": {
|
|
26
|
+
"enabled": true,
|
|
27
|
+
"remote": "origin",
|
|
28
|
+
"pushBranch": true,
|
|
29
|
+
"pushTags": true
|
|
30
|
+
},
|
|
31
|
+
"npm": {
|
|
32
|
+
"enabled": true,
|
|
33
|
+
"registries": [
|
|
34
|
+
"https://verdaccio.lossless.digital",
|
|
35
|
+
"https://registry.npmjs.org"
|
|
36
|
+
],
|
|
37
|
+
"accessLevel": "public",
|
|
38
|
+
"alreadyPublished": "success"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"@ship.zone/szci": {
|
|
44
|
+
"npmGlobalTools": []
|
|
45
|
+
}
|
|
46
|
+
}
|
package/cli.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* autocreated commitinfo by @push.rocks/commitinfo
|
|
3
|
+
*/
|
|
4
|
+
export const commitinfo = {
|
|
5
|
+
name: '@git.zone/tsagent',
|
|
6
|
+
version: '1.1.0',
|
|
7
|
+
description: 'Shared AI agent runtime, authentication, and CLI for git.zone TypeScript tooling.'
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxtQkFBbUI7SUFDekIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLG1GQUFtRjtDQUNqRyxDQUFBIn0=
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export type TTsAgentAuthMode = 'auto' | 'chatgpt' | 'apiKey';
|
|
3
|
+
export interface ITsAgentConfig {
|
|
4
|
+
provider?: plugins.smartai.TProvider;
|
|
5
|
+
model?: string;
|
|
6
|
+
authMode?: TTsAgentAuthMode;
|
|
7
|
+
chatGptAuthSources?: plugins.smartaiOpenAiChatGptAuth.TOpenAiChatGptAuthSource[];
|
|
8
|
+
chatGptAuthWriteBack?: Partial<Record<plugins.smartaiOpenAiChatGptAuth.TOpenAiChatGptAuthSource, boolean>>;
|
|
9
|
+
providerOptions?: plugins.smartai.TSmartAiProviderOptions;
|
|
10
|
+
cache?: plugins.smartagent.TAgentCacheSetting;
|
|
11
|
+
promptCaching?: boolean | plugins.smartai.ISmartAiCacheOptions;
|
|
12
|
+
apiKey?: string;
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
ollamaOptions?: plugins.smartai.IOllamaModelOptions;
|
|
15
|
+
}
|
|
16
|
+
export interface ITsAgentResolvedConfig extends Required<Pick<ITsAgentConfig, 'provider' | 'model' | 'authMode' | 'chatGptAuthSources'>> {
|
|
17
|
+
chatGptAuthWriteBack: Partial<Record<plugins.smartaiOpenAiChatGptAuth.TOpenAiChatGptAuthSource, boolean>>;
|
|
18
|
+
providerOptions?: plugins.smartai.TSmartAiProviderOptions;
|
|
19
|
+
cache: plugins.smartagent.TAgentCacheSetting;
|
|
20
|
+
promptCaching?: boolean | plugins.smartai.ISmartAiCacheOptions;
|
|
21
|
+
apiKey?: string;
|
|
22
|
+
baseUrl?: string;
|
|
23
|
+
ollamaOptions?: plugins.smartai.IOllamaModelOptions;
|
|
24
|
+
}
|
|
25
|
+
export interface ITsAgentOptions {
|
|
26
|
+
argvArg?: any;
|
|
27
|
+
projectDir?: string;
|
|
28
|
+
projectConfigKeys?: string[];
|
|
29
|
+
legacyTokenStoreIdentities?: string[];
|
|
30
|
+
config?: ITsAgentConfig;
|
|
31
|
+
}
|
|
32
|
+
export interface IRunJsonTaskOptions<T> {
|
|
33
|
+
taskName: string;
|
|
34
|
+
projectDir: string;
|
|
35
|
+
prompt: string;
|
|
36
|
+
system?: string;
|
|
37
|
+
tools?: plugins.smartai.ToolSet;
|
|
38
|
+
maxSteps?: number;
|
|
39
|
+
useCompaction?: boolean;
|
|
40
|
+
validate?: (value: T) => string | void;
|
|
41
|
+
}
|
|
42
|
+
export declare const defaultTsAgentConfig: ITsAgentResolvedConfig;
|
|
43
|
+
export declare const defaultChatGptAuthSources: plugins.smartaiOpenAiChatGptAuth.TOpenAiChatGptAuthSource[];
|
|
44
|
+
export declare class TsAgent {
|
|
45
|
+
private readonly argvArg;
|
|
46
|
+
private readonly projectDir;
|
|
47
|
+
private readonly projectConfigKeys;
|
|
48
|
+
private readonly legacyTokenStoreIdentities;
|
|
49
|
+
private readonly configOverride?;
|
|
50
|
+
private openaiToken;
|
|
51
|
+
private tokenStore?;
|
|
52
|
+
private legacyTokenStores;
|
|
53
|
+
private qenvInstance;
|
|
54
|
+
private interact;
|
|
55
|
+
model: plugins.smartai.LanguageModelV3;
|
|
56
|
+
providerOptions?: plugins.smartai.TSmartAiProviderOptions;
|
|
57
|
+
config: ITsAgentResolvedConfig;
|
|
58
|
+
selectedAuthSource: string;
|
|
59
|
+
constructor(optionsArg?: ITsAgentOptions);
|
|
60
|
+
private get isInteractive();
|
|
61
|
+
private readTokenFromStore;
|
|
62
|
+
private getStoredOpenAiToken;
|
|
63
|
+
private resolveApiKey;
|
|
64
|
+
private promptForOpenAiToken;
|
|
65
|
+
private runChatGptDeviceLogin;
|
|
66
|
+
private resolveConfig;
|
|
67
|
+
start(): Promise<void>;
|
|
68
|
+
stop(): Promise<void>;
|
|
69
|
+
getOpenaiToken(): string;
|
|
70
|
+
createReadOnlyProjectTools(projectDirArg?: string): Promise<plugins.smartai.ToolSet>;
|
|
71
|
+
runAgent(options: Omit<plugins.smartagent.IAgentRunOptions, 'model'> & {
|
|
72
|
+
projectDir: string;
|
|
73
|
+
taskName: string;
|
|
74
|
+
useCompaction?: boolean;
|
|
75
|
+
}): Promise<plugins.smartagent.IAgentRunResult>;
|
|
76
|
+
runJsonTask<T = unknown>(optionsArg: IRunJsonTaskOptions<T>): Promise<T>;
|
|
77
|
+
}
|
|
78
|
+
export declare const inspectChatGptAuthSources: (sourcesArg?: plugins.smartaiOpenAiChatGptAuth.TOpenAiChatGptAuthSource[]) => Promise<plugins.smartaiOpenAiChatGptAuth.IOpenAiChatGptAuthSourceInspection[]>;
|
|
79
|
+
export declare const loginChatGptAuth: () => Promise<plugins.smartai.IOpenAiChatGptTokenData>;
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { createReadOnlyProjectTools } from './tools.project.js';
|
|
3
|
+
export const defaultTsAgentConfig = {
|
|
4
|
+
provider: 'openai',
|
|
5
|
+
model: 'gpt-5.5',
|
|
6
|
+
authMode: 'auto',
|
|
7
|
+
chatGptAuthSources: ['opencode', 'codex', 'smartai'],
|
|
8
|
+
chatGptAuthWriteBack: {
|
|
9
|
+
smartai: true,
|
|
10
|
+
opencode: false,
|
|
11
|
+
codex: false,
|
|
12
|
+
},
|
|
13
|
+
providerOptions: {
|
|
14
|
+
openai: {
|
|
15
|
+
reasoningEffort: 'xhigh',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
cache: 'auto',
|
|
19
|
+
};
|
|
20
|
+
export const defaultChatGptAuthSources = defaultTsAgentConfig.chatGptAuthSources;
|
|
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 readProjectConfig = async (projectDirArg, keysArg) => {
|
|
59
|
+
const smartconfigPath = plugins.path.join(projectDirArg, '.smartconfig.json');
|
|
60
|
+
try {
|
|
61
|
+
const raw = await plugins.fs.readFile(smartconfigPath, 'utf8');
|
|
62
|
+
const smartconfigJson = JSON.parse(raw);
|
|
63
|
+
const result = {};
|
|
64
|
+
for (const key of keysArg) {
|
|
65
|
+
const keyConfig = isPlainObject(smartconfigJson[key]) ? smartconfigJson[key] : {};
|
|
66
|
+
Object.assign(result, keyConfig);
|
|
67
|
+
if (isPlainObject(keyConfig.ai)) {
|
|
68
|
+
Object.assign(result, keyConfig.ai);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (error.code === 'ENOENT') {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
throw new Error(`Could not parse .smartconfig.json: ${error instanceof Error ? error.message : String(error)}`);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
const parseJsonResult = (textArg) => {
|
|
81
|
+
const jsonString = textArg
|
|
82
|
+
.replace(/```json\n?/gi, '')
|
|
83
|
+
.replace(/```\n?/gi, '')
|
|
84
|
+
.match(/\{[\s\S]*\}|\[[\s\S]*\]/)?.[0] ?? textArg;
|
|
85
|
+
return JSON.parse(jsonString);
|
|
86
|
+
};
|
|
87
|
+
export class TsAgent {
|
|
88
|
+
argvArg;
|
|
89
|
+
projectDir;
|
|
90
|
+
projectConfigKeys;
|
|
91
|
+
legacyTokenStoreIdentities;
|
|
92
|
+
configOverride;
|
|
93
|
+
openaiToken = '';
|
|
94
|
+
tokenStore;
|
|
95
|
+
legacyTokenStores = [];
|
|
96
|
+
qenvInstance;
|
|
97
|
+
interact;
|
|
98
|
+
model;
|
|
99
|
+
providerOptions;
|
|
100
|
+
config = defaultTsAgentConfig;
|
|
101
|
+
selectedAuthSource = 'none';
|
|
102
|
+
constructor(optionsArg = {}) {
|
|
103
|
+
this.argvArg = optionsArg.argvArg || {};
|
|
104
|
+
this.projectDir = optionsArg.projectDir || process.cwd();
|
|
105
|
+
this.projectConfigKeys = optionsArg.projectConfigKeys || ['@git.zone/tsagent'];
|
|
106
|
+
this.legacyTokenStoreIdentities = optionsArg.legacyTokenStoreIdentities || [];
|
|
107
|
+
this.configOverride = optionsArg.config;
|
|
108
|
+
}
|
|
109
|
+
get isInteractive() {
|
|
110
|
+
return process.stdin.isTTY === true && process.stdout.isTTY === true && !this.argvArg?.ci && !this.argvArg?.json;
|
|
111
|
+
}
|
|
112
|
+
async readTokenFromStore(storeArg) {
|
|
113
|
+
try {
|
|
114
|
+
const token = await storeArg.readKey('OPENAI_TOKEN');
|
|
115
|
+
return token || undefined;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async getStoredOpenAiToken() {
|
|
122
|
+
if (this.tokenStore) {
|
|
123
|
+
const token = await this.readTokenFromStore(this.tokenStore);
|
|
124
|
+
if (token)
|
|
125
|
+
return token;
|
|
126
|
+
}
|
|
127
|
+
for (const store of this.legacyTokenStores) {
|
|
128
|
+
const token = await this.readTokenFromStore(store);
|
|
129
|
+
if (token)
|
|
130
|
+
return token;
|
|
131
|
+
}
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
async resolveApiKey(providerArg) {
|
|
135
|
+
const argvToken = this.argvArg?.OPENAI_TOKEN || this.argvArg?.OPENAI_API_KEY || this.argvArg?.apiKey;
|
|
136
|
+
if (argvToken)
|
|
137
|
+
return argvToken;
|
|
138
|
+
if (this.config.apiKey)
|
|
139
|
+
return this.config.apiKey;
|
|
140
|
+
const envNames = providerArg === 'openai'
|
|
141
|
+
? ['OPENAI_TOKEN', 'OPENAI_API_KEY']
|
|
142
|
+
: [`${providerArg.toUpperCase()}_TOKEN`, `${providerArg.toUpperCase()}_API_KEY`];
|
|
143
|
+
for (const envName of envNames) {
|
|
144
|
+
const value = await this.qenvInstance.getEnvVarOnDemand(envName);
|
|
145
|
+
if (value)
|
|
146
|
+
return value;
|
|
147
|
+
}
|
|
148
|
+
if (providerArg === 'openai') {
|
|
149
|
+
return await this.getStoredOpenAiToken();
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
async promptForOpenAiToken() {
|
|
154
|
+
if (!this.isInteractive) {
|
|
155
|
+
throw new Error('OpenAI API key is required. Set OPENAI_TOKEN/OPENAI_API_KEY or configure ChatGPT subscription auth.');
|
|
156
|
+
}
|
|
157
|
+
await plugins.smartdelay.delayFor(1000);
|
|
158
|
+
const answerObject = await this.interact.askQuestion({
|
|
159
|
+
type: 'input',
|
|
160
|
+
message: 'Please provide your OpenAI token. This will be persisted in your home directory.',
|
|
161
|
+
name: 'OPENAI_TOKEN',
|
|
162
|
+
default: '',
|
|
163
|
+
});
|
|
164
|
+
const token = answerObject.value;
|
|
165
|
+
await this.tokenStore?.writeKey('OPENAI_TOKEN', token);
|
|
166
|
+
return token;
|
|
167
|
+
}
|
|
168
|
+
async runChatGptDeviceLogin() {
|
|
169
|
+
if (!this.isInteractive) {
|
|
170
|
+
throw new Error('ChatGPT subscription auth is required, but no usable auth file was found in non-interactive mode.');
|
|
171
|
+
}
|
|
172
|
+
return await loginChatGptAuth();
|
|
173
|
+
}
|
|
174
|
+
async resolveConfig() {
|
|
175
|
+
const projectConfig = await readProjectConfig(this.projectDir, this.projectConfigKeys);
|
|
176
|
+
const envProvider = normalizeProvider(await this.qenvInstance.getEnvVarOnDemand('TSAGENT_AI_PROVIDER'));
|
|
177
|
+
const envModel = await this.qenvInstance.getEnvVarOnDemand('TSAGENT_AI_MODEL');
|
|
178
|
+
const envAuthMode = normalizeAuthMode(await this.qenvInstance.getEnvVarOnDemand('TSAGENT_AUTH_MODE'));
|
|
179
|
+
const envChatGptSources = normalizeChatGptSources(await this.qenvInstance.getEnvVarOnDemand('TSAGENT_CHATGPT_AUTH_SOURCES'));
|
|
180
|
+
const envReasoningEffort = normalizeOpenAiReasoningEffort(await this.qenvInstance.getEnvVarOnDemand('TSAGENT_OPENAI_REASONING_EFFORT'));
|
|
181
|
+
const envProviderOptions = envReasoningEffort ? {
|
|
182
|
+
openai: { reasoningEffort: envReasoningEffort },
|
|
183
|
+
} : undefined;
|
|
184
|
+
const argvConfig = {
|
|
185
|
+
provider: normalizeProvider(this.argvArg?.provider),
|
|
186
|
+
model: typeof this.argvArg?.model === 'string' ? this.argvArg.model : undefined,
|
|
187
|
+
authMode: normalizeAuthMode(this.argvArg?.authMode),
|
|
188
|
+
chatGptAuthSources: normalizeChatGptSources(this.argvArg?.chatGptAuthSources),
|
|
189
|
+
};
|
|
190
|
+
const mergedConfig = {
|
|
191
|
+
...projectConfig,
|
|
192
|
+
...this.configOverride,
|
|
193
|
+
...argvConfig,
|
|
194
|
+
};
|
|
195
|
+
const provider = argvConfig.provider ?? envProvider ?? normalizeProvider(mergedConfig.provider) ?? defaultTsAgentConfig.provider;
|
|
196
|
+
const model = argvConfig.model ?? envModel ?? mergedConfig.model ?? defaultTsAgentConfig.model;
|
|
197
|
+
const authMode = argvConfig.authMode ?? envAuthMode ?? normalizeAuthMode(mergedConfig.authMode) ?? defaultTsAgentConfig.authMode;
|
|
198
|
+
const chatGptAuthSources = argvConfig.chatGptAuthSources
|
|
199
|
+
?? envChatGptSources
|
|
200
|
+
?? normalizeChatGptSources(mergedConfig.chatGptAuthSources)
|
|
201
|
+
?? defaultTsAgentConfig.chatGptAuthSources;
|
|
202
|
+
const providerOptions = mergeProviderOptions(mergeProviderOptions(defaultTsAgentConfig.providerOptions, mergedConfig.providerOptions), envProviderOptions);
|
|
203
|
+
return {
|
|
204
|
+
...defaultTsAgentConfig,
|
|
205
|
+
...mergedConfig,
|
|
206
|
+
provider,
|
|
207
|
+
model,
|
|
208
|
+
authMode,
|
|
209
|
+
chatGptAuthSources,
|
|
210
|
+
chatGptAuthWriteBack: {
|
|
211
|
+
...defaultTsAgentConfig.chatGptAuthWriteBack,
|
|
212
|
+
...(mergedConfig.chatGptAuthWriteBack ?? {}),
|
|
213
|
+
},
|
|
214
|
+
providerOptions,
|
|
215
|
+
cache: mergedConfig.cache ?? defaultTsAgentConfig.cache,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
async start() {
|
|
219
|
+
this.interact = new plugins.smartinteract.SmartInteract();
|
|
220
|
+
this.qenvInstance = new plugins.qenv.Qenv();
|
|
221
|
+
this.tokenStore = new plugins.smartconfig.KeyValueStore({
|
|
222
|
+
typeArg: 'userHomeDir',
|
|
223
|
+
identityArg: '@git.zone/tsagent',
|
|
224
|
+
mandatoryKeys: ['OPENAI_TOKEN'],
|
|
225
|
+
});
|
|
226
|
+
this.legacyTokenStores = this.legacyTokenStoreIdentities.map(identityArg => new plugins.smartconfig.KeyValueStore({
|
|
227
|
+
typeArg: 'userHomeDir',
|
|
228
|
+
identityArg,
|
|
229
|
+
mandatoryKeys: ['OPENAI_TOKEN'],
|
|
230
|
+
}));
|
|
231
|
+
this.config = await this.resolveConfig();
|
|
232
|
+
let openAiChatGptAuth;
|
|
233
|
+
if (this.config.provider === 'openai' && this.config.authMode !== 'apiKey') {
|
|
234
|
+
const resolvedAuth = await plugins.smartaiOpenAiChatGptAuth.resolveOpenAiChatGptAuth({
|
|
235
|
+
sources: this.config.chatGptAuthSources,
|
|
236
|
+
refresh: 'ifNeeded',
|
|
237
|
+
writeBack: this.config.chatGptAuthWriteBack,
|
|
238
|
+
});
|
|
239
|
+
if (resolvedAuth) {
|
|
240
|
+
openAiChatGptAuth = resolvedAuth.tokenData;
|
|
241
|
+
this.selectedAuthSource = resolvedAuth.source;
|
|
242
|
+
}
|
|
243
|
+
else if (this.config.authMode === 'chatgpt') {
|
|
244
|
+
openAiChatGptAuth = await this.runChatGptDeviceLogin();
|
|
245
|
+
this.selectedAuthSource = 'smartai';
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
let apiKey;
|
|
249
|
+
if (!openAiChatGptAuth) {
|
|
250
|
+
apiKey = await this.resolveApiKey(this.config.provider);
|
|
251
|
+
if (!apiKey && this.config.provider === 'openai' && this.config.authMode === 'auto' && this.isInteractive) {
|
|
252
|
+
openAiChatGptAuth = await this.runChatGptDeviceLogin();
|
|
253
|
+
this.selectedAuthSource = 'smartai';
|
|
254
|
+
}
|
|
255
|
+
if (!apiKey && !openAiChatGptAuth && this.config.provider === 'openai' && this.config.authMode !== 'chatgpt') {
|
|
256
|
+
apiKey = await this.promptForOpenAiToken();
|
|
257
|
+
}
|
|
258
|
+
if (apiKey) {
|
|
259
|
+
this.selectedAuthSource = 'apiKey';
|
|
260
|
+
if (this.config.provider === 'openai') {
|
|
261
|
+
this.openaiToken = apiKey;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const setup = plugins.smartai.getModelSetup({
|
|
266
|
+
provider: this.config.provider,
|
|
267
|
+
model: this.config.model,
|
|
268
|
+
apiKey,
|
|
269
|
+
openAiChatGptAuth,
|
|
270
|
+
providerOptions: this.config.providerOptions,
|
|
271
|
+
promptCaching: this.config.promptCaching,
|
|
272
|
+
baseUrl: this.config.baseUrl,
|
|
273
|
+
ollamaOptions: this.config.ollamaOptions,
|
|
274
|
+
});
|
|
275
|
+
this.model = setup.model;
|
|
276
|
+
this.providerOptions = setup.providerOptions;
|
|
277
|
+
}
|
|
278
|
+
async stop() { }
|
|
279
|
+
getOpenaiToken() {
|
|
280
|
+
return this.openaiToken;
|
|
281
|
+
}
|
|
282
|
+
async createReadOnlyProjectTools(projectDirArg = this.projectDir) {
|
|
283
|
+
return await createReadOnlyProjectTools(projectDirArg);
|
|
284
|
+
}
|
|
285
|
+
async runAgent(options) {
|
|
286
|
+
const providerOptions = this.config.provider === 'openai' && this.selectedAuthSource !== 'apiKey' && options.system
|
|
287
|
+
? mergeProviderOptions(this.providerOptions, {
|
|
288
|
+
openai: { instructions: options.system },
|
|
289
|
+
})
|
|
290
|
+
: this.providerOptions;
|
|
291
|
+
const result = await plugins.smartagent.runAgent({
|
|
292
|
+
...options,
|
|
293
|
+
model: this.model,
|
|
294
|
+
providerOptions,
|
|
295
|
+
cache: this.config.cache,
|
|
296
|
+
sessionId: options.sessionId ?? `tsagent:${options.taskName}:${plugins.path.resolve(options.projectDir)}`,
|
|
297
|
+
onContextOverflow: options.useCompaction
|
|
298
|
+
? async (messages) => plugins.smartagentCompaction.compactMessages(this.model, messages)
|
|
299
|
+
: options.onContextOverflow,
|
|
300
|
+
});
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
async runJsonTask(optionsArg) {
|
|
304
|
+
const tools = optionsArg.tools || await this.createReadOnlyProjectTools(optionsArg.projectDir);
|
|
305
|
+
const result = await this.runAgent({
|
|
306
|
+
taskName: optionsArg.taskName,
|
|
307
|
+
projectDir: optionsArg.projectDir,
|
|
308
|
+
prompt: optionsArg.prompt,
|
|
309
|
+
system: `${optionsArg.system || 'Return only valid JSON.'}\nYour final response must be parseable JSON with no markdown wrapper.`,
|
|
310
|
+
tools,
|
|
311
|
+
maxSteps: optionsArg.maxSteps ?? 15,
|
|
312
|
+
maxValidationRetries: 1,
|
|
313
|
+
useCompaction: optionsArg.useCompaction ?? true,
|
|
314
|
+
validateCompletion: (resultArg) => {
|
|
315
|
+
try {
|
|
316
|
+
const parsed = parseJsonResult(resultArg.text);
|
|
317
|
+
return optionsArg.validate?.(parsed);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
return `Return only valid JSON. Error: ${error instanceof Error ? error.message : String(error)}`;
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
const parsed = parseJsonResult(result.text);
|
|
325
|
+
const validation = optionsArg.validate?.(parsed);
|
|
326
|
+
if (validation) {
|
|
327
|
+
throw new Error(validation);
|
|
328
|
+
}
|
|
329
|
+
return parsed;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
export const inspectChatGptAuthSources = async (sourcesArg = defaultChatGptAuthSources) => {
|
|
333
|
+
return await plugins.smartaiOpenAiChatGptAuth.inspectOpenAiChatGptAuthSources({
|
|
334
|
+
sources: sourcesArg,
|
|
335
|
+
});
|
|
336
|
+
};
|
|
337
|
+
export const loginChatGptAuth = async () => {
|
|
338
|
+
const deviceCode = await plugins.smartai.requestOpenAiChatGptDeviceCode();
|
|
339
|
+
console.log(`Open ${deviceCode.verificationUrl} and enter code ${deviceCode.userCode}`);
|
|
340
|
+
const tokenData = await plugins.smartai.completeOpenAiChatGptDeviceCodeLogin(deviceCode);
|
|
341
|
+
const authFilePath = plugins.smartaiOpenAiChatGptAuth.getDefaultOpenAiChatGptAuthPath('smartai');
|
|
342
|
+
await plugins.smartaiOpenAiChatGptAuth.writeOpenAiChatGptAuthFile(authFilePath, tokenData, 'smartai');
|
|
343
|
+
console.log(`Stored OpenAI ChatGPT auth at ${authFilePath}`);
|
|
344
|
+
return tokenData;
|
|
345
|
+
};
|
|
346
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50c2FnZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy50c2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBaURoRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBMkI7SUFDMUQsUUFBUSxFQUFFLFFBQVE7SUFDbEIsS0FBSyxFQUFFLFNBQVM7SUFDaEIsUUFBUSxFQUFFLE1BQU07SUFDaEIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQztJQUNwRCxvQkFBb0IsRUFBRTtRQUNwQixPQUFPLEVBQUUsSUFBSTtRQUNiLFFBQVEsRUFBRSxLQUFLO1FBQ2YsS0FBSyxFQUFFLEtBQUs7S0FDYjtJQUNELGVBQWUsRUFBRTtRQUNmLE1BQU0sRUFBRTtZQUNOLGVBQWUsRUFBRSxPQUFPO1NBQ3pCO0tBQ0Y7SUFDRCxLQUFLLEVBQUUsTUFBTTtDQUNkLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQztBQUVqRixNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWMsRUFBZ0MsRUFBRTtJQUNyRSxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDLENBQUM7QUFFRixNQUFNLG9CQUFvQixHQUFHLENBQzNCLElBQThDLEVBQzlDLFFBQWtELEVBQ0csRUFBRTtJQUN2RCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUF3QixFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxD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
|
package/dist_ts/cli.d.ts
ADDED