agent-embassy 3.0.0 → 4.0.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/CHANGELOG.md +42 -0
- package/CONTRIBUTING.md +92 -200
- package/README.md +159 -138
- package/SECURITY.md +191 -335
- package/dist/src/gateway/broker-check.d.ts +26 -0
- package/dist/src/gateway/broker-check.js +89 -0
- package/dist/src/gateway/broker-check.js.map +1 -0
- package/dist/src/gateway/broker-control.d.ts +72 -0
- package/dist/src/gateway/broker-control.js +164 -0
- package/dist/src/gateway/broker-control.js.map +1 -0
- package/dist/src/gateway/broker.d.ts +117 -0
- package/dist/src/gateway/broker.js +186 -0
- package/dist/src/gateway/broker.js.map +1 -0
- package/dist/src/gateway/claude-peer.d.ts +1 -124
- package/dist/src/gateway/claude-peer.js +62 -1053
- package/dist/src/gateway/claude-peer.js.map +1 -1
- package/dist/src/gateway/codex-stateless-transport.d.ts +0 -12
- package/dist/src/gateway/codex-stateless-transport.js +8 -142
- package/dist/src/gateway/codex-stateless-transport.js.map +1 -1
- package/dist/src/gateway/config.d.ts +2 -6
- package/dist/src/gateway/config.js +17 -27
- package/dist/src/gateway/config.js.map +1 -1
- package/dist/src/gateway/coordinator.d.ts +57 -0
- package/dist/src/gateway/coordinator.js +217 -0
- package/dist/src/gateway/coordinator.js.map +1 -0
- package/dist/src/gateway/core-cli.d.ts +15 -0
- package/dist/src/gateway/core-cli.js +282 -0
- package/dist/src/gateway/core-cli.js.map +1 -0
- package/dist/src/gateway/core-service-command.d.ts +16 -0
- package/dist/src/gateway/core-service-command.js +71 -0
- package/dist/src/gateway/core-service-command.js.map +1 -0
- package/dist/src/gateway/endpoint-directory.d.ts +33 -0
- package/dist/src/gateway/endpoint-directory.js +223 -0
- package/dist/src/gateway/endpoint-directory.js.map +1 -0
- package/dist/src/gateway/federation.d.ts +89 -0
- package/dist/src/gateway/federation.js +632 -0
- package/dist/src/gateway/federation.js.map +1 -0
- package/dist/src/gateway/ledger-codec.d.ts +3 -0
- package/dist/src/gateway/ledger-codec.js +159 -0
- package/dist/src/gateway/ledger-codec.js.map +1 -0
- package/dist/src/gateway/ledger.d.ts +138 -0
- package/dist/src/gateway/ledger.js +319 -0
- package/dist/src/gateway/ledger.js.map +1 -0
- package/dist/src/gateway/local-control.d.ts +23 -0
- package/dist/src/gateway/local-control.js +489 -0
- package/dist/src/gateway/local-control.js.map +1 -0
- package/dist/src/gateway/native-destinations.d.ts +34 -0
- package/dist/src/gateway/native-destinations.js +272 -0
- package/dist/src/gateway/native-destinations.js.map +1 -0
- package/dist/src/gateway/owned-state.d.ts +57 -0
- package/dist/src/gateway/owned-state.js +398 -0
- package/dist/src/gateway/owned-state.js.map +1 -0
- package/dist/src/gateway/provenance-envelope.d.ts +3 -3
- package/dist/src/gateway/provenance-envelope.js +3 -23
- package/dist/src/gateway/provenance-envelope.js.map +1 -1
- package/dist/src/gateway/runtime.d.ts +41 -0
- package/dist/src/gateway/runtime.js +175 -0
- package/dist/src/gateway/runtime.js.map +1 -0
- package/docs/CONFIGURATION.md +178 -266
- package/docs/DELIVERY.md +133 -82
- package/docs/GATEWAY-ARCHITECTURE.md +276 -943
- package/package.json +5 -5
- package/skills/embassy-peer/SKILL.md +38 -194
- package/skills/embassy-peer/agents/openai.yaml +2 -2
- package/dist/src/gateway/claude-helper-client.d.ts +0 -2
- package/dist/src/gateway/claude-helper-client.js +0 -2
- package/dist/src/gateway/claude-helper-client.js.map +0 -1
- package/dist/src/gateway/claude-helper-protocol.d.ts +0 -117
- package/dist/src/gateway/claude-helper-protocol.js +0 -122
- package/dist/src/gateway/claude-helper-protocol.js.map +0 -1
- package/dist/src/gateway/claude-helper-supervisor.d.ts +0 -87
- package/dist/src/gateway/claude-helper-supervisor.js +0 -347
- package/dist/src/gateway/claude-helper-supervisor.js.map +0 -1
- package/dist/src/gateway/claude-helper.d.ts +0 -1
- package/dist/src/gateway/claude-helper.js +0 -252
- package/dist/src/gateway/claude-helper.js.map +0 -1
- package/dist/src/gateway/cli.d.ts +0 -57
- package/dist/src/gateway/cli.js +0 -1503
- package/dist/src/gateway/cli.js.map +0 -1
- package/dist/src/gateway/codex-socket-holder.d.ts +0 -26
- package/dist/src/gateway/codex-socket-holder.js +0 -76
- package/dist/src/gateway/codex-socket-holder.js.map +0 -1
- package/dist/src/gateway/control.d.ts +0 -261
- package/dist/src/gateway/control.js +0 -903
- package/dist/src/gateway/control.js.map +0 -1
- package/dist/src/gateway/peer-client.d.ts +0 -58
- package/dist/src/gateway/peer-client.js +0 -217
- package/dist/src/gateway/peer-client.js.map +0 -1
- package/dist/src/gateway/peer-mailbox.d.ts +0 -78
- package/dist/src/gateway/peer-mailbox.js +0 -168
- package/dist/src/gateway/peer-mailbox.js.map +0 -1
- package/dist/src/gateway/peer-protocol.d.ts +0 -105
- package/dist/src/gateway/peer-protocol.js +0 -70
- package/dist/src/gateway/peer-protocol.js.map +0 -1
- package/dist/src/gateway/peer-stdio.d.ts +0 -23
- package/dist/src/gateway/peer-stdio.js +0 -100
- package/dist/src/gateway/peer-stdio.js.map +0 -1
- package/dist/src/gateway/providers.d.ts +0 -163
- package/dist/src/gateway/providers.js +0 -972
- package/dist/src/gateway/providers.js.map +0 -1
- package/dist/src/gateway/server.d.ts +0 -47
- package/dist/src/gateway/server.js +0 -219
- package/dist/src/gateway/server.js.map +0 -1
- package/dist/src/gateway/service.d.ts +0 -373
- package/dist/src/gateway/service.js +0 -2274
- package/dist/src/gateway/service.js.map +0 -1
- package/dist/src/gateway/status-view.d.ts +0 -167
- package/dist/src/gateway/status-view.js +0 -488
- package/dist/src/gateway/status-view.js.map +0 -1
- package/dist/src/gateway/store.d.ts +0 -185
- package/dist/src/gateway/store.js +0 -2359
- package/dist/src/gateway/store.js.map +0 -1
- package/dist/src/gateway/types.d.ts +0 -528
- package/dist/src/gateway/types.js +0 -341
- package/dist/src/gateway/types.js.map +0 -1
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { chmod, lstat, mkdtemp, realpath, rename, rmdir, unlink } from "node:fs/promises";
|
|
2
|
+
import net from "node:net";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { TextDecoder } from "node:util";
|
|
5
|
+
const DEFAULT_REQUEST_BYTES = 256 * 1024;
|
|
6
|
+
const DEFAULT_RESPONSE_BYTES = 256 * 1024;
|
|
7
|
+
const DEFAULT_TIMEOUT_MS = 3_000;
|
|
8
|
+
const MAX_SOCKET_PATH_BYTES = 100;
|
|
9
|
+
const MAX_CONNECTIONS = 32;
|
|
10
|
+
const MAX_DOCUMENT_BYTES = 8 * 1024 * 1024;
|
|
11
|
+
export const LOCAL_CONTROL_VERSION = 5;
|
|
12
|
+
const MESSAGES = Object.freeze({
|
|
13
|
+
UNSUPPORTED_PLATFORM: "Unix-domain gateway control sockets are unavailable.",
|
|
14
|
+
INVALID_STATE_DIR: "The gateway state directory is invalid.",
|
|
15
|
+
INSECURE_STATE_DIR: "The gateway state directory is not private to this user.",
|
|
16
|
+
INVALID_SOCKET_PATH: "The gateway control socket path is invalid.",
|
|
17
|
+
UNSAFE_SOCKET_TARGET: "The gateway control socket target is unsafe.",
|
|
18
|
+
SOCKET_IN_USE: "The gateway control socket is already served by a live process.",
|
|
19
|
+
SOCKET_PROBE_FAILED: "The gateway control socket could not be checked safely.",
|
|
20
|
+
SOCKET_BIND_FAILED: "The gateway control socket could not be bound.",
|
|
21
|
+
SOCKET_PERMISSION_FAILED: "The gateway control socket permissions could not be secured.",
|
|
22
|
+
SOCKET_CLEANUP_CONFLICT: "The gateway control socket path changed during cleanup.",
|
|
23
|
+
CONTROL_CONNECT_FAILED: "The gateway control socket could not be reached.",
|
|
24
|
+
CONTROL_CONNECT_DENIED: "The gateway control socket connection was denied by local policy.",
|
|
25
|
+
CONTROL_SOCKET_MISSING: "The gateway control socket does not exist at the configured path.",
|
|
26
|
+
CONTROL_SOCKET_UNSAFE: "The gateway control socket is unsafe.",
|
|
27
|
+
CONTROL_LISTENER_UNAVAILABLE: "Nothing is listening on the gateway control socket.",
|
|
28
|
+
CONTROL_TIMEOUT: "The gateway control request timed out.",
|
|
29
|
+
CONTROL_RESPONSE_TOO_LARGE: "The gateway control response exceeds the client limit.",
|
|
30
|
+
CONTROL_INVALID_RESPONSE: "The gateway returned an invalid control response.",
|
|
31
|
+
CONTROL_VERSION_MISMATCH: "The gateway control protocol version does not match this client.",
|
|
32
|
+
CONTROL_CONNECTION_CLOSED: "The gateway closed before returning a control response.",
|
|
33
|
+
CONTROL_WRITE_OUTCOME_AMBIGUOUS: "The gateway may have applied the control mutation before the response was lost; do not retry automatically.",
|
|
34
|
+
INVALID_JSON: "The control frame is not valid JSON.",
|
|
35
|
+
FRAME_TOO_LARGE: "The control frame exceeds the size limit.",
|
|
36
|
+
INVALID_REQUEST: "The control request is invalid.",
|
|
37
|
+
UNSUPPORTED_VERSION: "The control protocol version is unsupported.",
|
|
38
|
+
MULTIPLE_FRAMES: "Only one control request is allowed per connection.",
|
|
39
|
+
REQUEST_TIMEOUT: "The control request timed out.",
|
|
40
|
+
SERVER_BUSY: "The gateway control server is at its connection limit.",
|
|
41
|
+
HANDLER_FAILURE: "The gateway could not complete the control request.",
|
|
42
|
+
INVALID_HANDLER_RESPONSE: "The gateway produced an invalid control response.",
|
|
43
|
+
RESPONSE_TOO_LARGE: "The control response exceeds the size limit.",
|
|
44
|
+
});
|
|
45
|
+
export class LocalControlError extends Error {
|
|
46
|
+
code;
|
|
47
|
+
ambiguous;
|
|
48
|
+
recoverable;
|
|
49
|
+
constructor(code, ambiguous = false) {
|
|
50
|
+
super(MESSAGES[code] ?? "The gateway control transport failed.");
|
|
51
|
+
this.code = code;
|
|
52
|
+
this.name = "LocalControlError";
|
|
53
|
+
this.ambiguous = ambiguous;
|
|
54
|
+
this.recoverable = !ambiguous;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
class FrameFault extends Error {
|
|
58
|
+
kind;
|
|
59
|
+
systemCode;
|
|
60
|
+
constructor(kind, systemCode) {
|
|
61
|
+
super(kind);
|
|
62
|
+
this.kind = kind;
|
|
63
|
+
this.systemCode = systemCode;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const failure = (code) => ({ protocolVersion: LOCAL_CONTROL_VERSION, ok: false, error: { code } });
|
|
67
|
+
const object = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
68
|
+
const sameIdentity = (value, identity) => value.dev === identity.dev && value.ino === identity.ino;
|
|
69
|
+
const errno = (error) => object(error) && typeof error.code === "string"
|
|
70
|
+
? error.code : undefined;
|
|
71
|
+
function limits(requestBytes, responseBytes) {
|
|
72
|
+
const request = requestBytes ?? DEFAULT_REQUEST_BYTES;
|
|
73
|
+
const response = responseBytes ?? DEFAULT_RESPONSE_BYTES;
|
|
74
|
+
if (!Number.isSafeInteger(request) || request < 256 || request > MAX_DOCUMENT_BYTES ||
|
|
75
|
+
!Number.isSafeInteger(response) || response < 256 || response > MAX_DOCUMENT_BYTES) {
|
|
76
|
+
throw new LocalControlError("INVALID_SOCKET_PATH");
|
|
77
|
+
}
|
|
78
|
+
return { request, response };
|
|
79
|
+
}
|
|
80
|
+
function assertSocketPath(socketPath) {
|
|
81
|
+
if (!path.isAbsolute(socketPath) || path.resolve(socketPath) !== socketPath ||
|
|
82
|
+
Buffer.byteLength(socketPath, "utf8") > MAX_SOCKET_PATH_BYTES) {
|
|
83
|
+
throw new LocalControlError("INVALID_SOCKET_PATH");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function validateLocation(stateDir, socketPath, client = false) {
|
|
87
|
+
if (process.platform === "win32")
|
|
88
|
+
throw new LocalControlError("UNSUPPORTED_PLATFORM");
|
|
89
|
+
assertSocketPath(socketPath);
|
|
90
|
+
if (!path.isAbsolute(stateDir) || path.resolve(stateDir) !== stateDir) {
|
|
91
|
+
throw new LocalControlError("INVALID_SOCKET_PATH");
|
|
92
|
+
}
|
|
93
|
+
let state;
|
|
94
|
+
try {
|
|
95
|
+
state = await lstat(stateDir);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
if (client && (errno(error) === "EPERM" || errno(error) === "EACCES")) {
|
|
99
|
+
throw new LocalControlError("CONTROL_CONNECT_DENIED");
|
|
100
|
+
}
|
|
101
|
+
throw new LocalControlError("INVALID_STATE_DIR");
|
|
102
|
+
}
|
|
103
|
+
if (state.isSymbolicLink() || !state.isDirectory())
|
|
104
|
+
throw new LocalControlError("INVALID_STATE_DIR");
|
|
105
|
+
const uid = process.getuid?.call(process);
|
|
106
|
+
if (uid !== undefined && state.uid !== uid || (state.mode & 0o777) !== 0o700) {
|
|
107
|
+
throw new LocalControlError("INSECURE_STATE_DIR");
|
|
108
|
+
}
|
|
109
|
+
let stateReal, parentReal;
|
|
110
|
+
try {
|
|
111
|
+
[stateReal, parentReal] = await Promise.all([realpath(stateDir), realpath(path.dirname(socketPath))]);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new LocalControlError("INVALID_SOCKET_PATH");
|
|
115
|
+
}
|
|
116
|
+
if (socketPath === stateDir || parentReal !== stateReal && !parentReal.startsWith(`${stateReal}${path.sep}`)) {
|
|
117
|
+
throw new LocalControlError("INVALID_SOCKET_PATH");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function optionalLstat(target) {
|
|
121
|
+
try {
|
|
122
|
+
return await lstat(target);
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
if (errno(error) === "ENOENT")
|
|
126
|
+
return undefined;
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function readOneFrame(socket, maximum) {
|
|
131
|
+
return new Promise((resolve, reject) => {
|
|
132
|
+
let buffered = Buffer.alloc(0), settled = false;
|
|
133
|
+
const finish = (value) => {
|
|
134
|
+
if (settled)
|
|
135
|
+
return;
|
|
136
|
+
settled = true;
|
|
137
|
+
socket.pause();
|
|
138
|
+
socket.off("data", onData);
|
|
139
|
+
socket.off("end", onEnd);
|
|
140
|
+
socket.off("timeout", onTimeout);
|
|
141
|
+
value instanceof FrameFault ? reject(value) : resolve(value);
|
|
142
|
+
};
|
|
143
|
+
const onData = (chunk) => {
|
|
144
|
+
if (buffered.length + chunk.length > maximum)
|
|
145
|
+
return finish(new FrameFault("too_large"));
|
|
146
|
+
buffered = Buffer.concat([buffered, chunk]);
|
|
147
|
+
const newline = buffered.indexOf(0x0a);
|
|
148
|
+
if (newline < 0)
|
|
149
|
+
return;
|
|
150
|
+
if (buffered.subarray(newline + 1).toString("utf8").trim().length > 0) {
|
|
151
|
+
return finish(new FrameFault("multiple"));
|
|
152
|
+
}
|
|
153
|
+
finish(buffered.subarray(0, newline));
|
|
154
|
+
};
|
|
155
|
+
const onEnd = () => finish(new FrameFault("closed"));
|
|
156
|
+
const onTimeout = () => finish(new FrameFault("timeout"));
|
|
157
|
+
socket.on("data", onData);
|
|
158
|
+
socket.once("end", onEnd);
|
|
159
|
+
socket.once("timeout", onTimeout);
|
|
160
|
+
socket.once("error", (error) => finish(new FrameFault("error", error.code)));
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function decode(frame) {
|
|
164
|
+
try {
|
|
165
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(frame));
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
throw new LocalControlError("INVALID_JSON");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function serialize(response, maximum) {
|
|
172
|
+
try {
|
|
173
|
+
if (response.ok && response.result === undefined)
|
|
174
|
+
return serialize(failure("INVALID_HANDLER_RESPONSE"), maximum);
|
|
175
|
+
const encoded = Buffer.from(`${JSON.stringify(response)}\n`, "utf8");
|
|
176
|
+
if (encoded.length <= maximum)
|
|
177
|
+
return encoded;
|
|
178
|
+
return Buffer.from(`${JSON.stringify(failure("RESPONSE_TOO_LARGE"))}\n`, "utf8");
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return Buffer.from(`${JSON.stringify(failure("INVALID_HANDLER_RESPONSE"))}\n`, "utf8");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function socketIsLive(socketPath) {
|
|
185
|
+
return await new Promise((resolve, reject) => {
|
|
186
|
+
const socket = net.createConnection(socketPath);
|
|
187
|
+
let settled = false;
|
|
188
|
+
const finish = (operation) => {
|
|
189
|
+
if (settled)
|
|
190
|
+
return;
|
|
191
|
+
settled = true;
|
|
192
|
+
socket.destroy();
|
|
193
|
+
operation();
|
|
194
|
+
};
|
|
195
|
+
socket.setTimeout(250);
|
|
196
|
+
socket.once("connect", () => finish(() => resolve(true)));
|
|
197
|
+
socket.once("timeout", () => finish(() => reject(new LocalControlError("SOCKET_PROBE_FAILED"))));
|
|
198
|
+
socket.once("error", (error) => {
|
|
199
|
+
if (error.code === "ECONNREFUSED" || error.code === "ENOENT")
|
|
200
|
+
finish(() => resolve(false));
|
|
201
|
+
else
|
|
202
|
+
finish(() => reject(new LocalControlError("SOCKET_PROBE_FAILED")));
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
async function prepareTarget(socketPath) {
|
|
207
|
+
let existing;
|
|
208
|
+
try {
|
|
209
|
+
existing = await optionalLstat(socketPath);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
throw new LocalControlError("UNSAFE_SOCKET_TARGET");
|
|
213
|
+
}
|
|
214
|
+
if (existing === undefined)
|
|
215
|
+
return;
|
|
216
|
+
if (existing.isSymbolicLink() || !existing.isSocket())
|
|
217
|
+
throw new LocalControlError("UNSAFE_SOCKET_TARGET");
|
|
218
|
+
const identity = { dev: existing.dev, ino: existing.ino };
|
|
219
|
+
if (await socketIsLive(socketPath))
|
|
220
|
+
throw new LocalControlError("SOCKET_IN_USE");
|
|
221
|
+
let current;
|
|
222
|
+
try {
|
|
223
|
+
current = await lstat(socketPath);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
throw new LocalControlError("UNSAFE_SOCKET_TARGET");
|
|
227
|
+
}
|
|
228
|
+
if (!current.isSocket() || !sameIdentity(current, identity))
|
|
229
|
+
throw new LocalControlError("UNSAFE_SOCKET_TARGET");
|
|
230
|
+
try {
|
|
231
|
+
await unlink(socketPath);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
throw new LocalControlError("UNSAFE_SOCKET_TARGET");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async function closeServer(server) {
|
|
238
|
+
await new Promise((resolve) => { try {
|
|
239
|
+
server.close(() => resolve());
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
resolve();
|
|
243
|
+
} });
|
|
244
|
+
}
|
|
245
|
+
async function removeOwned(socketPath, identity) {
|
|
246
|
+
let current;
|
|
247
|
+
try {
|
|
248
|
+
current = await optionalLstat(socketPath);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (current?.isSocket() && sameIdentity(current, identity))
|
|
254
|
+
await unlink(socketPath).catch(() => undefined);
|
|
255
|
+
}
|
|
256
|
+
async function protectReplacement(socketPath, identity) {
|
|
257
|
+
let current;
|
|
258
|
+
try {
|
|
259
|
+
current = await optionalLstat(socketPath);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
throw new LocalControlError("SOCKET_CLEANUP_CONFLICT");
|
|
263
|
+
}
|
|
264
|
+
if (current === undefined || sameIdentity(current, identity))
|
|
265
|
+
return undefined;
|
|
266
|
+
let directory;
|
|
267
|
+
try {
|
|
268
|
+
directory = await mkdtemp(path.join(path.dirname(socketPath), ".gateway-control-close-"));
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
throw new LocalControlError("SOCKET_CLEANUP_CONFLICT");
|
|
272
|
+
}
|
|
273
|
+
const backupPath = path.join(directory, "replacement");
|
|
274
|
+
try {
|
|
275
|
+
await rename(socketPath, backupPath);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
await rmdir(directory).catch(() => undefined);
|
|
279
|
+
if (errno(error) === "ENOENT")
|
|
280
|
+
return undefined;
|
|
281
|
+
throw new LocalControlError("SOCKET_CLEANUP_CONFLICT");
|
|
282
|
+
}
|
|
283
|
+
return { directory, backupPath };
|
|
284
|
+
}
|
|
285
|
+
async function restoreReplacement(socketPath, replacement) {
|
|
286
|
+
if (replacement === undefined)
|
|
287
|
+
return;
|
|
288
|
+
let current;
|
|
289
|
+
try {
|
|
290
|
+
current = await optionalLstat(socketPath);
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
throw new LocalControlError("SOCKET_CLEANUP_CONFLICT");
|
|
294
|
+
}
|
|
295
|
+
if (current !== undefined)
|
|
296
|
+
throw new LocalControlError("SOCKET_CLEANUP_CONFLICT");
|
|
297
|
+
try {
|
|
298
|
+
await rename(replacement.backupPath, socketPath);
|
|
299
|
+
await rmdir(replacement.directory);
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
throw new LocalControlError("SOCKET_CLEANUP_CONFLICT");
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
export async function serveLocalControl(options) {
|
|
306
|
+
const maximum = limits(options.requestBytes, options.responseBytes);
|
|
307
|
+
await validateLocation(options.stateDir, options.socketPath);
|
|
308
|
+
await prepareTarget(options.socketPath);
|
|
309
|
+
const connections = new Set();
|
|
310
|
+
const server = net.createServer({ allowHalfOpen: true }, (socket) => {
|
|
311
|
+
if (connections.size >= MAX_CONNECTIONS) {
|
|
312
|
+
socket.once("error", () => socket.destroy());
|
|
313
|
+
socket.end(serialize(failure("SERVER_BUSY"), maximum.response), () => socket.destroy());
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
connections.add(socket);
|
|
317
|
+
socket.once("close", () => connections.delete(socket));
|
|
318
|
+
socket.setTimeout(DEFAULT_TIMEOUT_MS);
|
|
319
|
+
void readOneFrame(socket, maximum.request).then(async (frame) => {
|
|
320
|
+
socket.setTimeout(0);
|
|
321
|
+
let input;
|
|
322
|
+
try {
|
|
323
|
+
const request = decode(frame);
|
|
324
|
+
if (!object(request) || !Number.isSafeInteger(request.protocolVersion))
|
|
325
|
+
throw new LocalControlError("INVALID_REQUEST");
|
|
326
|
+
if (request.protocolVersion !== LOCAL_CONTROL_VERSION)
|
|
327
|
+
throw new LocalControlError("UNSUPPORTED_VERSION");
|
|
328
|
+
if (Object.keys(request).length !== 2 || !Object.hasOwn(request, "input"))
|
|
329
|
+
throw new LocalControlError("INVALID_REQUEST");
|
|
330
|
+
input = request.input;
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
socket.end(serialize(failure(error instanceof LocalControlError ? error.code : "INVALID_JSON"), maximum.response));
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
let response;
|
|
337
|
+
try {
|
|
338
|
+
response = { protocolVersion: LOCAL_CONTROL_VERSION, ok: true, result: await options.handle(input) };
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
response = failure("HANDLER_FAILURE");
|
|
342
|
+
}
|
|
343
|
+
socket.end(serialize(response, maximum.response));
|
|
344
|
+
}, (error) => {
|
|
345
|
+
const kind = error instanceof FrameFault ? error.kind : "error";
|
|
346
|
+
const code = kind === "too_large" ? "FRAME_TOO_LARGE" : kind === "multiple" ? "MULTIPLE_FRAMES"
|
|
347
|
+
: kind === "timeout" ? "REQUEST_TIMEOUT" : undefined;
|
|
348
|
+
if (code === undefined)
|
|
349
|
+
socket.destroy();
|
|
350
|
+
else
|
|
351
|
+
socket.end(serialize(failure(code), maximum.response));
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
try {
|
|
355
|
+
await new Promise((resolve, reject) => {
|
|
356
|
+
const failed = () => reject(new LocalControlError("SOCKET_BIND_FAILED"));
|
|
357
|
+
server.once("error", failed);
|
|
358
|
+
server.listen(options.socketPath, () => { server.off("error", failed); resolve(); });
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
await closeServer(server);
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
let identity;
|
|
366
|
+
try {
|
|
367
|
+
const info = await lstat(options.socketPath);
|
|
368
|
+
if (!info.isSocket())
|
|
369
|
+
throw new Error();
|
|
370
|
+
identity = { dev: info.dev, ino: info.ino };
|
|
371
|
+
await chmod(options.socketPath, 0o600);
|
|
372
|
+
const secured = await lstat(options.socketPath);
|
|
373
|
+
if (!secured.isSocket() || !sameIdentity(secured, identity) || (secured.mode & 0o777) !== 0o600)
|
|
374
|
+
throw new Error();
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
for (const socket of connections)
|
|
378
|
+
socket.destroy();
|
|
379
|
+
await closeServer(server);
|
|
380
|
+
if (identity !== undefined)
|
|
381
|
+
await removeOwned(options.socketPath, identity);
|
|
382
|
+
throw new LocalControlError("SOCKET_PERMISSION_FAILED");
|
|
383
|
+
}
|
|
384
|
+
const owned = identity;
|
|
385
|
+
let closing;
|
|
386
|
+
return { close: () => closing ??= (async () => {
|
|
387
|
+
const replacement = await protectReplacement(options.socketPath, owned);
|
|
388
|
+
for (const socket of connections)
|
|
389
|
+
socket.destroy();
|
|
390
|
+
await closeServer(server);
|
|
391
|
+
await removeOwned(options.socketPath, owned);
|
|
392
|
+
await restoreReplacement(options.socketPath, replacement);
|
|
393
|
+
})() };
|
|
394
|
+
}
|
|
395
|
+
export async function requestLocalControl(options) {
|
|
396
|
+
const maximum = limits();
|
|
397
|
+
const timeout = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
398
|
+
if (!Number.isSafeInteger(timeout) || timeout < 50 || timeout > 90_000) {
|
|
399
|
+
throw new LocalControlError("CONTROL_INVALID_RESPONSE");
|
|
400
|
+
}
|
|
401
|
+
await validateLocation(options.stateDir, options.socketPath, true);
|
|
402
|
+
let socketInfo;
|
|
403
|
+
try {
|
|
404
|
+
socketInfo = await lstat(options.socketPath);
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
const code = errno(error);
|
|
408
|
+
throw new LocalControlError(code === "EPERM" || code === "EACCES" ? "CONTROL_CONNECT_DENIED"
|
|
409
|
+
: code === "ENOENT" ? "CONTROL_SOCKET_MISSING" : "CONTROL_CONNECT_FAILED");
|
|
410
|
+
}
|
|
411
|
+
const uid = process.getuid?.call(process);
|
|
412
|
+
if (!socketInfo.isSocket() || socketInfo.isSymbolicLink() || (socketInfo.mode & 0o777) !== 0o600 ||
|
|
413
|
+
uid !== undefined && socketInfo.uid !== uid)
|
|
414
|
+
throw new LocalControlError("CONTROL_SOCKET_UNSAFE");
|
|
415
|
+
let frame;
|
|
416
|
+
try {
|
|
417
|
+
if (options.request === undefined)
|
|
418
|
+
throw new TypeError("not JSON");
|
|
419
|
+
const encoded = JSON.stringify({ protocolVersion: LOCAL_CONTROL_VERSION, input: options.request });
|
|
420
|
+
if (encoded === undefined)
|
|
421
|
+
throw new TypeError("not JSON");
|
|
422
|
+
frame = Buffer.from(`${encoded}\n`, "utf8");
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
throw new LocalControlError("CONTROL_INVALID_RESPONSE");
|
|
426
|
+
}
|
|
427
|
+
if (frame.length > maximum.request)
|
|
428
|
+
throw new LocalControlError("FRAME_TOO_LARGE");
|
|
429
|
+
return await new Promise((resolve, reject) => {
|
|
430
|
+
const socket = net.createConnection(options.socketPath);
|
|
431
|
+
let settled = false, writeStarted = false;
|
|
432
|
+
const fail = (error) => {
|
|
433
|
+
if (settled)
|
|
434
|
+
return;
|
|
435
|
+
settled = true;
|
|
436
|
+
socket.destroy();
|
|
437
|
+
reject(options.mutating && writeStarted
|
|
438
|
+
? new LocalControlError("CONTROL_WRITE_OUTCOME_AMBIGUOUS", true) : error);
|
|
439
|
+
};
|
|
440
|
+
socket.setTimeout(timeout);
|
|
441
|
+
socket.once("connect", () => { writeStarted = true; socket.write(frame); });
|
|
442
|
+
void readOneFrame(socket, maximum.response).then((responseFrame) => {
|
|
443
|
+
try {
|
|
444
|
+
const value = decode(responseFrame);
|
|
445
|
+
if (!object(value) || !Number.isSafeInteger(value.protocolVersion)) {
|
|
446
|
+
throw new LocalControlError("CONTROL_INVALID_RESPONSE");
|
|
447
|
+
}
|
|
448
|
+
if (value.protocolVersion !== LOCAL_CONTROL_VERSION)
|
|
449
|
+
throw new LocalControlError("CONTROL_VERSION_MISMATCH");
|
|
450
|
+
if (typeof value.ok !== "boolean" ||
|
|
451
|
+
value.ok && (Object.keys(value).length !== 3 || !Object.hasOwn(value, "result")) ||
|
|
452
|
+
!value.ok && (Object.keys(value).length !== 3 || !object(value.error) ||
|
|
453
|
+
Object.keys(value.error).length !== 1 || typeof value.error.code !== "string" || !Object.hasOwn(MESSAGES, value.error.code))) {
|
|
454
|
+
throw new LocalControlError("CONTROL_INVALID_RESPONSE");
|
|
455
|
+
}
|
|
456
|
+
if (value.ok === false) {
|
|
457
|
+
const code = value.error.code;
|
|
458
|
+
if (["HANDLER_FAILURE", "INVALID_HANDLER_RESPONSE", "RESPONSE_TOO_LARGE"].includes(code)) {
|
|
459
|
+
fail(new LocalControlError(code));
|
|
460
|
+
}
|
|
461
|
+
else if (!settled) {
|
|
462
|
+
settled = true;
|
|
463
|
+
socket.destroy();
|
|
464
|
+
reject(new LocalControlError(code));
|
|
465
|
+
}
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
if (!settled) {
|
|
469
|
+
settled = true;
|
|
470
|
+
socket.destroy();
|
|
471
|
+
resolve(value.result);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
catch (error) {
|
|
475
|
+
fail(error instanceof LocalControlError && error.code === "CONTROL_VERSION_MISMATCH"
|
|
476
|
+
? error : new LocalControlError("CONTROL_INVALID_RESPONSE"));
|
|
477
|
+
}
|
|
478
|
+
}, (error) => {
|
|
479
|
+
const kind = error instanceof FrameFault ? error.kind : "error";
|
|
480
|
+
const systemCode = !writeStarted && error instanceof FrameFault ? error.systemCode : undefined;
|
|
481
|
+
const code = kind === "timeout" ? "CONTROL_TIMEOUT" : kind === "too_large" ? "CONTROL_RESPONSE_TOO_LARGE"
|
|
482
|
+
: kind === "closed" ? "CONTROL_CONNECTION_CLOSED" : systemCode === "EPERM" || systemCode === "EACCES"
|
|
483
|
+
? "CONTROL_CONNECT_DENIED" : systemCode === "ENOENT" ? "CONTROL_SOCKET_MISSING"
|
|
484
|
+
: systemCode === "ECONNREFUSED" ? "CONTROL_LISTENER_UNAVAILABLE" : "CONTROL_CONNECT_FAILED";
|
|
485
|
+
fail(new LocalControlError(code));
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=local-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-control.js","sourceRoot":"","sources":["../../../src/gateway/local-control.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Destination, WakeInput, WakeResult } from "./coordinator.js";
|
|
2
|
+
import type { ClaudePeerAdapter } from "./claude-peer.js";
|
|
3
|
+
import type { StatelessCodexOperationTransport } from "./codex-stateless-transport.js";
|
|
4
|
+
type ClaudePeerPort = Pick<ClaudePeerAdapter, "discover" | "assertTargetWorkspaceDisjoint" | "prepareSend" | "close">;
|
|
5
|
+
export declare class ClaudeDestination implements Destination {
|
|
6
|
+
private readonly options;
|
|
7
|
+
private readonly inFlight;
|
|
8
|
+
private closing;
|
|
9
|
+
constructor(options: Readonly<{
|
|
10
|
+
host: string;
|
|
11
|
+
stateRoot: string;
|
|
12
|
+
peer: ClaudePeerPort;
|
|
13
|
+
}>);
|
|
14
|
+
deliver(input: WakeInput): Promise<WakeResult>;
|
|
15
|
+
private deliverOnce;
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare class CodexDestination implements Destination {
|
|
19
|
+
private readonly options;
|
|
20
|
+
private readonly active;
|
|
21
|
+
private readonly starting;
|
|
22
|
+
private readonly controllers;
|
|
23
|
+
private readonly inFlight;
|
|
24
|
+
private closing;
|
|
25
|
+
constructor(options: Readonly<{
|
|
26
|
+
host: string;
|
|
27
|
+
operation: StatelessCodexOperationTransport;
|
|
28
|
+
}>);
|
|
29
|
+
deliver(input: WakeInput): Promise<WakeResult>;
|
|
30
|
+
private deliverSteer;
|
|
31
|
+
private deliverStart;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
export {};
|