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.
- package/CHANGELOG.md +61 -0
- package/CONTRIBUTING.md +122 -0
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/README.zh-CN.md +185 -0
- package/SECURITY.md +224 -0
- package/assets/live-dashboard/app.css +1610 -0
- package/assets/mark-seal.svg +7 -0
- package/assets/mark.svg +7 -0
- package/assets/social-preview.png +0 -0
- package/assets/vendor/react/LICENSE +21 -0
- package/assets/vendor/react/react-dom.production.min.js +267 -0
- package/assets/vendor/react/react.production.min.js +31 -0
- package/dist/src/errors.d.ts +5 -0
- package/dist/src/errors.js +11 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/gateway/claude-compatibility-scratch.d.ts +18 -0
- package/dist/src/gateway/claude-compatibility-scratch.js +158 -0
- package/dist/src/gateway/claude-compatibility-scratch.js.map +1 -0
- package/dist/src/gateway/claude-helper-client.d.ts +43 -0
- package/dist/src/gateway/claude-helper-client.js +212 -0
- package/dist/src/gateway/claude-helper-client.js.map +1 -0
- package/dist/src/gateway/claude-helper-protocol.d.ts +172 -0
- package/dist/src/gateway/claude-helper-protocol.js +373 -0
- package/dist/src/gateway/claude-helper-protocol.js.map +1 -0
- package/dist/src/gateway/claude-helper-supervisor.d.ts +74 -0
- package/dist/src/gateway/claude-helper-supervisor.js +497 -0
- package/dist/src/gateway/claude-helper-supervisor.js.map +1 -0
- package/dist/src/gateway/claude-helper.d.ts +1 -0
- package/dist/src/gateway/claude-helper.js +269 -0
- package/dist/src/gateway/claude-helper.js.map +1 -0
- package/dist/src/gateway/claude-peer.d.ts +273 -0
- package/dist/src/gateway/claude-peer.js +2359 -0
- package/dist/src/gateway/claude-peer.js.map +1 -0
- package/dist/src/gateway/claude-runtime.d.ts +40 -0
- package/dist/src/gateway/claude-runtime.js +302 -0
- package/dist/src/gateway/claude-runtime.js.map +1 -0
- package/dist/src/gateway/cli-copy.d.ts +8 -0
- package/dist/src/gateway/cli-copy.en.d.ts +13 -0
- package/dist/src/gateway/cli-copy.en.js +43 -0
- package/dist/src/gateway/cli-copy.en.js.map +1 -0
- package/dist/src/gateway/cli-copy.js +19 -0
- package/dist/src/gateway/cli-copy.js.map +1 -0
- package/dist/src/gateway/cli-copy.zh-CN.d.ts +13 -0
- package/dist/src/gateway/cli-copy.zh-CN.js +43 -0
- package/dist/src/gateway/cli-copy.zh-CN.js.map +1 -0
- package/dist/src/gateway/cli.d.ts +44 -0
- package/dist/src/gateway/cli.js +969 -0
- package/dist/src/gateway/cli.js.map +1 -0
- package/dist/src/gateway/codex-app-server.d.ts +310 -0
- package/dist/src/gateway/codex-app-server.js +1746 -0
- package/dist/src/gateway/codex-app-server.js.map +1 -0
- package/dist/src/gateway/codex-local-transport.d.ts +81 -0
- package/dist/src/gateway/codex-local-transport.js +617 -0
- package/dist/src/gateway/codex-local-transport.js.map +1 -0
- package/dist/src/gateway/codex-registration-generation.d.ts +5 -0
- package/dist/src/gateway/codex-registration-generation.js +19 -0
- package/dist/src/gateway/codex-registration-generation.js.map +1 -0
- package/dist/src/gateway/codex-registration-succession.d.ts +209 -0
- package/dist/src/gateway/codex-registration-succession.js +588 -0
- package/dist/src/gateway/codex-registration-succession.js.map +1 -0
- package/dist/src/gateway/compatibility.d.ts +70 -0
- package/dist/src/gateway/compatibility.js +252 -0
- package/dist/src/gateway/compatibility.js.map +1 -0
- package/dist/src/gateway/config.d.ts +24 -0
- package/dist/src/gateway/config.js +130 -0
- package/dist/src/gateway/config.js.map +1 -0
- package/dist/src/gateway/control.d.ts +308 -0
- package/dist/src/gateway/control.js +1573 -0
- package/dist/src/gateway/control.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.d.ts +7 -0
- package/dist/src/gateway/dashboard-copy.en.d.ts +506 -0
- package/dist/src/gateway/dashboard-copy.en.js +507 -0
- package/dist/src/gateway/dashboard-copy.en.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.js +516 -0
- package/dist/src/gateway/dashboard-copy.js.map +1 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.d.ts +506 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.js +507 -0
- package/dist/src/gateway/dashboard-copy.zh-CN.js.map +1 -0
- package/dist/src/gateway/dashboard-model.d.ts +207 -0
- package/dist/src/gateway/dashboard-model.js +720 -0
- package/dist/src/gateway/dashboard-model.js.map +1 -0
- package/dist/src/gateway/dashboard.d.ts +26 -0
- package/dist/src/gateway/dashboard.js +941 -0
- package/dist/src/gateway/dashboard.js.map +1 -0
- package/dist/src/gateway/delivery-machine.d.ts +235 -0
- package/dist/src/gateway/delivery-machine.js +540 -0
- package/dist/src/gateway/delivery-machine.js.map +1 -0
- package/dist/src/gateway/instance-lease.d.ts +21 -0
- package/dist/src/gateway/instance-lease.js +549 -0
- package/dist/src/gateway/instance-lease.js.map +1 -0
- package/dist/src/gateway/live-dashboard-app/app.js +2914 -0
- package/dist/src/gateway/live-dashboard-assets.d.ts +10 -0
- package/dist/src/gateway/live-dashboard-assets.js +73 -0
- package/dist/src/gateway/live-dashboard-assets.js.map +1 -0
- package/dist/src/gateway/live-dashboard-bootstrap.d.ts +36 -0
- package/dist/src/gateway/live-dashboard-bootstrap.js +176 -0
- package/dist/src/gateway/live-dashboard-bootstrap.js.map +1 -0
- package/dist/src/gateway/live-dashboard-command.d.ts +54 -0
- package/dist/src/gateway/live-dashboard-command.js +324 -0
- package/dist/src/gateway/live-dashboard-command.js.map +1 -0
- package/dist/src/gateway/live-dashboard-http.d.ts +41 -0
- package/dist/src/gateway/live-dashboard-http.js +445 -0
- package/dist/src/gateway/live-dashboard-http.js.map +1 -0
- package/dist/src/gateway/live-dashboard-protocol.d.ts +38 -0
- package/dist/src/gateway/live-dashboard-protocol.js +156 -0
- package/dist/src/gateway/live-dashboard-protocol.js.map +1 -0
- package/dist/src/gateway/live-dashboard-server.d.ts +33 -0
- package/dist/src/gateway/live-dashboard-server.js +130 -0
- package/dist/src/gateway/live-dashboard-server.js.map +1 -0
- package/dist/src/gateway/live-dashboard-stream.d.ts +46 -0
- package/dist/src/gateway/live-dashboard-stream.js +233 -0
- package/dist/src/gateway/live-dashboard-stream.js.map +1 -0
- package/dist/src/gateway/live-dashboard.d.ts +31 -0
- package/dist/src/gateway/live-dashboard.js +190 -0
- package/dist/src/gateway/live-dashboard.js.map +1 -0
- package/dist/src/gateway/locale.d.ts +4 -0
- package/dist/src/gateway/locale.js +10 -0
- package/dist/src/gateway/locale.js.map +1 -0
- package/dist/src/gateway/progress-watch-machine.d.ts +97 -0
- package/dist/src/gateway/progress-watch-machine.js +172 -0
- package/dist/src/gateway/progress-watch-machine.js.map +1 -0
- package/dist/src/gateway/providers.d.ts +287 -0
- package/dist/src/gateway/providers.js +2451 -0
- package/dist/src/gateway/providers.js.map +1 -0
- package/dist/src/gateway/server.d.ts +57 -0
- package/dist/src/gateway/server.js +264 -0
- package/dist/src/gateway/server.js.map +1 -0
- package/dist/src/gateway/service.d.ts +449 -0
- package/dist/src/gateway/service.js +4831 -0
- package/dist/src/gateway/service.js.map +1 -0
- package/dist/src/gateway/store.d.ts +340 -0
- package/dist/src/gateway/store.js +4047 -0
- package/dist/src/gateway/store.js.map +1 -0
- package/dist/src/gateway/types.d.ts +514 -0
- package/dist/src/gateway/types.js +414 -0
- package/dist/src/gateway/types.js.map +1 -0
- package/dist/src/mutex.d.ts +4 -0
- package/dist/src/mutex.js +23 -0
- package/dist/src/mutex.js.map +1 -0
- package/docs/DESIGN.md +134 -0
- package/docs/GATEWAY-ARCHITECTURE.md +858 -0
- package/package.json +80 -0
- package/skills/embassy-peer/SKILL.md +198 -0
- 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,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.
|