@router-agent/runtime 0.3.31 → 0.3.32

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.
Files changed (43) hide show
  1. package/package.json +3 -3
  2. package/dist/orca/commands.js +0 -60
  3. package/dist/orca/commands.js.map +0 -1
  4. package/dist/orca/index.js +0 -452
  5. package/dist/orca/index.js.map +0 -1
  6. package/dist/orca/options.js +0 -33
  7. package/dist/orca/options.js.map +0 -1
  8. package/dist/orca/report-poller.js +0 -143
  9. package/dist/orca/report-poller.js.map +0 -1
  10. package/dist/runtimes/acp/admin.js +0 -470
  11. package/dist/runtimes/acp/admin.js.map +0 -1
  12. package/dist/runtimes/acp/agents.js +0 -167
  13. package/dist/runtimes/acp/agents.js.map +0 -1
  14. package/dist/runtimes/acp/detect.js +0 -379
  15. package/dist/runtimes/acp/detect.js.map +0 -1
  16. package/dist/runtimes/acp/index.js +0 -633
  17. package/dist/runtimes/acp/index.js.map +0 -1
  18. package/dist/runtimes/acp/install.js +0 -264
  19. package/dist/runtimes/acp/install.js.map +0 -1
  20. package/dist/runtimes/acp/permissions.js +0 -83
  21. package/dist/runtimes/acp/permissions.js.map +0 -1
  22. package/dist/runtimes/acp/protocol.js +0 -207
  23. package/dist/runtimes/acp/protocol.js.map +0 -1
  24. package/dist/runtimes/claude-code/index.js +0 -544
  25. package/dist/runtimes/claude-code/index.js.map +0 -1
  26. package/dist/runtimes/claude-code/inject.js +0 -71
  27. package/dist/runtimes/claude-code/inject.js.map +0 -1
  28. package/dist/runtimes/codex/client.js +0 -203
  29. package/dist/runtimes/codex/client.js.map +0 -1
  30. package/dist/runtimes/codex/detect.js +0 -240
  31. package/dist/runtimes/codex/detect.js.map +0 -1
  32. package/dist/runtimes/codex/index.js +0 -1066
  33. package/dist/runtimes/codex/index.js.map +0 -1
  34. package/dist/runtimes/herdr/agents.js +0 -38
  35. package/dist/runtimes/herdr/agents.js.map +0 -1
  36. package/dist/runtimes/herdr/commands.js +0 -68
  37. package/dist/runtimes/herdr/commands.js.map +0 -1
  38. package/dist/runtimes/herdr/index.js +0 -712
  39. package/dist/runtimes/herdr/index.js.map +0 -1
  40. package/dist/runtimes/herdr/options.js +0 -29
  41. package/dist/runtimes/herdr/options.js.map +0 -1
  42. package/dist/runtimes/herdr/server.js +0 -75
  43. package/dist/runtimes/herdr/server.js.map +0 -1
@@ -1,167 +0,0 @@
1
- /**
2
- * ACP Agent 静态目录。
3
- *
4
- * 这里只放纯常量与纯函数,不能依赖任何 Node 内置模块 —— Web 面板会把它
5
- * 一起打进前端包。探测、安装、spawn 等 Node-only 逻辑放在 detect.ts / install.ts。
6
- */
7
- export const ACP_AGENTS = [
8
- {
9
- id: 'claude',
10
- runtimeId: 'acp-claude',
11
- name: 'Claude Code',
12
- label: 'Claude Code (ACP)',
13
- hint: '通过 claude-agent-acp 接入,支持断线后 session/load 恢复',
14
- command: 'claude-agent-acp',
15
- args: [],
16
- package: { name: '@agentclientprotocol/claude-agent-acp', version: '0.101.0' },
17
- packageUrl: 'https://www.npmjs.com/package/@agentclientprotocol/claude-agent-acp',
18
- cli: {
19
- command: 'claude',
20
- label: 'Claude Code CLI',
21
- installUrl: 'https://docs.claude.com/en/docs/claude-code/setup',
22
- },
23
- probeArgs: ['--version'],
24
- env: { CLAUDE_AGENT_ACP_PROTOCOL: 'v1' },
25
- login: { command: 'claude', args: [], hint: '先完成 Claude Code 登录(claude 能正常对话)' },
26
- loadSession: true,
27
- // 已有 claude-code 内置运行时,Web 面板不再把它作为可选项展示。
28
- deprecated: true,
29
- },
30
- {
31
- id: 'codex',
32
- runtimeId: 'acp-codex',
33
- name: 'Codex',
34
- label: 'Codex (ACP)',
35
- hint: 'baldaworks codex-acp;依赖本机 codex CLI,不支持断线恢复',
36
- command: 'codex-acp',
37
- args: ['--message-streaming'],
38
- package: { name: 'codex-acp', version: '1.11.0' },
39
- packageUrl: 'https://www.npmjs.com/package/codex-acp',
40
- cli: {
41
- command: 'codex',
42
- label: 'OpenAI Codex CLI',
43
- installUrl: 'https://github.com/openai/codex',
44
- },
45
- probeArgs: ['version'],
46
- requires: [
47
- {
48
- command: 'codex',
49
- label: 'Codex CLI',
50
- capabilityArgs: ['app-server', '--help'],
51
- hint: '需要本机安装 codex CLI,且版本包含 app-server 子命令',
52
- },
53
- ],
54
- login: {
55
- command: 'codex-acp',
56
- args: ['login'],
57
- hint: '先运行 codex-acp login',
58
- check: { command: 'codex', args: ['login', 'status'] },
59
- },
60
- loadSession: false,
61
- // 已有 codex-app 内置运行时,Web 面板不再把它作为可选项展示。
62
- deprecated: true,
63
- },
64
- {
65
- id: 'opencode',
66
- runtimeId: 'acp-opencode',
67
- name: 'OpenCode',
68
- label: 'OpenCode',
69
- hint: 'opencode acp 原生 ACP 模式',
70
- command: 'opencode',
71
- args: ['acp'],
72
- probeArgs: ['--version'],
73
- installHint: 'brew install opencode(或参考 opencode 官方安装说明)',
74
- installUrl: 'https://opencode.ai/docs/',
75
- cli: { command: 'opencode', label: 'OpenCode CLI', installUrl: 'https://opencode.ai/docs/' },
76
- verifyRequired: true,
77
- loadSession: true,
78
- },
79
- {
80
- id: 'gemini',
81
- runtimeId: 'acp-gemini',
82
- name: 'Gemini CLI',
83
- label: 'Gemini CLI',
84
- hint: 'gemini --acp 实验性 ACP 模式',
85
- command: 'gemini',
86
- args: ['--acp'],
87
- probeArgs: ['--version'],
88
- installHint: 'npm i -g @google/gemini-cli',
89
- installUrl: 'https://github.com/google-gemini/gemini-cli',
90
- cli: { command: 'gemini', label: 'Gemini CLI', installUrl: 'https://github.com/google-gemini/gemini-cli' },
91
- verifyRequired: true,
92
- },
93
- {
94
- id: 'copilot',
95
- runtimeId: 'acp-copilot',
96
- name: 'GitHub Copilot CLI',
97
- label: 'GitHub Copilot CLI',
98
- hint: 'copilot --acp --stdio',
99
- command: 'copilot',
100
- args: ['--acp', '--stdio'],
101
- probeArgs: ['--version'],
102
- installHint: '参考 GitHub Copilot CLI 官方安装说明',
103
- installUrl: 'https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli',
104
- cli: {
105
- command: 'copilot',
106
- label: 'GitHub Copilot CLI',
107
- installUrl: 'https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli',
108
- },
109
- verifyRequired: true,
110
- },
111
- {
112
- id: 'cursor',
113
- runtimeId: 'acp-cursor',
114
- name: 'Cursor CLI',
115
- label: 'Cursor CLI',
116
- hint: 'cursor-agent acp;旧版本可能没有 acp 子命令',
117
- command: 'cursor-agent',
118
- args: ['acp'],
119
- probeArgs: ['--version'],
120
- installHint: '升级 cursor-agent 到支持 acp 子命令的版本',
121
- installUrl: 'https://cursor.com/cli',
122
- cli: { command: 'cursor-agent', label: 'Cursor CLI', installUrl: 'https://cursor.com/cli' },
123
- verifyRequired: true,
124
- },
125
- {
126
- id: 'goose',
127
- runtimeId: 'acp-goose',
128
- name: 'Goose',
129
- label: 'Goose',
130
- hint: 'goose acp 原生 ACP 模式',
131
- command: 'goose',
132
- args: ['acp'],
133
- probeArgs: ['--version'],
134
- installHint: 'brew install block-goose-cli(或参考 Goose 官方安装说明)',
135
- installUrl: 'https://block.github.io/goose/docs/getting-started/installation',
136
- cli: {
137
- command: 'goose',
138
- label: 'Goose CLI',
139
- installUrl: 'https://block.github.io/goose/docs/getting-started/installation',
140
- },
141
- verifyRequired: true,
142
- },
143
- ];
144
- /** 按 agent id 或 runtime id 查目录项。 */
145
- export function acpAgentOf(idOrRuntimeId) {
146
- const value = idOrRuntimeId.trim();
147
- return ACP_AGENTS.find(agent => agent.id === value || agent.runtimeId === value);
148
- }
149
- /** 是否是目录内的动态 ACP 运行时 id(不含旧的通用 `acp`)。 */
150
- export function isAcpRuntimeId(id) {
151
- const value = id.trim();
152
- return ACP_AGENTS.some(agent => agent.runtimeId === value);
153
- }
154
- /**
155
- * 是否是已有原生运行时替代品的 ACP 运行时(Claude Code / Codex)。
156
- *
157
- * 这类运行时 id 依旧合法、依旧能派工,只是 Web 面板不再把它们列为可选项。
158
- */
159
- export function isDeprecatedAcpRuntimeId(id) {
160
- const value = id.trim();
161
- return ACP_AGENTS.some(agent => agent.runtimeId === value && agent.deprecated === true);
162
- }
163
- /** agent id → runtime id;未知 id 返回 null。 */
164
- export function acpRuntimeIdOf(idOrRuntimeId) {
165
- return acpAgentOf(idOrRuntimeId)?.runtimeId ?? null;
166
- }
167
- //# sourceMappingURL=agents.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../../../../packages/runtime/src/runtimes/acp/agents.ts"],"names":[],"mappings":"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"}
@@ -1,379 +0,0 @@
1
- import { existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
2
- import { tmpdir } from 'node:os';
3
- import { delimiter, isAbsolute, join } from 'node:path';
4
- import { realRunner } from '@router-agent/infra/process.js';
5
- import { acpAgentOf, ACP_AGENTS } from './agents.js';
6
- import { AcpConnection, AcpProtocolError } from './protocol.js';
7
- const DEFAULT_TIMEOUT_MS = 2_500;
8
- const REQUIRE_TIMEOUT_MS = 1_500;
9
- /** 运行时目录根:~/.router-agent/runtimes */
10
- export function acpRuntimesRoot(home) {
11
- return join(home, 'runtimes');
12
- }
13
- /** 某个 Agent 的 managed 安装目录:~/.router-agent/runtimes/<agentId> */
14
- export function managedAgentDir(home, agentId) {
15
- return join(acpRuntimesRoot(home), agentId);
16
- }
17
- /** 在 PATH 里解析命令;支持 Windows 的 PATHEXT。返回绝对路径。 */
18
- export function resolveExecutable(command, env) {
19
- const value = command.trim();
20
- if (!value)
21
- return undefined;
22
- if (isAbsolute(value) || value.includes('/') || value.includes('\\')) {
23
- return existsSync(value) ? value : undefined;
24
- }
25
- const pathValue = env.PATH ?? env.Path ?? '';
26
- const extensions = process.platform === 'win32'
27
- ? ['', '.cmd', '.exe', '.bat']
28
- : [''];
29
- for (const dir of pathValue.split(delimiter)) {
30
- if (!dir)
31
- continue;
32
- for (const ext of extensions) {
33
- const candidate = join(dir, `${value}${ext}`);
34
- if (existsSync(candidate))
35
- return candidate;
36
- }
37
- }
38
- return undefined;
39
- }
40
- function managedBin(agent, home) {
41
- const dir = join(managedAgentDir(home, agent.id), 'node_modules', '.bin');
42
- const names = process.platform === 'win32'
43
- ? [`${agent.command}.cmd`, `${agent.command}.exe`, agent.command]
44
- : [agent.command];
45
- for (const name of names) {
46
- const candidate = join(dir, name);
47
- if (existsSync(candidate))
48
- return candidate;
49
- }
50
- return undefined;
51
- }
52
- function optionRecordOf(config, runtimeId) {
53
- const value = config.runtime.options?.[runtimeId];
54
- return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
55
- }
56
- /** 读取某个 ACP 运行时的 args/env 覆盖。registry 与探测共用。 */
57
- export function acpRuntimeConfig(agent, config) {
58
- const options = optionRecordOf(config, agent.runtimeId);
59
- const args = Array.isArray(options.args)
60
- ? options.args.filter((item) => typeof item === 'string')
61
- : [...agent.args];
62
- const env = { ...(agent.env ?? {}) };
63
- if (options.env && typeof options.env === 'object' && !Array.isArray(options.env)) {
64
- for (const [key, value] of Object.entries(options.env)) {
65
- if (typeof value === 'string')
66
- env[key] = value;
67
- }
68
- }
69
- return { args, env };
70
- }
71
- export function installHintOf(agent) {
72
- return agent.package ? `ra runtime install ${agent.runtimeId}` : agent.installHint;
73
- }
74
- /**
75
- * 同步解析 Agent 命令,不 spawn 任何进程。
76
- *
77
- * 优先级:runtime.options.<id>.command → ~/.router-agent/runtimes/<agent>/node_modules/.bin
78
- * → PATH。找不到时返回 reason,registry 会把它变成 start() 的 runtime:unavailable。
79
- */
80
- export function resolveAgentCommand(agent, opts) {
81
- const options = optionRecordOf(opts.config, agent.runtimeId);
82
- const override = typeof options.command === 'string' ? options.command.trim() : '';
83
- if (override) {
84
- const resolved = resolveExecutable(override, opts.env);
85
- return resolved
86
- ? { command: resolved, source: 'config' }
87
- : { source: 'config', reason: `runtime.options.${agent.runtimeId}.command 指向的文件不存在:${override}` };
88
- }
89
- const managed = managedBin(agent, opts.home);
90
- if (managed)
91
- return { command: managed, source: 'managed' };
92
- const onPath = resolveExecutable(agent.command, opts.env);
93
- if (onPath)
94
- return { command: onPath, source: 'path' };
95
- return { reason: `未找到 ${agent.command},也没有 managed 安装` };
96
- }
97
- export function parseVersion(text) {
98
- const match = /(\d+)\.(\d+)\.(\d+)/.exec(text);
99
- return match ? `${match[1]}.${match[2]}.${match[3]}` : undefined;
100
- }
101
- function compareVersion(a, b) {
102
- const pa = a.split('.').map(Number);
103
- const pb = b.split('.').map(Number);
104
- for (let i = 0; i < 3; i += 1) {
105
- const diff = (pa[i] ?? 0) - (pb[i] ?? 0);
106
- if (diff !== 0)
107
- return diff;
108
- }
109
- return 0;
110
- }
111
- function tail(text, max = 300) {
112
- const value = text.trim().replace(/\s+/g, ' ');
113
- return value.length <= max ? value : `…${value.slice(-max)}`;
114
- }
115
- async function probe(runner, bin, args, opts) {
116
- try {
117
- return await runner(bin).run([...args], {
118
- cwd: opts.cwd,
119
- env: { ...process.env, ...opts.env },
120
- timeoutMs: opts.timeoutMs,
121
- });
122
- }
123
- catch (error) {
124
- return { code: 127, stdout: '', stderr: error instanceof Error ? error.message : String(error) };
125
- }
126
- }
127
- async function detectOne(agent, opts) {
128
- const runner = opts.runner ?? realRunner;
129
- const base = {
130
- id: agent.runtimeId,
131
- name: agent.name,
132
- label: agent.label,
133
- hint: agent.hint,
134
- status: 'not-installed',
135
- installable: Boolean(agent.package),
136
- ...(agent.package ? { packageName: agent.package.name } : {}),
137
- ...(installHintOf(agent) ? { installHint: installHintOf(agent) } : {}),
138
- ...(agent.login ? { loginHint: agent.login.hint } : {}),
139
- ...(agent.loadSession !== undefined ? { loadSession: agent.loadSession } : {}),
140
- ...(agent.verifyRequired ? { verifyRequired: true } : {}),
141
- ...(agent.deprecated ? { deprecated: true } : {}),
142
- };
143
- const resolved = resolveAgentCommand(agent, { home: opts.home, env: opts.env, config: opts.config });
144
- // CLI 与 ACP 扩展分开探测:例如 claude 已安装但 claude-agent-acp 还没装,
145
- // 卡片应该只显示「安装 ACP 扩展」,而不是笼统的「未安装」。
146
- const cliCommand = agent.cli?.command ?? agent.command;
147
- const cliBin = cliCommand === agent.command && resolved.command
148
- ? resolved.command
149
- : resolveExecutable(cliCommand, opts.env);
150
- let cliVersion;
151
- if (cliBin && cliCommand !== agent.command) {
152
- const cliProbe = await probe(runner, cliBin, ['--version'], {
153
- cwd: opts.home,
154
- env: opts.env,
155
- timeoutMs: REQUIRE_TIMEOUT_MS,
156
- });
157
- if (cliProbe.code === 0)
158
- cliVersion = parseVersion(cliProbe.stdout) ?? parseVersion(cliProbe.stderr);
159
- }
160
- const installUrl = agent.cli?.installUrl ?? agent.installUrl;
161
- const cli = {
162
- command: cliCommand,
163
- label: agent.cli?.label ?? agent.label,
164
- installed: Boolean(cliBin),
165
- ...(cliVersion ? { version: cliVersion } : {}),
166
- ...(installUrl ? { installUrl } : {}),
167
- };
168
- base.cli = cli;
169
- if (agent.package) {
170
- base.extension = {
171
- packageName: agent.package.name,
172
- installed: Boolean(resolved.command),
173
- installable: true,
174
- ...(agent.packageUrl ? { installUrl: agent.packageUrl } : {}),
175
- };
176
- }
177
- if (!resolved.command) {
178
- return { ...base, source: resolved.source, reason: resolved.reason };
179
- }
180
- const command = resolved.command;
181
- const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
182
- const probeArgs = agent.probeArgs ?? ['--version'];
183
- const versionResult = await probe(runner, command, probeArgs, { cwd: opts.home, env: opts.env, timeoutMs });
184
- if (versionResult.code !== 0) {
185
- return {
186
- ...base,
187
- status: 'incompatible',
188
- command,
189
- source: resolved.source,
190
- reason: `版本探测失败(${probeArgs.join(' ')}):${tail(versionResult.stderr || versionResult.stdout)}`,
191
- };
192
- }
193
- const version = parseVersion(versionResult.stdout) ?? parseVersion(versionResult.stderr);
194
- if (version && cli.command === agent.command)
195
- cli.version = version;
196
- const requirements = [];
197
- let failure;
198
- for (const requirement of agent.requires ?? []) {
199
- const bin = resolveExecutable(requirement.command, opts.env);
200
- if (!bin) {
201
- const reason = `未找到 ${requirement.label}(${requirement.command})`;
202
- requirements.push({ label: requirement.label, ok: false, reason });
203
- failure ??= `${reason};${requirement.hint}`;
204
- continue;
205
- }
206
- const versionProbe = await probe(runner, bin, ['--version'], { cwd: opts.home, env: opts.env, timeoutMs: REQUIRE_TIMEOUT_MS });
207
- const requiredVersion = versionProbe.code === 0 ? parseVersion(versionProbe.stdout || versionProbe.stderr) : undefined;
208
- if (requirement.minVersion && requiredVersion && compareVersion(requiredVersion, requirement.minVersion) < 0) {
209
- const reason = `${requirement.label} ${requiredVersion} 低于要求 ${requirement.minVersion}`;
210
- requirements.push({ label: requirement.label, ok: false, version: requiredVersion, reason });
211
- failure ??= `${reason};${requirement.hint}`;
212
- continue;
213
- }
214
- if (requirement.capabilityArgs) {
215
- const capability = await probe(runner, bin, requirement.capabilityArgs, { cwd: opts.home, env: opts.env, timeoutMs: REQUIRE_TIMEOUT_MS });
216
- if (capability.code !== 0) {
217
- const reason = `${requirement.label} 缺少 ${requirement.capabilityArgs.join(' ')} 能力(可能是版本过旧)`;
218
- requirements.push({ label: requirement.label, ok: false, version: requiredVersion, reason });
219
- failure ??= `${reason};${requirement.hint}`;
220
- continue;
221
- }
222
- }
223
- requirements.push({ label: requirement.label, ok: true, ...(requiredVersion ? { version: requiredVersion } : {}) });
224
- }
225
- if (failure) {
226
- return {
227
- ...base,
228
- status: 'incompatible',
229
- command,
230
- source: resolved.source,
231
- ...(version ? { version } : {}),
232
- reason: failure,
233
- ...(requirements.length > 0 ? { requires: requirements } : {}),
234
- };
235
- }
236
- if (agent.login?.check) {
237
- const login = await probe(runner, resolveExecutable(agent.login.check.command, opts.env) ?? agent.login.check.command, agent.login.check.args, {
238
- cwd: opts.home,
239
- env: opts.env,
240
- timeoutMs: REQUIRE_TIMEOUT_MS,
241
- });
242
- if (login.code !== 0) {
243
- return {
244
- ...base,
245
- status: 'needs-auth',
246
- command,
247
- source: resolved.source,
248
- ...(version ? { version } : {}),
249
- reason: agent.login.hint,
250
- ...(requirements.length > 0 ? { requires: requirements } : {}),
251
- };
252
- }
253
- }
254
- if (agent.verifyRequired) {
255
- return {
256
- ...base,
257
- status: 'unverified',
258
- command,
259
- source: resolved.source,
260
- ...(version ? { version } : {}),
261
- reason: '版本探测通过,建议运行 ra runtime check 做完整 ACP 握手',
262
- ...(requirements.length > 0 ? { requires: requirements } : {}),
263
- };
264
- }
265
- return {
266
- ...base,
267
- status: 'ready',
268
- command,
269
- source: resolved.source,
270
- ...(version ? { version } : {}),
271
- ...(requirements.length > 0 ? { requires: requirements } : {}),
272
- };
273
- }
274
- /** 并行探测全部 ACP Agent;单个失败不抛,只体现在 status/reason。 */
275
- export async function detectAcpAgents(opts) {
276
- const choices = await Promise.all(ACP_AGENTS.map(agent => detectOne(agent, opts)));
277
- return { detectedAt: new Date().toISOString(), choices };
278
- }
279
- /** 只探测一个 Agent;未知 id 返回 null。 */
280
- export async function detectAcpAgent(idOrRuntimeId, opts) {
281
- const agent = acpAgentOf(idOrRuntimeId);
282
- return agent ? detectOne(agent, opts) : null;
283
- }
284
- function detectCachePath(home) {
285
- return join(acpRuntimesRoot(home), 'detect.json');
286
- }
287
- export function readDetectionSnapshot(home) {
288
- try {
289
- const parsed = JSON.parse(readFileSync(detectCachePath(home), 'utf8'));
290
- return Array.isArray(parsed?.choices) ? parsed : null;
291
- }
292
- catch {
293
- return null;
294
- }
295
- }
296
- export function writeDetectionSnapshot(home, snapshot) {
297
- const path = detectCachePath(home);
298
- mkdirSync(acpRuntimesRoot(home), { recursive: true });
299
- const tmp = `${path}.tmp`;
300
- writeFileSync(tmp, `${JSON.stringify(snapshot, null, 2)}\n`, 'utf8');
301
- renameSync(tmp, path);
302
- }
303
- /**
304
- * L2 完整握手:initialize + session/new(临时 cwd),随后关闭。
305
- * 只在 `ra runtime check` / Web「检查」时调用。
306
- */
307
- export async function checkAcpAgent(idOrRuntimeId, opts) {
308
- const agent = acpAgentOf(idOrRuntimeId);
309
- if (!agent)
310
- return { ok: false, status: 'not-installed', detail: `未知 ACP Agent: ${idOrRuntimeId}` };
311
- const resolved = resolveAgentCommand(agent, { home: opts.home, env: opts.env, config: opts.config });
312
- if (!resolved.command) {
313
- return { ok: false, status: 'not-installed', detail: resolved.reason ?? '未找到可执行文件' };
314
- }
315
- const { args, env } = acpRuntimeConfig(agent, opts.config);
316
- const timeoutMs = opts.timeoutMs ?? 10_000;
317
- const cwd = mkdtempSync(join(tmpdir(), 'ra-acp-check-'));
318
- const connection = new AcpConnection({
319
- command: resolved.command,
320
- args,
321
- cwd,
322
- env: { ...process.env, ...opts.env, ...env },
323
- onNotification: () => { },
324
- onRequest: async (method) => {
325
- if (method === 'session/request_permission')
326
- return { outcome: { outcome: 'cancelled' } };
327
- throw new AcpProtocolError(-32601, `ra runtime check 不处理该请求: ${method}`);
328
- },
329
- onExit: () => { },
330
- });
331
- let protocolVersion;
332
- let agentInfo;
333
- let loadSession;
334
- try {
335
- const init = await connection.request('initialize', {
336
- protocolVersion: 1,
337
- clientCapabilities: { fs: { readTextFile: false, writeTextFile: false }, terminal: false },
338
- clientInfo: { name: 'router-agent', title: 'Router Agent', version: '0.1.0' },
339
- }, timeoutMs);
340
- protocolVersion = init?.protocolVersion;
341
- agentInfo = init?.agentInfo;
342
- loadSession = init?.agentCapabilities?.loadSession;
343
- if (Number(protocolVersion) !== 1) {
344
- return {
345
- ok: false,
346
- status: 'incompatible',
347
- detail: `协议版本不兼容: ${protocolVersion ?? 'unknown'}`,
348
- ...(protocolVersion !== undefined ? { protocolVersion } : {}),
349
- ...(agentInfo ? { agentInfo } : {}),
350
- ...(loadSession !== undefined ? { loadSession } : {}),
351
- };
352
- }
353
- await connection.request('session/new', { cwd, mcpServers: [] }, timeoutMs);
354
- return {
355
- ok: true,
356
- status: 'ready',
357
- detail: `initialize + session/new 成功(协议 v1${loadSession ? ',支持 session/load' : ''})`,
358
- ...(protocolVersion !== undefined ? { protocolVersion } : {}),
359
- ...(agentInfo ? { agentInfo } : {}),
360
- ...(loadSession !== undefined ? { loadSession } : {}),
361
- };
362
- }
363
- catch (error) {
364
- const detail = error instanceof Error ? error.message : String(error);
365
- return {
366
- ok: false,
367
- status: 'incompatible',
368
- detail,
369
- ...(protocolVersion !== undefined ? { protocolVersion } : {}),
370
- ...(agentInfo ? { agentInfo } : {}),
371
- ...(loadSession !== undefined ? { loadSession } : {}),
372
- };
373
- }
374
- finally {
375
- await connection.close().catch(() => { });
376
- rmSync(cwd, { recursive: true, force: true });
377
- }
378
- }
379
- //# sourceMappingURL=detect.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../../../../packages/runtime/src/runtimes/acp/detect.ts"],"names":[],"mappings":"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"}