evolclaw 3.1.11 → 3.3.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/CHANGELOG.md +41 -0
- package/README.md +27 -2
- package/dist/agents/{resolve.js → baseagent.js} +34 -5
- package/dist/agents/claude-runner.js +120 -27
- package/dist/agents/codex-app-server-client.js +364 -0
- package/dist/agents/codex-runner.js +1069 -141
- package/dist/agents/gemini-runner.js +2 -2
- package/dist/agents/runner-types.js +28 -0
- package/dist/aun/aid/control-aid.js +67 -0
- package/dist/aun/aid/identity.js +20 -7
- package/dist/aun/aid/store.js +2 -2
- package/dist/aun/storage/download.js +1 -1
- package/dist/aun/storage/upload.js +13 -1
- package/dist/channels/aun.js +538 -325
- package/dist/channels/dingtalk.js +77 -140
- package/dist/channels/feishu.js +98 -151
- package/dist/channels/qqbot.js +75 -138
- package/dist/channels/wechat.js +75 -136
- package/dist/channels/wecom.js +75 -138
- package/dist/cli/agent.js +44 -13
- package/dist/cli/index.js +207 -46
- package/dist/cli/init-channel.js +38 -148
- package/dist/cli/init.js +192 -85
- package/dist/cli/model.js +1 -1
- package/dist/cli/stats.js +558 -0
- package/dist/cli/version.js +87 -0
- package/dist/cli/watch-msg.js +5 -2
- package/dist/config-store.js +48 -11
- package/dist/core/channel-loader.js +84 -82
- package/dist/core/command-handler.js +754 -172
- package/dist/core/daemon-file-cache.js +216 -0
- package/dist/core/evolagent-registry.js +4 -0
- package/dist/core/evolagent.js +28 -23
- package/dist/core/interaction-router.js +8 -0
- package/dist/core/message/command-handler-agent-control.js +215 -0
- package/dist/core/message/create-status.js +67 -0
- package/dist/core/message/im-renderer.js +35 -13
- package/dist/core/message/items-formatter.js +9 -1
- package/dist/core/message/message-bridge.js +52 -22
- package/dist/core/message/message-log.js +1 -0
- package/dist/core/message/message-processor.js +336 -68
- package/dist/core/message/message-queue.js +15 -8
- package/dist/core/message/pending-hints.js +232 -0
- package/dist/core/message/response-depth.js +56 -0
- package/dist/core/model/model-catalog.js +1 -1
- package/dist/core/model/model-scope.js +40 -7
- package/dist/core/permission.js +9 -12
- package/dist/core/relation/peer-identity.js +16 -1
- package/dist/core/session/adapters/claude-session-file-adapter.js +48 -5
- package/dist/core/session/adapters/codex-session-file-adapter.js +4 -2
- package/dist/core/session/session-manager.js +27 -13
- package/dist/core/session/session-title.js +26 -0
- package/dist/core/stats/billing.js +151 -0
- package/dist/core/stats/budget.js +93 -0
- package/dist/core/stats/db.js +314 -0
- package/dist/core/stats/eck-vars.js +84 -0
- package/dist/core/stats/index.js +10 -0
- package/dist/core/stats/normalizer.js +78 -0
- package/dist/core/stats/query.js +760 -0
- package/dist/core/stats/writer.js +115 -0
- package/dist/core/trigger/manager.js +34 -0
- package/dist/core/trigger/parser.js +9 -3
- package/dist/core/trigger/scheduler.js +20 -17
- package/dist/{agents → eck}/kit-renderer.js +5 -1
- package/dist/{agents → eck}/manifest-engine.js +127 -35
- package/dist/{agents → eck}/message-renderer.js +26 -1
- package/dist/index.js +185 -8
- package/dist/ipc.js +22 -0
- package/dist/paths.js +7 -3
- package/dist/utils/cross-platform.js +23 -5
- package/dist/utils/ecweb-pair.js +20 -0
- package/dist/utils/stats.js +14 -0
- package/kits/docs/evolclaw/INDEX.md +3 -1
- package/kits/docs/evolclaw/fs-architecture.md +1215 -0
- package/kits/docs/evolclaw/fs.md +131 -0
- package/kits/docs/evolclaw/group-fs.md +209 -0
- package/kits/docs/evolclaw/stats.md +70 -0
- package/kits/docs/venues/aun-group.md +29 -6
- package/kits/docs/venues/group.md +5 -4
- package/kits/eck_manifest.json +12 -0
- package/kits/eck_message_manifest.json +30 -3
- package/kits/rules/05-venue.md +1 -1
- package/kits/templates/message-fragments/inject-default.md +2 -0
- package/kits/templates/message-fragments/item.md +1 -1
- package/kits/templates/system-fragments/response-depth.md +16 -0
- package/package.json +4 -4
- package/dist/agents/baseagent-normalize.js +0 -19
- package/dist/core/relation/peer-key.js +0 -16
- package/dist/utils/channel-helpers.js +0 -46
package/dist/cli/init.js
CHANGED
|
@@ -4,8 +4,9 @@ import readline from 'readline';
|
|
|
4
4
|
import { resolvePaths, ensureDataDirs } from '../paths.js';
|
|
5
5
|
import { commandExists } from '../utils/cross-platform.js';
|
|
6
6
|
import { scanInstances } from '../utils/instance-registry.js';
|
|
7
|
-
import { saveDefaultsSafe, loadAllAgents } from '../config-store.js';
|
|
8
|
-
import {
|
|
7
|
+
import { saveDefaultsSafe, loadAllAgents, migrateProcessConfigIfNeeded, loadEvolclawConfig, saveEvolclawConfig } from '../config-store.js';
|
|
8
|
+
import { generateControlAid } from '../aun/aid/control-aid.js';
|
|
9
|
+
import { getCodexAppServerAvailability, isCodexAppServerAvailable } from '../agents/codex-runner.js';
|
|
9
10
|
// ==================== Helpers ====================
|
|
10
11
|
function ask(rl, question) {
|
|
11
12
|
return new Promise(resolve => rl.question(question, resolve));
|
|
@@ -13,7 +14,7 @@ function ask(rl, question) {
|
|
|
13
14
|
const BASEAGENT_CANDIDATES = ['claude', 'codex', 'gemini'];
|
|
14
15
|
function isBaseagentAvailable(baseagent) {
|
|
15
16
|
if (baseagent === 'codex')
|
|
16
|
-
return
|
|
17
|
+
return isCodexAppServerAvailable();
|
|
17
18
|
return commandExists(baseagent);
|
|
18
19
|
}
|
|
19
20
|
function detectAvailable() {
|
|
@@ -36,10 +37,35 @@ function buildDefaults(chosen, available, projectsDefaultPath) {
|
|
|
36
37
|
function writeDefaults(chosen, available, projectsDefaultPath) {
|
|
37
38
|
saveDefaultsSafe(buildDefaults(chosen, available, projectsDefaultPath));
|
|
38
39
|
}
|
|
40
|
+
/** 启动门禁判定:缺控制 AID 且处于交互式终端时,应进 init 向导补全。
|
|
41
|
+
* 非 TTY(restart-monitor/systemd/管道)即使缺 aid 也不进 init(无法交互),由 daemon 侧 warn 兜底。 */
|
|
42
|
+
export function needsControlAidInit(aid, isTty) {
|
|
43
|
+
return !aid && isTty;
|
|
44
|
+
}
|
|
45
|
+
/** 解析用户输入的 owner AID 列表:按空白/逗号分隔,去空、去重、按 isValid 分流。
|
|
46
|
+
* 空输入 → valid:[](视为跳过)。 */
|
|
47
|
+
export function parseOwnerAids(raw, isValid) {
|
|
48
|
+
const tokens = raw.split(/[\s,]+/).map(t => t.trim()).filter(Boolean);
|
|
49
|
+
const valid = [];
|
|
50
|
+
const invalid = [];
|
|
51
|
+
for (const t of tokens) {
|
|
52
|
+
if (isValid(t)) {
|
|
53
|
+
if (!valid.includes(t))
|
|
54
|
+
valid.push(t);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
invalid.push(t);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { valid, invalid };
|
|
61
|
+
}
|
|
39
62
|
// ==================== Main ====================
|
|
40
63
|
export async function cmdInit(options) {
|
|
41
64
|
const p = resolvePaths();
|
|
42
65
|
ensureDataDirs();
|
|
66
|
+
// config.json → evolclaw.json:init 路径也可能先于 daemon 触发 AID 生成(走 getAidStore),
|
|
67
|
+
// 须在任何 getAidStore 之前迁移 encryptionSeed。
|
|
68
|
+
migrateProcessConfigIfNeeded();
|
|
43
69
|
// ── 1. 单进程互斥 ──
|
|
44
70
|
const aliveMains = scanInstances().mains.filter(m => m.alive);
|
|
45
71
|
if (aliveMains.length > 0) {
|
|
@@ -53,7 +79,7 @@ export async function cmdInit(options) {
|
|
|
53
79
|
console.log('❌ 未检测到可用 baseagent。请安装至少一款:');
|
|
54
80
|
console.log(' - claude CLI');
|
|
55
81
|
console.log(' - gemini CLI');
|
|
56
|
-
console.log(' -
|
|
82
|
+
console.log(' - codex CLI with app-server');
|
|
57
83
|
console.log('\n安装后重新运行 evolclaw init');
|
|
58
84
|
return;
|
|
59
85
|
}
|
|
@@ -66,110 +92,191 @@ export async function cmdInit(options) {
|
|
|
66
92
|
// ── 3. 非交互式分支 ──
|
|
67
93
|
if (options?.nonInteractive) {
|
|
68
94
|
if (exists && !options.force) {
|
|
69
|
-
|
|
70
|
-
|
|
95
|
+
// 配置已存在且未 --force:不重写 defaults,但仍落到共享 tail(幂等补生成控制 AID)
|
|
96
|
+
console.log(`配置已存在: ${defaultsPath}(加 --force 可覆盖)`);
|
|
71
97
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
-
|
|
98
|
+
else {
|
|
99
|
+
let chosen;
|
|
100
|
+
if (options.baseagent) {
|
|
101
|
+
if (!BASEAGENT_CANDIDATES.includes(options.baseagent)) {
|
|
102
|
+
console.log(`❌ 无效 baseagent: ${options.baseagent}(可选: ${BASEAGENT_CANDIDATES.join('/')})`);
|
|
103
|
+
return; // 硬错误:不落 tail
|
|
104
|
+
}
|
|
105
|
+
if (!available.includes(options.baseagent)) {
|
|
106
|
+
const reason = options.baseagent === 'codex'
|
|
107
|
+
? getCodexAppServerAvailability().reason
|
|
108
|
+
: undefined;
|
|
109
|
+
console.log(`❌ ${options.baseagent} 当前环境不可用${reason ? `:${reason}` : `(可用: ${available.join('/')})`}`);
|
|
110
|
+
return; // 硬错误:不落 tail
|
|
111
|
+
}
|
|
112
|
+
chosen = options.baseagent;
|
|
77
113
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return;
|
|
114
|
+
else {
|
|
115
|
+
chosen = pickDefault(available);
|
|
81
116
|
}
|
|
82
|
-
chosen
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
chosen = pickDefault(available);
|
|
117
|
+
writeDefaults(chosen, available);
|
|
118
|
+
console.log(`✓ 已${exists ? '覆盖' : '创建'}: ${defaultsPath}`);
|
|
119
|
+
console.log(` active_baseagent: ${chosen}`);
|
|
86
120
|
}
|
|
87
|
-
|
|
88
|
-
console.log(`✓ 已${exists ? '覆盖' : '创建'}: ${defaultsPath}`);
|
|
89
|
-
console.log(` active_baseagent: ${chosen}`);
|
|
90
|
-
const { agents } = loadAllAgents();
|
|
91
|
-
if (agents.length === 0) {
|
|
92
|
-
console.log('\n提示:尚无 agent,运行以下命令创建:');
|
|
93
|
-
console.log(' evolclaw agent new <aid>.agentid.pub');
|
|
94
|
-
}
|
|
95
|
-
return;
|
|
121
|
+
// 落到共享 tail(不 return)
|
|
96
122
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
if (
|
|
109
|
-
console.log(`
|
|
110
|
-
|
|
123
|
+
else {
|
|
124
|
+
// ── 4. 交互式分支(rl 生命周期封装在内部函数,tail 不引用 rl)──
|
|
125
|
+
await runInteractive();
|
|
126
|
+
}
|
|
127
|
+
// ── 共享 tail(单一出口):提示创建 agent + 生成控制 AID ──
|
|
128
|
+
await initTail();
|
|
129
|
+
// ── 内部函数 ──
|
|
130
|
+
async function runInteractive() {
|
|
131
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
132
|
+
async function askBaseagent() {
|
|
133
|
+
const defaultBa = pickDefault(available);
|
|
134
|
+
if (available.length === 1) {
|
|
135
|
+
console.log(` baseagent: ${defaultBa}`);
|
|
136
|
+
return defaultBa;
|
|
111
137
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
138
|
+
let chosen = null;
|
|
139
|
+
while (chosen === null) {
|
|
140
|
+
const input = (await ask(rl, `默认 baseagent (${available.join('/')}) [${defaultBa}]: `)).trim() || defaultBa;
|
|
141
|
+
if (!BASEAGENT_CANDIDATES.includes(input)) {
|
|
142
|
+
console.log(` 无效选择,可选: ${BASEAGENT_CANDIDATES.join('/')}`);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (!available.includes(input)) {
|
|
146
|
+
console.log(` ${input} 当前环境不可用(可用: ${available.join('/')})`);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
chosen = input;
|
|
115
150
|
}
|
|
116
|
-
chosen
|
|
117
|
-
}
|
|
118
|
-
return chosen;
|
|
119
|
-
}
|
|
120
|
-
async function askProjectsDefaultPath() {
|
|
121
|
-
const defaultDir = path.join(p.root, 'projects', 'default');
|
|
122
|
-
const input = (await ask(rl, `项目默认目录 [${defaultDir}]: `)).trim();
|
|
123
|
-
const resolved = input || defaultDir;
|
|
124
|
-
if (!path.isAbsolute(resolved)) {
|
|
125
|
-
console.log(' ⚠ 需要绝对路径,已跳过');
|
|
126
|
-
return undefined;
|
|
151
|
+
return chosen;
|
|
127
152
|
}
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
else {
|
|
153
|
+
async function askProjectsDefaultPath() {
|
|
154
|
+
const defaultDir = path.join(p.root, 'projects', 'default');
|
|
155
|
+
const input = (await ask(rl, `项目默认目录 [${defaultDir}]: `)).trim();
|
|
156
|
+
const resolved = input || defaultDir;
|
|
157
|
+
if (!path.isAbsolute(resolved)) {
|
|
158
|
+
console.log(' ⚠ 需要绝对路径,已跳过');
|
|
135
159
|
return undefined;
|
|
136
160
|
}
|
|
161
|
+
if (!fs.existsSync(resolved)) {
|
|
162
|
+
const create = (await ask(rl, ` 目录不存在,是否创建?[Y/n]: `)).trim().toLowerCase();
|
|
163
|
+
if (create === '' || create === 'y' || create === 'yes') {
|
|
164
|
+
fs.mkdirSync(resolved, { recursive: true });
|
|
165
|
+
console.log(` ✓ 已创建 ${resolved}`);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return resolved;
|
|
137
172
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
173
|
+
try {
|
|
174
|
+
if (exists) {
|
|
175
|
+
const ans = (await ask(rl, `配置文件已存在: ${defaultsPath}\n 是否覆盖?[y/N] `)).trim().toLowerCase();
|
|
176
|
+
if (ans === 'y' || ans === 'yes') {
|
|
177
|
+
const chosen = await askBaseagent();
|
|
178
|
+
const projectsDefaultPath = await askProjectsDefaultPath();
|
|
179
|
+
writeDefaults(chosen, available, projectsDefaultPath);
|
|
180
|
+
console.log(`\n✓ 已覆盖: ${defaultsPath}`);
|
|
181
|
+
console.log(` active_baseagent: ${chosen}\n`);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
console.log(' 已跳过(保留现有配置)\n');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
144
188
|
const chosen = await askBaseagent();
|
|
145
189
|
const projectsDefaultPath = await askProjectsDefaultPath();
|
|
146
190
|
writeDefaults(chosen, available, projectsDefaultPath);
|
|
147
|
-
console.log(`\n✓
|
|
191
|
+
console.log(`\n✓ 已创建: ${defaultsPath}`);
|
|
148
192
|
console.log(` active_baseagent: ${chosen}\n`);
|
|
149
193
|
}
|
|
150
|
-
|
|
151
|
-
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
try {
|
|
197
|
+
rl.close();
|
|
152
198
|
}
|
|
199
|
+
catch { /* ignore */ }
|
|
153
200
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/** 补全控制 AID + owners(可单独调用,不走 baseagent 向导)。 */
|
|
204
|
+
export async function initTail() {
|
|
205
|
+
// 提示创建 agent(两分支汇合后执行一次)
|
|
206
|
+
const { agents } = loadAllAgents();
|
|
207
|
+
if (agents.length === 0) {
|
|
208
|
+
console.log('\n提示:尚无 agent,运行以下命令创建:');
|
|
209
|
+
console.log(' evolclaw agent new <aid>.agentid.pub');
|
|
210
|
+
}
|
|
211
|
+
// 控制 AID:daemon 进程身份。缺失则生成并写回 evolclaw.json(幂等:已存在则跳过)。
|
|
212
|
+
const evc = loadEvolclawConfig();
|
|
213
|
+
if (evc.aid) {
|
|
214
|
+
console.log(`✓ 控制 AID 已存在: ${evc.aid}`);
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
try {
|
|
218
|
+
const { aid } = await generateControlAid();
|
|
219
|
+
saveEvolclawConfig({ ...evc, $schema_version: evc.$schema_version ?? 1, aid });
|
|
220
|
+
console.log(`✓ 已生成控制 AID: ${aid}`);
|
|
160
221
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
if (agents.length === 0) {
|
|
164
|
-
console.log('提示:尚无 agent,运行以下命令创建:');
|
|
165
|
-
console.log(' evolclaw agent new <aid>.agentid.pub');
|
|
222
|
+
catch (e) {
|
|
223
|
+
console.error(`⚠️ 控制 AID 生成失败(Gateway 不可达?联网后重跑 evolclaw init 补全): ${e?.message || e}`);
|
|
166
224
|
}
|
|
167
225
|
}
|
|
168
|
-
|
|
226
|
+
// 配置进程级管理者(owners):仅交互式 + aid 已配置 + owners 未配置时询问
|
|
227
|
+
const evcForOwners = loadEvolclawConfig();
|
|
228
|
+
if (process.stdin.isTTY && evcForOwners.aid && (!evcForOwners.owners || evcForOwners.owners.length === 0)) {
|
|
229
|
+
const { isValidAid } = await import('../aun/aid/index.js');
|
|
230
|
+
const rlOwners = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
169
231
|
try {
|
|
170
|
-
|
|
232
|
+
const raw = (await ask(rlOwners, '\n请输入 EvolClaw 管理者 AID: ')).trim();
|
|
233
|
+
if (raw) {
|
|
234
|
+
const { valid, invalid } = parseOwnerAids(raw, isValidAid);
|
|
235
|
+
if (invalid.length > 0)
|
|
236
|
+
console.log(` ⚠ 跳过非法 AID: ${invalid.join(', ')}`);
|
|
237
|
+
if (valid.length > 0) {
|
|
238
|
+
saveEvolclawConfig({ ...loadEvolclawConfig(), owners: valid });
|
|
239
|
+
console.log(` ✓ 已配置管理者: ${valid.join(', ')}`);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
console.log(' 未输入合法 AID,已跳过 owners 配置');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
console.log(' 已跳过 owners 配置(可日后编辑 evolclaw.json 或重跑 evolclaw init)');
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
finally {
|
|
250
|
+
try {
|
|
251
|
+
rlOwners.close();
|
|
252
|
+
}
|
|
253
|
+
catch { /* ignore */ }
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// ECWeb:交互式 + 未配置时询问是否启用
|
|
257
|
+
if (process.stdin.isTTY) {
|
|
258
|
+
const evcEcweb = loadEvolclawConfig();
|
|
259
|
+
if (evcEcweb.ecweb?.enabled === undefined) {
|
|
260
|
+
const rlEcweb = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
261
|
+
try {
|
|
262
|
+
const ans = (await ask(rlEcweb, '\n是否在 evolclaw start 时自动启动 ECWeb 控制台?[y/N] ')).trim().toLowerCase();
|
|
263
|
+
if (ans === 'y' || ans === 'yes') {
|
|
264
|
+
saveEvolclawConfig({ ...loadEvolclawConfig(), ecweb: { enabled: true } });
|
|
265
|
+
console.log(' ✓ 已启用 ECWeb(evolclaw start 将自动在后台启动)');
|
|
266
|
+
console.log(' 提示:首次访问运行 ec watch web 查看配对码和 URL');
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
saveEvolclawConfig({ ...loadEvolclawConfig(), ecweb: { enabled: false } });
|
|
270
|
+
console.log(' 已跳过(可日后运行 ec watch web 手动启动,或编辑 evolclaw.json)');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
try {
|
|
275
|
+
rlEcweb.close();
|
|
276
|
+
}
|
|
277
|
+
catch { }
|
|
278
|
+
}
|
|
171
279
|
}
|
|
172
|
-
catch { /* ignore */ }
|
|
173
280
|
}
|
|
174
281
|
}
|
|
175
282
|
/**
|
package/dist/cli/model.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { isHelpFlag, wantsHelp, getArgValue } from './help.js';
|
|
14
14
|
import { ModelScopeError, normalizePeer, determineScope, activeBaseagent, readScope, writeScope, clearScope, resolveEffectiveModel, } from '../core/model/model-scope.js';
|
|
15
15
|
import { loadDefaults, loadAgent } from '../config-store.js';
|
|
16
|
-
import { resolveAnthropicConfig } from '../agents/
|
|
16
|
+
import { resolveAnthropicConfig } from '../agents/baseagent.js';
|
|
17
17
|
import { getCatalog, getModelInfo } from '../core/model/model-catalog.js';
|
|
18
18
|
const ALL_EFFORTS = ['low', 'medium', 'high', 'xhigh', 'max', 'auto'];
|
|
19
19
|
const SCOPE_LABEL = {
|