@bluewombat/runtime 0.11.0 → 0.11.1

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 (108) hide show
  1. package/README.md +84 -7
  2. package/SPECS.md +55 -9
  3. package/dist/cli.js +63 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config/load-config.d.ts.map +1 -1
  6. package/dist/config/load-config.js +2 -1
  7. package/dist/config/load-config.js.map +1 -1
  8. package/dist/config/types.d.ts +7 -0
  9. package/dist/config/types.d.ts.map +1 -1
  10. package/dist/loop/authority.d.ts +2 -0
  11. package/dist/loop/authority.d.ts.map +1 -1
  12. package/dist/loop/authority.js +11 -1
  13. package/dist/loop/authority.js.map +1 -1
  14. package/dist/loop/deliveries.d.ts.map +1 -1
  15. package/dist/loop/deliveries.js +19 -0
  16. package/dist/loop/deliveries.js.map +1 -1
  17. package/dist/loop/features.d.ts +14 -0
  18. package/dist/loop/features.d.ts.map +1 -1
  19. package/dist/loop/features.js +78 -35
  20. package/dist/loop/features.js.map +1 -1
  21. package/dist/loop/journal.d.ts +7 -0
  22. package/dist/loop/journal.d.ts.map +1 -1
  23. package/dist/loop/journal.js +23 -1
  24. package/dist/loop/journal.js.map +1 -1
  25. package/dist/loop/lock.d.ts +2 -0
  26. package/dist/loop/lock.d.ts.map +1 -1
  27. package/dist/loop/lock.js +10 -0
  28. package/dist/loop/lock.js.map +1 -1
  29. package/dist/loop/run-slot.d.ts +14 -0
  30. package/dist/loop/run-slot.d.ts.map +1 -1
  31. package/dist/loop/run-slot.js +53 -5
  32. package/dist/loop/run-slot.js.map +1 -1
  33. package/dist/loop/streams.js +2 -2
  34. package/dist/loop/streams.js.map +1 -1
  35. package/dist/loop/tick.d.ts.map +1 -1
  36. package/dist/loop/tick.js +2 -1
  37. package/dist/loop/tick.js.map +1 -1
  38. package/dist/loop/transformers.d.ts.map +1 -1
  39. package/dist/loop/transformers.js +5 -3
  40. package/dist/loop/transformers.js.map +1 -1
  41. package/dist/operator/dash-model.d.ts +65 -0
  42. package/dist/operator/dash-model.d.ts.map +1 -0
  43. package/dist/operator/dash-model.js +209 -0
  44. package/dist/operator/dash-model.js.map +1 -0
  45. package/dist/operator/dash-view.d.ts +16 -0
  46. package/dist/operator/dash-view.d.ts.map +1 -0
  47. package/dist/operator/dash-view.js +226 -0
  48. package/dist/operator/dash-view.js.map +1 -0
  49. package/dist/operator/dash.d.ts +34 -0
  50. package/dist/operator/dash.d.ts.map +1 -0
  51. package/dist/operator/dash.js +141 -0
  52. package/dist/operator/dash.js.map +1 -0
  53. package/dist/operator/doctor.d.ts.map +1 -1
  54. package/dist/operator/doctor.js +44 -1
  55. package/dist/operator/doctor.js.map +1 -1
  56. package/dist/operator/incident-dossier.d.ts +4 -4
  57. package/dist/operator/incident-dossier.d.ts.map +1 -1
  58. package/dist/operator/incident-dossier.js +14 -18
  59. package/dist/operator/incident-dossier.js.map +1 -1
  60. package/dist/operator/incident-system.d.ts +13 -4
  61. package/dist/operator/incident-system.d.ts.map +1 -1
  62. package/dist/operator/incident-system.js +68 -6
  63. package/dist/operator/incident-system.js.map +1 -1
  64. package/dist/operator/install.d.ts +9 -0
  65. package/dist/operator/install.d.ts.map +1 -0
  66. package/dist/operator/install.js +14 -0
  67. package/dist/operator/install.js.map +1 -0
  68. package/dist/operator/supervise/act.d.ts +37 -0
  69. package/dist/operator/supervise/act.d.ts.map +1 -0
  70. package/dist/operator/supervise/act.js +354 -0
  71. package/dist/operator/supervise/act.js.map +1 -0
  72. package/dist/operator/supervise/config.d.ts +74 -0
  73. package/dist/operator/supervise/config.d.ts.map +1 -0
  74. package/dist/operator/supervise/config.js +175 -0
  75. package/dist/operator/supervise/config.js.map +1 -0
  76. package/dist/operator/supervise/council.d.ts +45 -0
  77. package/dist/operator/supervise/council.d.ts.map +1 -0
  78. package/dist/operator/supervise/council.js +97 -0
  79. package/dist/operator/supervise/council.js.map +1 -0
  80. package/dist/operator/supervise/decision.d.ts +46 -0
  81. package/dist/operator/supervise/decision.d.ts.map +1 -0
  82. package/dist/operator/supervise/decision.js +137 -0
  83. package/dist/operator/supervise/decision.js.map +1 -0
  84. package/dist/operator/supervise/exec.d.ts +28 -0
  85. package/dist/operator/supervise/exec.d.ts.map +1 -0
  86. package/dist/operator/supervise/exec.js +47 -0
  87. package/dist/operator/supervise/exec.js.map +1 -0
  88. package/dist/operator/supervise/memory.d.ts +33 -0
  89. package/dist/operator/supervise/memory.d.ts.map +1 -0
  90. package/dist/operator/supervise/memory.js +73 -0
  91. package/dist/operator/supervise/memory.js.map +1 -0
  92. package/dist/operator/supervise/observe.d.ts +47 -0
  93. package/dist/operator/supervise/observe.d.ts.map +1 -0
  94. package/dist/operator/supervise/observe.js +73 -0
  95. package/dist/operator/supervise/observe.js.map +1 -0
  96. package/dist/operator/supervise/prompts.d.ts +60 -0
  97. package/dist/operator/supervise/prompts.d.ts.map +1 -0
  98. package/dist/operator/supervise/prompts.js +338 -0
  99. package/dist/operator/supervise/prompts.js.map +1 -0
  100. package/dist/operator/supervise/review.d.ts +24 -0
  101. package/dist/operator/supervise/review.d.ts.map +1 -0
  102. package/dist/operator/supervise/review.js +51 -0
  103. package/dist/operator/supervise/review.js.map +1 -0
  104. package/dist/operator/supervise/supervise.d.ts +26 -0
  105. package/dist/operator/supervise/supervise.d.ts.map +1 -0
  106. package/dist/operator/supervise/supervise.js +484 -0
  107. package/dist/operator/supervise/supervise.js.map +1 -0
  108. package/package.json +14 -14
@@ -0,0 +1,209 @@
1
+ import { closeSync, fstatSync, openSync, readSync } from "node:fs";
2
+ import { parseJournalChunk } from "../loop/journal.js";
3
+ import { detailOf } from "../loop/trace.js";
4
+ import { compareKeys } from "./board.js";
5
+ import { isQuietJournalLine } from "./film.js";
6
+ /** Enough of the journal's end to know what each Ticket did last; the rest is `mason log`'s. */
7
+ const JOURNAL_TAIL_BYTES = 512 * 1024;
8
+ export function zoneOf(kind, state) {
9
+ if (state === "done" || state === "cancelled") {
10
+ return "past";
11
+ }
12
+ if (kind === "feature") {
13
+ return state === "waiting" ? "upcoming" : "active";
14
+ }
15
+ return state === "received" ? "upcoming" : "active";
16
+ }
17
+ export async function dashOf(input) {
18
+ const film = readTail(input.journalPath);
19
+ const lastByKey = lastEvents(film);
20
+ const states = new Map();
21
+ const rows = [];
22
+ for (const summary of await input.ledger.list()) {
23
+ states.set(summary.key, summary.state);
24
+ }
25
+ for (const summary of await input.ledger.listFeatures()) {
26
+ states.set(summary.key, summary.state);
27
+ }
28
+ for (const summary of await input.ledger.list()) {
29
+ const got = await input.ledger.get(summary.key);
30
+ const intention = got.ok ? got.aggregate.intention : undefined;
31
+ const row = {
32
+ kind: "ticket",
33
+ key: summary.key,
34
+ state: summary.state,
35
+ detail: got.ok ? detailOf(got.aggregate) : "",
36
+ priority: summary.priority,
37
+ waitingOn: pending(intention?.blocked_by, states),
38
+ };
39
+ if (intention?.title !== undefined) {
40
+ row.title = intention.title;
41
+ }
42
+ if (summary.feature !== undefined) {
43
+ row.feature = summary.feature;
44
+ }
45
+ rows.push(withLast(row, lastByKey));
46
+ }
47
+ for (const summary of await input.ledger.listFeatures()) {
48
+ const got = await input.ledger.getFeature(summary.key);
49
+ if (!got.ok) {
50
+ continue;
51
+ }
52
+ const feature = got.aggregate;
53
+ const row = {
54
+ kind: "feature",
55
+ key: summary.key,
56
+ state: feature.state,
57
+ detail: featureDetail(feature.state, feature),
58
+ priority: summary.priority,
59
+ waitingOn: pending(feature.intention.blocked_by, states),
60
+ };
61
+ if (feature.intention.title !== undefined) {
62
+ row.title = feature.intention.title;
63
+ }
64
+ rows.push(withLast(row, lastByKey));
65
+ }
66
+ const inZone = (zone) => rows.filter((r) => zoneOf(r.kind, r.state) === zone);
67
+ return {
68
+ now: input.now,
69
+ install: input.install,
70
+ worker: workerOf(input.holder, film),
71
+ active: inZone("active").sort(activeOrder),
72
+ upcoming: inZone("upcoming").sort(byKeyThenKind),
73
+ past: inZone("past").sort((a, b) => (b.last?.at ?? 0) - (a.last?.at ?? 0) || byKeyThenKind(a, b)),
74
+ };
75
+ }
76
+ /** A person is needed first, then what is being worked on, then what sits with the Authority. */
77
+ const ACTIVE_RANK = {
78
+ escalated: 0,
79
+ invalid: 1,
80
+ running: 2,
81
+ integrating: 3,
82
+ open: 3,
83
+ merging: 4,
84
+ submitted: 5,
85
+ };
86
+ function activeOrder(a, b) {
87
+ return (ACTIVE_RANK[a.state] ?? 9) - (ACTIVE_RANK[b.state] ?? 9) || byKeyThenKind(a, b);
88
+ }
89
+ function byKeyThenKind(a, b) {
90
+ return compareKeys(a.key, b.key) || (a.kind === b.kind ? 0 : a.kind === "feature" ? -1 : 1);
91
+ }
92
+ function pending(blockedBy, states) {
93
+ return (blockedBy ?? []).filter((key) => states.get(key) !== "done");
94
+ }
95
+ function featureDetail(state, feature) {
96
+ if (state === "submitted" || state === "done") {
97
+ return feature.submission?.reference ?? feature.integration_reference ?? "";
98
+ }
99
+ return state === "escalated" ? `${feature.escalation?.kind ?? "?"} — waiting for a human` : "";
100
+ }
101
+ function withLast(row, lastByKey) {
102
+ const last = lastByKey.get(row.key);
103
+ return last === undefined ? row : { ...row, last };
104
+ }
105
+ /** The last non-quiet line that names each key. */
106
+ function lastEvents(film) {
107
+ const found = new Map();
108
+ for (const line of film) {
109
+ if (typeof line.key !== "string" || isQuietJournalLine(line)) {
110
+ continue;
111
+ }
112
+ const at = typeof line.at === "string" ? Date.parse(line.at) : Number.NaN;
113
+ if (Number.isNaN(at)) {
114
+ continue;
115
+ }
116
+ found.set(line.key, { at, what: shortWhat(line) });
117
+ }
118
+ return found;
119
+ }
120
+ function shortWhat(line) {
121
+ const event = typeof line.event === "string" ? line.event : "event";
122
+ const extra = [line.phase, line.label, line.outcome, line.verdict].find((v) => typeof v === "string" && v.length > 0);
123
+ return extra === undefined ? event : `${event} ${extra}`;
124
+ }
125
+ function workerOf(holder, film) {
126
+ const marks = film.filter((l) => l.event === "host-started" || l.event === "host-stopped");
127
+ const lastMark = marks.at(-1);
128
+ const lastStart = [...marks].reverse().find((l) => l.event === "host-started");
129
+ if (holder !== undefined) {
130
+ // The lock names the process; the film says since when, and which version it is.
131
+ const mine = [...marks].reverse().find((l) => l.event === "host-started" && l.pid === holder);
132
+ return { running: true, pid: holder, since: atOf(mine), version: versionOf(mine) };
133
+ }
134
+ const ended = lastMark === undefined ? "never" : lastMark.event === "host-stopped" ? "clean" : "killed";
135
+ return { running: false, ended, at: atOf(lastMark), version: versionOf(lastStart) };
136
+ }
137
+ function atOf(line) {
138
+ const at = typeof line?.at === "string" ? Date.parse(line.at) : Number.NaN;
139
+ return Number.isNaN(at) ? undefined : at;
140
+ }
141
+ function versionOf(line) {
142
+ return typeof line?.version === "string" ? line.version : undefined;
143
+ }
144
+ function readTail(path) {
145
+ let fd;
146
+ try {
147
+ fd = openSync(path, "r");
148
+ const size = fstatSync(fd).size;
149
+ const start = Math.max(0, size - JOURNAL_TAIL_BYTES);
150
+ const buf = Buffer.alloc(size - start);
151
+ readSync(fd, buf, 0, buf.length, start);
152
+ let text = buf.toString("utf8");
153
+ if (start > 0) {
154
+ // The cut falls inside a line: drop that line rather than misread it.
155
+ const newline = text.indexOf("\n");
156
+ text = newline < 0 ? "" : text.slice(newline + 1);
157
+ }
158
+ return parseJournalChunk(text, "").lines;
159
+ }
160
+ catch {
161
+ return [];
162
+ }
163
+ finally {
164
+ if (fd !== undefined) {
165
+ closeSync(fd);
166
+ }
167
+ }
168
+ }
169
+ /**
170
+ * What is not over, as a forest: a row hangs under the first thing it waits on
171
+ * (or under its Feature when it waits on nothing), so a reader sees what a stop
172
+ * holds back. A row waiting on several things appears once, under the first,
173
+ * and names the others.
174
+ */
175
+ export function treeOf(dash) {
176
+ const rows = [...dash.active, ...dash.upcoming];
177
+ const nodes = new Map(rows.map((row) => [row.key, { row, alsoWaitingOn: [], children: [] }]));
178
+ const parentOf = (row) => row.waitingOn.find((key) => nodes.has(key)) ??
179
+ (row.feature !== undefined && nodes.has(row.feature) ? row.feature : undefined);
180
+ const roots = [];
181
+ for (const row of rows) {
182
+ const node = nodes.get(row.key);
183
+ const parent = parentOf(row);
184
+ if (node === undefined) {
185
+ continue;
186
+ }
187
+ node.alsoWaitingOn = row.waitingOn.filter((key) => key !== parent);
188
+ const holder = parent === undefined || reaches(nodes, parent, row.key, parentOf)
189
+ ? undefined
190
+ : nodes.get(parent);
191
+ (holder?.children ?? roots).push(node);
192
+ }
193
+ return roots;
194
+ }
195
+ /** Following parents from `from`, do we come back to `target`? A cycle in the tracker must not loop the screen. */
196
+ function reaches(nodes, from, target, parentOf) {
197
+ const seen = new Set();
198
+ let at = from;
199
+ while (at !== undefined && !seen.has(at)) {
200
+ if (at === target) {
201
+ return true;
202
+ }
203
+ seen.add(at);
204
+ const node = nodes.get(at);
205
+ at = node === undefined ? undefined : parentOf(node.row);
206
+ }
207
+ return false;
208
+ }
209
+ //# sourceMappingURL=dash-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dash-model.js","sourceRoot":"","sources":["../../src/operator/dash-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Dash } from "./dash-model.js";
2
+ export type DashStyle = {
3
+ /** Terminal columns; rows are cut to fit. */
4
+ width: number;
5
+ /** Terminal rows; the lists share what the header and section titles leave. */
6
+ height: number;
7
+ color: boolean;
8
+ /** `tree` hangs what waits under what it waits on; default `list`. */
9
+ mode?: "list" | "tree";
10
+ /** A last line, for the keys the screen answers to. */
11
+ footer?: string;
12
+ };
13
+ /** The whole frame as lines. Pure: the same Dash and style give the same frame. */
14
+ export declare function renderDash(dash: Dash, style: DashStyle): string[];
15
+ export declare function age(ms: number): string;
16
+ //# sourceMappingURL=dash-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dash-view.d.ts","sourceRoot":"","sources":["../../src/operator/dash-view.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,IAAI,EAMV,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,SAAS,GAAG;IACtB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AA2CF,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAgDjE;AA8ID,wBAAgB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAWtC"}
@@ -0,0 +1,226 @@
1
+ import { homedir } from "node:os";
2
+ import { CLI_NAME } from "@bluewombat/manager-kit";
3
+ import { treeOf, zoneOf, } from "./dash-model.js";
4
+ const ICONS = {
5
+ received: "⏳",
6
+ waiting: "⏳",
7
+ running: "🔨",
8
+ open: "🔨",
9
+ integrating: "🧩",
10
+ submitted: "📬",
11
+ merging: "🔀",
12
+ escalated: "🛑",
13
+ invalid: "❗",
14
+ done: "✅",
15
+ cancelled: "🚫",
16
+ };
17
+ const CODES = {
18
+ red: "31",
19
+ green: "32",
20
+ yellow: "33",
21
+ blue: "34",
22
+ dim: "2",
23
+ bold: "1",
24
+ };
25
+ const STATE_PAINT = {
26
+ running: "blue",
27
+ open: "blue",
28
+ integrating: "blue",
29
+ submitted: "yellow",
30
+ merging: "yellow",
31
+ escalated: "red",
32
+ invalid: "red",
33
+ done: "green",
34
+ cancelled: "dim",
35
+ received: "dim",
36
+ waiting: "dim",
37
+ };
38
+ const STATE_WIDTH = 11;
39
+ /** A section always shows at least this many rows, however short the terminal. */
40
+ const MIN_ROWS = 3;
41
+ /** The whole frame as lines. Pure: the same Dash and style give the same frame. */
42
+ export function renderDash(dash, style) {
43
+ const paint = (text, how) => style.color ? `\x1b[${CODES[how]}m${text}\x1b[0m` : text;
44
+ const lines = [];
45
+ lines.push(...headerOf(dash, paint));
46
+ if (style.mode === "tree") {
47
+ lines.push(...treeLines(dash, style, paint));
48
+ if (style.footer !== undefined) {
49
+ lines.push(paint(style.footer, "dim"));
50
+ }
51
+ return lines;
52
+ }
53
+ // 2 header lines + 3 section titles + 1 footer.
54
+ const budget = Math.max(MIN_ROWS * 3, style.height - 6);
55
+ const sizes = split(budget, [dash.active.length, dash.upcoming.length, dash.past.length]);
56
+ const all = [...dash.active, ...dash.upcoming, ...dash.past];
57
+ const prefix = commonPrefix(all.map((r) => r.key));
58
+ const short = (key) => key.slice(prefix.length);
59
+ const keyWidth = Math.max(0, ...all.map((r) => short(r.key).length));
60
+ const section = (title, rows, size, now, showLast) => {
61
+ lines.push(paint(`${title} (${rows.length})`, "bold"));
62
+ if (rows.length === 0) {
63
+ lines.push(paint(" —", "dim"));
64
+ return;
65
+ }
66
+ // A hidden tail still counts: "+N more" takes the last row's place.
67
+ const shown = rows.length > size ? rows.slice(0, Math.max(0, size - 1)) : rows;
68
+ for (const row of shown) {
69
+ lines.push(rowLine(row, { keyWidth, now, width: style.width, paint, short, showLast }));
70
+ }
71
+ if (shown.length < rows.length) {
72
+ lines.push(paint(` … +${rows.length - shown.length} more`, "dim"));
73
+ }
74
+ };
75
+ section("ACTIVE", dash.active, sizes[0] ?? MIN_ROWS, dash.now, true);
76
+ section("UPCOMING", dash.upcoming, sizes[1] ?? MIN_ROWS, dash.now, false);
77
+ section("PAST", dash.past, sizes[2] ?? MIN_ROWS, dash.now, true);
78
+ if (style.footer !== undefined) {
79
+ lines.push(paint(style.footer, "dim"));
80
+ }
81
+ return lines;
82
+ }
83
+ /** Everything still to do, as a tree; what is over is only counted. */
84
+ function treeLines(dash, style, paint) {
85
+ const roots = treeOf(dash);
86
+ const flat = [];
87
+ const walk = (nodes, lead) => {
88
+ nodes.forEach((node, index) => {
89
+ const last = index === nodes.length - 1;
90
+ flat.push({
91
+ node,
92
+ indent: lead === "" && nodes === roots ? "" : `${lead}${last ? "└─ " : "├─ "}`,
93
+ });
94
+ walk(node.children, nodes === roots ? "" : `${lead}${last ? " " : "│ "}`);
95
+ });
96
+ };
97
+ walk(roots, "");
98
+ // Children of a root hang from column 0.
99
+ const prefix = commonPrefix([...dash.active, ...dash.upcoming, ...dash.past].map((r) => r.key));
100
+ const short = (key) => key.slice(prefix.length);
101
+ const keyWidth = Math.max(0, ...flat.map(({ node, indent }) => indent.length + short(node.row.key).length));
102
+ const lines = [paint(`TO DO (${flat.length}) · ${dash.past.length} over`, "bold")];
103
+ // 2 header + 1 title + 1 footer.
104
+ const room = Math.max(MIN_ROWS, style.height - 4);
105
+ const shown = flat.length > room ? flat.slice(0, Math.max(0, room - 1)) : flat;
106
+ for (const { node, indent } of shown) {
107
+ const row = { ...node.row, waitingOn: node.alsoWaitingOn };
108
+ lines.push(rowLine(row, {
109
+ keyWidth,
110
+ now: dash.now,
111
+ width: style.width,
112
+ paint,
113
+ short,
114
+ showLast: zoneOf(row.kind, row.state) === "active",
115
+ indent,
116
+ }));
117
+ }
118
+ if (flat.length === 0) {
119
+ lines.push(paint(" —", "dim"));
120
+ }
121
+ else if (shown.length < flat.length) {
122
+ lines.push(paint(` … +${flat.length - shown.length} more`, "dim"));
123
+ }
124
+ return lines;
125
+ }
126
+ function headerOf(dash, paint) {
127
+ const where = dash.install.source === "npm" ? "npm package" : `local copy ${tilde(dash.install.dir)}`;
128
+ const first = `${CLI_NAME} ${dash.install.version} · ${where}`;
129
+ return [paint(first, "bold"), `${workerText(dash.worker, dash.now, paint)}${versionNote(dash)}`];
130
+ }
131
+ function versionNote(dash) {
132
+ const theirs = dash.worker.version;
133
+ return theirs !== undefined && theirs !== dash.install.version
134
+ ? ` ⚠️ the worker runs ${theirs}, this command ${dash.install.version}`
135
+ : "";
136
+ }
137
+ function workerText(worker, now, paint) {
138
+ if (worker.running) {
139
+ const up = worker.since === undefined ? "" : ` · up ${age(now - worker.since)}`;
140
+ return `${paint("🟢 running", "green")} pid ${worker.pid}${up}`;
141
+ }
142
+ const when = worker.at === undefined ? "" : ` ${age(now - worker.at)} ago`;
143
+ switch (worker.ended) {
144
+ case "clean":
145
+ return `${paint("⚫ stopped", "dim")} stopped${when}`;
146
+ case "killed":
147
+ return `${paint("🔴 stopped", "red")} died without saying so (last sign${when})`;
148
+ default:
149
+ return `${paint("⚫ stopped", "dim")} no run recorded in this ledger`;
150
+ }
151
+ }
152
+ function rowLine(row, ctx) {
153
+ const icon = ICONS[row.state] ?? "▫️";
154
+ const indent = ctx.indent ?? "";
155
+ const lead = `${indent}${icon} ${ctx.short(row.key).padEnd(ctx.keyWidth - indent.length)} `;
156
+ const state = ctx.paint(row.state.padEnd(STATE_WIDTH), STATE_PAINT[row.state] ?? "dim");
157
+ // Icon is two columns wide however many code points it takes.
158
+ const used = 2 + 1 + ctx.keyWidth + 2 + STATE_WIDTH + 2;
159
+ // (the indent is part of keyWidth: columns line up whatever the depth)
160
+ const room = Math.max(0, ctx.width - used);
161
+ const tag = row.kind === "feature" ? "Feature " : "";
162
+ const wait = row.waitingOn.length > 0 ? ` ⛓ ${row.waitingOn.map(ctx.short).join(", ")}` : "";
163
+ const seen = row.last === undefined || !ctx.showLast
164
+ ? ""
165
+ : ` · ${row.last.what} ${age(ctx.now - row.last.at)}`;
166
+ const text = [`${tag}${row.title ?? ""}`.trim(), row.detail]
167
+ .filter((s) => s.length > 0)
168
+ .join(" — ");
169
+ const rest = clip(`${text}${wait}`, room);
170
+ const tail = clip(seen, Math.max(0, room - rest.length));
171
+ return `${lead}${state} ${rest}${ctx.paint(tail, "dim")}`.trimEnd();
172
+ }
173
+ /** Rows each list may show: all it needs, with the leftover going to whichever needs more. */
174
+ function split(budget, needs) {
175
+ const sizes = needs.map(() => MIN_ROWS);
176
+ let left = budget - MIN_ROWS * needs.length;
177
+ for (;;) {
178
+ const hungry = needs.findIndex((n, i) => n > (sizes[i] ?? 0));
179
+ if (left <= 0 || hungry < 0) {
180
+ break;
181
+ }
182
+ // Active is served first, then upcoming, then past.
183
+ sizes[hungry] = (sizes[hungry] ?? 0) + 1;
184
+ left -= 1;
185
+ }
186
+ return sizes;
187
+ }
188
+ export function age(ms) {
189
+ const s = Math.max(0, Math.floor(ms / 1000));
190
+ if (s < 60) {
191
+ return `${s}s`;
192
+ }
193
+ const m = Math.floor(s / 60);
194
+ if (m < 60) {
195
+ return `${m}m`;
196
+ }
197
+ const h = Math.floor(m / 60);
198
+ return h < 48 ? `${h}h${String(m % 60).padStart(2, "0")}` : `${Math.floor(h / 24)}d`;
199
+ }
200
+ function clip(text, width) {
201
+ if (width <= 0) {
202
+ return "";
203
+ }
204
+ return text.length <= width ? text : `${text.slice(0, Math.max(0, width - 1))}…`;
205
+ }
206
+ function tilde(path) {
207
+ const home = homedir();
208
+ return path.startsWith(home) ? `~${path.slice(home.length)}` : path;
209
+ }
210
+ /** What every key starts with, up to and including a `#` or `:` — `github:tilap/ksmgr#` — so a row only says its number. */
211
+ function commonPrefix(keys) {
212
+ const first = keys[0];
213
+ if (first === undefined) {
214
+ return "";
215
+ }
216
+ let end = first.length;
217
+ for (const key of keys) {
218
+ while (end > 0 && !key.startsWith(first.slice(0, end))) {
219
+ end -= 1;
220
+ }
221
+ }
222
+ const head = first.slice(0, end);
223
+ const cut = Math.max(head.lastIndexOf("#"), head.lastIndexOf(":"));
224
+ return cut < 0 ? "" : head.slice(0, cut + 1);
225
+ }
226
+ //# sourceMappingURL=dash-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dash-view.js","sourceRoot":"","sources":["../../src/operator/dash-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ export type DashInput = {
2
+ cwd: string;
3
+ argv: string[];
4
+ write: (text: string) => void;
5
+ interruptFlag: {
6
+ interrupted: boolean;
7
+ };
8
+ /** Present at a terminal: the screen is redrawn in place. Absent (a pipe), one frame is printed. */
9
+ screen?: {
10
+ columns: number;
11
+ rows: number;
12
+ color: boolean;
13
+ size: () => {
14
+ columns: number;
15
+ rows: number;
16
+ };
17
+ };
18
+ /** Keys typed at the terminal: `t` flips list and tree, `r` redraws, `q` or Ctrl-C leaves. Absent, the screen answers to no key. */
19
+ keys?: {
20
+ subscribe: (onKey: (key: string) => void) => () => void;
21
+ };
22
+ /** Which view to open on. */
23
+ tree?: boolean;
24
+ /** Tests shrink this. */
25
+ now?: () => number;
26
+ };
27
+ /**
28
+ * A dashboard of the ledger that redraws itself: the version, whether the worker
29
+ * is there, what is being worked on, what is next, what just finished.
30
+ *
31
+ * Like `watch`, it opens the ledger and the journal and nothing else.
32
+ */
33
+ export declare function runDash(input: DashInput): Promise<number>;
34
+ //# sourceMappingURL=dash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dash.d.ts","sourceRoot":"","sources":["../../src/operator/dash.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,aAAa,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC;IACxC,oGAAoG;IACpG,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/C,CAAC;IACF,oIAAoI;IACpI,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;KAAE,CAAC;IACnE,6BAA6B;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAmBF;;;;;GAKG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CA2E/D"}