@acpus/tui 0.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.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/agentTranscript.d.ts +33 -0
  4. package/dist/agentTranscript.d.ts.map +1 -0
  5. package/dist/agentTranscript.js +238 -0
  6. package/dist/agentTranscript.js.map +1 -0
  7. package/dist/components/App.d.ts +28 -0
  8. package/dist/components/App.d.ts.map +1 -0
  9. package/dist/components/App.js +516 -0
  10. package/dist/components/App.js.map +1 -0
  11. package/dist/components/DetailsPane.d.ts +65 -0
  12. package/dist/components/DetailsPane.d.ts.map +1 -0
  13. package/dist/components/DetailsPane.js +290 -0
  14. package/dist/components/DetailsPane.js.map +1 -0
  15. package/dist/components/Footer.d.ts +12 -0
  16. package/dist/components/Footer.d.ts.map +1 -0
  17. package/dist/components/Footer.js +34 -0
  18. package/dist/components/Footer.js.map +1 -0
  19. package/dist/components/GraphPane.d.ts +31 -0
  20. package/dist/components/GraphPane.d.ts.map +1 -0
  21. package/dist/components/GraphPane.js +35 -0
  22. package/dist/components/GraphPane.js.map +1 -0
  23. package/dist/components/RunPicker.d.ts +17 -0
  24. package/dist/components/RunPicker.d.ts.map +1 -0
  25. package/dist/components/RunPicker.js +53 -0
  26. package/dist/components/RunPicker.js.map +1 -0
  27. package/dist/components/StatusOverview.d.ts +20 -0
  28. package/dist/components/StatusOverview.d.ts.map +1 -0
  29. package/dist/components/StatusOverview.js +19 -0
  30. package/dist/components/StatusOverview.js.map +1 -0
  31. package/dist/controls.d.ts +15 -0
  32. package/dist/controls.d.ts.map +1 -0
  33. package/dist/controls.js +68 -0
  34. package/dist/controls.js.map +1 -0
  35. package/dist/index.d.ts +11 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +33 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/model.d.ts +130 -0
  40. package/dist/model.d.ts.map +1 -0
  41. package/dist/model.js +429 -0
  42. package/dist/model.js.map +1 -0
  43. package/dist/osc52.d.ts +3 -0
  44. package/dist/osc52.d.ts.map +1 -0
  45. package/dist/osc52.js +8 -0
  46. package/dist/osc52.js.map +1 -0
  47. package/dist/poller.d.ts +24 -0
  48. package/dist/poller.d.ts.map +1 -0
  49. package/dist/poller.js +58 -0
  50. package/dist/poller.js.map +1 -0
  51. package/dist/theme.d.ts +37 -0
  52. package/dist/theme.d.ts.map +1 -0
  53. package/dist/theme.js +68 -0
  54. package/dist/theme.js.map +1 -0
  55. package/dist/ui/inkui/JSONViewer.d.ts +37 -0
  56. package/dist/ui/inkui/JSONViewer.d.ts.map +1 -0
  57. package/dist/ui/inkui/JSONViewer.js +121 -0
  58. package/dist/ui/inkui/JSONViewer.js.map +1 -0
  59. package/dist/ui/inkui/KeyHint.d.ts +11 -0
  60. package/dist/ui/inkui/KeyHint.d.ts.map +1 -0
  61. package/dist/ui/inkui/KeyHint.js +7 -0
  62. package/dist/ui/inkui/KeyHint.js.map +1 -0
  63. package/dist/ui/inkui/Markdown.d.ts +9 -0
  64. package/dist/ui/inkui/Markdown.d.ts.map +1 -0
  65. package/dist/ui/inkui/Markdown.js +80 -0
  66. package/dist/ui/inkui/Markdown.js.map +1 -0
  67. package/dist/ui/inkui/ScrollArea.d.ts +29 -0
  68. package/dist/ui/inkui/ScrollArea.d.ts.map +1 -0
  69. package/dist/ui/inkui/ScrollArea.js +38 -0
  70. package/dist/ui/inkui/ScrollArea.js.map +1 -0
  71. package/dist/ui/inkui/Spinner.d.ts +19 -0
  72. package/dist/ui/inkui/Spinner.d.ts.map +1 -0
  73. package/dist/ui/inkui/Spinner.js +36 -0
  74. package/dist/ui/inkui/Spinner.js.map +1 -0
  75. package/dist/ui/inkui/Tabs.d.ts +14 -0
  76. package/dist/ui/inkui/Tabs.d.ts.map +1 -0
  77. package/dist/ui/inkui/Tabs.js +15 -0
  78. package/dist/ui/inkui/Tabs.js.map +1 -0
  79. package/dist/ui/inkui/index.d.ts +8 -0
  80. package/dist/ui/inkui/index.d.ts.map +1 -0
  81. package/dist/ui/inkui/index.js +8 -0
  82. package/dist/ui/inkui/index.js.map +1 -0
  83. package/dist/ui/inkui/theme.d.ts +20 -0
  84. package/dist/ui/inkui/theme.d.ts.map +1 -0
  85. package/dist/ui/inkui/theme.js +51 -0
  86. package/dist/ui/inkui/theme.js.map +1 -0
  87. package/dist/useTerminalSize.d.ts +20 -0
  88. package/dist/useTerminalSize.d.ts.map +1 -0
  89. package/dist/useTerminalSize.js +34 -0
  90. package/dist/useTerminalSize.js.map +1 -0
  91. package/package.json +65 -0
@@ -0,0 +1,516 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState } from "react";
3
+ import { Box, Text, useApp, useInput } from "ink";
4
+ import { open, stat } from "node:fs/promises";
5
+ import { useRunPoller, isTerminal } from "../poller.js";
6
+ import { buildRenderTree, buildRows, countByState, formatElapsed } from "../model.js";
7
+ import { applyControl, canApply, applyRunControl, canApplyRun } from "../controls.js";
8
+ import { useTerminalSize, windowSlice } from "../useTerminalSize.js";
9
+ import { StatusOverview } from "./StatusOverview.js";
10
+ import { GraphPane } from "./GraphPane.js";
11
+ import { DetailsPane, buildDetailSections, detailContentRows, detailSectionRowCount, formatDetailLinesPlainText } from "./DetailsPane.js";
12
+ import { Footer } from "./Footer.js";
13
+ import { copyToClipboard } from "../osc52.js";
14
+ import { Spinner, jsonExpandedIdsForInitialDepth, jsonRowDescriptors, toggleJsonExpandedId } from "../ui/inkui/index.js";
15
+ import { AgentTranscriptAccumulator, emptyAgentExecutionSummary, mergeAgentExecutionSummaries } from "../agentTranscript.js";
16
+ const AGENT_TRANSCRIPT_REFRESH_MS = 3000;
17
+ const AGENT_TRANSCRIPT_CATCHUP_REFRESH_MS = 25;
18
+ const AGENT_TRANSCRIPT_READ_CHUNK_BYTES = 2 * 1024 * 1024;
19
+ const AGENT_TRANSCRIPT_READ_BUDGET_BYTES = 4 * 1024 * 1024;
20
+ const KEY_TO_ACTION = {
21
+ p: "pause",
22
+ r: "resume",
23
+ c: "cancel",
24
+ R: "retry",
25
+ a: "approve",
26
+ x: "reject"
27
+ };
28
+ /** Main dashboard: observe + control a single run. */
29
+ export function App({ client, runId }) {
30
+ const { exit } = useApp();
31
+ const [selectedIndex, setSelectedIndex] = useState(0);
32
+ const [focus, setFocus] = useState("graph");
33
+ const [activeDetailSectionKey, setActiveDetailSectionKey] = useState("summary");
34
+ const [detailsScroll, setDetailsScroll] = useState(0);
35
+ const [jsonExpandedIds, setJsonExpandedIds] = useState(() => new Set());
36
+ const [jsonCursor, setJsonCursor] = useState(0);
37
+ const [collapsedRows, setCollapsedRows] = useState(() => new Set());
38
+ const [refreshNonce, setRefreshNonce] = useState(0);
39
+ const [messages, setMessages] = useState([]);
40
+ const [artifactPaths, setArtifactPaths] = useState({});
41
+ const [agentExecution, setAgentExecution] = useState(undefined);
42
+ const transcriptCacheRef = useRef(new Map());
43
+ const jsonResetKeyRef = useRef(undefined);
44
+ const snapshot = useRunPoller(client, runId, 400, refreshNonce);
45
+ const { rows: termRows, columns: termCols } = useTerminalSize();
46
+ // Build the render tree once per snapshot; rows and counts both derive from it.
47
+ const tree = useMemo(() => (snapshot.ir ? buildRenderTree(snapshot.ir, snapshot.nodes) : null), [snapshot.ir, snapshot.nodes]);
48
+ const allRows = useMemo(() => (tree ? buildRows(tree) : []), [tree]);
49
+ const rows = useMemo(() => visibleRows(allRows, collapsedRows), [allRows, collapsedRows]);
50
+ const counts = useMemo(() => tree
51
+ ? countByState(tree)
52
+ : { pending: 0, running: 0, awaiting: 0, completed: 0, failed: 0, paused: 0, cancelled: 0, total: 0 }, [tree]);
53
+ const clampedIndex = rows.length === 0 ? 0 : Math.min(selectedIndex, rows.length - 1);
54
+ const selected = rows[clampedIndex];
55
+ const selectedArtifactRefs = selected?.instance?.artifactRefs ?? [];
56
+ const selectedArtifactRefsKey = selectedArtifactRefs.join("\n");
57
+ const selectedTranscriptRefs = useMemo(() => selected?.irNode.kind === "run.agent" ? attemptTranscriptRefs(selectedArtifactRefs) : [], [selected?.irNode.kind, selectedArtifactRefsKey]);
58
+ const selectedTranscriptRefsKey = selectedTranscriptRefs.join("\n");
59
+ const selectedTranscriptPathsKey = selectedTranscriptRefs.map((ref) => artifactPaths[ref] ?? "").join("\n");
60
+ // ── Layout budget (height + width). Computed before line-building so the
61
+ // details lines can be wrapped to the actual pane width. ──
62
+ // The whole frame MUST fit within the terminal height, otherwise Ink cannot
63
+ // erase the previous frame and old frames linger. Chrome = top bar (3) +
64
+ // footer (2) + margins; the rest goes to the three equal-height panes.
65
+ const RESERVED = 6;
66
+ const paneHeight = Math.max(8, termRows - RESERVED);
67
+ // Box border + header consume ~4 lines for the graph; details reserves an
68
+ // extra line for the tab bar (see DetailsPane).
69
+ const graphVisibleRows = Math.max(3, paneHeight - 4);
70
+ const detailsVisibleRows = detailContentRows(paneHeight);
71
+ // Width budget. STATUS OVERVIEW stays a fixed sidebar; the remaining width is
72
+ // split between GRAPH and DETAILS so the FOCUSED pane gets ~50% of the whole
73
+ // screen and the unfocused one ~25%.
74
+ const STATUS_WIDTH = 28;
75
+ const remaining = Math.max(20, termCols - STATUS_WIDTH);
76
+ const focusedShare = Math.round(termCols * 0.5);
77
+ const detailsWidth = Math.max(24, Math.min(remaining - 20, focus === "details" ? focusedShare : remaining - focusedShare));
78
+ const graphWidth = Math.max(20, remaining - detailsWidth);
79
+ const freezeAt = snapshot.run?.status === "running" ? undefined : snapshot.run?.updatedAt;
80
+ // Flatten the selected node into a single array of colored lines, then derive
81
+ // the scroll bound from its true length (so long prompts/outputs scroll fully).
82
+ const detailSections = useMemo(() => buildDetailSections(selected, detailsWidth, artifactPaths, freezeAt, agentExecution), [selected, detailsWidth, artifactPaths, freezeAt, agentExecution]);
83
+ const detailLines = useMemo(() => detailSections.flatMap((section) => section.lines), [detailSections]);
84
+ const resolvedActiveDetailSectionKey = useMemo(() => detailSections.some((section) => section.key === activeDetailSectionKey)
85
+ ? activeDetailSectionKey
86
+ : detailSections[0]?.key, [activeDetailSectionKey, detailSections]);
87
+ const activeDetailSection = detailSections.find((section) => section.key === resolvedActiveDetailSectionKey);
88
+ const activeJsonData = activeDetailSection?.richContent?.kind === "json" ? activeDetailSection.richContent.data : undefined;
89
+ const activeJsonResetKey = jsonDisplayResetKey(selected?.rowKey, resolvedActiveDetailSectionKey, activeJsonData);
90
+ const activeJsonRows = useMemo(() => activeJsonData !== undefined
91
+ ? jsonRowDescriptors(activeJsonData, { rootLabel: "root", initialDepth: 3, expandedIds: jsonExpandedIds })
92
+ : [], [activeJsonData, jsonExpandedIds]);
93
+ const activeJsonDisplay = activeJsonData !== undefined
94
+ ? { expandedIds: jsonExpandedIds, selectedIndex: jsonCursor }
95
+ : undefined;
96
+ const detailsMaxScroll = Math.max(0, detailSectionRowCount(activeDetailSection, detailsWidth, activeJsonDisplay) - detailsVisibleRows);
97
+ // Pre-fetch absolute filesystem paths for the selected node's artifacts so
98
+ // DetailsPane can show "<filename> <absPath>". Only successful resolutions are
99
+ // cached; transient misses are retried when the selected node's refs change.
100
+ useEffect(() => {
101
+ const refs = selectedArtifactRefs;
102
+ if (refs.length === 0)
103
+ return;
104
+ const missing = refs.filter((r) => !(r in artifactPaths));
105
+ if (missing.length === 0)
106
+ return;
107
+ let cancelled = false;
108
+ void Promise.all(missing.map(async (uri) => {
109
+ try {
110
+ return [uri, await client.getArtifactPath(runId, uri), undefined];
111
+ }
112
+ catch (err) {
113
+ return [uri, undefined, err instanceof Error ? err.message : String(err)];
114
+ }
115
+ })).then((triples) => {
116
+ if (cancelled)
117
+ return;
118
+ const firstError = triples.find(([, , error]) => error !== undefined)?.[2];
119
+ if (firstError)
120
+ pushMessage(`artifact path unresolved: ${firstError}`, "error");
121
+ const resolved = triples.filter((entry) => entry[1] !== undefined);
122
+ if (resolved.length > 0) {
123
+ setArtifactPaths((prev) => {
124
+ const next = { ...prev };
125
+ for (const [uri, abs] of resolved)
126
+ next[uri] = abs;
127
+ return next;
128
+ });
129
+ }
130
+ });
131
+ return () => {
132
+ cancelled = true;
133
+ };
134
+ }, [client, runId, selectedArtifactRefsKey, artifactPaths]);
135
+ // Read only the selected Agent node's attempt transcripts. Each artifact is
136
+ // cached by URI and read incrementally so switching nodes can render cached
137
+ // activity immediately without synchronously reparsing large transcript files.
138
+ useEffect(() => {
139
+ if (selected?.irNode.kind !== "run.agent") {
140
+ setAgentExecution(undefined);
141
+ return;
142
+ }
143
+ if (selectedTranscriptRefs.length === 0) {
144
+ setAgentExecution(emptyAgentExecutionSummary());
145
+ return;
146
+ }
147
+ setAgentExecution(summaryFromTranscriptCache(transcriptCacheRef.current, selectedTranscriptRefs));
148
+ let cancelled = false;
149
+ let timer;
150
+ const refresh = async () => {
151
+ await refreshTranscriptCaches(transcriptCacheRef.current, selectedTranscriptRefs, artifactPaths, () => {
152
+ if (!cancelled)
153
+ setAgentExecution(summaryFromTranscriptCache(transcriptCacheRef.current, selectedTranscriptRefs));
154
+ });
155
+ if (!cancelled)
156
+ setAgentExecution(summaryFromTranscriptCache(transcriptCacheRef.current, selectedTranscriptRefs));
157
+ const hasPendingReads = hasPendingTranscriptReads(transcriptCacheRef.current, selectedTranscriptRefs, artifactPaths);
158
+ if (!cancelled && (snapshot.run?.status === "running" || hasPendingReads)) {
159
+ timer = setTimeout(() => {
160
+ void refresh();
161
+ }, hasPendingReads ? AGENT_TRANSCRIPT_CATCHUP_REFRESH_MS : AGENT_TRANSCRIPT_REFRESH_MS);
162
+ }
163
+ };
164
+ void refresh();
165
+ return () => {
166
+ cancelled = true;
167
+ if (timer)
168
+ clearTimeout(timer);
169
+ };
170
+ }, [
171
+ artifactPaths,
172
+ selected?.irNode.kind,
173
+ selected?.rowKey,
174
+ selectedTranscriptRefsKey,
175
+ selectedTranscriptPathsKey,
176
+ snapshot.run?.status
177
+ ]);
178
+ // Reset details scroll when the selection changes.
179
+ useEffect(() => {
180
+ setDetailsScroll(0);
181
+ setJsonCursor(0);
182
+ }, [selected?.rowKey]);
183
+ useEffect(() => {
184
+ if (activeJsonResetKey === undefined || activeJsonData === undefined) {
185
+ if (jsonResetKeyRef.current !== undefined) {
186
+ jsonResetKeyRef.current = undefined;
187
+ setJsonExpandedIds(new Set());
188
+ setJsonCursor(0);
189
+ }
190
+ return;
191
+ }
192
+ if (jsonResetKeyRef.current === activeJsonResetKey)
193
+ return;
194
+ jsonResetKeyRef.current = activeJsonResetKey;
195
+ setJsonExpandedIds(jsonExpandedIdsForInitialDepth(activeJsonData, { rootLabel: "root", initialDepth: 3 }));
196
+ setJsonCursor(0);
197
+ setDetailsScroll(0);
198
+ }, [activeJsonData, activeJsonResetKey]);
199
+ useEffect(() => {
200
+ if (activeJsonRows.length === 0)
201
+ return;
202
+ setJsonCursor((cursor) => Math.min(cursor, activeJsonRows.length - 1));
203
+ setDetailsScroll((offset) => Math.min(offset, Math.max(0, activeJsonRows.length - detailsVisibleRows)));
204
+ }, [activeJsonRows.length, detailsVisibleRows]);
205
+ useEffect(() => {
206
+ if (!resolvedActiveDetailSectionKey)
207
+ return;
208
+ if (resolvedActiveDetailSectionKey !== activeDetailSectionKey) {
209
+ setActiveDetailSectionKey(resolvedActiveDetailSectionKey);
210
+ setDetailsScroll(0);
211
+ }
212
+ }, [activeDetailSectionKey, resolvedActiveDetailSectionKey]);
213
+ useInput((input, key) => {
214
+ if (input === "q" || (key.ctrl && input === "c")) {
215
+ exit();
216
+ return;
217
+ }
218
+ if (input === "h") {
219
+ setFocus("graph");
220
+ return;
221
+ }
222
+ if (input === "l") {
223
+ setFocus("details");
224
+ return;
225
+ }
226
+ if (focus === "details") {
227
+ // DETAILS pane: j/k line scroll; u/d half-page scroll; y copy all.
228
+ const halfPage = Math.max(1, Math.floor(detailsVisibleRows / 2));
229
+ if (input === "j") {
230
+ if (activeJsonData !== undefined) {
231
+ moveJsonCursor(1);
232
+ return;
233
+ }
234
+ setDetailsScroll((s) => Math.min(detailsMaxScroll, s + 1));
235
+ return;
236
+ }
237
+ if (input === "k") {
238
+ if (activeJsonData !== undefined) {
239
+ moveJsonCursor(-1);
240
+ return;
241
+ }
242
+ setDetailsScroll((s) => Math.max(0, s - 1));
243
+ return;
244
+ }
245
+ if ((input === " " || key.return) && activeJsonData !== undefined) {
246
+ const row = activeJsonRows[jsonCursor];
247
+ if (row?.branch) {
248
+ setJsonExpandedIds((prev) => toggleJsonExpandedId(prev, row.id));
249
+ }
250
+ return;
251
+ }
252
+ if (input === "d") {
253
+ setDetailsScroll((s) => Math.min(detailsMaxScroll, s + halfPage));
254
+ return;
255
+ }
256
+ if (input === "u") {
257
+ setDetailsScroll((s) => Math.max(0, s - halfPage));
258
+ return;
259
+ }
260
+ if (input === "y") {
261
+ copyToClipboard(formatDetailLinesPlainText(detailLines));
262
+ pushMessage("details copied via OSC52", "info");
263
+ return;
264
+ }
265
+ const detailSectionKey = detailSectionKeyForNumberInput(input, detailSections);
266
+ if (detailSectionKey) {
267
+ setActiveDetailSectionKey(detailSectionKey);
268
+ setDetailsScroll(0);
269
+ return;
270
+ }
271
+ // Fall through to run/node controls (p/r/c/R/a/x) below.
272
+ }
273
+ else {
274
+ // GRAPH pane: k/j select, space folds headers.
275
+ if (input === "k") {
276
+ setSelectedIndex((i) => Math.max(0, i - 1));
277
+ return;
278
+ }
279
+ if (input === "j") {
280
+ setSelectedIndex((i) => rows.length === 0 ? 0 : Math.min(rows.length - 1, i + 1));
281
+ return;
282
+ }
283
+ if (input === "g") {
284
+ setSelectedIndex(0);
285
+ return;
286
+ }
287
+ if (input === "G") {
288
+ setSelectedIndex(rows.length === 0 ? 0 : rows.length - 1);
289
+ return;
290
+ }
291
+ if (input === " " && selected?.isHeader) {
292
+ setCollapsedRows((prev) => {
293
+ const next = new Set(prev);
294
+ if (next.has(selected.rowKey))
295
+ next.delete(selected.rowKey);
296
+ else
297
+ next.add(selected.rowKey);
298
+ return next;
299
+ });
300
+ return;
301
+ }
302
+ }
303
+ const action = KEY_TO_ACTION[input];
304
+ if (action) {
305
+ void runControl(action);
306
+ }
307
+ });
308
+ async function runControl(action) {
309
+ const isSelectedExecutable = selected?.irNode.kind === "run.agent" || selected?.irNode.kind === "run.program";
310
+ const selectedNodeKey = selected?.nodeKey;
311
+ const nodeRetry = action === "retry" && selectedNodeKey && isSelectedExecutable && selected?.state === "failed";
312
+ const nodeDecision = (action === "approve" || action === "reject") && selectedNodeKey;
313
+ if ((nodeRetry || nodeDecision) && selected && selectedNodeKey) {
314
+ if (!canApply(action, selected.state)) {
315
+ pushMessage(`Cannot ${action} a ${selected.state ?? "not-started"} node.`, "error");
316
+ return;
317
+ }
318
+ try {
319
+ const state = await applyControl(client, action, runId, selectedNodeKey);
320
+ pushMessage(`${action} → ${selectedNodeKey} (${state.state})`, "info");
321
+ setRefreshNonce((n) => n + 1);
322
+ }
323
+ catch (err) {
324
+ pushMessage(err instanceof Error ? err.message : String(err), "error");
325
+ }
326
+ return;
327
+ }
328
+ if (action === "approve" || action === "reject") {
329
+ pushMessage(`Select an awaiting approval node to ${action}.`, "error");
330
+ return;
331
+ }
332
+ if (!canApplyRun(action, run?.status)) {
333
+ pushMessage(`Cannot ${action} a ${run?.status ?? "unknown"} run.`, "error");
334
+ return;
335
+ }
336
+ try {
337
+ const state = await applyRunControl(client, action, runId);
338
+ pushMessage(`${action} run → ${state.status}`, "info");
339
+ setRefreshNonce((n) => n + 1);
340
+ }
341
+ catch (err) {
342
+ pushMessage(err instanceof Error ? err.message : String(err), "error");
343
+ }
344
+ }
345
+ function pushMessage(text, level) {
346
+ setMessages((prev) => [...prev, { text, level }].slice(-3));
347
+ }
348
+ function moveJsonCursor(delta) {
349
+ setJsonCursor((cursor) => {
350
+ const next = nextJsonCursor(cursor, delta, activeJsonRows.length);
351
+ setDetailsScroll((offset) => scrollOffsetForCursor(next, offset, detailsVisibleRows));
352
+ return next;
353
+ });
354
+ }
355
+ const run = snapshot.run;
356
+ const live = run ? !isTerminal(run.status) : false;
357
+ // While live, elapsed grows with wall-clock. Once the run reaches a terminal
358
+ // state, freeze it at (updatedAt − createdAt) so it stops ticking.
359
+ const elapsed = run
360
+ ? formatElapsed((live ? Date.now() : Date.parse(run.updatedAt)) - Date.parse(run.createdAt))
361
+ : "--:--:--";
362
+ const overviewMessages = [
363
+ ...messages,
364
+ ...(snapshot.error ? [{ text: `supervisor poll error: ${snapshot.error} (retrying)`, level: "error" }] : []),
365
+ ...(selected?.state === "awaiting"
366
+ ? [{ text: "selected gate is awaiting: a approve, x reject", level: "info" }]
367
+ : [])
368
+ ].slice(-3);
369
+ const win = windowSlice(rows.length, clampedIndex, graphVisibleRows);
370
+ const windowedRows = rows.slice(win.start, win.end);
371
+ const moreAbove = win.start;
372
+ const moreBelow = rows.length - win.end;
373
+ if (!snapshot.loaded) {
374
+ return (_jsx(Box, { padding: 1, children: _jsx(Text, { color: "yellow", children: snapshot.error ? `Error: ${snapshot.error}` : `Loading run ${runId}…` }) }));
375
+ }
376
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, justifyContent: "space-between", children: [_jsxs(Text, { children: [_jsx(Text, { bold: true, color: "cyan", children: "\u26EC Acpus Workflow Runner" }), _jsx(Text, { color: "gray", children: " \u2502 Run " }), _jsx(Text, { children: run?.runId }), _jsx(Text, { color: "gray", children: " \u2502 Workflow " }), _jsx(Text, { color: "green", children: run?.workflowName }), _jsx(Text, { color: "gray", children: " \u2502 Status " }), _jsx(Text, { color: live ? "yellow" : "white", children: run?.status }), run && run.runAttempt > 1 ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: "gray", children: " \u2502 " }), _jsxs(Text, { color: "yellow", children: ["\u21BA", run.runAttempt] })] })) : null] }), _jsxs(Text, { children: [_jsx(Text, { color: "gray", children: "Elapsed " }), _jsxs(Text, { children: [elapsed, " "] }), live ? _jsx(Spinner, { label: "LIVE", active: live }) : _jsx(Text, { color: "gray", bold: true, children: "\u25A0 ENDED" })] })] }), _jsxs(Box, { height: paneHeight, children: [_jsx(StatusOverview, { counts: counts, messages: overviewMessages, height: paneHeight }), _jsx(GraphPane, { rows: windowedRows, selectedIndex: clampedIndex - win.start, focused: focus === "graph", moreAbove: moreAbove, moreBelow: moreBelow, height: paneHeight, width: graphWidth, freezeAt: freezeAt, collapsedRows: collapsedRows }), _jsx(DetailsPane, { sections: detailSections, activeSectionKey: resolvedActiveDetailSectionKey, height: paneHeight, width: detailsWidth, focused: focus === "details", scrollOffset: detailsScroll, jsonDisplay: activeJsonDisplay })] }), _jsx(Footer, { focus: focus, tabCount: detailSections.length })] }));
377
+ }
378
+ export function detailSectionKeyForNumberInput(input, sections) {
379
+ if (!/^[1-9]$/.test(input))
380
+ return undefined;
381
+ const index = Number(input) - 1;
382
+ return sections[index]?.key;
383
+ }
384
+ export function nextJsonCursor(current, delta, rowCount) {
385
+ if (rowCount <= 0)
386
+ return 0;
387
+ return Math.max(0, Math.min(rowCount - 1, current + delta));
388
+ }
389
+ export function scrollOffsetForCursor(cursor, currentOffset, visibleRows) {
390
+ const height = Math.max(1, visibleRows);
391
+ if (cursor < currentOffset)
392
+ return cursor;
393
+ if (cursor >= currentOffset + height)
394
+ return cursor - height + 1;
395
+ return currentOffset;
396
+ }
397
+ export function jsonDisplayResetKey(selectedRowKey, activeSectionKey, jsonData) {
398
+ if (selectedRowKey === undefined || activeSectionKey === undefined || jsonData === undefined)
399
+ return undefined;
400
+ return JSON.stringify([selectedRowKey, activeSectionKey]);
401
+ }
402
+ export function visibleRows(rows, collapsed) {
403
+ const visible = [];
404
+ let hiddenUntilDepth;
405
+ for (const row of rows) {
406
+ if (hiddenUntilDepth !== undefined) {
407
+ if (row.depth > hiddenUntilDepth)
408
+ continue;
409
+ hiddenUntilDepth = undefined;
410
+ }
411
+ visible.push(row);
412
+ if (collapsed.has(row.rowKey)) {
413
+ hiddenUntilDepth = row.depth;
414
+ }
415
+ }
416
+ return visible;
417
+ }
418
+ function attemptTranscriptRefs(refs) {
419
+ return [...new Set(refs ?? [])]
420
+ .map((ref) => ({ ref, attempt: attemptNumber(ref) }))
421
+ .filter((entry) => entry.attempt !== undefined)
422
+ .sort((a, b) => a.attempt - b.attempt)
423
+ .map((entry) => entry.ref);
424
+ }
425
+ function attemptNumber(ref) {
426
+ const match = /attempt-(\d+)\.transcript\.jsonl$/.exec(ref);
427
+ return match ? Number(match[1]) : undefined;
428
+ }
429
+ function summaryFromTranscriptCache(cache, refs) {
430
+ const summaries = refs.map((ref) => cache.get(ref)?.summary).filter((summary) => summary !== undefined);
431
+ return summaries.length > 0 ? mergeAgentExecutionSummaries(summaries) : emptyAgentExecutionSummary();
432
+ }
433
+ async function refreshTranscriptCaches(cache, refs, artifactPaths, onProgress) {
434
+ await Promise.all(refs.map((ref, index) => refreshTranscriptCache(cache, ref, artifactPaths[ref], index, onProgress)));
435
+ }
436
+ export async function refreshTranscriptCacheForTest(cache, ref, path, index, onProgress) {
437
+ await refreshTranscriptCache(cache, ref, path, index, onProgress);
438
+ }
439
+ async function refreshTranscriptCache(cache, ref, path, index, onProgress) {
440
+ if (!path)
441
+ return;
442
+ const orderOffset = (index + 1) * 1_000_000_000;
443
+ const existing = cache.get(ref);
444
+ const entry = existing ?? {
445
+ offset: 0,
446
+ accumulator: new AgentTranscriptAccumulator(),
447
+ summary: emptyAgentExecutionSummary(),
448
+ inFlight: false
449
+ };
450
+ if (entry.path !== path) {
451
+ entry.path = path;
452
+ entry.offset = 0;
453
+ entry.targetSize = undefined;
454
+ entry.accumulator.reset();
455
+ entry.summary = emptyAgentExecutionSummary();
456
+ }
457
+ cache.set(ref, entry);
458
+ if (entry.inFlight)
459
+ return;
460
+ entry.inFlight = true;
461
+ try {
462
+ const info = await stat(path);
463
+ entry.targetSize = info.size;
464
+ if (info.size < entry.offset) {
465
+ entry.offset = 0;
466
+ entry.targetSize = info.size;
467
+ entry.accumulator.reset();
468
+ }
469
+ if (info.size === entry.offset)
470
+ return;
471
+ const handle = await open(path, "r");
472
+ try {
473
+ await readTranscriptChunks(handle, entry, info.size, orderOffset, onProgress);
474
+ }
475
+ finally {
476
+ await handle.close();
477
+ }
478
+ }
479
+ catch {
480
+ entry.summary = entry.summary ?? emptyAgentExecutionSummary();
481
+ }
482
+ finally {
483
+ entry.inFlight = false;
484
+ }
485
+ }
486
+ function hasPendingTranscriptReads(cache, refs, artifactPaths) {
487
+ return refs.some((ref) => {
488
+ const path = artifactPaths[ref];
489
+ if (!path)
490
+ return false;
491
+ const entry = cache.get(ref);
492
+ if (!entry || entry.path !== path)
493
+ return true;
494
+ return entry.targetSize !== undefined && entry.offset < entry.targetSize;
495
+ });
496
+ }
497
+ async function readTranscriptChunks(handle, entry, targetSize, orderOffset, onProgress) {
498
+ let bytesReadThisPass = 0;
499
+ while (entry.offset < targetSize && bytesReadThisPass < AGENT_TRANSCRIPT_READ_BUDGET_BYTES) {
500
+ const length = Math.min(AGENT_TRANSCRIPT_READ_CHUNK_BYTES, targetSize - entry.offset, AGENT_TRANSCRIPT_READ_BUDGET_BYTES - bytesReadThisPass);
501
+ const buffer = Buffer.alloc(length);
502
+ const result = await handle.read(buffer, 0, length, entry.offset);
503
+ if (result.bytesRead <= 0)
504
+ break;
505
+ entry.offset += result.bytesRead;
506
+ bytesReadThisPass += result.bytesRead;
507
+ entry.accumulator.append(buffer.subarray(0, result.bytesRead).toString("utf8"));
508
+ entry.summary = entry.accumulator.summary(orderOffset);
509
+ onProgress?.();
510
+ await yieldToEventLoop();
511
+ }
512
+ }
513
+ function yieldToEventLoop() {
514
+ return new Promise((resolve) => setImmediate(resolve));
515
+ }
516
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import React from "react";
2
+ import type { DisplayRow } from "../model.js";
3
+ import type { AgentExecutionSummary } from "../agentTranscript.js";
4
+ /**
5
+ * Right pane: details for the currently-selected node row.
6
+ *
7
+ * The whole pane is flattened into a single array of colored lines
8
+ * (`DetailLine[]`) and then windowed with direct offset slicing — `scrollOffset`
9
+ * is the top visible line index, NOT a selection-centric center position.
10
+ * This makes u/d (half-page) and j/k (line) scroll the entire content
11
+ * uniformly, one line per press.
12
+ *
13
+ * `artifactPaths` maps an artifact:// URI to its resolved absolute filesystem
14
+ * path (pre-fetched by App). Artifacts render as a cyan filename line followed
15
+ * by a gray absolute-path line in plain wrapped text.
16
+ */
17
+ /** One colored segment of a detail line. */
18
+ export interface DetailSegment {
19
+ text: string;
20
+ color?: string;
21
+ bold?: boolean;
22
+ }
23
+ /** One rendered line of the NODE DETAILS pane. */
24
+ export interface DetailLine {
25
+ segments: DetailSegment[];
26
+ }
27
+ export type DetailSectionKey = "summary" | "definition" | "context" | "execution" | "prompt" | "error" | "output" | "artifacts";
28
+ export interface DetailSection {
29
+ key: DetailSectionKey;
30
+ label: string;
31
+ /** Plain fallback used for OSC 52 copy and non-rich rendering. */
32
+ lines: DetailLine[];
33
+ richContent?: {
34
+ kind: "markdown";
35
+ content: string;
36
+ } | {
37
+ kind: "json";
38
+ data: unknown;
39
+ };
40
+ }
41
+ export interface JsonDisplayState {
42
+ expandedIds?: ReadonlySet<string>;
43
+ selectedIndex?: number;
44
+ }
45
+ export declare function DetailsPane({ lines, sections, activeSectionKey, height, width, focused, scrollOffset, jsonDisplay }: {
46
+ lines?: DetailLine[];
47
+ sections?: DetailSection[];
48
+ activeSectionKey?: DetailSectionKey;
49
+ height?: number;
50
+ width?: number;
51
+ focused?: boolean;
52
+ scrollOffset?: number;
53
+ jsonDisplay?: JsonDisplayState;
54
+ }): React.ReactElement;
55
+ export declare function detailContentRows(height: number | undefined): number;
56
+ export declare function detailSectionRowCount(section: DetailSection | undefined, width: number, jsonDisplay?: JsonDisplayState): number;
57
+ /**
58
+ * Flatten the selected row into a single array of colored lines. Pure: callers
59
+ * (App) reuse it to compute the scroll bound, then pass the result to the pane.
60
+ */
61
+ export declare function buildDetailLines(row: DisplayRow | undefined, width: number, artifactPaths: Record<string, string>, freezeAt?: string | number, agentExecution?: AgentExecutionSummary): DetailLine[];
62
+ export declare function buildDetailSections(row: DisplayRow | undefined, width: number, artifactPaths: Record<string, string>, freezeAt?: string | number, agentExecution?: AgentExecutionSummary): DetailSection[];
63
+ /** Plain text form used for clipboard copy; strips colors. */
64
+ export declare function formatDetailLinesPlainText(lines: DetailLine[]): string;
65
+ //# sourceMappingURL=DetailsPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailsPane.d.ts","sourceRoot":"","sources":["../../src/components/DetailsPane.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,KAAK,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AAIzF;;;;;;;;;;;;GAYG;AAEH,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEhI,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,gBAAgB,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;CACvF;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACN,KAAU,EACV,OAAO,EACP,YAAgB,EAChB,WAAW,EACZ,EAAE;IACD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GAAG,KAAK,CAAC,YAAY,CAmCrB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEpE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAG/H;AAkFD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,UAAU,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAC1B,cAAc,CAAC,EAAE,qBAAqB,GACrC,UAAU,EAAE,CAEd;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,UAAU,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAC1B,cAAc,CAAC,EAAE,qBAAqB,GACrC,aAAa,EAAE,CA2GjB;AAkGD,8DAA8D;AAC9D,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAEtE"}