agent-embassy 3.1.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 (112) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/CONTRIBUTING.md +92 -202
  3. package/README.md +157 -155
  4. package/SECURITY.md +191 -348
  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 +61 -1052
  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 -949
  62. package/package.json +5 -5
  63. package/skills/embassy-peer/SKILL.md +38 -196
  64. package/skills/embassy-peer/agents/openai.yaml +2 -2
  65. package/dist/src/gateway/claude-helper-protocol.d.ts +0 -117
  66. package/dist/src/gateway/claude-helper-protocol.js +0 -122
  67. package/dist/src/gateway/claude-helper-protocol.js.map +0 -1
  68. package/dist/src/gateway/claude-helper-supervisor.d.ts +0 -87
  69. package/dist/src/gateway/claude-helper-supervisor.js +0 -374
  70. package/dist/src/gateway/claude-helper-supervisor.js.map +0 -1
  71. package/dist/src/gateway/claude-helper.d.ts +0 -1
  72. package/dist/src/gateway/claude-helper.js +0 -252
  73. package/dist/src/gateway/claude-helper.js.map +0 -1
  74. package/dist/src/gateway/cli.d.ts +0 -56
  75. package/dist/src/gateway/cli.js +0 -1532
  76. package/dist/src/gateway/cli.js.map +0 -1
  77. package/dist/src/gateway/codex-socket-holder.d.ts +0 -26
  78. package/dist/src/gateway/codex-socket-holder.js +0 -76
  79. package/dist/src/gateway/codex-socket-holder.js.map +0 -1
  80. package/dist/src/gateway/control.d.ts +0 -279
  81. package/dist/src/gateway/control.js +0 -933
  82. package/dist/src/gateway/control.js.map +0 -1
  83. package/dist/src/gateway/peer-client.d.ts +0 -58
  84. package/dist/src/gateway/peer-client.js +0 -217
  85. package/dist/src/gateway/peer-client.js.map +0 -1
  86. package/dist/src/gateway/peer-mailbox.d.ts +0 -78
  87. package/dist/src/gateway/peer-mailbox.js +0 -168
  88. package/dist/src/gateway/peer-mailbox.js.map +0 -1
  89. package/dist/src/gateway/peer-protocol.d.ts +0 -110
  90. package/dist/src/gateway/peer-protocol.js +0 -79
  91. package/dist/src/gateway/peer-protocol.js.map +0 -1
  92. package/dist/src/gateway/peer-stdio.d.ts +0 -23
  93. package/dist/src/gateway/peer-stdio.js +0 -100
  94. package/dist/src/gateway/peer-stdio.js.map +0 -1
  95. package/dist/src/gateway/providers.d.ts +0 -164
  96. package/dist/src/gateway/providers.js +0 -975
  97. package/dist/src/gateway/providers.js.map +0 -1
  98. package/dist/src/gateway/server.d.ts +0 -46
  99. package/dist/src/gateway/server.js +0 -216
  100. package/dist/src/gateway/server.js.map +0 -1
  101. package/dist/src/gateway/service.d.ts +0 -371
  102. package/dist/src/gateway/service.js +0 -2335
  103. package/dist/src/gateway/service.js.map +0 -1
  104. package/dist/src/gateway/status-view.d.ts +0 -119
  105. package/dist/src/gateway/status-view.js +0 -484
  106. package/dist/src/gateway/status-view.js.map +0 -1
  107. package/dist/src/gateway/store.d.ts +0 -188
  108. package/dist/src/gateway/store.js +0 -2360
  109. package/dist/src/gateway/store.js.map +0 -1
  110. package/dist/src/gateway/types.d.ts +0 -541
  111. package/dist/src/gateway/types.js +0 -332
  112. package/dist/src/gateway/types.js.map +0 -1
@@ -0,0 +1,223 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { BridgeError } from "../errors.js";
3
+ import { Ledger, nativeKey, sameEndpoint } from "./ledger.js";
4
+ const ALIAS = /^[a-z][a-z0-9_-]{0,31}@[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/;
5
+ const HOST = /^[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/;
6
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
7
+ const REGISTRATION = /^reg_[A-Za-z0-9_-]{1,252}$/;
8
+ const allowedClaude = (peer) => peer.kind === "interactive" || peer.kind === "bg";
9
+ const reference = ({ id, host, provider }) => ({ id, host, provider });
10
+ export class EndpointDirectory {
11
+ options;
12
+ #createRegistrationId;
13
+ #collidingAliases = new Set();
14
+ #observedClaudeAliases = new Set();
15
+ #completeRefreshObserved = false;
16
+ #proofOverflow = false;
17
+ constructor(options) {
18
+ this.options = options;
19
+ if (!HOST.test(options.host))
20
+ throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "The endpoint host is invalid.");
21
+ this.#createRegistrationId = options.createRegistrationId ?? (() => `reg_${randomUUID()}`);
22
+ }
23
+ async registerCodex(handle, alias, succeeds) {
24
+ this.#assertAlias(alias, true);
25
+ if (succeeds !== undefined)
26
+ this.#assertAlias(succeeds, true);
27
+ if (!UUID.test(handle)) {
28
+ throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "The Codex registration is invalid.");
29
+ }
30
+ return await this.options.store.transact((state, now) => {
31
+ const ledger = new Ledger(state, this.options.host, this.options.limits, now.getTime());
32
+ const normalizedHandle = handle.toLowerCase();
33
+ const existing = state.endpoints.find((row) => row.provider === "codex" && row.handle === normalizedHandle);
34
+ if (succeeds !== undefined) {
35
+ const predecessor = ledger.resolve(succeeds);
36
+ if (predecessor === undefined || predecessor.provider !== "codex") {
37
+ throw new BridgeError("ROUTE_UNREGISTERED", "The predecessor route is absent.");
38
+ }
39
+ if (predecessor.handle !== normalizedHandle)
40
+ ledger.retire(reference(predecessor));
41
+ }
42
+ const endpoint = {
43
+ id: existing?.id ?? this.#id("codex", normalizedHandle), host: this.options.host, provider: "codex",
44
+ alias, handle: normalizedHandle,
45
+ };
46
+ if (state.endpoints.some((row) => row.alias === alias && !sameEndpoint(row, endpoint))) {
47
+ throw new BridgeError("PEER_ALIAS_COLLISION", "The requested Codex alias is already in use.");
48
+ }
49
+ ledger.register(endpoint);
50
+ return endpoint;
51
+ });
52
+ }
53
+ async caller(input) {
54
+ if (input.kind === "codex") {
55
+ if (!UUID.test(input.handle))
56
+ throw new BridgeError("ROUTE_UNREGISTERED", "The Codex caller is invalid.");
57
+ const matches = (await this.options.store.snapshot()).endpoints.filter((row) => row.provider === "codex" && row.handle === input.handle.toLowerCase());
58
+ if (matches.length !== 1)
59
+ throw new BridgeError("ROUTE_UNREGISTERED", "The Codex caller is not registered.");
60
+ return matches[0];
61
+ }
62
+ const peer = await this.options.claude.resolveReplyAddress(input.address);
63
+ if (!allowedClaude(peer))
64
+ throw new BridgeError("CLAUDE_REPLY_ROUTE_MISMATCH", "The caller is not an interactive Claude session.");
65
+ return await this.#recordClaude(peer);
66
+ }
67
+ async named(selector) {
68
+ if (UUID.test(selector)) {
69
+ const peer = (await this.options.claude.discover()).peers.find((row) => row.targetId.toLowerCase() === selector.toLowerCase() && allowedClaude(row));
70
+ if (peer === undefined)
71
+ return undefined;
72
+ const endpoint = await this.#recordClaude(peer);
73
+ await this.options.claude.assertTargetWorkspaceDisjoint(peer.targetId, this.options.store.rootDir);
74
+ return endpoint;
75
+ }
76
+ if (!ALIAS.test(selector))
77
+ return undefined;
78
+ const at = selector.lastIndexOf("@");
79
+ if (selector.slice(at + 1) !== this.options.host)
80
+ return await this.#remoteNamed(selector);
81
+ const before = await this.options.store.snapshot();
82
+ const known = before.endpoints.filter((row) => row.alias === selector);
83
+ const codex = known.filter((row) => row.provider === "codex");
84
+ let live;
85
+ try {
86
+ live = await this.refresh();
87
+ }
88
+ catch (error) {
89
+ if (this.#proofOverflow || this.#collidingAliases.has(selector) || !this.#completeRefreshObserved && known.length > 1) {
90
+ throw new BridgeError("PEER_ALIAS_COLLISION", "The endpoint name is ambiguous.");
91
+ }
92
+ if (codex.length === 1 && (known.length === 1 ||
93
+ this.#completeRefreshObserved && !this.#observedClaudeAliases.has(selector)))
94
+ return codex[0];
95
+ throw error;
96
+ }
97
+ if (this.#proofOverflow || this.#collidingAliases.has(selector)) {
98
+ throw new BridgeError("PEER_ALIAS_COLLISION", "A complete discovery is required to clear this name's collision.");
99
+ }
100
+ const matches = live.filter((row) => row.alias === selector);
101
+ if (matches.length > 1)
102
+ throw new BridgeError("PEER_ALIAS_COLLISION", "The endpoint name is ambiguous.");
103
+ const endpoint = matches[0];
104
+ if (endpoint === undefined && before.retirements.some((row) => row.alias === selector)) {
105
+ throw new BridgeError("ROUTE_UNREGISTERED", "The endpoint name belongs to a retired identity.");
106
+ }
107
+ if (endpoint?.provider === "claude") {
108
+ await this.options.claude.assertTargetWorkspaceDisjoint(endpoint.handle, this.options.store.rootDir);
109
+ }
110
+ return endpoint;
111
+ }
112
+ async exact(identity) {
113
+ if (identity.host !== this.options.host) {
114
+ const endpoint = await this.options.remote?.exact(identity);
115
+ if (endpoint === undefined)
116
+ return undefined;
117
+ if (!this.#validRemote(endpoint) || !sameEndpoint(endpoint, identity)) {
118
+ throw new BridgeError("INVALID_PEER_CATALOG", "The remote endpoint identity is invalid.");
119
+ }
120
+ return endpoint;
121
+ }
122
+ const endpoint = (await this.options.store.snapshot()).endpoints.find((row) => sameEndpoint(row, identity));
123
+ if (endpoint === undefined || endpoint.provider === "codex")
124
+ return endpoint;
125
+ const peer = (await this.options.claude.discover()).peers.find((row) => row.targetId.toLowerCase() === endpoint.handle && allowedClaude(row));
126
+ if (peer === undefined)
127
+ return undefined;
128
+ const current = await this.#recordClaude(peer);
129
+ if (!sameEndpoint(current, identity))
130
+ return undefined;
131
+ await this.options.claude.assertTargetWorkspaceDisjoint(peer.targetId, this.options.store.rootDir);
132
+ return current;
133
+ }
134
+ async refresh() {
135
+ const discovery = await this.options.claude.discover();
136
+ const peers = discovery.peers.filter(allowedClaude);
137
+ const refreshed = await this.options.store.transact((state, now) => {
138
+ const ledger = new Ledger(state, this.options.host, this.options.limits, now.getTime());
139
+ const current = peers.flatMap((peer) => {
140
+ const endpoint = this.#upsertClaude(ledger, state, peer, true);
141
+ return endpoint === undefined ? [] : [endpoint];
142
+ });
143
+ if (!discovery.truncated)
144
+ return { listed: current, observed: current };
145
+ const seen = new Set(current.map((row) => row.id));
146
+ return { observed: current, listed: [...current,
147
+ ...state.endpoints.filter((row) => row.provider === "claude" && !seen.has(row.id))] };
148
+ });
149
+ const observed = refreshed.observed.map((row) => row.alias);
150
+ const codex = (await this.options.store.snapshot()).endpoints.filter((row) => row.provider === "codex");
151
+ const collisions = new Set(observed.filter((alias, index) => observed.indexOf(alias) !== index || codex.some((row) => row.alias === alias)));
152
+ if (!discovery.truncated) {
153
+ this.#completeRefreshObserved = true;
154
+ this.#observedClaudeAliases.clear();
155
+ this.#collidingAliases.clear();
156
+ this.#proofOverflow = false;
157
+ }
158
+ for (const [set, aliases] of [[this.#observedClaudeAliases, observed], [this.#collidingAliases, collisions]]) {
159
+ for (const alias of aliases) {
160
+ if (set.has(alias))
161
+ continue;
162
+ if (set.size < this.options.limits.endpoints)
163
+ set.add(alias);
164
+ else
165
+ this.#proofOverflow = true;
166
+ }
167
+ }
168
+ return [...codex, ...refreshed.listed];
169
+ }
170
+ #upsertClaude(ledger, state, peer, skipRetired = false) {
171
+ if (!UUID.test(peer.targetId) || !allowedClaude(peer)) {
172
+ throw new BridgeError("CLAUDE_ROUTE_MISMATCH", "The discovered Claude identity is invalid.");
173
+ }
174
+ const alias = `${peer.alias}@${this.options.host}`;
175
+ this.#assertAlias(alias, false);
176
+ const handle = peer.targetId.toLowerCase();
177
+ const existing = state.endpoints.find((row) => row.provider === "claude" && row.handle === handle);
178
+ const endpoint = { id: existing?.id ?? this.#id("claude", handle), host: this.options.host,
179
+ provider: "claude", alias, handle };
180
+ if (state.retirements.some((row) => sameEndpoint(row.endpoint, endpoint) || row.nativeKey === nativeKey(endpoint))) {
181
+ if (skipRetired)
182
+ return undefined;
183
+ throw new BridgeError("ROUTE_UNREGISTERED", "The Claude endpoint was retired.");
184
+ }
185
+ ledger.register(endpoint);
186
+ return endpoint;
187
+ }
188
+ async #recordClaude(peer) {
189
+ return await this.options.store.transact((state, now) => {
190
+ const endpoint = this.#upsertClaude(new Ledger(state, this.options.host, this.options.limits, now.getTime()), state, peer);
191
+ if (endpoint === undefined)
192
+ throw new RangeError("CLAUDE_ENDPOINT_MISSING");
193
+ return endpoint;
194
+ });
195
+ }
196
+ async #remoteNamed(alias) {
197
+ const matches = await this.options.remote?.named(alias) ?? [];
198
+ if (matches.some((row) => !this.#validRemote(row) || row.alias !== alias)) {
199
+ throw new BridgeError("INVALID_PEER_CATALOG", "The remote endpoint projection is invalid.");
200
+ }
201
+ if (matches.length > 1)
202
+ throw new BridgeError("PEER_ALIAS_COLLISION", "The endpoint name is ambiguous.");
203
+ return matches[0];
204
+ }
205
+ #validRemote(endpoint) {
206
+ return endpoint.host !== this.options.host && HOST.test(endpoint.host) && REGISTRATION.test(endpoint.id) &&
207
+ (endpoint.provider === "claude" || endpoint.provider === "codex") && ALIAS.test(endpoint.alias) &&
208
+ endpoint.alias.endsWith(`@${endpoint.host}`) && endpoint.handle.length > 0 && endpoint.handle.length <= 256 &&
209
+ !endpoint.handle.includes("\0");
210
+ }
211
+ #assertAlias(alias, codex) {
212
+ if (!ALIAS.test(alias) || !alias.endsWith(`@${this.options.host}`) || codex && !alias.startsWith("codex-")) {
213
+ throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", "The endpoint alias is invalid.");
214
+ }
215
+ }
216
+ #id(provider, handle) {
217
+ const id = this.#createRegistrationId(provider, handle);
218
+ if (!REGISTRATION.test(id))
219
+ throw new RangeError("INVALID_REGISTRATION_ID");
220
+ return id;
221
+ }
222
+ }
223
+ //# sourceMappingURL=endpoint-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-directory.js","sourceRoot":"","sources":["../../../src/gateway/endpoint-directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from "node:child_process";
2
+ import type { Readable, Writable } from "node:stream";
3
+ import type { Destination, WakeInput, WakeResult } from "./coordinator.js";
4
+ import type { RemoteEndpointResolver } from "./endpoint-directory.js";
5
+ import type { Endpoint, EndpointRef } from "./ledger.js";
6
+ export declare const FEDERATION_PROTOCOL_VERSION = 3;
7
+ export type PublicEndpoint = Readonly<{
8
+ id: string;
9
+ host: string;
10
+ provider: "claude" | "codex";
11
+ alias: string;
12
+ }>;
13
+ export type FederationObservation = Readonly<{
14
+ host: string;
15
+ observedAt?: string;
16
+ safeErrorCode?: "PEER_TUNNEL_UNAVAILABLE";
17
+ routes: readonly PublicEndpoint[];
18
+ }>;
19
+ export type FederationSnapshot = Readonly<{
20
+ nodes: readonly FederationObservation[];
21
+ truncated: boolean;
22
+ }>;
23
+ export type FederatedHandoff = Readonly<{
24
+ target: PublicEndpoint;
25
+ messages: readonly Readonly<{
26
+ id: string;
27
+ reply: string;
28
+ source: PublicEndpoint;
29
+ body: string;
30
+ deadline: number;
31
+ steer: boolean;
32
+ }>[];
33
+ }>;
34
+ type FederationResult = Readonly<{
35
+ accepted: true;
36
+ } | {
37
+ accepted: false;
38
+ code: string;
39
+ }>;
40
+ type Child = Pick<ChildProcessWithoutNullStreams, "kill" | "once" | "stderr" | "stdin" | "stdout">;
41
+ export type FederationSpawn = (command: string, args: readonly string[], options: SpawnOptionsWithoutStdio) => Child;
42
+ export declare function isFederatedHandoff(value: unknown): value is FederatedHandoff;
43
+ export declare class Federation implements Destination, RemoteEndpointResolver {
44
+ private readonly options;
45
+ private readonly nodes;
46
+ private readonly connections;
47
+ private readonly catalogs;
48
+ private readonly catalogCounts;
49
+ private readonly observedAt;
50
+ private readonly failed;
51
+ private readonly now;
52
+ private catalogTruncated;
53
+ private closing;
54
+ constructor(options: Readonly<{
55
+ host: string;
56
+ nodes: readonly string[];
57
+ spawn?: FederationSpawn;
58
+ now?: () => number;
59
+ }>);
60
+ named(name: string): Promise<readonly Endpoint[]>;
61
+ exact(identity: EndpointRef): Promise<Endpoint | undefined>;
62
+ catalog(): Promise<PublicEndpoint[]>;
63
+ /** Last bounded display observation only. Reading it performs no network I/O;
64
+ * exact and named routing continue to use the authenticated owner RPC. */
65
+ snapshot(): FederationSnapshot;
66
+ deliver(input: WakeInput): Promise<WakeResult>;
67
+ close(): Promise<void>;
68
+ private resolveAt;
69
+ private connection;
70
+ private drop;
71
+ private compactCatalogs;
72
+ }
73
+ export type FederationHandlers = Readonly<{
74
+ resolve: (peerHost: string, selector: string | EndpointRef) => PublicEndpoint | null | Promise<PublicEndpoint | null>;
75
+ catalog: (peerHost: string) => readonly PublicEndpoint[] | Promise<readonly PublicEndpoint[]>;
76
+ handoff: (peerHost: string, input: FederatedHandoff) => FederationResult | Promise<FederationResult>;
77
+ }>;
78
+ export type FederationStdioSession = Readonly<{
79
+ done: Promise<void>;
80
+ close: () => void;
81
+ }>;
82
+ export declare function runFederationStdio(options: Readonly<{
83
+ host: string;
84
+ nodes: readonly string[];
85
+ handlers: FederationHandlers;
86
+ input?: Readable;
87
+ output?: Writable;
88
+ }>): FederationStdioSession;
89
+ export {};