agent-embassy 3.1.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/CONTRIBUTING.md +92 -202
  3. package/README.md +157 -155
  4. package/SECURITY.md +191 -348
  5. package/dist/src/gateway/broker-check.d.ts +26 -0
  6. package/dist/src/gateway/broker-check.js +89 -0
  7. package/dist/src/gateway/broker-check.js.map +1 -0
  8. package/dist/src/gateway/broker-control.d.ts +72 -0
  9. package/dist/src/gateway/broker-control.js +164 -0
  10. package/dist/src/gateway/broker-control.js.map +1 -0
  11. package/dist/src/gateway/broker.d.ts +117 -0
  12. package/dist/src/gateway/broker.js +186 -0
  13. package/dist/src/gateway/broker.js.map +1 -0
  14. package/dist/src/gateway/claude-peer.d.ts +1 -124
  15. package/dist/src/gateway/claude-peer.js +61 -1052
  16. package/dist/src/gateway/claude-peer.js.map +1 -1
  17. package/dist/src/gateway/codex-stateless-transport.d.ts +0 -12
  18. package/dist/src/gateway/codex-stateless-transport.js +8 -142
  19. package/dist/src/gateway/codex-stateless-transport.js.map +1 -1
  20. package/dist/src/gateway/config.d.ts +2 -6
  21. package/dist/src/gateway/config.js +17 -27
  22. package/dist/src/gateway/config.js.map +1 -1
  23. package/dist/src/gateway/coordinator.d.ts +57 -0
  24. package/dist/src/gateway/coordinator.js +217 -0
  25. package/dist/src/gateway/coordinator.js.map +1 -0
  26. package/dist/src/gateway/core-cli.d.ts +15 -0
  27. package/dist/src/gateway/core-cli.js +282 -0
  28. package/dist/src/gateway/core-cli.js.map +1 -0
  29. package/dist/src/gateway/core-service-command.d.ts +16 -0
  30. package/dist/src/gateway/core-service-command.js +71 -0
  31. package/dist/src/gateway/core-service-command.js.map +1 -0
  32. package/dist/src/gateway/endpoint-directory.d.ts +33 -0
  33. package/dist/src/gateway/endpoint-directory.js +223 -0
  34. package/dist/src/gateway/endpoint-directory.js.map +1 -0
  35. package/dist/src/gateway/federation.d.ts +89 -0
  36. package/dist/src/gateway/federation.js +632 -0
  37. package/dist/src/gateway/federation.js.map +1 -0
  38. package/dist/src/gateway/ledger-codec.d.ts +3 -0
  39. package/dist/src/gateway/ledger-codec.js +159 -0
  40. package/dist/src/gateway/ledger-codec.js.map +1 -0
  41. package/dist/src/gateway/ledger.d.ts +138 -0
  42. package/dist/src/gateway/ledger.js +319 -0
  43. package/dist/src/gateway/ledger.js.map +1 -0
  44. package/dist/src/gateway/local-control.d.ts +23 -0
  45. package/dist/src/gateway/local-control.js +489 -0
  46. package/dist/src/gateway/local-control.js.map +1 -0
  47. package/dist/src/gateway/native-destinations.d.ts +34 -0
  48. package/dist/src/gateway/native-destinations.js +272 -0
  49. package/dist/src/gateway/native-destinations.js.map +1 -0
  50. package/dist/src/gateway/owned-state.d.ts +57 -0
  51. package/dist/src/gateway/owned-state.js +398 -0
  52. package/dist/src/gateway/owned-state.js.map +1 -0
  53. package/dist/src/gateway/provenance-envelope.d.ts +3 -3
  54. package/dist/src/gateway/provenance-envelope.js +3 -23
  55. package/dist/src/gateway/provenance-envelope.js.map +1 -1
  56. package/dist/src/gateway/runtime.d.ts +41 -0
  57. package/dist/src/gateway/runtime.js +175 -0
  58. package/dist/src/gateway/runtime.js.map +1 -0
  59. package/docs/CONFIGURATION.md +178 -266
  60. package/docs/DELIVERY.md +133 -82
  61. package/docs/GATEWAY-ARCHITECTURE.md +276 -949
  62. package/package.json +5 -5
  63. package/skills/embassy-peer/SKILL.md +38 -196
  64. package/skills/embassy-peer/agents/openai.yaml +2 -2
  65. package/dist/src/gateway/claude-helper-protocol.d.ts +0 -117
  66. package/dist/src/gateway/claude-helper-protocol.js +0 -122
  67. package/dist/src/gateway/claude-helper-protocol.js.map +0 -1
  68. package/dist/src/gateway/claude-helper-supervisor.d.ts +0 -87
  69. package/dist/src/gateway/claude-helper-supervisor.js +0 -374
  70. package/dist/src/gateway/claude-helper-supervisor.js.map +0 -1
  71. package/dist/src/gateway/claude-helper.d.ts +0 -1
  72. package/dist/src/gateway/claude-helper.js +0 -252
  73. package/dist/src/gateway/claude-helper.js.map +0 -1
  74. package/dist/src/gateway/cli.d.ts +0 -56
  75. package/dist/src/gateway/cli.js +0 -1532
  76. package/dist/src/gateway/cli.js.map +0 -1
  77. package/dist/src/gateway/codex-socket-holder.d.ts +0 -26
  78. package/dist/src/gateway/codex-socket-holder.js +0 -76
  79. package/dist/src/gateway/codex-socket-holder.js.map +0 -1
  80. package/dist/src/gateway/control.d.ts +0 -279
  81. package/dist/src/gateway/control.js +0 -933
  82. package/dist/src/gateway/control.js.map +0 -1
  83. package/dist/src/gateway/peer-client.d.ts +0 -58
  84. package/dist/src/gateway/peer-client.js +0 -217
  85. package/dist/src/gateway/peer-client.js.map +0 -1
  86. package/dist/src/gateway/peer-mailbox.d.ts +0 -78
  87. package/dist/src/gateway/peer-mailbox.js +0 -168
  88. package/dist/src/gateway/peer-mailbox.js.map +0 -1
  89. package/dist/src/gateway/peer-protocol.d.ts +0 -110
  90. package/dist/src/gateway/peer-protocol.js +0 -79
  91. package/dist/src/gateway/peer-protocol.js.map +0 -1
  92. package/dist/src/gateway/peer-stdio.d.ts +0 -23
  93. package/dist/src/gateway/peer-stdio.js +0 -100
  94. package/dist/src/gateway/peer-stdio.js.map +0 -1
  95. package/dist/src/gateway/providers.d.ts +0 -164
  96. package/dist/src/gateway/providers.js +0 -975
  97. package/dist/src/gateway/providers.js.map +0 -1
  98. package/dist/src/gateway/server.d.ts +0 -46
  99. package/dist/src/gateway/server.js +0 -216
  100. package/dist/src/gateway/server.js.map +0 -1
  101. package/dist/src/gateway/service.d.ts +0 -371
  102. package/dist/src/gateway/service.js +0 -2335
  103. package/dist/src/gateway/service.js.map +0 -1
  104. package/dist/src/gateway/status-view.d.ts +0 -119
  105. package/dist/src/gateway/status-view.js +0 -484
  106. package/dist/src/gateway/status-view.js.map +0 -1
  107. package/dist/src/gateway/store.d.ts +0 -188
  108. package/dist/src/gateway/store.js +0 -2360
  109. package/dist/src/gateway/store.js.map +0 -1
  110. package/dist/src/gateway/types.d.ts +0 -541
  111. package/dist/src/gateway/types.js +0 -332
  112. package/dist/src/gateway/types.js.map +0 -1
@@ -1,484 +0,0 @@
1
- /**
2
- * Human rendering of the public snapshot. Pure and side-effect free: it takes
3
- * a validated `GatewayPublicSnapshot` and returns text, so every judgement it
4
- * makes — which connectors matter, what counts as stale, which alerts are
5
- * actionable — is unit-testable against fixture snapshots without a broker.
6
- *
7
- * Nothing here reaches for state the snapshot does not already carry, and
8
- * nothing here asks the broker for anything: `status` is read-only. The
9
- * snapshot is the whole input; `StatusViewOptions` adds only what the client
10
- * knows about itself (its own version, the state directory it resolved, the
11
- * pid recorded in that directory's controller lock, and the clock).
12
- *
13
- * Caps: at most `STATUS_CAPS.sessions` discovered sessions, `.shellPeers`
14
- * shell-peer lines, and `.alerts` alert rows are printed. Every cap says how
15
- * many rows it hid, and the shell-peer list is ordered stale-first so a stuck
16
- * peer is never the row that falls off the end.
17
- */
18
- import { connectorWord, gatewayHealthWord, gatewayPublicSnapshotLimits } from "./types.js";
19
- /**
20
- * The backstop for a route the broker has not heard about in a long time.
21
- *
22
- * It is deliberately far above the broker's own 35-second connector window
23
- * (`CONNECTOR_OBSERVATION_STALE_AFTER_MS`), because that window is crossed
24
- * routinely and innocently: the Codex observer polls one route at a time
25
- * every 15 s, and Claude routes are not polled at all — their evidence is
26
- * edge-triggered, written when a discovery scan or a delivery observes the
27
- * session, so a quiet Claude session's `lastSeenAt` simply stops advancing
28
- * while the session is perfectly alive. A word that meant "gone" at 35 s
29
- * would tell operators to retire live work; ten minutes plus a code that
30
- * says the endpoint is gone is what earns that sentence.
31
- */
32
- export const STATUS_ROUTE_STALE_AFTER_MS = 10 * 60_000;
33
- /** Older than this, the header offers a rescan. `status` never rescans itself. */
34
- export const STATUS_SCAN_STALE_AFTER_MS = 60_000;
35
- /** The one safe code that means the Codex task behind a route is actually gone. */
36
- export const CODEX_ENDPOINT_GONE_CODES = ["THREAD_NOT_OBSERVED"];
37
- export const STATUS_RECENT = Object.freeze({ default: 10, minimum: 1, maximum: 100 });
38
- export const STATUS_CAPS = Object.freeze({ sessions: 16, shellPeers: 8, alerts: 6 });
39
- // LocalClaudeGatewayProvider emits these from clean prewrite failures,
40
- // refreshClaudeDiscoveryOnce, and the discovery monitor's failure callback.
41
- export const CLAUDE_BUSY_OBSERVATION_CODES = new Set([
42
- "CLAUDE_PEER_TARGET_UNKNOWN",
43
- "CLAUDE_PEER_WORKSPACE_UNATTESTED",
44
- "CLAUDE_PEER_NOT_OBSERVED",
45
- "CLAUDE_DISCOVERY_UNAVAILABLE",
46
- ]);
47
- const PREVIEW_MAX_CHARS = 60;
48
- /**
49
- * One remedy per safe code, each one line. A connector with an unknown code
50
- * still gets a bounded generic remedy — it is on the delivery path, so the
51
- * operator must be told something — while an alert with an unknown code is
52
- * counted rather than printed. That filter is what makes the alert section
53
- * "actionable alerts" instead of an event log.
54
- *
55
- * `PEER_ALIAS_COLLISION` is deliberately the same sentence the CLI prints for
56
- * a refused send (`CLI_HINT.aliasCollision`); `status-view.test.ts` pins the
57
- * two strings together so they cannot drift apart.
58
- */
59
- export const STATUS_REMEDY = {
60
- MANAGED_CODEX_UNAVAILABLE: "Either a process outside Embassy holds the managed Codex control socket — quit it — or the managed App Server standalone layout is missing, which starting the daemon alone does not create: follow the Codex prerequisite in the README (the official installer, then the daemon).",
61
- PEER_ALIAS_COLLISION: "the alias names more than one live session; rename one, or address the session by UUID with --to <session-uuid>.",
62
- CLAUDE_PEER_WORKSPACE_UNATTESTED: "Let the queued delivery retry, then run `embassy status`; each routed preparation validates the workspace again. If this persists, report CLAUDE_PEER_WORKSPACE_UNATTESTED with the current alias.",
63
- CLAUDE_PEER_TARGET_UNKNOWN: "Run `embassy refresh`, then read `embassy status` for the session's current name; discovery did not find the delivery target.",
64
- CLAUDE_DISCOVERY_UNAVAILABLE: "Run `embassy refresh` and read that command's result: a failed scan returns `accepted: false` and its refusal code.",
65
- PEER_PROTOCOL_MISMATCH: "That node runs a different federation peer protocol; upgrade the lagging node's Embassy and it re-catalogs on the next refresh.",
66
- PEER_TUNNEL_UNAVAILABLE: "The SSH tunnel to that node is down; check the node is reachable and its broker is running.",
67
- PEER_DIAL_FAILED: "Embassy could not open the SSH tunnel to that node; check its entry in nodes.json and your SSH configuration.",
68
- PEER_CATALOG_INCOMPLETE: "That node answered with an incomplete catalog; its mirrored routes are shown from the last complete one.",
69
- PEER_ROUTE_STALE: "That mirrored route was missing from the node's latest catalog; it retires when the node stops publishing it.",
70
- CLAUDE_PEER_NOT_OBSERVED: "Discovery did not find that session; run `embassy refresh`, then inspect `embassy status` for current peers. Sending does not retire a missing session's stored route.",
71
- ROUTE_UNOBSERVED: "The provider stopped reporting this local route; if the session or task ended, run `embassy retire --alias <alias>`.",
72
- THREAD_NOT_OBSERVED: "That Codex task is gone. Run `embassy register-codex --alias <new-alias> --succeeds <this alias>` from the new task, or `embassy unregister-codex --alias <this alias>` from the old one.",
73
- CODEX_OBSERVER_UNAVAILABLE: "Embassy cannot observe Codex tasks; start the managed daemon with `codex app-server daemon start`.",
74
- DISPATCH_RUNNER_FAILED: "A delivery attempt failed inside the broker; the message keeps its own settled state — read it with `embassy delivery-status`, and restart the broker if this repeats.",
75
- CLAUDE_INGRESS_REJECTED: "A Claude session refused an inbound message; check that session's `crossSessionInbound` setting.",
76
- CLAUDE_REPLY_REJECTED: "A reply could not be written back to the originating Claude session; it may have exited — run `embassy refresh`.",
77
- ROUTE_OBSERVATION_FAILED: "The provider's route observation failed once; the state words above may be out of date until the next poll.",
78
- EPHEMERAL_ROUTE_EXPIRY_FAILED: "A throwaway `embassy check` registration could not be retired on time. The broker retries twice more, five seconds apart; if all three attempts fail the registration stays until the broker restarts, which clears it by construction.",
79
- GATEWAY_WAKE_FAILED: "The broker's maintenance tick failed once; if it repeats, restart the broker.",
80
- };
81
- const ANSI = Object.freeze({
82
- reset: "\u001b[0m", bold: "\u001b[1m", dim: "\u001b[2m",
83
- red: "\u001b[31m", yellow: "\u001b[33m", green: "\u001b[32m",
84
- });
85
- /** The one place that emits an escape sequence; `color: false` emits none. */
86
- export const terminalPainter = (color) => color ? (text, tone) => `${ANSI[tone]}${text}${ANSI.reset}` : (text) => text;
87
- const wordColor = (word) => word === "ok" ? "green" : word === "degraded" || word === "offline" ? "red" : "yellow";
88
- /**
89
- * Bodies are the one snapshot field with no shape validation beyond "non-empty
90
- * UTF-8 without NUL", so a preview strips C0/C1 controls and Unicode format
91
- * characters — an escape sequence would repaint the operator's terminal, and a
92
- * bidi override or zero-width joiner would let a body render as text it is
93
- * not — collapses runs of whitespace, and is cut to one short line.
94
- */
95
- function previewBody(body, maximum = PREVIEW_MAX_CHARS) {
96
- const flattened = body
97
- .replace(/[\u0000-\u001f\u007f-\u009f]/gu, " ")
98
- .replace(/\p{Cf}/gu, "")
99
- .replace(/\s+/gu, " ")
100
- .trim();
101
- const characters = [...flattened];
102
- return characters.length <= maximum ? flattened : `${characters.slice(0, maximum - 1).join("")}…`;
103
- }
104
- /** Relative wall-clock age: deterministic, and free of the reader's timezone. */
105
- function relativeAge(timestamp, now) {
106
- if (timestamp === undefined)
107
- return "never";
108
- const observed = Date.parse(timestamp);
109
- if (!Number.isFinite(observed))
110
- return "unknown";
111
- const seconds = Math.max(0, Math.round((now - observed) / 1_000));
112
- if (seconds < 1)
113
- return "just now";
114
- if (seconds < 60)
115
- return `${String(seconds)}s ago`;
116
- const minutes = Math.round(seconds / 60);
117
- if (minutes < 60)
118
- return `${String(minutes)}m ago`;
119
- const hours = Math.round(minutes / 60);
120
- if (hours < 48)
121
- return `${String(hours)}h ago`;
122
- return `${String(Math.round(hours / 24))}d ago`;
123
- }
124
- /** The same age without "ago", for a phrase that supplies its own preposition. */
125
- const spanFor = (timestamp, now) => relativeAge(timestamp, now).replace(/ ago$/, "");
126
- const ageMs = (timestamp, now) => {
127
- if (timestamp === undefined)
128
- return undefined;
129
- const observed = Date.parse(timestamp);
130
- return Number.isFinite(observed) ? Math.max(0, now - observed) : undefined;
131
- };
132
- function routeView(route, discovered, now) {
133
- if (!route.enabled)
134
- return { word: "disabled", lastSeen: relativeAge(route.lastSeenAt, now) };
135
- if (discovered !== undefined) {
136
- return {
137
- word: discovered.state === "awaiting_approval" ? "awaiting" : discovered.state,
138
- lastSeen: `discovered ${spanFor(discovered.lastSeenAt, now)}`,
139
- ...(discovered.state === "awaiting_approval"
140
- ? { remedy: "waiting on an approval prompt in that session's own terminal" } : {}),
141
- };
142
- }
143
- const observed = ageMs(route.lastSeenAt, now);
144
- const beyondBackstop = observed !== undefined && observed > STATUS_ROUTE_STALE_AFTER_MS;
145
- const word = beyondBackstop ? "stale"
146
- : route.state === "awaiting_approval" ? "awaiting" : route.state;
147
- const lastSeen = relativeAge(route.lastSeenAt, now);
148
- if (word === "awaiting") {
149
- return { word, lastSeen,
150
- remedy: `waiting on an approval prompt in that ${route.provider === "codex" ? "Codex task" : "session"}'s own terminal` };
151
- }
152
- if (word !== "stale")
153
- return { word, lastSeen };
154
- // Stale, and now the only question that matters: gone, or merely quiet?
155
- if (route.provider === "codex") {
156
- // A bare silence is not evidence the task is gone, and neither is the
157
- // broker's own 35-second word: the succession remedy needs BOTH the
158
- // ten-minute backstop and a code that says the endpoint itself is gone.
159
- // Anything less tells operators to retire tasks that are merely busy.
160
- const gone = beyondBackstop && route.safeErrorCode !== undefined &&
161
- CODEX_ENDPOINT_GONE_CODES.includes(route.safeErrorCode);
162
- return { word, lastSeen, remedy: gone
163
- ? STATUS_REMEDY.THREAD_NOT_OBSERVED ?? ""
164
- : `not observed for ${spanFor(route.lastSeenAt, now)}; the task may be busy or the app-server slow — run \`embassy check --to ${route.alias}\` to settle it` };
165
- }
166
- if (route.provider === "claude") {
167
- return { word, lastSeen,
168
- remedy: "that session has exited or renamed; run `embassy refresh`" };
169
- }
170
- return { word, lastSeen };
171
- }
172
- /** The remedy for one connector's condition; never empty when the word is not ok. */
173
- function connectorRemedy(connector, snapshot) {
174
- const code = connector.safeErrorCode;
175
- if (code === "CONNECTOR_OBSERVATION_STALE" && connector.provider === "codex") {
176
- return snapshot.routes.some((route) => route.provider === "codex")
177
- ? "A registered Codex task has not been observed recently; run `embassy check` to test the round trip."
178
- : "No Codex task is registered. Run `embassy register-codex --alias codex-<name>@<host>` from inside the task.";
179
- }
180
- if (code === "CONNECTOR_OBSERVATION_STALE" && connector.provider === "claude") {
181
- return "No Claude session has been observed recently; start one, then run `embassy refresh`.";
182
- }
183
- const known = code === undefined ? undefined : STATUS_REMEDY[code];
184
- if (known !== undefined)
185
- return known;
186
- return `The ${connector.provider} connector is not answering. Read \`embassy status --json\` for the full snapshot, and restart the broker if it does not clear.`;
187
- }
188
- /**
189
- * Colliding Claude names are filtered out of `availablePeers` by the broker,
190
- * and the only public trace left is a rejection count on the Claude
191
- * connector's registry observation. The count is therefore what can honestly
192
- * be reported: which name collided is not in the snapshot.
193
- */
194
- const claudeConnector = (snapshot) => snapshot.connectors.find((connector) => connector.provider === "claude");
195
- function collisionCount(snapshot) {
196
- return claudeConnector(snapshot)?.registry?.rejected.find((row) => row.safeErrorCode === "PEER_ALIAS_COLLISION")?.count ?? 0;
197
- }
198
- /**
199
- * The registry-drift signal: the scan saw records and could not parse a single
200
- * one into the fields Embassy consumes, and has not since this broker started.
201
- * That is what a changed Claude Code registry layout looks like from here.
202
- */
203
- function registryDrifted(snapshot) {
204
- const registry = claudeConnector(snapshot)?.registry;
205
- return registry !== undefined && registry.entriesScanned > 0 &&
206
- !registry.parseableRecordSeenSinceBoot;
207
- }
208
- /**
209
- * Columns padded to content width; the last column is never padded. Padding is
210
- * measured and applied on the plain value and colour is put on afterwards —
211
- * padding a string that already carries escape bytes counts them as width and
212
- * shears the table apart the moment colour is on.
213
- */
214
- function table(headers, rows, paint) {
215
- const widths = headers.map((header, index) => Math.max(header.length, ...rows.map((row) => (row[index]?.value ?? "").length)));
216
- const render = (cells) => cells.map((cell, index) => {
217
- const padded = index === headers.length - 1 ? cell.value : cell.value.padEnd(widths[index] ?? 0);
218
- return cell.tone === undefined ? padded : paint(padded, cell.tone);
219
- }).join(" ").trimEnd();
220
- return [render(headers.map((value) => ({ value }))), ...rows.map(render)];
221
- }
222
- /** The most recent alert per (code, host, alias), newest first, remedied ones only. */
223
- function actionableAlerts(alerts) {
224
- const latest = new Map();
225
- for (const alert of alerts) {
226
- latest.set(`${alert.code} ${alert.host ?? ""} ${alert.alias ?? ""}`, alert);
227
- }
228
- const rows = [...latest.values()].sort((left, right) => right.timestamp.localeCompare(left.timestamp));
229
- const explained = rows.filter((alert) => STATUS_REMEDY[alert.code] !== undefined);
230
- return {
231
- shown: explained.slice(0, STATUS_CAPS.alerts),
232
- hidden: Math.max(0, explained.length - STATUS_CAPS.alerts),
233
- unexplained: rows.length - explained.length,
234
- };
235
- }
236
- const messageArrow = (event) => `${event.sourceAlias} → ${event.targetAlias}`;
237
- function renderSessions(snapshot, now, paint) {
238
- const lines = [];
239
- lines.push("", paint("sessions", "bold"));
240
- if (snapshot.availablePeers.length === 0) {
241
- lines.push(" none discovered — start a Claude Code session, then run `embassy refresh`");
242
- }
243
- else {
244
- const rows = snapshot.availablePeers.slice(0, STATUS_CAPS.sessions).map((peer) => {
245
- const word = peer.state === "awaiting_approval" ? "awaiting" : peer.state;
246
- return [{ value: peer.alias }, { value: word, tone: wordColor(word === "offline" ? "offline" : "ok") },
247
- { value: peer.routed ? "routed" : "no route yet" },
248
- { value: relativeAge(peer.lastSeenAt, now) }];
249
- });
250
- for (const line of table(["session", "state", "route", "last seen"], rows, paint)) {
251
- lines.push(` ${line}`);
252
- }
253
- if (snapshot.availablePeers.length > STATUS_CAPS.sessions) {
254
- lines.push(paint(` ${String(snapshot.availablePeers.length - STATUS_CAPS.sessions)} more discovered session(s) — read \`embassy status --json\``, "dim"));
255
- }
256
- }
257
- const collisions = collisionCount(snapshot);
258
- if (collisions > 0) {
259
- lines.push(paint(` ${String(collisions)} discovered Claude name(s) are shared by more than one live session and are hidden from this list; ${STATUS_REMEDY.PEER_ALIAS_COLLISION ?? ""}`, "yellow"));
260
- }
261
- return lines;
262
- }
263
- function renderAlerts(alerts, now, paint) {
264
- const lines = [];
265
- const { shown, hidden, unexplained } = actionableAlerts(alerts);
266
- if (shown.length > 0) {
267
- lines.push("", paint("alerts", "bold"));
268
- for (const alert of shown) {
269
- const subject = alert.alias ?? alert.host ?? alert.provider ?? "";
270
- lines.push(` ${alert.code}${subject === "" ? "" : ` ${subject}`} ${relativeAge(alert.timestamp, now)}`);
271
- lines.push(paint(` ${STATUS_REMEDY[alert.code] ?? ""}`, "dim"));
272
- }
273
- if (hidden > 0)
274
- lines.push(paint(` ${String(hidden)} more alert(s) not shown`, "dim"));
275
- if (unexplained > 0) {
276
- lines.push(paint(` ${String(unexplained)} alert(s) with no known remedy — read \`embassy status --json\``, "dim"));
277
- }
278
- }
279
- return lines;
280
- }
281
- export function renderStatus(snapshot, options) {
282
- const now = options.now;
283
- const paint = terminalPainter(options.color);
284
- const lines = [];
285
- const overall = gatewayHealthWord(snapshot.connectors);
286
- const discoveredByAlias = new Map(snapshot.availablePeers.map((peer) => [peer.alias, peer]));
287
- const brokerFacts = [
288
- paint(overall, wordColor(overall)),
289
- ...(options.pid === undefined ? [] : [`pid ${String(options.pid)}`]),
290
- `snapshot ${relativeAge(snapshot.generatedAt, now)}`,
291
- ];
292
- lines.push(`${paint(`embassy ${options.version}`, "bold")} broker ${brokerFacts.join(" · ")}`);
293
- lines.push(paint(`state dir ${options.stateDir}`, "dim"));
294
- // `status` never rescans — a rescan journals an activity row and performs a
295
- // passive discovery scan, both of which need the operator to ask. So the
296
- // header says how old the scan is and offers the command. The scan's own
297
- // stamp is the newest `availablePeers[].lastSeenAt`: every discovered
298
- // session is stamped by the scan that found it, whereas the claude
299
- // connector's `lastSeenAt` also moves on a delivery. With nothing
300
- // discovered there is no stamp to read, so the line says that rather than
301
- // inventing an age.
302
- const scannedAt = snapshot.availablePeers
303
- .map((peer) => peer.lastSeenAt)
304
- .filter((stamp) => stamp !== undefined)
305
- .sort().at(-1);
306
- const scanAge = ageMs(scannedAt, now);
307
- lines.push(paint(scannedAt === undefined ? "sessions: none discovered"
308
- : `sessions scanned ${relativeAge(scannedAt, now)}`, "dim") +
309
- (scanAge === undefined || scanAge > STATUS_SCAN_STALE_AFTER_MS
310
- ? paint(" — run `embassy refresh` to rescan", "yellow") : ""));
311
- lines.push("", paint("connectors", "bold"));
312
- const routedConnectors = snapshot.connectors.filter((connector) => connector.provider === "claude" || connector.provider === "codex");
313
- if (routedConnectors.length === 0)
314
- lines.push(" none — the broker has no provider connectors");
315
- for (const connector of routedConnectors) {
316
- const word = connectorWord(connector);
317
- const suffix = word === "ok" ? "" : ` ${connector.safeErrorCode ?? "no safe code"}`;
318
- lines.push(` ${connector.provider.padEnd(7)} ${paint(word, wordColor(word))}${suffix}`);
319
- if (word !== "ok")
320
- lines.push(paint(` ${connectorRemedy(connector, snapshot)}`, "dim"));
321
- if (connector.provider === "claude" && registryDrifted(snapshot)) {
322
- lines.push(paint(" no parseable session record since broker start — Claude Code's registry layout may have changed; run `embassy check`", "yellow"));
323
- }
324
- }
325
- // A registered shell peer is a connector from the operator's side: the route
326
- // exists, but whether anything is awaiting it lives in another terminal.
327
- // Queued mail with no waiter is the one observable proof, and it never
328
- // touches the overall word. Stale first, so the cap can only hide quiet ones.
329
- const shellPeers = snapshot.routes
330
- .filter((route) => route.provider === "peer")
331
- .sort((left, right) => Number(right.queueDepth > 0) - Number(left.queueDepth > 0));
332
- for (const peer of shellPeers.slice(0, STATUS_CAPS.shellPeers)) {
333
- const waiting = peer.queueDepth > 0;
334
- lines.push(` ${peer.alias} ${waiting
335
- ? paint("stale (token or await loop gone)", "yellow") : paint("ok", "green")}`);
336
- if (waiting) {
337
- lines.push(paint(` ${String(peer.queueDepth)} message(s) waiting: run \`embassy await --alias ${peer.alias} --token-stdin\` in the shell holding its token, or \`embassy unregister-peer --alias ${peer.alias} --token-stdin\`.`, "dim"));
338
- }
339
- }
340
- if (shellPeers.length > STATUS_CAPS.shellPeers) {
341
- lines.push(paint(` ${String(shellPeers.length - STATUS_CAPS.shellPeers)} more shell peer(s) with empty mailboxes`, "dim"));
342
- }
343
- lines.push(...renderSessions(snapshot, now, paint));
344
- lines.push("", paint("routes", "bold"));
345
- if (snapshot.routes.length === 0) {
346
- lines.push(" none — a Claude session's route installs on its first send; a Codex task is registered explicitly");
347
- }
348
- else {
349
- const views = snapshot.routes.map((route) => ({
350
- route, view: routeView(route, route.provider === "claude" ? discoveredByAlias.get(route.alias) : undefined, now),
351
- }));
352
- const rows = views.map(({ route, view }) => [
353
- { value: route.alias }, { value: route.provider },
354
- { value: view.word, tone: wordColor(view.word === "idle" || view.word === "busy" ? "ok" : view.word) },
355
- { value: String(route.queueDepth) }, { value: view.lastSeen },
356
- ]);
357
- for (const line of table(["alias", "provider", "state", "queue", "last seen"], rows, paint)) {
358
- lines.push(` ${line}`);
359
- }
360
- for (const { route, view } of views) {
361
- if (view.remedy === undefined && view.word === "busy" &&
362
- route.safeErrorCode !== undefined && CLAUDE_BUSY_OBSERVATION_CODES.has(route.safeErrorCode)) {
363
- lines.push(paint(` ${route.alias}: ${STATUS_REMEDY[route.safeErrorCode]}`, "dim"));
364
- continue;
365
- }
366
- if (view.remedy === undefined)
367
- continue;
368
- lines.push(paint(` ${route.alias}: ${view.remedy}`, "dim"));
369
- }
370
- }
371
- const recent = snapshot.messages.slice(-options.recent);
372
- lines.push("", paint(`recent (${String(recent.length)} of ${String(snapshot.messages.length)})`, "bold"));
373
- if (recent.length === 0)
374
- lines.push(" no messages retained");
375
- for (const event of [...recent].reverse()) {
376
- const latency = event.latencyMs === undefined ? "" : ` ${String(event.latencyMs)} ms`;
377
- const code = event.safeErrorCode === undefined ? "" : ` ${event.safeErrorCode}`;
378
- lines.push(` ${relativeAge(event.timestamp, now).padEnd(9)} ${messageArrow(event)} ${event.state}${latency}${code}`);
379
- if (event.body !== undefined)
380
- lines.push(paint(` ${previewBody(event.body)}`, "dim"));
381
- }
382
- lines.push(...renderAlerts(snapshot.alerts, now, paint));
383
- const omitted = Object.entries(snapshot.truncation)
384
- .filter((entry) => typeof entry[1] === "number" && entry[1] > 0)
385
- .map(([name, count]) => `${String(count)} ${name}`);
386
- if (omitted.length > 0) {
387
- lines.push("", paint(`omitted from this snapshot: ${omitted.join(", ")}`, "dim"));
388
- }
389
- return `${lines.join("\n")}\n`;
390
- }
391
- export const emptyWatchState = Object.freeze({
392
- messageStates: new Map(), lastSequence: -1,
393
- lastActivitySequence: -1, truncatedMessages: 0,
394
- });
395
- /**
396
- * Pure diff of one poll against the last, in stable emit order.
397
- *
398
- * A snapshot can carry the same message twice — once as a journaled activity
399
- * event and once as the live row — so the last occurrence in sequence order is
400
- * the current state. What this can promise is "at most once per observed
401
- * change": a transition the broker passed through entirely between two polls
402
- * is never seen, and rows evicted from the retained window before this tail
403
- * reached them are reported as a notice rather than silently skipped.
404
- */
405
- export function diffWatch(previous, snapshot) {
406
- const events = [];
407
- const ordered = [...snapshot.messages].sort((left, right) => left.sequence - right.sequence);
408
- const messageStates = new Map();
409
- const sequences = [...ordered.map((event) => event.sequence),
410
- ...(snapshot.activityEvents ?? []).map((event) => event.sequence)];
411
- const lastSequence = sequences.length === 0 ? previous.lastSequence
412
- : Math.max(previous.lastSequence, ...sequences);
413
- // Message and activity events share one counter, and settling a message
414
- // re-stamps it, so an ordinary gap in the numbers proves nothing. Only a
415
- // jump wider than the whole retained window proves rows were evicted before
416
- // this tail could read them — that, and truncation, are the honest signals.
417
- const lowest = sequences.length === 0 ? undefined : Math.min(...sequences);
418
- const missed = lowest === undefined ? 0 : lowest - previous.lastSequence - 1;
419
- if (previous.lastSequence >= 0 && missed > gatewayPublicSnapshotLimits.messages) {
420
- events.push({ type: "notice", text: `the retained window advanced past ${String(missed)} event(s) before this tail saw them` });
421
- }
422
- if (snapshot.truncation.messages > previous.truncatedMessages) {
423
- events.push({ type: "notice", text: `${String(snapshot.truncation.messages)} message row(s) omitted from this snapshot by the size budget` });
424
- }
425
- for (const event of ordered) {
426
- const before = previous.messageStates.get(event.messageIdSuffix);
427
- const already = messageStates.get(event.messageIdSuffix);
428
- messageStates.set(event.messageIdSuffix, event.state);
429
- if (already === event.state)
430
- continue;
431
- if (before === undefined && already === undefined) {
432
- events.push({ type: "message", event });
433
- continue;
434
- }
435
- const from = already ?? before;
436
- if (from === event.state)
437
- continue;
438
- events.push({
439
- type: "transition", message: event.messageIdSuffix, timestamp: event.timestamp,
440
- from, to: event.state, sourceAlias: event.sourceAlias, targetAlias: event.targetAlias,
441
- ...(event.latencyMs === undefined ? {} : { latencyMs: event.latencyMs }),
442
- ...(event.safeErrorCode === undefined ? {} : { safeErrorCode: event.safeErrorCode }),
443
- });
444
- }
445
- let lastActivitySequence = previous.lastActivitySequence;
446
- for (const event of [...(snapshot.activityEvents ?? [])].sort((left, right) => left.sequence - right.sequence)) {
447
- if (event.sequence <= previous.lastActivitySequence)
448
- continue;
449
- events.push({ type: "activity", event });
450
- lastActivitySequence = Math.max(lastActivitySequence, event.sequence);
451
- }
452
- return {
453
- state: { messageStates, lastSequence, lastActivitySequence,
454
- truncatedMessages: snapshot.truncation.messages },
455
- events,
456
- };
457
- }
458
- const SETTLED_BADLY = ["failed", "ambiguous", "unconfirmed", "expired", "cancelled", "abandoned", "rejected"];
459
- /** Local wall-clock time, because a tail is read beside other live logs. */
460
- const clockOf = (timestamp) => {
461
- const parsed = Date.parse(timestamp);
462
- return Number.isFinite(parsed) ? new Date(parsed).toTimeString().slice(0, 8) : "--:--:--";
463
- };
464
- /** One terminal line per watch event; the activity line is deliberately secondary. */
465
- export function renderWatchEvent(event, color) {
466
- const paint = terminalPainter(color);
467
- if (event.type === "notice")
468
- return paint(` note ${event.text}`, "yellow");
469
- if (event.type === "message") {
470
- const preview = event.event.body === undefined
471
- ? "" : ` ${paint(previewBody(event.event.body, 40), "dim")}`;
472
- return `${clockOf(event.event.timestamp)} ${event.event.messageIdSuffix} ${messageArrow(event.event)} ${event.event.state} ${String(event.event.bytes)} B${preview}`;
473
- }
474
- if (event.type === "transition") {
475
- const latency = event.latencyMs === undefined ? "" : ` (${String(event.latencyMs)} ms)`;
476
- const code = event.safeErrorCode === undefined ? "" : ` ${event.safeErrorCode}`;
477
- const word = event.to === "delivered" ? paint(event.to, "green")
478
- : SETTLED_BADLY.includes(event.to) ? paint(event.to, "red") : event.to;
479
- return `${clockOf(event.timestamp)} ${event.message} ${event.from} → ${word}${latency}${code}`;
480
- }
481
- const detail = event.event.safeErrorCode === undefined ? "" : ` ${event.event.safeErrorCode}`;
482
- return paint(`${clockOf(event.event.timestamp)} ${event.event.action} ${event.event.aliases.join(", ")} ${event.event.outcome}${detail}`, "dim");
483
- }
484
- //# sourceMappingURL=status-view.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-view.js","sourceRoot":"","sources":["../../../src/gateway/status-view.ts"],"names":[],"mappings":"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"}