frely-cli 0.7.1 → 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.
Files changed (91) hide show
  1. package/README.md +25 -35
  2. package/README.zh-CN.md +25 -35
  3. package/dist/agent/agent-service.d.ts +77 -0
  4. package/dist/agent/agent-service.js +348 -0
  5. package/dist/agent/agent-service.js.map +1 -0
  6. package/dist/agent/app-install.d.ts +49 -0
  7. package/dist/agent/app-install.js +133 -0
  8. package/dist/agent/app-install.js.map +1 -0
  9. package/dist/agent/app-key.d.ts +14 -0
  10. package/dist/agent/app-key.js +46 -0
  11. package/dist/agent/app-key.js.map +1 -0
  12. package/dist/agent/compose.d.ts +23 -0
  13. package/dist/agent/compose.js +42 -0
  14. package/dist/agent/compose.js.map +1 -0
  15. package/dist/agent/ops-server.d.ts +18 -0
  16. package/dist/agent/ops-server.js +175 -0
  17. package/dist/agent/ops-server.js.map +1 -0
  18. package/dist/agent/ops-stdio.d.ts +5 -0
  19. package/dist/agent/ops-stdio.js +47 -0
  20. package/dist/agent/ops-stdio.js.map +1 -0
  21. package/dist/agent/ops.d.ts +25 -0
  22. package/dist/agent/ops.js +82 -0
  23. package/dist/agent/ops.js.map +1 -0
  24. package/dist/agent/protocol.d.ts +72 -0
  25. package/dist/agent/protocol.js +195 -0
  26. package/dist/agent/protocol.js.map +1 -0
  27. package/dist/agent/supervisor.d.ts +80 -0
  28. package/dist/agent/supervisor.js +278 -0
  29. package/dist/agent/supervisor.js.map +1 -0
  30. package/dist/agent/task-store.d.ts +82 -0
  31. package/dist/agent/task-store.js +220 -0
  32. package/dist/agent/task-store.js.map +1 -0
  33. package/dist/agent/tool-executor.d.ts +28 -0
  34. package/dist/agent/tool-executor.js +113 -0
  35. package/dist/agent/tool-executor.js.map +1 -0
  36. package/dist/agent/worktrees.d.ts +35 -0
  37. package/dist/agent/worktrees.js +143 -0
  38. package/dist/agent/worktrees.js.map +1 -0
  39. package/dist/agent-help.d.ts +198 -210
  40. package/dist/agent-help.js +47 -62
  41. package/dist/agent-help.js.map +1 -1
  42. package/dist/cloud.d.ts +1 -1
  43. package/dist/cloud.js +6 -13
  44. package/dist/cloud.js.map +1 -1
  45. package/dist/device/protocol.d.ts +11 -2
  46. package/dist/device/protocol.js +18 -2
  47. package/dist/device/protocol.js.map +1 -1
  48. package/dist/device/relay-client.d.ts +10 -1
  49. package/dist/device/relay-client.js +38 -11
  50. package/dist/device/relay-client.js.map +1 -1
  51. package/dist/diagnostics.js +12 -4
  52. package/dist/diagnostics.js.map +1 -1
  53. package/dist/index.js +195 -141
  54. package/dist/index.js.map +1 -1
  55. package/dist/key-budget.js +2 -2
  56. package/dist/key-budget.js.map +1 -1
  57. package/dist/mcp-authorization.js +9 -7
  58. package/dist/mcp-authorization.js.map +1 -1
  59. package/dist/mcp-command.d.ts +12 -4
  60. package/dist/mcp-command.js +54 -48
  61. package/dist/mcp-command.js.map +1 -1
  62. package/dist/provider/state.d.ts +2 -0
  63. package/dist/provider/state.js +1 -0
  64. package/dist/provider/state.js.map +1 -1
  65. package/dist/runtime/mcp-lease.js +1 -1
  66. package/dist/runtime/mcp-lease.js.map +1 -1
  67. package/dist/runtime/mcp.d.ts +139 -0
  68. package/dist/runtime/mcp.js +30 -0
  69. package/dist/runtime/mcp.js.map +1 -1
  70. package/dist/runtime/relay-agent.d.ts +25 -0
  71. package/dist/runtime/relay-agent.js +63 -0
  72. package/dist/runtime/relay-agent.js.map +1 -0
  73. package/dist/runtime/relay-mcp.d.ts +3 -1
  74. package/dist/runtime/relay-mcp.js +6 -1
  75. package/dist/runtime/relay-mcp.js.map +1 -1
  76. package/dist/runtime/relay-session.d.ts +2 -2
  77. package/dist/runtime/relay-session.js +1 -1
  78. package/dist/runtime/relay-session.js.map +1 -1
  79. package/dist/runtime/sandbox.d.ts +2 -0
  80. package/dist/runtime/sandbox.js +13 -0
  81. package/dist/runtime/sandbox.js.map +1 -1
  82. package/dist/runtime/workspace-registry.js +1 -1
  83. package/dist/skill/access.d.ts +4 -2
  84. package/dist/skill/access.js +7 -3
  85. package/dist/skill/access.js.map +1 -1
  86. package/dist/upgrade/installation.js +1 -1
  87. package/dist/upgrade/installation.js.map +1 -1
  88. package/dist/workspace-command.d.ts +1 -1
  89. package/dist/workspace-command.js +2 -2
  90. package/dist/workspace-command.js.map +1 -1
  91. package/package.json +1 -1
@@ -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
+ }
@@ -0,0 +1,278 @@
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 { spawn } from "node:child_process";
7
+ import { createInterface } from "node:readline";
8
+ import { diagnostic } from "../runtime/diagnostics.js";
9
+ import { VERSION } from "../version.js";
10
+ import { AGENT_HOST_CONNECTION_KEY_ENV, AGENT_HOST_PROTOCOL_VERSION, AgentHostProtocolError, decodeAgentHostFrame, decodeTaskEvent, decodeToolParams, encodeAgentHostFrame, isToolMethod, newConnectionKey, } from "./protocol.js";
11
+ export const AGENT_HOST_IDLE_TIMEOUT_MS = 15 * 60 * 1000;
12
+ export const AGENT_HOST_HANDSHAKE_TIMEOUT_MS = 15_000;
13
+ /** JSON-RPC peer over the fd3 pipe of a spawned agent host. */
14
+ export class AgentHostConnection {
15
+ process;
16
+ duplex;
17
+ log;
18
+ nextId = 1;
19
+ pending = new Map();
20
+ writeClosed = false;
21
+ closeListeners = [];
22
+ constructor(process, duplex, log) {
23
+ this.process = process;
24
+ this.duplex = duplex;
25
+ this.log = log;
26
+ const lines = createInterface({ input: duplex, crlfDelay: Infinity });
27
+ lines.on("line", (line) => this.handleLine(line));
28
+ this.duplex.on("error", (error) => this.close(error));
29
+ this.duplex.on("close", () => this.close());
30
+ this.process.once("exit", (code, signal) => this.close(new Error(`Agent host exited (code=${code} signal=${signal}).`)));
31
+ }
32
+ static async start(facts, options) {
33
+ const key = newConnectionKey();
34
+ const child = spawn(facts.nodeExecutable, [facts.agentHostEntrypoint], {
35
+ stdio: ["ignore", "ignore", "ignore", "pipe"],
36
+ env: { ...process.env, [AGENT_HOST_CONNECTION_KEY_ENV]: key },
37
+ windowsHide: true,
38
+ });
39
+ const duplex = child.stdio[3];
40
+ if (!duplex) {
41
+ child.kill();
42
+ throw new AgentHostProtocolError("unexpected_frame");
43
+ }
44
+ const connection = new AgentHostConnection(child, duplex, options.log);
45
+ try {
46
+ await connection.handshake(key);
47
+ }
48
+ catch (error) {
49
+ connection.kill();
50
+ throw error;
51
+ }
52
+ connection.onEvent = options.onEvent;
53
+ connection.onToolRequest = options.onToolRequest ?? null;
54
+ return connection;
55
+ }
56
+ onEvent;
57
+ onToolRequest;
58
+ async handshake(connectionKey) {
59
+ const result = (await this.request("initialize", { protocolVersion: AGENT_HOST_PROTOCOL_VERSION, cliVersion: cliVersion(), connectionKey, capabilities: ["tasks", "tools"] }, AGENT_HOST_HANDSHAKE_TIMEOUT_MS));
60
+ if (!result || result.protocolVersion !== AGENT_HOST_PROTOCOL_VERSION) {
61
+ throw new AgentHostProtocolError("handshake_rejected");
62
+ }
63
+ this.notify("initialized", {});
64
+ }
65
+ request(method, params, timeoutMs = 120_000) {
66
+ if (this.writeClosed)
67
+ return Promise.reject(new Error("Agent host connection is closed."));
68
+ const id = this.nextId++;
69
+ return new Promise((resolve, reject) => {
70
+ const timer = setTimeout(() => {
71
+ this.pending.delete(id);
72
+ reject(new Error(`Agent host request timed out: ${method}`));
73
+ }, timeoutMs);
74
+ timer.unref?.();
75
+ this.pending.set(id, { resolve, reject, method, timer });
76
+ this.write({ jsonrpc: "2.0", id, method, params });
77
+ });
78
+ }
79
+ notify(method, params) {
80
+ if (this.writeClosed)
81
+ return;
82
+ this.write({ jsonrpc: "2.0", method, params });
83
+ }
84
+ respond(id, result) {
85
+ if (this.writeClosed)
86
+ return;
87
+ this.write({ jsonrpc: "2.0", id, result });
88
+ }
89
+ respondError(id, code, message) {
90
+ if (this.writeClosed)
91
+ return;
92
+ this.write({ jsonrpc: "2.0", id, error: { code, message } });
93
+ }
94
+ async shutdown(graceMs = 5_000) {
95
+ try {
96
+ await this.request("host.shutdown", {}, graceMs).catch(() => undefined);
97
+ }
98
+ finally {
99
+ this.kill();
100
+ }
101
+ }
102
+ kill() {
103
+ this.writeClosed = true;
104
+ this.process.kill();
105
+ }
106
+ onClose(listener) {
107
+ this.closeListeners.push(listener);
108
+ }
109
+ write(message) {
110
+ this.duplex.write(encodeAgentHostFrame(message), (error) => {
111
+ if (error)
112
+ this.close(error instanceof Error ? error : new Error(String(error)));
113
+ });
114
+ }
115
+ handleLine(line) {
116
+ let message;
117
+ try {
118
+ message = decodeAgentHostFrame(line);
119
+ }
120
+ catch (error) {
121
+ diagnostic(this.log, "agent.host.frame_invalid", {}, error);
122
+ this.close(error instanceof Error ? error : new Error("invalid frame"));
123
+ return;
124
+ }
125
+ if ("method" in message) {
126
+ if ("id" in message && message.id !== undefined)
127
+ void this.handleHostRequest(message);
128
+ else
129
+ this.handleNotification(message.method, message.params);
130
+ return;
131
+ }
132
+ const pending = this.pending.get(message.id);
133
+ if (!pending)
134
+ return;
135
+ this.pending.delete(message.id);
136
+ clearTimeout(pending.timer);
137
+ if ("error" in message && message.error)
138
+ pending.reject(new Error(`${pending.method}: ${message.error.message}`));
139
+ else
140
+ pending.resolve(message.result);
141
+ }
142
+ handleNotification(method, params) {
143
+ if (method !== "task.event") {
144
+ diagnostic(this.log, "agent.host.unexpected_notification", { method });
145
+ return;
146
+ }
147
+ try {
148
+ const { taskId, event } = decodeTaskEvent(params);
149
+ this.onEvent?.(taskId, event);
150
+ }
151
+ catch (error) {
152
+ diagnostic(this.log, "agent.host.event_invalid", {}, error);
153
+ }
154
+ }
155
+ async handleHostRequest(request) {
156
+ if (!isToolMethod(request.method)) {
157
+ this.respondError(request.id, -32601, `Unknown method: ${request.method}`);
158
+ return;
159
+ }
160
+ if (!this.onToolRequest) {
161
+ this.respondError(request.id, -32000, "No tool executor attached.");
162
+ return;
163
+ }
164
+ try {
165
+ const { taskId, args } = decodeToolParams(request.method, request.params);
166
+ const result = await this.onToolRequest({ id: request.id, method: request.method, params: request.params }, args, taskId);
167
+ this.respond(request.id, { ok: true, result });
168
+ }
169
+ catch (error) {
170
+ this.respond(request.id, { ok: false, error: { code: "tool_failed", message: error instanceof Error ? error.message.slice(0, 512) : "tool failed" } });
171
+ }
172
+ }
173
+ closed = false;
174
+ close(error) {
175
+ if (this.closed)
176
+ return;
177
+ this.closed = true;
178
+ this.writeClosed = true;
179
+ for (const pending of this.pending.values()) {
180
+ clearTimeout(pending.timer);
181
+ pending.reject(error ?? new Error("Agent host connection closed."));
182
+ }
183
+ this.pending.clear();
184
+ for (const listener of [...this.closeListeners])
185
+ listener(error);
186
+ this.closeListeners = [];
187
+ }
188
+ }
189
+ export function cliVersion() {
190
+ return process.env.FRELY_CLI_VERSION_OVERRIDE ?? VERSION;
191
+ }
192
+ /** Owns the single agent host process across tasks. */
193
+ export class AgentHostSupervisor {
194
+ deps;
195
+ connection = null;
196
+ starting = null;
197
+ idleTimer = null;
198
+ state = "stopped";
199
+ lastError = null;
200
+ integrityVerified = false;
201
+ lastActivityAt = 0;
202
+ constructor(deps) {
203
+ this.deps = deps;
204
+ }
205
+ status() {
206
+ return { state: this.state, hostVersion: null, lastError: this.lastError };
207
+ }
208
+ async ensureHost() {
209
+ if (this.connection)
210
+ return this.connection;
211
+ if (this.starting)
212
+ return this.starting;
213
+ this.starting = (async () => {
214
+ this.state = "starting";
215
+ const facts = await this.deps.resolveFacts();
216
+ if (this.deps.fullIntegrityVerification && !this.integrityVerified) {
217
+ const { verifyCapsuleIntegrity } = await import("./app-install.js");
218
+ const install = this.deps.appInstall ? await this.deps.appInstall() : null;
219
+ if (install)
220
+ await verifyCapsuleIntegrity(install);
221
+ this.integrityVerified = true;
222
+ }
223
+ const connection = await AgentHostConnection.start(facts, {
224
+ log: this.deps.log,
225
+ onEvent: (taskId, event) => {
226
+ this.lastActivityAt = Date.now();
227
+ this.deps.onEvent(taskId, event);
228
+ },
229
+ onToolRequest: (request, args, taskId) => {
230
+ this.lastActivityAt = Date.now();
231
+ return this.deps.onToolRequest(request, args, taskId);
232
+ },
233
+ });
234
+ connection.onClose((error) => {
235
+ this.connection = null;
236
+ this.state = "stopped";
237
+ this.lastError = error ? error.message : null;
238
+ this.deps.onHostLost(error);
239
+ });
240
+ this.connection = connection;
241
+ this.state = "running";
242
+ this.lastError = null;
243
+ this.armIdleTimer();
244
+ return connection;
245
+ })();
246
+ try {
247
+ return await this.starting;
248
+ }
249
+ finally {
250
+ this.starting = null;
251
+ }
252
+ }
253
+ async stop() {
254
+ this.disarmIdleTimer();
255
+ const connection = this.connection;
256
+ this.connection = null;
257
+ this.state = "stopped";
258
+ if (connection)
259
+ await connection.shutdown();
260
+ }
261
+ armIdleTimer() {
262
+ this.disarmIdleTimer();
263
+ this.lastActivityAt = Date.now();
264
+ this.idleTimer = setInterval(() => {
265
+ void Promise.resolve(this.deps.isIdle()).then((idle) => {
266
+ if (idle && Date.now() - this.lastActivityAt >= AGENT_HOST_IDLE_TIMEOUT_MS)
267
+ void this.stop();
268
+ });
269
+ }, 30_000);
270
+ this.idleTimer.unref?.();
271
+ }
272
+ disarmIdleTimer() {
273
+ if (this.idleTimer)
274
+ clearInterval(this.idleTimer);
275
+ this.idleTimer = null;
276
+ }
277
+ }
278
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/agent/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { type AgentHostTaskEvent } from "./protocol.js";
2
+ export type AgentTaskRuntimeStatus = "queued" | "running" | "waiting_input" | "completed" | "failed" | "cancelled";
3
+ export type AgentTaskMergeStatus = "none" | "merge_requested" | "approved" | "merged" | "merge_conflict" | "discarded";
4
+ export type AgentTaskSource = {
5
+ kind: "gui";
6
+ } | {
7
+ kind: "web";
8
+ } | {
9
+ kind: "mcp";
10
+ authorizationId: string;
11
+ };
12
+ export type AgentTaskUsage = {
13
+ inputTokens: number;
14
+ outputTokens: number;
15
+ costUsd: number;
16
+ };
17
+ export type AgentTaskRecord = {
18
+ id: string;
19
+ source: AgentTaskSource;
20
+ workspace: string;
21
+ worktreePath: string;
22
+ branch: string;
23
+ baseBranch: string;
24
+ baseCommit: string;
25
+ goal: string;
26
+ model: string | null;
27
+ maxCostUsd: number;
28
+ status: AgentTaskRuntimeStatus;
29
+ mergeStatus: AgentTaskMergeStatus;
30
+ usage: AgentTaskUsage;
31
+ error: string | null;
32
+ mergeRequest: {
33
+ requestedAt: string;
34
+ note?: string;
35
+ } | null;
36
+ approval: {
37
+ approvedAt: string;
38
+ approvedBy: "gui" | "web";
39
+ } | null;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ settledAt: string | null;
43
+ };
44
+ export type StoredAgentEvent = AgentHostTaskEvent & {
45
+ seq: number;
46
+ at: string;
47
+ };
48
+ export declare const AGENT_TASK_EVENTS_PAGE_SIZE = 100;
49
+ export declare const AGENT_TASK_MAX_GOAL_BYTES: number;
50
+ export declare const AGENT_DEFAULT_MAX_COST_USD = 2;
51
+ export declare const AGENT_MAX_COST_USD_LIMIT = 50;
52
+ export declare const AGENT_DEFAULT_MAX_CONCURRENT_TASKS = 2;
53
+ export declare const AGENT_START_RATE_LIMIT_PER_MINUTE = 5;
54
+ export declare class AgentStoreError extends Error {
55
+ readonly code: "task_not_found" | "task_exists" | "store_corrupt" | "invalid_task";
56
+ constructor(code: "task_not_found" | "task_exists" | "store_corrupt" | "invalid_task");
57
+ }
58
+ export declare function agentStateDir(env?: NodeJS.ProcessEnv): string;
59
+ export declare function agentConfigPath(env?: NodeJS.ProcessEnv): string;
60
+ export declare function agentDataDir(env?: NodeJS.ProcessEnv): string;
61
+ export declare function workspaceStorageKey(workspaceRoot: string): string;
62
+ /** Serialize + validate the runtime/merge state machine transitions. */
63
+ export declare function nextRuntimeStatus(current: AgentTaskRuntimeStatus, event: AgentHostTaskEvent): AgentTaskRuntimeStatus | null;
64
+ export declare function isTerminalStatus(status: AgentTaskRuntimeStatus): boolean;
65
+ export declare class TaskStore {
66
+ private readonly rootDir;
67
+ constructor(rootDir: string);
68
+ static open(rootDir?: string, env?: NodeJS.ProcessEnv): TaskStore;
69
+ create(record: AgentTaskRecord): Promise<void>;
70
+ read(id: string): Promise<AgentTaskRecord>;
71
+ update(id: string, mutate: (record: AgentTaskRecord) => AgentTaskRecord): Promise<AgentTaskRecord>;
72
+ list(): Promise<AgentTaskRecord[]>;
73
+ appendEvent(id: string, event: AgentHostTaskEvent): Promise<StoredAgentEvent>;
74
+ readEvents(id: string, cursor: number, limit?: number): Promise<{
75
+ events: StoredAgentEvent[];
76
+ nextCursor: number | null;
77
+ }>;
78
+ private lastEventSeq;
79
+ private taskDir;
80
+ private persist;
81
+ }
82
+ export declare function validateTaskRecord(value: unknown): AgentTaskRecord;