@router-agent/runtime-herdr 0.0.0-stage → 0.3.31
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/herdr/agents.d.ts +22 -0
- package/dist/herdr/agents.js +38 -0
- package/dist/herdr/agents.js.map +1 -0
- package/dist/herdr/commands.d.ts +50 -0
- package/dist/herdr/commands.js +68 -0
- package/dist/herdr/commands.js.map +1 -0
- package/dist/herdr/index.d.ts +152 -0
- package/dist/herdr/index.js +712 -0
- package/dist/herdr/index.js.map +1 -0
- package/dist/herdr/options.d.ts +1 -0
- package/dist/herdr/options.js +2 -0
- package/dist/herdr/options.js.map +1 -0
- package/dist/herdr/server.d.ts +38 -0
- package/dist/herdr/server.js +75 -0
- package/dist/herdr/server.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/package.json +36 -4
- package/README.md +0 -3
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Herdr 支持的 Agent kind 与「无人值守」启动参数。
|
|
3
|
+
*
|
|
4
|
+
* 这里只放纯常量与纯函数,不能依赖任何 Node 内置模块 —— Web 面板会把它一起打进前端包。
|
|
5
|
+
*/
|
|
6
|
+
export interface HerdrAgentKind {
|
|
7
|
+
/** Herdr 的 --kind 取值。 */
|
|
8
|
+
value: string;
|
|
9
|
+
label: string;
|
|
10
|
+
/** 无人值守所需的启动参数:Worker 开工时没有人点确认。 */
|
|
11
|
+
args: string[];
|
|
12
|
+
/** 模型参数怎么传;不同 CLI 不一样。 */
|
|
13
|
+
modelFlag?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* ra 支持的 Herdr Agent kind。
|
|
17
|
+
*
|
|
18
|
+
* 只列 ra 自己有会话读取器、或已验证过无人值守参数的 Agent;
|
|
19
|
+
* Herdr 自己支持更多 kind(见 `herdr agent start --help`),但 ra 读不回它们的会话。
|
|
20
|
+
*/
|
|
21
|
+
export declare const HERDR_AGENT_KINDS: readonly HerdrAgentKind[];
|
|
22
|
+
export declare function herdrAgentKindOf(kind: string): HerdrAgentKind | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Herdr 支持的 Agent kind 与「无人值守」启动参数。
|
|
3
|
+
*
|
|
4
|
+
* 这里只放纯常量与纯函数,不能依赖任何 Node 内置模块 —— Web 面板会把它一起打进前端包。
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* ra 支持的 Herdr Agent kind。
|
|
8
|
+
*
|
|
9
|
+
* 只列 ra 自己有会话读取器、或已验证过无人值守参数的 Agent;
|
|
10
|
+
* Herdr 自己支持更多 kind(见 `herdr agent start --help`),但 ra 读不回它们的会话。
|
|
11
|
+
*/
|
|
12
|
+
export const HERDR_AGENT_KINDS = [
|
|
13
|
+
{
|
|
14
|
+
value: 'claude',
|
|
15
|
+
label: 'claude · Claude Code',
|
|
16
|
+
// Claude Code 在新目录首次启动会弹「是否信任此文件夹」;跳过权限确认会一并跳过它,
|
|
17
|
+
// 否则 Herdr 把这个弹窗识别成 blocked,`agent start` 直接以 agent_not_ready 失败。
|
|
18
|
+
args: ['--dangerously-skip-permissions'],
|
|
19
|
+
modelFlag: '--model',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
value: 'codex',
|
|
23
|
+
label: 'codex · Codex',
|
|
24
|
+
args: ['--dangerously-bypass-approvals-and-sandbox'],
|
|
25
|
+
modelFlag: '--model',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
value: 'opencode',
|
|
29
|
+
label: 'opencode · OpenCode',
|
|
30
|
+
args: ['--auto'],
|
|
31
|
+
modelFlag: '--model',
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
export function herdrAgentKindOf(kind) {
|
|
35
|
+
const value = String(kind ?? '').trim();
|
|
36
|
+
return HERDR_AGENT_KINDS.find(item => item.value === value);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../../../packages/runtime-herdr/src/herdr/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC1D;QACE,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,sBAAsB;QAC7B,iDAAiD;QACjD,kEAAkE;QAClE,IAAI,EAAE,CAAC,gCAAgC,CAAC;QACxC,SAAS,EAAE,SAAS;KACrB;IACD;QACE,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,CAAC,4CAA4C,CAAC;QACpD,SAAS,EAAE,SAAS;KACrB;IACD;QACE,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,qBAAqB;QAC5B,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,SAAS,EAAE,SAAS;KACrB;CACF,CAAA;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACvC,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;AAC7D,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Herdr CLI 的 argv 构造。
|
|
3
|
+
*
|
|
4
|
+
* 只放纯函数:拼命令的地方集中在一处,adapter 与单测都从这里取。
|
|
5
|
+
*
|
|
6
|
+
* Herdr CLI 的约定(见 https://herdr.dev/docs/cli-reference):
|
|
7
|
+
* - 结果类命令把 JSON 打到 stdout;
|
|
8
|
+
* - 失败时把 `{"id":…,"error":{"code":…,"message":…}}` 打到 stderr,退出码 1;
|
|
9
|
+
* - `agent read` / `pane read` 例外:它们直接把终端文本打到 stdout,不是 JSON。
|
|
10
|
+
*
|
|
11
|
+
* 检出与分支由 ra 自己用 git worktree 管(见 GitWorktreeProvider),
|
|
12
|
+
* Herdr 只负责「在终端里跑 Agent」这件基础事 —— 所以这里没有 worktree 命令。
|
|
13
|
+
*/
|
|
14
|
+
import type { CommandResult, CommandRunner } from '@router-agent/infra/process.js';
|
|
15
|
+
export type { CommandResult, CommandRunner };
|
|
16
|
+
/** `agent start` 的启动超时;Herdr 要求大于 3000 且不超过 300000 毫秒。 */
|
|
17
|
+
export declare const HERDR_AGENT_START_TIMEOUT_MS = 60000;
|
|
18
|
+
/** 在指定目录上开一个 Herdr workspace;它会带出第一个 tab 与根 pane。 */
|
|
19
|
+
export declare function workspaceCreate(opts: {
|
|
20
|
+
cwd: string;
|
|
21
|
+
label?: string;
|
|
22
|
+
}): string[];
|
|
23
|
+
/** 关掉 workspace(连带它的 tab 与 pane)。 */
|
|
24
|
+
export declare function workspaceClose(workspaceId: string): string[];
|
|
25
|
+
/** 在指定 pane 里启动 Agent;`args` 原样透传给 Agent 可执行文件。 */
|
|
26
|
+
export declare function agentStart(opts: {
|
|
27
|
+
name: string;
|
|
28
|
+
kind: string;
|
|
29
|
+
pane: string;
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
args?: string[];
|
|
32
|
+
}): string[];
|
|
33
|
+
/** 提交一条输入(Herdr 会补上 Enter)。 */
|
|
34
|
+
export declare function agentPrompt(target: string, text: string): string[];
|
|
35
|
+
export declare function agentGet(target: string): string[];
|
|
36
|
+
/** 读取终端渲染文本。`recent-unwrapped` 会展开软换行,适合看 Agent 的回复。 */
|
|
37
|
+
export declare function agentRead(target: string, opts?: {
|
|
38
|
+
lines?: number;
|
|
39
|
+
source?: string;
|
|
40
|
+
}): string[];
|
|
41
|
+
export declare function paneRead(paneId: string, opts?: {
|
|
42
|
+
lines?: number;
|
|
43
|
+
source?: string;
|
|
44
|
+
}): string[];
|
|
45
|
+
export declare function agentList(): string[];
|
|
46
|
+
/** 给 Agent 的交互界面发按键(enter / esc / down / ctrl+c …)。 */
|
|
47
|
+
export declare function agentSendKeys(target: string, keys: string[]): string[];
|
|
48
|
+
export declare function paneClose(paneId: string): string[];
|
|
49
|
+
export declare function serverStatus(): string[];
|
|
50
|
+
export declare function version(): string[];
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** `agent start` 的启动超时;Herdr 要求大于 3000 且不超过 300000 毫秒。 */
|
|
2
|
+
export const HERDR_AGENT_START_TIMEOUT_MS = 60_000;
|
|
3
|
+
/** 在指定目录上开一个 Herdr workspace;它会带出第一个 tab 与根 pane。 */
|
|
4
|
+
export function workspaceCreate(opts) {
|
|
5
|
+
return [
|
|
6
|
+
'workspace', 'create',
|
|
7
|
+
'--cwd', opts.cwd,
|
|
8
|
+
...(opts.label ? ['--label', opts.label] : []),
|
|
9
|
+
// 不抢焦点:Router 不是交互式终端,抢焦点会打断用户正在看的 Herdr 窗口。
|
|
10
|
+
'--no-focus',
|
|
11
|
+
];
|
|
12
|
+
}
|
|
13
|
+
/** 关掉 workspace(连带它的 tab 与 pane)。 */
|
|
14
|
+
export function workspaceClose(workspaceId) {
|
|
15
|
+
return ['workspace', 'close', workspaceId];
|
|
16
|
+
}
|
|
17
|
+
/** 在指定 pane 里启动 Agent;`args` 原样透传给 Agent 可执行文件。 */
|
|
18
|
+
export function agentStart(opts) {
|
|
19
|
+
return [
|
|
20
|
+
'agent', 'start', opts.name,
|
|
21
|
+
'--kind', opts.kind,
|
|
22
|
+
'--pane', opts.pane,
|
|
23
|
+
'--timeout', String(opts.timeoutMs ?? HERDR_AGENT_START_TIMEOUT_MS),
|
|
24
|
+
// `--` 之后的参数原样交给 Agent;没有参数时不要多传一个裸 `--`。
|
|
25
|
+
...(opts.args?.length ? ['--', ...opts.args] : []),
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
/** 提交一条输入(Herdr 会补上 Enter)。 */
|
|
29
|
+
export function agentPrompt(target, text) {
|
|
30
|
+
return ['agent', 'prompt', target, text];
|
|
31
|
+
}
|
|
32
|
+
export function agentGet(target) {
|
|
33
|
+
return ['agent', 'get', target];
|
|
34
|
+
}
|
|
35
|
+
/** 读取终端渲染文本。`recent-unwrapped` 会展开软换行,适合看 Agent 的回复。 */
|
|
36
|
+
export function agentRead(target, opts = {}) {
|
|
37
|
+
return [
|
|
38
|
+
'agent', 'read', target,
|
|
39
|
+
'--source', opts.source ?? 'recent-unwrapped',
|
|
40
|
+
'--lines', String(opts.lines ?? 60),
|
|
41
|
+
];
|
|
42
|
+
}
|
|
43
|
+
// pane 级读取不要求 Agent 已被 Herdr 登记,因此「Agent 卡在启动前的确认弹窗」
|
|
44
|
+
// 这种状态也读得到 —— 判断「是否信任此文件夹」弹窗正需要它。
|
|
45
|
+
export function paneRead(paneId, opts = {}) {
|
|
46
|
+
return [
|
|
47
|
+
'pane', 'read', paneId,
|
|
48
|
+
'--source', opts.source ?? 'visible',
|
|
49
|
+
'--lines', String(opts.lines ?? 40),
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
export function agentList() {
|
|
53
|
+
return ['agent', 'list'];
|
|
54
|
+
}
|
|
55
|
+
/** 给 Agent 的交互界面发按键(enter / esc / down / ctrl+c …)。 */
|
|
56
|
+
export function agentSendKeys(target, keys) {
|
|
57
|
+
return ['agent', 'send-keys', target, ...keys];
|
|
58
|
+
}
|
|
59
|
+
export function paneClose(paneId) {
|
|
60
|
+
return ['pane', 'close', paneId];
|
|
61
|
+
}
|
|
62
|
+
export function serverStatus() {
|
|
63
|
+
return ['status', 'server'];
|
|
64
|
+
}
|
|
65
|
+
export function version() {
|
|
66
|
+
return ['--version'];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../../../packages/runtime-herdr/src/herdr/commands.ts"],"names":[],"mappings":"AAiBA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAA;AAElD,qDAAqD;AACrD,MAAM,UAAU,eAAe,CAAC,IAAqC;IACnE,OAAO;QACL,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,IAAI,CAAC,GAAG;QACjB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,6CAA6C;QAC7C,YAAY;KACb,CAAA;AACH,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAA;AAC5C,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,IAM1B;IACC,OAAO;QACL,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI;QAC3B,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,4BAA4B,CAAC;QACnE,0CAA0C;QAC1C,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAA;AACH,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,IAAY;IACtD,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;AACjC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,OAA4C,EAAE;IACtF,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,MAAM;QACvB,UAAU,EAAE,IAAI,CAAC,MAAM,IAAI,kBAAkB;QAC7C,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;KACpC,CAAA;AACH,CAAC;AAED,qDAAqD;AACrD,kCAAkC;AAClC,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,OAA4C,EAAE;IACrF,OAAO;QACL,MAAM,EAAE,MAAM,EAAE,MAAM;QACtB,UAAU,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;QACpC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;KACpC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;AAC1B,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAc;IAC1D,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,CAAC,WAAW,CAAC,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { ActivityQuery, AgentOutput, AgentStatus, DeliveryReceipt, DeliverOptions, DiagnosticCheck, InboundMessage, RuntimeCapabilities, SessionSnapshot, StartResult, WorkerContext, WorkerRef, WorkerRuntime, WorkspaceInfo, WorkspaceRef } from '@router-agent/runtime';
|
|
2
|
+
import { type HerdrServerSpawner } from './server.js';
|
|
3
|
+
import { type CommandResult, type CommandRunner } from './commands.js';
|
|
4
|
+
export interface HerdrRuntimeOptions {
|
|
5
|
+
herdr: CommandRunner;
|
|
6
|
+
/** git runner;用来创建 / 回收检出。 */
|
|
7
|
+
git: CommandRunner;
|
|
8
|
+
/** ~/.router-agent/workers */
|
|
9
|
+
workersDir: string;
|
|
10
|
+
/** 状态目录;传入后 Worker 规范优先读 `<home>/specs/worker/` 下的覆盖文件。 */
|
|
11
|
+
home?: string;
|
|
12
|
+
/** 派工时启动哪个 Agent(Herdr 的 kind);缺省用选项声明里的默认值。 */
|
|
13
|
+
agent?: string;
|
|
14
|
+
/** 传给 Agent 的模型;缺省用 Agent 自己的配置。 */
|
|
15
|
+
model?: string;
|
|
16
|
+
/** Claude Code 会话记录目录;默认 ~/.claude/projects,测试可注入临时目录。 */
|
|
17
|
+
claudeProjectsDir?: string;
|
|
18
|
+
/** 允许创建检出的根目录;默认 <home>/worktrees。 */
|
|
19
|
+
worktreesRoot?: string;
|
|
20
|
+
/** 拉起 Herdr 服务端用的动作;测试可注入空实现。 */
|
|
21
|
+
spawnServer?: HerdrServerSpawner;
|
|
22
|
+
}
|
|
23
|
+
/** Herdr 的错误体:`{"id":…,"error":{"code":…,"message":…}}`。 */
|
|
24
|
+
export interface HerdrCliError {
|
|
25
|
+
code: string;
|
|
26
|
+
message: string;
|
|
27
|
+
}
|
|
28
|
+
export declare class HerdrRuntime implements WorkerRuntime {
|
|
29
|
+
readonly id = "herdr";
|
|
30
|
+
readonly capabilities: RuntimeCapabilities;
|
|
31
|
+
private herdr;
|
|
32
|
+
private git;
|
|
33
|
+
private workersDir;
|
|
34
|
+
private home?;
|
|
35
|
+
private agent;
|
|
36
|
+
private model?;
|
|
37
|
+
private claudeProjectsDir?;
|
|
38
|
+
private worktreesRoot;
|
|
39
|
+
private gitProvider;
|
|
40
|
+
private spawnServer?;
|
|
41
|
+
constructor(opts: HerdrRuntimeOptions);
|
|
42
|
+
start(ctx: WorkerContext): Promise<StartResult>;
|
|
43
|
+
deliver(ref: WorkerRef, inputs: InboundMessage[], _opts?: DeliverOptions): Promise<DeliveryReceipt>;
|
|
44
|
+
/**
|
|
45
|
+
* 停止:关掉承载 Agent 的 pane(连带 workspace)。
|
|
46
|
+
*
|
|
47
|
+
* 回收检出不在这里做 —— 那是 removeWorkspace 的事,拆开是为了让
|
|
48
|
+
* 「先停 Agent、稍后再回收目录」这种节奏也能成立。
|
|
49
|
+
*/
|
|
50
|
+
stop(ref: WorkerRef, _reason: string): Promise<void>;
|
|
51
|
+
/** 状态:把 Herdr 的屏幕识别结果映射成中立的 AgentStatus。 */
|
|
52
|
+
status(ref: WorkerRef): Promise<AgentStatus | null>;
|
|
53
|
+
/** 输出尾部:读终端渲染文本;Agent 正在忙时退回 visible 源。 */
|
|
54
|
+
output(ref: WorkerRef, opts?: {
|
|
55
|
+
limit?: number;
|
|
56
|
+
}): Promise<AgentOutput | null>;
|
|
57
|
+
/** 结构化活动:读 Agent 自己的会话记录,比终端屏幕干净。 */
|
|
58
|
+
activity(query: ActivityQuery): Promise<SessionSnapshot | null>;
|
|
59
|
+
inspectWorkspace(ref: WorkspaceRef): Promise<WorkspaceInfo | null>;
|
|
60
|
+
/** 回收检出:先关 Herdr 窗口,再让 git 删掉 worktree。 */
|
|
61
|
+
removeWorkspace(ref: WorkspaceRef): Promise<void>;
|
|
62
|
+
doctor(): Promise<DiagnosticCheck[]>;
|
|
63
|
+
/**
|
|
64
|
+
* 本地路径仓库的 PR 跟踪需要 owner/repo。
|
|
65
|
+
*
|
|
66
|
+
* 检出是源仓库的 linked worktree,origin 与源仓库一致,
|
|
67
|
+
* 所以直接在检出目录里读 remote 就行。
|
|
68
|
+
*/
|
|
69
|
+
repoSlug(ref: WorkerRef): Promise<string | null>;
|
|
70
|
+
/** 服务端不在就把它拉起来;拉不起来时给出可重试的 runtime:unavailable。 */
|
|
71
|
+
private ensureServer;
|
|
72
|
+
private createWorkspace;
|
|
73
|
+
/**
|
|
74
|
+
* 拉起 Agent,并处理两种「起不来」:
|
|
75
|
+
* - 名字被上一轮残留的 Agent 占了:把那个 pane 关掉再试一次;
|
|
76
|
+
* - Agent 卡在启动前的确认弹窗(Claude Code 的「信任此文件夹」):替用户点掉。
|
|
77
|
+
*/
|
|
78
|
+
private startAgent;
|
|
79
|
+
/**
|
|
80
|
+
* 自动确认「是否信任此文件夹」。
|
|
81
|
+
*
|
|
82
|
+
* 弹窗默认选中「No, exit」,所以往下挪一格选「Yes, I trust this folder」再回车。
|
|
83
|
+
* 只在文本确实命中时才动手,避免误触别的确认框。
|
|
84
|
+
*/
|
|
85
|
+
private acceptTrustPrompt;
|
|
86
|
+
/** 等 Agent 从 blocked 变成能收输入的状态。 */
|
|
87
|
+
private waitForAgentReady;
|
|
88
|
+
private agentKind;
|
|
89
|
+
private launchArgs;
|
|
90
|
+
private startError;
|
|
91
|
+
private run;
|
|
92
|
+
/** 启动半失败时把窗口与检出回收掉,避免重试撞分支。 */
|
|
93
|
+
private rollback;
|
|
94
|
+
/**
|
|
95
|
+
* 删检出。
|
|
96
|
+
*
|
|
97
|
+
* `git worktree remove` 必须在仓库上下文里跑,所以 cwd 给源仓库而不是检出目录;
|
|
98
|
+
* 检出里有改动时先温和地删,失败了再强制删。
|
|
99
|
+
*/
|
|
100
|
+
private removeWorktree;
|
|
101
|
+
private metaPath;
|
|
102
|
+
private readMeta;
|
|
103
|
+
private writeMeta;
|
|
104
|
+
private clearMeta;
|
|
105
|
+
}
|
|
106
|
+
/** 投递时带上输入 id:worker 只有看到 id 才能写进 acked_inputs,Router 才不会重投。 */
|
|
107
|
+
export declare function renderInput(input: InboundMessage): string;
|
|
108
|
+
/**
|
|
109
|
+
* 把契约里的「工作目录待定」占位换成 Herdr 实际建出来的检出路径。
|
|
110
|
+
*
|
|
111
|
+
* 中立契约里写的是「(由运行时决定)」,Orca 的手册里写的是「(由 Orca 决定)」;
|
|
112
|
+
* 两种都换成真实路径,worker 才知道自己在哪。
|
|
113
|
+
*/
|
|
114
|
+
export declare function withWorkdir(text: string, workdir: string): string;
|
|
115
|
+
/**
|
|
116
|
+
* Agent 名字:`<项目>-<分支>-<短哈希>`。
|
|
117
|
+
*
|
|
118
|
+
* Herdr 要求名字匹配 `[a-z][a-z0-9_-]{0,31}` 且存活期间唯一。
|
|
119
|
+
* 末尾的短哈希由「工具 + 项目路径 + 分支」算出:同一个组合永远得到同一个名字,
|
|
120
|
+
* 换个工具或换个分支立刻不同 —— 比工单号这种递增数字稳定,
|
|
121
|
+
* 重派工时也能算出同名(撞名就回收旧窗口)。
|
|
122
|
+
*/
|
|
123
|
+
export declare function agentNameFor(opts: {
|
|
124
|
+
kind: string;
|
|
125
|
+
repo: string;
|
|
126
|
+
branch: string;
|
|
127
|
+
}): string;
|
|
128
|
+
/** 内容哈希:短、稳定、只做唯一后缀。 */
|
|
129
|
+
export declare function shortHash(input: string, length?: number): string;
|
|
130
|
+
export interface HerdrWorkspaceResult {
|
|
131
|
+
paneId?: string;
|
|
132
|
+
workspaceId?: string;
|
|
133
|
+
tabId?: string;
|
|
134
|
+
}
|
|
135
|
+
/** 解析 `herdr workspace create` 的返回。 */
|
|
136
|
+
export declare function parseWorkspaceResult(stdout: string): HerdrWorkspaceResult;
|
|
137
|
+
/** 从「名字被占用」的错误里捞出占用者所在的 pane。 */
|
|
138
|
+
export declare function parseStalePaneId(message: string): string | null;
|
|
139
|
+
export interface HerdrAgentInfo {
|
|
140
|
+
status: string;
|
|
141
|
+
kind?: string;
|
|
142
|
+
name?: string;
|
|
143
|
+
paneId?: string;
|
|
144
|
+
stateChangeSeq?: number;
|
|
145
|
+
completionSeq?: number;
|
|
146
|
+
sessionId?: string;
|
|
147
|
+
interactiveReady?: boolean;
|
|
148
|
+
}
|
|
149
|
+
/** 解析 `herdr agent get/start/prompt` 里的 Agent 快照。 */
|
|
150
|
+
export declare function parseAgent(stdout: string): HerdrAgentInfo | null;
|
|
151
|
+
/** 解析 Herdr CLI 的错误体。 */
|
|
152
|
+
export declare function parseCliError(res: CommandResult): HerdrCliError | null;
|