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,89 @@
|
|
|
1
|
+
import { randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import { Ledger, bodyHash, sameEndpoint } from "./ledger.js";
|
|
3
|
+
const LOOPBACK = /^loopback:([0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})$/i;
|
|
4
|
+
const ref = ({ id, host, provider }) => ({ id, host, provider });
|
|
5
|
+
const ids = () => ({ id: `msg_${randomUUID()}`, token: `dlv_${randomBytes(18).toString("base64url")}`,
|
|
6
|
+
reply: `conv_${randomBytes(24).toString("base64url")}` });
|
|
7
|
+
function isLoopback(endpoint, host) {
|
|
8
|
+
const match = endpoint.host === host && endpoint.provider === "codex" ? LOOPBACK.exec(endpoint.handle) : null;
|
|
9
|
+
return match !== null && endpoint.id === `reg_loopback_${match[1]}`;
|
|
10
|
+
}
|
|
11
|
+
/** Adds a broker-only destination around the real Codex adapter. It intercepts only
|
|
12
|
+
* identities minted for the duration of check(); every production write delegates. */
|
|
13
|
+
export class LoopbackDestination {
|
|
14
|
+
innerCodex;
|
|
15
|
+
expected = new Map();
|
|
16
|
+
checking;
|
|
17
|
+
constructor(innerCodex) {
|
|
18
|
+
this.innerCodex = innerCodex;
|
|
19
|
+
}
|
|
20
|
+
async deliver(input) {
|
|
21
|
+
const expected = this.expected.get(input.target.id);
|
|
22
|
+
if (!expected)
|
|
23
|
+
return this.innerCodex.deliver(input);
|
|
24
|
+
if (!sameEndpoint(input.target, expected.target) || input.messages.length !== 1 ||
|
|
25
|
+
!sameEndpoint(input.messages[0].source, expected.source))
|
|
26
|
+
throw new Error("INVALID_LOOPBACK_WAKE");
|
|
27
|
+
if (!await input.authorize({ bytes: Buffer.byteLength(input.text), sha256: bodyHash(input.text) })) {
|
|
28
|
+
return { outcome: "deferred", code: "WRITE_AUTHORIZATION_DENIED" };
|
|
29
|
+
}
|
|
30
|
+
await input.accepted("unconfirmed");
|
|
31
|
+
return { outcome: "delivered", code: "TRANSPORT_WRITTEN" };
|
|
32
|
+
}
|
|
33
|
+
async cleanup({ host, limits, store }) {
|
|
34
|
+
await store.transact((state, now) => {
|
|
35
|
+
const ledger = new Ledger(state, host, limits, now.getTime());
|
|
36
|
+
for (const endpoint of [...state.endpoints])
|
|
37
|
+
if (isLoopback(endpoint, host))
|
|
38
|
+
ledger.retire(endpoint);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
check(options) {
|
|
42
|
+
return this.checking ??= this.runCheck(options).finally(() => { this.checking = undefined; });
|
|
43
|
+
}
|
|
44
|
+
async runCheck({ host, limits, store, coordinator }) {
|
|
45
|
+
await this.cleanup({ host, limits, store });
|
|
46
|
+
const nonceA = randomUUID(), nonceB = randomUUID();
|
|
47
|
+
const source = { id: `reg_loopback_${nonceA}`, handle: `loopback:${nonceA}`,
|
|
48
|
+
host, provider: "codex", alias: `loopback-a-${nonceA.slice(0, 8)}@${host}` };
|
|
49
|
+
const target = { id: `reg_loopback_${nonceB}`, handle: `loopback:${nonceB}`,
|
|
50
|
+
host, provider: "codex", alias: `loopback-b-${nonceB.slice(0, 8)}@${host}` };
|
|
51
|
+
const change = (operation) => store.transact((state, now) => operation(new Ledger(state, host, limits, now.getTime())));
|
|
52
|
+
try {
|
|
53
|
+
await change((ledger) => { ledger.register(source); ledger.register(target); });
|
|
54
|
+
this.expected.set(target.id, { source: ref(source), target: ref(target) });
|
|
55
|
+
const challenge = await change((ledger) => ledger.admit({ ...ids(), source: ref(source), target: ref(target),
|
|
56
|
+
body: "Embassy broker loopback challenge.", deadline: ledger.now + limits.deadlineMs, steer: false }).delivery);
|
|
57
|
+
await coordinator.wake(target);
|
|
58
|
+
const delivered = (await store.snapshot()).deliveries.find((row) => row.id === challenge.id);
|
|
59
|
+
if (delivered?.state.phase !== "terminal" || delivered.state.outcome !== "delivered")
|
|
60
|
+
throw new Error("LOOPBACK_NOT_DELIVERED");
|
|
61
|
+
this.expected.delete(target.id);
|
|
62
|
+
this.expected.set(source.id, { source: ref(target), target: ref(source) });
|
|
63
|
+
const response = await change((ledger) => {
|
|
64
|
+
const replyTarget = ledger.replyTarget(challenge.reply, target);
|
|
65
|
+
if (!sameEndpoint(replyTarget, source))
|
|
66
|
+
throw new Error("INVALID_LOOPBACK_REPLY_TARGET");
|
|
67
|
+
return ledger.admit({ ...ids(), source: ref(target), target: replyTarget,
|
|
68
|
+
body: "Embassy broker loopback reply.", deadline: ledger.now + limits.deadlineMs, steer: false }).delivery;
|
|
69
|
+
});
|
|
70
|
+
await coordinator.wake(source);
|
|
71
|
+
const replied = (await store.snapshot()).deliveries.find((row) => row.id === response.id);
|
|
72
|
+
if (replied?.state.phase !== "terminal" || replied.state.outcome !== "delivered")
|
|
73
|
+
throw new Error("LOOPBACK_REPLY_NOT_DELIVERED");
|
|
74
|
+
return { status: "ok", scope: "broker-loopback" };
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
this.expected.delete(source.id);
|
|
78
|
+
this.expected.delete(target.id);
|
|
79
|
+
await change((ledger) => {
|
|
80
|
+
if (ledger.endpoint(source))
|
|
81
|
+
ledger.retire(source);
|
|
82
|
+
if (ledger.endpoint(target))
|
|
83
|
+
ledger.retire(target);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
close() { return this.innerCodex.close(); }
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=broker-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker-check.js","sourceRoot":"","sources":["../../../src/gateway/broker-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { MessagingBroker } from "./broker.js";
|
|
2
|
+
import type { EndpointCaller } from "./endpoint-directory.js";
|
|
3
|
+
import type { EndpointRef } from "./ledger.js";
|
|
4
|
+
import type { FederatedHandoff } from "./federation.js";
|
|
5
|
+
export type BrokerCommand = {
|
|
6
|
+
method: "health" | "list_snapshot" | "refresh_discovery" | "check";
|
|
7
|
+
params: Record<string, never>;
|
|
8
|
+
} | {
|
|
9
|
+
method: "register_codex";
|
|
10
|
+
params: {
|
|
11
|
+
caller: EndpointCaller;
|
|
12
|
+
alias: string;
|
|
13
|
+
succeeds?: string;
|
|
14
|
+
};
|
|
15
|
+
} | {
|
|
16
|
+
method: "send";
|
|
17
|
+
params: {
|
|
18
|
+
caller: EndpointCaller;
|
|
19
|
+
body: string;
|
|
20
|
+
to?: string;
|
|
21
|
+
conversation?: string;
|
|
22
|
+
};
|
|
23
|
+
} | {
|
|
24
|
+
method: "retire_route";
|
|
25
|
+
params: {
|
|
26
|
+
alias: string;
|
|
27
|
+
} | {
|
|
28
|
+
endpoint: string;
|
|
29
|
+
};
|
|
30
|
+
} | {
|
|
31
|
+
method: "delivery_status";
|
|
32
|
+
params: {
|
|
33
|
+
token: string;
|
|
34
|
+
};
|
|
35
|
+
} | {
|
|
36
|
+
method: "peer_catalog";
|
|
37
|
+
params: {
|
|
38
|
+
node: string;
|
|
39
|
+
};
|
|
40
|
+
} | {
|
|
41
|
+
method: "peer_resolve";
|
|
42
|
+
params: {
|
|
43
|
+
node: string;
|
|
44
|
+
selector: string | EndpointRef;
|
|
45
|
+
};
|
|
46
|
+
} | {
|
|
47
|
+
method: "peer_handoff";
|
|
48
|
+
params: {
|
|
49
|
+
node: string;
|
|
50
|
+
handoff: FederatedHandoff;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
/** One public projection contract, used before emission and after transport. Native
|
|
54
|
+
* handles and arbitrary adapter fields can never hitchhike in a valid result. */
|
|
55
|
+
export declare function isBrokerResult(method: BrokerCommand["method"], value: unknown): boolean;
|
|
56
|
+
/** Closed application vocabulary; the Unix envelope/version belongs to local-control. */
|
|
57
|
+
export declare function parseBrokerCommand(input: unknown, validateHandoff: (x: unknown) => boolean): BrokerCommand;
|
|
58
|
+
export type BrokerControlOptions = Readonly<{
|
|
59
|
+
broker: MessagingBroker;
|
|
60
|
+
validateHandoff: (x: unknown) => boolean;
|
|
61
|
+
check: () => Promise<unknown>;
|
|
62
|
+
}>;
|
|
63
|
+
export declare function handleBrokerCommand(input: unknown, options: BrokerControlOptions): Promise<{
|
|
64
|
+
ok: true;
|
|
65
|
+
result: unknown;
|
|
66
|
+
code?: never;
|
|
67
|
+
} | {
|
|
68
|
+
ok: false;
|
|
69
|
+
code: string;
|
|
70
|
+
result?: never;
|
|
71
|
+
}>;
|
|
72
|
+
export declare const commandMutates: (method: BrokerCommand["method"]) => boolean;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { BridgeError } from "../errors.js";
|
|
2
|
+
const object = (x) => !!x && typeof x === "object" && !Array.isArray(x);
|
|
3
|
+
const exact = (x, keys, optional = []) => object(x) &&
|
|
4
|
+
keys.every((key) => Object.hasOwn(x, key)) && Object.keys(x).every((key) => keys.includes(key) || optional.includes(key));
|
|
5
|
+
const alias = (x) => typeof x === "string" && /^[a-z][a-z0-9_-]{0,31}@[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/.test(x);
|
|
6
|
+
const host = (x) => typeof x === "string" && /^[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/.test(x);
|
|
7
|
+
const uuid = (x) => typeof x === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(x);
|
|
8
|
+
const token = (x, prefix, length) => typeof x === "string" && new RegExp(`^${prefix}[A-Za-z0-9_-]{${length}}$`).test(x);
|
|
9
|
+
const ref = (x) => exact(x, ["id", "host", "provider"]) && token(x.id, "reg_", "1,252") && host(x.host) && (x.provider === "claude" || x.provider === "codex");
|
|
10
|
+
const caller = (x) => exact(x, ["kind", "handle"]) && x.kind === "codex" && uuid(x.handle) ||
|
|
11
|
+
exact(x, ["kind", "address"]) && x.kind === "claude" && typeof x.address === "string" &&
|
|
12
|
+
x.address.startsWith("uds:/") && x.address.length <= 256 && !x.address.includes("\0");
|
|
13
|
+
const invalid = () => { throw new BridgeError("INVALID_REQUEST", "The control request is invalid."); };
|
|
14
|
+
const count = (x) => Number.isSafeInteger(x) && x >= 0;
|
|
15
|
+
const code = (x) => typeof x === "string" && /^[A-Z][A-Z0-9_]{0,63}$/.test(x);
|
|
16
|
+
const date = (x) => typeof x === "string" && Number.isFinite(Date.parse(x)) && new Date(x).toISOString() === x;
|
|
17
|
+
const outcomes = ["delivered", "failed", "cancelled", "expired", "ambiguous", "unconfirmed"];
|
|
18
|
+
const endpoint = (x) => exact(x, ["id", "host", "provider", "alias"]) &&
|
|
19
|
+
ref({ id: x.id, host: x.host, provider: x.provider }) && alias(x.alias) && x.alias.endsWith(`@${x.host}`);
|
|
20
|
+
const rows = (x, maximum, accepts) => Array.isArray(x) && x.length <= maximum && x.every(accepts);
|
|
21
|
+
const endpoints = (x, accepts = endpoint) => rows(x, 128, accepts) &&
|
|
22
|
+
new Set(x.map((row) => JSON.stringify([row.host, row.id]))).size === x.length;
|
|
23
|
+
/** One public projection contract, used before emission and after transport. Native
|
|
24
|
+
* handles and arbitrary adapter fields can never hitchhike in a valid result. */
|
|
25
|
+
export function isBrokerResult(method, value) {
|
|
26
|
+
switch (method) {
|
|
27
|
+
case "health": return exact(value, ["status"]) && ["healthy", "degraded"].includes(String(value.status));
|
|
28
|
+
case "check": return exact(value, ["status", "scope"]) && value.status === "ok" && value.scope === "broker-loopback";
|
|
29
|
+
case "register_codex": return endpoint(value);
|
|
30
|
+
case "send": return exact(value, ["accepted", "conversationId", "deliveryToken"]) && value.accepted === true &&
|
|
31
|
+
token(value.conversationId, "conv_", "16,64") && token(value.deliveryToken, "dlv_", "24");
|
|
32
|
+
case "retire_route": return exact(value, ["cancelled", "ambiguous", "unconfirmed"]) && Object.values(value).every(count);
|
|
33
|
+
case "refresh_discovery": return exact(value, ["routes"]) && endpoints(value.routes);
|
|
34
|
+
case "peer_catalog": return endpoints(value);
|
|
35
|
+
case "peer_resolve": return value === null || endpoint(value);
|
|
36
|
+
case "peer_handoff": return exact(value, ["accepted"]) && value.accepted === true ||
|
|
37
|
+
exact(value, ["accepted", "code"]) && value.accepted === false && code(value.code);
|
|
38
|
+
case "delivery_status": return exact(value, ["found"]) && value.found === false ||
|
|
39
|
+
exact(value, ["found", "state", "terminal", "deadlineAt"], ["pendingForMs", "safeErrorCode"]) && value.found === true && date(value.deadlineAt) &&
|
|
40
|
+
(value.terminal === true ? outcomes.includes(String(value.state)) && code(value.safeErrorCode) && value.pendingForMs === undefined
|
|
41
|
+
: value.terminal === false && ["queued", "reserved", "armed", "accepted"].includes(String(value.state)) && count(value.pendingForMs) && value.safeErrorCode === undefined);
|
|
42
|
+
case "list_snapshot": return exact(value, ["health", "revision", "routes", "messages", "retirements"], ["safeErrorCode", "federation"]) &&
|
|
43
|
+
["healthy", "degraded"].includes(String(value.health)) && count(value.revision) &&
|
|
44
|
+
(value.safeErrorCode === undefined || code(value.safeErrorCode)) &&
|
|
45
|
+
(value.federation === undefined || exact(value.federation, ["nodes", "truncated"]) && typeof value.federation.truncated === "boolean" &&
|
|
46
|
+
rows(value.federation.nodes, 32, (node) => exact(node, ["host", "routes"], ["observedAt", "safeErrorCode"]) && host(node.host) &&
|
|
47
|
+
endpoints(node.routes, (row) => endpoint(row) && row.host === node.host) &&
|
|
48
|
+
(node.observedAt === undefined || date(node.observedAt)) &&
|
|
49
|
+
(node.safeErrorCode === undefined || node.safeErrorCode === "PEER_TUNNEL_UNAVAILABLE")) &&
|
|
50
|
+
new Set(value.federation.nodes.map((node) => node.host)).size === value.federation.nodes.length &&
|
|
51
|
+
value.federation.nodes.reduce((sum, node) => sum + node.routes.length, 0) <= 128) &&
|
|
52
|
+
endpoints(value.routes, (row) => exact(row, ["id", "alias", "provider", "host", "queueDepth"], ["lastOperation"]) &&
|
|
53
|
+
endpoint({ id: row.id, alias: row.alias, provider: row.provider, host: row.host }) && count(row.queueDepth) &&
|
|
54
|
+
(row.lastOperation === undefined || exact(row.lastOperation, ["outcome", "code"]) &&
|
|
55
|
+
[...outcomes, "deferred"].includes(String(row.lastOperation.outcome)) && code(row.lastOperation.code))) &&
|
|
56
|
+
rows(value.messages, 600, (row) => exact(row, ["state", "ageMs"], ["source", "target", "safeErrorCode"]) &&
|
|
57
|
+
[...outcomes, "queued", "reserved", "armed", "accepted"].includes(String(row.state)) && count(row.ageMs) &&
|
|
58
|
+
(row.source === undefined || alias(row.source)) && (row.target === undefined || alias(row.target)) &&
|
|
59
|
+
(row.safeErrorCode === undefined || code(row.safeErrorCode))) &&
|
|
60
|
+
rows(value.retirements, 500, (row) => exact(row, ["alias", "at"]) && alias(row.alias) && date(row.at));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Closed application vocabulary; the Unix envelope/version belongs to local-control. */
|
|
64
|
+
export function parseBrokerCommand(input, validateHandoff) {
|
|
65
|
+
if (!exact(input, ["method", "params"]) || typeof input.method !== "string")
|
|
66
|
+
return invalid();
|
|
67
|
+
const p = input.params;
|
|
68
|
+
let valid = false;
|
|
69
|
+
switch (input.method) {
|
|
70
|
+
case "health":
|
|
71
|
+
case "list_snapshot":
|
|
72
|
+
case "refresh_discovery":
|
|
73
|
+
case "check":
|
|
74
|
+
valid = exact(p, []);
|
|
75
|
+
break;
|
|
76
|
+
case "register_codex":
|
|
77
|
+
valid = exact(p, ["caller", "alias"], ["succeeds"]) && caller(p.caller) && p.caller.kind === "codex" && alias(p.alias) &&
|
|
78
|
+
(p.succeeds === undefined || alias(p.succeeds));
|
|
79
|
+
break;
|
|
80
|
+
case "send":
|
|
81
|
+
valid = exact(p, ["caller", "body"], ["to", "conversation"]) && caller(p.caller) && typeof p.body === "string" &&
|
|
82
|
+
p.body.trim().length > 0 && !p.body.includes("\0") && Buffer.byteLength(p.body) <= 16_384 &&
|
|
83
|
+
(Object.hasOwn(p, "to") !== Object.hasOwn(p, "conversation")) &&
|
|
84
|
+
(p.to === undefined ? token(p.conversation, "conv_", "16,64") : alias(p.to) || uuid(p.to));
|
|
85
|
+
break;
|
|
86
|
+
case "retire_route":
|
|
87
|
+
valid = exact(p, ["alias"]) && alias(p.alias) ||
|
|
88
|
+
exact(p, ["endpoint"]) && token(p.endpoint, "reg_", "1,252");
|
|
89
|
+
break;
|
|
90
|
+
case "delivery_status":
|
|
91
|
+
valid = exact(p, ["token"]) && token(p.token, "dlv_", "24");
|
|
92
|
+
break;
|
|
93
|
+
case "peer_catalog":
|
|
94
|
+
valid = exact(p, ["node"]) && host(p.node);
|
|
95
|
+
break;
|
|
96
|
+
case "peer_resolve":
|
|
97
|
+
valid = exact(p, ["node", "selector"]) && host(p.node) && (alias(p.selector) || ref(p.selector));
|
|
98
|
+
break;
|
|
99
|
+
case "peer_handoff":
|
|
100
|
+
valid = exact(p, ["node", "handoff"]) && host(p.node) && validateHandoff(p.handoff);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
return valid ? input : invalid();
|
|
104
|
+
}
|
|
105
|
+
const publicEndpoint = ({ id, host, provider, alias }) => ({ id, host, provider, alias });
|
|
106
|
+
export async function handleBrokerCommand(input, options) {
|
|
107
|
+
try {
|
|
108
|
+
const command = parseBrokerCommand(input, options.validateHandoff);
|
|
109
|
+
const broker = options.broker;
|
|
110
|
+
let result;
|
|
111
|
+
switch (command.method) {
|
|
112
|
+
case "health":
|
|
113
|
+
result = { status: (await broker.status()).health };
|
|
114
|
+
break;
|
|
115
|
+
case "list_snapshot":
|
|
116
|
+
result = await broker.status();
|
|
117
|
+
break;
|
|
118
|
+
case "refresh_discovery":
|
|
119
|
+
result = await broker.refresh();
|
|
120
|
+
break;
|
|
121
|
+
case "register_codex":
|
|
122
|
+
result = await broker.register(command.params.caller, command.params.alias, command.params.succeeds);
|
|
123
|
+
break;
|
|
124
|
+
case "send":
|
|
125
|
+
result = await broker.send(command.params.caller, command.params.to === undefined ? { conversation: command.params.conversation } : { to: command.params.to }, command.params.body);
|
|
126
|
+
break;
|
|
127
|
+
case "retire_route":
|
|
128
|
+
result = await broker.retire("alias" in command.params ? command.params.alias : command.params);
|
|
129
|
+
break;
|
|
130
|
+
case "delivery_status":
|
|
131
|
+
result = await broker.delivery(command.params.token);
|
|
132
|
+
break;
|
|
133
|
+
case "check":
|
|
134
|
+
result = await options.check();
|
|
135
|
+
break;
|
|
136
|
+
case "peer_catalog":
|
|
137
|
+
case "peer_resolve":
|
|
138
|
+
case "peer_handoff": {
|
|
139
|
+
if (!broker.options.nodes?.includes(command.params.node))
|
|
140
|
+
throw new BridgeError("PEER_NOT_CONFIGURED", "The node is not configured.");
|
|
141
|
+
if (command.method === "peer_catalog")
|
|
142
|
+
result = (await broker.options.directory.refresh()).map(publicEndpoint);
|
|
143
|
+
else if (command.method === "peer_handoff")
|
|
144
|
+
result = await broker.handoff(command.params.node, command.params.handoff);
|
|
145
|
+
else {
|
|
146
|
+
const selected = command.params.selector;
|
|
147
|
+
if (typeof selected === "string" ? !selected.endsWith(`@${broker.options.host}`) : selected.host !== broker.options.host)
|
|
148
|
+
return invalid();
|
|
149
|
+
const endpoint = typeof selected === "string" ? await broker.options.directory.named(selected) : await broker.options.directory.exact(selected);
|
|
150
|
+
result = endpoint ? publicEndpoint(endpoint) : null;
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (!isBrokerResult(command.method, result))
|
|
156
|
+
throw new BridgeError("INVALID_HANDLER_RESPONSE", "The result is outside the public projection.");
|
|
157
|
+
return { ok: true, result };
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return { ok: false, code: error instanceof BridgeError && /^[A-Z][A-Z0-9_]{0,63}$/.test(error.code) ? error.code : "HANDLER_FAILURE" };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export const commandMutates = (method) => !["health", "list_snapshot", "delivery_status", "peer_catalog", "peer_resolve"].includes(method);
|
|
164
|
+
//# sourceMappingURL=broker-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker-control.js","sourceRoot":"","sources":["../../../src/gateway/broker-control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgB3C,MAAM,MAAM,GAAG,CAAC,CAAU,EAAY,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3F,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,IAAuB,EAAE,WAA8B,EAAE,EAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1G,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5H,MAAM,KAAK,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,+DAA+D,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5I,MAAM,IAAI,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrH,MAAM,IAAI,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,4EAA4E,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACxJ,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,MAAM,CAAC,IAAI,MAAM,iBAAiB,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjJ,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;AACxK,MAAM,MAAM,GAAG,CAAC,CAAU,EAAuB,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IACtH,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QACrF,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxF,MAAM,OAAO,GAAG,GAAU,EAAE,GAAG,MAAM,IAAI,WAAW,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9G,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAK,CAAY,IAAI,CAAC,CAAC;AAC5E,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACvF,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AACxH,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAC7F,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACrF,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5G,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,OAAe,EAAE,OAAkC,EAAW,EAAE,CACxF,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC9D,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,OAAO,GAAG,QAAQ,EAAW,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC;IAClF,IAAI,GAAG,CAAE,CAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAM,CAAW,CAAC,MAAM,CAAC;AAEtG;iFACiF;AACjF,MAAM,UAAU,cAAc,CAAC,MAA+B,EAAE,KAAc;IAC5E,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACzG,KAAK,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,iBAAiB,CAAC;QACrH,KAAK,gBAAgB,CAAC,CAAC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAC1G,KAAK,CAAC,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5F,KAAK,cAAc,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzH,KAAK,mBAAmB,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrF,KAAK,cAAc,CAAC,CAAC,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,cAAc,CAAC,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9D,KAAK,cAAc,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAC/E,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrF,KAAK,iBAAiB,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK;YAC7E,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBAC/I,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;oBAChI,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC;QAC/K,KAAK,eAAe,CAAC,CAAC,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;YACrI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC/E,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAChE,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS;gBACnI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC5H,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAK,GAAW,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;oBACjF,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACxD,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,KAAK,yBAAyB,CAAC,CAAC;gBACzF,IAAI,GAAG,CAAE,KAAK,CAAC,UAAU,CAAC,KAAe,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAM,KAAK,CAAC,UAAU,CAAC,KAAe,CAAC,MAAM;gBACpH,KAAK,CAAC,UAAU,CAAC,KAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAI,IAAI,CAAC,MAAoB,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;YAC7G,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;gBAC/G,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;gBAC3G,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBAC/E,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3G,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;gBACtG,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;gBACxG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClG,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,eAAwC;IACzF,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,OAAO,EAAE,CAAC;IAC9F,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,QAAQ,CAAC;QAAC,KAAK,eAAe,CAAC;QAAC,KAAK,mBAAmB,CAAC;QAAC,KAAK,OAAO;YAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAAC,MAAM;QACzG,KAAK,gBAAgB;YAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC3I,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAC,MAAM;QACzD,KAAK,MAAM;YAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;gBACzH,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,MAAM;gBACzF,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAC7D,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,MAAM;QACpG,KAAK,cAAc;YAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChE,KAAK,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,MAAM;QACtE,KAAK,iBAAiB;YAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YAAC,MAAM;QAC3F,KAAK,cAAc;YAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM;QACvE,KAAK,cAAc;YAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAC,MAAM;QAC7H,KAAK,cAAc;YAAE,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAAC,MAAM;IAClH,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAsB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACpD,CAAC;AAMD,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAkB,EAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAE1H,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAc,EAAE,OAA6B;IACrF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,MAAe,CAAC;QACpB,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,QAAQ;gBAAE,MAAM,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;gBAAC,MAAM;YAC1E,KAAK,eAAe;gBAAE,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBAAC,MAAM;YAC5D,KAAK,mBAAmB;gBAAE,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;gBAAC,MAAM;YACjE,KAAK,gBAAgB;gBAAE,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAAC,MAAM;YACnI,KAAK,MAAM;gBAAE,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAC3D,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,YAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAAC,MAAM;YAC5I,KAAK,cAAc;gBAAE,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAAC,MAAM;YAC5H,KAAK,iBAAiB;gBAAE,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAAC,MAAM;YACpF,KAAK,OAAO;gBAAE,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBAAC,MAAM;YACpD,KAAK,cAAc,CAAC;YAAC,KAAK,cAAc,CAAC;YAAC,KAAK,cAAc,CAAC,CAAC,CAAC;gBAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,6BAA6B,CAAC,CAAC;gBACtI,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc;oBAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;qBAC1G,IAAI,OAAO,CAAC,MAAM,KAAK,cAAc;oBAAE,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;qBAClH,CAAC;oBACJ,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;oBACzC,IAAI,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI;wBAAE,OAAO,OAAO,EAAE,CAAC;oBAC3I,MAAM,QAAQ,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAChJ,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtD,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;YAAE,MAAM,IAAI,WAAW,CAAC,0BAA0B,EAAE,8CAA8C,CAAC,CAAC;QAC/I,OAAO,EAAE,EAAE,EAAE,IAAa,EAAE,MAAM,EAAE,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAc,EAAE,IAAI,EAAE,KAAK,YAAY,WAAW,IAAI,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IAClJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAA+B,EAAW,EAAE,CACzE,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Coordinator } from "./coordinator.js";
|
|
2
|
+
import { EndpointDirectory, type EndpointCaller } from "./endpoint-directory.js";
|
|
3
|
+
import { type LedgerLimits, type LedgerState } from "./ledger.js";
|
|
4
|
+
import type { OwnedStateFile } from "./owned-state.js";
|
|
5
|
+
import type { FederatedHandoff, Federation } from "./federation.js";
|
|
6
|
+
export type BrokerOptions = Readonly<{
|
|
7
|
+
host: string;
|
|
8
|
+
store: OwnedStateFile<LedgerState>;
|
|
9
|
+
limits: LedgerLimits;
|
|
10
|
+
directory: EndpointDirectory;
|
|
11
|
+
coordinator: Coordinator;
|
|
12
|
+
now?: () => number;
|
|
13
|
+
nodes?: readonly string[];
|
|
14
|
+
steeringEnabled?: boolean;
|
|
15
|
+
federation?: Pick<Federation, "catalog" | "snapshot">;
|
|
16
|
+
}>;
|
|
17
|
+
/** Application commands over the directory and the single delivery ledger. */
|
|
18
|
+
export declare class MessagingBroker {
|
|
19
|
+
readonly options: BrokerOptions;
|
|
20
|
+
private timer;
|
|
21
|
+
private stopped;
|
|
22
|
+
private started;
|
|
23
|
+
private pumping;
|
|
24
|
+
private requested;
|
|
25
|
+
private fault;
|
|
26
|
+
private readonly now;
|
|
27
|
+
constructor(options: BrokerOptions);
|
|
28
|
+
private change;
|
|
29
|
+
start(): Promise<void>;
|
|
30
|
+
register(caller: EndpointCaller, alias: string, succeeds?: string): Promise<{
|
|
31
|
+
id: string;
|
|
32
|
+
alias: string;
|
|
33
|
+
provider: "claude" | "codex";
|
|
34
|
+
host: string;
|
|
35
|
+
}>;
|
|
36
|
+
send(caller: EndpointCaller, address: {
|
|
37
|
+
to: string;
|
|
38
|
+
} | {
|
|
39
|
+
conversation: string;
|
|
40
|
+
}, body: string): Promise<{
|
|
41
|
+
accepted: true;
|
|
42
|
+
conversationId: string;
|
|
43
|
+
deliveryToken: string;
|
|
44
|
+
}>;
|
|
45
|
+
retire(selector: string | {
|
|
46
|
+
endpoint: string;
|
|
47
|
+
}): Promise<{
|
|
48
|
+
cancelled: number;
|
|
49
|
+
ambiguous: number;
|
|
50
|
+
unconfirmed: number;
|
|
51
|
+
}>;
|
|
52
|
+
handoff(peerHost: string, input: FederatedHandoff): Promise<{
|
|
53
|
+
accepted: false;
|
|
54
|
+
code: string;
|
|
55
|
+
} | {
|
|
56
|
+
accepted: true;
|
|
57
|
+
code?: never;
|
|
58
|
+
}>;
|
|
59
|
+
delivery(token: string): Promise<{
|
|
60
|
+
found: false;
|
|
61
|
+
} | {
|
|
62
|
+
safeErrorCode: string;
|
|
63
|
+
found: true;
|
|
64
|
+
state: import("./ledger.js").Outcome | "queued" | "reserved" | "armed" | "accepted";
|
|
65
|
+
terminal: boolean;
|
|
66
|
+
deadlineAt: string;
|
|
67
|
+
} | {
|
|
68
|
+
pendingForMs: number;
|
|
69
|
+
found: true;
|
|
70
|
+
state: import("./ledger.js").Outcome | "queued" | "reserved" | "armed" | "accepted";
|
|
71
|
+
terminal: boolean;
|
|
72
|
+
deadlineAt: string;
|
|
73
|
+
}>;
|
|
74
|
+
refresh(): Promise<{
|
|
75
|
+
routes: {
|
|
76
|
+
id: string;
|
|
77
|
+
alias: string;
|
|
78
|
+
provider: "claude" | "codex";
|
|
79
|
+
host: string;
|
|
80
|
+
}[];
|
|
81
|
+
}>;
|
|
82
|
+
status(): Promise<{
|
|
83
|
+
routes: {
|
|
84
|
+
queueDepth: number;
|
|
85
|
+
lastOperation?: Readonly<{
|
|
86
|
+
outcome: import("./ledger.js").Outcome | "deferred";
|
|
87
|
+
code: string;
|
|
88
|
+
unwritten?: true;
|
|
89
|
+
}> | undefined;
|
|
90
|
+
id: string;
|
|
91
|
+
alias: string;
|
|
92
|
+
provider: "claude" | "codex";
|
|
93
|
+
host: string;
|
|
94
|
+
}[];
|
|
95
|
+
messages: {
|
|
96
|
+
safeErrorCode?: string;
|
|
97
|
+
source: string | undefined;
|
|
98
|
+
target: string | undefined;
|
|
99
|
+
state: import("./ledger.js").Outcome | "queued" | "reserved" | "armed" | "accepted";
|
|
100
|
+
ageMs: number;
|
|
101
|
+
}[];
|
|
102
|
+
retirements: {
|
|
103
|
+
alias: string;
|
|
104
|
+
at: string;
|
|
105
|
+
}[];
|
|
106
|
+
federation?: Readonly<{
|
|
107
|
+
nodes: readonly import("./federation.js").FederationObservation[];
|
|
108
|
+
truncated: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
revision: number;
|
|
111
|
+
safeErrorCode?: string;
|
|
112
|
+
health: string;
|
|
113
|
+
}>;
|
|
114
|
+
private kick;
|
|
115
|
+
private pump;
|
|
116
|
+
close(): Promise<void>;
|
|
117
|
+
}
|