@emaxe/agento 0.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/LICENSE +21 -0
- package/README.md +304 -0
- package/dist/bin/agento.d.ts +3 -0
- package/dist/bin/agento.d.ts.map +1 -0
- package/dist/bin/agento.js +44 -0
- package/dist/bin/agento.js.map +1 -0
- package/dist/src/adapters/base.d.ts +38 -0
- package/dist/src/adapters/base.d.ts.map +1 -0
- package/dist/src/adapters/base.js +2 -0
- package/dist/src/adapters/base.js.map +1 -0
- package/dist/src/adapters/claude-code.d.ts +13 -0
- package/dist/src/adapters/claude-code.d.ts.map +1 -0
- package/dist/src/adapters/claude-code.js +70 -0
- package/dist/src/adapters/claude-code.js.map +1 -0
- package/dist/src/adapters/codex.d.ts +15 -0
- package/dist/src/adapters/codex.d.ts.map +1 -0
- package/dist/src/adapters/codex.js +148 -0
- package/dist/src/adapters/codex.js.map +1 -0
- package/dist/src/adapters/opencode.d.ts +13 -0
- package/dist/src/adapters/opencode.d.ts.map +1 -0
- package/dist/src/adapters/opencode.js +62 -0
- package/dist/src/adapters/opencode.js.map +1 -0
- package/dist/src/adapters/qwen.d.ts +13 -0
- package/dist/src/adapters/qwen.d.ts.map +1 -0
- package/dist/src/adapters/qwen.js +84 -0
- package/dist/src/adapters/qwen.js.map +1 -0
- package/dist/src/cli/commands/agent.d.ts +3 -0
- package/dist/src/cli/commands/agent.d.ts.map +1 -0
- package/dist/src/cli/commands/agent.js +42 -0
- package/dist/src/cli/commands/agent.js.map +1 -0
- package/dist/src/cli/commands/launch.d.ts +3 -0
- package/dist/src/cli/commands/launch.d.ts.map +1 -0
- package/dist/src/cli/commands/launch.js +80 -0
- package/dist/src/cli/commands/launch.js.map +1 -0
- package/dist/src/cli/commands/profile.d.ts +3 -0
- package/dist/src/cli/commands/profile.d.ts.map +1 -0
- package/dist/src/cli/commands/profile.js +102 -0
- package/dist/src/cli/commands/profile.js.map +1 -0
- package/dist/src/cli/commands/provider.d.ts +3 -0
- package/dist/src/cli/commands/provider.d.ts.map +1 -0
- package/dist/src/cli/commands/provider.js +70 -0
- package/dist/src/cli/commands/provider.js.map +1 -0
- package/dist/src/cli/commands/restore.d.ts +3 -0
- package/dist/src/cli/commands/restore.d.ts.map +1 -0
- package/dist/src/cli/commands/restore.js +41 -0
- package/dist/src/cli/commands/restore.js.map +1 -0
- package/dist/src/config/schema.d.ts +218 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +49 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/config/store.d.ts +20 -0
- package/dist/src/config/store.d.ts.map +1 -0
- package/dist/src/config/store.js +59 -0
- package/dist/src/config/store.js.map +1 -0
- package/dist/src/launcher/child.d.ts +30 -0
- package/dist/src/launcher/child.d.ts.map +1 -0
- package/dist/src/launcher/child.js +115 -0
- package/dist/src/launcher/child.js.map +1 -0
- package/dist/src/launcher/independent.d.ts +25 -0
- package/dist/src/launcher/independent.d.ts.map +1 -0
- package/dist/src/launcher/independent.js +26 -0
- package/dist/src/launcher/independent.js.map +1 -0
- package/dist/src/launcher/shell-path-resolver.d.ts +17 -0
- package/dist/src/launcher/shell-path-resolver.d.ts.map +1 -0
- package/dist/src/launcher/shell-path-resolver.js +97 -0
- package/dist/src/launcher/shell-path-resolver.js.map +1 -0
- package/dist/src/profiles/profile-manager.d.ts +17 -0
- package/dist/src/profiles/profile-manager.d.ts.map +1 -0
- package/dist/src/profiles/profile-manager.js +74 -0
- package/dist/src/profiles/profile-manager.js.map +1 -0
- package/dist/src/providers/provider-manager.d.ts +13 -0
- package/dist/src/providers/provider-manager.d.ts.map +1 -0
- package/dist/src/providers/provider-manager.js +42 -0
- package/dist/src/providers/provider-manager.js.map +1 -0
- package/dist/src/tui/App.d.ts +10 -0
- package/dist/src/tui/App.d.ts.map +1 -0
- package/dist/src/tui/App.js +43 -0
- package/dist/src/tui/App.js.map +1 -0
- package/dist/src/tui/screens/Agents.d.ts +8 -0
- package/dist/src/tui/screens/Agents.d.ts.map +1 -0
- package/dist/src/tui/screens/Agents.js +70 -0
- package/dist/src/tui/screens/Agents.js.map +1 -0
- package/dist/src/tui/screens/LaunchAgent.d.ts +10 -0
- package/dist/src/tui/screens/LaunchAgent.d.ts.map +1 -0
- package/dist/src/tui/screens/LaunchAgent.js +119 -0
- package/dist/src/tui/screens/LaunchAgent.js.map +1 -0
- package/dist/src/tui/screens/MainMenu.d.ts +9 -0
- package/dist/src/tui/screens/MainMenu.d.ts.map +1 -0
- package/dist/src/tui/screens/MainMenu.js +32 -0
- package/dist/src/tui/screens/MainMenu.js.map +1 -0
- package/dist/src/tui/screens/Profiles.d.ts +7 -0
- package/dist/src/tui/screens/Profiles.d.ts.map +1 -0
- package/dist/src/tui/screens/Profiles.js +528 -0
- package/dist/src/tui/screens/Profiles.js.map +1 -0
- package/dist/src/tui/screens/Providers.d.ts +7 -0
- package/dist/src/tui/screens/Providers.d.ts.map +1 -0
- package/dist/src/tui/screens/Providers.js +235 -0
- package/dist/src/tui/screens/Providers.js.map +1 -0
- package/dist/src/tui/screens/Settings.d.ts +7 -0
- package/dist/src/tui/screens/Settings.d.ts.map +1 -0
- package/dist/src/tui/screens/Settings.js +49 -0
- package/dist/src/tui/screens/Settings.js.map +1 -0
- package/dist/src/tui/start.d.ts +6 -0
- package/dist/src/tui/start.d.ts.map +1 -0
- package/dist/src/tui/start.js +15 -0
- package/dist/src/tui/start.js.map +1 -0
- package/dist/src/tui/use-key-input.d.ts +9 -0
- package/dist/src/tui/use-key-input.d.ts.map +1 -0
- package/dist/src/tui/use-key-input.js +19 -0
- package/dist/src/tui/use-key-input.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join, dirname } from 'node:path';
|
|
5
|
+
import { parse as parseToml, stringify as stringifyToml } from 'smol-toml';
|
|
6
|
+
/** Нормализует имя провайдера в ключ: "Fireworks AI" → "fireworks-ai" */
|
|
7
|
+
function deriveProviderKey(name) {
|
|
8
|
+
return name.toLowerCase().replace(/\s+/g, '-');
|
|
9
|
+
}
|
|
10
|
+
/** Генерирует имя env-переменной для ключа API: "fireworks-ai" → "CODEX_FIREWORKS_AI_API_KEY" */
|
|
11
|
+
function deriveEnvKey(providerKey) {
|
|
12
|
+
return `CODEX_${providerKey.toUpperCase().replace(/-/g, '_')}_API_KEY`;
|
|
13
|
+
}
|
|
14
|
+
/** Backup глобального конфига Codex при записи в project scope */
|
|
15
|
+
let codexGlobalBackup = null;
|
|
16
|
+
export class CodexAdapter {
|
|
17
|
+
id = 'codex';
|
|
18
|
+
displayName = 'Codex CLI';
|
|
19
|
+
dev = true;
|
|
20
|
+
configPaths(cwd) {
|
|
21
|
+
return {
|
|
22
|
+
global: join(homedir(), '.codex', 'config.toml'),
|
|
23
|
+
project: join(cwd ?? process.cwd(), '.codex', 'config.toml'),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async readConfig(scope, cwd) {
|
|
27
|
+
const path = this.configPaths(cwd)[scope];
|
|
28
|
+
if (!existsSync(path))
|
|
29
|
+
return null;
|
|
30
|
+
const raw = await readFile(path, 'utf-8');
|
|
31
|
+
return parseToml(raw);
|
|
32
|
+
}
|
|
33
|
+
buildConfig(profile, providers) {
|
|
34
|
+
const base = profile.models.find((m) => m.tier === 'base') ?? profile.models[0];
|
|
35
|
+
if (!base)
|
|
36
|
+
throw new Error(`Profile "${profile.name}" has no models`);
|
|
37
|
+
const provider = providers.find((p) => p.id === base.providerId);
|
|
38
|
+
if (!provider)
|
|
39
|
+
throw new Error(`Provider not found for id: ${base.providerId}`);
|
|
40
|
+
const providerKey = deriveProviderKey(provider.name);
|
|
41
|
+
const envKey = deriveEnvKey(providerKey);
|
|
42
|
+
return {
|
|
43
|
+
model: base.model,
|
|
44
|
+
model_providers: {
|
|
45
|
+
[providerKey]: {
|
|
46
|
+
name: provider.name,
|
|
47
|
+
base_url: provider.baseUrl ?? '',
|
|
48
|
+
env_key: envKey,
|
|
49
|
+
wire_api: 'responses',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
default_profile: 'default',
|
|
53
|
+
profiles: {
|
|
54
|
+
default: {
|
|
55
|
+
model: base.model,
|
|
56
|
+
model_provider: providerKey,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
buildEnv(profile, providers) {
|
|
62
|
+
const base = profile.models.find((m) => m.tier === 'base') ?? profile.models[0];
|
|
63
|
+
if (!base)
|
|
64
|
+
return {};
|
|
65
|
+
const provider = providers.find((p) => p.id === base.providerId);
|
|
66
|
+
if (!provider)
|
|
67
|
+
return {};
|
|
68
|
+
const providerKey = deriveProviderKey(provider.name);
|
|
69
|
+
const envKey = deriveEnvKey(providerKey);
|
|
70
|
+
return { [envKey]: provider.apiKey };
|
|
71
|
+
}
|
|
72
|
+
async writeConfig(config, scope, cwd) {
|
|
73
|
+
if (scope === 'project') {
|
|
74
|
+
const paths = this.configPaths(cwd);
|
|
75
|
+
const hasModelProviders = config.model_providers !== undefined &&
|
|
76
|
+
Object.keys(config.model_providers).length > 0;
|
|
77
|
+
// 1. Управляем глобальным конфигом (model_providers всегда в global)
|
|
78
|
+
if (hasModelProviders) {
|
|
79
|
+
// Новый конфиг — backup глобального конфига перед патчем
|
|
80
|
+
const globalPath = paths.global;
|
|
81
|
+
if (codexGlobalBackup === null) {
|
|
82
|
+
if (existsSync(globalPath)) {
|
|
83
|
+
const raw = await readFile(globalPath, 'utf-8');
|
|
84
|
+
codexGlobalBackup = { hadConfig: true, config: parseToml(raw) };
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
codexGlobalBackup = { hadConfig: false, config: {} };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
let globalConfig = {};
|
|
91
|
+
if (existsSync(globalPath)) {
|
|
92
|
+
const raw = await readFile(globalPath, 'utf-8');
|
|
93
|
+
globalConfig = parseToml(raw);
|
|
94
|
+
}
|
|
95
|
+
globalConfig.model_providers = config.model_providers;
|
|
96
|
+
globalConfig.default_profile = config.default_profile;
|
|
97
|
+
globalConfig.profiles = config.profiles;
|
|
98
|
+
await mkdir(dirname(globalPath), { recursive: true });
|
|
99
|
+
await writeFile(globalPath, stringifyToml(globalConfig), 'utf-8');
|
|
100
|
+
}
|
|
101
|
+
else if (codexGlobalBackup) {
|
|
102
|
+
// Restore — восстанавливаем глобальный конфиг
|
|
103
|
+
const globalPath = paths.global;
|
|
104
|
+
if (codexGlobalBackup.hadConfig) {
|
|
105
|
+
await mkdir(dirname(globalPath), { recursive: true });
|
|
106
|
+
await writeFile(globalPath, stringifyToml(codexGlobalBackup.config), 'utf-8');
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Глобального конфига не было — убираем наши ключи из существующего
|
|
110
|
+
if (existsSync(globalPath)) {
|
|
111
|
+
const raw = await readFile(globalPath, 'utf-8');
|
|
112
|
+
const globalConfig = parseToml(raw);
|
|
113
|
+
delete globalConfig.model_providers;
|
|
114
|
+
delete globalConfig.default_profile;
|
|
115
|
+
delete globalConfig.profiles;
|
|
116
|
+
const remainingKeys = Object.keys(globalConfig);
|
|
117
|
+
if (remainingKeys.length === 0) {
|
|
118
|
+
// Файл пустой после удаления — удаляем его
|
|
119
|
+
const { unlink } = await import('node:fs/promises');
|
|
120
|
+
await unlink(globalPath);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
await writeFile(globalPath, stringifyToml(globalConfig), 'utf-8');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
codexGlobalBackup = null;
|
|
128
|
+
}
|
|
129
|
+
// 2. Управляем project конфигом (model)
|
|
130
|
+
const projectPath = paths.project;
|
|
131
|
+
const projectConfig = {};
|
|
132
|
+
if (config.model) {
|
|
133
|
+
projectConfig.model = config.model;
|
|
134
|
+
}
|
|
135
|
+
await mkdir(dirname(projectPath), { recursive: true });
|
|
136
|
+
await writeFile(projectPath, stringifyToml(projectConfig), 'utf-8');
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
// scope === 'global' — пишем всё в global config как раньше
|
|
140
|
+
const path = this.configPaths(cwd)[scope];
|
|
141
|
+
const dir = dirname(path);
|
|
142
|
+
await mkdir(dir, { recursive: true });
|
|
143
|
+
await writeFile(path, stringifyToml(config), 'utf-8');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export const codexAdapter = new CodexAdapter();
|
|
148
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAC;AAK3E,yEAAyE;AACzE,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,iGAAiG;AACjG,SAAS,YAAY,CAAC,WAAmB;IACvC,OAAO,SAAS,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;AACzE,CAAC;AAED,kEAAkE;AAClE,IAAI,iBAAiB,GAAuD,IAAI,CAAC;AAEjF,MAAM,OAAO,YAAY;IACd,EAAE,GAAG,OAAO,CAAC;IACb,WAAW,GAAG,WAAW,CAAC;IAC1B,GAAG,GAAG,IAAI,CAAC;IAEpB,WAAW,CAAC,GAAY;QACtB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC;YAChD,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC;SAC7D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAkB,EAAE,GAAY;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,SAAS,CAAC,GAAG,CAAgB,CAAC;IACvC,CAAC;IAED,WAAW,CAAC,OAAgB,EAAE,SAAqB;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,CAAC,IAAI,iBAAiB,CAAC,CAAC;QAEtE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAEhF,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAEzC,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,eAAe,EAAE;gBACf,CAAC,WAAW,CAAC,EAAE;oBACb,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,QAAQ,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;oBAChC,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,WAAW;iBACtB;aACF;YACD,eAAe,EAAE,SAAS;YAC1B,QAAQ,EAAE;gBACR,OAAO,EAAE;oBACP,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,cAAc,EAAE,WAAW;iBAC5B;aACF;SACF,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,OAAgB,EAAE,SAAqB;QAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAErB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEzB,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAEzC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAmB,EAAE,KAAkB,EAAE,GAAY;QACrE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,iBAAiB,GACrB,MAAM,CAAC,eAAe,KAAK,SAAS;gBACpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAA0C,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAE5E,qEAAqE;YACrE,IAAI,iBAAiB,EAAE,CAAC;gBACtB,yDAAyD;gBACzD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;gBAChC,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;oBAC/B,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;wBAChD,iBAAiB,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAgB,EAAE,CAAC;oBACjF,CAAC;yBAAM,CAAC;wBACN,iBAAiB,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;oBACvD,CAAC;gBACH,CAAC;gBAED,IAAI,YAAY,GAAgB,EAAE,CAAC;gBACnC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;oBAChD,YAAY,GAAG,SAAS,CAAC,GAAG,CAAgB,CAAC;gBAC/C,CAAC;gBACD,YAAY,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBACtD,YAAY,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBACtD,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;gBACxC,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtD,MAAM,SAAS,CACb,UAAU,EACV,aAAa,CAAC,YAAmD,CAAC,EAClE,OAAO,CACR,CAAC;YACJ,CAAC;iBAAM,IAAI,iBAAiB,EAAE,CAAC;gBAC7B,8CAA8C;gBAC9C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;gBAChC,IAAI,iBAAiB,CAAC,SAAS,EAAE,CAAC;oBAChC,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACtD,MAAM,SAAS,CACb,UAAU,EACV,aAAa,CAAC,iBAAiB,CAAC,MAA6C,CAAC,EAC9E,OAAO,CACR,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC3B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;wBAChD,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAgB,CAAC;wBACnD,OAAO,YAAY,CAAC,eAAe,CAAC;wBACpC,OAAO,YAAY,CAAC,eAAe,CAAC;wBACpC,OAAO,YAAY,CAAC,QAAQ,CAAC;wBAC7B,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBAChD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAC/B,2CAA2C;4BAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;4BACpD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;wBAC3B,CAAC;6BAAM,CAAC;4BACN,MAAM,SAAS,CACb,UAAU,EACV,aAAa,CAAC,YAAmD,CAAC,EAClE,OAAO,CACR,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;YAED,wCAAwC;YACxC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;YAClC,MAAM,aAAa,GAAgB,EAAE,CAAC;YACtC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACrC,CAAC;YACD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,SAAS,CACb,WAAW,EACX,aAAa,CAAC,aAAoD,CAAC,EACnE,OAAO,CACR,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,4DAA4D;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,MAAM,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,MAA6C,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentConfig, AgentConfigPaths } from './base.js';
|
|
2
|
+
import type { LaunchScope } from './base.js';
|
|
3
|
+
import type { Profile, Provider } from '../config/schema.js';
|
|
4
|
+
export declare class OpenCodeAdapter implements AgentAdapter {
|
|
5
|
+
readonly id = "opencode";
|
|
6
|
+
readonly displayName = "OpenCode";
|
|
7
|
+
configPaths(cwd?: string): AgentConfigPaths;
|
|
8
|
+
readConfig(scope: LaunchScope, cwd?: string): Promise<AgentConfig | null>;
|
|
9
|
+
buildConfig(profile: Profile, providers: Provider[]): AgentConfig;
|
|
10
|
+
writeConfig(config: AgentConfig, scope: LaunchScope, cwd?: string): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare const openCodeAdapter: OpenCodeAdapter;
|
|
13
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/adapters/opencode.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE7D,qBAAa,eAAgB,YAAW,YAAY;IAClD,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,WAAW,cAAc;IAElC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAOrC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAO/E,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,WAAW;IAiC3D,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMxF;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
export class OpenCodeAdapter {
|
|
6
|
+
id = 'opencode';
|
|
7
|
+
displayName = 'OpenCode';
|
|
8
|
+
configPaths(cwd) {
|
|
9
|
+
return {
|
|
10
|
+
global: join(homedir(), '.config', 'opencode', 'config.json'),
|
|
11
|
+
project: join(cwd ?? process.cwd(), 'opencode.json'),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
async readConfig(scope, cwd) {
|
|
15
|
+
const path = this.configPaths(cwd)[scope];
|
|
16
|
+
if (!existsSync(path))
|
|
17
|
+
return null;
|
|
18
|
+
const raw = await readFile(path, 'utf-8');
|
|
19
|
+
return JSON.parse(raw);
|
|
20
|
+
}
|
|
21
|
+
buildConfig(profile, providers) {
|
|
22
|
+
const base = profile.models.find((m) => m.tier === 'base') ?? profile.models[0];
|
|
23
|
+
if (!base)
|
|
24
|
+
throw new Error(`Profile "${profile.name}" has no models`);
|
|
25
|
+
const provider = providers.find((p) => p.id === base.providerId);
|
|
26
|
+
if (!provider)
|
|
27
|
+
throw new Error(`Provider not found for id: ${base.providerId}`);
|
|
28
|
+
if (provider.type === 'anthropic') {
|
|
29
|
+
const options = { apiKey: provider.apiKey };
|
|
30
|
+
if (provider.baseUrl)
|
|
31
|
+
options['baseURL'] = provider.baseUrl;
|
|
32
|
+
return {
|
|
33
|
+
model: `anthropic/${base.model}`,
|
|
34
|
+
provider: { anthropic: { options } },
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// openai-compatible: кастомный провайдер с именем из agento
|
|
38
|
+
const providerKey = provider.name.toLowerCase().replace(/\s+/g, '-');
|
|
39
|
+
const options = { apiKey: provider.apiKey };
|
|
40
|
+
if (provider.baseUrl)
|
|
41
|
+
options['baseURL'] = provider.baseUrl;
|
|
42
|
+
return {
|
|
43
|
+
model: `${providerKey}/${base.model}`,
|
|
44
|
+
provider: {
|
|
45
|
+
[providerKey]: {
|
|
46
|
+
npm: '@ai-sdk/openai-compatible',
|
|
47
|
+
name: provider.name,
|
|
48
|
+
options,
|
|
49
|
+
models: { [base.model]: { name: base.model } },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async writeConfig(config, scope, cwd) {
|
|
55
|
+
const path = this.configPaths(cwd)[scope];
|
|
56
|
+
const dir = join(path, '..');
|
|
57
|
+
await mkdir(dir, { recursive: true });
|
|
58
|
+
await writeFile(path, JSON.stringify(config, null, 2), 'utf-8');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export const openCodeAdapter = new OpenCodeAdapter();
|
|
62
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/adapters/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentConfig, AgentConfigPaths } from './base.js';
|
|
2
|
+
import type { LaunchScope } from './base.js';
|
|
3
|
+
import type { Profile, Provider } from '../config/schema.js';
|
|
4
|
+
export declare class QwenAdapter implements AgentAdapter {
|
|
5
|
+
readonly id = "qwen";
|
|
6
|
+
readonly displayName = "Qwen CLI";
|
|
7
|
+
configPaths(cwd?: string): AgentConfigPaths;
|
|
8
|
+
readConfig(scope: LaunchScope, cwd?: string): Promise<AgentConfig | null>;
|
|
9
|
+
buildConfig(profile: Profile, providers: Provider[]): AgentConfig;
|
|
10
|
+
writeConfig(config: AgentConfig, scope: LaunchScope, cwd?: string): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare const qwenAdapter: QwenAdapter;
|
|
13
|
+
//# sourceMappingURL=qwen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen.d.ts","sourceRoot":"","sources":["../../../src/adapters/qwen.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAa7D,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,EAAE,UAAU;IACrB,QAAQ,CAAC,WAAW,cAAc;IAElC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAOrC,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAO/E,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,WAAW;IAyD3D,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMxF;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
/** Генерирует env-ключ для Qwen из baseUrl.
|
|
6
|
+
* Пример: "http://188.132.197.214:20128/v1" → "QWEN_CUSTOM_API_KEY_OPENAI_HTTP_188_132_197_214_20128_V1"
|
|
7
|
+
*/
|
|
8
|
+
function deriveEnvKey(baseUrl) {
|
|
9
|
+
const normalized = baseUrl
|
|
10
|
+
.toUpperCase()
|
|
11
|
+
.replace(/[^A-Z0-9]+/g, '_')
|
|
12
|
+
.replace(/^_+|_+$/g, '');
|
|
13
|
+
return `QWEN_CUSTOM_API_KEY_OPENAI_${normalized}`;
|
|
14
|
+
}
|
|
15
|
+
export class QwenAdapter {
|
|
16
|
+
id = 'qwen';
|
|
17
|
+
displayName = 'Qwen CLI';
|
|
18
|
+
configPaths(cwd) {
|
|
19
|
+
return {
|
|
20
|
+
global: join(homedir(), '.qwen', 'settings.json'),
|
|
21
|
+
project: join(cwd ?? process.cwd(), '.qwen', 'settings.json'),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async readConfig(scope, cwd) {
|
|
25
|
+
const path = this.configPaths(cwd)[scope];
|
|
26
|
+
if (!existsSync(path))
|
|
27
|
+
return null;
|
|
28
|
+
const raw = await readFile(path, 'utf-8');
|
|
29
|
+
return JSON.parse(raw);
|
|
30
|
+
}
|
|
31
|
+
buildConfig(profile, providers) {
|
|
32
|
+
if (profile.models.length === 0) {
|
|
33
|
+
throw new Error(`Profile "${profile.name}" has no models`);
|
|
34
|
+
}
|
|
35
|
+
// Определяем активную модель (base tier или первая)
|
|
36
|
+
const baseModel = profile.models.find((m) => m.tier === 'base') ?? profile.models[0];
|
|
37
|
+
// Строим список всех моделей, группируем по провайдеру
|
|
38
|
+
const envMap = {};
|
|
39
|
+
const modelProviders = {};
|
|
40
|
+
for (const profileModel of profile.models) {
|
|
41
|
+
const provider = providers.find((p) => p.id === profileModel.providerId);
|
|
42
|
+
if (!provider) {
|
|
43
|
+
throw new Error(`Provider not found for id: ${profileModel.providerId}`);
|
|
44
|
+
}
|
|
45
|
+
if (provider.type === 'anthropic') {
|
|
46
|
+
throw new Error(`Qwen CLI does not support Anthropic providers (provider: "${provider.name}")`);
|
|
47
|
+
}
|
|
48
|
+
if (!provider.baseUrl) {
|
|
49
|
+
throw new Error(`Qwen CLI requires a baseUrl for provider "${provider.name}"`);
|
|
50
|
+
}
|
|
51
|
+
const providerKey = 'openai';
|
|
52
|
+
const envKey = deriveEnvKey(provider.baseUrl);
|
|
53
|
+
envMap[envKey] = provider.apiKey;
|
|
54
|
+
if (!modelProviders[providerKey])
|
|
55
|
+
modelProviders[providerKey] = [];
|
|
56
|
+
modelProviders[providerKey].push({
|
|
57
|
+
id: profileModel.model,
|
|
58
|
+
name: profileModel.model,
|
|
59
|
+
baseUrl: provider.baseUrl,
|
|
60
|
+
envKey,
|
|
61
|
+
generationConfig: {
|
|
62
|
+
modalities: { image: false, video: false, audio: false },
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
env: envMap,
|
|
68
|
+
modelProviders,
|
|
69
|
+
security: {
|
|
70
|
+
auth: { selectedType: 'openai' },
|
|
71
|
+
},
|
|
72
|
+
model: { name: baseModel.model },
|
|
73
|
+
$version: 4,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async writeConfig(config, scope, cwd) {
|
|
77
|
+
const path = this.configPaths(cwd)[scope];
|
|
78
|
+
const dir = join(path, '..');
|
|
79
|
+
await mkdir(dir, { recursive: true });
|
|
80
|
+
await writeFile(path, JSON.stringify(config, null, 2), 'utf-8');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export const qwenAdapter = new QwenAdapter();
|
|
84
|
+
//# sourceMappingURL=qwen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../../src/adapters/qwen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,kBAAkB,IAAI,OAAO,CA6B5C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { backupExists } from '../../config/store.js';
|
|
3
|
+
import { claudeCodeAdapter } from '../../adapters/claude-code.js';
|
|
4
|
+
import { openCodeAdapter } from '../../adapters/opencode.js';
|
|
5
|
+
import { qwenAdapter } from '../../adapters/qwen.js';
|
|
6
|
+
import { codexAdapter } from '../../adapters/codex.js';
|
|
7
|
+
const ALL_ADAPTERS = [claudeCodeAdapter, openCodeAdapter, qwenAdapter, codexAdapter];
|
|
8
|
+
function getAdapters(dev = false) {
|
|
9
|
+
if (dev)
|
|
10
|
+
return ALL_ADAPTERS;
|
|
11
|
+
return ALL_ADAPTERS.filter((a) => !a.dev);
|
|
12
|
+
}
|
|
13
|
+
export function createAgentCommand() {
|
|
14
|
+
const cmd = new Command('agent').description('Agent config status');
|
|
15
|
+
cmd
|
|
16
|
+
.command('status')
|
|
17
|
+
.description('Show status of agent configs')
|
|
18
|
+
.option('-d, --dev', 'Show development agents (e.g. codex)')
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
try {
|
|
21
|
+
const adapters = getAdapters(opts.dev);
|
|
22
|
+
for (const adapter of adapters) {
|
|
23
|
+
const scopes = ['global', 'project'];
|
|
24
|
+
for (const scope of scopes) {
|
|
25
|
+
const paths = adapter.configPaths();
|
|
26
|
+
const configPath = paths[scope];
|
|
27
|
+
const hasBackup = backupExists(adapter.id, scope);
|
|
28
|
+
const status = hasBackup ? 'modified (backup exists)' : 'original';
|
|
29
|
+
console.log(` ${adapter.displayName} [${scope}]: ${status}`);
|
|
30
|
+
console.log(` config: ${configPath}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
console.error('Error:', err instanceof Error ? err.message : String(err));
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return cmd;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../../src/cli/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,MAAM,YAAY,GAAmB,CAAC,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAErG,SAAS,WAAW,CAAC,GAAG,GAAG,KAAK;IAC9B,IAAI,GAAG;QAAE,OAAO,YAAY,CAAC;IAC7B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAEpE,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,WAAW,EAAE,sCAAsC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAgC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAClE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;oBACpC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;oBAChC,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBAClD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,UAAU,CAAC;oBACnE,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,WAAW,KAAK,KAAK,MAAM,MAAM,EAAE,CAAC,CAAC;oBAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,mBAAmB,IAAI,OAAO,CAgE7C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { readConfig } from '../../config/store.js';
|
|
4
|
+
import { claudeCodeAdapter } from '../../adapters/claude-code.js';
|
|
5
|
+
import { openCodeAdapter } from '../../adapters/opencode.js';
|
|
6
|
+
import { qwenAdapter } from '../../adapters/qwen.js';
|
|
7
|
+
import { codexAdapter } from '../../adapters/codex.js';
|
|
8
|
+
import { launchChild } from '../../launcher/child.js';
|
|
9
|
+
import { launchIndependent } from '../../launcher/independent.js';
|
|
10
|
+
const ALL_AGENT_COMMANDS = {
|
|
11
|
+
'claude-code': { adapter: claudeCodeAdapter, command: 'claude' },
|
|
12
|
+
'opencode': { adapter: openCodeAdapter, command: 'opencode' },
|
|
13
|
+
'qwen': { adapter: qwenAdapter, command: 'qwen' },
|
|
14
|
+
'codex': { adapter: codexAdapter, command: 'codex', args: ['-p', 'default'] },
|
|
15
|
+
};
|
|
16
|
+
function getAgentCommands(dev = false) {
|
|
17
|
+
if (dev)
|
|
18
|
+
return ALL_AGENT_COMMANDS;
|
|
19
|
+
return Object.fromEntries(Object.entries(ALL_AGENT_COMMANDS).filter(([, entry]) => !entry.adapter.dev));
|
|
20
|
+
}
|
|
21
|
+
export function createLaunchCommand() {
|
|
22
|
+
const cmd = new Command('launch')
|
|
23
|
+
.description('Launch an agent with a profile')
|
|
24
|
+
.requiredOption('-p, --profile <name>', 'Profile name to use')
|
|
25
|
+
.requiredOption('-a, --agent <id>', 'Agent to launch (claude-code, opencode, qwen, codex)')
|
|
26
|
+
.option('-m, --mode <mode>', 'Launch mode: child or independent')
|
|
27
|
+
.option('-s, --scope <scope>', 'Config scope: global or project')
|
|
28
|
+
.option('-d, --dev', 'Show development agents (e.g. codex)')
|
|
29
|
+
.action(async (opts) => {
|
|
30
|
+
const AGENT_COMMANDS = getAgentCommands(opts.dev);
|
|
31
|
+
try {
|
|
32
|
+
const config = await readConfig();
|
|
33
|
+
// Resolve profile
|
|
34
|
+
const profile = config.profiles.find((p) => p.name === opts.profile || p.id === opts.profile);
|
|
35
|
+
if (!profile) {
|
|
36
|
+
console.error(`Error: Profile not found: ${opts.profile}`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
// Resolve agent
|
|
40
|
+
const agentEntry = AGENT_COMMANDS[opts.agent];
|
|
41
|
+
if (!agentEntry) {
|
|
42
|
+
console.error(`Error: Unknown agent: ${opts.agent}. Supported: ${Object.keys(AGENT_COMMANDS).join(', ')}`);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
// Resolve mode and scope (fallback to settings)
|
|
46
|
+
const mode = (opts.mode ?? config.settings.defaultLaunchMode);
|
|
47
|
+
const scope = (opts.scope ?? config.settings.defaultConfigScope);
|
|
48
|
+
const { adapter, command, args } = agentEntry;
|
|
49
|
+
if (mode === 'child') {
|
|
50
|
+
const exitCode = await launchChild({
|
|
51
|
+
adapter,
|
|
52
|
+
profile,
|
|
53
|
+
providers: config.providers,
|
|
54
|
+
scope,
|
|
55
|
+
command,
|
|
56
|
+
args,
|
|
57
|
+
});
|
|
58
|
+
process.exit(exitCode);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const execReq = await launchIndependent({
|
|
62
|
+
adapter,
|
|
63
|
+
profile,
|
|
64
|
+
providers: config.providers,
|
|
65
|
+
scope,
|
|
66
|
+
command,
|
|
67
|
+
args,
|
|
68
|
+
});
|
|
69
|
+
spawnSync(execReq.command, execReq.args, { stdio: 'inherit', env: execReq.env });
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
console.error('Error:', err instanceof Error ? err.message : String(err));
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return cmd;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../../src/cli/commands/launch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,oBAAoB,IAAI,OAAO,CAmG9C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { listProfiles, addProfile, removeProfile } from '../../profiles/profile-manager.js';
|
|
3
|
+
const VALID_TIERS = ['small', 'base', 'smart'];
|
|
4
|
+
export function createProfileCommand() {
|
|
5
|
+
const cmd = new Command('profile').description('Manage profiles');
|
|
6
|
+
cmd
|
|
7
|
+
.command('list')
|
|
8
|
+
.description('List all profiles')
|
|
9
|
+
.action(async () => {
|
|
10
|
+
try {
|
|
11
|
+
const profiles = await listProfiles();
|
|
12
|
+
if (profiles.length === 0) {
|
|
13
|
+
console.log('No profiles configured.');
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
profiles.forEach((p) => {
|
|
17
|
+
console.log(` ${p.name} (id: ${p.id})`);
|
|
18
|
+
p.models.forEach((m, i) => {
|
|
19
|
+
const tierStr = m.tier ? ` [${m.tier}]` : '';
|
|
20
|
+
console.log(` ${i + 1}. provider: ${m.providerId}, model: ${m.model}${tierStr}`);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
console.error('Error:', err instanceof Error ? err.message : String(err));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
cmd
|
|
32
|
+
.command('add')
|
|
33
|
+
.description('Add a new profile')
|
|
34
|
+
.requiredOption('-n, --name <name>', 'Profile name')
|
|
35
|
+
.requiredOption('-m, --models <models>', 'Comma-separated list of providerId:modelName[:tier] (tier ∈ small|base|smart, optional). Tier is only meaningful when there are multiple models.')
|
|
36
|
+
.action(async (opts) => {
|
|
37
|
+
try {
|
|
38
|
+
const models = [];
|
|
39
|
+
for (const raw of opts.models.split(',')) {
|
|
40
|
+
const parts = raw.trim().split(':');
|
|
41
|
+
if (parts.length < 2)
|
|
42
|
+
continue;
|
|
43
|
+
const providerId = parts[0];
|
|
44
|
+
// Последний сегмент может быть tier; иначе всё после providerId — модель.
|
|
45
|
+
const last = parts[parts.length - 1];
|
|
46
|
+
let model;
|
|
47
|
+
let tier;
|
|
48
|
+
if (parts.length >= 3 && VALID_TIERS.includes(last)) {
|
|
49
|
+
tier = last;
|
|
50
|
+
model = parts.slice(1, -1).join(':');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
model = parts.slice(1).join(':');
|
|
54
|
+
}
|
|
55
|
+
if (!providerId || !model)
|
|
56
|
+
continue;
|
|
57
|
+
models.push(tier ? { providerId, model, tier } : { providerId, model });
|
|
58
|
+
}
|
|
59
|
+
if (models.length === 0) {
|
|
60
|
+
console.error('Error: No valid models provided. Format: providerId:modelName[:tier]');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
if (models.length > 1) {
|
|
64
|
+
if (models.some((m) => !m.tier)) {
|
|
65
|
+
console.error('Error: with multiple models every entry must include a tier (small|base|smart)');
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
if (!models.some((m) => m.tier === 'base')) {
|
|
69
|
+
console.error('Error: at least one model must have tier=base');
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Одна модель: tier игнорируется.
|
|
75
|
+
delete models[0].tier;
|
|
76
|
+
}
|
|
77
|
+
const profile = await addProfile({ name: opts.name, models });
|
|
78
|
+
console.log(`Profile "${profile.name}" added (id: ${profile.id})`);
|
|
79
|
+
process.exit(0);
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
console.error('Error:', err instanceof Error ? err.message : String(err));
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
cmd
|
|
87
|
+
.command('remove <name>')
|
|
88
|
+
.description('Remove a profile by name or id')
|
|
89
|
+
.action(async (name) => {
|
|
90
|
+
try {
|
|
91
|
+
await removeProfile(name);
|
|
92
|
+
console.log(`Profile "${name}" removed.`);
|
|
93
|
+
process.exit(0);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
console.error('Error:', err instanceof Error ? err.message : String(err));
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
return cmd;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../../src/cli/commands/profile.ts"],"names":[],"mappings":"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"}
|