agent-embassy 1.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 (145) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/CONTRIBUTING.md +122 -0
  3. package/LICENSE +21 -0
  4. package/README.md +185 -0
  5. package/README.zh-CN.md +185 -0
  6. package/SECURITY.md +224 -0
  7. package/assets/live-dashboard/app.css +1610 -0
  8. package/assets/mark-seal.svg +7 -0
  9. package/assets/mark.svg +7 -0
  10. package/assets/social-preview.png +0 -0
  11. package/assets/vendor/react/LICENSE +21 -0
  12. package/assets/vendor/react/react-dom.production.min.js +267 -0
  13. package/assets/vendor/react/react.production.min.js +31 -0
  14. package/dist/src/errors.d.ts +5 -0
  15. package/dist/src/errors.js +11 -0
  16. package/dist/src/errors.js.map +1 -0
  17. package/dist/src/gateway/claude-compatibility-scratch.d.ts +18 -0
  18. package/dist/src/gateway/claude-compatibility-scratch.js +158 -0
  19. package/dist/src/gateway/claude-compatibility-scratch.js.map +1 -0
  20. package/dist/src/gateway/claude-helper-client.d.ts +43 -0
  21. package/dist/src/gateway/claude-helper-client.js +212 -0
  22. package/dist/src/gateway/claude-helper-client.js.map +1 -0
  23. package/dist/src/gateway/claude-helper-protocol.d.ts +172 -0
  24. package/dist/src/gateway/claude-helper-protocol.js +373 -0
  25. package/dist/src/gateway/claude-helper-protocol.js.map +1 -0
  26. package/dist/src/gateway/claude-helper-supervisor.d.ts +74 -0
  27. package/dist/src/gateway/claude-helper-supervisor.js +497 -0
  28. package/dist/src/gateway/claude-helper-supervisor.js.map +1 -0
  29. package/dist/src/gateway/claude-helper.d.ts +1 -0
  30. package/dist/src/gateway/claude-helper.js +269 -0
  31. package/dist/src/gateway/claude-helper.js.map +1 -0
  32. package/dist/src/gateway/claude-peer.d.ts +273 -0
  33. package/dist/src/gateway/claude-peer.js +2359 -0
  34. package/dist/src/gateway/claude-peer.js.map +1 -0
  35. package/dist/src/gateway/claude-runtime.d.ts +40 -0
  36. package/dist/src/gateway/claude-runtime.js +302 -0
  37. package/dist/src/gateway/claude-runtime.js.map +1 -0
  38. package/dist/src/gateway/cli-copy.d.ts +8 -0
  39. package/dist/src/gateway/cli-copy.en.d.ts +13 -0
  40. package/dist/src/gateway/cli-copy.en.js +43 -0
  41. package/dist/src/gateway/cli-copy.en.js.map +1 -0
  42. package/dist/src/gateway/cli-copy.js +19 -0
  43. package/dist/src/gateway/cli-copy.js.map +1 -0
  44. package/dist/src/gateway/cli-copy.zh-CN.d.ts +13 -0
  45. package/dist/src/gateway/cli-copy.zh-CN.js +43 -0
  46. package/dist/src/gateway/cli-copy.zh-CN.js.map +1 -0
  47. package/dist/src/gateway/cli.d.ts +44 -0
  48. package/dist/src/gateway/cli.js +969 -0
  49. package/dist/src/gateway/cli.js.map +1 -0
  50. package/dist/src/gateway/codex-app-server.d.ts +310 -0
  51. package/dist/src/gateway/codex-app-server.js +1746 -0
  52. package/dist/src/gateway/codex-app-server.js.map +1 -0
  53. package/dist/src/gateway/codex-local-transport.d.ts +81 -0
  54. package/dist/src/gateway/codex-local-transport.js +617 -0
  55. package/dist/src/gateway/codex-local-transport.js.map +1 -0
  56. package/dist/src/gateway/codex-registration-generation.d.ts +5 -0
  57. package/dist/src/gateway/codex-registration-generation.js +19 -0
  58. package/dist/src/gateway/codex-registration-generation.js.map +1 -0
  59. package/dist/src/gateway/codex-registration-succession.d.ts +209 -0
  60. package/dist/src/gateway/codex-registration-succession.js +588 -0
  61. package/dist/src/gateway/codex-registration-succession.js.map +1 -0
  62. package/dist/src/gateway/compatibility.d.ts +70 -0
  63. package/dist/src/gateway/compatibility.js +252 -0
  64. package/dist/src/gateway/compatibility.js.map +1 -0
  65. package/dist/src/gateway/config.d.ts +24 -0
  66. package/dist/src/gateway/config.js +130 -0
  67. package/dist/src/gateway/config.js.map +1 -0
  68. package/dist/src/gateway/control.d.ts +308 -0
  69. package/dist/src/gateway/control.js +1573 -0
  70. package/dist/src/gateway/control.js.map +1 -0
  71. package/dist/src/gateway/dashboard-copy.d.ts +7 -0
  72. package/dist/src/gateway/dashboard-copy.en.d.ts +506 -0
  73. package/dist/src/gateway/dashboard-copy.en.js +507 -0
  74. package/dist/src/gateway/dashboard-copy.en.js.map +1 -0
  75. package/dist/src/gateway/dashboard-copy.js +516 -0
  76. package/dist/src/gateway/dashboard-copy.js.map +1 -0
  77. package/dist/src/gateway/dashboard-copy.zh-CN.d.ts +506 -0
  78. package/dist/src/gateway/dashboard-copy.zh-CN.js +507 -0
  79. package/dist/src/gateway/dashboard-copy.zh-CN.js.map +1 -0
  80. package/dist/src/gateway/dashboard-model.d.ts +207 -0
  81. package/dist/src/gateway/dashboard-model.js +720 -0
  82. package/dist/src/gateway/dashboard-model.js.map +1 -0
  83. package/dist/src/gateway/dashboard.d.ts +26 -0
  84. package/dist/src/gateway/dashboard.js +941 -0
  85. package/dist/src/gateway/dashboard.js.map +1 -0
  86. package/dist/src/gateway/delivery-machine.d.ts +235 -0
  87. package/dist/src/gateway/delivery-machine.js +540 -0
  88. package/dist/src/gateway/delivery-machine.js.map +1 -0
  89. package/dist/src/gateway/instance-lease.d.ts +21 -0
  90. package/dist/src/gateway/instance-lease.js +549 -0
  91. package/dist/src/gateway/instance-lease.js.map +1 -0
  92. package/dist/src/gateway/live-dashboard-app/app.js +2914 -0
  93. package/dist/src/gateway/live-dashboard-assets.d.ts +10 -0
  94. package/dist/src/gateway/live-dashboard-assets.js +73 -0
  95. package/dist/src/gateway/live-dashboard-assets.js.map +1 -0
  96. package/dist/src/gateway/live-dashboard-bootstrap.d.ts +36 -0
  97. package/dist/src/gateway/live-dashboard-bootstrap.js +176 -0
  98. package/dist/src/gateway/live-dashboard-bootstrap.js.map +1 -0
  99. package/dist/src/gateway/live-dashboard-command.d.ts +54 -0
  100. package/dist/src/gateway/live-dashboard-command.js +324 -0
  101. package/dist/src/gateway/live-dashboard-command.js.map +1 -0
  102. package/dist/src/gateway/live-dashboard-http.d.ts +41 -0
  103. package/dist/src/gateway/live-dashboard-http.js +445 -0
  104. package/dist/src/gateway/live-dashboard-http.js.map +1 -0
  105. package/dist/src/gateway/live-dashboard-protocol.d.ts +38 -0
  106. package/dist/src/gateway/live-dashboard-protocol.js +156 -0
  107. package/dist/src/gateway/live-dashboard-protocol.js.map +1 -0
  108. package/dist/src/gateway/live-dashboard-server.d.ts +33 -0
  109. package/dist/src/gateway/live-dashboard-server.js +130 -0
  110. package/dist/src/gateway/live-dashboard-server.js.map +1 -0
  111. package/dist/src/gateway/live-dashboard-stream.d.ts +46 -0
  112. package/dist/src/gateway/live-dashboard-stream.js +233 -0
  113. package/dist/src/gateway/live-dashboard-stream.js.map +1 -0
  114. package/dist/src/gateway/live-dashboard.d.ts +31 -0
  115. package/dist/src/gateway/live-dashboard.js +190 -0
  116. package/dist/src/gateway/live-dashboard.js.map +1 -0
  117. package/dist/src/gateway/locale.d.ts +4 -0
  118. package/dist/src/gateway/locale.js +10 -0
  119. package/dist/src/gateway/locale.js.map +1 -0
  120. package/dist/src/gateway/progress-watch-machine.d.ts +97 -0
  121. package/dist/src/gateway/progress-watch-machine.js +172 -0
  122. package/dist/src/gateway/progress-watch-machine.js.map +1 -0
  123. package/dist/src/gateway/providers.d.ts +287 -0
  124. package/dist/src/gateway/providers.js +2451 -0
  125. package/dist/src/gateway/providers.js.map +1 -0
  126. package/dist/src/gateway/server.d.ts +57 -0
  127. package/dist/src/gateway/server.js +264 -0
  128. package/dist/src/gateway/server.js.map +1 -0
  129. package/dist/src/gateway/service.d.ts +449 -0
  130. package/dist/src/gateway/service.js +4831 -0
  131. package/dist/src/gateway/service.js.map +1 -0
  132. package/dist/src/gateway/store.d.ts +340 -0
  133. package/dist/src/gateway/store.js +4047 -0
  134. package/dist/src/gateway/store.js.map +1 -0
  135. package/dist/src/gateway/types.d.ts +514 -0
  136. package/dist/src/gateway/types.js +414 -0
  137. package/dist/src/gateway/types.js.map +1 -0
  138. package/dist/src/mutex.d.ts +4 -0
  139. package/dist/src/mutex.js +23 -0
  140. package/dist/src/mutex.js.map +1 -0
  141. package/docs/DESIGN.md +134 -0
  142. package/docs/GATEWAY-ARCHITECTURE.md +858 -0
  143. package/package.json +80 -0
  144. package/skills/embassy-peer/SKILL.md +198 -0
  145. package/skills/embassy-peer/agents/openai.yaml +4 -0
@@ -0,0 +1,414 @@
1
+ export const gatewayProviders = ["codex", "claude"];
2
+ export const gatewayInboundModes = ["paired", "open"];
3
+ export const connectorHealthStates = [
4
+ "offline",
5
+ "connecting",
6
+ "healthy",
7
+ "degraded",
8
+ "incompatible",
9
+ ];
10
+ export const compatibilityStates = [
11
+ "unknown",
12
+ "compatible",
13
+ "incompatible",
14
+ "expired",
15
+ ];
16
+ export const routeStates = [
17
+ "stale",
18
+ "idle",
19
+ "busy",
20
+ "awaiting_approval",
21
+ "offline",
22
+ "incompatible",
23
+ "disabled",
24
+ ];
25
+ export const routeRegistrationModes = [
26
+ "explicit_opt_in",
27
+ "selected_live_peer",
28
+ ];
29
+ export const messageDirections = [
30
+ "codex_to_claude",
31
+ "claude_to_codex",
32
+ ];
33
+ export const deliveryStates = [
34
+ "queued",
35
+ "duplicate",
36
+ "dispatching",
37
+ "transport_written",
38
+ "held",
39
+ "delivered",
40
+ "unconfirmed",
41
+ "failed",
42
+ "ambiguous",
43
+ "expired",
44
+ "cancelled",
45
+ "abandoned",
46
+ "rejected",
47
+ ];
48
+ export const terminalDeliveryStates = new Set([
49
+ "delivered",
50
+ "unconfirmed",
51
+ "failed",
52
+ "ambiguous",
53
+ "expired",
54
+ "cancelled",
55
+ "abandoned",
56
+ "rejected",
57
+ ]);
58
+ export const alertSeverities = ["info", "warning", "error"];
59
+ /** Canonical closed-array bounds shared by store projections and control/UI. */
60
+ export const gatewayPublicSnapshotLimits = Object.freeze({
61
+ connectors: 64,
62
+ compatibilityChecks: 2,
63
+ availablePeers: 256,
64
+ routes: 256,
65
+ pairs: 256,
66
+ progressWatches: 64,
67
+ progressWatchEvents: 256,
68
+ activityEvents: 256,
69
+ messages: 1_024,
70
+ alerts: 256,
71
+ });
72
+ /** Leaves headroom for the private control protocol response envelope. */
73
+ export const GATEWAY_PUBLIC_SNAPSHOT_BYTE_BUDGET = 240 * 1024;
74
+ export const publicAvailablePeerStates = [
75
+ "idle",
76
+ "busy",
77
+ "awaiting_approval",
78
+ "offline",
79
+ "incompatible",
80
+ ];
81
+ export const gatewayActivityKinds = [
82
+ "discovery",
83
+ "selection",
84
+ "registration",
85
+ "pairing",
86
+ "watch",
87
+ ];
88
+ export const gatewayActivityActions = [
89
+ "discovery_refreshed",
90
+ "claude_selected",
91
+ "claude_unselected",
92
+ "codex_registered",
93
+ "codex_succeeded",
94
+ "codex_unregistered",
95
+ "routes_paired",
96
+ "routes_unpaired",
97
+ "watch_ended",
98
+ ];
99
+ export const deadlinePressureBucketNames = [
100
+ "under_1m",
101
+ "1m_to_5m",
102
+ "5m_to_15m",
103
+ "15m_to_60m",
104
+ "over_60m",
105
+ ];
106
+ const PUBLIC_ALIAS_PATTERN = /^[a-z][a-z0-9_-]{0,31}@[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/;
107
+ const PUBLIC_HOST_PATTERN = /^[a-z0-9](?:[a-z0-9.-]{0,61}[a-z0-9])?$/;
108
+ const PUBLIC_SAFE_CODE_PATTERN = /^[A-Z][A-Z0-9_]{0,63}$/;
109
+ /** Strict closed-schema guard for runtime-supplied transient inventory rows. */
110
+ export function isPublicAvailablePeerSnapshot(value) {
111
+ if (!value || typeof value !== "object" || Array.isArray(value))
112
+ return false;
113
+ const candidate = value;
114
+ const required = [
115
+ "alias",
116
+ "provider",
117
+ "host",
118
+ "state",
119
+ "compatibility",
120
+ "validated",
121
+ "selected",
122
+ ];
123
+ const optional = ["lastSeenAt", "safeErrorCode"];
124
+ const keys = Object.keys(candidate);
125
+ if (!required.every((key) => Object.hasOwn(candidate, key)) ||
126
+ !keys.every((key) => required.includes(key) || optional.includes(key))) {
127
+ return false;
128
+ }
129
+ if (typeof candidate.alias !== "string" ||
130
+ !PUBLIC_ALIAS_PATTERN.test(candidate.alias) ||
131
+ typeof candidate.host !== "string" ||
132
+ !PUBLIC_HOST_PATTERN.test(candidate.host) ||
133
+ !candidate.alias.endsWith(`@${candidate.host}`) ||
134
+ candidate.provider !== "claude" ||
135
+ typeof candidate.state !== "string" ||
136
+ !publicAvailablePeerStates.includes(candidate.state) ||
137
+ typeof candidate.compatibility !== "string" ||
138
+ !compatibilityStates.includes(candidate.compatibility) ||
139
+ typeof candidate.validated !== "boolean" ||
140
+ typeof candidate.selected !== "boolean") {
141
+ return false;
142
+ }
143
+ if (candidate.lastSeenAt !== undefined &&
144
+ (typeof candidate.lastSeenAt !== "string" ||
145
+ candidate.lastSeenAt.length < 20 ||
146
+ candidate.lastSeenAt.length > 35 ||
147
+ !Number.isFinite(Date.parse(candidate.lastSeenAt)))) {
148
+ return false;
149
+ }
150
+ return (candidate.safeErrorCode === undefined ||
151
+ (typeof candidate.safeErrorCode === "string" &&
152
+ PUBLIC_SAFE_CODE_PATTERN.test(candidate.safeErrorCode)));
153
+ }
154
+ export function arePublicAvailablePeerSnapshots(value, maximumRows = gatewayPublicSnapshotLimits.availablePeers) {
155
+ if (!Array.isArray(value) ||
156
+ !Number.isSafeInteger(maximumRows) ||
157
+ maximumRows < 0 ||
158
+ value.length > maximumRows ||
159
+ !value.every(isPublicAvailablePeerSnapshot)) {
160
+ return false;
161
+ }
162
+ const aliases = value.map((peer) => `${peer.provider}\0${peer.alias}`);
163
+ return new Set(aliases).size === aliases.length;
164
+ }
165
+ function severityPriority(severity) {
166
+ if (severity === "error")
167
+ return 0;
168
+ if (severity === "warning")
169
+ return 1;
170
+ return 2;
171
+ }
172
+ function routePriority(state) {
173
+ if (state === "busy" || state === "awaiting_approval")
174
+ return 0;
175
+ if (state === "idle")
176
+ return 1;
177
+ if (state === "offline" || state === "incompatible")
178
+ return 2;
179
+ if (state === "stale")
180
+ return 3;
181
+ return 4;
182
+ }
183
+ function connectorPriority(health) {
184
+ if (health === "healthy" || health === "connecting")
185
+ return 0;
186
+ if (health === "degraded")
187
+ return 1;
188
+ if (health === "incompatible")
189
+ return 2;
190
+ return 3;
191
+ }
192
+ function peerPriority(state) {
193
+ if (state === "busy" || state === "awaiting_approval")
194
+ return 0;
195
+ if (state === "idle")
196
+ return 1;
197
+ if (state === "incompatible")
198
+ return 2;
199
+ return 3;
200
+ }
201
+ function snapshotBytes(snapshot) {
202
+ return Buffer.byteLength(JSON.stringify(snapshot), "utf8");
203
+ }
204
+ /**
205
+ * Deterministically projects a canonical snapshot under the local control
206
+ * byte budget. Content is never shortened: complete metadata rows are either
207
+ * retained or counted as omitted. Connector/selected-route inventory is the
208
+ * last category removed.
209
+ */
210
+ export function projectGatewayPublicSnapshot(snapshot, maximumBytes = GATEWAY_PUBLIC_SNAPSHOT_BYTE_BUDGET) {
211
+ if (!Number.isSafeInteger(maximumBytes) ||
212
+ maximumBytes < 1_024 ||
213
+ maximumBytes > GATEWAY_PUBLIC_SNAPSHOT_BYTE_BUDGET) {
214
+ throw new RangeError("INVALID_GATEWAY_SNAPSHOT_BYTE_BUDGET");
215
+ }
216
+ const projected = {
217
+ ...snapshot,
218
+ connectors: snapshot.connectors.slice(0, gatewayPublicSnapshotLimits.connectors),
219
+ ...(snapshot.compatibilityChecks === undefined
220
+ ? {}
221
+ : {
222
+ compatibilityChecks: snapshot.compatibilityChecks.slice(0, gatewayPublicSnapshotLimits.compatibilityChecks),
223
+ }),
224
+ availablePeers: snapshot.availablePeers.slice(0, gatewayPublicSnapshotLimits.availablePeers),
225
+ routes: snapshot.routes.slice(0, gatewayPublicSnapshotLimits.routes),
226
+ pairs: snapshot.pairs.slice(0, gatewayPublicSnapshotLimits.pairs),
227
+ ...(snapshot.progressWatches === undefined
228
+ ? {}
229
+ : {
230
+ progressWatches: snapshot.progressWatches.slice(0, gatewayPublicSnapshotLimits.progressWatches),
231
+ }),
232
+ ...(snapshot.progressWatchEvents === undefined
233
+ ? {}
234
+ : {
235
+ progressWatchEvents: snapshot.progressWatchEvents.slice(-gatewayPublicSnapshotLimits.progressWatchEvents),
236
+ }),
237
+ ...(snapshot.activityEvents === undefined
238
+ ? {}
239
+ : {
240
+ activityEvents: snapshot.activityEvents.slice(-gatewayPublicSnapshotLimits.activityEvents),
241
+ }),
242
+ messages: snapshot.messages.slice(-gatewayPublicSnapshotLimits.messages),
243
+ alerts: snapshot.alerts.slice(-gatewayPublicSnapshotLimits.alerts),
244
+ accounting: { ...snapshot.accounting },
245
+ truncation: {
246
+ connectors: snapshot.truncation.connectors +
247
+ Math.max(0, snapshot.connectors.length - gatewayPublicSnapshotLimits.connectors),
248
+ ...(snapshot.compatibilityChecks === undefined
249
+ ? {}
250
+ : {
251
+ compatibilityChecks: (snapshot.truncation.compatibilityChecks ?? 0) +
252
+ Math.max(0, snapshot.compatibilityChecks.length -
253
+ gatewayPublicSnapshotLimits.compatibilityChecks),
254
+ }),
255
+ availablePeers: snapshot.truncation.availablePeers +
256
+ Math.max(0, snapshot.availablePeers.length - gatewayPublicSnapshotLimits.availablePeers),
257
+ routes: snapshot.truncation.routes +
258
+ Math.max(0, snapshot.routes.length - gatewayPublicSnapshotLimits.routes),
259
+ pairs: snapshot.truncation.pairs +
260
+ Math.max(0, snapshot.pairs.length - gatewayPublicSnapshotLimits.pairs),
261
+ ...(snapshot.progressWatches === undefined
262
+ ? {}
263
+ : {
264
+ progressWatches: (snapshot.truncation.progressWatches ?? 0) +
265
+ Math.max(0, snapshot.progressWatches.length -
266
+ gatewayPublicSnapshotLimits.progressWatches),
267
+ }),
268
+ ...(snapshot.progressWatchEvents === undefined
269
+ ? {}
270
+ : {
271
+ progressWatchEvents: (snapshot.truncation.progressWatchEvents ?? 0) +
272
+ Math.max(0, snapshot.progressWatchEvents.length -
273
+ gatewayPublicSnapshotLimits.progressWatchEvents),
274
+ }),
275
+ ...(snapshot.activityEvents === undefined
276
+ ? {}
277
+ : {
278
+ activityEvents: (snapshot.truncation.activityEvents ?? 0) +
279
+ Math.max(0, snapshot.activityEvents.length -
280
+ gatewayPublicSnapshotLimits.activityEvents),
281
+ }),
282
+ messages: snapshot.truncation.messages +
283
+ Math.max(0, snapshot.messages.length - gatewayPublicSnapshotLimits.messages),
284
+ alerts: snapshot.truncation.alerts +
285
+ Math.max(0, snapshot.alerts.length - gatewayPublicSnapshotLimits.alerts),
286
+ },
287
+ };
288
+ if (snapshotBytes(projected) <= maximumBytes)
289
+ return projected;
290
+ const retainUntilFit = (rowCount, applyRetainedCount) => {
291
+ let lower = 0;
292
+ let upper = rowCount;
293
+ let best = -1;
294
+ while (lower <= upper) {
295
+ const candidate = Math.floor((lower + upper) / 2);
296
+ applyRetainedCount(candidate);
297
+ if (snapshotBytes(projected) <= maximumBytes) {
298
+ best = candidate;
299
+ lower = candidate + 1;
300
+ }
301
+ else {
302
+ upper = candidate - 1;
303
+ }
304
+ }
305
+ if (best >= 0) {
306
+ applyRetainedCount(best);
307
+ return true;
308
+ }
309
+ applyRetainedCount(0);
310
+ return false;
311
+ };
312
+ const watchEvents = projected.progressWatchEvents ?? [];
313
+ const watchEventOmissions = projected.truncation.progressWatchEvents ?? 0;
314
+ if (watchEvents.length > 0 &&
315
+ retainUntilFit(watchEvents.length, (retained) => {
316
+ projected.progressWatchEvents =
317
+ retained === 0 ? [] : watchEvents.slice(-retained);
318
+ projected.truncation.progressWatchEvents =
319
+ watchEventOmissions + watchEvents.length - retained;
320
+ })) {
321
+ return projected;
322
+ }
323
+ const activityEvents = projected.activityEvents ?? [];
324
+ const activityEventOmissions = projected.truncation.activityEvents ?? 0;
325
+ if (activityEvents.length > 0 &&
326
+ retainUntilFit(activityEvents.length, (retained) => {
327
+ projected.activityEvents =
328
+ retained === 0 ? [] : activityEvents.slice(-retained);
329
+ projected.truncation.activityEvents =
330
+ activityEventOmissions + activityEvents.length - retained;
331
+ })) {
332
+ return projected;
333
+ }
334
+ const messages = projected.messages;
335
+ const messageOmissions = projected.truncation.messages;
336
+ if (retainUntilFit(messages.length, (retained) => {
337
+ projected.messages = retained === 0 ? [] : messages.slice(-retained);
338
+ projected.truncation.messages =
339
+ messageOmissions + messages.length - retained;
340
+ })) {
341
+ return projected;
342
+ }
343
+ const peers = [...projected.availablePeers].sort((left, right) => {
344
+ if (left.selected !== right.selected)
345
+ return left.selected ? -1 : 1;
346
+ const byState = peerPriority(left.state) - peerPriority(right.state);
347
+ if (byState !== 0)
348
+ return byState;
349
+ const bySeen = (right.lastSeenAt ?? "").localeCompare(left.lastSeenAt ?? "");
350
+ return bySeen || left.alias.localeCompare(right.alias);
351
+ });
352
+ const peerOmissions = projected.truncation.availablePeers;
353
+ if (retainUntilFit(peers.length, (retained) => {
354
+ projected.availablePeers = peers.slice(0, retained);
355
+ projected.truncation.availablePeers =
356
+ peerOmissions + peers.length - retained;
357
+ })) {
358
+ return projected;
359
+ }
360
+ const alerts = [...projected.alerts].sort((left, right) => {
361
+ const bySeverity = severityPriority(left.severity) - severityPriority(right.severity);
362
+ if (bySeverity !== 0)
363
+ return bySeverity;
364
+ const byTime = right.timestamp.localeCompare(left.timestamp);
365
+ return byTime || left.code.localeCompare(right.code);
366
+ });
367
+ const alertOmissions = projected.truncation.alerts;
368
+ if (retainUntilFit(alerts.length, (retained) => {
369
+ projected.alerts = alerts.slice(0, retained);
370
+ projected.truncation.alerts =
371
+ alertOmissions + alerts.length - retained;
372
+ })) {
373
+ return projected;
374
+ }
375
+ const routes = [...projected.routes].sort((left, right) => {
376
+ if (left.enabled !== right.enabled)
377
+ return left.enabled ? -1 : 1;
378
+ const byState = routePriority(left.state) - routePriority(right.state);
379
+ if (byState !== 0)
380
+ return byState;
381
+ return left.alias.localeCompare(right.alias);
382
+ });
383
+ const routeOmissions = projected.truncation.routes;
384
+ const pairs = [...projected.pairs].sort((left, right) => `${left.claudeAlias}\0${left.codexAlias}`.localeCompare(`${right.claudeAlias}\0${right.codexAlias}`));
385
+ const pairOmissions = projected.truncation.pairs;
386
+ if (retainUntilFit(pairs.length, (retained) => {
387
+ projected.pairs = pairs.slice(0, retained);
388
+ projected.truncation.pairs = pairOmissions + pairs.length - retained;
389
+ })) {
390
+ return projected;
391
+ }
392
+ if (retainUntilFit(routes.length, (retained) => {
393
+ projected.routes = routes.slice(0, retained);
394
+ projected.truncation.routes = routeOmissions + routes.length - retained;
395
+ })) {
396
+ return projected;
397
+ }
398
+ const connectors = [...projected.connectors].sort((left, right) => {
399
+ const byHealth = connectorPriority(left.health) - connectorPriority(right.health);
400
+ if (byHealth !== 0)
401
+ return byHealth;
402
+ return `${left.provider}\0${left.host}`.localeCompare(`${right.provider}\0${right.host}`);
403
+ });
404
+ const connectorOmissions = projected.truncation.connectors;
405
+ if (retainUntilFit(connectors.length, (retained) => {
406
+ projected.connectors = connectors.slice(0, retained);
407
+ projected.truncation.connectors =
408
+ connectorOmissions + connectors.length - retained;
409
+ })) {
410
+ return projected;
411
+ }
412
+ throw new RangeError("GATEWAY_SNAPSHOT_BASE_EXCEEDS_BYTE_BUDGET");
413
+ }
414
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/gateway/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare class KeyedMutex {
2
+ private readonly tails;
3
+ run<T>(key: string, operation: () => Promise<T>): Promise<T>;
4
+ }
@@ -0,0 +1,23 @@
1
+ export class KeyedMutex {
2
+ tails = new Map();
3
+ async run(key, operation) {
4
+ const previous = this.tails.get(key) ?? Promise.resolve();
5
+ let release;
6
+ const current = new Promise((resolve) => {
7
+ release = resolve;
8
+ });
9
+ const tail = previous.then(() => current);
10
+ this.tails.set(key, tail);
11
+ await previous;
12
+ try {
13
+ return await operation();
14
+ }
15
+ finally {
16
+ release?.();
17
+ if (this.tails.get(key) === tail) {
18
+ this.tails.delete(key);
19
+ }
20
+ }
21
+ }
22
+ }
23
+ //# sourceMappingURL=mutex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../src/mutex.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAU;IACJ,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE1D,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,SAA2B;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1D,IAAI,OAAiC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5C,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAE1B,MAAM,QAAQ,CAAC;QACf,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
package/docs/DESIGN.md ADDED
@@ -0,0 +1,134 @@
1
+ # Embassy Design System — "Porcelain & Seal"
2
+
3
+ Canon for every user surface: marketing site, dashboard, README visuals, mark,
4
+ and social imagery. One token system; no surface invents its own values.
5
+ Agreed jointly (PM + engineering) 2026-08-08.
6
+
7
+ > **PM amendment — 2026-08-09 (the warm/arch era).** The visual identity
8
+ > moved on from this document's imagery on the operator's direction; the
9
+ > honesty rules below remain canon, the imagery sections are historical.
10
+ > What ships today: the **gate/archway mark** with an amber glow and pennant
11
+ > (`assets/embassy-logo/mark.svg`, badge and lockup alongside; the tent
12
+ > variants at `assets/mark.svg` / `assets/mark-seal.svg` remain as favicon
13
+ > until superseded); the **warm anime banner** — three chibi agent mascots
14
+ > exchanging envelopes before the glowing arch (`assets/social-preview.png`,
15
+ > brief in `docs/BANNER-BRIEF.md`); and the **live dashboard's Cohere-token
16
+ > chip system** (`assets/live-dashboard/app.css`) in place of the porcelain
17
+ > palette and seal/receipt iconography described below — state is carried by
18
+ > tinted chips (progress stone, positive green, qualified outline,
19
+ > indeterminate purple, warning coral, failure red, inert outline), with the
20
+ > same rules: progress is never green, `released` ≠ read, refusals are not
21
+ > failures, and the brand accent is never a state color. A successor canon
22
+ > document for the warm era is owed; until then, treat BANNER-BRIEF.md plus
23
+ > the shipped dashboard tokens as the working truth for imagery and color.
24
+
25
+ ## Idea
26
+
27
+ Embassy's brand is the **receipt** — the seal that records a message
28
+ crossing a boundary and how delivery settled. (A settlement record, not
29
+ cryptographic proof: today `delivered` can mean the receiving App Server
30
+ accepted the turn, not that the model consumed or completed it. Copy on any
31
+ surface must never claim more than this.) The visual world is a light, unhurried diplomatic
32
+ register: porcelain paper, near-black ink, hairline rules, and exactly one
33
+ decisive color — seal red. Abstract, artistic, calm. No buildings, no flags,
34
+ no vendor colors, no circuit-board "AI" imagery.
35
+
36
+ ## Tokens
37
+
38
+ ### Color
39
+
40
+ | Token | Value | Use |
41
+ | --- | --- | --- |
42
+ | `--porcelain` | `#f8f4ec` | Page ground |
43
+ | `--porcelain-raise` | `#fffdf8` | Cards, panels |
44
+ | `--ink` | `#231f1a` | Primary text |
45
+ | `--ink-soft` | `#6d6558` | Secondary text |
46
+ | `--rule` | `#e4dccd` | Hairlines, borders |
47
+ | `--seal` | `#b3382c` | Brand + one primary action per view — the cinnabar seal. **Never a state color.** |
48
+ | `--jade` | `#557f68` | Healthy / delivered / positive states |
49
+ | `--ochre` | `#a8842f` | Waiting / queued / in-progress states |
50
+ | `--codeblock` | `#262019` | Terminal code blocks only — the one deliberate dark exception |
51
+
52
+ Rules: cinnabar never decorates and never signals any state — it is the brand
53
+ and the single most important action on screen. **There is no second red.**
54
+ Failure is carried by SHAPE (the broken seal) rendered in `--ink`, never by a
55
+ red that would compete with the brand at small sizes. Jade and ochre are
56
+ semantic only and never used decoratively. Dark-mode variants are NOT provided in v1 —
57
+ the light porcelain world is the committed identity (paint every ground
58
+ explicitly; never inherit host backgrounds).
59
+
60
+ ### Type
61
+
62
+ | Role | Stack | Treatment |
63
+ | --- | --- | --- |
64
+ | Display | `"Iowan Old Style", "Palatino Nova", Palatino, Georgia, serif` | Large, tight-tracked (−0.01em), `text-wrap: balance` |
65
+ | Body | `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, sans-serif` | 16–17px / 1.65, max width 65ch |
66
+ | Utility | `ui-monospace, "SF Mono", Menlo, Consolas, monospace` | Commands, receipts, timestamps, stats; `font-variant-numeric: tabular-nums` |
67
+ | Label | Body stack | 11–12px, uppercase, letter-spacing 0.14em, `--ink-soft` (or `--seal` for the active section) |
68
+
69
+ ### Space & structure
70
+
71
+ - Base unit 8px; section rhythm 72–96px on the site, 24–32px on the dashboard.
72
+ - Hairline rules (`1px solid --rule`) separate; whitespace groups. Prefer
73
+ asymmetric editorial layouts over centered symmetry on the site.
74
+ - Cards: `--porcelain-raise`, 1px `--rule` border, radius 10px, no shadows
75
+ heavier than `0 1px 2px rgb(35 31 26 / 4%)`.
76
+ - Wide content (tables, code) scrolls in its own container; the page never
77
+ scrolls horizontally.
78
+
79
+ ## The mark
80
+
81
+ An abstract seal: a circle holding two facing arcs that shelter a sealed
82
+ center point — the parentheses of a meeting. **No diagonal strokes anywhere**
83
+ (diagonals collapse into an error X at small sizes), **never radial from the
84
+ hub** (reads as a clock), **nothing detached below center** (reads as a
85
+ face). Two parties, one meeting point. At 20px and below, drop the outer
86
+ ring. Sources:
87
+
88
+ - `assets/mark.svg` — ink line version on light grounds.
89
+ - `assets/mark-seal.svg` — solid seal-red disc with porcelain chevrons; used
90
+ for favicon and small sizes (legible at 16px).
91
+
92
+ Receipt iconography derives from the mark: **delivered** = intact seal
93
+ (jade), **queued** = half-drawn seal (ochre), **expired/failed** = broken
94
+ seal (ink — shape carries the failure; no red competes with the brand). The
95
+ brand cinnabar seal itself never marks a state. No other icon family is
96
+ used.
97
+
98
+ ## Site first viewport
99
+
100
+ Not an illustration with a title: a compact, authentic message exchange —
101
+ two named agents, the seal at center, a delivered receipt — showing the
102
+ product doing its one thing. Then accreditation/how-it-works, protocol
103
+ truth, real dashboard proof, quickstart/security.
104
+
105
+ ## Dashboard information architecture
106
+
107
+ 1. **Exchange board** — Claude selection ↔ queue/pouch ↔ Codex registration;
108
+ broker readiness and the next action inline.
109
+ 2. **Needs attention** — ordered, actionable, hidden when empty.
110
+ 3. **In transit** — queue count, oldest wait, and explicit stall state from the
111
+ bounded public snapshot.
112
+ 4. **Activity ledger** — receipt lifecycle; details on demand.
113
+ 5. **Sessions & routes** — secondary.
114
+ 6. **Compatibility & diagnostics** — collapsed by default.
115
+
116
+ Every alert pairs the state with the exact next command. Raw data lives
117
+ behind the questions, never in front of them. Review lenses: a new user must
118
+ understand purpose / readiness / queue / next action within 10 seconds; a
119
+ protocol expert must verify discovery ≠ selection ≠ registration,
120
+ accepted ≠ delivered, progress ≠ failure, no private data, no overclaims,
121
+ and correct ambiguity/restart/version semantics.
122
+
123
+ ## Localization
124
+
125
+ Runtime dashboards, CLI guidance, and native gateway notices render from
126
+ closed, parity-tested `en` / `zh-CN` catalogs. Commands, JSON keys, enums,
127
+ aliases, protocol tags, and safe codes stay English. English remains canonical
128
+ for security meaning. The marketing site and README ship parallel locale
129
+ artifacts rather than changing the runtime protocol.
130
+
131
+ ## Review gate
132
+
133
+ Every batch built under this system passes two adversarial reviews — a
134
+ new-user lens and an AI-expert lens — before it ships.