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.
Files changed (115) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/CONTRIBUTING.md +92 -200
  3. package/README.md +159 -138
  4. package/SECURITY.md +191 -335
  5. package/dist/src/gateway/broker-check.d.ts +26 -0
  6. package/dist/src/gateway/broker-check.js +89 -0
  7. package/dist/src/gateway/broker-check.js.map +1 -0
  8. package/dist/src/gateway/broker-control.d.ts +72 -0
  9. package/dist/src/gateway/broker-control.js +164 -0
  10. package/dist/src/gateway/broker-control.js.map +1 -0
  11. package/dist/src/gateway/broker.d.ts +117 -0
  12. package/dist/src/gateway/broker.js +186 -0
  13. package/dist/src/gateway/broker.js.map +1 -0
  14. package/dist/src/gateway/claude-peer.d.ts +1 -124
  15. package/dist/src/gateway/claude-peer.js +62 -1053
  16. package/dist/src/gateway/claude-peer.js.map +1 -1
  17. package/dist/src/gateway/codex-stateless-transport.d.ts +0 -12
  18. package/dist/src/gateway/codex-stateless-transport.js +8 -142
  19. package/dist/src/gateway/codex-stateless-transport.js.map +1 -1
  20. package/dist/src/gateway/config.d.ts +2 -6
  21. package/dist/src/gateway/config.js +17 -27
  22. package/dist/src/gateway/config.js.map +1 -1
  23. package/dist/src/gateway/coordinator.d.ts +57 -0
  24. package/dist/src/gateway/coordinator.js +217 -0
  25. package/dist/src/gateway/coordinator.js.map +1 -0
  26. package/dist/src/gateway/core-cli.d.ts +15 -0
  27. package/dist/src/gateway/core-cli.js +282 -0
  28. package/dist/src/gateway/core-cli.js.map +1 -0
  29. package/dist/src/gateway/core-service-command.d.ts +16 -0
  30. package/dist/src/gateway/core-service-command.js +71 -0
  31. package/dist/src/gateway/core-service-command.js.map +1 -0
  32. package/dist/src/gateway/endpoint-directory.d.ts +33 -0
  33. package/dist/src/gateway/endpoint-directory.js +223 -0
  34. package/dist/src/gateway/endpoint-directory.js.map +1 -0
  35. package/dist/src/gateway/federation.d.ts +89 -0
  36. package/dist/src/gateway/federation.js +632 -0
  37. package/dist/src/gateway/federation.js.map +1 -0
  38. package/dist/src/gateway/ledger-codec.d.ts +3 -0
  39. package/dist/src/gateway/ledger-codec.js +159 -0
  40. package/dist/src/gateway/ledger-codec.js.map +1 -0
  41. package/dist/src/gateway/ledger.d.ts +138 -0
  42. package/dist/src/gateway/ledger.js +319 -0
  43. package/dist/src/gateway/ledger.js.map +1 -0
  44. package/dist/src/gateway/local-control.d.ts +23 -0
  45. package/dist/src/gateway/local-control.js +489 -0
  46. package/dist/src/gateway/local-control.js.map +1 -0
  47. package/dist/src/gateway/native-destinations.d.ts +34 -0
  48. package/dist/src/gateway/native-destinations.js +272 -0
  49. package/dist/src/gateway/native-destinations.js.map +1 -0
  50. package/dist/src/gateway/owned-state.d.ts +57 -0
  51. package/dist/src/gateway/owned-state.js +398 -0
  52. package/dist/src/gateway/owned-state.js.map +1 -0
  53. package/dist/src/gateway/provenance-envelope.d.ts +3 -3
  54. package/dist/src/gateway/provenance-envelope.js +3 -23
  55. package/dist/src/gateway/provenance-envelope.js.map +1 -1
  56. package/dist/src/gateway/runtime.d.ts +41 -0
  57. package/dist/src/gateway/runtime.js +175 -0
  58. package/dist/src/gateway/runtime.js.map +1 -0
  59. package/docs/CONFIGURATION.md +178 -266
  60. package/docs/DELIVERY.md +133 -82
  61. package/docs/GATEWAY-ARCHITECTURE.md +276 -943
  62. package/package.json +5 -5
  63. package/skills/embassy-peer/SKILL.md +38 -194
  64. package/skills/embassy-peer/agents/openai.yaml +2 -2
  65. package/dist/src/gateway/claude-helper-client.d.ts +0 -2
  66. package/dist/src/gateway/claude-helper-client.js +0 -2
  67. package/dist/src/gateway/claude-helper-client.js.map +0 -1
  68. package/dist/src/gateway/claude-helper-protocol.d.ts +0 -117
  69. package/dist/src/gateway/claude-helper-protocol.js +0 -122
  70. package/dist/src/gateway/claude-helper-protocol.js.map +0 -1
  71. package/dist/src/gateway/claude-helper-supervisor.d.ts +0 -87
  72. package/dist/src/gateway/claude-helper-supervisor.js +0 -347
  73. package/dist/src/gateway/claude-helper-supervisor.js.map +0 -1
  74. package/dist/src/gateway/claude-helper.d.ts +0 -1
  75. package/dist/src/gateway/claude-helper.js +0 -252
  76. package/dist/src/gateway/claude-helper.js.map +0 -1
  77. package/dist/src/gateway/cli.d.ts +0 -57
  78. package/dist/src/gateway/cli.js +0 -1503
  79. package/dist/src/gateway/cli.js.map +0 -1
  80. package/dist/src/gateway/codex-socket-holder.d.ts +0 -26
  81. package/dist/src/gateway/codex-socket-holder.js +0 -76
  82. package/dist/src/gateway/codex-socket-holder.js.map +0 -1
  83. package/dist/src/gateway/control.d.ts +0 -261
  84. package/dist/src/gateway/control.js +0 -903
  85. package/dist/src/gateway/control.js.map +0 -1
  86. package/dist/src/gateway/peer-client.d.ts +0 -58
  87. package/dist/src/gateway/peer-client.js +0 -217
  88. package/dist/src/gateway/peer-client.js.map +0 -1
  89. package/dist/src/gateway/peer-mailbox.d.ts +0 -78
  90. package/dist/src/gateway/peer-mailbox.js +0 -168
  91. package/dist/src/gateway/peer-mailbox.js.map +0 -1
  92. package/dist/src/gateway/peer-protocol.d.ts +0 -105
  93. package/dist/src/gateway/peer-protocol.js +0 -70
  94. package/dist/src/gateway/peer-protocol.js.map +0 -1
  95. package/dist/src/gateway/peer-stdio.d.ts +0 -23
  96. package/dist/src/gateway/peer-stdio.js +0 -100
  97. package/dist/src/gateway/peer-stdio.js.map +0 -1
  98. package/dist/src/gateway/providers.d.ts +0 -163
  99. package/dist/src/gateway/providers.js +0 -972
  100. package/dist/src/gateway/providers.js.map +0 -1
  101. package/dist/src/gateway/server.d.ts +0 -47
  102. package/dist/src/gateway/server.js +0 -219
  103. package/dist/src/gateway/server.js.map +0 -1
  104. package/dist/src/gateway/service.d.ts +0 -373
  105. package/dist/src/gateway/service.js +0 -2274
  106. package/dist/src/gateway/service.js.map +0 -1
  107. package/dist/src/gateway/status-view.d.ts +0 -167
  108. package/dist/src/gateway/status-view.js +0 -488
  109. package/dist/src/gateway/status-view.js.map +0 -1
  110. package/dist/src/gateway/store.d.ts +0 -185
  111. package/dist/src/gateway/store.js +0 -2359
  112. package/dist/src/gateway/store.js.map +0 -1
  113. package/dist/src/gateway/types.d.ts +0 -528
  114. package/dist/src/gateway/types.js +0 -341
  115. 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 {};