agent-embassy 1.7.1 → 1.8.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 (121) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/CONTRIBUTING.md +51 -47
  3. package/README.md +26 -9
  4. package/README.zh-CN.md +22 -9
  5. package/SECURITY.md +48 -35
  6. package/dist/src/gateway/acp-client.d.ts +12 -19
  7. package/dist/src/gateway/acp-client.js +90 -65
  8. package/dist/src/gateway/acp-client.js.map +1 -1
  9. package/dist/src/gateway/acp-provider.d.ts +11 -10
  10. package/dist/src/gateway/acp-provider.js +165 -53
  11. package/dist/src/gateway/acp-provider.js.map +1 -1
  12. package/dist/src/gateway/claude-helper-client.d.ts +2 -43
  13. package/dist/src/gateway/claude-helper-client.js +1 -211
  14. package/dist/src/gateway/claude-helper-client.js.map +1 -1
  15. package/dist/src/gateway/claude-helper-protocol.d.ts +16 -74
  16. package/dist/src/gateway/claude-helper-protocol.js +99 -378
  17. package/dist/src/gateway/claude-helper-protocol.js.map +1 -1
  18. package/dist/src/gateway/claude-helper-supervisor.d.ts +56 -44
  19. package/dist/src/gateway/claude-helper-supervisor.js +265 -456
  20. package/dist/src/gateway/claude-helper-supervisor.js.map +1 -1
  21. package/dist/src/gateway/claude-helper.js +184 -210
  22. package/dist/src/gateway/claude-helper.js.map +1 -1
  23. package/dist/src/gateway/claude-peer.d.ts +20 -87
  24. package/dist/src/gateway/claude-peer.js +310 -1009
  25. package/dist/src/gateway/claude-peer.js.map +1 -1
  26. package/dist/src/gateway/claude-runtime.d.ts +13 -15
  27. package/dist/src/gateway/claude-runtime.js +14 -168
  28. package/dist/src/gateway/claude-runtime.js.map +1 -1
  29. package/dist/src/gateway/cli-copy.d.ts +1 -1
  30. package/dist/src/gateway/cli-copy.en.d.ts +2 -4
  31. package/dist/src/gateway/cli-copy.en.js +3 -4
  32. package/dist/src/gateway/cli-copy.en.js.map +1 -1
  33. package/dist/src/gateway/cli-copy.js +0 -2
  34. package/dist/src/gateway/cli-copy.js.map +1 -1
  35. package/dist/src/gateway/cli-copy.zh-CN.d.ts +2 -4
  36. package/dist/src/gateway/cli-copy.zh-CN.js +3 -4
  37. package/dist/src/gateway/cli-copy.zh-CN.js.map +1 -1
  38. package/dist/src/gateway/cli.d.ts +7 -2
  39. package/dist/src/gateway/cli.js +273 -617
  40. package/dist/src/gateway/cli.js.map +1 -1
  41. package/dist/src/gateway/codex-app-server.d.ts +5 -227
  42. package/dist/src/gateway/codex-app-server.js +18 -1463
  43. package/dist/src/gateway/codex-app-server.js.map +1 -1
  44. package/dist/src/gateway/codex-doctor.d.ts +6 -3
  45. package/dist/src/gateway/codex-doctor.js +77 -98
  46. package/dist/src/gateway/codex-doctor.js.map +1 -1
  47. package/dist/src/gateway/codex-local-transport.d.ts +1 -6
  48. package/dist/src/gateway/codex-local-transport.js +8 -10
  49. package/dist/src/gateway/codex-local-transport.js.map +1 -1
  50. package/dist/src/gateway/codex-stateless-transport.d.ts +114 -0
  51. package/dist/src/gateway/codex-stateless-transport.js +1108 -0
  52. package/dist/src/gateway/codex-stateless-transport.js.map +1 -0
  53. package/dist/src/gateway/config.d.ts +2 -9
  54. package/dist/src/gateway/config.js +62 -100
  55. package/dist/src/gateway/config.js.map +1 -1
  56. package/dist/src/gateway/control.d.ts +36 -90
  57. package/dist/src/gateway/control.js +464 -1159
  58. package/dist/src/gateway/control.js.map +1 -1
  59. package/dist/src/gateway/dashboard-copy.d.ts +1 -1
  60. package/dist/src/gateway/dashboard-copy.en.d.ts +3 -26
  61. package/dist/src/gateway/dashboard-copy.en.js +14 -37
  62. package/dist/src/gateway/dashboard-copy.en.js.map +1 -1
  63. package/dist/src/gateway/dashboard-copy.js +3 -26
  64. package/dist/src/gateway/dashboard-copy.js.map +1 -1
  65. package/dist/src/gateway/dashboard-copy.zh-CN.d.ts +3 -26
  66. package/dist/src/gateway/dashboard-copy.zh-CN.js +14 -37
  67. package/dist/src/gateway/dashboard-copy.zh-CN.js.map +1 -1
  68. package/dist/src/gateway/dashboard-model.d.ts +6 -23
  69. package/dist/src/gateway/dashboard-model.js +37 -131
  70. package/dist/src/gateway/dashboard-model.js.map +1 -1
  71. package/dist/src/gateway/dashboard.d.ts +0 -6
  72. package/dist/src/gateway/dashboard.js +0 -6
  73. package/dist/src/gateway/dashboard.js.map +1 -1
  74. package/dist/src/gateway/live-dashboard-app/app.js +9 -32
  75. package/dist/src/gateway/live-dashboard-command.js +2 -2
  76. package/dist/src/gateway/live-dashboard-command.js.map +1 -1
  77. package/dist/src/gateway/live-dashboard-http.d.ts +1 -1
  78. package/dist/src/gateway/live-dashboard-http.js +2 -2
  79. package/dist/src/gateway/live-dashboard-http.js.map +1 -1
  80. package/dist/src/gateway/progress-watch-machine.d.ts +1 -37
  81. package/dist/src/gateway/progress-watch-machine.js +4 -15
  82. package/dist/src/gateway/progress-watch-machine.js.map +1 -1
  83. package/dist/src/gateway/providers.d.ts +55 -195
  84. package/dist/src/gateway/providers.js +608 -2465
  85. package/dist/src/gateway/providers.js.map +1 -1
  86. package/dist/src/gateway/server.d.ts +16 -25
  87. package/dist/src/gateway/server.js +164 -251
  88. package/dist/src/gateway/server.js.map +1 -1
  89. package/dist/src/gateway/service.d.ts +146 -448
  90. package/dist/src/gateway/service.js +1670 -6142
  91. package/dist/src/gateway/service.js.map +1 -1
  92. package/dist/src/gateway/state-v2-to-v3.d.ts +23 -0
  93. package/dist/src/gateway/state-v2-to-v3.js +994 -0
  94. package/dist/src/gateway/state-v2-to-v3.js.map +1 -0
  95. package/dist/src/gateway/store.d.ts +54 -309
  96. package/dist/src/gateway/store.js +1560 -3524
  97. package/dist/src/gateway/store.js.map +1 -1
  98. package/dist/src/gateway/types.d.ts +175 -228
  99. package/dist/src/gateway/types.js +114 -252
  100. package/dist/src/gateway/types.js.map +1 -1
  101. package/docs/CONFIGURATION.md +22 -9
  102. package/docs/CONFIGURATION.zh-CN.md +21 -9
  103. package/docs/DASHBOARD.md +10 -10
  104. package/docs/DASHBOARD.zh-CN.md +3 -3
  105. package/docs/DELIVERY.md +4 -4
  106. package/docs/DELIVERY.zh-CN.md +4 -4
  107. package/docs/GATEWAY-ARCHITECTURE.md +158 -187
  108. package/package.json +1 -1
  109. package/skills/embassy-peer/SKILL.md +28 -22
  110. package/dist/src/gateway/codex-registration-generation.d.ts +0 -5
  111. package/dist/src/gateway/codex-registration-generation.js +0 -19
  112. package/dist/src/gateway/codex-registration-generation.js.map +0 -1
  113. package/dist/src/gateway/codex-registration-succession.d.ts +0 -209
  114. package/dist/src/gateway/codex-registration-succession.js +0 -588
  115. package/dist/src/gateway/codex-registration-succession.js.map +0 -1
  116. package/dist/src/gateway/compatibility.d.ts +0 -22
  117. package/dist/src/gateway/compatibility.js +0 -23
  118. package/dist/src/gateway/compatibility.js.map +0 -1
  119. package/dist/src/gateway/delivery-machine.d.ts +0 -235
  120. package/dist/src/gateway/delivery-machine.js +0 -540
  121. package/dist/src/gateway/delivery-machine.js.map +0 -1
@@ -3,28 +3,15 @@ import { type GatewayControlHandlers, type GatewaySnapshotObservation } from "./
3
3
  import { publishGatewayDashboard } from "./dashboard.js";
4
4
  import type { CodexDoctorResult } from "./codex-doctor.js";
5
5
  import { GatewayStore } from "./store.js";
6
- import { type GatewayProvider, type GatewayPublicSnapshot, type PrivateEndpointIdentity, type PrivateRouteBinding, type RouteState } from "./types.js";
7
- export type GatewayAdapterRouteState = Extract<RouteState, "idle" | "busy" | "awaiting_approval">;
8
- export type GatewayAdapterRouteObservationState = GatewayAdapterRouteState | "stale";
9
- export type GatewayAdapterDiscovery = {
10
- /** Canonical public alias. The service never lowercases or truncates it. */
6
+ import { type GatewayPreparedWriteEvidence, type GatewayProvider, type GatewayPublicSnapshot, type LogicalRouteBinding } from "./types.js";
7
+ export type GatewayAdapterRouteState = "idle" | "busy" | "awaiting_approval";
8
+ export type GatewayAdapterRouteObservationState = GatewayAdapterRouteState | "unobserved";
9
+ export type GatewayAdapterDiscovery = Readonly<{
11
10
  alias: string;
12
- /** Stable provider identity; for Claude this is its native session UUID. */
13
11
  routeHandle: string;
14
12
  kind: "interactive";
15
13
  state: GatewayAdapterRouteState;
16
- };
17
- /**
18
- * One bounded discovery pass. `complete` is false when the provider stopped
19
- * before it could inspect the full registry; such a pass may be displayed but
20
- * cannot authorize selection restoration.
21
- */
22
- export type GatewayAdapterDiscoverySnapshot = {
23
- peers: readonly GatewayAdapterDiscovery[];
24
- complete: boolean;
25
- /** Bounded registry-shape evidence; never carries record contents or paths. */
26
- registry?: GatewayAdapterRegistryObservation;
27
- };
14
+ }>;
28
15
  export type GatewayAdapterRegistryObservation = Readonly<{
29
16
  entriesScanned: number;
30
17
  parseableRecords: number;
@@ -33,223 +20,129 @@ export type GatewayAdapterRegistryObservation = Readonly<{
33
20
  count: number;
34
21
  }>[];
35
22
  }>;
36
- export type GatewayAdapterDeliveryState = "transport_uncertain" | "transport_written" | "held" | "released" | "unconfirmed" | "denied" | "expired" | "ambiguous" | "completed" | "failed" | "cancelled";
37
- export type GatewayAdapterDelivery = {
38
- messageId: string;
39
- state: GatewayAdapterDeliveryState;
23
+ export type GatewayAdapterDiscoverySnapshot = Readonly<{
24
+ peers: readonly GatewayAdapterDiscovery[];
25
+ complete: boolean;
26
+ registry?: GatewayAdapterRegistryObservation;
27
+ }>;
28
+ export type GatewayAdapterRouteObservation = Readonly<{
29
+ route: LogicalRouteBinding;
30
+ state: GatewayAdapterRouteObservationState;
31
+ observedAt: string;
40
32
  safeErrorCode?: string;
41
- /** Transient, bounded by the adapter. Never copied into normalized state. */
42
- replyText?: string;
43
- };
44
- /**
45
- * One provider-wide Codex endpoint transition. Native thread and generation
46
- * identifiers stay inside this controller boundary and are never projected.
47
- */
48
- export type GatewayAdapterEndpointRefresh = Readonly<{
49
- previous: PrivateEndpointIdentity;
50
- current: PrivateEndpointIdentity;
51
- routes: readonly Readonly<{
52
- routeHandle: string;
53
- state: GatewayAdapterRouteState;
54
- }>[];
55
33
  }>;
56
- export type GatewayAdapterCallbacks = {
57
- onDelivery: (event: GatewayAdapterDelivery) => void;
58
- onRouteState: (event: {
59
- endpoint: PrivateEndpointIdentity & {
60
- routeHandle: string;
61
- };
62
- state: GatewayAdapterRouteObservationState;
63
- safeErrorCode?: string;
64
- }) => void;
65
- /** A callback user frame has no conversation ID; correlation is service-owned. */
66
- onClaudeReply: (event: {
67
- endpoint: PrivateEndpointIdentity & {
68
- routeHandle: string;
69
- };
34
+ export type GatewayAdapterNativeEndpoint = Readonly<{
35
+ provider: GatewayProvider;
36
+ hostId: string;
37
+ routeHandle: string;
38
+ }>;
39
+ export type GatewayAdapterCallbacks = Readonly<{
40
+ onRouteState: (event: GatewayAdapterRouteObservation) => void;
41
+ onClaudeReply: (event: Readonly<{
42
+ endpoint: GatewayAdapterNativeEndpoint;
70
43
  text: string;
71
- }) => void;
72
- onClaudeMessage?: (event: {
73
- endpoint: PrivateEndpointIdentity & {
74
- routeHandle: string;
75
- };
44
+ }>) => void;
45
+ onClaudeMessage?: (event: Readonly<{
46
+ endpoint: GatewayAdapterNativeEndpoint;
76
47
  sourceAlias: string;
77
48
  targetAlias: string;
78
49
  text: string;
79
50
  receiptHandle?: string;
80
- }) => void;
81
- /** Bounded provider protocol diagnostics; never includes raw frame data. */
82
- onProtocolNotice?: (event: {
51
+ }>) => void;
52
+ onProtocolNotice?: (event: Readonly<{
83
53
  code: string;
84
- }) => void;
85
- /** Provider-wide exact Codex endpoint-generation replacement. */
86
- onEndpointRefresh?: (event: GatewayAdapterEndpointRefresh) => void;
87
- };
88
- export type GatewayAdapterStart = {
54
+ }>) => void;
55
+ }>;
56
+ export type GatewayAdapterStart = Readonly<{
89
57
  health: "healthy" | "degraded";
90
58
  safeErrorCode?: string;
91
- /** One config-declared, Embassy-owned route observed without spawning. */
92
59
  ownedRoute?: Readonly<{
93
60
  alias: string;
94
61
  routeHandle: string;
95
62
  state: GatewayAdapterRouteState;
96
63
  }>;
97
- };
98
- export type GatewayAdapterDispatchResult = {
99
- state: "pending";
100
- }
101
- /** Provider accepted the turn, but its final result/reply remains pending. */
102
- | {
103
- state: "accepted";
104
- } | {
64
+ }>;
65
+ export type GatewayAdapterDispatchResult = Readonly<{
105
66
  state: "deferred";
106
67
  safeErrorCode?: string;
107
- } | {
108
- state: "delivered" | "unconfirmed" | "failed" | "ambiguous" | "cancelled";
68
+ }> | Readonly<{
69
+ state: "delivered" | "unconfirmed" | "failed" | "ambiguous" | "expired" | "cancelled";
109
70
  safeErrorCode?: string;
110
71
  replyText?: string;
111
- };
112
- /**
113
- * One transient, service-authorized provider dispatch. Provenance fields are
114
- * carried beside the raw body so the provider can frame it exactly once at
115
- * its semantic write boundary. They must not be projected or persisted.
116
- */
117
- export type GatewayAdapterDispatchInput = {
72
+ }>;
73
+ export type GatewayAdapterDispatchInput = Readonly<{
74
+ attemptId: string;
118
75
  sourceAlias: string;
119
76
  sourceProvider: GatewayProvider;
120
77
  targetAlias: string;
121
78
  conversationId: string;
122
- binding: PrivateRouteBinding;
79
+ binding: LogicalRouteBinding;
123
80
  authorization: "selected_route" | "native_reply";
124
81
  messageId: string;
125
82
  text: string;
126
83
  expectsReply: boolean;
127
84
  deadlineAt: string;
128
85
  steer?: true;
129
- /** Broker-derived display metadata; never grants or persists authority. */
130
86
  progressWatchActive?: true;
131
- /** Older accepted rows observed when this exact STEER left the queue. */
132
87
  queuedAhead?: number;
133
- };
134
- /**
135
- * Narrow provider boundary. Production adapters wrap ClaudePeerAdapter or one
136
- * exact CodexAppServerConnector; tests use in-memory fakes. Implementations
137
- * must never retry a dispatch after a write may have occurred.
138
- */
88
+ authorizeWrite: (evidence: GatewayPreparedWriteEvidence & Readonly<{
89
+ attemptId: string;
90
+ }>) => Promise<boolean>;
91
+ onAccepted: (evidence: Readonly<{
92
+ attemptId: string;
93
+ }>) => Promise<void>;
94
+ }>;
139
95
  export interface GatewayProviderAdapter {
140
- readonly identity: PrivateEndpointIdentity;
96
+ readonly identity: Readonly<{
97
+ provider: GatewayProvider;
98
+ hostId: string;
99
+ }>;
141
100
  readonly protocol: string;
142
101
  readonly protocolVersion: string;
143
- /** Latest already-read Claude registry evidence; this accessor performs no I/O. */
144
102
  latestRegistryObservation?(): GatewayAdapterRegistryObservation | undefined;
145
- /** Releases the provider's exact current-generation activation latch. */
146
- activateEndpointGeneration(endpointGeneration: string): void;
147
- /** Releases one selector claim after controller-side activation fails. */
148
- releaseEndpointRefreshSelectorClaim?(endpointGeneration: string): void;
149
- /** Re-publishes pending transition evidence on one observed recovery edge. */
150
- rearmEndpointRefreshActivation?(endpointGeneration: string): void;
151
103
  initialize(callbacks: GatewayAdapterCallbacks): Promise<GatewayAdapterStart>;
104
+ observeLogicalRoute?(input: Readonly<{
105
+ alias: string;
106
+ routeHandle: string;
107
+ registrationId: string;
108
+ }>): void;
109
+ forgetLogicalRoute?(registrationId: string): void;
152
110
  discoverClaudePeers?(): Promise<GatewayAdapterDiscoverySnapshot>;
153
- selectRoute(input: {
111
+ selectRoute?(input: Readonly<{
154
112
  alias: string;
155
113
  routeHandle: string;
156
- }): Promise<{
114
+ }>): Promise<{
157
115
  routeHandle: string;
158
116
  state: GatewayAdapterRouteState;
159
- endpointRefresh?: GatewayAdapterEndpointRefresh;
160
117
  }>;
161
- /** Claude-only workspace guard. Codex registration has no workspace gate. */
162
118
  assertWorkspaceDisjoint?(routeHandle: string, stateRoot: string): Promise<void>;
163
- /** Converts a UDS connect-back capability to an exact already-observed handle. */
164
119
  resolveReplyAddress?(address: string): Promise<{
165
120
  routeHandle: string;
166
121
  }>;
167
- advertiseNativeSourcePeer?(input: {
122
+ advertiseNativeSourcePeer?(input: Readonly<{
168
123
  alias: string;
169
124
  sourceProvider: GatewayProvider;
170
125
  cwd: string;
171
- }): Promise<void>;
126
+ }>): Promise<void>;
172
127
  unadvertiseNativeSourcePeer?(alias: string): Promise<void>;
173
128
  updateNativeSourcePeerStatus?(alias: string, status: "idle" | "busy" | "waiting"): Promise<void>;
174
129
  updateNativeInboundStatus?(receiptHandle: string, status: "held" | "delivered" | "denied" | "expired", diagnosticCode?: string): Promise<void>;
175
- notifyNativeInboundProgress?(receiptHandle: string, progress: {
130
+ notifyNativeInboundProgress?(receiptHandle: string, progress: Readonly<{
176
131
  kind: "stall";
177
- reason: "ROUTE_BUSY" | "ROUTE_UNAVAILABLE" | "CODEX_ROUTE_STALE" | "AWAITING_EXTERNAL_APPROVAL";
132
+ reason: "ROUTE_BUSY" | "ROUTE_UNAVAILABLE" | "AWAITING_EXTERNAL_APPROVAL";
178
133
  queuedForMs: number;
179
- }): Promise<void>;
180
- releaseNativeInboundReceipt?(receiptHandle: string): boolean | Promise<boolean>;
181
- /** Fence new native ingress while keeping receipt writes available. */
182
- quiesceNativeInbound?(): Promise<void>;
183
- /** Claude-only exact listener-generation succession controls. */
184
- currentNativeCodexPeerGeneration?(alias: string): string;
185
- prepareNativeCodexPeerGeneration?(input: {
186
- alias: string;
187
- cwd: string;
188
- generation: string;
189
- currentGeneration?: string;
190
- }): Promise<void>;
191
- quiesceNativeCodexPeerGeneration?(generation: string): Promise<void>;
192
- observeNativeCodexSuccessionBarrier?(generation: string): Readonly<{
193
- generation: string;
194
- activeGenerationMatched: boolean;
195
- ingressQuiesced: boolean;
196
- monitorFrozen: boolean;
197
- discoveryInFlight: boolean;
198
- pendingOutboundReceipts: number;
199
- pendingInboundReceipts: number;
200
- rejectedInboundSettlements: number;
201
- clean: boolean;
202
- }> | Promise<Readonly<{
203
- generation: string;
204
- activeGenerationMatched: boolean;
205
- ingressQuiesced: boolean;
206
- monitorFrozen: boolean;
207
- discoveryInFlight: boolean;
208
- pendingOutboundReceipts: number;
209
- pendingInboundReceipts: number;
210
- rejectedInboundSettlements: number;
211
- clean: boolean;
212
- }>>;
213
- publishPreparedNativeCodexPeer?(input: {
214
- currentGeneration: string;
215
- preparedGeneration: string;
216
- }): Promise<"published" | "not_published" | "unknown">;
217
- activatePreparedNativeCodexPeerGeneration?(generation: string): void | Promise<void>;
218
- cleanupPreparedNativeCodexPeerGeneration?(generation: string): Promise<void>;
219
- resumeNativeCodexPeerGeneration?(generation: string): void | Promise<void>;
220
- rollbackPreparedNativeCodexPeerGeneration?(input: {
221
- preparedGeneration: string;
222
- resumeGeneration: string;
223
- }): Promise<void>;
224
- retireNativeCodexPeerGeneration?(input: {
225
- retiredGeneration: string;
226
- protectedActiveGeneration: string;
227
- }): Promise<void>;
228
- purgeNativeCodexPeerGenerationReplyCapabilities?(generation: string): number | Promise<number>;
229
- /** Codex-only private provider-work barrier for one exact task route. */
230
- observeRouteSuccessionBarrier?(routeHandle: string): Readonly<{
231
- routePresent: boolean;
232
- connection: string;
233
- routeStatus: string;
234
- queueDepth: number;
235
- hasActiveTurn: boolean;
236
- requestInFlight: boolean;
237
- routeCreationInFlight: boolean;
238
- routeReleaseInFlight: boolean;
239
- pendingReplyCorrelations: number;
240
- pendingCallbacks: number;
241
- clean: boolean;
242
- }>;
134
+ }>): Promise<void>;
135
+ releaseNativeInboundReceipt?(receiptHandle: string): Promise<boolean>;
243
136
  dispatch(input: GatewayAdapterDispatchInput): Promise<GatewayAdapterDispatchResult>;
244
137
  releaseRoute?(routeHandle: string): Promise<void>;
245
138
  close(): Promise<void>;
246
139
  }
247
140
  type GatewayServiceTimer = ReturnType<typeof setTimeout>;
248
- type GatewayServiceTimers = {
141
+ type GatewayServiceTimers = Readonly<{
249
142
  setTimeout: (callback: () => void, delayMs: number) => GatewayServiceTimer;
250
143
  clearTimeout: (timer: GatewayServiceTimer) => void;
251
- };
252
- export type GatewayServiceOptions = {
144
+ }>;
145
+ export type GatewayServiceOptions = Readonly<{
253
146
  config: GatewayConfig;
254
147
  adapters?: readonly GatewayProviderAdapter[];
255
148
  store?: GatewayStore;
@@ -257,11 +150,8 @@ export type GatewayServiceOptions = {
257
150
  now?: () => Date;
258
151
  nativePeerCwd?: string;
259
152
  timers?: GatewayServiceTimers;
260
- /** Test seam for opaque listener generations; production remains random. */
261
- successionGeneration?: () => string;
262
- /** Bounded local process evidence; never routing authority. */
263
153
  codexDoctor?: () => Promise<CodexDoctorResult>;
264
- };
154
+ }>;
265
155
  export declare class GatewayService {
266
156
  readonly config: GatewayConfig;
267
157
  readonly store: GatewayStore;
@@ -270,302 +160,110 @@ export declare class GatewayService {
270
160
  private readonly now;
271
161
  private readonly timers;
272
162
  private readonly nativePeerCwd;
273
- private readonly successionGeneration;
274
163
  private readonly codexDoctor;
275
- private readonly mutex;
276
- private readonly routeBindings;
277
- private readonly routeStates;
278
- private readonly bindingAliases;
164
+ private readonly connectors;
165
+ private readonly routeObservations;
279
166
  private readonly candidates;
280
- private availablePeers;
281
- private readonly registryEvidenceByConnector;
282
- private readonly registryAdaptersWithParseableRecords;
283
167
  private readonly conversations;
284
168
  private readonly messageContexts;
285
- private readonly providerTurnContinuations;
286
- private readonly activeDispatchByTarget;
287
- private readonly scheduledDispatchTargets;
288
- private readonly dispatchRunnerTargets;
289
- private readonly heldRedispatchTimers;
169
+ private readonly activeAttempts;
170
+ private readonly reserveOperations;
171
+ private readonly inboundOperations;
290
172
  private readonly pendingClaudeReplies;
291
- private readonly deliveryTrackers;
292
- private readonly deliveryTokens;
173
+ private readonly nativeReceipts;
174
+ private readonly progressWatches;
175
+ private readonly progressWatchEvents;
176
+ private readonly dispatchRunners;
177
+ private readonly steerRunners;
178
+ private readonly startingTargets;
293
179
  private readonly runtimeAlerts;
294
- private readonly activityEvents;
295
- private activitySequence;
296
- private readonly detachedReceiptWrites;
297
- private readonly nativeIngressByConversation;
298
- private readonly callbackQueue;
299
- /**
300
- * Endpoint replacement is authority-bearing lifecycle evidence, not an
301
- * ordinary refreshable observation. Keep one coalesced slot outside the
302
- * bounded callback queue so delivery evidence can never displace it (or be
303
- * displaced by it).
304
- */
305
- private endpointRefreshCallback;
306
- private activeEndpointRefreshCallback;
307
- private endpointRefreshRetryRequested;
308
- private endpointRefreshConflictBoundary;
309
- private activeEndpointRefreshCallbackKey;
310
- private endpointRefreshCallbackPoisoned;
311
- private endpointRefreshConflictPending;
312
- /** Last successfully activated transition per allowed Codex host. */
313
- private readonly activatedEndpointRefreshes;
314
- /** Durable reanchors awaiting their exact native-listener activation. */
315
- private readonly durablyAppliedEndpointRefreshes;
316
- /** Selector transitions staged until their exact registration owns a helper. */
317
- private readonly pendingSelectorEndpointActivations;
318
- /** Process-local dedupe for automatic public activity rows across retries. */
319
- private readonly endpointRefreshActivityKeys;
320
- private callbackWorker;
321
- private callbackScheduled;
322
- private readonly callbackCapacity;
323
- private readonly deliveryCallbackReserve;
324
- private readonly deliveryTokenCapacity;
325
- private readonly providerDispatchInFlightMessageIds;
326
- private readonly connectorFreshnessDeadlineAt;
327
- private lifecycleTimer;
328
- private lifecyclePublishPending;
329
- private nextDashboardRefreshAt;
330
- private nextClaudeDiscoveryAt;
331
- private claudeDiscoveryScheduled;
332
- private claudeDiscoveryInFlight;
333
- private codexDoctorTimer;
334
- private codexDoctorInFlight;
335
- private codexDoctorResult;
336
- private nextProgressWatchAt;
337
180
  private control;
338
- /** Coarse controller mutation revision exposed by `health`. */
181
+ private wakeTimer;
182
+ private nextDiscoveryAt;
183
+ private nextDoctorAt;
184
+ private codexDoctorResult;
339
185
  private revision;
340
- /**
341
- * Process-local semantic public-snapshot clock. The first observation
342
- * establishes revision zero; a new GatewayService process resets it.
343
- */
344
186
  private snapshotRevision;
345
187
  private snapshotFingerprint;
346
188
  private running;
347
189
  private closing;
348
190
  private closeInFlight;
349
- private acceptingCallbacks;
350
- private dashboardHealthy;
351
- /** Route-scoped fences; unrelated Codex registrations remain dispatchable. */
352
- private readonly codexSuccessionDispatchFrozen;
353
- private readonly codexSuccessionPoisoned;
354
- /**
355
- * Exact stale authority whose process-owned native advertisement was already
356
- * removed, but whose durable orphan deletion did not commit. Keep dispatch
357
- * frozen and permit only the same exact cleanup transaction to retry.
358
- */
359
- private readonly codexOrphanCleanupPending;
360
- private codexSuccessionState;
361
- private pendingCodexSuccessionRecovery;
362
- /**
363
- * Exact active identity. It changes only through the journaled succession
364
- * machine; ordinary unregister/register cannot repurpose one listener.
365
- */
366
- private readonly codexRegistrationLocks;
367
191
  constructor(options: GatewayServiceOptions);
368
192
  start(signal?: AbortSignal): Promise<void>;
369
193
  close(): Promise<void>;
370
194
  private closeOnce;
371
195
  handlers(): GatewayControlHandlers;
372
196
  snapshot(): Promise<GatewayPublicSnapshot>;
373
- private captureRegistryObservation;
374
- private connectorsWithRegistry;
375
- private recordConnectorFreshness;
376
- private codexDoctorConditions;
377
- private refreshCodexDoctor;
378
- private scheduleCodexDoctor;
379
197
  observeSnapshot(): Promise<GatewaySnapshotObservation>;
380
- private fingerprintSnapshot;
381
- private callbacksFor;
382
- private enqueueCallback;
383
- private enqueueEndpointRefreshCallback;
384
- private poisonEndpointRefreshCallbacks;
385
- private hasPendingCallbackWork;
386
- private enqueueCallbackWorkerOnly;
387
- private drainCallbackQueueLocked;
388
- /**
389
- * A selector can synchronously admit callbacks while its promise is still
390
- * running under the service mutex. Drain exactly the ordinary work that was
391
- * retained before the selector returned before applying a returned endpoint
392
- * transition. Delivery evidence wins within that fixed snapshot; callbacks
393
- * admitted while it is reduced remain queued for the ordinary worker, and
394
- * the dedicated endpoint-transition slot is never consumed recursively.
395
- */
396
- private drainSelectorCallbackSnapshotLocked;
397
- private failClosedEndpointRefreshConflict;
398
- private requireEndpointRefreshUnconflicted;
399
- private isTerminalAdapterDelivery;
400
- /**
401
- * Delivery evidence observed strictly before the deadline must reach the
402
- * reducer before its deadline event, even when callback scheduling is late.
403
- * Evidence observed at/after the cutoff cannot reopen the terminal machine.
404
- */
405
- private drainPreDeadlineDeliveryCallbacksLocked;
406
- /**
407
- * A provider may synchronously emit a terminal callback before its dispatch
408
- * promise resolves to `pending`. Consume those already-retained callbacks
409
- * before interpreting `pending` as successful provider acceptance, otherwise
410
- * the sender can observe a false delivered result that wins the terminal
411
- * race against the queued failure.
412
- */
413
- private drainDeliveryCallbacksForMessageLocked;
414
- private adapter;
415
- private assertClaudeWorkspaceDisjoint;
416
- private contextTargetBinding;
417
- private recoverCodexSuccessionAfterRestartLocked;
418
- /**
419
- * Rebuild process-owned route and listener authority for retained Codex
420
- * registrations during staged startup. The provider's selectRoute performs
421
- * the exact loaded/list + history-free resume proof; durable state advances
422
- * only after the new native advertisement and status are live.
423
- */
424
- private reactivateRetainedCodexRoutesAfterRestartLocked;
425
- private completePendingCodexSuccessionRecoveryLocked;
426
- private assertPendingCodexSuccessionRecoveryMatch;
427
- private requireCurrentNativeCodexGeneration;
428
- private nextCodexSuccessionGeneration;
429
- private successionStoreIdentity;
430
- private sameSuccessionStoreIdentity;
431
- private reconcilePreparedCodexSuccessionAfterUnknownCommit;
432
- private requireSuccessionMethod;
433
- private succeedCodexRegistration;
434
- private driveCodexSuccessionLocked;
435
- private recoverCodexSuccessionLocked;
436
- private successionNewRegistration;
437
- private codexSuccessionFailurePhase;
438
- private executeCodexSuccessionEffectLocked;
439
- private successionOldRegistration;
440
- private quiesceAndDrainPoisonedSuccessionLocked;
441
- private codexRouteSuccessionQuiet;
442
- private conversationTouchesAliases;
443
- private successionServiceStateClean;
444
- private purgeSuccessionTransientState;
445
- private codexSuccessionPoisonBarrierCleanLocked;
446
- private codexSuccessionBarrierCleanLocked;
447
- private rescheduleIdleRoutesLocked;
448
- private codexSuccessionIsStable;
449
- private requireUnchangedStaleCodexOrphan;
450
- private nativeCodexOrphanBarrierClean;
451
- private endpointCallbacksQuiet;
198
+ private health;
199
+ private installOwnedRoute;
200
+ private observeLoadedRoutes;
201
+ private observeRoute;
202
+ private forgetRoute;
203
+ private adapterFor;
204
+ private claudeAdapter;
205
+ private advertise;
206
+ private unadvertise;
207
+ private reconcileAdvertisement;
208
+ private reconcileUnadvertisement;
209
+ private removeOwnedRoute;
210
+ private recordActivity;
452
211
  private registerCodex;
453
- private lockCodexRegistration;
454
- private rollbackCodexRegistration;
455
212
  private unregisterCodex;
456
- private finalizeStaleCodexOrphanRemovalLocked;
457
- private removeStaleCodexRegistration;
458
- private discoveryPublicFingerprint;
459
- private schedulePeriodicClaudeDiscovery;
460
- private refreshClaudeDiscoveryPeriodically;
461
- private refreshClaudeDiscovery;
462
- private renameClaudeRoute;
463
- private claudeCandidate;
464
- private activatePersistedClaudeCandidate;
465
- private validatePersistedClaudeCandidate;
466
- private commitPreparedClaudeRebind;
467
- private selectClaudeCandidate;
468
- private replaceClaudeSelectionCandidate;
469
- private resolveSelectedClaudeDestination;
470
- private inferCodexAlias;
471
- private assertPairThreadAttestation;
472
- private pairRoutes;
473
- private unpairRoutes;
474
- private assertLiveConsentEndpoints;
475
- private removeConsentEdge;
213
+ private removeCodexRegistration;
476
214
  private selectClaude;
477
- private selectAndPairClaude;
478
- private rollbackFreshClaudeSelection;
479
215
  private unselectClaude;
480
- private selectedClaudeRoute;
481
- private registerOrRebind;
482
- private rememberBinding;
483
- private reanchorQueuedMessageContexts;
484
- private forgetBinding;
485
- private verifyCodex;
486
- private verifyClaude;
487
- private acceptedControlResult;
488
- private reserveDeliveryToken;
489
- private armDeliveryTracker;
490
- private isTerminalDeliveryState;
491
- private settlementDeliveryState;
492
- private pruneDeliveryTrackers;
493
- private addRuntimeAlert;
494
- private releaseNativeReceiptLocked;
495
- /**
496
- * Native `held` is progress, not terminal delivery or approval. Emit it
497
- * only after this exact message is known to be waiting, or after its prompt
498
- * dispatch threshold elapses. A clean pre-write may retry; an ambiguous
499
- * write is never replayed, and neither path consumes the terminal receipt.
500
- */
501
- private publishNativeHeldLocked;
502
- private nativeReceiptNotificationFor;
503
- private sendNativeReceiptLocked;
504
- private deliveryCorrelation;
505
- private eventTime;
506
- private normalizeDeliverySafeCode;
507
- private planRouteInFlightSettlementsLocked;
508
- private planRoutesInFlightSettlementsLocked;
509
- private planConsentEdgeInFlightSettlementsLocked;
510
- private purgeConsentEdgeCapabilitiesLocked;
511
- private settleDeliveryStoreLocked;
512
- private publishStallNoticeLocked;
513
- private applyDeliveryEffectsLocked;
514
- private advanceDeliveryLocked;
515
- private applyTerminalSettlementLocked;
516
- private takeMessageContextLocked;
517
- /**
518
- * Codex App Server acceptance is a terminal delivery boundary for the
519
- * original message body, but not for its later model reply. Settle the
520
- * durable ledger/body now and retain only bounded in-memory reply
521
- * correlation until completion or the original deadline.
522
- */
523
- private acceptProviderDeliveryLocked;
524
- private stallReasonFor;
525
- private refreshNextProgressWatchWakeLocked;
526
- private processProgressWatchesLocked;
527
- private processLifecycleLocked;
528
- private scheduleLifecycleWakeLocked;
529
- private scheduleLifecycleRetryLocked;
216
+ private pair;
217
+ private unpair;
218
+ private resolvePairEndpoints;
219
+ private assertThread;
220
+ private sendToClaude;
221
+ private sendToCodex;
222
+ private reply;
223
+ private assertReplyCaller;
224
+ private enqueueConversation;
225
+ private rememberConversation;
226
+ private conversationIsActive;
530
227
  private deliveryStatus;
531
- private acceptToClaude;
532
- private acceptToCodex;
533
- private acceptReply;
534
- private enqueue;
535
- private enqueueNativeReply;
536
- /**
537
- * A provider reply observed before route teardown remains valid evidence
538
- * even when the same atomic mutation removes its selected Claude route.
539
- * Re-enter that already-observed reply through the existing transient
540
- * native-ingress boundary; this preserves the exact connector generation
541
- * without recreating route authority or accepting a new unsolicited send.
542
- */
543
- private enqueueObservedClaudeReplyAfterRouteTeardownLocked;
544
- private pruneTransient;
545
- private awaitDispatchWithNativeHeld;
546
- private restoreQueuedMessageContextLocked;
547
- private prepareDispatchLocked;
548
- private commitDispatchLocked;
549
- private scheduleDispatch;
550
- private runDispatch;
551
- private scheduleHeldRedispatch;
552
- private onDelivery;
553
- private finishDelivery;
554
- private finishDeliveredReplyLocked;
555
- private finishProviderTurnContinuationLocked;
556
- private onClaudeReply;
557
- private onClaudeMessage;
558
- private releasePendingClaude;
559
- private onCodexEndpointRefresh;
560
- private applyCodexEndpointRefresh;
228
+ private messageUpdatedAt;
229
+ private kick;
230
+ private kickExact;
231
+ private kickSteer;
232
+ private startRunner;
233
+ private runTarget;
234
+ private settleAttemptForShutdown;
235
+ private resolvePrewrite;
236
+ private applyDispatchResult;
237
+ private callbacksFor;
561
238
  private onRouteState;
562
- private setNativeSourceStatus;
563
- private rejectDetachedNativeReceipt;
564
- private drainDetachedReceiptWritesLocked;
565
- private settleDetachedNativeReceipt;
566
- private exclusiveDecision;
567
- private changed;
568
- private publicSnapshotLocked;
239
+ private onClaudeMessage;
240
+ private onClaudeReply;
241
+ private enqueueCorrelatedReply;
242
+ private enqueueNativeConversationReply;
243
+ private installPendingClaudeReply;
244
+ private pruneExpiredPendingClaudeReplies;
245
+ private retirePendingClaudeReply;
246
+ private activatePendingClaudeReply;
247
+ private deliverPendingClaudeReply;
248
+ private updateProgressWatch;
249
+ private restoreProgressWatch;
250
+ private untrack;
251
+ private settleWatchesForAlias;
252
+ private settleProgressWatch;
253
+ private recordProgressWatchEvent;
254
+ private processProgressWatches;
255
+ private finishSettlements;
256
+ private finishSettlement;
257
+ private scheduleTargetRetry;
258
+ private scheduleWake;
259
+ private onWake;
260
+ private refreshClaudeDiscovery;
261
+ private refreshCodexDoctor;
262
+ private assertWritable;
263
+ private resolveClaudeSelector;
264
+ private resolveSelectedClaudeRoute;
265
+ private routeObservationStillCurrent;
569
266
  private publish;
267
+ private alert;
570
268
  }
571
269
  export {};