mindweave 3.2.1 → 3.2.3

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 (63) hide show
  1. package/dist/cli/App.js +2 -2
  2. package/dist/cli/App.js.map +1 -1
  3. package/dist/cli/agentLines.js +196 -0
  4. package/dist/cli/agentLines.js.map +1 -0
  5. package/dist/cli/components/BlockView.js +1 -1
  6. package/dist/cli/components/BlockView.js.map +1 -1
  7. package/dist/cli/components/SubagentView.js +43 -74
  8. package/dist/cli/components/SubagentView.js.map +1 -1
  9. package/dist/cli/components/WorkGroup.js +55 -11
  10. package/dist/cli/components/WorkGroup.js.map +1 -1
  11. package/dist/cli/help.js +6 -3
  12. package/dist/cli/help.js.map +1 -1
  13. package/dist/cli/toolDisplay.js +8 -2
  14. package/dist/cli/toolDisplay.js.map +1 -1
  15. package/dist/cli/transcript.js +15 -5
  16. package/dist/cli/transcript.js.map +1 -1
  17. package/dist/cli/workLines.js +63 -8
  18. package/dist/cli/workLines.js.map +1 -1
  19. package/dist/cli/zz_show.js +24 -0
  20. package/dist/cli/zz_show.js.map +1 -0
  21. package/dist/core/turnRunner.js +22 -4
  22. package/dist/core/turnRunner.js.map +1 -1
  23. package/dist/dynamo/engine.js +6 -3
  24. package/dist/dynamo/engine.js.map +1 -1
  25. package/dist/dynamo/guard.js +6 -0
  26. package/dist/dynamo/guard.js.map +1 -1
  27. package/dist/dynamo/marathon.js +17 -4
  28. package/dist/dynamo/marathon.js.map +1 -1
  29. package/dist/memory/compaction.js +60 -6
  30. package/dist/memory/compaction.js.map +1 -1
  31. package/dist/memory/session.js +2 -0
  32. package/dist/memory/session.js.map +1 -1
  33. package/dist/tools/guard.js +13 -0
  34. package/dist/tools/guard.js.map +1 -1
  35. package/dist/tools/rebuildDetail.js +2 -3
  36. package/dist/tools/rebuildDetail.js.map +1 -1
  37. package/dist/tools/registry.js +1 -1
  38. package/dist/tools/registry.js.map +1 -1
  39. package/dist/tools/runCommand.js +9 -0
  40. package/dist/tools/runCommand.js.map +1 -1
  41. package/dist/tools/screenshot.js +28 -9
  42. package/dist/tools/screenshot.js.map +1 -1
  43. package/dist/tools/screenshotWin.js +258 -175
  44. package/dist/tools/screenshotWin.js.map +1 -1
  45. package/dist/tools/subagent.js +55 -27
  46. package/dist/tools/subagent.js.map +1 -1
  47. package/dist/tools/subagentOutcome.js +24 -0
  48. package/dist/tools/subagentOutcome.js.map +1 -0
  49. package/dist/tools/treeGuard.js +164 -0
  50. package/dist/tools/treeGuard.js.map +1 -0
  51. package/dist/tools/ui.js +34 -7
  52. package/dist/tools/ui.js.map +1 -1
  53. package/dist/tools/uiHide.js +19 -6
  54. package/dist/tools/uiHide.js.map +1 -1
  55. package/dist/tools/verifierCommands.js +188 -0
  56. package/dist/tools/verifierCommands.js.map +1 -0
  57. package/dist/tools/verifierRun.js +88 -0
  58. package/dist/tools/verifierRun.js.map +1 -0
  59. package/dist/tools/verifierTools.js +19 -0
  60. package/dist/tools/verifierTools.js.map +1 -0
  61. package/dist/tools/verifyReport.js +79 -9
  62. package/dist/tools/verifyReport.js.map +1 -1
  63. package/package.json +3 -3
@@ -0,0 +1,196 @@
1
+ /**
2
+ * agentLines.ts — what a sub-agent says about itself on screen (pure).
3
+ *
4
+ * A sub-agent used to be its task prompt pasted onto one line, then every call it made, then a
5
+ * summary built for the lead agent. This turns that into what a person wants to know, in the order
6
+ * they want it: a short title, how it ended, and, opened, the task, the result and what it did.
7
+ * The list of calls is folded the way the commands row folds them: counts first, repeats merged.
8
+ */
9
+ import { itemLabel } from "./toolItems.js";
10
+ import { visibleWidth, wrapAnsi } from "./wrap.js";
11
+ /**
12
+ * A short title from the task the agent was given (pure). The task is a prompt written for a model
13
+ * ("You are re-verifying a FIXED bug in Notes App, an Electron app at C:\\Projects\\...") and is
14
+ * never a title, so this keeps the first idea in it: the opening words dropped, the first sentence
15
+ * or clause kept, a path left off, and the cut made at a word, never in the middle of one.
16
+ */
17
+ export function agentTitle(task, max) {
18
+ let t = task.replace(/\s+/g, " ").trim();
19
+ t = t.replace(/^(?:you are|you're|your task is to|your job is to|task:|please)\s+/i, "");
20
+ const end = t.search(/[.!?](?:\s|$)|:\s| — | - /);
21
+ if (end >= 12)
22
+ t = t.slice(0, end);
23
+ const comma = t.indexOf(", ");
24
+ if (comma >= 20)
25
+ t = t.slice(0, comma);
26
+ t = t.replace(/\s+(?:at|in|under|inside)\s+(?:[A-Za-z]:\\|\/|~)\S*.*$/i, "");
27
+ t = t.replace(/[\s,;:.-]+$/, "");
28
+ if (t === "")
29
+ return "";
30
+ t = t.charAt(0).toUpperCase() + t.slice(1);
31
+ if (t.length <= max)
32
+ return t;
33
+ const room = Math.max(1, max - 1);
34
+ const space = t.lastIndexOf(" ", room);
35
+ return `${t.slice(0, space >= Math.floor(room / 2) ? space : room).replace(/[\s,;:.-]+$/, "")}…`;
36
+ }
37
+ /** A span of time, whole seconds under a minute and `2m 10s` past it (pure). */
38
+ export function humanSpan(ms) {
39
+ const seconds = Math.max(0, Math.round(ms / 1000));
40
+ if (seconds < 60)
41
+ return `${seconds}s`;
42
+ const m = Math.floor(seconds / 60);
43
+ const s = seconds % 60;
44
+ return s === 0 ? `${m}m` : `${m}m ${s}s`;
45
+ }
46
+ /**
47
+ * Everything a worker did as lines, repeats merged wherever they happen (pure).
48
+ * A poll that came back six times, with other calls between, is `Shell #4 (running) ×6`, not six
49
+ * lines. First appearance sets the order, so the list still reads as what happened.
50
+ */
51
+ export function didRows(items) {
52
+ const rows = [];
53
+ const byLabel = new Map();
54
+ for (const it of items) {
55
+ // A look at the shell list ("1 running, 4 total") is bookkeeping, not something it did to the project.
56
+ const label = it.name === "Shell" && !it.arg ? "Checked the shells" : itemLabel(it);
57
+ const at = byLabel.get(label);
58
+ if (at) {
59
+ at.count += 1;
60
+ if (it.status === "error")
61
+ at.error = true;
62
+ }
63
+ else {
64
+ const row = { label, count: 1, error: it.status === "error" };
65
+ byLabel.set(label, row);
66
+ rows.push(row);
67
+ }
68
+ }
69
+ return rows;
70
+ }
71
+ function kindOf(it) {
72
+ switch (it.kind) {
73
+ case "read":
74
+ return "read";
75
+ case "search":
76
+ return "search";
77
+ case "run":
78
+ return "run";
79
+ case "edit":
80
+ case "write":
81
+ return "change";
82
+ default:
83
+ return "other";
84
+ }
85
+ }
86
+ /**
87
+ * What it did, counted: "Read 6 files, ran 4 commands" (pure). Each kind has its own tense and its
88
+ * own noun, in the order they began, and a call that failed or was refused is said at the end.
89
+ */
90
+ export function didText(items, live) {
91
+ if (items.length === 0)
92
+ return live ? "Starting" : "Nothing";
93
+ const order = [];
94
+ for (const it of items) {
95
+ const k = kindOf(it);
96
+ if (!order.includes(k))
97
+ order.push(k);
98
+ }
99
+ const parts = order.map((k, i) => {
100
+ const mine = items.filter((it) => kindOf(it) === k);
101
+ const going = live && mine.some((it) => it.status === "running");
102
+ const n = k === "read" ? mine.reduce((sum, it) => sum + Math.max(1, it.covers ?? 1), 0) : mine.length;
103
+ let text;
104
+ switch (k) {
105
+ case "read":
106
+ text = `${going ? "Reading" : "Read"} ${n} file${n === 1 ? "" : "s"}`;
107
+ break;
108
+ case "search":
109
+ text = `${going ? "Searching" : "Searched"} ${n === 1 ? "once" : `${n} times`}`;
110
+ break;
111
+ case "run":
112
+ text = `${going ? "Running" : "Ran"} ${n} command${n === 1 ? "" : "s"}`;
113
+ break;
114
+ case "change":
115
+ text = `${going ? "Changing" : "Changed"} ${n} file${n === 1 ? "" : "s"}`;
116
+ break;
117
+ default:
118
+ text = `${n} other call${n === 1 ? "" : "s"}`;
119
+ }
120
+ return i === 0 ? text : text.charAt(0).toLowerCase() + text.slice(1);
121
+ });
122
+ const failed = items.filter((it) => it.status === "error").length;
123
+ return failed > 0 ? `${parts.join(", ")}, ${failed} failed` : parts.join(", ");
124
+ }
125
+ /** What it is doing right now, in the present tense: "reading use-debounced.ts" (pure). */
126
+ export function nowText(items) {
127
+ const going = [...items].reverse().find((it) => it.status === "running");
128
+ if (!going)
129
+ return "";
130
+ const text = itemLabel(going);
131
+ return text.charAt(0).toLowerCase() + text.slice(1);
132
+ }
133
+ export function toneOf(agent) {
134
+ if (agent.verdict === "pass")
135
+ return "good";
136
+ if (agent.verdict === "fail" || agent.status === "error")
137
+ return "bad";
138
+ if (agent.verdict === "partial" || agent.verdict === "unknown")
139
+ return "warn";
140
+ return undefined;
141
+ }
142
+ /** The mark before the outcome: a tick, a cross, or a bang for "not sure". */
143
+ export function markOf(tone) {
144
+ return tone === "good" ? "✓" : tone === "bad" ? "✗" : tone === "warn" ? "!" : "·";
145
+ }
146
+ /** How many lines of what it did are shown opened before the rest is counted. */
147
+ export const MAX_DID_ROWS = 12;
148
+ /**
149
+ * The opened view (pure): the task, how it ended, what it did in a count, then each thing it did.
150
+ * The task is cut to three lines of `width` and ends in an ellipsis when there is more.
151
+ */
152
+ export function bodyRows(agent, live, width) {
153
+ const rows = [];
154
+ const task = (agent.full ?? agent.task).replace(/\s+/g, " ").trim();
155
+ if (task)
156
+ rows.push({ label: "Task", text: cutLines(task, width, 3) });
157
+ if (!live && agent.headline)
158
+ rows.push({ label: "Result", text: `${markOf(toneOf(agent))} ${agent.headline}`, tone: toneOf(agent) });
159
+ else if (!live && agent.summary)
160
+ rows.push({ label: "Result", text: agent.summary, tone: toneOf(agent) });
161
+ rows.push({ label: "Did", text: didText(agent.items, live) });
162
+ const list = didRows(agent.items);
163
+ const shown = list.slice(0, MAX_DID_ROWS);
164
+ for (const r of shown)
165
+ rows.push({ label: "", text: r.count > 1 ? `${r.label} ×${r.count}` : r.label, tone: r.error ? "bad" : undefined });
166
+ if (list.length > shown.length)
167
+ rows.push({ label: "", text: `… and ${list.length - shown.length} more` });
168
+ return rows;
169
+ }
170
+ /** A text kept to `lines` rows of `width` columns, with an ellipsis where it was cut (pure). */
171
+ function cutLines(text, width, lines) {
172
+ const room = Math.max(8, width) * lines;
173
+ if (text.length <= room)
174
+ return text;
175
+ const cut = text.lastIndexOf(" ", room - 1);
176
+ return `${text.slice(0, cut > room / 2 ? cut : room - 1).replace(/[\s,;:.-]+$/, "")}…`;
177
+ }
178
+ /** The width of the label column ("Result") and what is left of a line for the words. */
179
+ export const LABEL_WIDTH = 8;
180
+ export function bandText(columns) {
181
+ return Math.max(8, columns - 14);
182
+ }
183
+ /**
184
+ * The opened rows as lines of exact width (pure): every line wraps to the room beside the label
185
+ * column, a wrapped line hangs under its words, and each is padded so the band is a clean block.
186
+ */
187
+ export function bandRows(rows, columns) {
188
+ const room = bandText(columns);
189
+ const out = [];
190
+ for (const r of rows) {
191
+ const parts = wrapAnsi(r.text === "" ? " " : r.text, room);
192
+ parts.forEach((part, i) => out.push({ label: i === 0 ? r.label : "", text: part, tone: r.tone, pad: Math.max(0, room - visibleWidth(part)) }));
193
+ }
194
+ return out;
195
+ }
196
+ //# sourceMappingURL=agentLines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentLines.js","sourceRoot":"","sources":["../../src/cli/agentLines.ts"],"names":[],"mappings":"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"}
@@ -79,7 +79,7 @@ function BlockViewInner({ block, columns, tightTop, hovered, hoveredItem }) {
79
79
  case "work":
80
80
  return (_jsx(WorkGroup, { id: block.id, items: block.items, open: block.open, live: block.live, columns: columns, tightTop: tightTop, hovered: hovered, hoveredItem: hoveredItem }));
81
81
  case "subagent":
82
- return (_jsx(SubagentView, { agents: block.agents, done: block.done, columns: columns, tightTop: tightTop }));
82
+ return (_jsx(SubagentView, { id: block.id, agents: block.agents, done: block.done, columns: columns, tightTop: tightTop, hoveredItem: hoveredItem }));
83
83
  case "error":
84
84
  return (_jsxs(Box, { marginTop: 1, flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: _jsx(Text, { color: BAD, children: "●" }) }), _jsx(WrappedText, { text: block.text, width: textWidth, color: BAD })] }));
85
85
  case "completion":
@@ -1 +1 @@
1
- {"version":3,"file":"BlockView.js","sourceRoot":"","sources":["../../../src/cli/components/BlockView.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BlockView.js","sourceRoot":"","sources":["../../../src/cli/components/BlockView.tsx"],"names":[],"mappings":"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"}
@@ -1,89 +1,58 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  /**
3
- * SubagentView — delegated work, as a distinct NESTED block.
3
+ * SubagentView — delegated work, as a title and an answer, with the working a click away.
4
4
  *
5
- * ONE worker keeps its full rail, because there is room to watch it:
5
+ * ● Sub-agent Re-verifying a FIXED bug in Notes App · read-only
6
+ * ! Could not fully verify · 8 checks · 20 steps · 2m 10s ▸
6
7
  *
7
- * ◆ Subagent · read-only find every authFetch call site
8
- * │ Searching authFetch
9
- * │ Read login.ts
10
- * ⎿ 3 steps · read-only ← collapses here once it reports back
8
+ * While it works, the dot pulses and the second line says where it is:
11
9
  *
12
- * SEVERAL at once become a topology instead, because read-only workers fan out in
13
- * parallel and their rails, side by side, are a stripe nobody can follow:
10
+ * ● Sub-agent Re-verifying a FIXED bug in Notes App · read-only
11
+ * step 12 · reading use-debounced.ts 1m 5s ▸
14
12
  *
15
- * ◆ Subagents · 2 delegated
16
- * ├── #1 · read-only find every authFetch call site
17
- * │ ⎿ 3 steps · read-only
18
- * └── #2 draft unit tests for runCommand.ts
19
- * ⎿ working · 4 steps
13
+ * What you want from a worker is the answer, so that is what shows: how it ended (a tick, a cross,
14
+ * or a bang when it could only half do it), the steps it took and the time. Its task is a prompt
15
+ * written for a model, so the line holds a short title taken from it, not the prompt itself. A
16
+ * click opens a shaded band: the task, the result, a count of what it did, then each thing it
17
+ * did, with repeats merged (a poll that came back six times is one line, ×6).
20
18
  *
21
- * The trade is deliberate: with one worker you can afford to watch each call; with
22
- * several you need the SHAPE of the delegation — who is doing what, and how far along
23
- * — and the individual calls become noise. What is shown is only what a worker
24
- * actually reports (its task, whether it may write, its progress). The reference
25
- * design also labels each with a model and an "isolated 8k window"; a sub-agent
26
- * carries neither, so inventing them would be decoration that reads as fact.
27
- *
28
- * A violet ◆ marker sets the whole family apart from the blue tool rows — these are
29
- * separate minds working inside the transcript, not more tools. A child's prose is
30
- * never shown; only its final distilled report crosses back, as the spawn's result.
19
+ * Several at once are one group, each with its own two lines, so the shape of the delegation is
20
+ * visible: who is doing what and how far along. A child's own prose is never shown; only its
21
+ * report crosses back. The same look as the folded commands row, so there is one thing to learn.
31
22
  */
32
23
  import { Box, Text } from "ink";
33
- import { ERROR_COLOR } from "../toolDisplay.js";
34
- import { collapseAdjacent } from "../toolItems.js";
35
24
  import { PulseDot } from "./PulseDot.js";
36
- import { BAD } from "../theme.js";
37
- const DIAMOND = "●";
38
- const BRANCH = "⎿";
39
- const RAIL = "│";
40
- const TEE = "├──";
41
- const ELBOW = "└──";
42
- // The rail/branch occupy 3 columns; item text hangs beside them, aligned under the
43
- // header content and never spilling left into the marker gutter.
44
- const RAIL_INDENT = 3;
45
- /** A sub-agent is not given a colour of its own: plain, and red when one failed. */
46
- const AGENT_COLOR = undefined;
47
- export function SubagentView({ agents, done, columns, tightTop, }) {
25
+ import { Elapsed } from "./ToolLine.js";
26
+ import { agentTitle, bandRows, bodyRows, humanSpan, markOf, nowText, toneOf } from "../agentLines.js";
27
+ import { registerExpandable, itemHit } from "../expandHits.js";
28
+ import { BAD, GOOD, USER_BG, USER_FG, WARN } from "../theme.js";
29
+ const DOT = "●";
30
+ const COLOUR = { good: GOOD, bad: BAD, warn: WARN };
31
+ const colourOf = (tone) => (tone ? COLOUR[tone] : undefined);
32
+ export function SubagentView({ id, agents, done, columns, tightTop, hoveredItem, }) {
48
33
  if (agents.length === 0)
49
34
  return null;
50
- const anyError = agents.some((a) => a.status === "error");
51
- const dotColor = anyError ? ERROR_COLOR : AGENT_COLOR;
52
- return (_jsxs(Box, { marginTop: tightTop ? 0 : 1, flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: done ? _jsx(Text, { children: DIAMOND }) : _jsx(PulseDot, { glyph: DIAMOND }) }), agents.length === 1 ? (_jsx(SoloHeader, { agent: agents[0], columns: columns, color: dotColor })) : (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, color: dotColor, children: "Subagents" }), _jsx(Text, { dimColor: true, children: ` · ${agents.length} delegated` })] }))] }), agents.length === 1 ? (_jsx(SoloBody, { agent: agents[0], columns: columns, done: done })) : (_jsx(Topology, { agents: agents, columns: columns }))] }));
53
- }
54
- /** One worker's header: its identity and the task it was given. */
55
- function SoloHeader({ agent, columns, color }) {
56
- const taskLabel = clip(agent.task, Math.max(16, columns - 22));
57
- return (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, color: color, children: "Subagent" }), agent.readOnly ? _jsx(Text, { dimColor: true, children: " \u00B7 read-only" }) : null, taskLabel ? _jsxs(Text, { dimColor: true, children: [" ", taskLabel] }) : null] }));
58
- }
59
- /** One worker's live rail: every call it makes, then its closing line. */
60
- function SoloBody({ agent, columns, done }) {
61
- const content = Math.max(8, columns - RAIL_INDENT - 1);
62
- const errored = agent.status === "error";
63
- return (_jsxs(Box, { flexDirection: "column", children: [collapseAdjacent(agent.items).map((row) => (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { color: AGENT_COLOR, dimColor: true, children: ` ${RAIL} ` }), _jsx(Box, { width: content, children: _jsxs(Text, { color: row.anyError ? BAD : undefined, dimColor: !row.anyError, wrap: "truncate-end", children: [row.label, row.count > 1 ? ` ×${row.count}` : ""] }) })] }, row.item.toolId))), done && agent.summary ? (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { dimColor: true, children: ` ${BRANCH} ` }), _jsx(Box, { width: content, children: _jsx(Text, { color: errored ? BAD : undefined, dimColor: !errored, wrap: "truncate-end", children: agent.summary }) })] })) : null] }));
35
+ const solo = agents.length === 1;
36
+ return (_jsxs(Box, { marginTop: tightTop ? 0 : 1, flexDirection: "column", children: [solo ? null : (_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { minWidth: 2, children: done ? _jsx(Text, { children: DOT }) : _jsx(PulseDot, { glyph: DOT }) }), _jsx(Text, { bold: true, children: "Sub-agents" }), _jsx(Text, { dimColor: true, children: ` · ${agents.length} delegated` })] })), agents.map((agent, i) => (_jsx(AgentBlock, { id: id, index: i, agent: agent, lead: solo, done: done, columns: columns, hot: hoveredItem === i }, agent.agentId)))] }));
64
37
  }
65
- /** Several workers as a tree: one branch each, task on the branch, progress under it. */
66
- function Topology({ agents, columns }) {
67
- return (_jsx(Box, { flexDirection: "column", children: agents.map((agent, i) => {
68
- const last = i === agents.length - 1;
69
- const errored = agent.status === "error";
70
- // A worker still going is described by what it has DONE so far, since its
71
- // closing summary does not exist yet — otherwise a running branch says nothing
72
- // and reads as stalled.
73
- const steps = agent.items.length;
74
- const progress = agent.summary
75
- ? agent.summary
76
- : `working${steps > 0 ? ` · ${steps} step${steps === 1 ? "" : "s"}` : ""}`;
77
- const label = `#${i + 1}${agent.readOnly ? " · read-only" : ""}`;
78
- const taskWidth = Math.max(8, columns - 8 - label.length);
79
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { color: AGENT_COLOR, dimColor: true, children: ` ${last ? ELBOW : TEE} ` }), _jsx(Text, { bold: true, color: errored ? ERROR_COLOR : AGENT_COLOR, children: label }), _jsx(Box, { width: taskWidth, children: _jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [" ", clip(agent.task, taskWidth)] }) })] }), _jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { color: AGENT_COLOR, dimColor: true, children: ` ${last ? " " : RAIL} ${BRANCH} ` }), _jsx(Box, { width: Math.max(8, columns - 12), children: _jsx(Text, { color: errored ? BAD : undefined, dimColor: !errored, wrap: "truncate-end", children: progress }) })] })] }, agent.agentId));
80
- }) }));
38
+ function AgentBlock({ id, index, agent, lead, done, columns, hot, }) {
39
+ const running = agent.status === "running";
40
+ const tone = toneOf(agent);
41
+ const name = lead ? "Sub-agent" : `#${index + 1}`;
42
+ const tag = agent.readOnly ? " · read-only" : "";
43
+ // Everything on the title line has a fixed place, so a long title is cut at a word and never squeezes
44
+ // the name, as it once did ("Subagen").
45
+ const room = Math.max(10, columns - 2 - name.length - 2 - tag.length - 1);
46
+ const title = agentTitle(agent.task, room);
47
+ const steps = agent.steps ?? agent.items.length;
48
+ const took = agent.endedAt !== undefined && agent.startedAt !== undefined ? humanSpan(agent.endedAt - agent.startedAt) : "";
49
+ const arrow = agent.open ? " ▾" : " ▸";
50
+ const registered = (node) => registerExpandable(itemHit(id, index), node);
51
+ const band = agent.open ? bandRows(bodyRows(agent, running, bandWidth(columns)), columns) : [];
52
+ return (_jsxs(Box, { flexDirection: "column", ref: registered, children: [_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Box, { minWidth: 2, flexShrink: 0, children: lead ? running ? _jsx(PulseDot, { glyph: DOT }) : _jsx(Text, { children: DOT }) : _jsx(Text, { children: " " }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { bold: true, children: name }) }), title ? (_jsx(Box, { flexShrink: 0, children: _jsxs(Text, { bold: hot, children: [" ", title] }) })) : null, tag ? (_jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: tag }) })) : null] }), _jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { children: " " }), running ? (_jsxs(_Fragment, { children: [_jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: `step ${agent.items.length}${nowText(agent.items) ? ` · ${nowText(agent.items)}` : ""}`.slice(0, Math.max(12, columns - 16)) }) }), agent.startedAt !== undefined ? _jsx(Elapsed, { since: agent.startedAt }) : null] })) : (_jsxs(_Fragment, { children: [_jsx(Box, { flexShrink: 0, children: _jsx(Text, { color: colourOf(tone), bold: tone === "bad", children: `${markOf(tone)} ${agent.headline ?? agent.summary ?? "Finished"}` }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: ` · ${steps} step${steps === 1 ? "" : "s"}${took ? ` · ${took}` : ""}` }) })] })), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: !hot, bold: hot, children: arrow }) })] }), agent.open ? (_jsx(Box, { flexDirection: "column", width: columns, children: band.map((r, j) => (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: USER_BG, color: USER_FG, children: [" ", _jsx(Text, { dimColor: true, children: r.label.padEnd(8) }), _jsx(Text, { color: colourOf(r.tone), children: r.text }), " ".repeat(r.pad), " "] })] }, j))) })) : null] }));
81
53
  }
82
- /** Flatten and clip a task to one short line for a header. */
83
- function clip(s, max) {
84
- const flat = s.replace(/\s+/g, " ").trim();
85
- if (max <= 1)
86
- return "";
87
- return flat.length <= max ? flat : flat.slice(0, max - 1) + "…";
54
+ /** The width its task and the rest are wrapped to inside the band. */
55
+ function bandWidth(columns) {
56
+ return Math.max(8, columns - 14);
88
57
  }
89
58
  //# sourceMappingURL=SubagentView.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubagentView.js","sourceRoot":"","sources":["../../../src/cli/components/SubagentView.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,MAAM,GAAG,GAAG,CAAC;AACnB,MAAM,IAAI,GAAG,GAAG,CAAC;AACjB,MAAM,GAAG,GAAG,KAAK,CAAC;AAClB,MAAM,KAAK,GAAG,KAAK,CAAC;AACpB,mFAAmF;AACnF,iEAAiE;AACjE,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,oFAAoF;AACpF,MAAM,WAAW,GAAuB,SAAS,CAAC;AAElD,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,IAAI,EACJ,OAAO,EACP,QAAQ,GAMT;IACC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;IAEtD,OAAO,CACL,MAAC,GAAG,IAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAC,QAAQ,aACtD,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YAEb,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,cAAE,OAAO,GAAQ,CAAC,CAAC,CAAC,KAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,GAAI,GACzD,EACL,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACrB,KAAC,UAAU,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,GAAI,CACrE,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,QAAQ,0BAAkB,EAC5C,KAAC,IAAI,IAAC,QAAQ,kBAAE,MAAM,MAAM,CAAC,MAAM,YAAY,GAAQ,IACtD,CACJ,IACG,EAEL,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACrB,KAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,CAC9D,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAI,CAC/C,IACG,CACP,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,SAAS,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAqE;IAC9G,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,CACL,8BACE,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,yBAAiB,EACvC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,QAAQ,wCAAoB,CAAC,CAAC,CAAC,IAAI,EAC1D,SAAS,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,QAAQ,mBAAE,IAAI,EAAE,SAAS,IAAQ,CAAC,CAAC,CAAC,IAAI,IAC1D,CACJ,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,SAAS,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAyD;IAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;IACzC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAC1C,MAAC,GAAG,IAAuB,aAAa,EAAC,KAAK,EAAC,KAAK,EAAE,OAAO,aAC3D,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,kBAAE,IAAI,IAAI,GAAG,GAAQ,EACvD,KAAC,GAAG,IAAC,KAAK,EAAE,OAAO,YACjB,MAAC,IAAI,IAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAC,cAAc,aACtF,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAC7C,GACH,KANE,GAAG,CAAC,IAAI,CAAC,MAAM,CAOnB,CACP,CAAC,EACD,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CACvB,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,KAAK,EAAE,OAAO,aACrC,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,MAAM,GAAG,GAAQ,EACrC,KAAC,GAAG,IAAC,KAAK,EAAE,OAAO,YACjB,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,EAAC,cAAc,YAC5E,KAAK,CAAC,OAAO,GACT,GACH,IACF,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,SAAS,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAA6C;IAC9E,OAAO,CACL,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;YACzC,0EAA0E;YAC1E,+EAA+E;YAC/E,wBAAwB;YACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;YACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO;gBAC5B,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,CACL,MAAC,GAAG,IAAqB,aAAa,EAAC,QAAQ,aAC7C,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,KAAK,EAAE,OAAO,aACrC,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,kBAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAQ,EACtE,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,YAAG,KAAK,GAAQ,EACrE,KAAC,GAAG,IAAC,KAAK,EAAE,SAAS,YACnB,MAAC,IAAI,IAAC,QAAQ,QAAC,IAAI,EAAC,cAAc,aAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,IAAQ,GACzE,IACF,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,KAAK,EAAE,OAAO,aAGrC,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,kBAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,MAAM,GAAG,GAAQ,EAClF,KAAC,GAAG,IAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,EAAE,CAAC,YACnC,KAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,EAAC,cAAc,YAC5E,QAAQ,GACJ,GACH,IACF,KAjBE,KAAK,CAAC,OAAO,CAkBjB,CACP,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,SAAS,IAAI,CAAC,CAAS,EAAE,GAAW;IAClC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxB,OAAO,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"SubagentView.js","sourceRoot":"","sources":["../../../src/cli/components/SubagentView.tsx"],"names":[],"mappings":"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"}
@@ -25,8 +25,9 @@ import { PulseDot } from "./PulseDot.js";
25
25
  import { Elapsed, MORE_MARKER, OUTCOME, lastOutcome } from "./ToolLine.js";
26
26
  import { commandLabel } from "../commandLabel.js";
27
27
  import { registerExpandable, itemHit } from "../expandHits.js";
28
- import { BAD, GOOD } from "../theme.js";
29
- import { isRead, readRows, workHeader } from "../workLines.js";
28
+ import { BAD, GOOD, USER_BG, USER_FG } from "../theme.js";
29
+ import { visibleWidth, wrapAnsi } from "../wrap.js";
30
+ import { FOLD_SEP, foldControls, plainLine, isRead, isStep, readRows, stepLabel, stepReason, workHeader } from "../workLines.js";
30
31
  const DOT = "●";
31
32
  /** Marks beyond this many are counted instead, so the header never wraps. */
32
33
  export const MAX_MARKS = 10;
@@ -53,7 +54,12 @@ export function verdictLine(it) {
53
54
  /** What a command left to read once opened (pure): its command line, its output, no verdict. */
54
55
  export function openedLines(it) {
55
56
  const source = it.full ?? it.detail;
56
- const lines = source ? source.split("\n") : [];
57
+ // A test step opens on everything it said: what it did, and the whole list of the page.
58
+ if (isStep(it)) {
59
+ const lines = source ? source.split(String.fromCharCode(10)).map(plainLine).filter((l) => !MORE_MARKER.test(l)) : [];
60
+ return lines.length > 0 ? foldControls(lines).map((l) => (l.includes("\t") ? l : l.trim())) : [it.summary?.trim() || "(nothing more to show)"];
61
+ }
62
+ const lines = source ? source.split("\n").map(plainLine) : [];
57
63
  const verdict = it.detailKind === "shell" ? lastOutcome(lines) : -1;
58
64
  const body = lines
59
65
  .filter((_, i) => i !== verdict)
@@ -75,32 +81,64 @@ export function commandName(it, room) {
75
81
  function listRows(items, room) {
76
82
  return items.flatMap((it, index) => isRead(it)
77
83
  ? readRows(it).map((r, j) => ({ key: `${it.toolId}.${j}`, index, item: it, label: r.label, range: r.range }))
78
- : [{ key: it.toolId, index, item: it, label: commandName(it, room) }]);
84
+ : [{ key: it.toolId, index, item: it, label: isStep(it) ? stepLabel(it) : commandName(it, room) }]);
79
85
  }
80
86
  export function WorkGroup({ id, items, open, live, columns, tightTop, hovered, hoveredItem, }) {
81
87
  const head = commandHeader(items, live);
82
88
  const running = items.filter((it) => it.status === "running" && it.startedAt !== undefined);
83
89
  const since = running.length > 0 ? Math.min(...running.map((it) => it.startedAt)) : undefined;
84
- return (_jsxs(Box, { marginTop: tightTop ? 0 : 1, flexDirection: "column", children: [_jsxs(Box, { ref: (node) => registerExpandable(id, node), flexDirection: "row", width: columns, children: [_jsx(Box, { minWidth: 2, flexShrink: 0, children: head.working ? _jsx(PulseDot, { glyph: DOT }) : _jsx(Text, { children: DOT }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { bold: true, dimColor: !hovered, children: head.text }) }), head.marks.length > 0 ? (_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { children: " " }), head.more > 0 ? _jsx(Text, { dimColor: true, children: `+${head.more} ` }) : null, head.marks.map((m, i) => (_jsxs(Text, { color: m === "ok" ? GOOD : m === "error" ? BAD : undefined, dimColor: m === "running", children: [m === "ok" ? "✓" : m === "error" ? "✗" : "·", i < head.marks.length - 1 ? " " : ""] }, i)))] })) : null, head.working && since !== undefined ? (_jsx(Box, { flexShrink: 0, children: _jsx(Elapsed, { since: since }) })) : null, _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: !hovered, bold: hovered, children: open ? " ▾" : " ▸" }) })] }), open ? _jsx(WorkList, { id: id, items: items, columns: columns, live: live, hoveredItem: hoveredItem ?? -1 }) : null] }));
90
+ // A test that is working says which step it is on, so a long one does not look stuck behind a fold.
91
+ const onStep = head.working && !open ? items.filter((it) => isStep(it) && it.status === "running").pop() : undefined;
92
+ return (_jsxs(Box, { marginTop: tightTop ? 0 : 1, flexDirection: "column", children: [_jsxs(Box, { ref: (node) => registerExpandable(id, node), flexDirection: "row", width: columns, children: [_jsx(Box, { minWidth: 2, flexShrink: 0, children: head.working ? _jsx(PulseDot, { glyph: DOT }) : _jsx(Text, { children: DOT }) }), _jsx(Box, { flexShrink: 0, children: _jsx(Text, { bold: true, dimColor: !hovered, children: head.text }) }), head.marks.length > 0 ? (_jsxs(Box, { flexShrink: 0, children: [_jsx(Text, { children: " " }), head.more > 0 ? _jsx(Text, { dimColor: true, children: `+${head.more} ` }) : null, head.marks.map((m, i) => (_jsxs(Text, { color: m === "ok" ? GOOD : m === "error" ? BAD : undefined, dimColor: m === "running", children: [m === "ok" ? "✓" : m === "error" ? "✗" : "·", i < head.marks.length - 1 ? " " : ""] }, i)))] })) : null, onStep ? (_jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: true, children: " " + stepLabel(onStep).slice(0, Math.max(12, columns - head.text.length - 24)) }) })) : null, head.working && since !== undefined ? (_jsx(Box, { flexShrink: 0, children: _jsx(Elapsed, { since: since }) })) : null, _jsx(Box, { flexShrink: 0, children: _jsx(Text, { dimColor: !hovered, bold: hovered, children: open ? " ▾" : " ▸" }) })] }), open ? _jsx(WorkList, { id: id, items: items, columns: columns, live: live, hoveredItem: hoveredItem ?? -1 }) : null] }));
93
+ }
94
+ /**
95
+ * The opened text as rows of exact width (pure). A line is wrapped to fit; a `kind<SEP>names` line
96
+ * keeps its kind in a column of its own, and what wraps lines up under the names.
97
+ */
98
+ export function shadeRows(body, width) {
99
+ const inner = Math.max(6, width - 2);
100
+ const kindWidth = Math.min(14, Math.max(0, ...body.filter((l) => l.includes(FOLD_SEP)).map((l) => l.split(FOLD_SEP)[0].length)) + 2);
101
+ const rows = [];
102
+ for (const line of body) {
103
+ if (line.includes(FOLD_SEP)) {
104
+ const [kind, names] = line.split(FOLD_SEP);
105
+ wrapAnsi(names, Math.max(4, inner - kindWidth)).forEach((part, i) => {
106
+ const text = (i === 0 ? "" : " ".repeat(kindWidth)) + part;
107
+ rows.push({ ...(i === 0 ? { kind: kind.padEnd(kindWidth) } : {}), text: i === 0 ? part : text, pad: Math.max(0, inner - (i === 0 ? kindWidth : kindWidth) - visibleWidth(part)) });
108
+ });
109
+ }
110
+ else {
111
+ for (const part of wrapAnsi(line === "" ? " " : line, inner))
112
+ rows.push({ text: part, pad: Math.max(0, inner - visibleWidth(part)) });
113
+ }
114
+ }
115
+ return rows;
85
116
  }
86
117
  function WorkList({ id, items, columns, live, hoveredItem }) {
87
118
  // The verdict column sits at the right of what the longest name needs, so on a wide
88
119
  // terminal the verdicts stay beside their commands instead of drifting to the far edge.
89
120
  const room = Math.max(8, columns - 4 - VERDICT_WIDTH - 4);
121
+ // A row of ONE call opens straight onto what that call did: nothing is behind a second click.
122
+ const single = items.length === 1;
90
123
  const rows = listRows(items, room);
91
124
  const labelWidth = Math.min(room, Math.max(...rows.map((r) => r.label.length)) + 2);
92
125
  return (_jsx(Box, { flexDirection: "column", children: rows.map((row, i) => {
93
126
  const it = row.item;
94
127
  const last = i === rows.length - 1;
95
128
  const reading = isRead(it);
129
+ const step = isStep(it);
96
130
  const hot = !reading && hoveredItem === row.index;
97
131
  const running = it.status === "running";
98
- const verdict = reading ? undefined : verdictLine(it);
132
+ const verdict = reading || step ? undefined : verdictLine(it);
99
133
  const shown = reading
100
134
  ? row.range ?? ""
101
135
  : running
102
136
  ? ""
103
- : verdict ?? (it.status === "error" ? "✗" : it.summary ? it.summary : "✓");
137
+ : step
138
+ ? it.status === "error" ? "✗" : "✓"
139
+ : verdict ?? (it.status === "error" ? "✗" : it.summary ? it.summary : "✓");
140
+ // Why a step failed, under it, in red: the one thing a folded failure must still say.
141
+ const reason = step && it.status === "error" ? stepReason(it) : "";
104
142
  // Words that do not fit beside a long command go on a line of their own under it. Squeezed
105
143
  // into what is left of the line they broke across rows ("Running as shell" / "#1") and ran
106
144
  // into the end of the command.
@@ -110,12 +148,18 @@ function WorkList({ id, items, columns, live, hoveredItem }) {
110
148
  const outcomeOnly = !reading && (OUTCOME.test(shown) || shown === "");
111
149
  const beside = below ? "" : shown;
112
150
  const failedRead = reading && it.status === "error";
113
- const body = !reading && it.open ? openedLines(it) : [];
114
- const bodyWidth = Math.max(8, columns - 8);
151
+ const body = !reading && (it.open || single) ? openedLines(it) : [];
152
+ // The one being read stands out: bright, with its text on a shaded band under it. The ones
153
+ // that are folded stay dim, so it is plain which is open.
154
+ const isOpen = body.length > 0;
155
+ const bodyWidth = Math.max(8, columns - 4);
156
+ const shade = isOpen ? shadeRows(body, columns - 4) : [];
115
157
  const verdictBox = outcomeOnly || below ? VERDICT_WIDTH : Math.max(VERDICT_WIDTH, room2);
116
158
  // Only a command opens; a read has nothing behind its line to show.
117
- const registered = reading ? undefined : (node) => registerExpandable(itemHit(id, row.index), node);
118
- return (_jsxs(Box, { flexDirection: "column", ref: registered, children: [_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { dimColor: !hot, children: last ? " └ " : " ├ " }), _jsx(Box, { width: labelWidth, paddingRight: 2, flexShrink: 0, children: _jsx(Text, { bold: hot, dimColor: !hot, wrap: "truncate-end", children: row.label }) }), _jsx(Box, { width: verdictBox, flexShrink: 0, children: running ? (_jsxs(_Fragment, { children: [_jsx(PulseDot, { glyph: "\u25CF" }), live && it.startedAt !== undefined ? _jsx(Elapsed, { since: it.startedAt }) : null] })) : (_jsx(Text, { color: outcomeOnly ? verdictColor : failedRead ? BAD : undefined, dimColor: !outcomeOnly && !failedRead, wrap: outcomeOnly ? "truncate-end" : "wrap", children: beside })) }), reading ? null : _jsx(Text, { dimColor: !hot, bold: hot, children: it.open ? " ▾" : " ▸" })] }), below ? (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { dimColor: !hot, children: last && !body.length ? " " : " │ " }), _jsx(Box, { width: bodyWidth, children: _jsx(Text, { dimColor: true, wrap: "wrap", children: below }) })] })) : null, body.map((line, j) => (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { dimColor: !hot, children: last ? " " : " │ " }), _jsx(Text, { dimColor: !hot, children: "│ " }), _jsx(Box, { width: bodyWidth, children: _jsx(Text, { dimColor: true, wrap: "wrap", children: line === "" ? " " : line }) })] }, j)))] }, row.key));
159
+ const registered = reading || single ? undefined : (node) => registerExpandable(itemHit(id, row.index), node);
160
+ return (_jsxs(Box, { flexDirection: "column", ref: registered, children: [_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { children: " " }), _jsx(Box, { width: labelWidth, paddingRight: 2, flexShrink: 0, children: _jsx(Text, { bold: hot || isOpen, dimColor: !hot && !isOpen, wrap: "truncate-end", children: row.label }) }), _jsx(Box, { width: verdictBox, flexShrink: 0, children: running ? (_jsxs(_Fragment, { children: [_jsx(PulseDot, { glyph: "\u25CF" }), live && it.startedAt !== undefined ? _jsx(Elapsed, { since: it.startedAt }) : null] })) : (_jsx(Text, { color: outcomeOnly ? verdictColor : failedRead ? BAD : undefined, dimColor: !outcomeOnly && !failedRead, wrap: outcomeOnly ? "truncate-end" : "wrap", children: beside })) }), reading || single ? null : _jsx(Text, { dimColor: !hot && !isOpen, bold: hot || isOpen, children: it.open ? " ▾" : " ▸" })] }), below ? (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { children: " " }), _jsx(Box, { width: bodyWidth, children: _jsx(Text, { dimColor: true, wrap: "wrap", children: below }) })] })) : null, reason ? (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { children: " " }), _jsx(Box, { width: bodyWidth, children: _jsx(Text, { color: BAD, wrap: "wrap", children: reason }) })] })) : null, isOpen ? (
161
+ // What it printed sits on a shaded band, the way a message the user wrote does.
162
+ _jsx(Box, { flexDirection: "column", width: columns, children: shade.map((r, j) => (_jsxs(Box, { flexDirection: "row", width: columns, children: [_jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: USER_BG, color: USER_FG, children: [" ", r.kind !== undefined ? _jsx(Text, { dimColor: true, children: r.kind }) : null, r.text, " ".repeat(r.pad), " "] })] }, j))) })) : null] }, row.key));
119
163
  }) }));
120
164
  }
121
165
  //# sourceMappingURL=WorkGroup.js.map