@allin-ai/agent-client 0.1.0
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/LICENSE +21 -0
- package/README.md +53 -0
- package/bin/allinai-agent +4 -0
- package/dist/capabilities/context.d.ts +16 -0
- package/dist/capabilities/context.d.ts.map +1 -0
- package/dist/capabilities/context.js +98 -0
- package/dist/capabilities/context.js.map +1 -0
- package/dist/capabilities/input.d.ts +7 -0
- package/dist/capabilities/input.d.ts.map +1 -0
- package/dist/capabilities/input.js +224 -0
- package/dist/capabilities/input.js.map +1 -0
- package/dist/capabilities/manifest.d.ts +15 -0
- package/dist/capabilities/manifest.d.ts.map +1 -0
- package/dist/capabilities/manifest.js +292 -0
- package/dist/capabilities/manifest.js.map +1 -0
- package/dist/capabilities/policy.d.ts +17 -0
- package/dist/capabilities/policy.d.ts.map +1 -0
- package/dist/capabilities/policy.js +57 -0
- package/dist/capabilities/policy.js.map +1 -0
- package/dist/capabilities/shell-host.d.ts +32 -0
- package/dist/capabilities/shell-host.d.ts.map +1 -0
- package/dist/capabilities/shell-host.js +378 -0
- package/dist/capabilities/shell-host.js.map +1 -0
- package/dist/capabilities/shell-wire.d.ts +13 -0
- package/dist/capabilities/shell-wire.d.ts.map +1 -0
- package/dist/capabilities/shell-wire.js +60 -0
- package/dist/capabilities/shell-wire.js.map +1 -0
- package/dist/capabilities/types.d.ts +46 -0
- package/dist/capabilities/types.d.ts.map +1 -0
- package/dist/capabilities/types.js +7 -0
- package/dist/capabilities/types.js.map +1 -0
- package/dist/cli/commands.d.ts +83 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +638 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +7 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/client/state-store.d.ts +80 -0
- package/dist/client/state-store.d.ts.map +1 -0
- package/dist/client/state-store.js +422 -0
- package/dist/client/state-store.js.map +1 -0
- package/dist/client/supervisor.d.ts +118 -0
- package/dist/client/supervisor.d.ts.map +1 -0
- package/dist/client/supervisor.js +627 -0
- package/dist/client/supervisor.js.map +1 -0
- package/dist/client/transport.d.ts +30 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +2 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client/types.d.ts +65 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +13 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/wire.d.ts +32 -0
- package/dist/client/wire.d.ts.map +1 -0
- package/dist/client/wire.js +302 -0
- package/dist/client/wire.js.map +1 -0
- package/dist/client/ws-transport.d.ts +54 -0
- package/dist/client/ws-transport.d.ts.map +1 -0
- package/dist/client/ws-transport.js +229 -0
- package/dist/client/ws-transport.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +125 -0
- package/dist/config.js.map +1 -0
- package/dist/control.d.ts +59 -0
- package/dist/control.d.ts.map +1 -0
- package/dist/control.js +217 -0
- package/dist/control.js.map +1 -0
- package/dist/credentials.d.ts +44 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +229 -0
- package/dist/credentials.js.map +1 -0
- package/dist/hub.d.ts +83 -0
- package/dist/hub.d.ts.map +1 -0
- package/dist/hub.js +412 -0
- package/dist/hub.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +47 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +175 -0
- package/dist/logger.js.map +1 -0
- package/dist/paths.d.ts +29 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +50 -0
- package/dist/paths.js.map +1 -0
- package/dist/plugins/git.d.ts +30 -0
- package/dist/plugins/git.d.ts.map +1 -0
- package/dist/plugins/git.js +80 -0
- package/dist/plugins/git.js.map +1 -0
- package/dist/plugins/manager.d.ts +41 -0
- package/dist/plugins/manager.d.ts.map +1 -0
- package/dist/plugins/manager.js +328 -0
- package/dist/plugins/manager.js.map +1 -0
- package/dist/plugins/manifest.d.ts +9 -0
- package/dist/plugins/manifest.d.ts.map +1 -0
- package/dist/plugins/manifest.js +63 -0
- package/dist/plugins/manifest.js.map +1 -0
- package/dist/plugins/types.d.ts +39 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/runtime/claude.d.ts +30 -0
- package/dist/runtime/claude.d.ts.map +1 -0
- package/dist/runtime/claude.js +163 -0
- package/dist/runtime/claude.js.map +1 -0
- package/dist/runtime/codex.d.ts +44 -0
- package/dist/runtime/codex.d.ts.map +1 -0
- package/dist/runtime/codex.js +192 -0
- package/dist/runtime/codex.js.map +1 -0
- package/dist/runtime/events.d.ts +7 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +37 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +10 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/pi.d.ts +34 -0
- package/dist/runtime/pi.d.ts.map +1 -0
- package/dist/runtime/pi.js +211 -0
- package/dist/runtime/pi.js.map +1 -0
- package/dist/runtime/registry.d.ts +16 -0
- package/dist/runtime/registry.d.ts.map +1 -0
- package/dist/runtime/registry.js +22 -0
- package/dist/runtime/registry.js.map +1 -0
- package/dist/runtime/runner-child.d.ts +2 -0
- package/dist/runtime/runner-child.d.ts.map +1 -0
- package/dist/runtime/runner-child.js +41 -0
- package/dist/runtime/runner-child.js.map +1 -0
- package/dist/runtime/runner-manager.d.ts +77 -0
- package/dist/runtime/runner-manager.d.ts.map +1 -0
- package/dist/runtime/runner-manager.js +295 -0
- package/dist/runtime/runner-manager.js.map +1 -0
- package/dist/runtime/runner-wire.d.ts +23 -0
- package/dist/runtime/runner-wire.d.ts.map +1 -0
- package/dist/runtime/runner-wire.js +93 -0
- package/dist/runtime/runner-wire.js.map +1 -0
- package/dist/runtime/types.d.ts +43 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/zcode.d.ts +14 -0
- package/dist/runtime/zcode.d.ts.map +1 -0
- package/dist/runtime/zcode.js +21 -0
- package/dist/runtime/zcode.js.map +1 -0
- package/dist/service/launchd.d.ts +34 -0
- package/dist/service/launchd.d.ts.map +1 -0
- package/dist/service/launchd.js +86 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/systemd.d.ts +16 -0
- package/dist/service/systemd.d.ts.map +1 -0
- package/dist/service/systemd.js +89 -0
- package/dist/service/systemd.js.map +1 -0
- package/dist/wire.d.ts +24 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +7 -0
- package/dist/wire.js.map +1 -0
- package/package.json +140 -0
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { bridgeLog } from "../logger.js";
|
|
2
|
+
import { encodeClientEventBatch, encodeClientHello, encodePluginSyncAcknowledgement, parseHubDownlink, parseHubEventAcknowledgement, } from "./wire.js";
|
|
3
|
+
const DEFAULT_RECONNECT_BASE_MS = 1_000;
|
|
4
|
+
const DEFAULT_RECONNECT_MAX_MS = 30_000;
|
|
5
|
+
const WS_OPEN = 1;
|
|
6
|
+
function toWebSocketUrl(hubBaseUrl, token) {
|
|
7
|
+
const url = new URL(hubBaseUrl);
|
|
8
|
+
url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
|
|
9
|
+
const basePath = url.pathname.replace(/\/$/, "");
|
|
10
|
+
url.pathname = `${basePath}/api/daemon/ws`.replace(/\/\/{2,}/g, "/");
|
|
11
|
+
url.searchParams.set("token", token);
|
|
12
|
+
return url.toString();
|
|
13
|
+
}
|
|
14
|
+
function reconnectDelay(attempt, baseMs, maxMs) {
|
|
15
|
+
return Math.min(maxMs, baseMs * 2 ** Math.min(attempt, 30));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* WebSocket transport for the protocol-v2 Client Core. It has no execution
|
|
19
|
+
* policy or state: the supervisor owns those durable concerns. A reconnect
|
|
20
|
+
* can replay the same offer and the state store will safely de-duplicate it.
|
|
21
|
+
*/
|
|
22
|
+
export class WsClientTransport {
|
|
23
|
+
options;
|
|
24
|
+
WebSocketImpl;
|
|
25
|
+
reconnectBaseMs;
|
|
26
|
+
reconnectMaxMs;
|
|
27
|
+
handlers = null;
|
|
28
|
+
socket = null;
|
|
29
|
+
reconnectTimer = null;
|
|
30
|
+
reconnectAttempt = 0;
|
|
31
|
+
stopped = false;
|
|
32
|
+
pendingAcknowledgement = null;
|
|
33
|
+
pushTail = Promise.resolve();
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.options = options;
|
|
36
|
+
const implementation = options.WebSocketImpl ??
|
|
37
|
+
globalThis.WebSocket;
|
|
38
|
+
if (!implementation) {
|
|
39
|
+
throw new Error("WebSocket is unavailable; provide WebSocketImpl");
|
|
40
|
+
}
|
|
41
|
+
this.WebSocketImpl = implementation;
|
|
42
|
+
this.reconnectBaseMs = Math.max(1, options.reconnectBaseMs ?? DEFAULT_RECONNECT_BASE_MS);
|
|
43
|
+
this.reconnectMaxMs = Math.max(this.reconnectBaseMs, options.reconnectMaxMs ?? DEFAULT_RECONNECT_MAX_MS);
|
|
44
|
+
}
|
|
45
|
+
async connect(handlers) {
|
|
46
|
+
this.handlers = handlers;
|
|
47
|
+
this.stopped = false;
|
|
48
|
+
this.connectSocket();
|
|
49
|
+
}
|
|
50
|
+
async push(events) {
|
|
51
|
+
const task = this.pushTail.then(() => this.pushOne(events));
|
|
52
|
+
this.pushTail = task.then(() => undefined, () => undefined);
|
|
53
|
+
return task;
|
|
54
|
+
}
|
|
55
|
+
async reportPluginSync(acknowledgement) {
|
|
56
|
+
const socket = this.socket;
|
|
57
|
+
if (!socket || socket.readyState !== WS_OPEN) {
|
|
58
|
+
throw new Error("Hub WebSocket is not connected");
|
|
59
|
+
}
|
|
60
|
+
socket.send(JSON.stringify(encodePluginSyncAcknowledgement(acknowledgement)));
|
|
61
|
+
}
|
|
62
|
+
async close() {
|
|
63
|
+
this.stopped = true;
|
|
64
|
+
this.clearReconnect();
|
|
65
|
+
this.rejectPendingAcknowledgement(new Error("WebSocket transport closed"));
|
|
66
|
+
const socket = this.socket;
|
|
67
|
+
this.socket = null;
|
|
68
|
+
if (socket) {
|
|
69
|
+
socket.onclose = null;
|
|
70
|
+
try {
|
|
71
|
+
socket.close();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// A partially-open socket can throw during shutdown; it is already detached.
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
connectSocket() {
|
|
79
|
+
if (this.stopped || this.socket)
|
|
80
|
+
return;
|
|
81
|
+
this.clearReconnect();
|
|
82
|
+
let socket;
|
|
83
|
+
try {
|
|
84
|
+
socket = new this.WebSocketImpl(toWebSocketUrl(this.options.hubBaseUrl, this.options.token));
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
bridgeLog.warn("client-ws", "Hub connection could not start", {
|
|
88
|
+
error: String(error),
|
|
89
|
+
});
|
|
90
|
+
this.scheduleReconnect();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.socket = socket;
|
|
94
|
+
socket.onopen = () => {
|
|
95
|
+
if (this.socket !== socket || this.stopped)
|
|
96
|
+
return;
|
|
97
|
+
try {
|
|
98
|
+
socket.send(JSON.stringify(encodeClientHello(this.options.clientId)));
|
|
99
|
+
this.reconnectAttempt = 0;
|
|
100
|
+
void this.notifyConnected();
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
bridgeLog.warn("client-ws", "Hub hello failed", {
|
|
104
|
+
error: String(error),
|
|
105
|
+
});
|
|
106
|
+
this.closeSocket(socket);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
socket.onmessage = (event) => {
|
|
110
|
+
void this.consumeMessage(event.data);
|
|
111
|
+
};
|
|
112
|
+
socket.onclose = () => {
|
|
113
|
+
if (this.socket === socket)
|
|
114
|
+
this.socket = null;
|
|
115
|
+
this.rejectPendingAcknowledgement(new Error("Hub WebSocket disconnected"));
|
|
116
|
+
this.scheduleReconnect();
|
|
117
|
+
};
|
|
118
|
+
socket.onerror = () => this.closeSocket(socket);
|
|
119
|
+
}
|
|
120
|
+
async notifyConnected() {
|
|
121
|
+
try {
|
|
122
|
+
await this.handlers?.connected();
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
bridgeLog.warn("client-ws", "Connected callback failed", {
|
|
126
|
+
error: String(error),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async consumeMessage(raw) {
|
|
131
|
+
const parsed = this.parseMessage(raw);
|
|
132
|
+
if (!parsed)
|
|
133
|
+
return;
|
|
134
|
+
const acknowledgement = parseHubEventAcknowledgement(parsed);
|
|
135
|
+
if (acknowledgement) {
|
|
136
|
+
const pending = this.pendingAcknowledgement;
|
|
137
|
+
this.pendingAcknowledgement = null;
|
|
138
|
+
pending?.resolve(acknowledgement.watermarks);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const downlink = parseHubDownlink(parsed);
|
|
142
|
+
if (!downlink || !this.handlers)
|
|
143
|
+
return;
|
|
144
|
+
try {
|
|
145
|
+
if (downlink.type === "task.offer") {
|
|
146
|
+
await this.handlers.command(downlink.command);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
await this.handlers.pluginSync?.({
|
|
150
|
+
revision: downlink.revision,
|
|
151
|
+
plugins: downlink.plugins,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
bridgeLog.warn("client-ws", "Hub downlink handler failed", {
|
|
157
|
+
type: downlink.type,
|
|
158
|
+
error: String(error),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
parseMessage(raw) {
|
|
163
|
+
try {
|
|
164
|
+
if (typeof raw === "string")
|
|
165
|
+
return JSON.parse(raw);
|
|
166
|
+
if (raw instanceof ArrayBuffer) {
|
|
167
|
+
return JSON.parse(new TextDecoder().decode(raw));
|
|
168
|
+
}
|
|
169
|
+
if (ArrayBuffer.isView(raw)) {
|
|
170
|
+
return JSON.parse(Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString("utf8"));
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
async pushOne(events) {
|
|
179
|
+
const socket = this.socket;
|
|
180
|
+
if (!socket || socket.readyState !== WS_OPEN) {
|
|
181
|
+
throw new Error("Hub WebSocket is not connected");
|
|
182
|
+
}
|
|
183
|
+
if (this.pendingAcknowledgement) {
|
|
184
|
+
throw new Error("Event acknowledgement is already pending");
|
|
185
|
+
}
|
|
186
|
+
const payload = JSON.stringify(encodeClientEventBatch(events));
|
|
187
|
+
return new Promise((resolve, reject) => {
|
|
188
|
+
this.pendingAcknowledgement = { resolve, reject };
|
|
189
|
+
try {
|
|
190
|
+
socket.send(payload);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
this.rejectPendingAcknowledgement(error instanceof Error ? error : new Error(String(error)));
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
closeSocket(socket) {
|
|
198
|
+
try {
|
|
199
|
+
socket.close();
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
if (this.socket === socket)
|
|
203
|
+
this.socket = null;
|
|
204
|
+
this.scheduleReconnect();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
scheduleReconnect() {
|
|
208
|
+
if (this.stopped || this.reconnectTimer || this.socket)
|
|
209
|
+
return;
|
|
210
|
+
const delay = reconnectDelay(this.reconnectAttempt, this.reconnectBaseMs, this.reconnectMaxMs);
|
|
211
|
+
this.reconnectAttempt += 1;
|
|
212
|
+
this.reconnectTimer = setTimeout(() => {
|
|
213
|
+
this.reconnectTimer = null;
|
|
214
|
+
this.connectSocket();
|
|
215
|
+
}, delay);
|
|
216
|
+
}
|
|
217
|
+
clearReconnect() {
|
|
218
|
+
if (!this.reconnectTimer)
|
|
219
|
+
return;
|
|
220
|
+
clearTimeout(this.reconnectTimer);
|
|
221
|
+
this.reconnectTimer = null;
|
|
222
|
+
}
|
|
223
|
+
rejectPendingAcknowledgement(error) {
|
|
224
|
+
const pending = this.pendingAcknowledgement;
|
|
225
|
+
this.pendingAcknowledgement = null;
|
|
226
|
+
pending?.reject(error);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=ws-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-transport.js","sourceRoot":"","sources":["../../src/client/ws-transport.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AgentPaths } from "./paths.js";
|
|
2
|
+
export type AgentLocalPolicy = {
|
|
3
|
+
autoRuntimes: string[];
|
|
4
|
+
autoPermissions: string[];
|
|
5
|
+
allowedGitOrigins: string[];
|
|
6
|
+
deniedPluginIds: string[];
|
|
7
|
+
allowedWorkspaceRoots: string[];
|
|
8
|
+
};
|
|
9
|
+
export type AgentConfig = {
|
|
10
|
+
hubBaseUrl: string;
|
|
11
|
+
clientId: string;
|
|
12
|
+
maxConcurrentRuns: number;
|
|
13
|
+
policy: AgentLocalPolicy;
|
|
14
|
+
};
|
|
15
|
+
export type ConfigFileSystem = {
|
|
16
|
+
readFile(file: string, encoding: "utf8"): string;
|
|
17
|
+
};
|
|
18
|
+
export type ConfigWriter = {
|
|
19
|
+
mkdir(dir: string, options: {
|
|
20
|
+
recursive: true;
|
|
21
|
+
}): Promise<string | undefined>;
|
|
22
|
+
writeFile(file: string, data: string, options: {
|
|
23
|
+
encoding: "utf8";
|
|
24
|
+
mode: number;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
/** Defaults apply only to bounded local settings; Hub identity remains explicit. */
|
|
28
|
+
export declare function defaultAgentConfig(): Pick<AgentConfig, "maxConcurrentRuns" | "policy">;
|
|
29
|
+
/** Strictly validate config.json and supply only safe local defaults. */
|
|
30
|
+
export declare function parseAgentConfig(value: unknown): AgentConfig;
|
|
31
|
+
/** Read exactly the client-owned config file. Missing/invalid files are explicit failures. */
|
|
32
|
+
export declare function loadAgentConfig(paths: Pick<AgentPaths, "configFile">, fs?: ConfigFileSystem): AgentConfig;
|
|
33
|
+
/**
|
|
34
|
+
* Persist the non-secret pairing configuration in the Agent-owned home.
|
|
35
|
+
* Pairing credentials must be written separately through CredentialStore.
|
|
36
|
+
*/
|
|
37
|
+
export declare function saveAgentConfig(paths: Pick<AgentPaths, "home" | "configFile">, config: AgentConfig, fs?: ConfigWriter): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9E,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB,CAAC;AAoBF,oFAAoF;AACpF,wBAAgB,kBAAkB,IAAI,IAAI,CACxC,WAAW,EACX,mBAAmB,GAAG,QAAQ,CAC/B,CAEA;AAsFD,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CA+B5D;AAED,8FAA8F;AAC9F,wBAAgB,eAAe,CAC7B,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EACrC,EAAE,GAAE,gBAA6C,GAChD,WAAW,CAWb;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC,EAC9C,MAAM,EAAE,WAAW,EACnB,EAAE,GAAE,YAAmC,GACtC,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
const DEFAULT_POLICY = Object.freeze({
|
|
4
|
+
autoRuntimes: [],
|
|
5
|
+
autoPermissions: [],
|
|
6
|
+
allowedGitOrigins: [],
|
|
7
|
+
deniedPluginIds: [],
|
|
8
|
+
allowedWorkspaceRoots: [],
|
|
9
|
+
});
|
|
10
|
+
function clonePolicy(policy = DEFAULT_POLICY) {
|
|
11
|
+
return {
|
|
12
|
+
autoRuntimes: [...policy.autoRuntimes],
|
|
13
|
+
autoPermissions: [...policy.autoPermissions],
|
|
14
|
+
allowedGitOrigins: [...policy.allowedGitOrigins],
|
|
15
|
+
deniedPluginIds: [...policy.deniedPluginIds],
|
|
16
|
+
allowedWorkspaceRoots: [...policy.allowedWorkspaceRoots],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Defaults apply only to bounded local settings; Hub identity remains explicit. */
|
|
20
|
+
export function defaultAgentConfig() {
|
|
21
|
+
return { maxConcurrentRuns: 1, policy: clonePolicy() };
|
|
22
|
+
}
|
|
23
|
+
function isRecord(value) {
|
|
24
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
function requireString(value, name, options) {
|
|
27
|
+
if (typeof value !== "string" ||
|
|
28
|
+
(!options?.allowEmpty && value.trim().length === 0)) {
|
|
29
|
+
throw new TypeError(`${name} must be a nonempty string`);
|
|
30
|
+
}
|
|
31
|
+
return value.trim();
|
|
32
|
+
}
|
|
33
|
+
function stringArray(value, name, fallback) {
|
|
34
|
+
if (value === undefined)
|
|
35
|
+
return [...fallback];
|
|
36
|
+
if (!Array.isArray(value) ||
|
|
37
|
+
value.some((item) => typeof item !== "string" || !item.trim())) {
|
|
38
|
+
throw new TypeError(`${name} must be an array of nonempty strings`);
|
|
39
|
+
}
|
|
40
|
+
return [...new Set(value.map((item) => item.trim()))];
|
|
41
|
+
}
|
|
42
|
+
function parsePolicy(value) {
|
|
43
|
+
if (value === undefined)
|
|
44
|
+
return clonePolicy();
|
|
45
|
+
if (!isRecord(value))
|
|
46
|
+
throw new TypeError("policy must be an object");
|
|
47
|
+
const allowed = new Set(Object.keys(DEFAULT_POLICY));
|
|
48
|
+
for (const key of Object.keys(value)) {
|
|
49
|
+
if (!allowed.has(key))
|
|
50
|
+
throw new TypeError(`policy.${key} is not supported`);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
autoRuntimes: stringArray(value.autoRuntimes, "policy.autoRuntimes", []),
|
|
54
|
+
autoPermissions: stringArray(value.autoPermissions, "policy.autoPermissions", []),
|
|
55
|
+
allowedGitOrigins: stringArray(value.allowedGitOrigins, "policy.allowedGitOrigins", []),
|
|
56
|
+
deniedPluginIds: stringArray(value.deniedPluginIds, "policy.deniedPluginIds", []),
|
|
57
|
+
allowedWorkspaceRoots: stringArray(value.allowedWorkspaceRoots, "policy.allowedWorkspaceRoots", []),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function parseHubBaseUrl(value) {
|
|
61
|
+
const raw = requireString(value, "hubBaseUrl");
|
|
62
|
+
let url;
|
|
63
|
+
try {
|
|
64
|
+
url = new URL(raw);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
throw new TypeError("hubBaseUrl must be an absolute http or https URL");
|
|
68
|
+
}
|
|
69
|
+
if ((url.protocol !== "http:" && url.protocol !== "https:") ||
|
|
70
|
+
!url.hostname) {
|
|
71
|
+
throw new TypeError("hubBaseUrl must be an absolute http or https URL");
|
|
72
|
+
}
|
|
73
|
+
url.pathname = url.pathname.replace(/\/$/, "");
|
|
74
|
+
return url.toString().replace(/\/$/, "");
|
|
75
|
+
}
|
|
76
|
+
/** Strictly validate config.json and supply only safe local defaults. */
|
|
77
|
+
export function parseAgentConfig(value) {
|
|
78
|
+
if (!isRecord(value))
|
|
79
|
+
throw new TypeError("Agent config must be a JSON object");
|
|
80
|
+
const allowed = new Set([
|
|
81
|
+
"hubBaseUrl",
|
|
82
|
+
"clientId",
|
|
83
|
+
"maxConcurrentRuns",
|
|
84
|
+
"policy",
|
|
85
|
+
]);
|
|
86
|
+
for (const key of Object.keys(value)) {
|
|
87
|
+
if (!allowed.has(key))
|
|
88
|
+
throw new TypeError(`Agent config field ${key} is not supported`);
|
|
89
|
+
}
|
|
90
|
+
const defaults = defaultAgentConfig();
|
|
91
|
+
const maxConcurrentRuns = value.maxConcurrentRuns ?? defaults.maxConcurrentRuns;
|
|
92
|
+
if (!Number.isInteger(maxConcurrentRuns) ||
|
|
93
|
+
maxConcurrentRuns < 1 ||
|
|
94
|
+
maxConcurrentRuns > 32) {
|
|
95
|
+
throw new RangeError("maxConcurrentRuns must be an integer between 1 and 32");
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
hubBaseUrl: parseHubBaseUrl(value.hubBaseUrl),
|
|
99
|
+
clientId: requireString(value.clientId, "clientId"),
|
|
100
|
+
maxConcurrentRuns: maxConcurrentRuns,
|
|
101
|
+
policy: parsePolicy(value.policy),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** Read exactly the client-owned config file. Missing/invalid files are explicit failures. */
|
|
105
|
+
export function loadAgentConfig(paths, fs = { readFile: readFileSync }) {
|
|
106
|
+
let raw;
|
|
107
|
+
try {
|
|
108
|
+
raw = JSON.parse(fs.readFile(paths.configFile, "utf8"));
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
112
|
+
throw new Error(`Unable to read agent config at ${paths.configFile}: ${message}`);
|
|
113
|
+
}
|
|
114
|
+
return parseAgentConfig(raw);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Persist the non-secret pairing configuration in the Agent-owned home.
|
|
118
|
+
* Pairing credentials must be written separately through CredentialStore.
|
|
119
|
+
*/
|
|
120
|
+
export async function saveAgentConfig(paths, config, fs = { mkdir, writeFile }) {
|
|
121
|
+
const normalized = parseAgentConfig(config);
|
|
122
|
+
await fs.mkdir(paths.home, { recursive: true });
|
|
123
|
+
await fs.writeFile(paths.configFile, `${JSON.stringify(normalized, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type Server, type Socket } from "node:net";
|
|
2
|
+
import { type AgentPaths } from "./paths.js";
|
|
3
|
+
export type AgentHealth = {
|
|
4
|
+
status: "ok" | "degraded" | "unpaired";
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
};
|
|
7
|
+
export type AgentStatus = {
|
|
8
|
+
state: string;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
};
|
|
11
|
+
export type AgentControl = {
|
|
12
|
+
health(): AgentHealth | Promise<AgentHealth>;
|
|
13
|
+
approve(executionId: string): Promise<void>;
|
|
14
|
+
status(): AgentStatus | Promise<AgentStatus>;
|
|
15
|
+
/** Flush locally durable work; it never accepts a Hub-provided command. */
|
|
16
|
+
sync?(): Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
export type AgentControlServer = {
|
|
19
|
+
endpoint: string;
|
|
20
|
+
close(): Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
export type ControlFileSystem = {
|
|
23
|
+
mkdir(dir: string, options: {
|
|
24
|
+
recursive: true;
|
|
25
|
+
}): Promise<string | undefined>;
|
|
26
|
+
lstat(file: string): Promise<{
|
|
27
|
+
isSocket(): boolean;
|
|
28
|
+
}>;
|
|
29
|
+
unlink(file: string): Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
export type AgentControlServerOptions = {
|
|
32
|
+
control: AgentControl;
|
|
33
|
+
/** Absolute Unix socket path. On Windows provide no value and use paths. */
|
|
34
|
+
socketPath?: string;
|
|
35
|
+
paths?: AgentPaths;
|
|
36
|
+
platform?: NodeJS.Platform;
|
|
37
|
+
fileSystem?: ControlFileSystem;
|
|
38
|
+
/** Test seam for stale socket probing; true means an existing endpoint is live. */
|
|
39
|
+
endpointActive?: (endpoint: string) => Promise<boolean>;
|
|
40
|
+
serverFactory?: (listener: (socket: Socket) => void) => Server;
|
|
41
|
+
};
|
|
42
|
+
export type AgentControlClient = {
|
|
43
|
+
health(): Promise<AgentHealth>;
|
|
44
|
+
approve(executionId: string): Promise<void>;
|
|
45
|
+
status(): Promise<AgentStatus>;
|
|
46
|
+
sync?(): Promise<void>;
|
|
47
|
+
};
|
|
48
|
+
export type AgentControlClientOptions = {
|
|
49
|
+
connect?: (endpoint: string) => Socket;
|
|
50
|
+
timeoutMs?: number;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Start the local control server. Its API deliberately has no host/port field,
|
|
54
|
+
* preventing an unauthenticated TCP listener from being configured here.
|
|
55
|
+
*/
|
|
56
|
+
export declare function startAgentControlServer(options: AgentControlServerOptions): Promise<AgentControlServer>;
|
|
57
|
+
/** Client seam used by the future CLI/Desktop without opening a network port. */
|
|
58
|
+
export declare function createAgentControlClient(endpoint: string, options?: AgentControlClientOptions): AgentControlClient;
|
|
59
|
+
//# sourceMappingURL=control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control.d.ts","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,MAAM,EACX,KAAK,MAAM,EACZ,MAAM,UAAU,CAAC;AAElB,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,UAAU,CAAC;IACvC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AACF,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7C,2EAA2E;IAC3E,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,IAAI,OAAO,CAAA;KAAE,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,YAAY,CAAC;IACtB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,mFAAmF;IACnF,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,KAAK,MAAM,CAAC;CAChE,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/B,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAyHF;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAqC7B;AAgFD,iFAAiF;AACjF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,yBAA8B,GACtC,kBAAkB,CA6BpB"}
|