@router-agent/runtime-orca 0.0.0-stage → 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.
- package/dist/index.d.ts +7 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/orca/commands.d.ts +43 -0
- package/dist/orca/commands.js +60 -0
- package/dist/orca/commands.js.map +1 -0
- package/dist/orca/index.d.ts +129 -0
- package/dist/orca/index.js +452 -0
- package/dist/orca/index.js.map +1 -0
- package/dist/orca/options.d.ts +1 -0
- package/dist/orca/options.js +2 -0
- package/dist/orca/options.js.map +1 -0
- package/dist/orca/report-poller.d.ts +62 -0
- package/dist/orca/report-poller.js +143 -0
- package/dist/orca/report-poller.js.map +1 -0
- package/package.json +37 -4
- package/README.md +0 -3
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RuntimePlugin } from '@router-agent/runtime';
|
|
2
|
+
declare const plugin: RuntimePlugin;
|
|
3
|
+
export default plugin;
|
|
4
|
+
export * from './orca/index.js';
|
|
5
|
+
export * from './orca/options.js';
|
|
6
|
+
export * from './orca/report-poller.js';
|
|
7
|
+
export * from './orca/commands.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { runtimeOptionString, runtimeOptionDefault } from '@router-agent/runtime';
|
|
2
|
+
import { ORCA_OPTION_SPEC } from './orca/options.js';
|
|
3
|
+
import { OrcaRuntime } from './orca/index.js';
|
|
4
|
+
const plugin = {
|
|
5
|
+
kind: 'runtime',
|
|
6
|
+
meta: {
|
|
7
|
+
id: 'orca',
|
|
8
|
+
packageName: '@router-agent/runtime-orca',
|
|
9
|
+
name: 'Orca',
|
|
10
|
+
label: 'orca · Orca worktree + 终端',
|
|
11
|
+
hint: '通过 Orca 创建 worktree 并启动 Agent 终端(默认跟随 Orca 配置),交互与状态读取走 Orca',
|
|
12
|
+
installHint: '从 Orca 官方发布页下载安装,并确保 orca CLI 在 PATH 中',
|
|
13
|
+
installUrl: 'https://github.com/stablyai/orca/releases',
|
|
14
|
+
repoSelector: true,
|
|
15
|
+
},
|
|
16
|
+
options: ORCA_OPTION_SPEC,
|
|
17
|
+
create(ctx) {
|
|
18
|
+
return new OrcaRuntime({
|
|
19
|
+
runner: ctx.runners.orca,
|
|
20
|
+
workersDir: ctx.workersDir,
|
|
21
|
+
home: ctx.home,
|
|
22
|
+
...(ctx.claudeProjectsDir ? { claudeProjectsDir: ctx.claudeProjectsDir } : {}),
|
|
23
|
+
agent: runtimeOptionString(ctx.config.runtime.options, 'orca', 'agent')
|
|
24
|
+
|| String(runtimeOptionDefault('orca', 'agent') ?? ''),
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
export default plugin;
|
|
29
|
+
export * from './orca/index.js';
|
|
30
|
+
export * from './orca/options.js';
|
|
31
|
+
export * from './orca/report-poller.js';
|
|
32
|
+
export * from './orca/commands.js';
|
|
33
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/runtime-orca/src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,MAAM,MAAM,GAAkB;IAC5B,IAAI,EAAE,SAAS;IACf,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,4BAA4B;QACzC,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,2BAA2B;QAClC,IAAI,EAAE,8DAA8D;QACpE,WAAW,EAAE,wCAAwC;QACrD,UAAU,EAAE,2CAA2C;QACvD,YAAY,EAAE,IAAI;KACnB;IACD,OAAO,EAAE,gBAAgB;IACzB,MAAM,CAAC,GAAG;QACR,OAAO,IAAI,WAAW,CAAC;YACrB,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;YACxB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;mBAClE,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;SACzD,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAED,eAAe,MAAM,CAAA;AACrB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface CommandResult {
|
|
2
|
+
code: number;
|
|
3
|
+
stdout: string;
|
|
4
|
+
stderr: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CommandRunner {
|
|
7
|
+
run(argv: string[], opts?: {
|
|
8
|
+
cwd?: string;
|
|
9
|
+
}): Promise<CommandResult>;
|
|
10
|
+
}
|
|
11
|
+
export interface CreateOptions {
|
|
12
|
+
repo: string;
|
|
13
|
+
name: string;
|
|
14
|
+
prompt: string;
|
|
15
|
+
/** worktree 的起始分支;不传则用仓库默认分支。 */
|
|
16
|
+
baseBranch?: string;
|
|
17
|
+
/** 新 worktree 的 git 分支名(绕过 Orca 配置的用户前缀),用于语义化命名。 */
|
|
18
|
+
branch?: string;
|
|
19
|
+
/** 启动哪个 Agent;留空 = 不传 --agent,由 Orca 自己的配置决定。 */
|
|
20
|
+
agent?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function worktreeCreate(opts: CreateOptions): string[];
|
|
23
|
+
/**
|
|
24
|
+
* 配置里可以写 Orca 的 displayName(如 `teamwork-repos`),
|
|
25
|
+
* 也可以直接写完整选择器(`id:xxx` / `name:xxx` / `path:/abs`)。
|
|
26
|
+
*/
|
|
27
|
+
export declare function repoSelector(repo: string): string;
|
|
28
|
+
export declare function terminalSend(handle: string, text: string): string[];
|
|
29
|
+
export declare function terminalClose(handle: string): string[];
|
|
30
|
+
export declare function terminalList(): string[];
|
|
31
|
+
/** 读取渲染屏幕的尾部行;--screen 比默认的累计流更适合看「现在在做什么」。 */
|
|
32
|
+
export declare function terminalRead(handle: string, opts?: {
|
|
33
|
+
limit?: number;
|
|
34
|
+
}): string[];
|
|
35
|
+
export declare function worktreeShow(selector: string): string[];
|
|
36
|
+
export declare function worktreeRemove(selector: string, opts?: {
|
|
37
|
+
force?: boolean;
|
|
38
|
+
}): string[];
|
|
39
|
+
export declare function agentLaunch(opts: {
|
|
40
|
+
worktree: string;
|
|
41
|
+
prompt: string;
|
|
42
|
+
agent?: string;
|
|
43
|
+
}): string[];
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export function worktreeCreate(opts) {
|
|
2
|
+
return [
|
|
3
|
+
'worktree', 'create',
|
|
4
|
+
'--repo', repoSelector(opts.repo),
|
|
5
|
+
'--name', opts.name,
|
|
6
|
+
...(opts.baseBranch ? ['--base-branch', opts.baseBranch] : []),
|
|
7
|
+
...(opts.branch ? ['--branch', opts.branch] : []),
|
|
8
|
+
...(opts.agent ? ['--agent', opts.agent] : []),
|
|
9
|
+
// 必须是终端 surface:chat 会话不在 terminal list 里,send/close/inspect 都用不了。
|
|
10
|
+
'--surface', 'terminal',
|
|
11
|
+
'--prompt', opts.prompt,
|
|
12
|
+
'--no-parent',
|
|
13
|
+
'--setup', 'skip',
|
|
14
|
+
'--json',
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 配置里可以写 Orca 的 displayName(如 `teamwork-repos`),
|
|
19
|
+
* 也可以直接写完整选择器(`id:xxx` / `name:xxx` / `path:/abs`)。
|
|
20
|
+
*/
|
|
21
|
+
export function repoSelector(repo) {
|
|
22
|
+
const trimmed = repo.trim();
|
|
23
|
+
if (/^(id|name|path):/.test(trimmed))
|
|
24
|
+
return trimmed;
|
|
25
|
+
return `name:${trimmed}`;
|
|
26
|
+
}
|
|
27
|
+
export function terminalSend(handle, text) {
|
|
28
|
+
return ['terminal', 'send', '--terminal', handle, '--text', text, '--enter', '--json'];
|
|
29
|
+
}
|
|
30
|
+
export function terminalClose(handle) {
|
|
31
|
+
return ['terminal', 'close', '--terminal', handle];
|
|
32
|
+
}
|
|
33
|
+
export function terminalList() {
|
|
34
|
+
return ['terminal', 'list', '--json'];
|
|
35
|
+
}
|
|
36
|
+
/** 读取渲染屏幕的尾部行;--screen 比默认的累计流更适合看「现在在做什么」。 */
|
|
37
|
+
export function terminalRead(handle, opts = {}) {
|
|
38
|
+
return ['terminal', 'read', '--terminal', handle, '--screen', '--limit', String(opts.limit ?? 60), '--json'];
|
|
39
|
+
}
|
|
40
|
+
export function worktreeShow(selector) {
|
|
41
|
+
return ['worktree', 'show', '--worktree', selector, '--json'];
|
|
42
|
+
}
|
|
43
|
+
export function worktreeRemove(selector, opts = {}) {
|
|
44
|
+
return [
|
|
45
|
+
'worktree', 'rm',
|
|
46
|
+
'--worktree', selector,
|
|
47
|
+
// 默认不强删:脏工作区由 Orca 拒绝,避免误删未提交改动。
|
|
48
|
+
...(opts.force ? ['--force'] : []),
|
|
49
|
+
'--json',
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
export function agentLaunch(opts) {
|
|
53
|
+
return [
|
|
54
|
+
'agent', 'launch',
|
|
55
|
+
...(opts.agent ? ['--agent', opts.agent] : []),
|
|
56
|
+
'--worktree', opts.worktree,
|
|
57
|
+
'--prompt', opts.prompt,
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../packages/runtime-orca/src/orca/commands.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,cAAc,CAAC,IAAmB;IAChD,OAAO;QACL,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QACjC,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,mEAAmE;QACnE,WAAW,EAAE,UAAU;QACvB,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,aAAa;QACb,SAAS,EAAE,MAAM;QACjB,QAAQ;KACT,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IACpD,OAAO,QAAQ,OAAO,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;AACxF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;AACvC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,OAA2B,EAAE;IACxE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;AAC9G,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,OAA4B,EAAE;IAC7E,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,QAAQ;QACtB,iCAAiC;QACjC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,QAAQ;KACT,CAAA;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAA0D;IACpF,OAAO;QACL,OAAO,EAAE,QAAQ;QACjB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,YAAY,EAAE,IAAI,CAAC,QAAQ;QAC3B,UAAU,EAAE,IAAI,CAAC,MAAM;KACxB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { WorkerRuntime, WorkerContext, InboundMessage, ContextItem, TerminalOutput, SessionSnapshot, WorkerRef, StartResult, DeliveryReceipt, DeliverOptions, AgentStatus, AgentOutput, ActivityQuery, WorkspaceInfo, WorkspaceRef, RepoDescriptor } from '@router-agent/runtime';
|
|
2
|
+
import { type CommandRunner, type CommandResult } from './commands.js';
|
|
3
|
+
export interface OrcaRuntimeOptions {
|
|
4
|
+
runner: CommandRunner;
|
|
5
|
+
/** ~/.router-agent/workers */
|
|
6
|
+
workersDir: string;
|
|
7
|
+
/** 状态目录;传入后 Worker 规范优先读 `<home>/specs/worker/` 下的覆盖文件。 */
|
|
8
|
+
home?: string;
|
|
9
|
+
/** 派工时启动哪个 Agent;缺省用 Orca 选项声明里的默认值。 */
|
|
10
|
+
agent?: string;
|
|
11
|
+
/** Claude Code 会话记录目录;默认 ~/.claude/projects,测试可注入临时目录。 */
|
|
12
|
+
claudeProjectsDir?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface OrcaTerminalInfo {
|
|
15
|
+
handle: string;
|
|
16
|
+
connected: boolean;
|
|
17
|
+
writable: boolean;
|
|
18
|
+
orphaned: boolean;
|
|
19
|
+
lastOutputAt: string;
|
|
20
|
+
worktreePath: string;
|
|
21
|
+
branch: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Orca CLI 失败时的结构化信息。
|
|
25
|
+
* `--json` 模式下 Orca 把错误体写在 stdout(`{"ok":false,"error":{...}}`),stderr 常常为空,
|
|
26
|
+
* 所以只读 stderr 会得到一句没有信息量的 `code=1`。这里把 stdout 的错误体和命令摘要一并保留。
|
|
27
|
+
*/
|
|
28
|
+
export interface OrcaCommandFailure {
|
|
29
|
+
/** 子命令,如 `worktree create`。 */
|
|
30
|
+
command: string;
|
|
31
|
+
code: number;
|
|
32
|
+
orcaCode?: string;
|
|
33
|
+
orcaMessage?: string;
|
|
34
|
+
/**
|
|
35
|
+
* 错误体 `data.cause` 里的底层原因。
|
|
36
|
+
* Orca 会把 git 失败等真实错误包装成通用文案(如 agent_session_operation_unknown),
|
|
37
|
+
* 真正原因只保留在这里;不取出来日志就只剩一句「结果未知」。
|
|
38
|
+
*/
|
|
39
|
+
orcaCause?: string;
|
|
40
|
+
/** 启动结果未知时的重试句柄;Orca 要求用它 `--retry-launch`,而不是重新派工。 */
|
|
41
|
+
orcaOperationId?: string;
|
|
42
|
+
/** 脱敏后的参数摘要:`--prompt` 只保留长度,避免整段 prompt 进日志。 */
|
|
43
|
+
args: string;
|
|
44
|
+
stdoutTail: string;
|
|
45
|
+
stderrTail: string;
|
|
46
|
+
}
|
|
47
|
+
export declare class OrcaCommandError extends Error {
|
|
48
|
+
readonly detail: OrcaCommandFailure;
|
|
49
|
+
constructor(detail: OrcaCommandFailure);
|
|
50
|
+
}
|
|
51
|
+
/** 把一次失败整理成便于日志与消息展示的一行。 */
|
|
52
|
+
export declare function formatCommandFailure(detail: OrcaCommandFailure): string;
|
|
53
|
+
/** 从 argv 生成脱敏摘要:跳过长文本参数,保留可复现的关键选项。 */
|
|
54
|
+
export declare function summarizeArgs(args: string[]): string;
|
|
55
|
+
export declare function describeCommandFailure(argv: string[], res: CommandResult): OrcaCommandFailure;
|
|
56
|
+
/** 解析 `orca worktree create --json` 的返回;不同 Orca 版本字段不同。 */
|
|
57
|
+
export declare function parseCreateResult(stdout: string): {
|
|
58
|
+
handle: string;
|
|
59
|
+
workdir?: string;
|
|
60
|
+
branch?: string;
|
|
61
|
+
};
|
|
62
|
+
export declare class OrcaRuntime implements WorkerRuntime {
|
|
63
|
+
readonly id = "orca";
|
|
64
|
+
readonly capabilities: {
|
|
65
|
+
readonly agent: {
|
|
66
|
+
readonly liveStatus: true;
|
|
67
|
+
readonly processExit: false;
|
|
68
|
+
readonly output: true;
|
|
69
|
+
readonly activity: true;
|
|
70
|
+
readonly structuredInput: true;
|
|
71
|
+
readonly nudge: true;
|
|
72
|
+
};
|
|
73
|
+
readonly workspace: {
|
|
74
|
+
readonly cleanup: true;
|
|
75
|
+
readonly prLink: true;
|
|
76
|
+
readonly discovery: true;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
private runner;
|
|
80
|
+
private workersDir;
|
|
81
|
+
private home?;
|
|
82
|
+
private agent;
|
|
83
|
+
private claudeProjectsDir?;
|
|
84
|
+
constructor(opts: OrcaRuntimeOptions);
|
|
85
|
+
start(ctx: WorkerContext): Promise<StartResult>;
|
|
86
|
+
deliver(ref: WorkerRef | string, inputs: InboundMessage[], _opts?: DeliverOptions): Promise<DeliveryReceipt>;
|
|
87
|
+
registerContext(ref: WorkerRef | string, items: ContextItem[]): Promise<void>;
|
|
88
|
+
stop(ref: WorkerRef | string, reason: string): Promise<void>;
|
|
89
|
+
nudge(ref: WorkerRef | string): Promise<void>;
|
|
90
|
+
/** 中立活性:把 Orca 终端字段映射成 AgentStatus;查询失败返回 null。 */
|
|
91
|
+
status(ref: WorkerRef | string): Promise<AgentStatus | null>;
|
|
92
|
+
/** 输出尾部:等价于旧的 read()。 */
|
|
93
|
+
output(ref: WorkerRef | string, opts?: {
|
|
94
|
+
limit?: number;
|
|
95
|
+
}): Promise<AgentOutput | null>;
|
|
96
|
+
/** 结构化活动:优先读 Agent 自己的会话记录;没有 workdir 时返回 null。 */
|
|
97
|
+
activity(query: ActivityQuery): Promise<SessionSnapshot | null>;
|
|
98
|
+
inspectWorkspace(ref: WorkspaceRef): Promise<WorkspaceInfo | null>;
|
|
99
|
+
removeWorkspace(ref: WorkspaceRef): Promise<void>;
|
|
100
|
+
listRepos(): Promise<RepoDescriptor[]>;
|
|
101
|
+
/** 旧接口:保留给兼容调用与单测。 */
|
|
102
|
+
inspect(handle: string): Promise<OrcaTerminalInfo | null>;
|
|
103
|
+
/** 读取终端渲染屏幕的尾部输出;失败(终端已销毁 / 旧版 Orca)时交给调用方跳过本轮巡检。 */
|
|
104
|
+
read(handle: string, opts?: {
|
|
105
|
+
limit?: number;
|
|
106
|
+
}): Promise<TerminalOutput | null>;
|
|
107
|
+
/**
|
|
108
|
+
* 优先读 Agent 自己的结构化会话记录(按配置的 Agent 选读取器),
|
|
109
|
+
* 比终端屏幕干净得多;找不到时返回 null,由调用方退回 read()。
|
|
110
|
+
*/
|
|
111
|
+
session(workdir: string, opts?: {
|
|
112
|
+
maxBytes?: number;
|
|
113
|
+
maxEvents?: number;
|
|
114
|
+
}): Promise<SessionSnapshot | null>;
|
|
115
|
+
inspectWorktree(selector: string): Promise<Record<string, unknown> | null>;
|
|
116
|
+
removeWorktree(selector: string, opts?: {
|
|
117
|
+
force?: boolean;
|
|
118
|
+
}): Promise<void>;
|
|
119
|
+
relaunchAgent(worktree: string, prompt: string): Promise<void>;
|
|
120
|
+
private handleOf;
|
|
121
|
+
private run;
|
|
122
|
+
private writeMeta;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 投递时带上输入 id:worker 只有看到 id 才能写进 acked_inputs,Router 才不会重投。
|
|
126
|
+
*/
|
|
127
|
+
export declare function renderInput(input: InboundMessage): string;
|
|
128
|
+
/** Orca 的 lastOutputAt 实测是毫秒时间戳数字,也兼容 ISO 字符串与秒级时间戳。 */
|
|
129
|
+
export declare function toIsoTime(value: unknown): string;
|
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { buildWorkerPrompt } from '@router-agent/runtime';
|
|
4
|
+
import { workBranch, worktreeName } from '@router-agent/runtime';
|
|
5
|
+
import { resolveSession } from '@router-agent/runtime';
|
|
6
|
+
import { runtimeOptionDefault } from '@router-agent/runtime';
|
|
7
|
+
import { ORCA_RUNTIME_ID } from '@router-agent/runtime';
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/runtime-orca/src/orca/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ORCA_OPTION_SPEC } from '@router-agent/runtime';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../../../packages/runtime-orca/src/orca/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ReportState } from '@router-agent/core/model.js';
|
|
2
|
+
import type { OrcaTerminalInfo } from './index.js';
|
|
3
|
+
export interface WorkerStateFile {
|
|
4
|
+
ticketId: string;
|
|
5
|
+
assignmentId: string;
|
|
6
|
+
turn: number;
|
|
7
|
+
state: ReportState;
|
|
8
|
+
summary: string;
|
|
9
|
+
humanAction?: string;
|
|
10
|
+
prNumber: number;
|
|
11
|
+
prUrl: string;
|
|
12
|
+
reply?: string;
|
|
13
|
+
ackedInputs: string[];
|
|
14
|
+
updatedAt: string;
|
|
15
|
+
}
|
|
16
|
+
export interface WorkerMeta {
|
|
17
|
+
ticketId: string;
|
|
18
|
+
assignmentId: string;
|
|
19
|
+
handle: string;
|
|
20
|
+
workdir: string;
|
|
21
|
+
repo?: string;
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface PolledState {
|
|
25
|
+
state: WorkerStateFile;
|
|
26
|
+
meta: WorkerMeta | null;
|
|
27
|
+
mtimeMs: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ReportPollerOptions {
|
|
30
|
+
workersDir: string;
|
|
31
|
+
onState: (state: WorkerStateFile, meta: WorkerMeta | null, path: string) => void;
|
|
32
|
+
onError?: (ticketId: string, error: Error) => void;
|
|
33
|
+
}
|
|
34
|
+
/** 轮询 ~/.router-agent/workers/<ticketId>/state.json,按文件内容增量上报。 */
|
|
35
|
+
export declare class ReportPoller {
|
|
36
|
+
private workersDir;
|
|
37
|
+
private onState;
|
|
38
|
+
private onError?;
|
|
39
|
+
private seen;
|
|
40
|
+
constructor(opts: ReportPollerOptions);
|
|
41
|
+
/** 扫描一轮,返回新上报数量。 */
|
|
42
|
+
scan(): number;
|
|
43
|
+
/** 清空基线,让下一轮重新上报(Router 重启对账时用)。 */
|
|
44
|
+
reset(): void;
|
|
45
|
+
}
|
|
46
|
+
export declare function parseStateFile(content: string, expectedTicketId?: string): {
|
|
47
|
+
ticketId: string;
|
|
48
|
+
state: WorkerStateFile;
|
|
49
|
+
};
|
|
50
|
+
export type IdleVerdict = 'active' | 'idle' | 'dead' | 'orphaned' | 'unknown';
|
|
51
|
+
/**
|
|
52
|
+
* 基于 Orca 的结构化字段判定终端状态,绝不解析 TUI 屏幕文本。
|
|
53
|
+
*/
|
|
54
|
+
export declare function judgeIdle(input: {
|
|
55
|
+
info: OrcaTerminalInfo | null;
|
|
56
|
+
turn: number;
|
|
57
|
+
lastTurn: number;
|
|
58
|
+
now: number;
|
|
59
|
+
idleAfterMs: number;
|
|
60
|
+
}): IdleVerdict;
|
|
61
|
+
/** 追加一条审计事件到 events.log。 */
|
|
62
|
+
export declare function appendEvent(path: string, event: Record<string, unknown>): void;
|
|
@@ -0,0 +1,143 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-poller.js","sourceRoot":"","sources":["../../../../../packages/runtime-orca/src/orca/report-poller.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@router-agent/runtime-orca",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"version": "0.3.32",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Orca 运行时插件:worktree + 终端 Agent",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/blankPen/router-agent.git",
|
|
10
|
+
"directory": "packages/runtime-orca"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/blankPen/router-agent#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/blankPen/router-agent/issues"
|
|
15
|
+
},
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./*.js": "./dist/*.js",
|
|
23
|
+
"./*": "./dist/*"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public",
|
|
31
|
+
"registry": "https://registry.npmjs.org/"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@router-agent/runtime": "0.3.32",
|
|
35
|
+
"@router-agent/core": "0.3.32",
|
|
36
|
+
"@router-agent/infra": "0.3.32",
|
|
37
|
+
"zod": "4.4.3"
|
|
38
|
+
}
|
|
39
|
+
}
|
package/README.md
DELETED