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,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;
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent task store: one directory per task under the frely state directory
|
|
3
|
+
* (`<state>/agent/tasks/<taskId>/`), with `task.json` for the record and
|
|
4
|
+
* `events.jsonl` for the append-only event log.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
import { isValidTaskId } from "./protocol.js";
|
|
11
|
+
export const AGENT_TASK_EVENTS_PAGE_SIZE = 100;
|
|
12
|
+
export const AGENT_TASK_MAX_GOAL_BYTES = 64 * 1024;
|
|
13
|
+
export const AGENT_DEFAULT_MAX_COST_USD = 2;
|
|
14
|
+
export const AGENT_MAX_COST_USD_LIMIT = 50;
|
|
15
|
+
export const AGENT_DEFAULT_MAX_CONCURRENT_TASKS = 2;
|
|
16
|
+
export const AGENT_START_RATE_LIMIT_PER_MINUTE = 5;
|
|
17
|
+
export class AgentStoreError extends Error {
|
|
18
|
+
code;
|
|
19
|
+
constructor(code) {
|
|
20
|
+
super(code);
|
|
21
|
+
this.code = code;
|
|
22
|
+
this.name = "AgentStoreError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function agentStateDir(env = process.env) {
|
|
26
|
+
return join(env.XDG_STATE_HOME || join(homedir(), ".local", "state"), "frely", "agent");
|
|
27
|
+
}
|
|
28
|
+
export function agentConfigPath(env = process.env) {
|
|
29
|
+
return join(env.XDG_CONFIG_HOME || join(homedir(), ".config"), "frely", "agent.json");
|
|
30
|
+
}
|
|
31
|
+
export function agentDataDir(env = process.env) {
|
|
32
|
+
return join(env.XDG_DATA_HOME || join(homedir(), ".local", "share"), "frely");
|
|
33
|
+
}
|
|
34
|
+
export function workspaceStorageKey(workspaceRoot) {
|
|
35
|
+
return createHash("sha256").update(workspaceRoot).digest("hex").slice(0, 16);
|
|
36
|
+
}
|
|
37
|
+
/** Serialize + validate the runtime/merge state machine transitions. */
|
|
38
|
+
export function nextRuntimeStatus(current, event) {
|
|
39
|
+
if (event.type !== "status")
|
|
40
|
+
return null;
|
|
41
|
+
switch (current) {
|
|
42
|
+
case "queued":
|
|
43
|
+
// Host events may race ahead of CLI bookkeeping right after task.start,
|
|
44
|
+
// so any authoritative host status is accepted from queued.
|
|
45
|
+
return event.status === "running" || event.status === "waiting_input" || event.status === "completed" || event.status === "failed" || event.status === "cancelled"
|
|
46
|
+
? event.status
|
|
47
|
+
: null;
|
|
48
|
+
case "running":
|
|
49
|
+
return event.status === "waiting_input" || event.status === "completed" || event.status === "failed" || event.status === "cancelled" || event.status === "running"
|
|
50
|
+
? event.status
|
|
51
|
+
: null;
|
|
52
|
+
case "waiting_input":
|
|
53
|
+
return event.status === "running" || event.status === "completed" || event.status === "failed" || event.status === "cancelled" ? event.status : null;
|
|
54
|
+
default:
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function isTerminalStatus(status) {
|
|
59
|
+
return status === "completed" || status === "failed" || status === "cancelled";
|
|
60
|
+
}
|
|
61
|
+
export class TaskStore {
|
|
62
|
+
rootDir;
|
|
63
|
+
constructor(rootDir) {
|
|
64
|
+
this.rootDir = rootDir;
|
|
65
|
+
}
|
|
66
|
+
static open(rootDir, env = process.env) {
|
|
67
|
+
return new TaskStore(rootDir ?? join(agentStateDir(env), "tasks"));
|
|
68
|
+
}
|
|
69
|
+
async create(record) {
|
|
70
|
+
if (!isValidTaskId(record.id))
|
|
71
|
+
throw new AgentStoreError("invalid_task");
|
|
72
|
+
const dir = this.taskDir(record.id);
|
|
73
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
74
|
+
if (await this.read(record.id).then(() => true, () => false))
|
|
75
|
+
throw new AgentStoreError("task_exists");
|
|
76
|
+
await this.persist(record);
|
|
77
|
+
}
|
|
78
|
+
async read(id) {
|
|
79
|
+
if (!isValidTaskId(id))
|
|
80
|
+
throw new AgentStoreError("invalid_task");
|
|
81
|
+
let raw;
|
|
82
|
+
try {
|
|
83
|
+
raw = await readFile(join(this.taskDir(id), "task.json"), "utf8");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
throw new AgentStoreError("task_not_found");
|
|
87
|
+
}
|
|
88
|
+
let value;
|
|
89
|
+
try {
|
|
90
|
+
value = JSON.parse(raw);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new AgentStoreError("store_corrupt");
|
|
94
|
+
}
|
|
95
|
+
return validateTaskRecord(value);
|
|
96
|
+
}
|
|
97
|
+
async update(id, mutate) {
|
|
98
|
+
const current = await this.read(id);
|
|
99
|
+
const next = validateTaskRecord(mutate(structuredClone(current)));
|
|
100
|
+
if (next.id !== current.id)
|
|
101
|
+
throw new AgentStoreError("invalid_task");
|
|
102
|
+
await this.persist(next);
|
|
103
|
+
return next;
|
|
104
|
+
}
|
|
105
|
+
async list() {
|
|
106
|
+
let entries;
|
|
107
|
+
try {
|
|
108
|
+
entries = await readdir(this.rootDir);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
const records = [];
|
|
114
|
+
for (const entry of entries.sort()) {
|
|
115
|
+
if (!isValidTaskId(entry))
|
|
116
|
+
continue;
|
|
117
|
+
const record = await this.read(entry).catch(() => null);
|
|
118
|
+
if (record)
|
|
119
|
+
records.push(record);
|
|
120
|
+
}
|
|
121
|
+
return records;
|
|
122
|
+
}
|
|
123
|
+
async appendEvent(id, event) {
|
|
124
|
+
const dir = this.taskDir(id);
|
|
125
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
126
|
+
const last = await this.lastEventSeq(id);
|
|
127
|
+
const stored = { ...event, seq: last + 1, at: new Date().toISOString() };
|
|
128
|
+
const { appendFile } = await import("node:fs/promises");
|
|
129
|
+
await appendFile(join(dir, "events.jsonl"), `${JSON.stringify(stored)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
130
|
+
return stored;
|
|
131
|
+
}
|
|
132
|
+
async readEvents(id, cursor, limit = AGENT_TASK_EVENTS_PAGE_SIZE) {
|
|
133
|
+
let raw;
|
|
134
|
+
try {
|
|
135
|
+
raw = await readFile(join(this.taskDir(id), "events.jsonl"), "utf8");
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
if (await this.read(id).then(() => true, () => false))
|
|
139
|
+
return { events: [], nextCursor: null };
|
|
140
|
+
throw new AgentStoreError("task_not_found");
|
|
141
|
+
}
|
|
142
|
+
const events = [];
|
|
143
|
+
let nextCursor = null;
|
|
144
|
+
for (const line of raw.split("\n")) {
|
|
145
|
+
if (!line)
|
|
146
|
+
continue;
|
|
147
|
+
let parsed;
|
|
148
|
+
try {
|
|
149
|
+
parsed = JSON.parse(line);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (parsed.seq > cursor) {
|
|
155
|
+
events.push(parsed);
|
|
156
|
+
if (events.length > limit) {
|
|
157
|
+
events.pop();
|
|
158
|
+
nextCursor = parsed.seq - 1;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return { events, nextCursor };
|
|
164
|
+
}
|
|
165
|
+
async lastEventSeq(id) {
|
|
166
|
+
let raw;
|
|
167
|
+
try {
|
|
168
|
+
raw = await readFile(join(this.taskDir(id), "events.jsonl"), "utf8");
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
const lines = raw.trimEnd().split("\n");
|
|
174
|
+
const last = lines[lines.length - 1];
|
|
175
|
+
if (!last)
|
|
176
|
+
return 0;
|
|
177
|
+
try {
|
|
178
|
+
const parsed = JSON.parse(last);
|
|
179
|
+
return typeof parsed.seq === "number" ? parsed.seq : 0;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
taskDir(id) {
|
|
186
|
+
return join(this.rootDir, id);
|
|
187
|
+
}
|
|
188
|
+
async persist(record) {
|
|
189
|
+
record.updatedAt = new Date().toISOString();
|
|
190
|
+
const dir = this.taskDir(record.id);
|
|
191
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
192
|
+
const tmp = join(dir, `task.json.${process.pid}.${randomBytes(4).toString("hex")}.tmp`);
|
|
193
|
+
await writeFile(tmp, `${JSON.stringify(record, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
194
|
+
await rename(tmp, join(dir, "task.json"));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
export function validateTaskRecord(value) {
|
|
198
|
+
if (!value || typeof value !== "object")
|
|
199
|
+
throw new AgentStoreError("store_corrupt");
|
|
200
|
+
const r = value;
|
|
201
|
+
const id = r.id;
|
|
202
|
+
if (typeof id !== "string" || !isValidTaskId(id))
|
|
203
|
+
throw new AgentStoreError("store_corrupt");
|
|
204
|
+
const runtimeStatuses = ["queued", "running", "waiting_input", "completed", "failed", "cancelled"];
|
|
205
|
+
const mergeStatuses = ["none", "merge_requested", "approved", "merged", "merge_conflict", "discarded"];
|
|
206
|
+
if (!runtimeStatuses.includes(r.status))
|
|
207
|
+
throw new AgentStoreError("store_corrupt");
|
|
208
|
+
if (!mergeStatuses.includes(r.mergeStatus))
|
|
209
|
+
throw new AgentStoreError("store_corrupt");
|
|
210
|
+
for (const key of ["workspace", "worktreePath", "branch", "baseBranch", "baseCommit", "goal", "createdAt", "updatedAt"]) {
|
|
211
|
+
if (typeof r[key] !== "string")
|
|
212
|
+
throw new AgentStoreError("store_corrupt");
|
|
213
|
+
}
|
|
214
|
+
for (const key of ["maxCostUsd"]) {
|
|
215
|
+
if (typeof r[key] !== "number" || !Number.isFinite(r[key]) || r[key] <= 0)
|
|
216
|
+
throw new AgentStoreError("store_corrupt");
|
|
217
|
+
}
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=task-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.js","sourceRoot":"","sources":["../../src/agent/task-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent tool executor: executes `tool.*` requests from the agent host inside
|
|
3
|
+
* the task's worktree through the shared `Workspace` implementation (path
|
|
4
|
+
* containment + srt sandbox for commands) under a fair read/write scheduler.
|
|
5
|
+
*/
|
|
6
|
+
import { FairRwScheduler } from "../runtime/scheduler.js";
|
|
7
|
+
export type AgentToolResult = {
|
|
8
|
+
ok: true;
|
|
9
|
+
result: unknown;
|
|
10
|
+
} | {
|
|
11
|
+
ok: false;
|
|
12
|
+
error: {
|
|
13
|
+
code: "tool_failed" | "not_found" | "invalid_args";
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
export type AgentToolKind = "read" | "write" | "bash" | "grep" | "find" | "ls" | "edit";
|
|
18
|
+
/** Single active executor per task; created when the task starts running. */
|
|
19
|
+
export declare class AgentToolExecutor {
|
|
20
|
+
private readonly scheduler;
|
|
21
|
+
private readonly workspace;
|
|
22
|
+
private disposed;
|
|
23
|
+
constructor(worktreeRoot: string, scheduler: FairRwScheduler);
|
|
24
|
+
execute(kind: AgentToolKind, args: Record<string, unknown>): Promise<AgentToolResult>;
|
|
25
|
+
private dispatch;
|
|
26
|
+
dispose(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare function toolKindFromMethod(method: string): AgentToolKind | null;
|