agent-embassy 4.2.0 → 4.4.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 (48) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +28 -17
  3. package/SECURITY.md +25 -11
  4. package/dist/src/gateway/broker-control.js +9 -2
  5. package/dist/src/gateway/broker-control.js.map +1 -1
  6. package/dist/src/gateway/broker.d.ts +14 -0
  7. package/dist/src/gateway/broker.js +6 -2
  8. package/dist/src/gateway/broker.js.map +1 -1
  9. package/dist/src/gateway/codex-discovery.d.ts +42 -0
  10. package/dist/src/gateway/codex-discovery.js +604 -0
  11. package/dist/src/gateway/codex-discovery.js.map +1 -0
  12. package/dist/src/gateway/codex-stateless-transport.d.ts +1 -1
  13. package/dist/src/gateway/codex-stateless-transport.js +126 -18
  14. package/dist/src/gateway/codex-stateless-transport.js.map +1 -1
  15. package/dist/src/gateway/core-cli.js +10 -6
  16. package/dist/src/gateway/core-cli.js.map +1 -1
  17. package/dist/src/gateway/core-version.d.ts +1 -1
  18. package/dist/src/gateway/core-version.js +1 -1
  19. package/dist/src/gateway/endpoint-directory.d.ts +12 -0
  20. package/dist/src/gateway/endpoint-directory.js +94 -4
  21. package/dist/src/gateway/endpoint-directory.js.map +1 -1
  22. package/dist/src/gateway/ledger-codec.js +11 -6
  23. package/dist/src/gateway/ledger-codec.js.map +1 -1
  24. package/dist/src/gateway/ledger.d.ts +2 -1
  25. package/dist/src/gateway/ledger.js +5 -2
  26. package/dist/src/gateway/ledger.js.map +1 -1
  27. package/dist/src/gateway/local-control.d.ts +1 -1
  28. package/dist/src/gateway/local-control.js +1 -1
  29. package/dist/src/gateway/owned-state.d.ts +1 -0
  30. package/dist/src/gateway/owned-state.js +1 -1
  31. package/dist/src/gateway/owned-state.js.map +1 -1
  32. package/dist/src/gateway/runtime.d.ts +4 -2
  33. package/dist/src/gateway/runtime.js +18 -5
  34. package/dist/src/gateway/runtime.js.map +1 -1
  35. package/dist/src/gateway/tui-model.d.ts +67 -0
  36. package/dist/src/gateway/tui-model.js +136 -0
  37. package/dist/src/gateway/tui-model.js.map +1 -0
  38. package/dist/src/gateway/tui-view.d.ts +11 -0
  39. package/dist/src/gateway/tui-view.js +206 -0
  40. package/dist/src/gateway/tui-view.js.map +1 -0
  41. package/dist/src/gateway/tui.d.ts +7 -40
  42. package/dist/src/gateway/tui.js +43 -231
  43. package/dist/src/gateway/tui.js.map +1 -1
  44. package/docs/CONFIGURATION.md +59 -17
  45. package/docs/DELIVERY.md +18 -6
  46. package/docs/GATEWAY-ARCHITECTURE.md +43 -21
  47. package/package.json +8 -3
  48. package/skills/embassy-peer/SKILL.md +6 -6
@@ -7,6 +7,7 @@ import { MessagingBroker } from "./broker.js";
7
7
  import { ClaudePeerAdapter } from "./claude-peer.js";
8
8
  import { attestClaudePeerRuntime } from "./claude-runtime.js";
9
9
  import { createStatelessCodexOperationTransport } from "./codex-stateless-transport.js";
10
+ import { createCodexDiscoveryObserver } from "./codex-discovery.js";
10
11
  import { loadGatewayConfig, defaultGatewayStateDir } from "./config.js";
11
12
  import { Coordinator } from "./coordinator.js";
12
13
  import { EndpointDirectory } from "./endpoint-directory.js";
@@ -20,8 +21,8 @@ import { OwnedStateFile } from "./owned-state.js";
20
21
  const leaseLost = () => new BridgeError("GATEWAY_INSTANCE_LEASE_LOST", "Embassy lost its host-wide gateway lease and shut down.", true);
21
22
  const cancelled = () => new BridgeError("GATEWAY_START_CANCELLED", "Gateway startup was cancelled before it became ready.", true);
22
23
  const codexEnvironment = (env) => Object.fromEntries(["HOME", "USER", "LOGNAME"].flatMap((key) => env[key] === undefined ? [] : [[key, env[key]]]));
23
- /** Assemble the schema-6 broker. Construction is inert: provider and SSH I/O starts
24
- * only when an addressed operation reaches its destination. */
24
+ /** Assemble the schema-7 broker. The bounded Codex metadata observer starts only
25
+ * after control and state ownership are established; provider writes stay per-operation. */
25
26
  export async function runCoreRuntime(options, dependencies = {}) {
26
27
  const env = options.env ?? process.env;
27
28
  const d = {
@@ -33,6 +34,7 @@ export async function runCoreRuntime(options, dependencies = {}) {
33
34
  attestClaudeRuntime: dependencies.attestClaudeRuntime ?? attestClaudePeerRuntime,
34
35
  createClaudePeer: dependencies.createClaudePeer ?? ((runtime, config) => new ClaudePeerAdapter({ ...runtime })),
35
36
  createCodexOperation: dependencies.createCodexOperation ?? ((source) => createStatelessCodexOperationTransport({ local: { environment: codexEnvironment(source) } })),
37
+ createCodexDiscovery: dependencies.createCodexDiscovery ?? createCodexDiscoveryObserver,
36
38
  createFederation: dependencies.createFederation ?? ((host, nodes) => new Federation({ host, nodes })),
37
39
  serveControl: dependencies.serveControl ?? serveLocalControl,
38
40
  add: dependencies.addSignalListener ?? ((signal, listener) => process.on(signal, listener)),
@@ -57,6 +59,7 @@ export async function runCoreRuntime(options, dependencies = {}) {
57
59
  let control, broker;
58
60
  let claude, loopback;
59
61
  let federation;
62
+ let discovery;
60
63
  let primary;
61
64
  try {
62
65
  if (controller.signal.aborted)
@@ -117,11 +120,20 @@ export async function runCoreRuntime(options, dependencies = {}) {
117
120
  const codex = new CodexDestination({ host: config.hostId, operation: d.createCodexOperation(env) });
118
121
  loopback = new LoopbackDestination(codex);
119
122
  federation = d.createFederation(config.hostId, config.peerNodes);
120
- const directory = new EndpointDirectory({ host: config.hostId, limits: ledgerLimits, store, claude: peer, remote: federation });
123
+ const directory = new EndpointDirectory({ host: config.hostId, limits: ledgerLimits, store, claude: peer, remote: federation,
124
+ automaticCodex: true });
125
+ let codexObservation = { complete: false, truncated: false };
126
+ discovery = d.createCodexDiscovery({ hostId: config.hostId, local: { environment: codexEnvironment(env) },
127
+ maxEndpoints: ledgerLimits.endpoints, onSnapshot: async (snapshot) => {
128
+ assertWrite();
129
+ const result = await directory.reconcileCodex(snapshot.threads, snapshot.removedIds, snapshot.observation.truncated, snapshot.observation.complete);
130
+ codexObservation = { ...snapshot.observation, truncated: snapshot.observation.truncated || result.truncated };
131
+ } });
121
132
  const coordinator = new Coordinator({ host: config.hostId, limits: ledgerLimits, store, claude,
122
133
  codex: loopback, ssh: federation, resolve: (identity) => directory.exact(identity), assertWritable: assertWrite });
123
134
  broker = new MessagingBroker({ host: config.hostId, limits: ledgerLimits, store, directory, coordinator,
124
- nodes: config.peerNodes, steeringEnabled: config.steeringEnabled, federation });
135
+ nodes: config.peerNodes, steeringEnabled: config.steeringEnabled, federation,
136
+ ...(discovery ? { codexDiscovery: { refresh: () => discovery.refresh(), observation: () => codexObservation } } : {}) });
125
137
  control = await d.serveControl({ stateDir: config.stateDir, socketPath: config.controlSocketPath,
126
138
  handle: (input) => {
127
139
  if (!ready || controller.signal.aborted)
@@ -136,6 +148,7 @@ export async function runCoreRuntime(options, dependencies = {}) {
136
148
  await broker.start();
137
149
  assertStarting();
138
150
  ready = true;
151
+ discovery?.start();
139
152
  const announced = Promise.resolve(options.onReady({ status: "ready", hostId: config.hostId,
140
153
  codexMode: "native_messaging" })).then(() => ({ kind: "ready" }), (error) => ({ kind: "error", error }));
141
154
  const publication = await Promise.race([announced, stopped.then(() => ({ kind: "stopped" })),
@@ -156,7 +169,7 @@ export async function runCoreRuntime(options, dependencies = {}) {
156
169
  d.remove("SIGINT", stop);
157
170
  d.remove("SIGTERM", stop);
158
171
  const failures = [];
159
- for (const resource of [control, broker, ...(broker === undefined ? [loopback, claude, federation] : []), store]) {
172
+ for (const resource of [control, discovery, broker, ...(broker === undefined ? [loopback, claude, federation] : []), store]) {
160
173
  if (resource !== undefined)
161
174
  await resource.close().catch((error) => failures.push(error));
162
175
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/gateway/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/gateway/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ export type Obj = Record<string, unknown>;
2
+ export type Section = "endpoints" | "deliveries" | "retirements" | "result";
3
+ export type Mode = "browse" | "token" | "confirm";
4
+ export type EndpointRow = Readonly<{
5
+ id: string;
6
+ alias: string;
7
+ provider: string;
8
+ host: string;
9
+ local: boolean;
10
+ queueDepth?: number;
11
+ lastOperation?: Obj;
12
+ observedAt?: string;
13
+ safeErrorCode?: string;
14
+ codex?: Obj;
15
+ placeholder?: boolean;
16
+ }>;
17
+ export type DeliverySummary = Readonly<{
18
+ summary: true;
19
+ rows: readonly Obj[];
20
+ }>;
21
+ export type TuiModel = {
22
+ snapshot?: Obj;
23
+ snapshotAt?: number;
24
+ staleSince?: number;
25
+ error?: string;
26
+ errorDetail?: string;
27
+ action?: string;
28
+ actionRunning?: boolean;
29
+ host?: string;
30
+ restarted?: boolean;
31
+ section: Section;
32
+ previousSection?: Exclude<Section, "result">;
33
+ selected: Record<Exclude<Section, "result">, number> & Partial<Record<"result", number>>;
34
+ selectedEndpoint?: string;
35
+ mode: Mode;
36
+ token: string;
37
+ retiring?: EndpointRow;
38
+ result?: Readonly<{
39
+ label: string;
40
+ value: string;
41
+ }>;
42
+ hosts?: readonly Readonly<{
43
+ host: string;
44
+ state: string;
45
+ selected: boolean;
46
+ }>[];
47
+ };
48
+ export declare const object: (value: unknown) => value is Obj;
49
+ export declare const list: (value: unknown) => Obj[];
50
+ export declare const text: (value: unknown, fallback?: string) => string;
51
+ export declare const clean: (value: unknown) => string;
52
+ export declare const errorText: (error: unknown) => string;
53
+ export declare const age: (milliseconds: unknown) => string;
54
+ export declare const json: (value: unknown) => string;
55
+ export declare const endpointKey: (row: Pick<EndpointRow, "host" | "id">) => string;
56
+ export declare const unsuccessful: Set<string>;
57
+ export declare const deliveryToken: RegExp;
58
+ export declare function tokenFeedback(token: string): string;
59
+ export declare const groups: readonly ["Working", "Waiting", "Faulted", "Ready", "Dormant", "Not reporting", "Cached"];
60
+ export declare function endpointGroup(row: EndpointRow): number;
61
+ export declare function endpointRows(snapshot?: Obj): EndpointRow[];
62
+ export declare function sectionRows(model: TuiModel, width?: number): (Obj | EndpointRow | DeliverySummary | string)[];
63
+ export declare function operation(row: EndpointRow): string;
64
+ export declare function collisionAliases(snapshot?: Obj): Set<string>;
65
+ export declare function summaryLine(row: DeliverySummary): string;
66
+ export declare const isLoopback: (value: unknown) => boolean;
67
+ export declare function modalFits(model: Readonly<TuiModel>, width: number, height: number): boolean;
@@ -0,0 +1,136 @@
1
+ import wrapAnsi from "wrap-ansi";
2
+ export const object = (value) => !!value && typeof value === "object" && !Array.isArray(value);
3
+ export const list = (value) => Array.isArray(value) ? value.filter(object) : [];
4
+ export const text = (value, fallback = "not reported") => typeof value === "string" && value.length > 0 ? value : fallback;
5
+ const ansi = /(?:\u001b\][^\u0007\u001b]*(?:\u0007|\u001b\\)|\u001b[P^_X][\s\S]*?\u001b\\|\u001b\[[0-?]*[ -/]*[@-~]|\u001b[@-_])/g;
6
+ export const clean = (value) => text(value, "").replace(ansi, "")
7
+ .replace(/[\p{Cc}\p{Cf}]/gu, (character) => character === "\u200d" ? character
8
+ : character === "\n" || character === "\r" || character === "\t" ? " " : "?");
9
+ export const errorText = (error) => {
10
+ if (object(error) && typeof error.code === "string")
11
+ return clean(error.code);
12
+ if (error instanceof Error && typeof error.code === "string")
13
+ return clean(error.code);
14
+ return "CONTROL_UNAVAILABLE";
15
+ };
16
+ export const age = (milliseconds) => {
17
+ const ms = typeof milliseconds === "number" && Number.isFinite(milliseconds) ? Math.max(0, milliseconds) : 0;
18
+ if (ms < 1_000)
19
+ return `${Math.round(ms)}ms`;
20
+ if (ms < 60_000)
21
+ return `${Math.floor(ms / 1_000)}s`;
22
+ if (ms < 3_600_000)
23
+ return `${Math.floor(ms / 60_000)}m`;
24
+ return `${Math.floor(ms / 3_600_000)}h`;
25
+ };
26
+ export const json = (value) => {
27
+ try {
28
+ return clean(JSON.stringify(value));
29
+ }
30
+ catch {
31
+ return "unprintable result";
32
+ }
33
+ };
34
+ export const endpointKey = (row) => `${row.host}\0${row.id}`;
35
+ const loopback = (value) => typeof value === "string" && /^loopback-[ab]-[0-9a-f]{8}@/.test(value);
36
+ export const unsuccessful = new Set(["failed", "cancelled", "expired", "ambiguous", "unconfirmed"]);
37
+ export const deliveryToken = /^dlv_[A-Za-z0-9_-]{24}$/;
38
+ export function tokenFeedback(token) {
39
+ if (deliveryToken.test(token))
40
+ return "format valid";
41
+ if ("dlv_".startsWith(token) || /^dlv_[A-Za-z0-9_-]{0,23}$/.test(token))
42
+ return "format incomplete";
43
+ return "format invalid";
44
+ }
45
+ export const groups = ["Working", "Waiting", "Faulted", "Ready", "Dormant", "Not reporting", "Cached"];
46
+ export function endpointGroup(row) {
47
+ if (!row.local)
48
+ return 6;
49
+ return { busy: 0, waiting: 1, systemError: 2, idle: 3, dormant: 4 }[String(row.codex?.state)] ?? 5;
50
+ }
51
+ export function endpointRows(snapshot) {
52
+ const local = list(snapshot?.routes).map((row) => ({ id: text(row.id), alias: text(row.alias), provider: text(row.provider),
53
+ host: text(row.host), local: true, ...(typeof row.queueDepth === "number" ? { queueDepth: row.queueDepth } : {}),
54
+ ...(object(row.lastOperation) ? { lastOperation: row.lastOperation } : {}), ...(object(row.codex) ? { codex: row.codex } : {}) }));
55
+ const federation = object(snapshot?.federation) ? snapshot.federation : undefined;
56
+ const remote = list(federation?.nodes).flatMap((node) => {
57
+ const common = { host: text(node.host), local: false,
58
+ ...(typeof node.observedAt === "string" ? { observedAt: node.observedAt } : {}),
59
+ ...(typeof node.safeErrorCode === "string" ? { safeErrorCode: node.safeErrorCode } : {}) };
60
+ const routes = list(node.routes);
61
+ return routes.length ? routes.map((row) => ({ ...common, id: text(row.id), alias: text(row.alias),
62
+ provider: text(row.provider), host: text(row.host, common.host) }))
63
+ : [{ ...common, id: "", alias: "No cached endpoints", provider: "-", placeholder: true }];
64
+ });
65
+ return [...local, ...remote].sort((a, b) => endpointGroup(a) - endpointGroup(b));
66
+ }
67
+ function deliveryRows(snapshot) {
68
+ const sorted = list(snapshot?.messages).sort((a, b) => (typeof a.ageMs === "number" ? a.ageMs : Number.MAX_SAFE_INTEGER) -
69
+ (typeof b.ageMs === "number" ? b.ageMs : Number.MAX_SAFE_INTEGER));
70
+ const result = [];
71
+ for (const row of sorted) {
72
+ const anonymous = typeof row.source !== "string" && typeof row.target !== "string", last = result.at(-1);
73
+ if (object(last) && last.summary === true && anonymous && Array.isArray(last.rows))
74
+ result[result.length - 1] = { summary: true, rows: [...last.rows.filter(object), row] };
75
+ else if (anonymous)
76
+ result.push({ summary: true, rows: [row] });
77
+ else
78
+ result.push(row);
79
+ }
80
+ return result;
81
+ }
82
+ export function sectionRows(model, width = 80) {
83
+ if (model.section === "endpoints")
84
+ return endpointRows(model.snapshot);
85
+ if (model.section === "deliveries")
86
+ return deliveryRows(model.snapshot);
87
+ if (model.section === "result") {
88
+ if (!model.result)
89
+ return [];
90
+ let value = model.result.value;
91
+ try {
92
+ value = JSON.stringify(JSON.parse(value), null, 2);
93
+ }
94
+ catch { /* A refusal includes plain operator guidance. */ }
95
+ return [`${model.result.label}:`, ...value.split("\n").flatMap((line) => wrapAnsi(clean(line), Math.max(1, width - 2), { hard: true, trim: false }).split("\n"))];
96
+ }
97
+ return list(model.snapshot?.retirements);
98
+ }
99
+ export function operation(row) {
100
+ if (!row.lastOperation)
101
+ return "not yet observed";
102
+ const outcome = text(row.lastOperation.outcome);
103
+ return outcome === "delivered" ? "delivered" : `${outcome} !${text(row.lastOperation.code)}`;
104
+ }
105
+ export function collisionAliases(snapshot) {
106
+ const counts = new Map();
107
+ for (const row of endpointRows(snapshot))
108
+ if (!row.placeholder)
109
+ counts.set(row.alias, (counts.get(row.alias) ?? 0) + 1);
110
+ return new Set([...counts].filter(([, count]) => count > 1).map(([alias]) => alias));
111
+ }
112
+ export function summaryLine(row) {
113
+ const counts = new Map();
114
+ for (const item of row.rows) {
115
+ const state = text(item.state), label = `${state}${unsuccessful.has(state) && item.safeErrorCode ? ` !${text(item.safeErrorCode)}` : ""}`;
116
+ counts.set(label, (counts.get(label) ?? 0) + 1);
117
+ }
118
+ return `${row.rows.length} unattributed deliveries · ${[...counts].map(([label, count]) => `${label} ${count}`).join(" · ")}`;
119
+ }
120
+ export const isLoopback = loopback;
121
+ export function modalFits(model, width, height) {
122
+ if (width < 48)
123
+ return false;
124
+ const inner = Math.min(78, width - 4) - 6;
125
+ const count = (value) => wrapAnsi(clean(value), inner, { hard: true, trim: false }).split("\n").length;
126
+ if (model.mode === "token")
127
+ return height >= 11;
128
+ if (model.mode !== "confirm" || !model.retiring)
129
+ return true;
130
+ const row = model.retiring;
131
+ const rows = 11 + count(`Host: ${row.host}`) + count(`Alias: ${row.alias}`) + count(row.id) +
132
+ count(`${row.provider} · queue ${row.queueDepth ?? 0} · last ${operation(row)}`) +
133
+ count("queued/reserved work is cancelled, armed work becomes ambiguous, accepted work becomes unconfirmed — cannot be undone.");
134
+ return rows <= height;
135
+ }
136
+ //# sourceMappingURL=tui-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-model.js","sourceRoot":"","sources":["../../../src/gateway/tui-model.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAwCjC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAgB,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACtH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAc,EAAS,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAc,EAAE,QAAQ,GAAG,cAAc,EAAU,EAAE,CACxE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAEnE,MAAM,IAAI,GAAG,qHAAqH,CAAC;AACnI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;KAC/E,OAAO,CAAC,kBAAkB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS;IAC5E,CAAC,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAElF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAU,EAAE;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9E,IAAI,KAAK,YAAY,KAAK,IAAI,OAAQ,KAAoC,CAAC,IAAI,KAAK,QAAQ;QAC1F,OAAO,KAAK,CAAE,KAAkC,CAAC,IAAI,CAAC,CAAC;IACzD,OAAO,qBAAqB,CAAC;AAC/B,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,YAAqB,EAAU,EAAE;IACnD,MAAM,EAAE,GAAG,OAAO,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7G,IAAI,EAAE,GAAG,KAAK;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC;IAC7C,IAAI,EAAE,GAAG,MAAM;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC;IACrD,IAAI,EAAE,GAAG,SAAS;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;IACzD,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC;AAC1C,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAc,EAAU,EAAE;IAC7C,IAAI,CAAC;QAAC,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAAC,CAAC;IAC5C,MAAM,CAAC;QAAC,OAAO,oBAAoB,CAAC;IAAC,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAqC,EAAU,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC;AACvG,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;AACpG,MAAM,CAAC,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEvD,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IACrD,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,mBAAmB,CAAC;IACpG,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,CAAU,CAAC;AAChH,MAAM,UAAU,aAAa,CAAC,GAAgB;IAC5C,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACzB,OAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAA6B,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;AACjI,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAc;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzH,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACrI,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAc;YAC3D,GAAG,CAAC,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,GAAG,CAAC,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAC/F,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,YAAY,CAAC,QAAc;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACtH,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAChF,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;aACrF,IAAI,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;YAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAe,EAAE,KAAK,GAAG,EAAE;IACrD,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxE,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/B,IAAI,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iDAAiD,CAAC,CAAC;QACvH,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACtE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAgB;IACxC,IAAI,CAAC,GAAG,CAAC,aAAa;QAAE,OAAO,kBAAkB,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/F,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,QAAc;IAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACxH,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAoB;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,GAAG,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1I,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,8BAA8B,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAChI,CAAC;AACD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AAEnC,MAAM,UAAU,SAAS,CAAC,KAAyB,EAAE,KAAa,EAAE,MAAc;IAChF,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAC/G,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,MAAM,IAAI,EAAE,CAAC;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC3B,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACzF,KAAK,CAAC,GAAG,GAAG,CAAC,QAAQ,YAAY,GAAG,CAAC,UAAU,IAAI,CAAC,WAAW,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAChF,KAAK,CAAC,wHAAwH,CAAC,CAAC;IAClI,OAAO,IAAI,IAAI,MAAM,CAAC;AACxB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { type TuiModel } from "./tui-model.js";
3
+ export type TuiViewProps = Readonly<{
4
+ model: Readonly<TuiModel>;
5
+ columns: number;
6
+ rows: number;
7
+ now: number;
8
+ color: boolean;
9
+ }>;
10
+ export { modalFits } from "./tui-model.js";
11
+ export declare function TuiView({ model, columns, rows, now, color }: TuiViewProps): React.JSX.Element;
@@ -0,0 +1,206 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Box, Text } from "ink";
4
+ import stringWidth from "string-width";
5
+ import { age, clean, collisionAliases, endpointGroup, endpointKey, groups, isLoopback, list, modalFits, object, operation, sectionRows, summaryLine, text, tokenFeedback, unsuccessful, } from "./tui-model.js";
6
+ function tone(value) {
7
+ if (["healthy", "idle", "ready", "delivered", "ok"].includes(value))
8
+ return "good";
9
+ if (["busy", "working", "queued", "reserved", "armed", "accepted"].includes(value))
10
+ return "busy";
11
+ if (value === "waiting")
12
+ return "waiting";
13
+ if (["dormant", "cached", "unknown"].includes(value))
14
+ return "dormant";
15
+ if (value === "stale")
16
+ return "busy";
17
+ if (unsuccessful.has(value) || ["unreachable", "not reachable", "degraded", "systemError"].includes(value))
18
+ return "bad";
19
+ return "plain";
20
+ }
21
+ function ToneText({ children, value, color, bold = false, inverse = false, dim = false, wrap = "truncate-end" }) {
22
+ const semantic = tone(value ?? "");
23
+ const foreground = !color ? undefined : semantic === "good" ? "green" : semantic === "busy" ? "yellow"
24
+ : semantic === "waiting" ? "magenta" : semantic === "bad" ? "red" : undefined;
25
+ return _jsx(Text, { ...(foreground ? { color: foreground } : {}), bold: color && bold, inverse: color && inverse, dimColor: color && (dim || semantic === "dormant" || value === "stale"), ...(wrap ? { wrap } : {}), children: children });
26
+ }
27
+ const graphemes = new Intl.Segmenter("en", { granularity: "grapheme" });
28
+ function padded(value, width, right = false) {
29
+ const safe = clean(value);
30
+ let output = safe;
31
+ if (stringWidth(safe) > width) {
32
+ output = "";
33
+ for (const { segment } of graphemes.segment(safe)) {
34
+ if (stringWidth(output + segment) > width - 1)
35
+ break;
36
+ output += segment;
37
+ }
38
+ output += width > 0 ? "…" : "";
39
+ }
40
+ const space = " ".repeat(Math.max(0, width - stringWidth(output)));
41
+ return right ? space + output : output + space;
42
+ }
43
+ function DataLine({ cells, selected, color, width }) {
44
+ return _jsx(Box, { height: 1, flexShrink: 0, width: width, children: _jsxs(Text, { inverse: selected && color, children: [selected ? "> " : " ", cells.map((cell, index) => _jsx(ToneText, { color: color, ...(!selected && cell.tone ? { value: cell.tone } : {}), bold: cell.bold ?? false, dim: !selected && (cell.dim ?? false), children: index < cells.length - 1 ? `${padded(cell.value, Math.max(0, cell.width - 1), cell.right)} ` : padded(cell.value, cell.width, cell.right) }, index))] }) });
45
+ }
46
+ function endpointWidths(width) {
47
+ const alias = Math.min(48, Math.max(10, width - 63));
48
+ return { alias, outcome: Math.max(1, width - alias - 27) };
49
+ }
50
+ function Rule({ width, color }) {
51
+ return _jsx(ToneText, { color: color, dim: true, children: "─".repeat(Math.max(1, width)) });
52
+ }
53
+ function HostTabs({ model, color, width }) {
54
+ if (!model.hosts || model.hosts.length < 2)
55
+ return null;
56
+ const count = Math.max(1, Math.floor(width / 24)), active = Math.max(0, model.hosts.findIndex((host) => host.selected));
57
+ const start = Math.max(0, Math.min(active - 1, model.hosts.length - count));
58
+ return _jsx(Box, { flexShrink: 0, height: 1, overflow: "hidden", children: model.hosts.slice(start, start + count).map((host) => _jsxs(Box, { width: Math.floor(width / Math.min(count, model.hosts.length)), paddingRight: 1, flexShrink: 0, children: [_jsx(ToneText, { color: color, value: host.state, children: "\u25CF " }), _jsx(ToneText, { color: color, value: host.state, bold: host.selected, wrap: "truncate-end", children: host.selected ? `[${clean(host.host)} · ${clean(host.state)}]` : `${clean(host.host)} · ${clean(host.state)}` })] }, host.host)) });
59
+ }
60
+ function Header({ model, width, now, color }) {
61
+ const snapshot = model.snapshot;
62
+ const health = model.error ? "UNREACHABLE" : snapshot ? text(snapshot.health, "unknown") : "not reachable";
63
+ const elapsed = model.snapshotAt === undefined ? "never" : now - model.snapshotAt < 1_000 ? "just now" : `${age(now - model.snapshotAt)} ago`;
64
+ return _jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [_jsx(HostTabs, { model: model, color: color, width: width }), _jsxs(Box, { height: 1, children: [_jsx(Box, { width: Math.max(12, width - 43), children: _jsxs(ToneText, { color: color, bold: true, wrap: "truncate-end", children: ["Embassy ", clean(model.host ?? "local")] }) }), _jsx(Box, { width: 25, children: _jsxs(ToneText, { color: color, value: health.toLowerCase(), children: ["broker ", clean(health)] }) }), _jsx(Box, { width: 18, children: _jsxs(ToneText, { color: color, dim: true, wrap: "truncate-end", children: ["ledger rev ", String(snapshot?.revision ?? "-")] }) })] }), _jsx(Box, { height: 1, flexShrink: 0, children: _jsxs(ToneText, { color: color, dim: true, wrap: "truncate-end", children: ["Updated ", elapsed, object(snapshot?.codex) ? ` · Codex discovery ${snapshot.codex.complete ? "up to 20 most recent" : "partial"}${snapshot.codex.truncated ? " · truncated" : ""} · ${observationAge(snapshot.codex.observedAt, now)}${snapshot.codex.safeErrorCode ? ` !${clean(text(snapshot.codex.safeErrorCode))}` : ""}` : ""] }) }), model.error ? _jsxs(_Fragment, { children: [_jsxs(ToneText, { color: color, value: "stale", children: ["STALE ", age(now - (model.staleSince ?? now)), " !", clean(model.error)] }), _jsxs(ToneText, { color: color, dim: true, children: [snapshot ? `Last-known: ${clean(text(snapshot.health))}. ` : "", "Run embassy service status on ", clean(model.host ?? "local"), "."] }), model.errorDetail ? _jsx(ToneText, { color: color, value: "failed", children: clean(model.errorDetail) }) : null] }) : snapshot?.safeErrorCode ? _jsxs(ToneText, { color: color, value: "failed", children: ["!", clean(text(snapshot.safeErrorCode))] }) : null, model.restarted ? _jsx(ToneText, { color: color, value: "busy", children: "Ledger revision decreased; broker restarted/reset." }) : null, _jsx(ToneText, { color: color, dim: true, children: padded("── not a provider readiness proof ", width).replace(/ +$/, (spaces) => " " + "─".repeat(Math.max(0, spaces.length - 1))) })] });
65
+ }
66
+ function observationAge(value, now) {
67
+ const parsed = typeof value === "string" ? Date.parse(value) : Number.NaN;
68
+ return Number.isFinite(parsed) ? `${age(now - parsed)} ago` : "not yet refreshed";
69
+ }
70
+ function SectionTabs({ model, color }) {
71
+ const failed = list(model.snapshot?.messages).filter((row) => row.state === "failed").length;
72
+ const tabs = ["endpoints", "deliveries", "retirements", "result"];
73
+ return _jsx(Box, { flexShrink: 0, children: tabs.map((section, index) => {
74
+ const selected = model.section === section;
75
+ const label = `${index + 1} ${section}`;
76
+ return _jsxs(Box, { marginRight: 2, children: [_jsx(ToneText, { color: color, bold: selected, dim: !selected, children: selected ? `[${label}` : label }), section === "deliveries" && failed ? _jsxs(ToneText, { color: color, value: "failed", children: [" (", failed, " failed)"] }) : null, selected ? _jsx(ToneText, { color: color, bold: true, children: "]" }) : null] }, section);
77
+ }) });
78
+ }
79
+ function EndpointLine({ row, selected, collisions, color, now, width }) {
80
+ const state = row.local ? text(row.codex?.state, "unknown") : row.safeErrorCode ? "stale" : "cached";
81
+ const alias = clean(row.alias), collision = collisions.has(row.alias);
82
+ const sizes = endpointWidths(width), outcome = text(row.lastOperation?.outcome, "");
83
+ return _jsxs(Box, { flexDirection: "column", children: [_jsx(DataLine, { selected: selected, color: color, width: width, cells: [
84
+ { value: state, width: 12, tone: state }, { value: alias, width: sizes.alias, bold: true },
85
+ { value: row.provider, width: 7, dim: true }, { value: row.local ? String(row.queueDepth ?? 0) : "—", width: 6, right: true, dim: true },
86
+ { value: row.local ? operation(row) : "not reported", width: sizes.outcome,
87
+ tone: outcome === "failed" || outcome === "delivered" ? outcome : "", dim: !["failed", "delivered"].includes(outcome) },
88
+ ] }), collision ? _jsx(Box, { paddingLeft: 14, height: 1, children: _jsxs(ToneText, { color: color, dim: true, wrap: "truncate-end", children: ["ambiguous name \u00B7 endpoint \u2026", clean(row.id.slice(-8))] }) }) : null, !row.local ? _jsx(Box, { paddingLeft: 14, height: 1, children: _jsxs(ToneText, { color: color, value: row.safeErrorCode ? "stale" : "dormant", dim: true, wrap: "truncate-end", children: ["SSH ", clean(row.host), " \u00B7 catalog ", observationAge(row.observedAt, now), row.safeErrorCode ? ` !${clean(row.safeErrorCode)}` : "", " \u00B7 queue/last not reported"] }) }) : null] });
89
+ }
90
+ function DeliveryLine({ row, selected, color, width }) {
91
+ if (row.summary === true)
92
+ return _jsx(DataLine, { selected: selected, color: color, width: width, cells: [{ value: summaryLine(row), width: width - 2,
93
+ tone: row.rows.some((item) => unsuccessful.has(String(item.state))) ? "failed" : "" }] });
94
+ const item = row;
95
+ const state = text(item.state), fault = unsuccessful.has(state) && item.safeErrorCode ? ` !${clean(text(item.safeErrorCode))}` : "";
96
+ const source = clean(text(item.source, "unavailable sender")), target = clean(text(item.target, "unavailable recipient"));
97
+ return _jsxs(Box, { flexDirection: "column", flexShrink: 0, children: [_jsx(DataLine, { selected: selected, color: color, width: width, cells: [
98
+ { value: `${age(item.ageMs)} ago`, width: 10, right: true, dim: true }, { value: state, width: 13, tone: state },
99
+ { value: `${source} -> ${target}${isLoopback(source) || isLoopback(target) ? " (loopback check)" : ""}`, width: width - 25, bold: true },
100
+ ] }), fault ? _jsx(Box, { paddingLeft: 25, height: 1, children: _jsx(ToneText, { color: color, value: "failed", wrap: "truncate-end", children: fault.trim() }) }) : null] });
101
+ }
102
+ function content(model, color, now, width) {
103
+ const rows = sectionRows(model, width), selected = selectedIndex(model, rows), collisions = collisionAliases(model.snapshot);
104
+ const entries = [];
105
+ if (model.section === "endpoints") {
106
+ let prior = -1;
107
+ for (const [index, item] of rows.entries()) {
108
+ const group = endpointGroup(item);
109
+ if (group !== prior) {
110
+ const count = rows.filter((row) => endpointGroup(row) === group).length;
111
+ entries.push({ key: `group-${group}`, height: 1, node: _jsxs(ToneText, { color: color, bold: true, children: [groups[group], " (", count, ")"] }) });
112
+ prior = group;
113
+ }
114
+ entries.push({ key: `${endpointKey(item)}\0${index}`, index, height: 1 + Number(collisions.has(item.alias)) + Number(!item.local),
115
+ node: _jsx(EndpointLine, { row: item, selected: index === selected, collisions: collisions, color: color, now: now, width: width }) });
116
+ }
117
+ }
118
+ else if (model.section === "deliveries") {
119
+ rows.forEach((row, index) => entries.push({ key: `delivery-${index}`, index,
120
+ height: object(row) && !row.summary && unsuccessful.has(String(row.state)) && row.safeErrorCode ? 2 : 1,
121
+ node: _jsx(DeliveryLine, { row: row, selected: index === selected, color: color, width: width }) }));
122
+ }
123
+ else if (model.section === "retirements") {
124
+ rows.forEach((row, index) => {
125
+ const item = row, alias = text(item.alias), at = Date.parse(String(item.at));
126
+ entries.push({ key: `retirement-${index}`, index, height: 1,
127
+ node: _jsx(DataLine, { selected: index === selected, color: color, width: width, cells: [
128
+ { value: Number.isFinite(at) ? `${age(now - at)} ago` : text(item.at), width: 11, right: true, dim: true },
129
+ { value: alias + (isLoopback(alias) ? " (loopback check)" : ""), width: width - 13, bold: !isLoopback(alias), dim: isLoopback(alias) },
130
+ ] }) });
131
+ });
132
+ }
133
+ else if (model.result) {
134
+ rows.forEach((row, index) => {
135
+ const state = /"(?:state|status|health|outcome)":\s*"([a-zA-Z]+)"/.exec(String(row))?.[1];
136
+ entries.push({ key: `result-${index}`, index, height: 1,
137
+ node: _jsx(DataLine, { selected: index === selected, color: color, width: width, cells: [
138
+ { value: clean(row), width: width - 2, ...(state ? { tone: state } : {}), bold: index === 0 },
139
+ ] }) });
140
+ });
141
+ }
142
+ return entries;
143
+ }
144
+ function selectedIndex(model, rows = sectionRows(model)) {
145
+ if (model.section === "endpoints" && model.selectedEndpoint)
146
+ return rows.findIndex((row) => endpointKey(row) === model.selectedEndpoint);
147
+ return Math.max(0, Math.min(model.selected[model.section] ?? 0, Math.max(0, rows.length - 1)));
148
+ }
149
+ function viewport(all, focus, height) {
150
+ let start = 0, end = 0;
151
+ while (start < all.length) {
152
+ let remaining = height - Number(all.slice(0, start).some((entry) => entry.index !== undefined));
153
+ end = start;
154
+ while (end < all.length && all[end].height <= remaining) {
155
+ remaining -= all[end].height;
156
+ end++;
157
+ }
158
+ if (end < all.length && remaining === 0)
159
+ end--;
160
+ while (end > start && all[end - 1].index === undefined)
161
+ end--;
162
+ if (focus < 0 || focus < end || start >= focus)
163
+ break;
164
+ start++;
165
+ }
166
+ const above = all.slice(0, start).filter((entry) => entry.index !== undefined).length;
167
+ const below = all.slice(end).filter((entry) => entry.index !== undefined).length;
168
+ return { entries: all.slice(start, end), above, below };
169
+ }
170
+ function DialogContent({ model, columns, color }) {
171
+ const retirement = model.mode === "confirm" ? model.retiring : undefined;
172
+ return _jsxs(Box, { width: Math.min(78, columns - 4), borderStyle: "round", borderColor: color ? "gray" : undefined, paddingX: 2, paddingY: 1, flexDirection: "column", children: [_jsx(ToneText, { color: color, bold: true, children: retirement ? "Retire endpoint" : "Look up delivery" }), _jsx(Box, { height: 1 }), retirement ? _jsxs(_Fragment, { children: [_jsxs(ToneText, { color: color, bold: true, wrap: "wrap", children: ["Host: ", clean(retirement.host)] }), _jsxs(ToneText, { color: color, bold: true, wrap: "wrap", children: ["Alias: ", clean(retirement.alias)] }), _jsx(ToneText, { color: color, dim: true, children: "Endpoint ID" }), _jsx(ToneText, { color: color, bold: true, wrap: "wrap", children: clean(retirement.id) }), _jsx(Box, { height: 1 }), _jsxs(ToneText, { color: color, bold: true, wrap: "wrap", children: [clean(retirement.provider), " \u00B7 queue ", retirement.queueDepth ?? 0, " \u00B7 last ", clean(operation(retirement))] }), _jsx(Box, { height: 1 }), _jsx(ToneText, { color: color, value: "failed", wrap: "wrap", children: "queued/reserved work is cancelled, armed work becomes ambiguous, accepted work becomes unconfirmed \u2014 cannot be undone." }), _jsx(Box, { height: 1 }), _jsxs(Box, { children: [_jsx(ToneText, { color: color, value: "failed", bold: true, children: "y confirm" }), _jsx(ToneText, { color: color, children: " \u00B7 " }), _jsx(ToneText, { color: color, bold: true, children: "[N] cancel" })] })] }) : _jsxs(_Fragment, { children: [_jsx(ToneText, { color: color, dim: true, children: "Delivery token" }), _jsx(ToneText, { color: color, bold: true, children: clean(model.token || "dlv_…") }), _jsx(ToneText, { color: color, dim: true, children: tokenFeedback(model.token) }), _jsx(Box, { height: 1 }), _jsx(ToneText, { color: color, bold: true, children: "Enter look up \u00B7 Esc cancel" })] })] });
173
+ }
174
+ export { modalFits } from "./tui-model.js";
175
+ function Dialog({ model, columns, rows, color }) {
176
+ if (!modalFits(model, columns, rows))
177
+ return _jsx(TooSmall, { mode: model.mode, color: color });
178
+ return _jsx(Box, { width: columns, height: rows, alignItems: "center", justifyContent: "center", children: _jsx(DialogContent, { model: model, columns: columns, color: color }) });
179
+ }
180
+ function TooSmall({ mode, color }) {
181
+ return _jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsx(Box, { height: 1, flexShrink: 0, children: _jsx(ToneText, { color: color, bold: true, wrap: "truncate-end", children: "Embassy \u00B7 terminal too small" }) }), _jsx(Box, { height: 1, flexShrink: 0, children: _jsx(ToneText, { color: color, dim: true, wrap: "truncate-end", children: mode === "confirm" ? "Resize to show the exact endpoint ID and consequences." : "Resize: needs 48×10." }) }), _jsx(Box, { height: 1, flexShrink: 0, children: _jsx(ToneText, { color: color, wrap: "truncate-end", children: mode === "confirm" ? "N cancel" : mode === "token" ? "Esc cancel" : "q quit" }) })] });
182
+ }
183
+ export function TuiView({ model, columns, rows, now, color }) {
184
+ const width = Math.max(1, columns), height = Math.max(1, rows);
185
+ if (height < 10 || width < 48)
186
+ return _jsx(Box, { width: width, height: height, overflow: "hidden", children: _jsx(TooSmall, { mode: model.mode, color: color }) });
187
+ if (model.mode !== "browse")
188
+ return _jsx(Dialog, { model: model, columns: width, rows: height, color: color });
189
+ const all = content(model, color, now, width), source = sectionRows(model, width), selected = selectedIndex(model, source);
190
+ const headerRows = 3 + (model.hosts && model.hosts.length > 1 ? 1 : 0) + (model.error ? 2 + (model.errorDetail ? 1 : 0) : model.snapshot?.safeErrorCode ? 1 : 0)
191
+ + (model.restarted ? 1 : 0);
192
+ const actionRows = model.action ? 1 : 0, available = Math.max(1, height - headerRows - actionRows - 3 - Number(model.section === "endpoints"));
193
+ const focus = all.findIndex((entry) => entry.index === selected);
194
+ const visible = viewport(all, focus, available), sizes = endpointWidths(width);
195
+ const counter = `${model.section}${model.section === "result" ? " line" : ""} ${source.length ? `${selected < 0 ? "-" : selected + 1}/${source.length}` : "0/0"}`;
196
+ const empty = model.error ? `Broker unreachable (!${model.error}).` : !model.snapshot ? "Broker not reachable."
197
+ : model.section === "endpoints" ? "No endpoints registered." : model.section === "deliveries" ? "No deliveries yet."
198
+ : model.section === "retirements" ? "No retirements." : "No result yet. Run an action to see its result here.";
199
+ return _jsxs(Box, { width: width, height: height, flexDirection: "column", children: [_jsx(Header, { model: model, width: width, now: now, color: color }), _jsx(SectionTabs, { model: model, color: color }), model.section === "endpoints" ? _jsx(DataLine, { selected: false, color: color, width: width, cells: [
200
+ { value: "State", width: 12, dim: true }, { value: "Endpoint", width: sizes.alias, dim: true },
201
+ { value: "Type", width: 7, dim: true }, { value: "Queue", width: 6, right: true, dim: true },
202
+ { value: "Outcome", width: sizes.outcome, dim: true },
203
+ ] }) : null, _jsxs(Box, { flexDirection: "column", height: available, flexShrink: 0, overflow: "hidden", children: [visible.above > 0 ? _jsxs(ToneText, { color: color, dim: true, children: ["\u2191 ", visible.above, " more"] }) : null, visible.entries.length ? visible.entries.map((entry) => _jsx(React.Fragment, { children: entry.node }, entry.key))
204
+ : _jsx(ToneText, { color: color, dim: true, children: empty }), _jsx(Box, { flexGrow: 1 }), visible.below > 0 ? _jsxs(ToneText, { color: color, dim: true, children: ["\u2193 ", visible.below, " more"] }) : null] }), model.action ? _jsxs(ToneText, { color: color, ...(model.actionRunning ? { value: "busy" } : {}), wrap: "truncate-end", children: [clean(model.action), model.actionRunning ? " — polling paused" : ""] }) : null, _jsx(Rule, { width: width, color: color }), _jsx(Box, { height: 1, flexShrink: 0, children: _jsxs(ToneText, { color: color, dim: true, wrap: "truncate-end", children: [counter, " \u00B7 [/]:host Tab:view \u2191\u2193 r:refresh c:check d:token x:retire q:quit"] }) })] });
205
+ }
206
+ //# sourceMappingURL=tui-view.js.map