frely-cli 0.6.10 → 0.8.3
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/README.md +97 -293
- package/README.zh-CN.md +230 -0
- package/dist/agent/agent-service.d.ts +77 -0
- package/dist/agent/agent-service.js +348 -0
- package/dist/agent/agent-service.js.map +1 -0
- package/dist/agent/app-install.d.ts +49 -0
- package/dist/agent/app-install.js +133 -0
- package/dist/agent/app-install.js.map +1 -0
- package/dist/agent/app-key.d.ts +14 -0
- package/dist/agent/app-key.js +46 -0
- package/dist/agent/app-key.js.map +1 -0
- package/dist/agent/compose.d.ts +23 -0
- package/dist/agent/compose.js +42 -0
- package/dist/agent/compose.js.map +1 -0
- package/dist/agent/ops-server.d.ts +18 -0
- package/dist/agent/ops-server.js +175 -0
- package/dist/agent/ops-server.js.map +1 -0
- package/dist/agent/ops-stdio.d.ts +5 -0
- package/dist/agent/ops-stdio.js +47 -0
- package/dist/agent/ops-stdio.js.map +1 -0
- package/dist/agent/ops.d.ts +25 -0
- package/dist/agent/ops.js +82 -0
- package/dist/agent/ops.js.map +1 -0
- package/dist/agent/protocol.d.ts +72 -0
- package/dist/agent/protocol.js +195 -0
- package/dist/agent/protocol.js.map +1 -0
- package/dist/agent/supervisor.d.ts +80 -0
- package/dist/agent/supervisor.js +278 -0
- package/dist/agent/supervisor.js.map +1 -0
- package/dist/agent/task-store.d.ts +82 -0
- package/dist/agent/task-store.js +220 -0
- package/dist/agent/task-store.js.map +1 -0
- package/dist/agent/tool-executor.d.ts +28 -0
- package/dist/agent/tool-executor.js +113 -0
- package/dist/agent/tool-executor.js.map +1 -0
- package/dist/agent/worktrees.d.ts +35 -0
- package/dist/agent/worktrees.js +143 -0
- package/dist/agent/worktrees.js.map +1 -0
- package/dist/agent-help.d.ts +200 -176
- package/dist/agent-help.js +65 -32
- package/dist/agent-help.js.map +1 -1
- package/dist/auth.d.ts +3 -0
- package/dist/auth.js +52 -14
- package/dist/auth.js.map +1 -1
- package/dist/cloud.d.ts +1 -1
- package/dist/cloud.js +6 -13
- package/dist/cloud.js.map +1 -1
- package/dist/device/protocol.d.ts +11 -2
- package/dist/device/protocol.js +18 -2
- package/dist/device/protocol.js.map +1 -1
- package/dist/device/relay-client.d.ts +19 -2
- package/dist/device/relay-client.js +65 -13
- package/dist/device/relay-client.js.map +1 -1
- package/dist/diagnostics.js +12 -4
- package/dist/diagnostics.js.map +1 -1
- package/dist/index.js +203 -173
- package/dist/index.js.map +1 -1
- package/dist/key-budget.js +2 -2
- package/dist/key-budget.js.map +1 -1
- package/dist/mcp-authorization.js +9 -7
- package/dist/mcp-authorization.js.map +1 -1
- package/dist/mcp-command.d.ts +12 -4
- package/dist/mcp-command.js +54 -25
- package/dist/mcp-command.js.map +1 -1
- package/dist/provider/state.d.ts +2 -0
- package/dist/provider/state.js +1 -0
- package/dist/provider/state.js.map +1 -1
- package/dist/runtime/mcp-lease.js +1 -1
- package/dist/runtime/mcp-lease.js.map +1 -1
- package/dist/runtime/mcp.d.ts +139 -0
- package/dist/runtime/mcp.js +88 -29
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/process-manager.d.ts +1 -1
- package/dist/runtime/process-manager.js +4 -2
- package/dist/runtime/process-manager.js.map +1 -1
- package/dist/runtime/relay-agent.d.ts +25 -0
- package/dist/runtime/relay-agent.js +63 -0
- package/dist/runtime/relay-agent.js.map +1 -0
- package/dist/runtime/relay-mcp.d.ts +5 -2
- package/dist/runtime/relay-mcp.js +6 -1
- package/dist/runtime/relay-mcp.js.map +1 -1
- package/dist/runtime/relay-session.d.ts +47 -0
- package/dist/runtime/relay-session.js +56 -0
- package/dist/runtime/relay-session.js.map +1 -0
- package/dist/runtime/sandbox.d.ts +16 -0
- package/dist/runtime/sandbox.js +149 -0
- package/dist/runtime/sandbox.js.map +1 -0
- package/dist/runtime/workspace-registry.d.ts +5 -0
- package/dist/runtime/workspace-registry.js +87 -0
- package/dist/runtime/workspace-registry.js.map +1 -0
- package/dist/runtime/workspace-router.d.ts +5 -0
- package/dist/runtime/workspace-router.js +32 -0
- package/dist/runtime/workspace-router.js.map +1 -0
- package/dist/runtime/workspace.js +3 -1
- package/dist/runtime/workspace.js.map +1 -1
- package/dist/skill/access.d.ts +4 -2
- package/dist/skill/access.js +7 -3
- package/dist/skill/access.js.map +1 -1
- package/dist/upgrade/installation.js +1 -1
- package/dist/upgrade/installation.js.map +1 -1
- package/dist/workspace-command.d.ts +8 -0
- package/dist/workspace-command.js +36 -0
- package/dist/workspace-command.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops-stdio.js","sourceRoot":"","sources":["../../src/agent/ops-stdio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAe,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAA0F;IACrI,MAAM,UAAU,GAAG,GAAG,aAAa,EAAE,WAAW,CAAC;IACjD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,UAAU,oCAAoC,CAAC,CAAC;QAC1G,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACpC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QACF,MAAM,MAAM,GAAW,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared agent-op dispatch (plan §5). The same op surface serves three
|
|
3
|
+
* transports: device-relay `method: "agent"` (remote web), the MCP frely-app
|
|
4
|
+
* toolset bridge, and the local GUI ops socket (M4). Each transport passes its
|
|
5
|
+
* own task `source` and merge `approvedBy` identity; only the ops socket gets
|
|
6
|
+
* the full task record (source, worktreePath, approval) because it never
|
|
7
|
+
* leaves the device.
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentService } from "./agent-service.js";
|
|
10
|
+
import type { AgentTaskRecord, AgentTaskSource } from "./task-store.js";
|
|
11
|
+
export declare const AGENT_OPS: readonly ["agent_start_task", "agent_list_tasks", "agent_get_task", "agent_get_events", "agent_send_message", "agent_get_diff", "agent_request_merge", "agent_approve_merge", "agent_discard_task", "agent_cancel_task"];
|
|
12
|
+
export type AgentOp = (typeof AGENT_OPS)[number];
|
|
13
|
+
export declare class AgentOpError extends Error {
|
|
14
|
+
readonly code: string;
|
|
15
|
+
constructor(code: string, message?: string);
|
|
16
|
+
}
|
|
17
|
+
export type AgentOpIdentity = {
|
|
18
|
+
source: AgentTaskSource;
|
|
19
|
+
approvedBy: "gui" | "web";
|
|
20
|
+
};
|
|
21
|
+
export declare function isAgentOp(op: string): op is AgentOp;
|
|
22
|
+
export declare function dispatchAgentOp(op: AgentOp, args: Record<string, unknown>, agent: AgentService, defaults: {
|
|
23
|
+
workspace: string;
|
|
24
|
+
}, identity?: AgentOpIdentity): Promise<unknown>;
|
|
25
|
+
export type { AgentTaskRecord };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export const AGENT_OPS = [
|
|
2
|
+
"agent_start_task",
|
|
3
|
+
"agent_list_tasks",
|
|
4
|
+
"agent_get_task",
|
|
5
|
+
"agent_get_events",
|
|
6
|
+
"agent_send_message",
|
|
7
|
+
"agent_get_diff",
|
|
8
|
+
"agent_request_merge",
|
|
9
|
+
"agent_approve_merge",
|
|
10
|
+
"agent_discard_task",
|
|
11
|
+
"agent_cancel_task",
|
|
12
|
+
];
|
|
13
|
+
export class AgentOpError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
constructor(code, message) {
|
|
16
|
+
super(message ?? code);
|
|
17
|
+
this.code = code;
|
|
18
|
+
this.name = "AgentOpError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function isAgentOp(op) {
|
|
22
|
+
return AGENT_OPS.includes(op);
|
|
23
|
+
}
|
|
24
|
+
export async function dispatchAgentOp(op, args, agent, defaults, identity = { source: { kind: "web" }, approvedBy: "web" }) {
|
|
25
|
+
switch (op) {
|
|
26
|
+
case "agent_start_task": {
|
|
27
|
+
const task = await agent.startTask({
|
|
28
|
+
workspace: optionalString(args.workspace) ?? defaults.workspace,
|
|
29
|
+
goal: requiredString(args.goal, "goal"),
|
|
30
|
+
...(typeof args.model === "string" && args.model.length > 0 ? { model: args.model } : {}),
|
|
31
|
+
...(typeof args.maxCostUsd === "number" && Number.isFinite(args.maxCostUsd) ? { maxCostUsd: args.maxCostUsd } : {}),
|
|
32
|
+
source: identity.source,
|
|
33
|
+
});
|
|
34
|
+
return { task };
|
|
35
|
+
}
|
|
36
|
+
case "agent_list_tasks": {
|
|
37
|
+
const workspace = optionalString(args.workspace) ?? defaults.workspace;
|
|
38
|
+
return { tasks: await agent.listTasks(workspace) };
|
|
39
|
+
}
|
|
40
|
+
case "agent_get_task":
|
|
41
|
+
return { task: await agent.getTask(requiredTaskId(args)) };
|
|
42
|
+
case "agent_get_events": {
|
|
43
|
+
const cursor = optionalNumber(args.cursor) ?? 0;
|
|
44
|
+
const page = await agent.getEvents(requiredTaskId(args), Number.isSafeInteger(cursor) && cursor >= 0 ? cursor : 0);
|
|
45
|
+
return { events: page.events, nextCursor: page.nextCursor };
|
|
46
|
+
}
|
|
47
|
+
case "agent_send_message":
|
|
48
|
+
await agent.sendMessage(requiredTaskId(args), requiredString(args.message, "message"));
|
|
49
|
+
return { sent: true };
|
|
50
|
+
case "agent_get_diff": {
|
|
51
|
+
const result = await agent.getDiff(requiredTaskId(args), optionalString(args.path));
|
|
52
|
+
return { diff: result.diff, truncated: result.truncated };
|
|
53
|
+
}
|
|
54
|
+
case "agent_request_merge": {
|
|
55
|
+
const note = optionalString(args.note);
|
|
56
|
+
return { task: await agent.requestMerge(requiredTaskId(args), note) };
|
|
57
|
+
}
|
|
58
|
+
case "agent_approve_merge":
|
|
59
|
+
return { task: await agent.approveMerge(requiredTaskId(args), identity.approvedBy) };
|
|
60
|
+
case "agent_discard_task":
|
|
61
|
+
return { task: await agent.discardTask(requiredTaskId(args)) };
|
|
62
|
+
case "agent_cancel_task":
|
|
63
|
+
return { task: await agent.cancelTask(requiredTaskId(args)) };
|
|
64
|
+
default:
|
|
65
|
+
throw new AgentOpError("unknown_op", op);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function requiredTaskId(args) {
|
|
69
|
+
return requiredString(args.taskId, "taskId");
|
|
70
|
+
}
|
|
71
|
+
function requiredString(value, name) {
|
|
72
|
+
if (typeof value !== "string" || value.length === 0)
|
|
73
|
+
throw new AgentOpError("invalid_args", `${name} must be a non-empty string.`);
|
|
74
|
+
return value;
|
|
75
|
+
}
|
|
76
|
+
function optionalString(value) {
|
|
77
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
78
|
+
}
|
|
79
|
+
function optionalNumber(value) {
|
|
80
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/agent/ops.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,kBAAkB;IAClB,kBAAkB;IAClB,gBAAgB;IAChB,kBAAkB;IAClB,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,qBAAqB;IACrB,oBAAoB;IACpB,mBAAmB;CACX,CAAC;AAIX,MAAM,OAAO,YAAa,SAAQ,KAAK;IAChB;IAArB,YAAqB,IAAY,EAAE,OAAgB;QACjD,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;QADJ,SAAI,GAAJ,IAAI,CAAQ;QAE/B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAID,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,OAAQ,SAA+B,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAW,EACX,IAA6B,EAC7B,KAAmB,EACnB,QAA+B,EAC/B,WAA4B,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;IAE1E,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC;gBACjC,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS;gBAC/D,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC;gBACvC,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzF,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnH,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CAAC,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC;YACvE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,CAAC;QACD,KAAK,gBAAgB;YACnB,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7D,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnH,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9D,CAAC;QACD,KAAK,oBAAoB;YACvB,MAAM,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;YACvF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACpF,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QAC5D,CAAC;QACD,KAAK,qBAAqB,CAAC,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACxE,CAAC;QACD,KAAK,qBAAqB;YACxB,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACvF,KAAK,oBAAoB;YACvB,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACjE,KAAK,mBAAmB;YACtB,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAChE;YACE,MAAM,IAAI,YAAY,CAAC,YAAY,EAAE,EAAkB,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAA6B;IACnD,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,IAAY;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,GAAG,IAAI,8BAA8B,CAAC,CAAC;IACnI,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export declare const AGENT_HOST_PROTOCOL = "frely.agent-host.v1";
|
|
2
|
+
export declare const AGENT_HOST_PROTOCOL_VERSION = 1;
|
|
3
|
+
export declare const AGENT_HOST_MAX_FRAME_BYTES: number;
|
|
4
|
+
export declare const AGENT_HOST_CONNECTION_KEY_ENV = "FRELY_AGENT_HOST_KEY";
|
|
5
|
+
export type AgentHostTaskStatus = "running" | "waiting_input" | "completed" | "failed" | "cancelled";
|
|
6
|
+
export type AgentHostTaskEvent = {
|
|
7
|
+
type: "status";
|
|
8
|
+
status: AgentHostTaskStatus;
|
|
9
|
+
detail?: string;
|
|
10
|
+
} | {
|
|
11
|
+
type: "message";
|
|
12
|
+
role: "assistant" | "user" | "system";
|
|
13
|
+
text: string;
|
|
14
|
+
partial?: boolean;
|
|
15
|
+
} | {
|
|
16
|
+
type: "tool_call";
|
|
17
|
+
tool: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
state: "started" | "finished" | "failed";
|
|
20
|
+
} | {
|
|
21
|
+
type: "usage";
|
|
22
|
+
inputTokens: number;
|
|
23
|
+
outputTokens: number;
|
|
24
|
+
costUsd: number;
|
|
25
|
+
} | {
|
|
26
|
+
type: "log";
|
|
27
|
+
text: string;
|
|
28
|
+
};
|
|
29
|
+
export type JsonRpcId = number | string;
|
|
30
|
+
export type JsonRpcRequest = {
|
|
31
|
+
jsonrpc: "2.0";
|
|
32
|
+
id?: JsonRpcId;
|
|
33
|
+
method: string;
|
|
34
|
+
params?: Record<string, unknown>;
|
|
35
|
+
};
|
|
36
|
+
export type JsonRpcResponse = {
|
|
37
|
+
jsonrpc: "2.0";
|
|
38
|
+
id: JsonRpcId;
|
|
39
|
+
result?: unknown;
|
|
40
|
+
error?: {
|
|
41
|
+
code: number;
|
|
42
|
+
message: string;
|
|
43
|
+
data?: unknown;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
export type JsonRpcMessage = JsonRpcRequest | JsonRpcResponse | {
|
|
47
|
+
jsonrpc: "2.0";
|
|
48
|
+
method: string;
|
|
49
|
+
params?: Record<string, unknown>;
|
|
50
|
+
};
|
|
51
|
+
export declare class AgentHostProtocolError extends Error {
|
|
52
|
+
readonly code: "frame_invalid" | "frame_too_large" | "handshake_rejected" | "unexpected_frame";
|
|
53
|
+
constructor(code: "frame_invalid" | "frame_too_large" | "handshake_rejected" | "unexpected_frame");
|
|
54
|
+
}
|
|
55
|
+
export declare function newConnectionKey(): string;
|
|
56
|
+
export declare function isValidTaskId(id: string): boolean;
|
|
57
|
+
export declare function newTaskId(): string;
|
|
58
|
+
/** Encode one NDJSON frame. */
|
|
59
|
+
export declare function encodeAgentHostFrame(message: JsonRpcMessage): string;
|
|
60
|
+
/** Decode one NDJSON frame (without the trailing newline). */
|
|
61
|
+
export declare function decodeAgentHostFrame(line: Buffer | string): JsonRpcMessage;
|
|
62
|
+
/** Validate and normalize a `task.event` notification params object. */
|
|
63
|
+
export declare function decodeTaskEvent(params: unknown): {
|
|
64
|
+
taskId: string;
|
|
65
|
+
event: AgentHostTaskEvent;
|
|
66
|
+
};
|
|
67
|
+
export declare function isToolMethod(method: string): boolean;
|
|
68
|
+
/** Validate params of a `tool.*` request from the host. Returns normalized args. */
|
|
69
|
+
export declare function decodeToolParams(method: string, params: unknown): {
|
|
70
|
+
taskId: string;
|
|
71
|
+
args: Record<string, unknown>;
|
|
72
|
+
};
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* frely.agent-host.v1 — wire contract between the CLI (supervisor) and the
|
|
3
|
+
* Pi Node agent host. See docs/agent-host.md for the public description.
|
|
4
|
+
*/
|
|
5
|
+
import { randomBytes } from "node:crypto";
|
|
6
|
+
export const AGENT_HOST_PROTOCOL = "frely.agent-host.v1";
|
|
7
|
+
export const AGENT_HOST_PROTOCOL_VERSION = 1;
|
|
8
|
+
export const AGENT_HOST_MAX_FRAME_BYTES = 1024 * 1024;
|
|
9
|
+
export const AGENT_HOST_CONNECTION_KEY_ENV = "FRELY_AGENT_HOST_KEY";
|
|
10
|
+
export class AgentHostProtocolError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(code) {
|
|
13
|
+
super(code);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.name = "AgentHostProtocolError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function newConnectionKey() {
|
|
19
|
+
return randomBytes(32).toString("base64url");
|
|
20
|
+
}
|
|
21
|
+
export function isValidTaskId(id) {
|
|
22
|
+
return /^at_[a-z0-9]{24}$/u.test(id);
|
|
23
|
+
}
|
|
24
|
+
export function newTaskId() {
|
|
25
|
+
return `at_${randomBytes(12).toString("hex")}`;
|
|
26
|
+
}
|
|
27
|
+
/** Encode one NDJSON frame. */
|
|
28
|
+
export function encodeAgentHostFrame(message) {
|
|
29
|
+
const line = JSON.stringify(message);
|
|
30
|
+
if (Buffer.byteLength(line) > AGENT_HOST_MAX_FRAME_BYTES)
|
|
31
|
+
throw new AgentHostProtocolError("frame_too_large");
|
|
32
|
+
return `${line}\n`;
|
|
33
|
+
}
|
|
34
|
+
/** Decode one NDJSON frame (without the trailing newline). */
|
|
35
|
+
export function decodeAgentHostFrame(line) {
|
|
36
|
+
if (Buffer.byteLength(line) > AGENT_HOST_MAX_FRAME_BYTES)
|
|
37
|
+
throw new AgentHostProtocolError("frame_too_large");
|
|
38
|
+
let value;
|
|
39
|
+
try {
|
|
40
|
+
value = JSON.parse(Buffer.isBuffer(line) ? line.toString("utf8") : line);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
44
|
+
}
|
|
45
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
46
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
47
|
+
const record = value;
|
|
48
|
+
if (record.jsonrpc !== "2.0")
|
|
49
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
50
|
+
if ("method" in record) {
|
|
51
|
+
if (typeof record.method !== "string" || record.method.length === 0)
|
|
52
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
53
|
+
if ("id" in record && record.id !== null && typeof record.id !== "number" && typeof record.id !== "string") {
|
|
54
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
55
|
+
}
|
|
56
|
+
if ("params" in record && record.params !== undefined && (typeof record.params !== "object" || record.params === null)) {
|
|
57
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
58
|
+
}
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
if (typeof record.id !== "number" && typeof record.id !== "string")
|
|
62
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
63
|
+
if (!("result" in record) && !("error" in record))
|
|
64
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
65
|
+
if ("error" in record && record.error !== undefined) {
|
|
66
|
+
const error = record.error;
|
|
67
|
+
if (!error || typeof error !== "object" || typeof error.code !== "number" || typeof error.message !== "string") {
|
|
68
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
/** Validate and normalize a `task.event` notification params object. */
|
|
74
|
+
export function decodeTaskEvent(params) {
|
|
75
|
+
if (!params || typeof params !== "object")
|
|
76
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
77
|
+
const record = params;
|
|
78
|
+
if (typeof record.taskId !== "string" || !isValidTaskId(record.taskId))
|
|
79
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
80
|
+
const event = record.event;
|
|
81
|
+
if (!event || typeof event !== "object")
|
|
82
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
83
|
+
const item = event;
|
|
84
|
+
switch (item.type) {
|
|
85
|
+
case "status":
|
|
86
|
+
if (item.status !== "running" && item.status !== "waiting_input" && item.status !== "completed" && item.status !== "failed" && item.status !== "cancelled") {
|
|
87
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
88
|
+
}
|
|
89
|
+
if (item.detail !== undefined && typeof item.detail !== "string")
|
|
90
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
91
|
+
return { taskId: record.taskId, event: item };
|
|
92
|
+
case "message":
|
|
93
|
+
if (item.role !== "assistant" && item.role !== "user" && item.role !== "system")
|
|
94
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
95
|
+
if (typeof item.text !== "string" || item.text.length > 64 * 1024)
|
|
96
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
97
|
+
if (item.partial !== undefined && typeof item.partial !== "boolean")
|
|
98
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
99
|
+
return { taskId: record.taskId, event: item };
|
|
100
|
+
case "tool_call":
|
|
101
|
+
if (typeof item.tool !== "string" || typeof item.summary !== "string" || item.summary.length > 2048)
|
|
102
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
103
|
+
if (item.state !== "started" && item.state !== "finished" && item.state !== "failed")
|
|
104
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
105
|
+
return { taskId: record.taskId, event: item };
|
|
106
|
+
case "usage": {
|
|
107
|
+
for (const key of ["inputTokens", "outputTokens", "costUsd"]) {
|
|
108
|
+
const value = item[key];
|
|
109
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
|
|
110
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
111
|
+
}
|
|
112
|
+
return { taskId: record.taskId, event: item };
|
|
113
|
+
}
|
|
114
|
+
case "log":
|
|
115
|
+
if (typeof item.text !== "string" || item.text.length > 4096)
|
|
116
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
117
|
+
return { taskId: record.taskId, event: item };
|
|
118
|
+
default:
|
|
119
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const TOOL_METHODS = new Set(["tool.read", "tool.write", "tool.edit", "tool.bash", "tool.grep", "tool.find", "tool.ls"]);
|
|
123
|
+
export function isToolMethod(method) {
|
|
124
|
+
return TOOL_METHODS.has(method);
|
|
125
|
+
}
|
|
126
|
+
/** Validate params of a `tool.*` request from the host. Returns normalized args. */
|
|
127
|
+
export function decodeToolParams(method, params) {
|
|
128
|
+
if (!params || typeof params !== "object")
|
|
129
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
130
|
+
const record = params;
|
|
131
|
+
if (typeof record.taskId !== "string" || !isValidTaskId(record.taskId))
|
|
132
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
133
|
+
const { taskId, ...args } = record;
|
|
134
|
+
switch (method) {
|
|
135
|
+
case "tool.read":
|
|
136
|
+
requireString(args, "path");
|
|
137
|
+
break;
|
|
138
|
+
case "tool.write":
|
|
139
|
+
requireString(args, "path");
|
|
140
|
+
if (typeof args.content !== "string")
|
|
141
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
142
|
+
optionalBoolean(args, "overwrite");
|
|
143
|
+
break;
|
|
144
|
+
case "tool.edit":
|
|
145
|
+
requireString(args, "path");
|
|
146
|
+
if (!Array.isArray(args.edits) || args.edits.length === 0)
|
|
147
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
148
|
+
break;
|
|
149
|
+
case "tool.bash":
|
|
150
|
+
requireString(args, "command");
|
|
151
|
+
optionalString(args, "cwd");
|
|
152
|
+
if (args.timeoutMs !== undefined && (typeof args.timeoutMs !== "number" || !Number.isSafeInteger(args.timeoutMs) || args.timeoutMs < 100 || args.timeoutMs > 120_000)) {
|
|
153
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
case "tool.grep":
|
|
157
|
+
requireString(args, "query");
|
|
158
|
+
optionalString(args, "path");
|
|
159
|
+
optionalBoolean(args, "regex");
|
|
160
|
+
optionalBoolean(args, "caseSensitive");
|
|
161
|
+
optionalInteger(args, "maxResults", 1, 200);
|
|
162
|
+
optionalInteger(args, "contextLines", 0, 5);
|
|
163
|
+
break;
|
|
164
|
+
case "tool.find":
|
|
165
|
+
requireString(args, "pattern");
|
|
166
|
+
optionalString(args, "path");
|
|
167
|
+
optionalInteger(args, "maxResults", 1, 500);
|
|
168
|
+
break;
|
|
169
|
+
case "tool.ls":
|
|
170
|
+
optionalString(args, "path");
|
|
171
|
+
break;
|
|
172
|
+
default:
|
|
173
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
174
|
+
}
|
|
175
|
+
return { taskId, args };
|
|
176
|
+
}
|
|
177
|
+
function requireString(args, key) {
|
|
178
|
+
if (typeof args[key] !== "string" || args[key].length === 0)
|
|
179
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
180
|
+
}
|
|
181
|
+
function optionalString(args, key) {
|
|
182
|
+
if (args[key] !== undefined && typeof args[key] !== "string")
|
|
183
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
184
|
+
}
|
|
185
|
+
function optionalBoolean(args, key) {
|
|
186
|
+
if (args[key] !== undefined && typeof args[key] !== "boolean")
|
|
187
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
188
|
+
}
|
|
189
|
+
function optionalInteger(args, key, min, max) {
|
|
190
|
+
const value = args[key];
|
|
191
|
+
if (value !== undefined && (typeof value !== "number" || !Number.isSafeInteger(value) || value < min || value > max)) {
|
|
192
|
+
throw new AgentHostProtocolError("frame_invalid");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/agent/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent host supervisor: spawns the capsule agent host with a duplex fd3
|
|
3
|
+
* protocol pipe, performs the frely.agent-host.v1 handshake, forwards tool
|
|
4
|
+
* requests, and owns idle shutdown / crash handling.
|
|
5
|
+
*/
|
|
6
|
+
import { type ChildProcess } from "node:child_process";
|
|
7
|
+
import { type DiagnosticLog } from "../runtime/diagnostics.js";
|
|
8
|
+
import { type AgentHostTaskEvent, type JsonRpcId } from "./protocol.js";
|
|
9
|
+
import { type CapsuleFacts, type AppInstall } from "./app-install.js";
|
|
10
|
+
export declare const AGENT_HOST_IDLE_TIMEOUT_MS: number;
|
|
11
|
+
export declare const AGENT_HOST_HANDSHAKE_TIMEOUT_MS = 15000;
|
|
12
|
+
export type AgentHostStatus = "stopped" | "starting" | "running" | "failed";
|
|
13
|
+
export type HostRequest = {
|
|
14
|
+
id: JsonRpcId;
|
|
15
|
+
method: string;
|
|
16
|
+
params: unknown;
|
|
17
|
+
};
|
|
18
|
+
/** JSON-RPC peer over the fd3 pipe of a spawned agent host. */
|
|
19
|
+
export declare class AgentHostConnection {
|
|
20
|
+
readonly process: ChildProcess;
|
|
21
|
+
private readonly duplex;
|
|
22
|
+
private readonly log?;
|
|
23
|
+
private nextId;
|
|
24
|
+
private readonly pending;
|
|
25
|
+
private writeClosed;
|
|
26
|
+
private closeListeners;
|
|
27
|
+
private constructor();
|
|
28
|
+
static start(facts: CapsuleFacts, options: {
|
|
29
|
+
log?: DiagnosticLog | undefined;
|
|
30
|
+
onEvent?: (taskId: string, event: AgentHostTaskEvent) => void;
|
|
31
|
+
onToolRequest?: (request: HostRequest, args: Record<string, unknown>, taskId: string) => Promise<unknown>;
|
|
32
|
+
}): Promise<AgentHostConnection>;
|
|
33
|
+
private onEvent?;
|
|
34
|
+
private onToolRequest?;
|
|
35
|
+
private handshake;
|
|
36
|
+
request(method: string, params: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
|
|
37
|
+
notify(method: string, params: Record<string, unknown>): void;
|
|
38
|
+
respond(id: JsonRpcId, result: unknown): void;
|
|
39
|
+
respondError(id: JsonRpcId, code: number, message: string): void;
|
|
40
|
+
shutdown(graceMs?: number): Promise<void>;
|
|
41
|
+
kill(): void;
|
|
42
|
+
onClose(listener: (error?: Error) => void): void;
|
|
43
|
+
private write;
|
|
44
|
+
private handleLine;
|
|
45
|
+
private handleNotification;
|
|
46
|
+
private handleHostRequest;
|
|
47
|
+
private closed;
|
|
48
|
+
private close;
|
|
49
|
+
}
|
|
50
|
+
export declare function cliVersion(): string;
|
|
51
|
+
/** Owns the single agent host process across tasks. */
|
|
52
|
+
export declare class AgentHostSupervisor {
|
|
53
|
+
private readonly deps;
|
|
54
|
+
private connection;
|
|
55
|
+
private starting;
|
|
56
|
+
private idleTimer;
|
|
57
|
+
private state;
|
|
58
|
+
private lastError;
|
|
59
|
+
private integrityVerified;
|
|
60
|
+
private lastActivityAt;
|
|
61
|
+
constructor(deps: {
|
|
62
|
+
resolveFacts: () => Promise<CapsuleFacts>;
|
|
63
|
+
onEvent: (taskId: string, event: AgentHostTaskEvent) => void;
|
|
64
|
+
onToolRequest: (request: HostRequest, args: Record<string, unknown>, taskId: string) => Promise<unknown>;
|
|
65
|
+
onHostLost: (error?: Error) => void;
|
|
66
|
+
isIdle: () => boolean | Promise<boolean>;
|
|
67
|
+
log?: DiagnosticLog | undefined;
|
|
68
|
+
fullIntegrityVerification?: boolean;
|
|
69
|
+
appInstall?: (() => Promise<AppInstall>) | undefined;
|
|
70
|
+
});
|
|
71
|
+
status(): {
|
|
72
|
+
state: AgentHostStatus;
|
|
73
|
+
hostVersion: string | null;
|
|
74
|
+
lastError: string | null;
|
|
75
|
+
};
|
|
76
|
+
ensureHost(): Promise<AgentHostConnection>;
|
|
77
|
+
stop(): Promise<void>;
|
|
78
|
+
private armIdleTimer;
|
|
79
|
+
private disarmIdleTimer;
|
|
80
|
+
}
|