@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,290 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { formatDuration } from "../model.js";
4
+ import { KIND_LABELS, styleForState } from "../theme.js";
5
+ import { ScrollArea, Tabs, jsonViewerRows, markdownRows } from "../ui/inkui/index.js";
6
+ import { clampInline, wrapText } from "../ui/inkui/theme.js";
7
+ export function DetailsPane({ lines, sections, activeSectionKey, height, width = 38, focused, scrollOffset = 0, jsonDisplay }) {
8
+ const paneSections = sections ?? [{ key: "summary", label: "Details", lines: lines ?? [] }];
9
+ const activeSection = paneSections.find((section) => section.key === activeSectionKey) ?? paneSections[0];
10
+ const cols = Math.max(12, width - 4);
11
+ const contentCols = Math.max(11, cols - 1);
12
+ const visibleRows = detailContentRows(height);
13
+ const rows = activeSection ? detailSectionRows(activeSection, contentCols, jsonDisplay) : [];
14
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: focused ? "cyan" : "gray", paddingX: 1, width: width, height: height, overflow: "hidden", children: [_jsxs(Text, { bold: true, color: "magenta", children: ["NODE DETAILS", focused ? " ◂" : ""] }), paneSections.length > 0 ? (_jsx(Tabs, { tabs: paneSections.map((section) => ({ key: section.key, label: section.label })), activeKey: activeSection?.key ?? "", width: cols })) : null, _jsx(Box, { marginTop: 1, children: !activeSection || rows.length === 0 ? (_jsx(Text, { color: "gray", children: "No node selected." })) : (_jsx(ScrollArea, { height: visibleRows, width: cols, offset: scrollOffset, children: rows })) })] }));
15
+ }
16
+ export function detailContentRows(height) {
17
+ return Math.max(1, (height ?? 12) - 5);
18
+ }
19
+ export function detailSectionRowCount(section, width, jsonDisplay) {
20
+ if (!section)
21
+ return 0;
22
+ return detailSectionRows(section, Math.max(11, width - 5), jsonDisplay).length;
23
+ }
24
+ function detailSectionRows(section, cols, jsonDisplay) {
25
+ if (section.richContent?.kind === "markdown") {
26
+ return markdownRows(section.richContent.content, cols);
27
+ }
28
+ if (section.richContent?.kind === "json") {
29
+ return jsonViewerRows(section.richContent.data, cols, {
30
+ rootLabel: "root",
31
+ initialDepth: 3,
32
+ expandedIds: jsonDisplay?.expandedIds,
33
+ selectedIndex: jsonDisplay?.selectedIndex
34
+ });
35
+ }
36
+ return trimLeadingBlanks(section.lines).map((line, i) => renderDetailLine(line, i));
37
+ }
38
+ function renderDetailLine(line, key) {
39
+ return (_jsx(Text, { children: line.segments.length === 0 ? (" ") : (line.segments.map((seg, j) => (_jsx(Text, { color: seg.color, bold: seg.bold, children: seg.text }, j)))) }, key));
40
+ }
41
+ function trimLeadingBlanks(lines) {
42
+ let firstContent = 0;
43
+ while (firstContent < lines.length && lines[firstContent].segments.length === 0)
44
+ firstContent++;
45
+ return lines.slice(firstContent);
46
+ }
47
+ // ─── Line building (pure) ────────────────────────────────────────
48
+ /** A blank spacer line. */
49
+ function blank() {
50
+ return { segments: [] };
51
+ }
52
+ /** A "label: value" line — label gray, value in `valueColor` (default none). */
53
+ function field(label, value, cols, valueColor) {
54
+ // Keep the gap as its own segment so truncation never eats it.
55
+ return {
56
+ segments: [
57
+ { text: `${label}: `, color: "gray" },
58
+ { text: clampInline(value, Math.max(1, cols - label.length - 2)), color: valueColor }
59
+ ]
60
+ };
61
+ }
62
+ /** A "label: long value" field that wraps the value over multiple lines. */
63
+ function wrappedField(label, value, cols, valueColor) {
64
+ const prefix = `${label}: `;
65
+ const firstWidth = Math.max(1, cols - prefix.length);
66
+ const restPrefix = " ".repeat(prefix.length);
67
+ const chunks = wrapText(value, firstWidth);
68
+ return chunks.map((chunk, i) => ({
69
+ segments: i === 0
70
+ ? [{ text: prefix, color: "gray" }, { text: chunk, color: valueColor }]
71
+ : [{ text: restPrefix, color: "gray" }, { text: chunk, color: valueColor }]
72
+ }));
73
+ }
74
+ /** A plain heading line (gray). */
75
+ function heading(text) {
76
+ return { segments: [{ text, color: "gray" }] };
77
+ }
78
+ /** Split a multi-line string into wrapped DetailLines. */
79
+ function textLines(s, cols, color) {
80
+ return s.split("\n").flatMap((line) => wrapText(line, cols).map((chunk) => ({
81
+ segments: [{ text: chunk, color }]
82
+ })));
83
+ }
84
+ /**
85
+ * Flatten the selected row into a single array of colored lines. Pure: callers
86
+ * (App) reuse it to compute the scroll bound, then pass the result to the pane.
87
+ */
88
+ export function buildDetailLines(row, width, artifactPaths, freezeAt, agentExecution) {
89
+ return buildDetailSections(row, width, artifactPaths, freezeAt, agentExecution).flatMap((section) => section.lines);
90
+ }
91
+ export function buildDetailSections(row, width, artifactPaths, freezeAt, agentExecution) {
92
+ if (!row)
93
+ return [];
94
+ const cols = Math.max(12, width - 4);
95
+ const inst = row.instance;
96
+ const style = styleForState(row.state);
97
+ const dyn = inst?.dynamicContext;
98
+ const meta = (row.irNode.metadata ?? {});
99
+ const sections = [];
100
+ const summary = [];
101
+ // ── Runtime info ──
102
+ summary.push(field("Node", row.label, cols));
103
+ summary.push(field("Kind", KIND_LABELS[row.irNode.kind], cols));
104
+ summary.push({
105
+ segments: [
106
+ { text: "Status: ", color: "gray" },
107
+ { text: `${style.glyph} ${style.label}`, color: style.color }
108
+ ]
109
+ });
110
+ if (inst)
111
+ summary.push(field("Attempt", String(inst.attempt), cols));
112
+ if (row.groupDim === "lane")
113
+ summary.push(field("Lane", row.groupValue ?? "?", cols));
114
+ if (row.groupDim === "lane" && row.groupItem !== undefined)
115
+ summary.push(field("Item", row.groupItem, cols));
116
+ if (row.groupDim === "round")
117
+ summary.push(field("Round", row.groupValue ?? "?", cols));
118
+ if (row.branchLabel)
119
+ summary.push(field("Branch", row.branchLabel, cols));
120
+ if (row.branchWhen)
121
+ summary.push(...wrappedField("When", row.branchWhen, cols));
122
+ if (inst)
123
+ summary.push(field("Duration", formatDuration(inst.startedAt, inst.completedAt, freezeAt), cols));
124
+ if (row.nodeKey)
125
+ summary.push(...wrappedField("Key", row.nodeKey, cols));
126
+ sections.push({ key: "summary", label: "Summary", lines: summary });
127
+ // ── Definition (from IR metadata) ──
128
+ const definition = definitionLines(row.irNode.kind, meta, row.summary, row.state, cols);
129
+ if (hasContent(definition))
130
+ sections.push({ key: "definition", label: "Definition", lines: definition });
131
+ // ── Dynamic context ──
132
+ if (dyn) {
133
+ const context = [blank(), heading("Context:")];
134
+ if (dyn.item_id !== undefined)
135
+ context.push(field(" item_id", String(dyn.item_id), cols));
136
+ if (dyn.item_index !== undefined)
137
+ context.push(field(" item_idx", String(dyn.item_index), cols));
138
+ if (dyn.loop)
139
+ context.push(field(" loop.iter", String(dyn.loop.iter), cols));
140
+ sections.push({ key: "context", label: "Context", lines: context });
141
+ }
142
+ // ── Agent execution telemetry from the live/current attempt transcript ──
143
+ if (row.irNode.kind === "run.agent" && agentExecution) {
144
+ const execution = [blank(), heading("Execution:")];
145
+ execution.push(field(" Output tokens", formatOutputTokens(agentExecution), cols));
146
+ execution.push(field(" Tool calls", String(agentExecution.toolCallCount), cols));
147
+ if (agentExecution.recentToolCalls.length > 0) {
148
+ execution.push(heading(" Last tools:"));
149
+ for (const tool of agentExecution.recentToolCalls) {
150
+ execution.push(...textLines(` - ${formatToolCall(tool)}`, cols));
151
+ }
152
+ }
153
+ sections.push({ key: "execution", label: "Execution", lines: execution });
154
+ }
155
+ // ── Prompt (prefer runtime-rendered, fall back to IR template) ──
156
+ const prompt = inst?.renderedPrompt ?? (typeof meta.prompt === "string" ? meta.prompt : undefined);
157
+ if (prompt) {
158
+ sections.push({
159
+ key: "prompt",
160
+ label: "Prompt",
161
+ lines: [blank(), heading("Prompt:"), ...textLines(prompt, cols)],
162
+ richContent: { kind: "markdown", content: prompt }
163
+ });
164
+ }
165
+ // ── Error ──
166
+ if (inst?.error && inst.error !== "Aborted: paused") {
167
+ sections.push({
168
+ key: "error",
169
+ label: "Error",
170
+ lines: [blank(), { segments: [{ text: "Error:", color: "red" }] }, ...textLines(inst.error, cols, "red")]
171
+ });
172
+ }
173
+ // ── Output ──
174
+ if (inst?.output !== undefined) {
175
+ const outputValue = inst.output;
176
+ const outputText = JSON.stringify(outputValue, null, 2) ?? String(outputValue);
177
+ sections.push({
178
+ key: "output",
179
+ label: "Output",
180
+ lines: [blank(), heading("Output:"), ...textLines(outputText, cols)],
181
+ richContent: isExpandableJson(outputValue) ? { kind: "json", data: outputValue } : undefined
182
+ });
183
+ }
184
+ // ── Artifacts (cyan filename line + gray path line; no OSC 8) ──
185
+ if (inst?.artifactRefs && inst.artifactRefs.length > 0) {
186
+ const artifacts = [blank(), heading("Artifacts:")];
187
+ for (const [index, ref] of inst.artifactRefs.entries()) {
188
+ const absPath = artifactPaths[ref];
189
+ const name = ref.split("/").pop() ?? ref;
190
+ if (index > 0)
191
+ artifacts.push(blank());
192
+ artifacts.push({ segments: [{ text: clampInline(name, cols), color: "cyan" }] });
193
+ if (absPath) {
194
+ for (const l of textLines(absPath, cols, "gray"))
195
+ artifacts.push(l);
196
+ }
197
+ else {
198
+ // Path not resolved yet: show the raw artifact:// URI.
199
+ for (const l of textLines(ref, cols, "gray"))
200
+ artifacts.push(l);
201
+ }
202
+ }
203
+ sections.push({ key: "artifacts", label: "Artifacts", lines: artifacts });
204
+ }
205
+ return sections;
206
+ }
207
+ function hasContent(lines) {
208
+ return lines.some((line) => line.segments.length > 0);
209
+ }
210
+ /** Non-null objects and arrays benefit from the JSON tree viewer. */
211
+ function isExpandableJson(value) {
212
+ return value !== null && typeof value === "object";
213
+ }
214
+ /** Definition block lines, varying by node kind. */
215
+ function definitionLines(kind, meta, summary, state, cols) {
216
+ const out = [];
217
+ if (kind === "run.agent") {
218
+ const agent = (meta.agent ?? {});
219
+ const retry = meta.retry;
220
+ out.push(blank(), heading("Definition:"));
221
+ if (agent.use !== undefined)
222
+ out.push(...wrappedField(" Use", String(agent.use), cols));
223
+ out.push(field(" Type", String(agent.type ?? "builtin"), cols));
224
+ if (agent.model !== undefined)
225
+ out.push(field(" Model", String(agent.model), cols));
226
+ if (meta.timeout !== undefined)
227
+ out.push(field(" Timeout", String(meta.timeout), cols));
228
+ if (retry) {
229
+ out.push(field(" Retry", `max=${String(retry.max ?? "?")}${retry.backoff !== undefined ? ` backoff=${String(retry.backoff)}` : ""}`, cols));
230
+ }
231
+ return out;
232
+ }
233
+ if (kind === "run.program") {
234
+ const cmd = Array.isArray(meta.cmd) ? meta.cmd.map(String).join(" ") : undefined;
235
+ const capture = meta.capture;
236
+ out.push(blank(), heading("Definition:"));
237
+ if (cmd)
238
+ out.push(...wrappedField(" Command", cmd, cols));
239
+ if (capture) {
240
+ out.push(field(" Capture", `from=${String(capture.from ?? "?")}${capture.parse !== undefined ? ` parse=${String(capture.parse)}` : ""}`, cols));
241
+ }
242
+ return out;
243
+ }
244
+ if (kind === "guard") {
245
+ out.push(blank(), heading("Definition:"));
246
+ if (meta.when !== undefined)
247
+ out.push(...wrappedField(" When", String(meta.when), cols));
248
+ if (meta.then !== undefined)
249
+ out.push(field(" Then", String(meta.then), cols));
250
+ if (meta.else !== undefined)
251
+ out.push(field(" Else", String(meta.else), cols));
252
+ if (meta.message !== undefined)
253
+ out.push(...wrappedField(" Message", String(meta.message), cols));
254
+ return out;
255
+ }
256
+ if (kind === "approval") {
257
+ out.push(blank(), heading("Definition:"));
258
+ if (meta.timeout !== undefined)
259
+ out.push(field(" Timeout", String(meta.timeout), cols));
260
+ if (meta.on_timeout !== undefined)
261
+ out.push(field(" On timeout", String(meta.on_timeout), cols));
262
+ if (state === "awaiting") {
263
+ out.push({ segments: [{ text: " ⏳ awaiting decision — [a] approve [x] reject", color: "blue" }] });
264
+ }
265
+ return out;
266
+ }
267
+ // composite / subworkflow: surface the summary if any.
268
+ if (summary) {
269
+ out.push(blank(), heading("Definition:"), ...wrappedField(" Flow", summary, cols));
270
+ }
271
+ return out;
272
+ }
273
+ function formatToolCall(tool) {
274
+ const status = tool.status ?? "unknown";
275
+ const name = tool.title ?? tool.toolName ?? tool.kind ?? tool.toolCallId;
276
+ const suffix = [tool.toolName, tool.kind]
277
+ .filter((v) => v !== undefined && v !== name)
278
+ .join(" / ");
279
+ return suffix ? `${status} ${name} (${suffix})` : `${status} ${name}`;
280
+ }
281
+ function formatOutputTokens(summary) {
282
+ if (summary.outputTokens === undefined)
283
+ return "unknown";
284
+ return summary.outputTokenSource === "estimated" ? `~${summary.outputTokens}` : String(summary.outputTokens);
285
+ }
286
+ /** Plain text form used for clipboard copy; strips colors. */
287
+ export function formatDetailLinesPlainText(lines) {
288
+ return lines.map((line) => line.segments.map((seg) => seg.text).join("")).join("\n");
289
+ }
290
+ //# sourceMappingURL=DetailsPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DetailsPane.js","sourceRoot":"","sources":["../../src/components/DetailsPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { type KeyHintItem } from "../ui/inkui/index.js";
3
+ /** Bottom bar: keybinding hints only; dynamic messages live in StatusOverview. */
4
+ export declare function Footer({ focus, tabCount }: {
5
+ focus?: "graph" | "details";
6
+ tabCount?: number;
7
+ }): React.ReactElement;
8
+ export declare function footerHintGroups(focus?: "graph" | "details", tabCount?: number): {
9
+ nav: KeyHintItem[];
10
+ global: KeyHintItem[];
11
+ };
12
+ //# sourceMappingURL=Footer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Footer.d.ts","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEjE,kFAAkF;AAClF,wBAAgB,MAAM,CAAC,EACrB,KAAe,EACf,QAAY,EACb,EAAE;IACD,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,KAAK,CAAC,YAAY,CAQrB;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,GAAE,OAAO,GAAG,SAAmB,EACpC,QAAQ,SAAI,GACX;IAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAwB/C"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box } from "ink";
3
+ import { KeyHint } from "../ui/inkui/index.js";
4
+ /** Bottom bar: keybinding hints only; dynamic messages live in StatusOverview. */
5
+ export function Footer({ focus = "graph", tabCount = 0 }) {
6
+ const { nav, global } = footerHintGroups(focus, tabCount);
7
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(KeyHint, { keys: nav }), _jsx(KeyHint, { keys: global })] }));
8
+ }
9
+ export function footerHintGroups(focus = "graph", tabCount = 0) {
10
+ const nav = focus === "details"
11
+ ? [
12
+ { key: "j/k", label: "scroll" },
13
+ { key: "u/d", label: "half-page" },
14
+ { key: "Space", label: "expand" },
15
+ ...(tabCount > 0 ? [{ key: "1-9", label: `tabs (${tabCount})` }] : []),
16
+ { key: "y", label: "copy all" }
17
+ ]
18
+ : [
19
+ { key: "j/k", label: "select" },
20
+ { key: "g/G", label: "top/bottom" },
21
+ { key: "Space", label: "fold" }
22
+ ];
23
+ const global = [
24
+ { key: "h/l", label: "focus" },
25
+ { key: "p", label: "pause" },
26
+ { key: "r", label: "resume" },
27
+ { key: "c", label: "cancel" },
28
+ { key: "R", label: "retry" },
29
+ { key: "a/x", label: "approve/reject" },
30
+ { key: "q", label: "quit" }
31
+ ];
32
+ return { nav, global };
33
+ }
34
+ //# sourceMappingURL=Footer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Footer.js","sourceRoot":"","sources":["../../src/components/Footer.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAoB,MAAM,sBAAsB,CAAC;AAEjE,kFAAkF;AAClF,MAAM,UAAU,MAAM,CAAC,EACrB,KAAK,GAAG,OAAO,EACf,QAAQ,GAAG,CAAC,EAIb;IACC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1D,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,OAAO,IAAC,IAAI,EAAE,GAAG,GAAI,EACtB,KAAC,OAAO,IAAC,IAAI,EAAE,MAAM,GAAI,IACrB,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAA6B,OAAO,EACpC,QAAQ,GAAG,CAAC;IAEZ,MAAM,GAAG,GAAkB,KAAK,KAAK,SAAS;QAC5C,CAAC,CAAC;YACE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC/B,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE;YAClC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;YACjC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE;SAChC;QACH,CAAC,CAAC;YACE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC/B,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE;YACnC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;SAChC,CAAC;IACN,MAAM,MAAM,GAAkB;QAC5B,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;QAC9B,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE;QAC5B,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC7B,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC7B,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE;QAC5B,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE;QACvC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;KAC5B,CAAC;IACF,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import React from "react";
2
+ import type { DisplayRow } from "../model.js";
3
+ /**
4
+ * Workflow graph rendered as a nested tree/outline. Composite nodes
5
+ * (fanout/parallel/switch/loop/...) are labeled containers; fanout lanes and
6
+ * loop rounds are synthetic group rows; the rest are real IR nodes. Honors
7
+ * acpus's IR tree shape rather than the reference image's left-to-right boxed
8
+ * DAG.
9
+ */
10
+ export declare function GraphPane({ rows, selectedIndex, focused, moreAbove, moreBelow, height, width, freezeAt, collapsedRows }: {
11
+ rows: DisplayRow[];
12
+ selectedIndex: number;
13
+ focused: boolean;
14
+ moreAbove?: number;
15
+ moreBelow?: number;
16
+ height?: number;
17
+ width?: number;
18
+ freezeAt?: string | number;
19
+ collapsedRows?: ReadonlySet<string>;
20
+ }): React.ReactElement;
21
+ export declare function GraphRow({ row, selected, collapsed, freezeAt }: {
22
+ row: DisplayRow;
23
+ selected: boolean;
24
+ collapsed?: boolean;
25
+ freezeAt?: string | number;
26
+ }): React.ReactElement;
27
+ export declare function collapseIndicatorForRow(row: DisplayRow, collapsed: boolean): {
28
+ glyph: "▸" | "▾";
29
+ color: string;
30
+ } | undefined;
31
+ //# sourceMappingURL=GraphPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphPane.d.ts","sourceRoot":"","sources":["../../src/components/GraphPane.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,aAAa,EACb,OAAO,EACP,SAAa,EACb,SAAa,EACb,MAAM,EACN,KAAK,EACL,QAAQ,EACR,aAAa,EACd,EAAE;IACD,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrC,GAAG,KAAK,CAAC,YAAY,CA8BrB;AAED,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,QAAQ,EACR,SAAiB,EACjB,QAAQ,EACT,EAAE;IACD,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B,GAAG,KAAK,CAAC,YAAY,CAoCrB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,GAAG,GAAG,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAM5H"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { formatDuration } from "../model.js";
4
+ import { isComposite, styleForKind, styleForState } from "../theme.js";
5
+ /**
6
+ * Workflow graph rendered as a nested tree/outline. Composite nodes
7
+ * (fanout/parallel/switch/loop/...) are labeled containers; fanout lanes and
8
+ * loop rounds are synthetic group rows; the rest are real IR nodes. Honors
9
+ * acpus's IR tree shape rather than the reference image's left-to-right boxed
10
+ * DAG.
11
+ */
12
+ export function GraphPane({ rows, selectedIndex, focused, moreAbove = 0, moreBelow = 0, height, width, freezeAt, collapsedRows }) {
13
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: focused ? "cyan" : "gray", width: width, flexGrow: width ? undefined : 1, paddingX: 1, height: height, overflow: "hidden", children: [_jsx(Text, { bold: true, color: "magenta", children: "WORKFLOW GRAPH (IR)" }), moreAbove > 0 ? _jsxs(Text, { color: "gray", children: [" \u2191 ", moreAbove, " more"] }) : null, _jsx(Box, { flexDirection: "column", children: rows.map((row, i) => (_jsx(GraphRow, { row: row, selected: i === selectedIndex, collapsed: collapsedRows?.has(row.rowKey) ?? false, freezeAt: freezeAt }, row.rowKey))) }), moreBelow > 0 ? _jsxs(Text, { color: "gray", children: [" \u2193 ", moreBelow, " more"] }) : null] }));
14
+ }
15
+ export function GraphRow({ row, selected, collapsed = false, freezeAt }) {
16
+ const style = styleForState(row.state);
17
+ const kindStyle = styleForKind(row.irNode.kind);
18
+ const isGroup = row.groupDim !== undefined;
19
+ const composite = !isGroup && isComposite(row.irNode.kind);
20
+ const indicator = collapseIndicatorForRow(row, collapsed);
21
+ const dur = row.instance ? formatDuration(row.instance.startedAt, row.instance.completedAt, freezeAt) : "";
22
+ // Single-line row: render everything (incl. duration) inside one truncating
23
+ // Text so Ink never wraps the duration onto a second line. Tree guide-line
24
+ // segments stay outside the selection highlight and use the owning kind color.
25
+ return (_jsxs(Text, { wrap: "truncate", children: [row.treeSegments.map((seg, i) => (_jsx(Text, { color: styleForKind(seg.ownerKind).color, children: seg.text }, i))), _jsxs(Text, { color: selected ? "black" : undefined, backgroundColor: selected ? "cyan" : undefined, children: [_jsxs(Text, { color: style.color, children: [style.glyph, " "] }), isGroup ? (_jsx(Text, { color: "yellow", bold: true, children: row.label })) : (_jsx(Text, { bold: composite, children: row.label })), _jsxs(Text, { color: kindStyle.color, children: [" ", kindStyle.symbol] }), indicator ? _jsxs(Text, { color: indicator.color, children: [" ", indicator.glyph] }) : null, row.branchLabel ? _jsxs(Text, { color: "yellow", children: [" [", row.branchLabel, "]"] }) : null, row.summary ? _jsxs(Text, { color: "gray", children: [" (", row.summary, ")"] }) : null] }), dur ? _jsxs(Text, { color: "gray", children: [" ", dur] }) : null] }));
26
+ }
27
+ export function collapseIndicatorForRow(row, collapsed) {
28
+ if (!row.isHeader)
29
+ return undefined;
30
+ return {
31
+ glyph: collapsed ? "▸" : "▾",
32
+ color: styleForKind(row.irNode.kind).color
33
+ };
34
+ }
35
+ //# sourceMappingURL=GraphPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphPane.js","sourceRoot":"","sources":["../../src/components/GraphPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ import type { RunSupervisorClient } from "@acpus/runtime";
3
+ type RunPickerAction = "up" | "down" | "select" | "quit";
4
+ interface RunPickerKey {
5
+ upArrow?: boolean;
6
+ downArrow?: boolean;
7
+ return?: boolean;
8
+ ctrl?: boolean;
9
+ }
10
+ export declare function runPickerAction(input: string, key: RunPickerKey): RunPickerAction | undefined;
11
+ /** Run picker shown when no runId is given. Lists runs from the supervisor. */
12
+ export declare function RunPicker({ client, onSelect }: {
13
+ client: RunSupervisorClient;
14
+ onSelect: (runId: string) => void;
15
+ }): React.ReactElement;
16
+ export {};
17
+ //# sourceMappingURL=RunPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunPicker.d.ts","sourceRoot":"","sources":["../../src/components/RunPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,mBAAmB,EAAc,MAAM,gBAAgB,CAAC;AAEtE,KAAK,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEzD,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS,CAM7F;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,QAAQ,EACT,EAAE;IACD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,GAAG,KAAK,CAAC,YAAY,CAiErB"}
@@ -0,0 +1,53 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { Box, Text, useApp, useInput } from "ink";
4
+ export function runPickerAction(input, key) {
5
+ if (input === "q" || (key.ctrl && input === "c"))
6
+ return "quit";
7
+ if (input === "k" || key.upArrow)
8
+ return "up";
9
+ if (input === "j" || key.downArrow)
10
+ return "down";
11
+ if (key.return)
12
+ return "select";
13
+ return undefined;
14
+ }
15
+ /** Run picker shown when no runId is given. Lists runs from the supervisor. */
16
+ export function RunPicker({ client, onSelect }) {
17
+ const { exit } = useApp();
18
+ const [runs, setRuns] = useState();
19
+ const [error, setError] = useState();
20
+ const [index, setIndex] = useState(0);
21
+ useEffect(() => {
22
+ client
23
+ .listRuns()
24
+ .then((r) => setRuns(r))
25
+ .catch((e) => setError(e instanceof Error ? e.message : String(e)));
26
+ }, [client]);
27
+ useInput((input, key) => {
28
+ const action = runPickerAction(input, key);
29
+ if (action === "quit") {
30
+ exit();
31
+ return;
32
+ }
33
+ if (!runs || runs.length === 0)
34
+ return;
35
+ if (action === "up")
36
+ setIndex((i) => Math.max(0, i - 1));
37
+ if (action === "down")
38
+ setIndex((i) => Math.min(runs.length - 1, i + 1));
39
+ if (action === "select")
40
+ onSelect(runs[index].runId);
41
+ });
42
+ if (error) {
43
+ return (_jsx(Box, { padding: 1, children: _jsxs(Text, { color: "red", children: ["Failed to list runs: ", error] }) }));
44
+ }
45
+ if (!runs) {
46
+ return (_jsx(Box, { padding: 1, children: _jsx(Text, { color: "yellow", children: "Loading runs\u2026" }) }));
47
+ }
48
+ if (runs.length === 0) {
49
+ return (_jsx(Box, { padding: 1, children: _jsx(Text, { color: "gray", children: "No runs found. Start one with `acpus workflows run <spec>`." }) }));
50
+ }
51
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [_jsxs(Text, { bold: true, color: "magenta", children: ["SELECT A RUN ", _jsx(Text, { color: "gray", children: "(j/k, Enter, q)" })] }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: runs.map((r, i) => (_jsxs(Text, { color: i === index ? "black" : undefined, backgroundColor: i === index ? "cyan" : undefined, children: [r.runId, " ", r.workflowName, " [", r.status, "] ", r.updatedAt] }, r.runId))) })] }));
52
+ }
53
+ //# sourceMappingURL=RunPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunPicker.js","sourceRoot":"","sources":["../../src/components/RunPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import type { NodeState } from "@acpus/runtime";
3
+ export interface OverviewMessage {
4
+ text: string;
5
+ level: "info" | "error";
6
+ }
7
+ /**
8
+ * Left pane: aggregate dashboard. Total + per-state counts (always all 7 states,
9
+ * so it doubles as the legend) + overall progress bar. Counts use the runtime
10
+ * instance basis (fanout lanes / loop rounds each count once); Total == sum of
11
+ * the 7 state counts, so the three numbers are always self-consistent.
12
+ */
13
+ export declare function StatusOverview({ counts, messages, height }: {
14
+ counts: Record<NodeState, number> & {
15
+ total: number;
16
+ };
17
+ messages?: OverviewMessage[];
18
+ height?: number;
19
+ }): React.ReactElement;
20
+ //# sourceMappingURL=StatusOverview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusOverview.d.ts","sourceRoot":"","sources":["../../src/components/StatusOverview.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,EACR,MAAM,EACP,EAAE;IACD,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,KAAK,CAAC,YAAY,CA0ErB"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ import { KIND_STYLES, STATE_STYLES } from "../theme.js";
4
+ /**
5
+ * Left pane: aggregate dashboard. Total + per-state counts (always all 7 states,
6
+ * so it doubles as the legend) + overall progress bar. Counts use the runtime
7
+ * instance basis (fanout lanes / loop rounds each count once); Total == sum of
8
+ * the 7 state counts, so the three numbers are always self-consistent.
9
+ */
10
+ export function StatusOverview({ counts, messages, height }) {
11
+ const done = counts.completed;
12
+ const total = counts.total || 1;
13
+ const pct = Math.round((done / total) * 100);
14
+ const barWidth = 18;
15
+ const filled = Math.round((done / total) * barWidth);
16
+ const bar = "█".repeat(filled) + "░".repeat(barWidth - filled);
17
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", paddingX: 1, width: 28, height: height, overflow: "hidden", children: [_jsx(Text, { bold: true, color: "magenta", children: "STATUS OVERVIEW" }), _jsxs(Box, { marginTop: 1, justifyContent: "space-between", children: [_jsx(Text, { color: "gray", children: "Total Nodes" }), _jsx(Text, { bold: true, children: counts.total })] }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: Object.keys(STATE_STYLES).map((s) => (_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Text, { color: STATE_STYLES[s].color, children: [STATE_STYLES[s].glyph, " ", STATE_STYLES[s].label] }), _jsx(Text, { color: STATE_STYLES[s].color, children: counts[s] })] }, s))) }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsx(Text, { color: "gray", children: "Overall Progress" }), _jsxs(Text, { color: "green", children: [pct, "%"] })] }), _jsxs(Text, { color: "green", children: ["[", bar, "]"] }), _jsxs(Text, { color: "gray", children: [done, " / ", counts.total, " completed"] })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "gray", children: "Node Types" }), _jsx(Box, { flexDirection: "column", children: Object.entries(KIND_STYLES).map(([kind, style]) => (_jsxs(Text, { color: style.color, wrap: "truncate", children: [style.symbol, " ", style.label] }, kind))) })] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "gray", children: "Messages" }), (messages ?? []).length === 0 ? (_jsx(Text, { color: "gray", children: "-" })) : ((messages ?? []).map((msg, i) => (_jsx(Text, { color: msg.level === "error" ? "red" : "green", wrap: "wrap", children: msg.text }, i))))] })] }));
18
+ }
19
+ //# sourceMappingURL=StatusOverview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusOverview.js","sourceRoot":"","sources":["../../src/components/StatusOverview.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOxD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,EACR,MAAM,EAKP;IACC,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;IAE/D,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,MAAM,EACd,QAAQ,EAAC,QAAQ,aAEjB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,gCAEnB,EAEP,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aAC/C,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,4BAAmB,EACrC,KAAC,IAAI,IAAC,IAAI,kBAAE,MAAM,CAAC,KAAK,GAAQ,IAC5B,EAEN,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,YACpC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACrD,MAAC,GAAG,IAAS,cAAc,EAAC,eAAe,aACzC,MAAC,IAAI,IAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,aAC/B,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,OAAG,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,IACzC,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,YAAG,MAAM,CAAC,CAAC,CAAC,GAAQ,KAJ9C,CAAC,CAKL,CACP,CAAC,GACE,EAEN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,MAAC,GAAG,IAAC,cAAc,EAAC,eAAe,aACjC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,iCAAwB,EAC1C,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,aAAE,GAAG,SAAS,IAC7B,EACN,MAAC,IAAI,IAAC,KAAK,EAAC,OAAO,kBAAG,GAAG,SAAS,EAClC,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aACf,IAAI,SAAK,MAAM,CAAC,KAAK,kBACjB,IACH,EAEN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,2BAAkB,EACpC,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAClD,MAAC,IAAI,IAAY,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAC,UAAU,aACjD,KAAK,CAAC,MAAM,OAAG,KAAK,CAAC,KAAK,KADlB,IAAI,CAER,CACR,CAAC,GACE,IACF,EAEN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yBAAgB,EACjC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC/B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAS,CAC5B,CAAC,CAAC,CAAC,CACF,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,KAAC,IAAI,IAAS,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAC,MAAM,YACtE,GAAG,CAAC,IAAI,IADA,CAAC,CAEL,CACR,CAAC,CACH,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Control actions — map keypresses to supervisor control calls, guarding
3
+ * client-side by state so we only attempt actions that can succeed.
4
+ */
5
+ import type { RunSupervisorClient, NodeExecutionState, NodeState, RunStatus } from "@acpus/runtime";
6
+ export type ControlAction = "pause" | "resume" | "cancel" | "retry" | "approve" | "reject";
7
+ /** Whether a node-addressed action is applicable to a node in the given state. */
8
+ export declare function canApply(action: ControlAction, state: NodeState | undefined): boolean;
9
+ /** Whether a Run-level action is applicable to a Run in the given status. */
10
+ export declare function canApplyRun(action: ControlAction, status: RunStatus | undefined): boolean;
11
+ /** Apply a node-addressed action. */
12
+ export declare function applyControl(client: RunSupervisorClient, action: ControlAction, runId: string, nodeKey: string): Promise<NodeExecutionState>;
13
+ /** Apply a Run-level control action. */
14
+ export declare function applyRunControl(client: RunSupervisorClient, action: ControlAction, runId: string): Promise<import("@acpus/runtime").RunState>;
15
+ //# sourceMappingURL=controls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../src/controls.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEpG,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE3F,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAUrF;AAED,6EAA6E;AAC7E,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAiBzF;AAED,qCAAqC;AACrC,wBAAsB,YAAY,CAChC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAa7B;AAED,wCAAwC;AACxC,wBAAsB,eAAe,CACnC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,gBAAgB,EAAE,QAAQ,CAAC,CAe5C"}