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,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 {};
|