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
@@ -1,7 +1,5 @@
1
1
  import type { GatewayNodeInventory } from "./federation-nodes.js";
2
- import { type GatewayStoreLimits } from "./types.js";
3
- export declare const gatewayDeliveryNoticeModes: readonly ["merged", "verbose", "quiet"];
4
- export type GatewayDeliveryNoticeMode = (typeof gatewayDeliveryNoticeModes)[number];
2
+ import { type LedgerLimits } from "./ledger.js";
5
3
  export type GatewayConfig = {
6
4
  stateDir: string;
7
5
  controlSocketPath: string;
@@ -9,9 +7,7 @@ export type GatewayConfig = {
9
7
  hostId: string;
10
8
  peerNodes: readonly string[];
11
9
  steeringEnabled: boolean;
12
- stallNoticeMs: number;
13
- deliveryNotices?: GatewayDeliveryNoticeMode;
14
- limits: GatewayStoreLimits;
10
+ limits: LedgerLimits;
15
11
  };
16
12
  export declare function defaultGatewayStateDir(env?: NodeJS.ProcessEnv): string;
17
13
  export declare function loadGatewayConfig(env: NodeJS.ProcessEnv, inventory: Pick<GatewayNodeInventory, "host" | "nodes">): GatewayConfig;
@@ -1,9 +1,7 @@
1
1
  import os from "node:os";
2
2
  import path from "node:path";
3
3
  import { BridgeError } from "../errors.js";
4
- import { gatewayPublicSnapshotLimits } from "./types.js";
5
- export const gatewayDeliveryNoticeModes = ["merged", "verbose", "quiet"];
6
- const MAX_STATE_BUDGET = 7 * 1024 * 1024;
4
+ import { ledgerDefaults } from "./ledger.js";
7
5
  const invalid = (message) => { throw new BridgeError("INVALID_GATEWAY_CONFIGURATION", message); };
8
6
  const integer = (env, name, fallback, minimum, maximum) => {
9
7
  const value = env[name];
@@ -32,11 +30,6 @@ export function defaultGatewayStateDir(env = process.env) {
32
30
  ? path.join(env.XDG_STATE_HOME, "agent-embassy")
33
31
  : path.join(os.homedir(), ".local", "state", "agent-embassy"));
34
32
  }
35
- function notices(value) {
36
- const candidate = value ?? "merged";
37
- return gatewayDeliveryNoticeModes.includes(candidate) ? candidate
38
- : invalid("EMBASSY_DELIVERY_NOTICES must be exactly merged, verbose, or quiet.");
39
- }
40
33
  export function loadGatewayConfig(env, inventory) {
41
34
  const stateDir = path.resolve(defaultGatewayStateDir(env));
42
35
  const controlSocketPath = path.join(stateDir, "control.sock");
@@ -44,33 +37,30 @@ export function loadGatewayConfig(env, inventory) {
44
37
  invalid("The gateway state path is too long for a portable private Unix-domain control socket.");
45
38
  const messageDeadlineMs = integer(env, "EMBASSY_MESSAGE_DEADLINE_MS", 14_400_000, 1_000, 86_400_000);
46
39
  const limits = {
47
- maxRoutes: integer(env, "EMBASSY_MAX_ROUTES", 128, 2, gatewayPublicSnapshotLimits.routes),
48
- eventCapacity: integer(env, "EMBASSY_EVENT_CAPACITY", 500, 10, gatewayPublicSnapshotLimits.messages),
49
- eventTtlMs: integer(env, "EMBASSY_EVENT_TTL_MS", 86_400_000, 60_000, 604_800_000),
50
- dedupeCapacity: integer(env, "EMBASSY_DEDUPE_CAPACITY", 2_000, 10, 100_000),
51
- dedupeTtlMs: integer(env, "EMBASSY_DEDUPE_TTL_MS", 300_000, 1_000, 86_400_000),
52
- maxQueueMessages: integer(env, "EMBASSY_MAX_QUEUE_MESSAGES", 100, 1, 10_000), maxQueueMessagesPerRoute: integer(env, "EMBASSY_MAX_QUEUE_PER_ROUTE", 20, 1, 1_000),
53
- maxInFlightMessages: integer(env, "EMBASSY_MAX_IN_FLIGHT", 16, 1, 1_000), maxQueueBytes: integer(env, "EMBASSY_MAX_QUEUE_BYTES", 1_048_576, 1_024, 67_108_864),
54
- maxMessageBytes: integer(env, "EMBASSY_MAX_MESSAGE_BYTES", 16_384, 1, 1_048_576),
55
- messageDeadlineMs,
56
- rateLimitPerRoute: integer(env, "EMBASSY_RATE_LIMIT", 30, 1, 10_000), rateWindowMs: integer(env, "EMBASSY_RATE_WINDOW_MS", 60_000, 1_000, 3_600_000),
40
+ ...ledgerDefaults,
41
+ endpoints: integer(env, "EMBASSY_MAX_ROUTES", 128, 2, ledgerDefaults.endpoints),
42
+ retained: integer(env, "EMBASSY_EVENT_CAPACITY", 500, 10, ledgerDefaults.retained),
43
+ retentionMs: integer(env, "EMBASSY_EVENT_TTL_MS", 86_400_000, 60_000, 604_800_000),
44
+ queued: integer(env, "EMBASSY_MAX_QUEUE_MESSAGES", 100, 1, ledgerDefaults.queued),
45
+ perEndpoint: integer(env, "EMBASSY_MAX_QUEUE_PER_ROUTE", 20, 1, ledgerDefaults.perEndpoint),
46
+ inFlight: integer(env, "EMBASSY_MAX_IN_FLIGHT", 16, 1, ledgerDefaults.inFlight),
47
+ queueBytes: integer(env, "EMBASSY_MAX_QUEUE_BYTES", 1_048_576, 1_024, ledgerDefaults.queueBytes),
48
+ bodyBytes: integer(env, "EMBASSY_MAX_MESSAGE_BYTES", 16_384, 1, ledgerDefaults.bodyBytes),
49
+ deadlineMs: messageDeadlineMs,
50
+ rate: integer(env, "EMBASSY_RATE_LIMIT", 30, 1, 10_000),
51
+ rateWindowMs: integer(env, "EMBASSY_RATE_WINDOW_MS", 60_000, 1_000, 3_600_000),
57
52
  };
58
- if (limits.maxMessageBytes > limits.maxQueueBytes)
53
+ if (limits.bodyBytes > limits.queueBytes)
59
54
  invalid("EMBASSY_MAX_MESSAGE_BYTES cannot exceed EMBASSY_MAX_QUEUE_BYTES.");
60
- if (limits.maxQueueMessagesPerRoute > limits.maxQueueMessages)
55
+ if (limits.perEndpoint > limits.queued)
61
56
  invalid("EMBASSY_MAX_QUEUE_PER_ROUTE cannot exceed EMBASSY_MAX_QUEUE_MESSAGES.");
62
- if (limits.maxInFlightMessages > limits.maxQueueMessages)
57
+ if (limits.inFlight > limits.queued)
63
58
  invalid("EMBASSY_MAX_IN_FLIGHT cannot exceed EMBASSY_MAX_QUEUE_MESSAGES.");
64
- const stateBudget = limits.eventCapacity * 512 + limits.dedupeCapacity * 384 +
65
- limits.maxRoutes * 1_280 + limits.maxQueueMessages * 512;
66
- if (stateBudget > MAX_STATE_BUDGET)
67
- invalid("The combined gateway route, event, dedupe, and queue capacities exceed the durable state byte budget.");
68
59
  return {
69
60
  stateDir, controlSocketPath, allowedHosts: Object.freeze([inventory.host, ...inventory.nodes]),
70
61
  hostId: inventory.host, peerNodes: inventory.nodes,
71
62
  steeringEnabled: toggle(env, "EMBASSY_STEERING_ENABLED"),
72
- stallNoticeMs: Math.min(Math.floor(messageDeadlineMs / 2), 120_000),
73
- deliveryNotices: notices(env.EMBASSY_DELIVERY_NOTICES), limits,
63
+ limits,
74
64
  };
75
65
  }
76
66
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/gateway/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/gateway/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { type Delivery, type Endpoint, type EndpointRef, type LedgerLimits, type LedgerState, type Outcome } from "./ledger.js";
2
+ import { OwnedStateFile } from "./owned-state.js";
3
+ export type WakeResult = Readonly<{
4
+ outcome: Outcome | "deferred";
5
+ code: string;
6
+ unwritten?: true;
7
+ }>;
8
+ export type WakeInput = Readonly<{
9
+ attempt: string;
10
+ target: Endpoint;
11
+ text: string;
12
+ deadline: number;
13
+ steer: boolean;
14
+ messages: readonly Readonly<{
15
+ delivery: Delivery;
16
+ source: Endpoint;
17
+ }>[];
18
+ authorize: (evidence: Readonly<{
19
+ bytes: number;
20
+ sha256: string;
21
+ }>) => Promise<boolean>;
22
+ accepted: (loss: "ambiguous" | "unconfirmed") => Promise<void>;
23
+ }>;
24
+ export interface Destination {
25
+ deliver(input: WakeInput): Promise<WakeResult>;
26
+ close(): Promise<void>;
27
+ }
28
+ export type CoordinatorOptions = Readonly<{
29
+ host: string;
30
+ limits: LedgerLimits;
31
+ store: OwnedStateFile<LedgerState>;
32
+ claude: Destination;
33
+ codex: Destination;
34
+ ssh: Destination;
35
+ /** Exact-ID resolution/attestation, never mutable-name fallback. Remote resolution
36
+ * is authenticated by the owning broker; a catalog observation alone is not authority. */
37
+ resolve: (identity: EndpointRef) => Promise<Endpoint | undefined>;
38
+ now?: () => number;
39
+ attemptId?: () => string;
40
+ assertWritable?: () => void;
41
+ }>;
42
+ /** Owns scheduling and write phases, but never holds the state mutex during provider I/O. */
43
+ export declare class Coordinator {
44
+ private readonly options;
45
+ private readonly running;
46
+ private readonly observations;
47
+ private readonly now;
48
+ private closed;
49
+ constructor(options: CoordinatorOptions);
50
+ observation(identity: EndpointRef): WakeResult | undefined;
51
+ private observed;
52
+ private change;
53
+ wake(target: EndpointRef, steer?: boolean): Promise<void>;
54
+ private run;
55
+ private committedOutcome;
56
+ close(settle?: boolean): Promise<void>;
57
+ }
@@ -0,0 +1,217 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { BridgeError } from "../errors.js";
3
+ import { Ledger, NATIVE_FRAME_RESERVE_BYTES, bodyHash, sameEndpoint } from "./ledger.js";
4
+ import { composeProvenanceEnvelope } from "./provenance-envelope.js";
5
+ /** Owns scheduling and write phases, but never holds the state mutex during provider I/O. */
6
+ export class Coordinator {
7
+ options;
8
+ running = new Map();
9
+ observations = new Map();
10
+ now;
11
+ closed = false;
12
+ constructor(options) {
13
+ this.options = options;
14
+ this.now = options.now ?? Date.now;
15
+ }
16
+ observation(identity) {
17
+ return this.observations.get(JSON.stringify([identity.host, identity.provider, identity.id]));
18
+ }
19
+ observed(identity, result) {
20
+ const key = JSON.stringify([identity.host, identity.provider, identity.id]);
21
+ this.observations.delete(key);
22
+ this.observations.set(key, { outcome: result.outcome,
23
+ code: /^[A-Z][A-Z0-9_]{0,63}$/.test(result.code) ? result.code : "DISPATCH_OUTCOME_AMBIGUOUS" });
24
+ if (this.observations.size > this.options.limits.endpoints + this.options.limits.queued)
25
+ this.observations.delete(this.observations.keys().next().value);
26
+ }
27
+ change(operation) {
28
+ return this.options.store.transact((state) => operation(new Ledger(state, this.options.host, this.options.limits, this.now())));
29
+ }
30
+ wake(target, steer = false) {
31
+ if (this.closed)
32
+ return Promise.resolve();
33
+ const key = JSON.stringify([target.host, target.provider, target.id, steer]);
34
+ const existing = this.running.get(key);
35
+ if (existing)
36
+ return existing;
37
+ // Retiring a ledger row does not interrupt its already-running native turn.
38
+ // Count actual operations too, so retirement cannot bypass the resource cap.
39
+ if (this.running.size >= this.options.limits.inFlight)
40
+ return Promise.resolve();
41
+ const operation = (async () => {
42
+ // Drain successful prefixes, including arrivals coalesced during I/O. A clean
43
+ // busy result ends this pass; the ledger's readyAt bounds the next attempt.
44
+ while (!this.closed && await this.run(target, steer)) { }
45
+ })().finally(() => {
46
+ if (this.running.get(key) === operation)
47
+ this.running.delete(key);
48
+ });
49
+ this.running.set(key, operation);
50
+ return operation;
51
+ }
52
+ async run(identity, steer) {
53
+ const attempt = this.options.attemptId?.() ?? `attempt_${randomUUID()}`;
54
+ let batch = await this.change((ledger) => ledger.reserve(identity, attempt, steer));
55
+ if (!batch.length)
56
+ return false;
57
+ const ids = () => batch.map((d) => d.id);
58
+ try {
59
+ const target = await this.options.resolve(identity);
60
+ if (!target || !sameEndpoint(target, identity)) {
61
+ this.observed(identity, { outcome: "failed", code: "ROUTE_UNREGISTERED" });
62
+ await this.change((ledger) => ledger.settle(ids(), attempt, "failed", "ROUTE_UNREGISTERED"));
63
+ return true;
64
+ }
65
+ const frames = [];
66
+ const sources = [];
67
+ const resolved = new Map();
68
+ let bytes = 0;
69
+ for (let index = 0; index < batch.length; index++) {
70
+ const d = batch[index];
71
+ const key = JSON.stringify(d.source);
72
+ if (!resolved.has(key))
73
+ resolved.set(key, d.source.host !== this.options.host && d.sourceAlias
74
+ ? { ...d.source, alias: d.sourceAlias, handle: d.source.id }
75
+ : await this.options.resolve(d.source));
76
+ const source = resolved.get(key);
77
+ if (!source || !sameEndpoint(source, d.source)) {
78
+ await this.change((ledger) => ledger.settle([d.id], attempt, "failed", "ROUTE_UNREGISTERED"));
79
+ continue;
80
+ }
81
+ const frame = composeProvenanceEnvelope({ sourceProvider: source.provider, recipientProvider: target.provider,
82
+ sourceAlias: source.alias, targetAlias: target.alias, conversationId: d.reply, body: d.body });
83
+ // Count JSON escaping too: the native transports wrap this text in JSON.
84
+ // Leave space for their bounded RPC/identity fields, then authorize against
85
+ // the actual immutable native frame rather than this packing estimate.
86
+ const framedBytes = Buffer.byteLength(JSON.stringify(frame)) + (frames.length ? 2 : 0);
87
+ if (bytes + framedBytes + NATIVE_FRAME_RESERVE_BYTES > this.options.limits.wakeBytes) {
88
+ if (!frames.length) {
89
+ await this.change((ledger) => ledger.settle([d.id], attempt, "failed", "PROVENANCE_ENVELOPE_TOO_LARGE"));
90
+ continue;
91
+ }
92
+ await this.change((ledger) => ledger.defer(batch.slice(index).map((m) => m.id), attempt));
93
+ break;
94
+ }
95
+ bytes += framedBytes;
96
+ sources.push(source);
97
+ frames.push(frame);
98
+ }
99
+ // Some pre-write refusals or frame-size bounds can reduce the reserved prefix.
100
+ const state = await this.options.store.snapshot();
101
+ batch = batch.filter((d) => state.deliveries.some((m) => m.id === d.id && m.state.phase === "reserved" && m.state.attempt === attempt));
102
+ if (!batch.length)
103
+ return false;
104
+ if (frames.length !== batch.length)
105
+ throw new Error("INCOMPLETE_WAKE_PREPARATION");
106
+ const destination = identity.host !== this.options.host ? this.options.ssh : identity.provider === "claude" ? this.options.claude : this.options.codex;
107
+ const result = await destination.deliver({ attempt, target, text: frames.join("\n"),
108
+ messages: batch.map((delivery, i) => ({ delivery, source: sources[i] })),
109
+ deadline: Math.min(...batch.map((d) => d.deadline)), steer,
110
+ authorize: async (evidence) => {
111
+ if (this.closed)
112
+ return false;
113
+ this.options.assertWritable?.();
114
+ // Re-resolve after preparation: a rename requires new envelope bytes, and a
115
+ // replacement must never inherit this operation's exact identity.
116
+ const currentTarget = await this.options.resolve(identity);
117
+ if (!currentTarget || !sameEndpoint(currentTarget, target) || currentTarget.alias !== target.alias || currentTarget.handle !== target.handle)
118
+ return false;
119
+ for (const source of sources) {
120
+ if (source.host !== this.options.host)
121
+ continue; // Owner-attested at destination handoff admission.
122
+ const current = await this.options.resolve(source);
123
+ if (!current || !sameEndpoint(current, source) || current.alias !== source.alias || current.handle !== source.handle)
124
+ return false;
125
+ }
126
+ const authorized = await this.change((ledger) => {
127
+ if (this.closed)
128
+ return false;
129
+ this.options.assertWritable?.();
130
+ return ledger.authorize(ids(), attempt, { ...evidence, bodies: batch.map((d) => bodyHash(d.body)) }, [target, ...sources]);
131
+ });
132
+ this.options.assertWritable?.();
133
+ return authorized && !this.closed;
134
+ },
135
+ accepted: async (loss) => {
136
+ if (this.closed || !await this.change((ledger) => ledger.accept(ids(), attempt, loss))) {
137
+ throw new BridgeError("ACCEPTANCE_UNCONFIRMED", "The operation's acceptance could not be recorded.");
138
+ }
139
+ }, });
140
+ if (result.outcome === "deferred") {
141
+ const expiredMember = (await this.options.store.snapshot()).deliveries.some((d) => ids().includes(d.id) &&
142
+ d.state.phase === "terminal" && d.state.outcome === "expired");
143
+ const clean = await this.change((ledger) => ledger.defer(ids(), attempt, expiredMember ? 0 : 500));
144
+ if (!clean)
145
+ await this.change((ledger) => ledger.lose(ids(), attempt, result.code));
146
+ const outcome = clean ? "deferred" : await this.committedOutcome(ids(), result.code);
147
+ this.observed(identity, { outcome, code: result.code });
148
+ return expiredMember;
149
+ }
150
+ else if (result.outcome === "expired" && result.unwritten) {
151
+ await this.change((ledger) => ledger.unwritten(ids(), attempt));
152
+ this.observed(identity, { outcome: await this.committedOutcome(ids(), result.code), code: result.code });
153
+ }
154
+ else if (result.outcome === "ambiguous" || result.outcome === "unconfirmed") {
155
+ const outcome = await this.change((ledger) => {
156
+ const live = ledger.state.deliveries.filter((d) => ids().includes(d.id) && d.state.phase !== "terminal" &&
157
+ d.state.phase !== "queued" && d.state.attempt === attempt);
158
+ if (live.length > 0 && live.every((d) => d.state.phase === "reserved")) {
159
+ ledger.lose(ids(), attempt, result.code);
160
+ return "deferred";
161
+ }
162
+ const accepted = live.find((d) => d.state.phase === "accepted");
163
+ const outcome = accepted?.state.phase === "accepted" ? accepted.state.loss : "ambiguous";
164
+ ledger.settle(ids(), attempt, outcome, result.code);
165
+ return outcome;
166
+ });
167
+ this.observed(identity, { outcome, code: result.code });
168
+ if (outcome === "deferred")
169
+ return false;
170
+ }
171
+ else {
172
+ await this.change((ledger) => ledger.settle(ids(), attempt, result.outcome, result.code));
173
+ this.observed(identity, result);
174
+ }
175
+ return true;
176
+ }
177
+ catch (error) {
178
+ // A generic error is never evidence of a clean post-write refusal. The recorded
179
+ // phase decides uncertainty; reserved operations alone remain safe to retry.
180
+ const code = error instanceof BridgeError ? error.code : "DISPATCH_OUTCOME_AMBIGUOUS";
181
+ const outcome = await this.change((ledger) => {
182
+ ledger.lose(ids(), attempt, code);
183
+ const results = ledger.state.deliveries.filter((d) => ids().includes(d.id)).map((d) => d.state);
184
+ return ["ambiguous", "unconfirmed", "failed", "cancelled", "expired", "delivered"]
185
+ .find((outcome) => results.some((s) => s.phase === "terminal" && s.outcome === outcome)) ?? "deferred";
186
+ });
187
+ this.observed(identity, { outcome, code });
188
+ return false;
189
+ }
190
+ }
191
+ async committedOutcome(ids, code) {
192
+ const rows = (await this.options.store.snapshot()).deliveries.filter((d) => ids.includes(d.id));
193
+ return ["ambiguous", "unconfirmed", "failed", "cancelled", "expired", "delivered"]
194
+ .find((outcome) => rows.some((d) => d.state.phase === "terminal" && d.state.outcome === outcome)) ??
195
+ (rows.some((d) => d.state.phase === "queued") ? "deferred" : (code === "ROUTE_BUSY" ? "deferred" : "failed"));
196
+ }
197
+ async close(settle = true) {
198
+ this.closed = true;
199
+ let failure;
200
+ if (settle)
201
+ try {
202
+ await this.change((ledger) => ledger.restart());
203
+ }
204
+ catch (error) {
205
+ failure = error;
206
+ }
207
+ // Destination close preserves accepted-turn lifetime until its native transport
208
+ // has actually closed; it does not issue an interrupt or invent completion.
209
+ const closed = await Promise.allSettled([this.options.claude.close(), this.options.codex.close(), this.options.ssh.close()]);
210
+ await Promise.allSettled(this.running.values());
211
+ if (failure)
212
+ throw failure;
213
+ if (closed.some((result) => result.status === "rejected"))
214
+ throw new BridgeError("GATEWAY_CLEANUP_FAILED", "A destination did not confirm cleanup.");
215
+ }
216
+ }
217
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/gateway/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE,QAAQ,EAAE,YAAY,EAAqG,MAAM,aAAa,CAAC;AAE5L,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AA2BrE,6FAA6F;AAC7F,MAAM,OAAO,WAAW;IAMO;IALZ,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC3C,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,GAAG,CAAe;IAC3B,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,OAA2B;QAA3B,YAAO,GAAP,OAAO,CAAoB;QACtD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACrC,CAAC;IAED,WAAW,CAAC,QAAqB;QAC/B,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IAEO,QAAQ,CAAC,QAAqB,EAAE,MAAkB;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO;YAClD,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B,EAAE,CAAC,CAAC;QACnG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;YACrF,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAC;IACrE,CAAC;IAEO,MAAM,CAAI,SAAgC;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAClI,CAAC;IAED,IAAI,CAAC,MAAmB,EAAE,KAAK,GAAG,KAAK;QACrC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,4EAA4E;QAC5E,6EAA6E;QAC7E,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAChF,MAAM,SAAS,GAAG,CAAC,KAAK,IAAI,EAAE;YAC5B,8EAA8E;YAC9E,4EAA4E;YAC5E,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA,CAAC;QAC1D,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,QAAqB,EAAE,KAAc;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,WAAW,UAAU,EAAE,EAAE,CAAC;QACxE,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACpF,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;gBAC3E,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC;gBAC7F,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAe,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;YACzD,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,WAAW;wBAC5F,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE;wBAC5D,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACjC,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC/C,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC,CAAC;oBAC9F,SAAS;gBACX,CAAC;gBACD,MAAM,KAAK,GAAG,yBAAyB,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,CAAC,QAAQ;oBAC3G,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjG,yEAAyE;gBACzE,4EAA4E;gBAC5E,uEAAuE;gBACvE,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvF,IAAI,KAAK,GAAG,WAAW,GAAG,0BAA0B,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBACrF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;wBACnB,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,+BAA+B,CAAC,CAAC,CAAC;wBACzG,SAAS;oBACX,CAAC;oBACD,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC1F,MAAM;gBACR,CAAC;gBACD,KAAK,IAAI,WAAW,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,+EAA+E;YAC/E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;YACxI,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAChC,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACnF,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YACvJ,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACjF,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;gBACzE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK;gBAC1D,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oBAC5B,IAAI,IAAI,CAAC,MAAM;wBAAE,OAAO,KAAK,CAAC;oBAC9B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;oBAChC,4EAA4E;oBAC5E,kEAAkE;oBAClE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAC3D,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,aAAa,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;wBAAE,OAAO,KAAK,CAAC;oBAC3J,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI;4BAAE,SAAS,CAAC,mDAAmD;wBACpG,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBACnD,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;4BAAE,OAAO,KAAK,CAAC;oBACrI,CAAC;oBACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;wBAC9C,IAAI,IAAI,CAAC,MAAM;4BAAE,OAAO,KAAK,CAAC;wBAC9B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;wBAChC,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;oBAC7H,CAAC,CAAC,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;oBAChC,OAAO,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBACpC,CAAC;gBACD,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;oBACvB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;wBACvF,MAAM,IAAI,WAAW,CAAC,wBAAwB,EAAE,mDAAmD,CAAC,CAAC;oBACvG,CAAC;gBACH,CAAC,GACF,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,MAAM,aAAa,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrG,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;gBACjE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnG,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrF,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,OAAO,aAAa,CAAC;YACvB,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC5D,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3G,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBAC9E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU;wBACrG,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;oBAC7D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,EAAE,CAAC;wBACvE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;wBACzC,OAAO,UAAmB,CAAC;oBAC7B,CAAC;oBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;oBAChE,MAAM,OAAO,GAAG,QAAQ,EAAE,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;oBACzF,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBACpD,OAAO,OAAO,CAAC;gBACjB,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxD,IAAI,OAAO,KAAK,UAAU;oBAAE,OAAO,KAAK,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;gBACrG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gFAAgF;YAChF,6EAA6E;YAC7E,MAAM,IAAI,GAAG,KAAK,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B,CAAC;YACtF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;gBAClC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAChG,OAAQ,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,CAAW;qBAC1F,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,IAAI,UAAU,CAAC;YAC3G,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,GAAsB,EAAE,IAAY;QACjE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChG,OAAQ,CAAC,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,CAAW;aAC1F,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;YACjG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,OAAgB,CAAC;QACrB,IAAI,MAAM;YAAE,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,OAAO,GAAG,KAAK,CAAC;YAAC,CAAC;QACvG,gFAAgF;QAChF,4EAA4E;QAC5E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7H,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,IAAI,OAAO;YAAE,MAAM,OAAO,CAAC;QAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC;YAAE,MAAM,IAAI,WAAW,CAAC,wBAAwB,EAAE,wCAAwC,CAAC,CAAC;IACvJ,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import type { Readable, Writable } from "node:stream";
3
+ export declare const CORE_VERSION = "4.0.0";
4
+ type Output = Pick<Writable, "write"> & {
5
+ isTTY?: boolean;
6
+ };
7
+ export type CoreCliDependencies = Readonly<{
8
+ env?: NodeJS.ProcessEnv;
9
+ stdin?: Readable;
10
+ stdout?: Output;
11
+ stderr?: Output;
12
+ signal?: AbortSignal;
13
+ }>;
14
+ export declare function runCoreCli(args: readonly string[], dependencies?: CoreCliDependencies): Promise<number>;
15
+ export {};