@router-agent/runtime 0.3.31 → 0.3.33

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 (64) hide show
  1. package/dist/agents/claude-trust.d.ts +29 -0
  2. package/dist/agents/claude-trust.js +94 -0
  3. package/dist/agents/claude-trust.js.map +1 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/plugins/loader.d.ts +1 -0
  8. package/dist/plugins/loader.js +2 -0
  9. package/dist/plugins/loader.js.map +1 -1
  10. package/dist/plugins/types.d.ts +2 -0
  11. package/dist/port.d.ts +7 -0
  12. package/dist/port.js.map +1 -1
  13. package/dist/runtimes/builtin-options.d.ts +1 -0
  14. package/dist/runtimes/builtin-options.js +34 -0
  15. package/dist/runtimes/builtin-options.js.map +1 -1
  16. package/dist/runtimes/catalog.d.ts +1 -0
  17. package/dist/runtimes/catalog.js +9 -0
  18. package/dist/runtimes/catalog.js.map +1 -1
  19. package/dist/runtimes/options.d.ts +1 -1
  20. package/dist/runtimes/options.js +3 -3
  21. package/dist/runtimes/options.js.map +1 -1
  22. package/package.json +3 -3
  23. package/dist/orca/commands.js +0 -60
  24. package/dist/orca/commands.js.map +0 -1
  25. package/dist/orca/index.js +0 -452
  26. package/dist/orca/index.js.map +0 -1
  27. package/dist/orca/options.js +0 -33
  28. package/dist/orca/options.js.map +0 -1
  29. package/dist/orca/report-poller.js +0 -143
  30. package/dist/orca/report-poller.js.map +0 -1
  31. package/dist/runtimes/acp/admin.js +0 -470
  32. package/dist/runtimes/acp/admin.js.map +0 -1
  33. package/dist/runtimes/acp/agents.js +0 -167
  34. package/dist/runtimes/acp/agents.js.map +0 -1
  35. package/dist/runtimes/acp/detect.js +0 -379
  36. package/dist/runtimes/acp/detect.js.map +0 -1
  37. package/dist/runtimes/acp/index.js +0 -633
  38. package/dist/runtimes/acp/index.js.map +0 -1
  39. package/dist/runtimes/acp/install.js +0 -264
  40. package/dist/runtimes/acp/install.js.map +0 -1
  41. package/dist/runtimes/acp/permissions.js +0 -83
  42. package/dist/runtimes/acp/permissions.js.map +0 -1
  43. package/dist/runtimes/acp/protocol.js +0 -207
  44. package/dist/runtimes/acp/protocol.js.map +0 -1
  45. package/dist/runtimes/claude-code/index.js +0 -544
  46. package/dist/runtimes/claude-code/index.js.map +0 -1
  47. package/dist/runtimes/claude-code/inject.js +0 -71
  48. package/dist/runtimes/claude-code/inject.js.map +0 -1
  49. package/dist/runtimes/codex/client.js +0 -203
  50. package/dist/runtimes/codex/client.js.map +0 -1
  51. package/dist/runtimes/codex/detect.js +0 -240
  52. package/dist/runtimes/codex/detect.js.map +0 -1
  53. package/dist/runtimes/codex/index.js +0 -1066
  54. package/dist/runtimes/codex/index.js.map +0 -1
  55. package/dist/runtimes/herdr/agents.js +0 -38
  56. package/dist/runtimes/herdr/agents.js.map +0 -1
  57. package/dist/runtimes/herdr/commands.js +0 -68
  58. package/dist/runtimes/herdr/commands.js.map +0 -1
  59. package/dist/runtimes/herdr/index.js +0 -712
  60. package/dist/runtimes/herdr/index.js.map +0 -1
  61. package/dist/runtimes/herdr/options.js +0 -29
  62. package/dist/runtimes/herdr/options.js.map +0 -1
  63. package/dist/runtimes/herdr/server.js +0 -75
  64. package/dist/runtimes/herdr/server.js.map +0 -1
@@ -1,452 +0,0 @@
1
- import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
2
- import { dirname, join } from 'node:path';
3
- import { buildWorkerPrompt } from '../spec/index.js';
4
- import { workBranch, worktreeName } from '../naming.js';
5
- import { resolveSession } from '../agents/registry.js';
6
- import { runtimeOptionDefault } from '../runtimes/options.js';
7
- import { ORCA_RUNTIME_ID } from '../runtimes/catalog.js';
8
- import { agentLaunch, terminalClose, terminalList, terminalRead, terminalSend, worktreeCreate, worktreeRemove, worktreeShow, } from './commands.js';
9
- export class OrcaCommandError extends Error {
10
- detail;
11
- constructor(detail) {
12
- super(formatCommandFailure(detail));
13
- this.name = 'OrcaCommandError';
14
- this.detail = detail;
15
- }
16
- }
17
- /** 把一次失败整理成便于日志与消息展示的一行。 */
18
- export function formatCommandFailure(detail) {
19
- const parts = [`orca:command-failed(${detail.command}): exit=${detail.code}`];
20
- if (detail.orcaCode)
21
- parts.push(`code=${detail.orcaCode}`);
22
- if (detail.orcaMessage)
23
- parts.push(`message=${detail.orcaMessage}`);
24
- if (detail.orcaCause)
25
- parts.push(`cause=${detail.orcaCause}`);
26
- if (detail.orcaOperationId)
27
- parts.push(`operationId=${detail.orcaOperationId}`);
28
- if (!detail.orcaCode && !detail.orcaMessage && detail.stdoutTail)
29
- parts.push(`stdout=${detail.stdoutTail}`);
30
- if (detail.stderrTail)
31
- parts.push(`stderr=${detail.stderrTail}`);
32
- return parts.join(' | ');
33
- }
34
- /** 从 argv 生成脱敏摘要:跳过长文本参数,保留可复现的关键选项。 */
35
- export function summarizeArgs(args) {
36
- const out = [];
37
- for (let i = 0; i < args.length; i += 1) {
38
- const arg = args[i];
39
- if (arg === '--prompt') {
40
- const value = args[i + 1] ?? '';
41
- out.push(`--prompt <${value.length} chars>`);
42
- i += 1;
43
- continue;
44
- }
45
- const next = args[i + 1];
46
- if (arg.startsWith('--') && next !== undefined && !next.startsWith('--')) {
47
- out.push(`${arg} ${next}`);
48
- i += 1;
49
- continue;
50
- }
51
- out.push(arg);
52
- }
53
- return out.join(' ');
54
- }
55
- export function describeCommandFailure(argv, res) {
56
- const command = argv.slice(0, 2).join(' ');
57
- const args = summarizeArgs(argv.slice(2));
58
- let orcaCode;
59
- let orcaMessage;
60
- let orcaCause;
61
- let orcaOperationId;
62
- let stdoutTail = '';
63
- try {
64
- const parsed = JSON.parse(res.stdout);
65
- if (parsed?.error) {
66
- if (parsed.error.code)
67
- orcaCode = String(parsed.error.code);
68
- if (parsed.error.message)
69
- orcaMessage = String(parsed.error.message);
70
- const data = parsed.error.data;
71
- if (data) {
72
- if (typeof data.cause === 'string') {
73
- // cause 可能是带堆栈的多行文本,只留第一行有效信息。
74
- const first = data.cause.split('\n').map((line) => line.trim()).find(Boolean);
75
- if (first)
76
- orcaCause = first.slice(0, 300);
77
- }
78
- if (typeof data.operationId === 'string' && data.operationId)
79
- orcaOperationId = data.operationId;
80
- }
81
- }
82
- else {
83
- stdoutTail = res.stdout.slice(0, 300);
84
- }
85
- }
86
- catch {
87
- stdoutTail = res.stdout.slice(0, 300);
88
- }
89
- return {
90
- command,
91
- code: res.code,
92
- ...(orcaCode ? { orcaCode } : {}),
93
- ...(orcaMessage ? { orcaMessage } : {}),
94
- ...(orcaCause ? { orcaCause } : {}),
95
- ...(orcaOperationId ? { orcaOperationId } : {}),
96
- args,
97
- stdoutTail,
98
- stderrTail: res.stderr.slice(0, 300),
99
- };
100
- }
101
- /** 解析 `orca worktree create --json` 的返回;不同 Orca 版本字段不同。 */
102
- export function parseCreateResult(stdout) {
103
- let json;
104
- try {
105
- json = JSON.parse(stdout);
106
- }
107
- catch {
108
- throw new Error(`orca:invalid-json: ${stdout.slice(0, 200)}`);
109
- }
110
- const root = json;
111
- if (root.ok === false) {
112
- throw new Error(`orca:create-failed: ${root.error?.message ?? JSON.stringify(root).slice(0, 200)}`);
113
- }
114
- const result = (root.result ?? root);
115
- const handle = result.launch?.outcome?.handle ?? result.agentTerminalHandle ?? result.terminalHandle ?? result.terminal?.handle;
116
- if (!handle)
117
- throw new Error(`orca:create-failed: 返回中没有 terminal handle: ${stdout.slice(0, 200)}`);
118
- const workdir = result.worktree?.path ?? result.worktreePath ?? result.path;
119
- const branch = result.worktree?.branch ?? result.branch;
120
- return {
121
- handle: String(handle),
122
- ...(workdir ? { workdir: String(workdir) } : {}),
123
- // Orca 分支名可能是 `refs/heads/xxx`;若同名分支已存在还会自动加数字后缀,回读一次保证记录准确。
124
- ...(branch ? { branch: String(branch).replace(/^refs\/heads\//, '') } : {}),
125
- };
126
- }
127
- /** Orca 的 linkedPR / linkedGitLabMR 状态归一化;GitLab 用 opened/locked 表示未关闭。 */
128
- function normalizeLinkedState(state) {
129
- const value = String(state ?? '').trim().toLowerCase();
130
- if (value === 'merged')
131
- return 'merged';
132
- if (value === 'closed')
133
- return 'closed';
134
- if (value === 'open' || value === 'opened' || value === 'locked')
135
- return 'open';
136
- return undefined;
137
- }
138
- export class OrcaRuntime {
139
- id = 'orca';
140
- capabilities = {
141
- agent: { liveStatus: true, processExit: false, output: true, activity: true, structuredInput: true, nudge: true },
142
- workspace: { cleanup: true, prLink: true, discovery: true },
143
- };
144
- runner;
145
- workersDir;
146
- home;
147
- agent;
148
- claudeProjectsDir;
149
- constructor(opts) {
150
- this.runner = opts.runner;
151
- this.workersDir = opts.workersDir;
152
- this.home = opts.home;
153
- // Orca 的 --prompt 必须配 --agent,没有「不传」这种形态,因此这里必须落到一个具体值。
154
- this.agent = String(opts.agent || runtimeOptionDefault(ORCA_RUNTIME_ID, 'agent') || '').trim();
155
- this.claudeProjectsDir = opts.claudeProjectsDir;
156
- }
157
- async start(ctx) {
158
- const statePath = ctx.report?.statePath ?? join(this.workersDir, ctx.ticket.id, 'state.json');
159
- const eventsPath = ctx.report?.eventsPath ?? join(this.workersDir, ctx.ticket.id, 'events.log');
160
- const name = worktreeName(ctx.ticket);
161
- // 每张工单自带 repo/branch(多项目派工);缺了说明是脏数据,直接报错不猜。
162
- const repo = ctx.ticket.repo;
163
- // 工单上的 branch 是「起始分支」;worktree 自己的工作分支由工单号 + 标题语义生成。
164
- const baseBranch = ctx.ticket.branch;
165
- const branch = workBranch(ctx.ticket);
166
- if (!repo)
167
- throw new Error('orca:missing-repo: 工单没有指定仓库,拒绝创建 worktree');
168
- if (!baseBranch)
169
- throw new Error('orca:missing-branch: 工单没有指定起始分支,拒绝创建 worktree');
170
- const prompt = ctx.brief?.contract ?? buildWorkerPrompt({
171
- ticket: ctx.ticket,
172
- mandateScope: ctx.ticket.title,
173
- statePath,
174
- eventsPath,
175
- repo,
176
- branch: baseBranch,
177
- workBranch: branch,
178
- workdir: ctx.workdir,
179
- ...(this.home ? { home: this.home } : {}),
180
- });
181
- const res = await this.run(worktreeCreate({
182
- repo,
183
- name,
184
- prompt,
185
- branch,
186
- ...(baseBranch ? { baseBranch } : {}),
187
- ...(this.agent ? { agent: this.agent } : {}),
188
- }));
189
- const parsed = parseCreateResult(res.stdout);
190
- const workdir = parsed.workdir ?? ctx.workdir;
191
- if (!workdir)
192
- throw new Error('orca:workdir-missing: worktree create 没有返回路径');
193
- this.writeMeta(ctx, {
194
- handle: parsed.handle,
195
- workdir,
196
- statePath,
197
- eventsPath,
198
- repo,
199
- branch: baseBranch,
200
- workBranch: parsed.branch ?? branch,
201
- ...(this.agent ? { agent: this.agent } : {}),
202
- });
203
- return {
204
- handle: parsed.handle,
205
- workdir,
206
- ...(parsed.branch ? { branch: parsed.branch } : { branch }),
207
- };
208
- }
209
- async deliver(ref, inputs, _opts) {
210
- const handle = this.handleOf(ref);
211
- const accepted = [];
212
- for (const input of inputs) {
213
- if (!input.text.trim())
214
- continue;
215
- await this.run(terminalSend(handle, renderInput(input)));
216
- accepted.push(input.id);
217
- }
218
- return { status: 'accepted', inputIds: accepted };
219
- }
220
- async registerContext(ref, items) {
221
- const text = renderContext(items);
222
- if (!text)
223
- return;
224
- await this.run(terminalSend(this.handleOf(ref), text));
225
- }
226
- async stop(ref, reason) {
227
- void reason;
228
- await this.run(terminalClose(this.handleOf(ref)));
229
- }
230
- async nudge(ref) {
231
- await this.run(terminalSend(this.handleOf(ref), 'status?'));
232
- }
233
- /** 中立活性:把 Orca 终端字段映射成 AgentStatus;查询失败返回 null。 */
234
- async status(ref) {
235
- const handle = this.handleOf(ref);
236
- let info;
237
- try {
238
- info = await this.inspect(handle);
239
- }
240
- catch {
241
- return null;
242
- }
243
- if (!info)
244
- return { alive: false, phase: 'lost', acceptingInput: false, detail: { source: 'orca' } };
245
- if (!info.connected) {
246
- return { alive: false, phase: 'lost', acceptingInput: false, detail: { source: 'orca', connected: false, orphaned: info.orphaned } };
247
- }
248
- if (info.orphaned && !info.writable) {
249
- return {
250
- alive: false,
251
- phase: 'unknown',
252
- acceptingInput: false,
253
- ...(info.lastOutputAt ? { lastActivityAt: info.lastOutputAt } : {}),
254
- detail: { source: 'orca', orphaned: true, writable: false },
255
- };
256
- }
257
- return {
258
- alive: true,
259
- phase: 'running',
260
- acceptingInput: info.writable,
261
- ...(info.lastOutputAt ? { lastActivityAt: info.lastOutputAt } : {}),
262
- detail: { source: 'orca', orphaned: info.orphaned, writable: info.writable },
263
- };
264
- }
265
- /** 输出尾部:等价于旧的 read()。 */
266
- async output(ref, opts = {}) {
267
- return this.read(this.handleOf(ref), opts);
268
- }
269
- /** 结构化活动:优先读 Agent 自己的会话记录;没有 workdir 时返回 null。 */
270
- async activity(query) {
271
- const workdir = query.ref.workdir;
272
- if (!workdir)
273
- return null;
274
- return this.session(workdir, query.opts ?? {});
275
- }
276
- async inspectWorkspace(ref) {
277
- const selector = ref.workspaceRef ?? `path:${ref.workdir}`;
278
- const worktree = await this.inspectWorktree(selector);
279
- if (!worktree)
280
- return null;
281
- const linked = (worktree.linkedPR ?? worktree.linkedGitLabMR ?? worktree.worktree?.linkedPR);
282
- const branch = String(worktree.branch ?? worktree.worktree?.branch ?? '').replace(/^refs\/heads\//, '');
283
- const linkedState = normalizeLinkedState(linked?.state);
284
- return {
285
- workdir: String(worktree.path ?? worktree.worktree?.path ?? ref.workdir),
286
- branch,
287
- ...(linked && Number(linked.number ?? linked.iid) > 0
288
- ? {
289
- linkedPr: {
290
- number: Number(linked.number ?? linked.iid),
291
- url: String(linked.url ?? linked.webUrl ?? ''),
292
- ...(linkedState ? { state: linkedState } : {}),
293
- },
294
- }
295
- : {}),
296
- };
297
- }
298
- async removeWorkspace(ref) {
299
- const selector = ref.workspaceRef ?? `path:${ref.workdir}`;
300
- await this.removeWorktree(selector);
301
- }
302
- async listRepos() {
303
- const res = await this.run(['repo', 'list', '--json']);
304
- const parsed = parseJsonOrThrow(res.stdout);
305
- const result = (parsed.result ?? parsed);
306
- const list = result.repos ?? result.rows ?? result.items ?? (Array.isArray(result) ? result : []);
307
- return (Array.isArray(list) ? list : []).map((item) => ({
308
- name: String(item.displayName ?? item.name ?? ''),
309
- path: String(item.path ?? ''),
310
- ...(item.kind ? { kind: String(item.kind) } : {}),
311
- }));
312
- }
313
- /** 旧接口:保留给兼容调用与单测。 */
314
- async inspect(handle) {
315
- const res = await this.run(terminalList());
316
- const parsed = parseJsonOrThrow(res.stdout);
317
- const terminals = extractTerminals(parsed);
318
- const found = terminals.find(t => String(t.handle) === handle);
319
- return found ? normalizeTerminal(found) : null;
320
- }
321
- /** 读取终端渲染屏幕的尾部输出;失败(终端已销毁 / 旧版 Orca)时交给调用方跳过本轮巡检。 */
322
- async read(handle, opts = {}) {
323
- const res = await this.run(terminalRead(handle, opts));
324
- const parsed = parseJsonOrThrow(res.stdout);
325
- const raw = parsed.result?.terminal ?? parsed.terminal;
326
- if (!raw)
327
- return null;
328
- const status = raw.status === 'running' || raw.status === 'exited' ? raw.status : 'unknown';
329
- const lines = Array.isArray(raw.tail) ? raw.tail.map((line) => String(line)) : [];
330
- return { status, lines, ...(raw.source ? { source: String(raw.source) } : {}) };
331
- }
332
- /**
333
- * 优先读 Agent 自己的结构化会话记录(按配置的 Agent 选读取器),
334
- * 比终端屏幕干净得多;找不到时返回 null,由调用方退回 read()。
335
- */
336
- async session(workdir, opts = {}) {
337
- const resolved = resolveSession(workdir, this.agent, {
338
- ...(this.claudeProjectsDir ? { roots: { claude: this.claudeProjectsDir } } : {}),
339
- });
340
- if (!resolved)
341
- return null;
342
- return resolved.reader.read(workdir, opts);
343
- }
344
- async inspectWorktree(selector) {
345
- const res = await this.run(worktreeShow(selector));
346
- const parsed = parseJsonOrThrow(res.stdout);
347
- const result = parsed.result ?? parsed;
348
- return (result.worktree ?? result);
349
- }
350
- async removeWorktree(selector, opts = {}) {
351
- await this.run(worktreeRemove(selector, opts));
352
- }
353
- async relaunchAgent(worktree, prompt) {
354
- await this.run(agentLaunch({ worktree, prompt, ...(this.agent ? { agent: this.agent } : {}) }));
355
- }
356
- handleOf(ref) {
357
- return typeof ref === 'string' ? ref : ref.handle;
358
- }
359
- async run(argv) {
360
- const res = await this.runner.run(argv);
361
- if (res.code !== 0) {
362
- throw new OrcaCommandError(describeCommandFailure(argv, res));
363
- }
364
- return res;
365
- }
366
- writeMeta(ctx, extra) {
367
- const dir = join(this.workersDir, ctx.ticket.id);
368
- mkdirSync(dir, { recursive: true });
369
- const metaPath = join(dir, 'meta.json');
370
- const meta = {
371
- schemaVersion: 2,
372
- ticketId: ctx.ticket.id,
373
- assignmentId: ctx.assignment.id,
374
- handle: extra.handle,
375
- workdir: extra.workdir,
376
- statePath: extra.statePath,
377
- eventsPath: extra.eventsPath,
378
- repo: extra.repo,
379
- /** 起始分支(base branch)。 */
380
- branch: extra.branch,
381
- /** worktree 自己实际使用的工作分支。 */
382
- workBranch: extra.workBranch,
383
- /** 派工时用的 Agent;没配时留空,表示跟随 Orca 自己的默认。 */
384
- ...(extra.agent ? { agent: extra.agent } : {}),
385
- runtime: this.id,
386
- status: 'running',
387
- startedAt: new Date().toISOString(),
388
- };
389
- writeFileSync(metaPath, `${JSON.stringify(meta, null, 2)}\n`, 'utf8');
390
- if (!existsSync(extra.eventsPath))
391
- writeFileSync(extra.eventsPath, '', 'utf8');
392
- mkdirSync(dirname(metaPath), { recursive: true });
393
- }
394
- }
395
- /**
396
- * 投递时带上输入 id:worker 只有看到 id 才能写进 acked_inputs,Router 才不会重投。
397
- */
398
- export function renderInput(input) {
399
- return `【Router 输入 ${input.id}】\n${input.text}`;
400
- }
401
- function renderContext(items) {
402
- const lines = [];
403
- for (const item of items) {
404
- if (item.kind === 'system-prompt')
405
- lines.push(item.text);
406
- else if (item.kind === 'file')
407
- lines.push(`# 文件 ${item.path}\n${item.content}`);
408
- else if (item.kind === 'env')
409
- lines.push(`${item.key}=${item.value}`);
410
- else
411
- lines.push(`# 目录 ${item.path}`);
412
- }
413
- return lines.join('\n\n');
414
- }
415
- function parseJsonOrThrow(stdout) {
416
- try {
417
- return JSON.parse(stdout);
418
- }
419
- catch {
420
- throw new Error(`orca:invalid-json: ${stdout.slice(0, 200)}`);
421
- }
422
- }
423
- function extractTerminals(parsed) {
424
- const root = parsed;
425
- const result = root.result ?? root;
426
- const list = result.terminals ?? result.rows ?? result.items ?? (Array.isArray(result) ? result : []);
427
- return Array.isArray(list) ? list : [];
428
- }
429
- function normalizeTerminal(raw) {
430
- return {
431
- handle: String(raw.handle ?? ''),
432
- connected: Boolean(raw.connected),
433
- writable: Boolean(raw.writable),
434
- orphaned: Boolean(raw.orphaned),
435
- lastOutputAt: toIsoTime(raw.lastOutputAt),
436
- worktreePath: String(raw.worktreePath ?? ''),
437
- branch: String(raw.branch ?? ''),
438
- };
439
- }
440
- /** Orca 的 lastOutputAt 实测是毫秒时间戳数字,也兼容 ISO 字符串与秒级时间戳。 */
441
- export function toIsoTime(value) {
442
- if (value === null || value === undefined || value === '')
443
- return '';
444
- if (typeof value === 'number' || (typeof value === 'string' && /^\d+$/.test(value))) {
445
- const n = Number(value);
446
- const ms = n > 1e12 ? n : n > 1e9 ? n * 1000 : 0;
447
- return ms > 0 ? new Date(ms).toISOString() : '';
448
- }
449
- const parsed = Date.parse(String(value));
450
- return Number.isFinite(parsed) ? new Date(parsed).toISOString() : '';
451
- }
452
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/orca/index.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- /**
2
- * Orca 运行时的可配置项声明。
3
- *
4
- * 只放纯常量(面板会把它打进前端包)。这里声明的是「ra 允许覆盖什么」,
5
- * 具体的命令行参数由 Orca adapter 自己映射,声明本身不含任何 Orca 逻辑。
6
- */
7
- import { ORCA_RUNTIME_ID } from '../runtimes/catalog.js';
8
- /**
9
- * Orca 支持的 TUI Agent(与 `orca agent-context` 里的 `--agent` 取值一致)。
10
- *
11
- * Orca 的 `worktree create --prompt` 必须同时给 `--agent`,没有「不传」这种形态,
12
- * 所以这里给一个显式默认值;用户可以覆盖成其它 Agent。
13
- */
14
- export const ORCA_OPTION_SPEC = {
15
- runtimeId: ORCA_RUNTIME_ID,
16
- fields: [
17
- {
18
- key: 'agent',
19
- label: '执行 Agent',
20
- kind: 'select',
21
- default: 'claude',
22
- options: [
23
- { value: 'claude', label: 'claude · Claude Code' },
24
- { value: 'codex', label: 'codex · Codex' },
25
- { value: 'opencode', label: 'opencode · OpenCode' },
26
- { value: 'devin', label: 'devin · Devin' },
27
- { value: 'antigravity', label: 'antigravity · Antigravity' },
28
- ],
29
- hint: 'Orca 在工单 worktree 里启动哪个 Agent;默认 Claude Code',
30
- },
31
- ],
32
- };
33
- //# sourceMappingURL=options.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../../packages/runtime/src/orca/options.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGxD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,SAAS,EAAE,eAAe;IAC1B,MAAM,EAAE;QACN;YACE,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,sBAAsB,EAAE;gBAClD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE;gBAC1C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,qBAAqB,EAAE;gBACnD,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE;gBAC1C,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,2BAA2B,EAAE;aAC7D;YACD,IAAI,EAAE,8CAA8C;SACrD;KACF;CACF,CAAA"}
@@ -1,143 +0,0 @@
1
- import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { z } from 'zod';
4
- /** 旧版 state.json 的交付物字段,仅用于向后兼容,不再参与新协议。 */
5
- const LegacyDeliverableSchema = z.object({
6
- kind: z.string().optional(),
7
- content: z.string().default(''),
8
- title: z.string().optional(),
9
- url: z.string().default(''),
10
- }).nullable().optional();
11
- const StateSchema = z.object({
12
- ticket_id: z.string().min(1),
13
- assignment_id: z.string().default(''),
14
- turn: z.coerce.number().int().min(0).default(0),
15
- state: z.enum(['progress', 'ready', 'blocked', 'failed', 'dropped', 'waiting']),
16
- summary: z.string().min(1),
17
- human_action: z.string().nullable().optional(),
18
- pr_number: z.coerce.number().int().min(0).default(0),
19
- pr_url: z.string().default(''),
20
- /** Worker 要发给发起人的完整回复(Markdown)。 */
21
- reply: z.string().optional().default(''),
22
- /** 旧版交付物字段,读取时拼进 reply。 */
23
- deliverable: LegacyDeliverableSchema,
24
- acked_inputs: z.array(z.string()).default([]),
25
- updated_at: z.string().default(() => new Date().toISOString()),
26
- });
27
- /** 轮询 ~/.router-agent/workers/<ticketId>/state.json,按文件内容增量上报。 */
28
- export class ReportPoller {
29
- workersDir;
30
- onState;
31
- onError;
32
- seen = new Map();
33
- constructor(opts) {
34
- this.workersDir = opts.workersDir;
35
- this.onState = opts.onState;
36
- this.onError = opts.onError;
37
- }
38
- /** 扫描一轮,返回新上报数量。 */
39
- scan() {
40
- if (!existsSync(this.workersDir))
41
- return 0;
42
- let count = 0;
43
- const entries = readdirSync(this.workersDir, { withFileTypes: true });
44
- for (const entry of entries) {
45
- if (!entry.isDirectory())
46
- continue;
47
- const ticketId = entry.name;
48
- const statePath = join(this.workersDir, ticketId, 'state.json');
49
- if (!existsSync(statePath))
50
- continue;
51
- try {
52
- const content = readFileSync(statePath, 'utf8');
53
- const fingerprint = `${statSync(statePath).mtimeMs}:${content}`;
54
- if (this.seen.get(ticketId) === fingerprint)
55
- continue;
56
- const { ticketId: parsedId, state } = parseStateFile(content, ticketId);
57
- this.seen.set(ticketId, fingerprint);
58
- const meta = readMeta(this.workersDir, ticketId);
59
- this.onState({ ...state, ticketId: parsedId }, meta, statePath);
60
- count += 1;
61
- }
62
- catch (error) {
63
- this.onError?.(ticketId, error instanceof Error ? error : new Error(String(error)));
64
- }
65
- }
66
- return count;
67
- }
68
- /** 清空基线,让下一轮重新上报(Router 重启对账时用)。 */
69
- reset() {
70
- this.seen.clear();
71
- }
72
- }
73
- export function parseStateFile(content, expectedTicketId) {
74
- let json;
75
- try {
76
- json = JSON.parse(content);
77
- }
78
- catch {
79
- throw new Error('state:invalid-json');
80
- }
81
- const parsed = StateSchema.safeParse(json);
82
- if (!parsed.success)
83
- throw new Error(`state:invalid: ${parsed.error.issues.map(i => i.path.join('.')).join(',')}`);
84
- if (expectedTicketId && parsed.data.ticket_id !== expectedTicketId) {
85
- throw new Error(`state:ticket-mismatch: 目录 ${expectedTicketId} 收到 ${parsed.data.ticket_id}`);
86
- }
87
- const data = parsed.data;
88
- const legacy = data.deliverable;
89
- // 旧版 deliverable 升级成纯回复:正文 + 链接,不再保留 kind。
90
- const reply = data.reply.trim() || [legacy?.content?.trim(), legacy?.url?.trim()].filter(Boolean).join('\n\n');
91
- return {
92
- ticketId: data.ticket_id,
93
- state: {
94
- ticketId: data.ticket_id,
95
- assignmentId: data.assignment_id,
96
- turn: data.turn,
97
- state: data.state,
98
- summary: data.summary,
99
- ...(data.human_action ? { humanAction: data.human_action } : {}),
100
- prNumber: data.pr_number,
101
- prUrl: data.pr_url,
102
- ...(reply ? { reply } : {}),
103
- ackedInputs: data.acked_inputs,
104
- updatedAt: data.updated_at,
105
- },
106
- };
107
- }
108
- function readMeta(workersDir, ticketId) {
109
- const path = join(workersDir, ticketId, 'meta.json');
110
- if (!existsSync(path))
111
- return null;
112
- try {
113
- return JSON.parse(readFileSync(path, 'utf8'));
114
- }
115
- catch {
116
- return null;
117
- }
118
- }
119
- /**
120
- * 基于 Orca 的结构化字段判定终端状态,绝不解析 TUI 屏幕文本。
121
- */
122
- export function judgeIdle(input) {
123
- const { info, turn, lastTurn, now, idleAfterMs } = input;
124
- if (!info)
125
- return 'unknown';
126
- if (!info.connected)
127
- return 'dead';
128
- // 实测:CLI 创建的终端可能 orphaned=true 但依然 connected+writable,不能直接判死。
129
- if (info.orphaned && !info.writable)
130
- return 'orphaned';
131
- const lastOutput = Date.parse(info.lastOutputAt);
132
- if (Number.isFinite(lastOutput) && now - lastOutput > idleAfterMs && turn <= lastTurn)
133
- return 'idle';
134
- return 'active';
135
- }
136
- /** 追加一条审计事件到 events.log。 */
137
- export function appendEvent(path, event) {
138
- mkdirSync(join(path, '..'), { recursive: true });
139
- if (!existsSync(path))
140
- writeFileSync(path, '', 'utf8');
141
- appendFileSync(path, `${JSON.stringify(event)}\n`, 'utf8');
142
- }
143
- //# sourceMappingURL=report-poller.js.map