agent-embassy 3.1.0 → 4.1.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 +31 -0
- package/CONTRIBUTING.md +92 -202
- package/README.md +179 -162
- package/SECURITY.md +191 -348
- package/dist/src/gateway/broker-check.d.ts +26 -0
- package/dist/src/gateway/broker-check.js +89 -0
- package/dist/src/gateway/broker-check.js.map +1 -0
- package/dist/src/gateway/broker-control.d.ts +72 -0
- package/dist/src/gateway/broker-control.js +164 -0
- package/dist/src/gateway/broker-control.js.map +1 -0
- package/dist/src/gateway/broker.d.ts +117 -0
- package/dist/src/gateway/broker.js +186 -0
- package/dist/src/gateway/broker.js.map +1 -0
- package/dist/src/gateway/claude-peer.d.ts +1 -124
- package/dist/src/gateway/claude-peer.js +61 -1052
- package/dist/src/gateway/claude-peer.js.map +1 -1
- package/dist/src/gateway/codex-stateless-transport.d.ts +0 -12
- package/dist/src/gateway/codex-stateless-transport.js +9 -142
- package/dist/src/gateway/codex-stateless-transport.js.map +1 -1
- package/dist/src/gateway/config.d.ts +2 -6
- package/dist/src/gateway/config.js +17 -27
- package/dist/src/gateway/config.js.map +1 -1
- package/dist/src/gateway/coordinator.d.ts +57 -0
- package/dist/src/gateway/coordinator.js +217 -0
- package/dist/src/gateway/coordinator.js.map +1 -0
- package/dist/src/gateway/core-cli.d.ts +14 -0
- package/dist/src/gateway/core-cli.js +293 -0
- package/dist/src/gateway/core-cli.js.map +1 -0
- package/dist/src/gateway/core-service-command.d.ts +16 -0
- package/dist/src/gateway/core-service-command.js +71 -0
- package/dist/src/gateway/core-service-command.js.map +1 -0
- package/dist/src/gateway/core-version.d.ts +1 -0
- package/dist/src/gateway/core-version.js +2 -0
- package/dist/src/gateway/core-version.js.map +1 -0
- package/dist/src/gateway/endpoint-directory.d.ts +33 -0
- package/dist/src/gateway/endpoint-directory.js +223 -0
- package/dist/src/gateway/endpoint-directory.js.map +1 -0
- package/dist/src/gateway/federation.d.ts +89 -0
- package/dist/src/gateway/federation.js +632 -0
- package/dist/src/gateway/federation.js.map +1 -0
- package/dist/src/gateway/ledger-codec.d.ts +3 -0
- package/dist/src/gateway/ledger-codec.js +159 -0
- package/dist/src/gateway/ledger-codec.js.map +1 -0
- package/dist/src/gateway/ledger.d.ts +138 -0
- package/dist/src/gateway/ledger.js +319 -0
- package/dist/src/gateway/ledger.js.map +1 -0
- package/dist/src/gateway/local-control.d.ts +23 -0
- package/dist/src/gateway/local-control.js +489 -0
- package/dist/src/gateway/local-control.js.map +1 -0
- package/dist/src/gateway/native-destinations.d.ts +34 -0
- package/dist/src/gateway/native-destinations.js +272 -0
- package/dist/src/gateway/native-destinations.js.map +1 -0
- package/dist/src/gateway/owned-state.d.ts +57 -0
- package/dist/src/gateway/owned-state.js +398 -0
- package/dist/src/gateway/owned-state.js.map +1 -0
- package/dist/src/gateway/provenance-envelope.d.ts +3 -3
- package/dist/src/gateway/provenance-envelope.js +3 -23
- package/dist/src/gateway/provenance-envelope.js.map +1 -1
- package/dist/src/gateway/runtime.d.ts +41 -0
- package/dist/src/gateway/runtime.js +175 -0
- package/dist/src/gateway/runtime.js.map +1 -0
- package/dist/src/gateway/tui.d.ts +67 -0
- package/dist/src/gateway/tui.js +516 -0
- package/dist/src/gateway/tui.js.map +1 -0
- package/docs/CONFIGURATION.md +178 -266
- package/docs/DELIVERY.md +133 -82
- package/docs/GATEWAY-ARCHITECTURE.md +281 -949
- package/package.json +5 -5
- package/skills/embassy-peer/SKILL.md +38 -196
- package/skills/embassy-peer/agents/openai.yaml +2 -2
- package/dist/src/gateway/claude-helper-protocol.d.ts +0 -117
- package/dist/src/gateway/claude-helper-protocol.js +0 -122
- package/dist/src/gateway/claude-helper-protocol.js.map +0 -1
- package/dist/src/gateway/claude-helper-supervisor.d.ts +0 -87
- package/dist/src/gateway/claude-helper-supervisor.js +0 -374
- package/dist/src/gateway/claude-helper-supervisor.js.map +0 -1
- package/dist/src/gateway/claude-helper.d.ts +0 -1
- package/dist/src/gateway/claude-helper.js +0 -252
- package/dist/src/gateway/claude-helper.js.map +0 -1
- package/dist/src/gateway/cli.d.ts +0 -56
- package/dist/src/gateway/cli.js +0 -1532
- package/dist/src/gateway/cli.js.map +0 -1
- package/dist/src/gateway/codex-socket-holder.d.ts +0 -26
- package/dist/src/gateway/codex-socket-holder.js +0 -76
- package/dist/src/gateway/codex-socket-holder.js.map +0 -1
- package/dist/src/gateway/control.d.ts +0 -279
- package/dist/src/gateway/control.js +0 -933
- package/dist/src/gateway/control.js.map +0 -1
- package/dist/src/gateway/peer-client.d.ts +0 -58
- package/dist/src/gateway/peer-client.js +0 -217
- package/dist/src/gateway/peer-client.js.map +0 -1
- package/dist/src/gateway/peer-mailbox.d.ts +0 -78
- package/dist/src/gateway/peer-mailbox.js +0 -168
- package/dist/src/gateway/peer-mailbox.js.map +0 -1
- package/dist/src/gateway/peer-protocol.d.ts +0 -110
- package/dist/src/gateway/peer-protocol.js +0 -79
- package/dist/src/gateway/peer-protocol.js.map +0 -1
- package/dist/src/gateway/peer-stdio.d.ts +0 -23
- package/dist/src/gateway/peer-stdio.js +0 -100
- package/dist/src/gateway/peer-stdio.js.map +0 -1
- package/dist/src/gateway/providers.d.ts +0 -164
- package/dist/src/gateway/providers.js +0 -975
- package/dist/src/gateway/providers.js.map +0 -1
- package/dist/src/gateway/server.d.ts +0 -46
- package/dist/src/gateway/server.js +0 -216
- package/dist/src/gateway/server.js.map +0 -1
- package/dist/src/gateway/service.d.ts +0 -371
- package/dist/src/gateway/service.js +0 -2335
- package/dist/src/gateway/service.js.map +0 -1
- package/dist/src/gateway/status-view.d.ts +0 -119
- package/dist/src/gateway/status-view.js +0 -484
- package/dist/src/gateway/status-view.js.map +0 -1
- package/dist/src/gateway/store.d.ts +0 -188
- package/dist/src/gateway/store.js +0 -2360
- package/dist/src/gateway/store.js.map +0 -1
- package/dist/src/gateway/types.d.ts +0 -541
- package/dist/src/gateway/types.js +0 -332
- package/dist/src/gateway/types.js.map +0 -1
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import { PassThrough } from "node:stream";
|
|
2
|
+
import { emitKeypressEvents } from "node:readline";
|
|
3
|
+
const object = (value) => !!value && typeof value === "object" && !Array.isArray(value);
|
|
4
|
+
const list = (value) => Array.isArray(value) ? value.filter(object) : [];
|
|
5
|
+
const text = (value, fallback = "not reported") => typeof value === "string" && value.length > 0 ? value : fallback;
|
|
6
|
+
const clean = (value) => text(value, "").replace(/[\u0000-\u001f\u007f-\u009f]/g, (character) => character === "\n" || character === "\r" || character === "\t" ? " " : "?");
|
|
7
|
+
const errorText = (error) => {
|
|
8
|
+
if (object(error) && typeof error.code === "string")
|
|
9
|
+
return clean(error.code);
|
|
10
|
+
if (error instanceof Error && typeof error.code === "string")
|
|
11
|
+
return clean(error.code);
|
|
12
|
+
return "CONTROL_UNAVAILABLE";
|
|
13
|
+
};
|
|
14
|
+
const age = (milliseconds) => {
|
|
15
|
+
const ms = typeof milliseconds === "number" && Number.isFinite(milliseconds) ? Math.max(0, milliseconds) : 0;
|
|
16
|
+
if (ms < 1_000)
|
|
17
|
+
return `${Math.round(ms)}ms`;
|
|
18
|
+
if (ms < 60_000)
|
|
19
|
+
return `${Math.floor(ms / 1_000)}s`;
|
|
20
|
+
if (ms < 3_600_000)
|
|
21
|
+
return `${Math.floor(ms / 60_000)}m`;
|
|
22
|
+
return `${Math.floor(ms / 3_600_000)}h`;
|
|
23
|
+
};
|
|
24
|
+
const observedAge = (value, now) => {
|
|
25
|
+
const parsed = typeof value === "string" ? Date.parse(value) : Number.NaN;
|
|
26
|
+
return Number.isFinite(parsed) ? `${age(now - parsed)} ago` : "not yet refreshed";
|
|
27
|
+
};
|
|
28
|
+
const fit = (value, width) => {
|
|
29
|
+
if (width < 1)
|
|
30
|
+
return "";
|
|
31
|
+
const safe = clean(value);
|
|
32
|
+
return safe.length <= width ? safe : width === 1 ? "…" : `${safe.slice(0, width - 1)}…`;
|
|
33
|
+
};
|
|
34
|
+
const wrap = (value, width) => {
|
|
35
|
+
const safe = clean(value), size = Math.max(1, width);
|
|
36
|
+
return safe.length
|
|
37
|
+
? Array.from({ length: Math.ceil(safe.length / size) }, (_, i) => safe.slice(i * size, (i + 1) * size))
|
|
38
|
+
: [""];
|
|
39
|
+
};
|
|
40
|
+
const json = (value) => {
|
|
41
|
+
try {
|
|
42
|
+
return clean(JSON.stringify(value));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return "unprintable result";
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const endpointKey = (row) => `${row.host}\0${row.id}`;
|
|
49
|
+
const loopback = (value) => typeof value === "string" && /^loopback-[ab]-[0-9a-f]{8}@/.test(value);
|
|
50
|
+
const unsuccessful = new Set(["failed", "cancelled", "expired", "ambiguous", "unconfirmed"]);
|
|
51
|
+
const deliveryToken = /^dlv_[A-Za-z0-9_-]{24}$/;
|
|
52
|
+
function tokenFeedback(token) {
|
|
53
|
+
if (deliveryToken.test(token))
|
|
54
|
+
return "format valid";
|
|
55
|
+
if ("dlv_".startsWith(token) || /^dlv_[A-Za-z0-9_-]{0,23}$/.test(token))
|
|
56
|
+
return "format incomplete";
|
|
57
|
+
return "format invalid";
|
|
58
|
+
}
|
|
59
|
+
function endpointRows(snapshot) {
|
|
60
|
+
const local = list(snapshot?.routes).map((row) => ({ id: text(row.id), alias: text(row.alias), provider: text(row.provider),
|
|
61
|
+
host: text(row.host), local: true, ...(typeof row.queueDepth === "number" ? { queueDepth: row.queueDepth } : {}),
|
|
62
|
+
...(object(row.lastOperation) ? { lastOperation: row.lastOperation } : {}) }));
|
|
63
|
+
const federation = object(snapshot?.federation) ? snapshot.federation : undefined;
|
|
64
|
+
const remote = list(federation?.nodes).flatMap((node) => {
|
|
65
|
+
const common = { host: text(node.host), local: false,
|
|
66
|
+
...(typeof node.observedAt === "string" ? { observedAt: node.observedAt } : {}),
|
|
67
|
+
...(typeof node.safeErrorCode === "string" ? { safeErrorCode: node.safeErrorCode } : {}) };
|
|
68
|
+
const routes = list(node.routes);
|
|
69
|
+
return routes.length ? routes.map((row) => ({ ...common, id: text(row.id), alias: text(row.alias),
|
|
70
|
+
provider: text(row.provider), host: text(row.host, common.host) }))
|
|
71
|
+
: [{ ...common, id: "", alias: "No cached endpoints", provider: "-", placeholder: true }];
|
|
72
|
+
});
|
|
73
|
+
return [...local, ...remote];
|
|
74
|
+
}
|
|
75
|
+
function deliveryRows(snapshot) {
|
|
76
|
+
const sorted = list(snapshot?.messages).sort((a, b) => (typeof a.ageMs === "number" ? a.ageMs : Number.MAX_SAFE_INTEGER) -
|
|
77
|
+
(typeof b.ageMs === "number" ? b.ageMs : Number.MAX_SAFE_INTEGER));
|
|
78
|
+
const result = [];
|
|
79
|
+
for (const row of sorted) {
|
|
80
|
+
const anonymous = typeof row.source !== "string" && typeof row.target !== "string", last = result.at(-1);
|
|
81
|
+
if (anonymous && object(last) && last.summary === true && Array.isArray(last.rows))
|
|
82
|
+
result[result.length - 1] = { summary: true, rows: [...last.rows.filter(object), row] };
|
|
83
|
+
else if (anonymous)
|
|
84
|
+
result.push({ summary: true, rows: [row] });
|
|
85
|
+
else
|
|
86
|
+
result.push(row);
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
function sectionRows(model, width = 80) {
|
|
91
|
+
if (model.section === "endpoints")
|
|
92
|
+
return endpointRows(model.snapshot);
|
|
93
|
+
if (model.section === "deliveries")
|
|
94
|
+
return deliveryRows(model.snapshot);
|
|
95
|
+
if (model.section === "result")
|
|
96
|
+
return model.result ? [`${model.result.label}:`, ...wrap(model.result.value, Math.max(1, width - 2))] : [];
|
|
97
|
+
return list(model.snapshot?.retirements);
|
|
98
|
+
}
|
|
99
|
+
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
|
+
function summaryLine(row) {
|
|
106
|
+
const counts = new Map();
|
|
107
|
+
for (const item of row.rows) {
|
|
108
|
+
const state = text(item.state);
|
|
109
|
+
const label = `${state}${unsuccessful.has(state) && item.safeErrorCode ? ` !${text(item.safeErrorCode)}` : ""}`;
|
|
110
|
+
counts.set(label, (counts.get(label) ?? 0) + 1);
|
|
111
|
+
}
|
|
112
|
+
return `${row.rows.length} unattributed deliveries · ${[...counts].map(([label, count]) => `${label} ${count}`).join(" · ")}`;
|
|
113
|
+
}
|
|
114
|
+
function lineFor(row, section, now, collisions) {
|
|
115
|
+
if (typeof row === "string")
|
|
116
|
+
return row;
|
|
117
|
+
if ("summary" in row && row.summary === true)
|
|
118
|
+
return summaryLine(row);
|
|
119
|
+
if (section === "endpoints") {
|
|
120
|
+
const endpoint = row;
|
|
121
|
+
const collision = collisions.has(endpoint.alias) ? ` [ambiguous; …${endpoint.id.slice(-8)}]` : "";
|
|
122
|
+
return endpoint.local ? `${endpoint.alias}${collision} ${endpoint.provider} queued ${endpoint.queueDepth ?? 0} last ${operation(endpoint)}`
|
|
123
|
+
: `SSH ${endpoint.host} · catalog ${observedAge(endpoint.observedAt, now)}${endpoint.safeErrorCode ? ` / ${endpoint.safeErrorCode}` : ""}` +
|
|
124
|
+
` · ${endpoint.alias}${collision} ${endpoint.provider} queue/last not reported`;
|
|
125
|
+
}
|
|
126
|
+
const item = row;
|
|
127
|
+
if (section === "deliveries") {
|
|
128
|
+
const state = text(item.state);
|
|
129
|
+
const code = unsuccessful.has(state) && item.safeErrorCode ? ` !${text(item.safeErrorCode)}` : "";
|
|
130
|
+
const source = text(item.source, "retired sender"), target = text(item.target, "remote/retired recipient");
|
|
131
|
+
return `${age(item.ageMs)} ago ${state}${code} ${source} -> ${target}${loopback(source) || loopback(target) ? " (loopback check)" : ""}`;
|
|
132
|
+
}
|
|
133
|
+
const alias = text(item.alias), parsed = typeof item.at === "string" ? Date.parse(item.at) : Number.NaN;
|
|
134
|
+
return `${Number.isFinite(parsed) ? `${age(now - parsed)} ago` : text(item.at)} ${alias}${loopback(alias) ? " (loopback check)" : ""}`;
|
|
135
|
+
}
|
|
136
|
+
function collisionAliases(snapshot) {
|
|
137
|
+
const counts = new Map();
|
|
138
|
+
for (const row of endpointRows(snapshot))
|
|
139
|
+
if (!row.placeholder)
|
|
140
|
+
counts.set(row.alias, (counts.get(row.alias) ?? 0) + 1);
|
|
141
|
+
return new Set([...counts].filter(([, count]) => count > 1).map(([alias]) => alias));
|
|
142
|
+
}
|
|
143
|
+
function retirementLines(row, width) {
|
|
144
|
+
return ["Embassy retirement confirmation", ...wrap(`Alias: ${row.alias}`, width), ...wrap(`Endpoint ID: ${row.id}`, width),
|
|
145
|
+
...wrap(`${row.provider} · queued ${row.queueDepth ?? 0} · last ${operation(row)}`, width),
|
|
146
|
+
...wrap("queued/reserved work is cancelled, armed work becomes ambiguous, accepted work becomes unconfirmed — cannot be undone.", width),
|
|
147
|
+
"y confirm · N cancel"];
|
|
148
|
+
}
|
|
149
|
+
/** Pure screen renderer. It emits no ANSI so all dynamic values remain inert. */
|
|
150
|
+
export function renderTui(model, columns = 80, rows = 24, now = Date.now()) {
|
|
151
|
+
const width = Math.max(1, columns || 80), height = Math.max(1, rows || 24);
|
|
152
|
+
if (model.mode === "confirm" && model.retiring) {
|
|
153
|
+
const confirmation = retirementLines(model.retiring, width);
|
|
154
|
+
if (confirmation.length > height)
|
|
155
|
+
return ["Embassy · terminal too small", "Resize to show the exact endpoint ID and consequences.", "N cancel"]
|
|
156
|
+
.slice(0, height).map((line) => fit(line, width)).join("\n");
|
|
157
|
+
return [...confirmation, ...Array.from({ length: height - confirmation.length }, () => "")]
|
|
158
|
+
.map((line) => fit(line, width)).join("\n");
|
|
159
|
+
}
|
|
160
|
+
if (height < 6 || width < 24)
|
|
161
|
+
return ["Embassy · terminal too small", "Resize · q quit"]
|
|
162
|
+
.slice(0, height).map((line) => fit(line, width)).join("\n");
|
|
163
|
+
const snapshot = model.snapshot, host = model.host ? ` ${model.host}` : "", lines = [];
|
|
164
|
+
if (model.error) {
|
|
165
|
+
const elapsed = model.staleSince ? `, ${age(now - model.staleSince)}` : "";
|
|
166
|
+
lines.push(`Embassy${host} · broker UNREACHABLE (${model.error}${elapsed})`);
|
|
167
|
+
lines.push(`${snapshot ? `Last-known: ${text(snapshot.health, "unknown")} · ledger rev ${snapshot.revision ?? "-"}. ` : ""}Run embassy service status.`);
|
|
168
|
+
lines.push("STALE data · not a provider readiness proof");
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
const broker = snapshot ? text(snapshot.health, "unknown") : "not reachable";
|
|
172
|
+
const fault = snapshot?.safeErrorCode ? ` !${text(snapshot.safeErrorCode)}` : "";
|
|
173
|
+
lines.push(`Embassy${host} · broker ${broker}${fault} · ledger rev ${snapshot?.revision ?? "-"}`);
|
|
174
|
+
lines.push(`Updated ${model.snapshotAt ? `${age(now - model.snapshotAt)} ago` : "never"} · not a provider readiness proof`);
|
|
175
|
+
}
|
|
176
|
+
if (model.restarted)
|
|
177
|
+
lines.push("Ledger revision decreased; broker restarted/reset.");
|
|
178
|
+
const failed = list(snapshot?.messages).filter((row) => row.state === "failed").length;
|
|
179
|
+
const tabs = ["endpoints", "deliveries", "retirements", "result"];
|
|
180
|
+
const tabName = (tab) => tab === "deliveries" && failed ? `deliveries (${failed} failed)` : tab;
|
|
181
|
+
lines.push(tabs.map((tab) => tab === model.section ? `[${tabName(tab)}]` : ` ${tabName(tab)} `).join(" "));
|
|
182
|
+
const source = sectionRows(model, width);
|
|
183
|
+
let selected = Math.max(0, Math.min(model.selected[model.section] ?? 0, Math.max(0, source.length - 1)));
|
|
184
|
+
if (model.section === "endpoints" && model.selectedEndpoint)
|
|
185
|
+
selected = source.findIndex((row) => endpointKey(row) === model.selectedEndpoint);
|
|
186
|
+
const bodyHeight = Math.max(1, height - 9), start = selected < 0 ? 0
|
|
187
|
+
: Math.max(0, Math.min(selected - Math.floor(bodyHeight / 2), Math.max(0, source.length - bodyHeight)));
|
|
188
|
+
const visible = source.slice(start, start + bodyHeight);
|
|
189
|
+
if (visible.length === 0)
|
|
190
|
+
lines.push(" No rows.");
|
|
191
|
+
else
|
|
192
|
+
visible.forEach((row, offset) => lines.push(`${start + offset === selected ? ">" : " "} ${lineFor(row, model.section, now, collisionAliases(snapshot))}`));
|
|
193
|
+
lines.push(`${model.section} ${source.length ? `${selected < 0 ? "-" : selected + 1}/${source.length}` : "0/0"}`);
|
|
194
|
+
if (model.mode === "token")
|
|
195
|
+
lines.push(`Delivery token: ${model.token || "dlv_…"} · ${tokenFeedback(model.token)}`, "Enter look up · Esc cancel");
|
|
196
|
+
else
|
|
197
|
+
lines.push("Tab/Shift-Tab or 1–4 sections · ↑/↓ j/k g/G select", "r refresh · c check · d delivery · x retire · q quit");
|
|
198
|
+
if (model.actionRunning)
|
|
199
|
+
lines.push(...wrap(`${model.action ?? "action in progress"} — polling paused`, width - 2).map((line) => ` ${line}`));
|
|
200
|
+
else if (model.action)
|
|
201
|
+
lines.push(...wrap(model.action, width - 2).map((line) => ` ${line}`));
|
|
202
|
+
while (lines.length < height)
|
|
203
|
+
lines.push("");
|
|
204
|
+
return lines.slice(0, height).map((line) => fit(line, width)).join("\n");
|
|
205
|
+
}
|
|
206
|
+
/** Interactive, dependency-free client over the existing broker commands. */
|
|
207
|
+
export async function runTui(dependencies) {
|
|
208
|
+
const { input, output, call, renderStatus, signal } = dependencies;
|
|
209
|
+
if (!output.isTTY || !input.isTTY) {
|
|
210
|
+
output.write(renderStatus(await call({ method: "list_snapshot", params: {} })));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (signal?.aborted)
|
|
214
|
+
return;
|
|
215
|
+
const model = {
|
|
216
|
+
...(dependencies.host ? { host: dependencies.host } : {}),
|
|
217
|
+
section: "endpoints",
|
|
218
|
+
selected: { endpoints: 0, deliveries: 0, retirements: 0 },
|
|
219
|
+
mode: "browse",
|
|
220
|
+
token: "",
|
|
221
|
+
};
|
|
222
|
+
const priorRaw = input.isRaw === true, priorFlowing = input.readableFlowing;
|
|
223
|
+
let closed = false, pollInFlight = false, actionDepth = 0, lastFrame = "";
|
|
224
|
+
let activePoll = Promise.resolve(), actionTail = Promise.resolve();
|
|
225
|
+
let pollTimer, drawTimer;
|
|
226
|
+
let resolveDone;
|
|
227
|
+
const done = new Promise((resolve) => { resolveDone = resolve; });
|
|
228
|
+
const keyInput = new PassThrough();
|
|
229
|
+
const draw = () => {
|
|
230
|
+
if (closed)
|
|
231
|
+
return;
|
|
232
|
+
const frame = renderTui(model, output.columns, output.rows);
|
|
233
|
+
if (frame === lastFrame)
|
|
234
|
+
return;
|
|
235
|
+
lastFrame = frame;
|
|
236
|
+
output.write(`\x1b[H\x1b[2J${frame}\x1b[0m`);
|
|
237
|
+
};
|
|
238
|
+
const replaceSnapshot = (value) => {
|
|
239
|
+
if (!object(value))
|
|
240
|
+
throw new Error("CONTROL_INVALID_RESPONSE");
|
|
241
|
+
const before = typeof model.snapshot?.revision === "number" ? model.snapshot.revision : undefined;
|
|
242
|
+
const after = typeof value.revision === "number" ? value.revision : undefined;
|
|
243
|
+
if (before !== undefined && after !== undefined && after < before)
|
|
244
|
+
model.restarted = true;
|
|
245
|
+
model.snapshot = value;
|
|
246
|
+
model.snapshotAt = Date.now();
|
|
247
|
+
delete model.staleSince;
|
|
248
|
+
delete model.error;
|
|
249
|
+
const endpoints = endpointRows(value);
|
|
250
|
+
if (model.selectedEndpoint === undefined && endpoints[0])
|
|
251
|
+
model.selectedEndpoint = endpointKey(endpoints[0]);
|
|
252
|
+
const endpointIndex = endpoints.findIndex((row) => endpointKey(row) === model.selectedEndpoint);
|
|
253
|
+
model.selected.endpoints = endpointIndex < 0 ? 0 : endpointIndex;
|
|
254
|
+
for (const section of ["deliveries", "retirements"]) {
|
|
255
|
+
const previous = model.section;
|
|
256
|
+
model.section = section;
|
|
257
|
+
model.selected[section] = Math.min(model.selected[section], Math.max(0, sectionRows(model).length - 1));
|
|
258
|
+
model.section = previous;
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
const snapshot = async () => {
|
|
262
|
+
if (closed || pollInFlight || actionDepth > 0)
|
|
263
|
+
return;
|
|
264
|
+
pollInFlight = true;
|
|
265
|
+
activePoll = (async () => {
|
|
266
|
+
try {
|
|
267
|
+
replaceSnapshot(await call({ method: "list_snapshot", params: {} }));
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
model.staleSince ??= Date.now();
|
|
271
|
+
model.error = errorText(error);
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
pollInFlight = false;
|
|
275
|
+
draw();
|
|
276
|
+
}
|
|
277
|
+
})();
|
|
278
|
+
await activePoll;
|
|
279
|
+
};
|
|
280
|
+
const schedulePoll = () => {
|
|
281
|
+
if (closed)
|
|
282
|
+
return;
|
|
283
|
+
pollTimer = setTimeout(async () => {
|
|
284
|
+
await snapshot();
|
|
285
|
+
schedulePoll();
|
|
286
|
+
}, 1_000);
|
|
287
|
+
pollTimer.unref?.();
|
|
288
|
+
};
|
|
289
|
+
const scheduleDraw = () => {
|
|
290
|
+
if (closed)
|
|
291
|
+
return;
|
|
292
|
+
drawTimer = setTimeout(() => {
|
|
293
|
+
if (pollInFlight || actionDepth > 0 || model.error || !model.snapshot)
|
|
294
|
+
draw();
|
|
295
|
+
scheduleDraw();
|
|
296
|
+
}, 1_000);
|
|
297
|
+
drawTimer.unref?.();
|
|
298
|
+
};
|
|
299
|
+
const queueAction = (label, command) => {
|
|
300
|
+
if (actionDepth > 0) {
|
|
301
|
+
model.action = "An action is already running.";
|
|
302
|
+
draw();
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
actionDepth++;
|
|
306
|
+
model.actionRunning = true;
|
|
307
|
+
model.action = `${label} in progress`;
|
|
308
|
+
draw();
|
|
309
|
+
actionTail = actionTail.then(async () => {
|
|
310
|
+
await activePoll;
|
|
311
|
+
if (closed) {
|
|
312
|
+
actionDepth--;
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
try {
|
|
316
|
+
const result = await call(command);
|
|
317
|
+
if (closed)
|
|
318
|
+
return;
|
|
319
|
+
model.result = { label, value: json(result) };
|
|
320
|
+
model.previousSection = model.section === "result" ? model.previousSection ?? "endpoints" : model.section;
|
|
321
|
+
model.action = `${label} result ready (4): ${json(result)}`;
|
|
322
|
+
try {
|
|
323
|
+
replaceSnapshot(await call({ method: "list_snapshot", params: {} }));
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
model.staleSince ??= Date.now();
|
|
327
|
+
model.error = errorText(error);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
const code = errorText(error), guidance = dependencies.hint?.(code);
|
|
332
|
+
model.result = { label, value: guidance ? `${code}\n${guidance}` : code };
|
|
333
|
+
model.previousSection = model.section === "result" ? model.previousSection ?? "endpoints" : model.section;
|
|
334
|
+
const disposition = code === "CONTROL_WRITE_OUTCOME_AMBIGUOUS" ? "outcome uncertain" : "refused";
|
|
335
|
+
model.action = `${label} ${disposition} — result ready (4): ${code}${guidance ? ` — ${guidance}` : ""}`;
|
|
336
|
+
}
|
|
337
|
+
finally {
|
|
338
|
+
actionDepth--;
|
|
339
|
+
model.actionRunning = false;
|
|
340
|
+
draw();
|
|
341
|
+
}
|
|
342
|
+
}, () => {
|
|
343
|
+
actionDepth--;
|
|
344
|
+
model.actionRunning = false;
|
|
345
|
+
});
|
|
346
|
+
};
|
|
347
|
+
const currentEndpoint = () => {
|
|
348
|
+
const rows = endpointRows(model.snapshot);
|
|
349
|
+
return model.selectedEndpoint
|
|
350
|
+
? rows.find((row) => endpointKey(row) === model.selectedEndpoint)
|
|
351
|
+
: rows[model.selected.endpoints];
|
|
352
|
+
};
|
|
353
|
+
const clearAction = () => { if (!model.actionRunning)
|
|
354
|
+
delete model.action; };
|
|
355
|
+
const select = (next) => {
|
|
356
|
+
const source = sectionRows(model, output.columns || 80);
|
|
357
|
+
const current = model.selected[model.section] ?? 0;
|
|
358
|
+
const index = next === "first" ? 0 : next === "last" ? Math.max(0, source.length - 1)
|
|
359
|
+
: Math.max(0, Math.min(current + next, Math.max(0, source.length - 1)));
|
|
360
|
+
model.selected[model.section] = index;
|
|
361
|
+
if (model.section === "endpoints") {
|
|
362
|
+
const row = source[index];
|
|
363
|
+
if (row)
|
|
364
|
+
model.selectedEndpoint = endpointKey(row);
|
|
365
|
+
else
|
|
366
|
+
delete model.selectedEndpoint;
|
|
367
|
+
}
|
|
368
|
+
clearAction();
|
|
369
|
+
};
|
|
370
|
+
const chooseSection = (section) => {
|
|
371
|
+
if (model.section !== "result" && section === "result")
|
|
372
|
+
model.previousSection = model.section;
|
|
373
|
+
model.section = section;
|
|
374
|
+
clearAction();
|
|
375
|
+
};
|
|
376
|
+
const finish = () => {
|
|
377
|
+
if (closed)
|
|
378
|
+
return;
|
|
379
|
+
closed = true;
|
|
380
|
+
if (pollTimer)
|
|
381
|
+
clearTimeout(pollTimer);
|
|
382
|
+
if (drawTimer)
|
|
383
|
+
clearTimeout(drawTimer);
|
|
384
|
+
input.off("data", onInputData);
|
|
385
|
+
input.off("end", finish);
|
|
386
|
+
input.off("error", finish);
|
|
387
|
+
keyInput.off("keypress", onKeypress);
|
|
388
|
+
keyInput.destroy();
|
|
389
|
+
output.off?.("resize", draw);
|
|
390
|
+
signal?.removeEventListener("abort", finish);
|
|
391
|
+
if (!signal) {
|
|
392
|
+
process.off("SIGINT", finish);
|
|
393
|
+
process.off("SIGTERM", finish);
|
|
394
|
+
}
|
|
395
|
+
try {
|
|
396
|
+
if (!priorRaw)
|
|
397
|
+
input.setRawMode?.(false);
|
|
398
|
+
}
|
|
399
|
+
catch { /* terminal may already be gone */ }
|
|
400
|
+
try {
|
|
401
|
+
if (priorFlowing === true)
|
|
402
|
+
input.resume?.();
|
|
403
|
+
else
|
|
404
|
+
input.pause?.();
|
|
405
|
+
}
|
|
406
|
+
catch { /* input may already be closed */ }
|
|
407
|
+
output.write("\x1b[0m\x1b[?25h\x1b[?1049l");
|
|
408
|
+
resolveDone();
|
|
409
|
+
};
|
|
410
|
+
const onKeypress = (sequence, details) => {
|
|
411
|
+
const key = typeof sequence === "string" ? sequence : "", name = details?.name;
|
|
412
|
+
if (details?.ctrl && name === "c" || (model.mode === "browse" && key === "q"))
|
|
413
|
+
return finish();
|
|
414
|
+
if (model.mode === "token") {
|
|
415
|
+
if (name === "escape") {
|
|
416
|
+
model.mode = "browse";
|
|
417
|
+
model.token = "";
|
|
418
|
+
}
|
|
419
|
+
else if (name === "return" || name === "enter") {
|
|
420
|
+
const token = model.token;
|
|
421
|
+
model.token = "";
|
|
422
|
+
model.mode = "browse";
|
|
423
|
+
if (deliveryToken.test(token))
|
|
424
|
+
queueAction("delivery", { method: "delivery_status", params: { token } });
|
|
425
|
+
else
|
|
426
|
+
model.action = "Enter a delivery token in the form dlv_<24 characters>.";
|
|
427
|
+
}
|
|
428
|
+
else if (name === "backspace")
|
|
429
|
+
model.token = model.token.slice(0, -1);
|
|
430
|
+
else if (/^[\x20-\x7e]+$/.test(key) && model.token.length + key.length <= 28)
|
|
431
|
+
model.token += key;
|
|
432
|
+
draw();
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
if (model.mode === "confirm") {
|
|
436
|
+
const retiring = model.retiring;
|
|
437
|
+
model.mode = "browse";
|
|
438
|
+
delete model.retiring;
|
|
439
|
+
const visible = retiring ? retirementLines(retiring, output.columns || 80).length <= (output.rows || 24) : false;
|
|
440
|
+
if (key.toLowerCase() === "y" && retiring && visible)
|
|
441
|
+
queueAction("retire", { method: "retire_route", params: { endpoint: retiring.id } });
|
|
442
|
+
else
|
|
443
|
+
model.action = key.toLowerCase() === "y" ? "Retirement cancelled: resize to show the exact endpoint ID and consequences." : "Retirement cancelled.";
|
|
444
|
+
draw();
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
const sections = ["endpoints", "deliveries", "retirements", "result"];
|
|
448
|
+
if ((name === "escape" || key === "\x1b") && model.section === "result")
|
|
449
|
+
chooseSection(model.previousSection ?? "endpoints");
|
|
450
|
+
else if (name === "tab") {
|
|
451
|
+
const direction = details?.shift || key === "\x1b[Z" ? -1 : 1;
|
|
452
|
+
chooseSection(sections[(sections.indexOf(model.section) + direction + sections.length) % sections.length]);
|
|
453
|
+
}
|
|
454
|
+
else if (/^[1-4]$/.test(key))
|
|
455
|
+
chooseSection(sections[Number(key) - 1]);
|
|
456
|
+
else if (name === "up" || key === "k")
|
|
457
|
+
select(-1);
|
|
458
|
+
else if (name === "down" || key === "j")
|
|
459
|
+
select(1);
|
|
460
|
+
else if (key === "g")
|
|
461
|
+
select("first");
|
|
462
|
+
else if (key === "G")
|
|
463
|
+
select("last");
|
|
464
|
+
else if (key === "r")
|
|
465
|
+
queueAction("refresh", { method: "refresh_discovery", params: {} });
|
|
466
|
+
else if (key === "c")
|
|
467
|
+
queueAction("check", { method: "check", params: {} });
|
|
468
|
+
else if (key === "d") {
|
|
469
|
+
model.mode = "token";
|
|
470
|
+
model.token = "";
|
|
471
|
+
clearAction();
|
|
472
|
+
}
|
|
473
|
+
else if (key === "x" && model.section === "endpoints") {
|
|
474
|
+
const selected = currentEndpoint();
|
|
475
|
+
if (!selected)
|
|
476
|
+
model.action = "retire: the selected endpoint is no longer present";
|
|
477
|
+
else if (!selected.local)
|
|
478
|
+
model.action = selected.placeholder ? `${selected.host} has no cached endpoints — press r or run Embassy there`
|
|
479
|
+
: `retire: ${selected.alias} is owned by ${selected.host}; run Embassy there`;
|
|
480
|
+
else {
|
|
481
|
+
model.retiring = selected;
|
|
482
|
+
model.mode = "confirm";
|
|
483
|
+
delete model.action;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
draw();
|
|
487
|
+
};
|
|
488
|
+
const onInputData = (chunk) => { if (!closed)
|
|
489
|
+
keyInput.write(chunk); };
|
|
490
|
+
emitKeypressEvents(keyInput);
|
|
491
|
+
keyInput.on("keypress", onKeypress);
|
|
492
|
+
input.on("data", onInputData);
|
|
493
|
+
input.on("end", finish);
|
|
494
|
+
input.on("error", finish);
|
|
495
|
+
output.on?.("resize", draw);
|
|
496
|
+
signal?.addEventListener("abort", finish, { once: true });
|
|
497
|
+
if (!signal) {
|
|
498
|
+
process.on("SIGINT", finish);
|
|
499
|
+
process.on("SIGTERM", finish);
|
|
500
|
+
}
|
|
501
|
+
try {
|
|
502
|
+
if (!priorRaw)
|
|
503
|
+
input.setRawMode?.(true);
|
|
504
|
+
}
|
|
505
|
+
catch (error) {
|
|
506
|
+
finish();
|
|
507
|
+
throw error;
|
|
508
|
+
}
|
|
509
|
+
output.write("\x1b[?1049h\x1b[?25l");
|
|
510
|
+
draw();
|
|
511
|
+
scheduleDraw();
|
|
512
|
+
await snapshot();
|
|
513
|
+
schedulePoll();
|
|
514
|
+
await done;
|
|
515
|
+
}
|
|
516
|
+
//# sourceMappingURL=tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../../src/gateway/tui.ts"],"names":[],"mappings":"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"}
|