peerllm-host-cli 0.2.0 → 0.3.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.
@@ -0,0 +1,9 @@
1
+ /** Multi-line PeerLLM block banner. Returns the full multi-row string. */
2
+ export declare function renderBanner(): string;
3
+ /** Inline colored "PeerLLM" wordmark — for one-line headers and prompts. */
4
+ export declare function renderBrand(): string;
5
+ /** Tagline shown under the banner in help / dashboard. */
6
+ export declare function renderTagline(version: string): string;
7
+ /** Banner + tagline, separated by blank lines. Suitable for --help and dashboard. */
8
+ export declare function renderHeader(version: string): string;
9
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AAyBA,0EAA0E;AAC1E,wBAAgB,YAAY,IAAI,MAAM,CAYrC;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,IAAI,MAAM,CAMpC;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -0,0 +1,50 @@
1
+ import { styleText } from "node:util";
2
+ function paint(color, text) {
3
+ // util.styleText handles NO_COLOR + TTY detection automatically.
4
+ return styleText(Array.isArray(color) ? color : [color], text);
5
+ }
6
+ const LETTERS = {
7
+ P: ["██████╗ ", "██╔══██╗", "██████╔╝", "██╔═══╝ ", "██║ "],
8
+ E: ["███████╗", "██╔════╝", "█████╗ ", "██╔══╝ ", "███████╗"],
9
+ R: ["██████╗ ", "██╔══██╗", "██████╔╝", "██╔══██╗", "██║ ██║"],
10
+ L: ["██╗ ", "██║ ", "██║ ", "██║ ", "███████╗"],
11
+ M: ["███╗ ███╗", "████╗ ████║", "██╔████╔██║", "██║╚██╔╝██║", "██║ ╚═╝ ██║"],
12
+ };
13
+ // Each banner letter is colored to match the requested branding:
14
+ // Peer = blue, LL = green, M = red.
15
+ const SEGMENTS = [
16
+ { letters: "PEER", color: "blue" },
17
+ { letters: "LL", color: "green" },
18
+ { letters: "M", color: "red" },
19
+ ];
20
+ /** Multi-line PeerLLM block banner. Returns the full multi-row string. */
21
+ export function renderBanner() {
22
+ const rows = ["", "", "", "", ""];
23
+ for (const seg of SEGMENTS) {
24
+ for (const ch of seg.letters) {
25
+ const letter = LETTERS[ch];
26
+ if (!letter)
27
+ continue;
28
+ for (let r = 0; r < 5; r++) {
29
+ rows[r] += paint(seg.color, letter[r] ?? "");
30
+ }
31
+ }
32
+ }
33
+ return rows.join("\n");
34
+ }
35
+ /** Inline colored "PeerLLM" wordmark — for one-line headers and prompts. */
36
+ export function renderBrand() {
37
+ return (paint(["blue", "bold"], "Peer") +
38
+ paint(["green", "bold"], "LL") +
39
+ paint(["red", "bold"], "M"));
40
+ }
41
+ /** Tagline shown under the banner in help / dashboard. */
42
+ export function renderTagline(version) {
43
+ return (paint("dim", " Serve decentralized AI compute from this machine ") +
44
+ paint("gray", `· v${version}`));
45
+ }
46
+ /** Banner + tagline, separated by blank lines. Suitable for --help and dashboard. */
47
+ export function renderHeader(version) {
48
+ return `\n${renderBanner()}\n\n${renderTagline(version)}\n`;
49
+ }
50
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,SAAS,KAAK,CAAC,KAAsB,EAAE,IAAY;IACjD,iEAAiE;IACjE,OAAO,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,OAAO,GAA6B;IACxC,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;IAC/D,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;IAC/D,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;IAC/D,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;IAC/D,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC;CAC/E,CAAC;AAEF,iEAAiE;AACjE,sCAAsC;AACtC,MAAM,QAAQ,GAA6C;IACzD,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAClC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;IACjC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;CAC/B,CAAC;AAEF,0EAA0E;AAC1E,MAAM,UAAU,YAAY;IAC1B,MAAM,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,WAAW;IACzB,OAAO,CACL,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAC/B,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;QAC9B,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,CACL,KAAK,CAAC,KAAK,EAAE,sDAAsD,CAAC;QACpE,KAAK,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,KAAK,YAAY,EAAE,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeDashboardCommand(): Command;
3
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmPpC,wBAAgB,oBAAoB,IAAI,OAAO,CAsI9C"}
@@ -0,0 +1,316 @@
1
+ import { cpus, totalmem, freemem } from "node:os";
2
+ import { Command } from "commander";
3
+ import { resolvePaths } from "../../core/paths.js";
4
+ import { METHOD } from "../../shared/protocol.js";
5
+ import { renderBanner, renderBrand } from "../banner.js";
6
+ import { EXIT } from "../exit-codes.js";
7
+ import { printError } from "../format.js";
8
+ import { DaemonUnreachableError, IpcClient } from "../ipc-client.js";
9
+ import { ANSI, bar, enterTui, moveTo, padRight, paint, sparkline, truncate, write, } from "../tui.js";
10
+ const MAX_CPU_SAMPLES = 60;
11
+ const MAX_LOG_LINES = 6;
12
+ function readCpuSnapshot() {
13
+ let idle = 0;
14
+ let total = 0;
15
+ for (const c of cpus()) {
16
+ const t = c.times;
17
+ idle += t.idle;
18
+ total += t.user + t.nice + t.sys + t.idle + t.irq;
19
+ }
20
+ return { idle, total };
21
+ }
22
+ function statusBadge(s) {
23
+ switch (s) {
24
+ case "connected":
25
+ return paint(["green", "bold"], "● connected");
26
+ case "connecting":
27
+ return paint(["yellow", "bold"], "◐ connecting");
28
+ case "error":
29
+ return paint(["red", "bold"], "✗ error");
30
+ default:
31
+ return paint("dim", "○ disconnected");
32
+ }
33
+ }
34
+ function formatUptime(seconds) {
35
+ if (seconds < 60)
36
+ return `${seconds}s`;
37
+ const m = Math.floor(seconds / 60);
38
+ if (m < 60)
39
+ return `${m}m ${seconds % 60}s`;
40
+ const h = Math.floor(m / 60);
41
+ if (h < 24)
42
+ return `${h}h ${m % 60}m`;
43
+ const d = Math.floor(h / 24);
44
+ return `${d}d ${h % 24}h`;
45
+ }
46
+ function row(label, value, labelWidth = 14) {
47
+ return paint("dim", padRight(label, labelWidth)) + value;
48
+ }
49
+ function panelTitle(title) {
50
+ return paint(["cyan", "bold"], `┌─ ${title} `) + paint("dim", "─".repeat(Math.max(0, 50 - title.length)));
51
+ }
52
+ function panelDivider(width) {
53
+ return paint("dim", "─".repeat(width));
54
+ }
55
+ function render(state, cols) {
56
+ // Clear + go home, then redraw.
57
+ write(ANSI.home + ANSI.clear);
58
+ write(renderBanner() + "\n");
59
+ write(" " +
60
+ renderBrand() +
61
+ paint("dim", " · ") +
62
+ paint("dim", "decentralized AI host · ") +
63
+ paint(state.lastUpdated ? "gray" : "dim", state.lastUpdated ? `last update ${state.lastUpdated.toLocaleTimeString()}` : "loading…") +
64
+ "\n\n");
65
+ if (state.lastError) {
66
+ write(" " + paint("yellow", `⚠ ${state.lastError}`) + "\n\n");
67
+ }
68
+ // Daemon + Orchestrator panel
69
+ write(panelTitle("Daemon") + "\n");
70
+ if (state.status) {
71
+ const s = state.status;
72
+ write(" " +
73
+ row("pid", String(s.daemon.pid)) +
74
+ paint("dim", " ") +
75
+ row("uptime", paint(["green"], formatUptime(s.daemon.uptimeSeconds)), 8) +
76
+ paint("dim", " ") +
77
+ row("version", paint("bold", s.daemon.version), 9) +
78
+ "\n");
79
+ write(" " + row("orchestrator", statusBadge(s.orchestrator.status)) + "\n");
80
+ const authStr = s.auth.loggedIn
81
+ ? paint("green", "logged in") +
82
+ (s.auth.userId ? paint("dim", ` (user ${s.auth.userId.slice(0, 8)}…)`) : "")
83
+ : paint("yellow", "logged out");
84
+ write(" " + row("auth", authStr) + "\n");
85
+ const agreementStr = s.auth.agreementAccepted
86
+ ? paint("green", "accepted")
87
+ : paint("yellow", "not accepted");
88
+ write(" " + row("agreement", agreementStr) + "\n");
89
+ }
90
+ else {
91
+ write(" " + paint("dim", "(awaiting status…)") + "\n");
92
+ }
93
+ write("\n");
94
+ // Host panel
95
+ write(panelTitle("Host") + "\n");
96
+ if (state.status) {
97
+ const s = state.status;
98
+ const hostName = s.config.hostName ?? paint("dim", "(unset)");
99
+ const hostId = s.config.hostId ? `${s.config.hostId.slice(0, 8)}…` : paint("dim", "(unset)");
100
+ write(" " + row("name", hostName) + "\n");
101
+ write(" " + row("host id", paint("gray", hostId)) + "\n");
102
+ }
103
+ else {
104
+ write(" " + paint("dim", "(awaiting status…)") + "\n");
105
+ }
106
+ write("\n");
107
+ // Model panel
108
+ write(panelTitle("Model") + "\n");
109
+ if (state.models?.loaded) {
110
+ const m = state.models.loaded;
111
+ write(" " + row("loaded", paint(["bold", "green"], m.modelName)) + "\n");
112
+ write(" " +
113
+ row("gpu layers", String(m.gpuLayers)) +
114
+ paint("dim", " ") +
115
+ row("active conv.", paint("cyan", String(m.activeContexts)), 14) +
116
+ "\n");
117
+ }
118
+ else {
119
+ write(" " +
120
+ paint("dim", "(no model loaded — ") +
121
+ paint(["bold", "cyan"], "peerllm-host models download") +
122
+ paint("dim", " to fetch one)") +
123
+ "\n");
124
+ }
125
+ write("\n");
126
+ // Resources panel
127
+ const barWidth = Math.max(20, Math.min(40, cols - 40));
128
+ write(panelTitle("Resources") + "\n");
129
+ write(" " +
130
+ row("CPU", bar(state.cpuFraction, barWidth, "cyan")) +
131
+ paint("dim", ` ${(state.cpuFraction * 100).toFixed(0)}%`) +
132
+ "\n");
133
+ write(" " +
134
+ row("RAM", bar(state.ramFraction, barWidth, "magenta")) +
135
+ paint("dim", ` ${(state.ramFraction * 100).toFixed(0)}%`) +
136
+ "\n");
137
+ // Sparkline: CPU% over the last MAX_CPU_SAMPLES ticks
138
+ const sparkWidth = Math.min(MAX_CPU_SAMPLES, Math.max(20, cols - 20));
139
+ const padded = padSparkline(state.cpuSamples, sparkWidth);
140
+ write(" " + row("trend (60s)", sparkline(padded, "cyan")) + "\n");
141
+ write("\n");
142
+ // Logs panel (tails recent log lines if any have arrived from the daemon)
143
+ write(panelTitle("Recent activity") + "\n");
144
+ if (state.logs.length === 0) {
145
+ write(" " + paint("dim", "(no recent events — host idle)") + "\n");
146
+ }
147
+ else {
148
+ for (const l of state.logs.slice(-MAX_LOG_LINES)) {
149
+ write(" " + formatLog(l, cols - 4) + "\n");
150
+ }
151
+ }
152
+ write("\n");
153
+ // Help bar
154
+ write(panelDivider(Math.min(cols, 60)) + "\n");
155
+ write(" " +
156
+ keyHint("q", "quit") +
157
+ keyHint("r", "refresh now") +
158
+ keyHint("l", "clear logs") +
159
+ keyHint("?", "help") +
160
+ "\n");
161
+ }
162
+ function padSparkline(values, width) {
163
+ if (values.length >= width)
164
+ return values.slice(-width);
165
+ const pad = new Array(width - values.length).fill(0);
166
+ return pad.concat(values);
167
+ }
168
+ function keyHint(key, label) {
169
+ return paint(["cyan", "bold"], `[${key}]`) + paint("dim", ` ${label} `);
170
+ }
171
+ function formatLog(l, maxWidth) {
172
+ const levelColors = {
173
+ debug: "gray",
174
+ info: "cyan",
175
+ warn: "yellow",
176
+ error: "red",
177
+ };
178
+ const color = levelColors[l.level] ?? "gray";
179
+ const ts = l.timestamp ? new Date(l.timestamp).toLocaleTimeString() : "";
180
+ const prefix = paint("dim", ts + " ") + paint(color, l.level.padEnd(5));
181
+ const visiblePrefixLen = ts.length + 1 + 5;
182
+ return prefix + " " + truncate(l.message, Math.max(0, maxWidth - visiblePrefixLen - 1));
183
+ }
184
+ export function makeDashboardCommand() {
185
+ return new Command("dashboard")
186
+ .description("Interactive TUI: watch live host status, model, and traffic")
187
+ .option("--config-dir <path>", "override config directory")
188
+ .option("--interval <ms>", "refresh interval in milliseconds (default 1000)", "1000")
189
+ .action(async (opts) => {
190
+ const intervalMs = Math.max(250, Number.parseInt(opts.interval ?? "1000", 10) || 1000);
191
+ const paths = resolvePaths({ configDirOverride: opts.configDir });
192
+ const client = new IpcClient(paths.ipcEndpoint);
193
+ try {
194
+ await client.connect();
195
+ }
196
+ catch (err) {
197
+ if (err instanceof DaemonUnreachableError) {
198
+ printError("daemon is not running", {
199
+ hint: "Start it with: peerllm-host start",
200
+ });
201
+ process.exit(EXIT.daemonNotRunning);
202
+ }
203
+ printError(err.message);
204
+ process.exit(EXIT.runtimeError);
205
+ }
206
+ const tui = enterTui();
207
+ const state = {
208
+ cpuSamples: [],
209
+ ramFraction: 0,
210
+ cpuFraction: 0,
211
+ logs: [],
212
+ };
213
+ let prevCpu = readCpuSnapshot();
214
+ // Subscribe to daemon events for live updates between polls.
215
+ client.onNotification((method, params) => {
216
+ const name = method.startsWith("event:") ? method.slice("event:".length) : method;
217
+ if (name === "log") {
218
+ const p = params;
219
+ if (p && typeof p.message === "string")
220
+ state.logs.push(p);
221
+ while (state.logs.length > MAX_LOG_LINES * 2)
222
+ state.logs.shift();
223
+ }
224
+ else if (name === "orchestratorStatus") {
225
+ // Force an immediate poll on connection-state changes.
226
+ void pollOnce();
227
+ }
228
+ else if (name === "hostStats") {
229
+ const p = params;
230
+ if (typeof p.cpuPercent === "number") {
231
+ state.cpuFraction = Math.max(0, Math.min(1, p.cpuPercent / 100));
232
+ state.cpuSamples.push(state.cpuFraction);
233
+ while (state.cpuSamples.length > MAX_CPU_SAMPLES)
234
+ state.cpuSamples.shift();
235
+ }
236
+ if (typeof p.ramUsedMB === "number" && typeof p.ramTotalMB === "number" && p.ramTotalMB > 0) {
237
+ state.ramFraction = Math.max(0, Math.min(1, p.ramUsedMB / p.ramTotalMB));
238
+ }
239
+ }
240
+ });
241
+ try {
242
+ await client.call("events.subscribe", { filter: "*" });
243
+ }
244
+ catch {
245
+ // Non-fatal: events are a nice-to-have; polling still works.
246
+ }
247
+ const pollOnce = async () => {
248
+ try {
249
+ const [status, models] = await Promise.all([
250
+ client.call(METHOD.getStatus),
251
+ client.call(METHOD.modelsState),
252
+ ]);
253
+ state.status = status;
254
+ state.models = models;
255
+ state.lastError = undefined;
256
+ }
257
+ catch (err) {
258
+ state.lastError = `IPC: ${err.message}`;
259
+ }
260
+ state.lastUpdated = new Date();
261
+ };
262
+ const sampleLocal = () => {
263
+ const next = readCpuSnapshot();
264
+ const totalDelta = next.total - prevCpu.total;
265
+ const idleDelta = next.idle - prevCpu.idle;
266
+ prevCpu = next;
267
+ if (totalDelta > 0) {
268
+ state.cpuFraction = Math.max(0, Math.min(1, 1 - idleDelta / totalDelta));
269
+ }
270
+ state.cpuSamples.push(state.cpuFraction);
271
+ while (state.cpuSamples.length > MAX_CPU_SAMPLES)
272
+ state.cpuSamples.shift();
273
+ const total = totalmem();
274
+ const free = freemem();
275
+ if (total > 0)
276
+ state.ramFraction = Math.max(0, Math.min(1, 1 - free / total));
277
+ };
278
+ const tick = async () => {
279
+ sampleLocal();
280
+ await pollOnce();
281
+ render(state, tui.cols);
282
+ };
283
+ // Initial paint, then steady cadence.
284
+ await tick();
285
+ const timer = setInterval(() => void tick(), intervalMs);
286
+ const exit = (code) => {
287
+ clearInterval(timer);
288
+ client.close();
289
+ tui.teardown();
290
+ write(moveTo(1, 1));
291
+ process.exit(code);
292
+ };
293
+ tui.onKey((key) => {
294
+ if (key.name === "q" || (key.ctrl && key.name === "c")) {
295
+ exit(EXIT.ok);
296
+ return;
297
+ }
298
+ if (key.name === "r") {
299
+ void tick();
300
+ return;
301
+ }
302
+ if (key.name === "l") {
303
+ state.logs = [];
304
+ render(state, tui.cols);
305
+ return;
306
+ }
307
+ if (key.name === "?") {
308
+ state.lastError = "keys: q=quit · r=refresh · l=clear logs · ?=this help";
309
+ render(state, tui.cols);
310
+ }
311
+ });
312
+ // Park forever (timer + key handler drive the rest).
313
+ await new Promise(() => { });
314
+ });
315
+ }
316
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,iBAAiB,IAAI,OAAO,CAwC3C"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,iBAAiB,IAAI,OAAO,CAwC3C"}
@@ -1,6 +1,7 @@
1
1
  import { Command } from "commander";
2
2
  import { resolvePaths } from "../../core/paths.js";
3
3
  import { METHOD } from "../../shared/protocol.js";
4
+ import { renderBrand } from "../banner.js";
4
5
  import { DaemonUnreachableError, IpcClient } from "../ipc-client.js";
5
6
  import { EXIT } from "../exit-codes.js";
6
7
  import { humanizeUptime, printError } from "../format.js";
@@ -48,6 +49,7 @@ export function makeStatusCommand() {
48
49
  });
49
50
  }
50
51
  function printStatus(status) {
52
+ process.stdout.write(`\n${renderBrand()} host status\n\n`);
51
53
  const hostLabel = status.config.hostName ?? "(unset — run `peerllm-host host create | link`)";
52
54
  const hostIdLabel = status.config.hostId
53
55
  ? `${status.config.hostId.slice(0, 8)}…`
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -1,13 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from "commander";
3
3
  import { CLI_VERSION } from "../shared/cli-version.js";
4
+ import { renderHeader } from "./banner.js";
4
5
  const cliVersion = CLI_VERSION;
5
6
  async function main() {
6
7
  const program = new Command();
7
8
  program
8
9
  .name("peerllm-host")
9
10
  .description("PeerLLM host CLI — serve decentralized AI compute from this machine")
10
- .version(cliVersion, "-v, --version");
11
+ .version(cliVersion, "-v, --version")
12
+ .addHelpText("beforeAll", renderHeader(cliVersion));
11
13
  program.addCommand(await (async () => {
12
14
  const { makeStartCommand } = await import("./commands/start.js");
13
15
  return makeStartCommand(cliVersion);
@@ -80,6 +82,10 @@ async function main() {
80
82
  const { makeSubscriptionCommand } = await import("./commands/subscription.js");
81
83
  return makeSubscriptionCommand();
82
84
  })());
85
+ program.addCommand(await (async () => {
86
+ const { makeDashboardCommand } = await import("./commands/dashboard.js");
87
+ return makeDashboardCommand();
88
+ })());
83
89
  await program.parseAsync(process.argv);
84
90
  }
85
91
  void main().catch((err) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ type Color = "blue" | "green" | "red" | "cyan" | "yellow" | "magenta" | "gray" | "dim" | "bold";
2
+ export declare const ANSI: {
3
+ readonly reset: "\u001B[0m";
4
+ readonly clear: "\u001B[2J";
5
+ readonly home: "\u001B[H";
6
+ readonly hideCursor: "\u001B[?25l";
7
+ readonly showCursor: "\u001B[?25h";
8
+ readonly enterAlt: "\u001B[?1049h";
9
+ readonly leaveAlt: "\u001B[?1049l";
10
+ readonly clearLine: "\u001B[2K";
11
+ };
12
+ export declare function paint(color: Color | Color[], text: string): string;
13
+ export declare function moveTo(row: number, col: number): string;
14
+ export declare function write(s: string): void;
15
+ export interface TuiHandle {
16
+ rows: number;
17
+ cols: number;
18
+ /** Restore terminal state (alt screen off, cursor on, raw mode off). Idempotent. */
19
+ teardown: () => void;
20
+ /** Subscribe to keypresses. Returns an unsubscribe function. */
21
+ onKey: (handler: (key: KeyEvent) => void) => () => void;
22
+ }
23
+ export interface KeyEvent {
24
+ name: string;
25
+ ctrl: boolean;
26
+ shift: boolean;
27
+ meta: boolean;
28
+ raw: string;
29
+ }
30
+ export declare function enterTui(): TuiHandle;
31
+ /** Build a horizontal bar like `[████████ ] 80%`. Width is the inner cell count. */
32
+ export declare function bar(fraction: number, width: number, color?: Color): string;
33
+ /** Render a sparkline from numeric samples in [0, 1]. Returns a string. */
34
+ export declare function sparkline(values: number[], color?: Color): string;
35
+ /** Truncate a string to a max visible width (assumes 1-cell-per-char ASCII). */
36
+ export declare function truncate(s: string, max: number): string;
37
+ /** Pad-right to a fixed visible width. Width assumes 1 cell per char. */
38
+ export declare function padRight(s: string, width: number): string;
39
+ export {};
40
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"AAEA,KAAK,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEhG,eAAO,MAAM,IAAI;;;;;;;;;CASP,CAAC;AAEX,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAErC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,gEAAgE;IAChE,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,QAAQ,IAAI,SAAS,CA+CpC;AAuBD,qFAAqF;AACrF,wBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,KAAe,GAAG,MAAM,CAUnF;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,KAAc,GAAG,MAAM,CASzE;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGvD;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGzD"}
@@ -0,0 +1,128 @@
1
+ import { styleText } from "node:util";
2
+ export const ANSI = {
3
+ reset: "\x1b[0m",
4
+ clear: "\x1b[2J",
5
+ home: "\x1b[H",
6
+ hideCursor: "\x1b[?25l",
7
+ showCursor: "\x1b[?25h",
8
+ enterAlt: "\x1b[?1049h",
9
+ leaveAlt: "\x1b[?1049l",
10
+ clearLine: "\x1b[2K",
11
+ };
12
+ export function paint(color, text) {
13
+ return styleText(Array.isArray(color) ? color : [color], text);
14
+ }
15
+ export function moveTo(row, col) {
16
+ // ANSI is 1-indexed.
17
+ return `\x1b[${row};${col}H`;
18
+ }
19
+ export function write(s) {
20
+ process.stdout.write(s);
21
+ }
22
+ export function enterTui() {
23
+ const stdin = process.stdin;
24
+ const stdout = process.stdout;
25
+ write(ANSI.enterAlt + ANSI.hideCursor + ANSI.clear + ANSI.home);
26
+ if (stdin.isTTY)
27
+ stdin.setRawMode(true);
28
+ stdin.resume();
29
+ stdin.setEncoding("utf8");
30
+ const handlers = new Set();
31
+ const onData = (chunk) => {
32
+ const raw = typeof chunk === "string" ? chunk : chunk.toString("utf8");
33
+ const key = parseKey(raw);
34
+ for (const h of handlers)
35
+ h(key);
36
+ };
37
+ stdin.on("data", onData);
38
+ let torn = false;
39
+ const teardown = () => {
40
+ if (torn)
41
+ return;
42
+ torn = true;
43
+ stdin.off("data", onData);
44
+ if (stdin.isTTY)
45
+ stdin.setRawMode(false);
46
+ stdin.pause();
47
+ write(ANSI.showCursor + ANSI.leaveAlt);
48
+ };
49
+ process.once("exit", teardown);
50
+ process.once("SIGINT", () => {
51
+ teardown();
52
+ process.exit(0);
53
+ });
54
+ process.once("SIGTERM", () => {
55
+ teardown();
56
+ process.exit(0);
57
+ });
58
+ return {
59
+ rows: stdout.rows ?? 24,
60
+ cols: stdout.columns ?? 80,
61
+ teardown,
62
+ onKey: (h) => {
63
+ handlers.add(h);
64
+ return () => handlers.delete(h);
65
+ },
66
+ };
67
+ }
68
+ function parseKey(raw) {
69
+ // Minimal keyparser sufficient for the dashboard's needs.
70
+ if (raw === "\x03")
71
+ return { name: "c", ctrl: true, shift: false, meta: false, raw };
72
+ if (raw === "\x04")
73
+ return { name: "d", ctrl: true, shift: false, meta: false, raw };
74
+ if (raw === "\r" || raw === "\n")
75
+ return { name: "return", ctrl: false, shift: false, meta: false, raw };
76
+ if (raw === "\x1b")
77
+ return { name: "escape", ctrl: false, shift: false, meta: false, raw };
78
+ if (raw === "\x1b[A")
79
+ return { name: "up", ctrl: false, shift: false, meta: false, raw };
80
+ if (raw === "\x1b[B")
81
+ return { name: "down", ctrl: false, shift: false, meta: false, raw };
82
+ if (raw === "\x1b[C")
83
+ return { name: "right", ctrl: false, shift: false, meta: false, raw };
84
+ if (raw === "\x1b[D")
85
+ return { name: "left", ctrl: false, shift: false, meta: false, raw };
86
+ const ch = raw[0] ?? "";
87
+ return {
88
+ name: ch.toLowerCase(),
89
+ ctrl: false,
90
+ shift: ch !== ch.toLowerCase(),
91
+ meta: false,
92
+ raw,
93
+ };
94
+ }
95
+ /** Build a horizontal bar like `[████████ ] 80%`. Width is the inner cell count. */
96
+ export function bar(fraction, width, color = "green") {
97
+ const clamped = Math.max(0, Math.min(1, fraction));
98
+ const filled = Math.round(clamped * width);
99
+ const empty = width - filled;
100
+ return (paint("dim", "[") +
101
+ paint(color, "█".repeat(filled)) +
102
+ paint("dim", "·".repeat(empty)) +
103
+ paint("dim", "]"));
104
+ }
105
+ /** Render a sparkline from numeric samples in [0, 1]. Returns a string. */
106
+ export function sparkline(values, color = "cyan") {
107
+ const blocks = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"];
108
+ let out = "";
109
+ for (const v of values) {
110
+ const clamped = Math.max(0, Math.min(1, v));
111
+ const idx = clamped === 0 ? 0 : Math.min(blocks.length - 1, Math.floor(clamped * blocks.length));
112
+ out += blocks[idx];
113
+ }
114
+ return paint(color, out);
115
+ }
116
+ /** Truncate a string to a max visible width (assumes 1-cell-per-char ASCII). */
117
+ export function truncate(s, max) {
118
+ if (s.length <= max)
119
+ return s;
120
+ return s.slice(0, Math.max(0, max - 1)) + "…";
121
+ }
122
+ /** Pad-right to a fixed visible width. Width assumes 1 cell per char. */
123
+ export function padRight(s, width) {
124
+ if (s.length >= width)
125
+ return s;
126
+ return s + " ".repeat(width - s.length);
127
+ }
128
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peerllm-host-cli",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Command-line PeerLLM host: serve decentralized AI compute from a headless machine.",
5
5
  "author": {
6
6
  "name": "Hassan Habib",