@aiwayds/dsh-tui-pi 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +205 -68
  2. package/lib/agent-manager.d.ts +125 -0
  3. package/lib/agent-manager.js +298 -0
  4. package/lib/agent-manager.js.map +1 -0
  5. package/lib/agents.d.ts +30 -0
  6. package/lib/agents.js +468 -0
  7. package/lib/agents.js.map +1 -0
  8. package/lib/append-system.d.ts +2 -0
  9. package/lib/append-system.js +1 -1
  10. package/lib/append-system.js.map +1 -1
  11. package/lib/dsh-events.d.ts +12 -0
  12. package/lib/editor.d.ts +58 -0
  13. package/lib/editor.js +92 -0
  14. package/lib/editor.js.map +1 -1
  15. package/lib/footer.d.ts +8 -0
  16. package/lib/footer.js +8 -0
  17. package/lib/footer.js.map +1 -1
  18. package/lib/hotkeys.d.ts +93 -0
  19. package/lib/hotkeys.js +305 -0
  20. package/lib/hotkeys.js.map +1 -0
  21. package/lib/index.js +342 -38
  22. package/lib/index.js.map +1 -1
  23. package/lib/keymap.d.ts +177 -0
  24. package/lib/keymap.js +189 -0
  25. package/lib/keymap.js.map +1 -0
  26. package/lib/live-widgets.d.ts +82 -29
  27. package/lib/live-widgets.js +222 -92
  28. package/lib/live-widgets.js.map +1 -1
  29. package/lib/messages.d.ts +4 -2
  30. package/lib/messages.js +8 -3
  31. package/lib/messages.js.map +1 -1
  32. package/lib/panels.d.ts +177 -0
  33. package/lib/panels.js +331 -0
  34. package/lib/panels.js.map +1 -0
  35. package/lib/provider-catalog.d.ts +31 -8
  36. package/lib/provider-catalog.js +63 -8
  37. package/lib/provider-catalog.js.map +1 -1
  38. package/lib/selectors.d.ts +12 -1
  39. package/lib/selectors.js +5 -2
  40. package/lib/selectors.js.map +1 -1
  41. package/lib/session.d.ts +36 -0
  42. package/lib/session.js +171 -10
  43. package/lib/session.js.map +1 -1
  44. package/lib/settings.d.ts +1 -2
  45. package/lib/settings.js +29 -2
  46. package/lib/settings.js.map +1 -1
  47. package/lib/subagent-policy.d.ts +58 -0
  48. package/lib/subagent-policy.js +137 -0
  49. package/lib/subagent-policy.js.map +1 -0
  50. package/lib/subagent-viewer.d.ts +49 -0
  51. package/lib/subagent-viewer.js +523 -0
  52. package/lib/subagent-viewer.js.map +1 -0
  53. package/lib/theme/index.js +4 -0
  54. package/lib/theme/index.js.map +1 -1
  55. package/lib/theme/palette.d.ts +21 -3
  56. package/lib/theme/palette.js +27 -6
  57. package/lib/theme/palette.js.map +1 -1
  58. package/lib/theme-settings.d.ts +39 -4
  59. package/lib/theme-settings.js +69 -12
  60. package/lib/theme-settings.js.map +1 -1
  61. package/lib/tui.d.ts +32 -12
  62. package/lib/tui.js +109 -36
  63. package/lib/tui.js.map +1 -1
  64. package/package.json +3 -4
  65. package/patches/@earendil-works__pi-tui.patch +206 -2
  66. package/scripts/dev-install.mjs +87 -0
  67. package/scripts/link-dsh-closure.mjs +85 -0
@@ -1,15 +1,28 @@
1
1
  /**
2
- * Fixed widgets pinned ABOVE the chat input: the Todos panel and the Agents
3
- * panel, each a bordered box (top border + header row + body rows + bottom
4
- * border, same chrome as the thinking/tool panels). The dock slot they live
5
- * in has auto height — it renders zero rows while both panels are empty and
6
- * grows to their content while the model holds todos or has subagents running.
2
+ * Live widgets: the Todos boxed panel pinned ABOVE the chat input, and the
3
+ * running-subagent activity merged into the last-request area BELOW the
4
+ * editor. Two separate plain containers keep the two live surfaces apart:
7
5
  *
8
- * Show-when-content, clear-when-done: a panel appears only while it has
9
- * content and disappears when it empties — todos render until an empty
10
- * `todo/write` snapshot (or `/new`); the Agents board renders ONLY running
11
- * children (a settled child drops off, so once every subagent finishes the
12
- * whole panel vanishes).
6
+ * - `todosDoc` — the dock slot above the input (`ui.widgets`): a single
7
+ * bordered Todos panel (top border + header row + tree body rows + bottom
8
+ * border, same chrome as the thinking/tool panels). Auto height — it
9
+ * renders zero rows while empty and grows to its content while the model
10
+ * has todos.
11
+ * - `activityDoc` — the lastRequest container below the editor
12
+ * (`ui.lastRequest`): the ` ● <last request>` line (persisting across
13
+ * agent churn) followed by one compact line PER RUNNING agent. NO box
14
+ * chrome, NO `● Agents` header, NO provider — just
15
+ * `├─ ⠋ <name> · ↻N≤M · 21k/1m · 13.6s · <latest output>`, the `├─ ` /
16
+ * `└─ ` prefix in the same column as the todo rows and the request ` ● `
17
+ * (the last running agent closes the list with `└─ `). Auto height — it
18
+ * collapses to zero rows when both the last-request line is cleared and no
19
+ * agent runs.
20
+ *
21
+ * Show-when-content, clear-when-done: the Todos panel appears only while it
22
+ * has content and disappears when it empties (an all-completed snapshot or
23
+ * `/new`); an agent line renders only while its child RUNS (a settled child
24
+ * drops off immediately). `clear()` (/new) drops the Todos panel and the
25
+ * agent lines but preserves the last-request echo.
13
26
  *
14
27
  * Live refresh: `tickLive` (the AGENT_TICK_MS timer in index.ts) advances the
15
28
  * spinner and re-reads the elapsed clock; it is a no-op while nothing runs.
@@ -19,23 +32,49 @@
19
32
  import { Container } from '@earendil-works/pi-tui';
20
33
  import type { AgentView } from './dsh-events.ts';
21
34
  import { type TuiTheme } from './theme/index.ts';
22
- /** Refresh interval of the live Agents board (spinner + elapsed). */
35
+ /** Refresh interval of the live running-agent lines (spinner + elapsed). */
23
36
  export declare const AGENT_TICK_MS = 100;
24
37
  /** Braille spinner cycle; the frame index advances once per tick. */
25
38
  export declare const AGENT_SPINNER_FRAMES: readonly ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
39
+ /**
40
+ * Compact human-readable size: 1_500_000 → `1.5m`, 20_965 → `20k`, 999 → `999`.
41
+ * Millions keep one decimal (a trailing `.0` dropped), thousands floor to `k`.
42
+ */
43
+ export declare function fmtCompact(n: number): string;
26
44
  export declare class LiveWidgets {
27
- private readonly doc;
45
+ private readonly todosDoc;
46
+ private readonly activityDoc;
28
47
  private theme;
29
48
  private readonly requestRender;
30
49
  /** Latest todo list from `todo/write`, rendered while non-empty. */
31
50
  private liveTodos;
32
51
  /** Latest subagent views from the bridge's onLive fold. */
33
52
  private liveAgents;
34
- /** The single widget Text (both bordered panels), replaced on rebuild. */
35
- private liveText;
53
+ /** The Todos panel Text in `todosDoc`, replaced on rebuild. */
54
+ private todosText;
55
+ /** The merged running-agent Text in `activityDoc`, replaced on rebuild. */
56
+ private agentsText;
57
+ /** The ` ● <last request>` Text in `activityDoc` (persists across churn). */
58
+ private requestText;
59
+ /** Plain clipped last-request text backing `requestText` (for setTheme). */
60
+ private requestDisplay;
36
61
  /** Spinner frame counter, advanced by tickLive while any agent runs. */
37
62
  private spinnerFrame;
38
- constructor(doc: Container, theme: TuiTheme, requestRender: () => void);
63
+ /**
64
+ * @param todosDoc The dock slot ABOVE the chat input — the Todos boxed
65
+ * panel lives here.
66
+ * @param activityDoc The lastRequest container BELOW the editor — the ` ● `
67
+ * last-request line plus the compact running-agent lines live here.
68
+ */
69
+ constructor(todosDoc: Container, activityDoc: Container, theme: TuiTheme, requestRender: () => void);
70
+ /**
71
+ * Render the ` ● <text>` last-request line in `activityDoc`, UNDER which the
72
+ * running-agent lines appear. `undefined` (or blank) removes the line. Same
73
+ * styling as before the merge: `fgMuted` prefix, but the text is clipped to
74
+ * the terminal width (`columns - 5`) so it ALWAYS renders on one row and
75
+ * never wraps; outside a TTY (columns undefined) it falls back to 195.
76
+ */
77
+ setLastRequest(text: string | undefined): void;
39
78
  /** Replace the todos snapshot (`todo/write` events and replay). */
40
79
  renderTodos(todos: readonly {
41
80
  content: string;
@@ -46,21 +85,28 @@ export declare class LiveWidgets {
46
85
  /**
47
86
  * Live refresh ~10x/sec while any subagent runs: advance the spinner and
48
87
  * repaint (the elapsed column re-reads Date.now()). No-op when nothing runs
49
- * — the panel then holds its final (empty) state.
88
+ * — the activity area then holds its final (empty) state.
50
89
  */
51
90
  tickLive(): void;
52
- /** Recolor the widget under a theme hot-switch (no-op on the same bundle). */
91
+ /** Recolor the widget (Todos panel, ● line and agent lines) under a theme
92
+ * hot-switch (no-op on the same bundle). */
53
93
  setTheme(theme: TuiTheme): void;
54
- /** Drop everything (`/new`); the bridge also fires `renderAgents([])`. */
94
+ /**
95
+ * Drop everything except the last-request echo (`/new`): clears the Todos
96
+ * panel and the running-agent lines, keeps the ` ● ` line. The bridge also
97
+ * fires `renderAgents([])`.
98
+ */
55
99
  clear(): void;
56
100
  /**
57
- * Rebuild the single widget Text: one bordered panel per present section
58
- * (Todos tree, running-agents board), stacked with no separator. When
59
- * nothing is left to show the Text is removed and the dock slot collapses.
101
+ * Rebuild the two live surfaces:
102
+ * - `todosDoc`: one bordered Todos panel (or nothing when all completed).
103
+ * - `activityDoc`: the ` ● ` line (managed separately, persists) followed
104
+ * by ONE Text holding the compact running-agent lines joined by '\n'
105
+ * (or nothing when no agent runs — the slot collapses to the ● line).
60
106
  * Clear-when-done: the Todos panel hides once every todo is completed (the
61
107
  * model writes the whole-list snapshot and rarely clears it — an
62
- * all-completed list is the signal the work is over); the Agents panel
63
- * hides once no child is running.
108
+ * all-completed list is the end-of-work signal); the agent lines hide once
109
+ * no child is running.
64
110
  */
65
111
  private rebuild;
66
112
  /** One bordered panel: top border + header row + body rows + bottom border. */
@@ -75,11 +121,18 @@ export declare class LiveWidgets {
75
121
  */
76
122
  private todoLines;
77
123
  /**
78
- * Agent board body lines: one main line per RUNNING view (connector +
79
- * spinner + provider + label + meta) with an activity line beneath. The
80
- * label is the only unbounded field — its budget is computed against the
81
- * actual chrome width so no row ever exceeds the boxed inner budget; every
82
- * line is clipped BEFORE styling (see clipPanelLine's contract).
124
+ * One compact running-agent line for the last-request area, todo-style:
125
+ * `├─ `/`└─ ` connector (same column as the todo rows and the request
126
+ * ` ● `) + spinner + the agent NAME (`view.label`, matching the boxed
127
+ * panel's main line) + the exact meta that main line showed (`↻retries≤max`,
128
+ * compact `tokens[/contextWindow]`, elapsed) + the child's latest output
129
+ * line when one exists (` · <tail>`, so the user sees it is alive). NO box
130
+ * chrome, NO provider — the name is the prominent element; the last running
131
+ * agent closes the list with `└─ `. The label is the only unbounded field;
132
+ * it is clipped against a budget measured from the terminal width so the
133
+ * whole plain line (prefix included) fits, then the assembled plain line is
134
+ * clipped to the terminal width BEFORE any ANSI is applied (clipToWidth
135
+ * counts SGR fragments as visible columns — style last).
83
136
  */
84
- private agentLines;
137
+ private compactAgentLine;
85
138
  }
@@ -1,15 +1,28 @@
1
1
  /**
2
- * Fixed widgets pinned ABOVE the chat input: the Todos panel and the Agents
3
- * panel, each a bordered box (top border + header row + body rows + bottom
4
- * border, same chrome as the thinking/tool panels). The dock slot they live
5
- * in has auto height — it renders zero rows while both panels are empty and
6
- * grows to their content while the model holds todos or has subagents running.
2
+ * Live widgets: the Todos boxed panel pinned ABOVE the chat input, and the
3
+ * running-subagent activity merged into the last-request area BELOW the
4
+ * editor. Two separate plain containers keep the two live surfaces apart:
7
5
  *
8
- * Show-when-content, clear-when-done: a panel appears only while it has
9
- * content and disappears when it empties — todos render until an empty
10
- * `todo/write` snapshot (or `/new`); the Agents board renders ONLY running
11
- * children (a settled child drops off, so once every subagent finishes the
12
- * whole panel vanishes).
6
+ * - `todosDoc` — the dock slot above the input (`ui.widgets`): a single
7
+ * bordered Todos panel (top border + header row + tree body rows + bottom
8
+ * border, same chrome as the thinking/tool panels). Auto height — it
9
+ * renders zero rows while empty and grows to its content while the model
10
+ * has todos.
11
+ * - `activityDoc` — the lastRequest container below the editor
12
+ * (`ui.lastRequest`): the ` ● <last request>` line (persisting across
13
+ * agent churn) followed by one compact line PER RUNNING agent. NO box
14
+ * chrome, NO `● Agents` header, NO provider — just
15
+ * `├─ ⠋ <name> · ↻N≤M · 21k/1m · 13.6s · <latest output>`, the `├─ ` /
16
+ * `└─ ` prefix in the same column as the todo rows and the request ` ● `
17
+ * (the last running agent closes the list with `└─ `). Auto height — it
18
+ * collapses to zero rows when both the last-request line is cleared and no
19
+ * agent runs.
20
+ *
21
+ * Show-when-content, clear-when-done: the Todos panel appears only while it
22
+ * has content and disappears when it empties (an all-completed snapshot or
23
+ * `/new`); an agent line renders only while its child RUNS (a settled child
24
+ * drops off immediately). `clear()` (/new) drops the Todos panel and the
25
+ * agent lines but preserves the last-request echo.
13
26
  *
14
27
  * Live refresh: `tickLive` (the AGENT_TICK_MS timer in index.ts) advances the
15
28
  * spinner and re-reads the elapsed clock; it is a no-op while nothing runs.
@@ -20,11 +33,24 @@ import { Container, Text } from '@earendil-works/pi-tui';
20
33
  import { panelBodyText, panelBoxWidth, clipPanelLine } from "./messages.js";
21
34
  import { ansiFg, RESET } from "./theme/index.js";
22
35
  import { clipToWidth, visibleWidth } from "./text.js";
23
- /** Refresh interval of the live Agents board (spinner + elapsed). */
36
+ /** Refresh interval of the live running-agent lines (spinner + elapsed). */
24
37
  export const AGENT_TICK_MS = 100;
25
38
  /** Braille spinner cycle; the frame index advances once per tick. */
26
39
  export const AGENT_SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
27
- /** One bordered row of a widget panel: `│ ` + inner + ` │` (no trailing RESET). */
40
+ /**
41
+ * Compact human-readable size: 1_500_000 → `1.5m`, 20_965 → `20k`, 999 → `999`.
42
+ * Millions keep one decimal (a trailing `.0` dropped), thousands floor to `k`.
43
+ */
44
+ export function fmtCompact(n) {
45
+ if (n >= 1_000_000) {
46
+ const m = n / 1_000_000;
47
+ return `${Number.isInteger(m) ? String(m) : m.toFixed(1).replace(/\.0$/, '')}m`;
48
+ }
49
+ if (n >= 1_000)
50
+ return `${Math.floor(n / 1_000)}k`;
51
+ return String(n);
52
+ }
53
+ /** One bordered row of the Todos panel: `│ ` + inner + ` │` (no trailing RESET). */
28
54
  function borderedRow(boxWidth, borderFg, inner) {
29
55
  const pad = Math.max(0, boxWidth - 4 - visibleWidth(inner));
30
56
  return `${borderFg}│ ${inner}${' '.repeat(pad)}${borderFg} │`;
@@ -34,22 +60,73 @@ function panelTopBorder(boxWidth, borderFg) {
34
60
  return `${borderFg}┌${'─'.repeat(Math.max(0, boxWidth - 2))}┐`;
35
61
  }
36
62
  export class LiveWidgets {
37
- doc;
63
+ todosDoc;
64
+ activityDoc;
38
65
  theme;
39
66
  requestRender;
40
67
  /** Latest todo list from `todo/write`, rendered while non-empty. */
41
68
  liveTodos = [];
42
69
  /** Latest subagent views from the bridge's onLive fold. */
43
70
  liveAgents = [];
44
- /** The single widget Text (both bordered panels), replaced on rebuild. */
45
- liveText;
71
+ /** The Todos panel Text in `todosDoc`, replaced on rebuild. */
72
+ todosText;
73
+ /** The merged running-agent Text in `activityDoc`, replaced on rebuild. */
74
+ agentsText;
75
+ /** The ` ● <last request>` Text in `activityDoc` (persists across churn). */
76
+ requestText;
77
+ /** Plain clipped last-request text backing `requestText` (for setTheme). */
78
+ requestDisplay;
46
79
  /** Spinner frame counter, advanced by tickLive while any agent runs. */
47
80
  spinnerFrame = 0;
48
- constructor(doc, theme, requestRender) {
49
- this.doc = doc;
81
+ /**
82
+ * @param todosDoc The dock slot ABOVE the chat input — the Todos boxed
83
+ * panel lives here.
84
+ * @param activityDoc The lastRequest container BELOW the editor — the ` ● `
85
+ * last-request line plus the compact running-agent lines live here.
86
+ */
87
+ constructor(todosDoc, activityDoc, theme, requestRender) {
88
+ this.todosDoc = todosDoc;
89
+ this.activityDoc = activityDoc;
50
90
  this.theme = theme;
51
91
  this.requestRender = requestRender;
52
92
  }
93
+ /**
94
+ * Render the ` ● <text>` last-request line in `activityDoc`, UNDER which the
95
+ * running-agent lines appear. `undefined` (or blank) removes the line. Same
96
+ * styling as before the merge: `fgMuted` prefix, but the text is clipped to
97
+ * the terminal width (`columns - 5`) so it ALWAYS renders on one row and
98
+ * never wraps; outside a TTY (columns undefined) it falls back to 195.
99
+ */
100
+ setLastRequest(text) {
101
+ if (text === undefined || text.trim() === '') {
102
+ if (this.requestText !== undefined) {
103
+ this.activityDoc.removeChild(this.requestText);
104
+ this.requestText = undefined;
105
+ this.requestDisplay = undefined;
106
+ this.requestRender();
107
+ }
108
+ return;
109
+ }
110
+ // One-row budget: paddingX=1 on each side (2 cols) + the ` ● ` prefix (3
111
+ // cols) → the plain `display` must fit `columns - 5`. Non-TTY fallback
112
+ // keeps the old 200-col behavior.
113
+ const budget = Math.max(1, (process.stdout.columns ?? 200) - 5);
114
+ const display = clipToWidth(text, budget);
115
+ if (this.requestText === undefined) {
116
+ this.requestText = new Text('', 1, 0);
117
+ // Keep the ● line ABOVE the running-agent lines regardless of whether
118
+ // they already render (no insert-at on a plain Container — remove and
119
+ // re-add both in the right order).
120
+ if (this.agentsText !== undefined)
121
+ this.activityDoc.removeChild(this.agentsText);
122
+ this.activityDoc.addChild(this.requestText);
123
+ if (this.agentsText !== undefined)
124
+ this.activityDoc.addChild(this.agentsText);
125
+ }
126
+ this.requestDisplay = display;
127
+ this.requestText.setText(ansiFg(this.theme.palette.fgMuted) + ` ● ${display}` + RESET);
128
+ this.requestRender();
129
+ }
53
130
  /** Replace the todos snapshot (`todo/write` events and replay). */
54
131
  renderTodos(todos) {
55
132
  this.liveTodos = todos;
@@ -63,7 +140,7 @@ export class LiveWidgets {
63
140
  /**
64
141
  * Live refresh ~10x/sec while any subagent runs: advance the spinner and
65
142
  * repaint (the elapsed column re-reads Date.now()). No-op when nothing runs
66
- * — the panel then holds its final (empty) state.
143
+ * — the activity area then holds its final (empty) state.
67
144
  */
68
145
  tickLive() {
69
146
  if (!this.liveAgents.some(view => view.outcome === undefined))
@@ -71,53 +148,78 @@ export class LiveWidgets {
71
148
  this.spinnerFrame += 1;
72
149
  this.rebuild();
73
150
  }
74
- /** Recolor the widget under a theme hot-switch (no-op on the same bundle). */
151
+ /** Recolor the widget (Todos panel, ● line and agent lines) under a theme
152
+ * hot-switch (no-op on the same bundle). */
75
153
  setTheme(theme) {
76
154
  if (theme === this.theme)
77
155
  return;
78
156
  this.theme = theme;
79
157
  this.rebuild();
158
+ // The request line is not part of rebuild() (it persists independent of the
159
+ // agent lines); recolor it here from the cached plain text.
160
+ if (this.requestDisplay !== undefined && this.requestText !== undefined) {
161
+ this.requestText.setText(ansiFg(this.theme.palette.fgMuted) + ` ● ${this.requestDisplay}` + RESET);
162
+ }
80
163
  }
81
- /** Drop everything (`/new`); the bridge also fires `renderAgents([])`. */
164
+ /**
165
+ * Drop everything except the last-request echo (`/new`): clears the Todos
166
+ * panel and the running-agent lines, keeps the ` ● ` line. The bridge also
167
+ * fires `renderAgents([])`.
168
+ */
82
169
  clear() {
83
170
  this.liveTodos = [];
84
171
  this.liveAgents = [];
85
172
  this.spinnerFrame = 0;
86
- if (this.liveText !== undefined) {
87
- this.doc.removeChild(this.liveText);
88
- this.liveText = undefined;
89
- this.requestRender();
173
+ if (this.todosText !== undefined) {
174
+ this.todosDoc.removeChild(this.todosText);
175
+ this.todosText = undefined;
90
176
  }
177
+ if (this.agentsText !== undefined) {
178
+ this.activityDoc.removeChild(this.agentsText);
179
+ this.agentsText = undefined;
180
+ }
181
+ this.requestRender();
91
182
  }
92
183
  /**
93
- * Rebuild the single widget Text: one bordered panel per present section
94
- * (Todos tree, running-agents board), stacked with no separator. When
95
- * nothing is left to show the Text is removed and the dock slot collapses.
184
+ * Rebuild the two live surfaces:
185
+ * - `todosDoc`: one bordered Todos panel (or nothing when all completed).
186
+ * - `activityDoc`: the ` ● ` line (managed separately, persists) followed
187
+ * by ONE Text holding the compact running-agent lines joined by '\n'
188
+ * (or nothing when no agent runs — the slot collapses to the ● line).
96
189
  * Clear-when-done: the Todos panel hides once every todo is completed (the
97
190
  * model writes the whole-list snapshot and rarely clears it — an
98
- * all-completed list is the signal the work is over); the Agents panel
99
- * hides once no child is running.
191
+ * all-completed list is the end-of-work signal); the agent lines hide once
192
+ * no child is running.
100
193
  */
101
194
  rebuild() {
102
- const panels = [];
103
195
  if (this.liveTodos.some(todo => todo.status !== 'completed')) {
104
- panels.push(this.boxedPanel(this.todosHeader(), this.todoLines()));
196
+ const panel = this.boxedPanel(this.todosHeader(), this.todoLines());
197
+ if (this.todosText !== undefined)
198
+ this.todosDoc.removeChild(this.todosText);
199
+ this.todosText = new Text(panel, 1, 0);
200
+ this.todosDoc.addChild(this.todosText);
201
+ }
202
+ else if (this.todosText !== undefined) {
203
+ this.todosDoc.removeChild(this.todosText);
204
+ this.todosText = undefined;
105
205
  }
106
206
  const running = this.liveAgents.filter(view => view.outcome === undefined);
107
- if (running.length > 0)
108
- panels.push(this.boxedPanel('● Agents', this.agentLines(running)));
109
- if (panels.length === 0) {
110
- if (this.liveText !== undefined) {
111
- this.doc.removeChild(this.liveText);
112
- this.liveText = undefined;
207
+ if (running.length > 0) {
208
+ const lines = running.map((view, i) => this.compactAgentLine(view, i === running.length - 1));
209
+ const text = lines.join('\n');
210
+ if (this.agentsText !== undefined) {
211
+ this.agentsText.setText(text);
113
212
  }
114
- this.requestRender();
115
- return;
213
+ else {
214
+ this.agentsText = new Text(text, 1, 0);
215
+ // Append under the ● line when it is present (plain Container appends).
216
+ this.activityDoc.addChild(this.agentsText);
217
+ }
218
+ }
219
+ else if (this.agentsText !== undefined) {
220
+ this.activityDoc.removeChild(this.agentsText);
221
+ this.agentsText = undefined;
116
222
  }
117
- if (this.liveText !== undefined)
118
- this.doc.removeChild(this.liveText);
119
- this.liveText = new Text(panels.join('\n'), 1, 0);
120
- this.doc.addChild(this.liveText);
121
223
  this.requestRender();
122
224
  }
123
225
  /** One bordered panel: top border + header row + body rows + bottom border. */
@@ -161,58 +263,86 @@ export class LiveWidgets {
161
263
  return lines;
162
264
  }
163
265
  /**
164
- * Agent board body lines: one main line per RUNNING view (connector +
165
- * spinner + provider + label + meta) with an activity line beneath. The
166
- * label is the only unbounded field — its budget is computed against the
167
- * actual chrome width so no row ever exceeds the boxed inner budget; every
168
- * line is clipped BEFORE styling (see clipPanelLine's contract).
266
+ * One compact running-agent line for the last-request area, todo-style:
267
+ * `├─ `/`└─ ` connector (same column as the todo rows and the request
268
+ * ` ● `) + spinner + the agent NAME (`view.label`, matching the boxed
269
+ * panel's main line) + the exact meta that main line showed (`↻retries≤max`,
270
+ * compact `tokens[/contextWindow]`, elapsed) + the child's latest output
271
+ * line when one exists (` · <tail>`, so the user sees it is alive). NO box
272
+ * chrome, NO provider — the name is the prominent element; the last running
273
+ * agent closes the list with `└─ `. The label is the only unbounded field;
274
+ * it is clipped against a budget measured from the terminal width so the
275
+ * whole plain line (prefix included) fits, then the assembled plain line is
276
+ * clipped to the terminal width BEFORE any ANSI is applied (clipToWidth
277
+ * counts SGR fragments as visible columns — style last).
169
278
  */
170
- agentLines(views) {
171
- const innerCap = panelBoxWidth(process.stdout.columns) - 4;
172
- const lines = [];
173
- const total = views.length;
174
- for (let i = 0; i < total; i++) {
175
- const view = views[i];
176
- const last = i === total - 1;
177
- const connector = ansiFg(this.theme.palette.fgSubtle) + (last ? '└─ ' : '├─ ') + RESET;
178
- const glyph = AGENT_SPINNER_FRAMES[this.spinnerFrame % AGENT_SPINNER_FRAMES.length];
179
- const icon = ansiFg(this.theme.palette.fgMuted) + glyph + RESET;
180
- const metaParts = [];
181
- if (view.retries >= 1) {
182
- metaParts.push(view.maxRetries === undefined ? `↻${view.retries}` : `↻${view.retries}≤${view.maxRetries}`);
183
- }
184
- if (view.tokens > 0) {
185
- const pct = typeof view.contextWindow === 'number' && view.contextWindow > 0
186
- ? ` (${Math.round(view.tokens / view.contextWindow * 100)}%)`
187
- : '';
188
- metaParts.push(`${view.tokens} token${pct}`);
279
+ compactAgentLine(view, isLast) {
280
+ // Todo-style tree connector: `├─ ` for non-final rows, `└─ ` for the last
281
+ // running agent — aligned with the todo rows and the request ` ● `.
282
+ const PREFIX = isLast ? '└─ ' : '├─ ';
283
+ const width = Math.max(1, process.stdout.columns ?? 80);
284
+ const glyph = AGENT_SPINNER_FRAMES[this.spinnerFrame % AGENT_SPINNER_FRAMES.length];
285
+ const metaParts = [];
286
+ if (view.retries >= 1) {
287
+ metaParts.push(view.maxRetries === undefined ? `↻${view.retries}` : `↻${view.retries}≤${view.maxRetries}`);
288
+ }
289
+ if (view.tokens > 0) {
290
+ // Compact tokens[/contextWindow]: `21k/1m` — no percent, no "token".
291
+ const ctx = typeof view.contextWindow === 'number' && view.contextWindow > 0
292
+ ? `/${fmtCompact(view.contextWindow)}`
293
+ : '';
294
+ metaParts.push(`${fmtCompact(view.tokens)}${ctx}`);
295
+ }
296
+ const elapsed = (Date.now() - view.startedAt) / 1000;
297
+ metaParts.push(`${elapsed.toFixed(1)}s`);
298
+ let metaPlain = ' · ' + metaParts.join(' · ');
299
+ // Tail: the child's latest visible output line, appended after the elapsed
300
+ // column so the user knows it is alive. Budget ≤30% of the terminal width
301
+ // (clamped 20..60 cols); when the folded line is wider, clip to
302
+ // tailBudget-2 and end with `..` (clipToWidth's own `…` is stripped).
303
+ const lastLine = view.lastLine;
304
+ if (lastLine !== undefined && lastLine !== '') {
305
+ const folded = lastLine.replace(/\s+/g, ' ').trim();
306
+ if (folded !== '') {
307
+ const tailBudget = Math.min(60, Math.max(20, Math.floor(width * 0.3)));
308
+ if (visibleWidth(folded) > tailBudget) {
309
+ const clipped = clipToWidth(folded, tailBudget - 2).replace(/…$/, '');
310
+ metaPlain += ` · ${clipped}..`;
311
+ }
312
+ else {
313
+ metaPlain += ` · ${folded}`;
314
+ }
189
315
  }
190
- const elapsed = (Date.now() - view.startedAt) / 1000;
191
- metaParts.push(`${elapsed.toFixed(1)}s`);
192
- // Plain (unstyled) meta for the label budget; styled only once assembled.
193
- const metaPlain = ' · ' + metaParts.join(' · ');
194
- const providerPlain = view.provider ?? '';
195
- // 3 = connector, 2 = icon + space, 2 = safety column so the styled line
196
- // never wraps inside the box. Provider and label share the remaining
197
- // name budget; both are clipped (provider is a config value and can be
198
- // arbitrarily long, label is model-controlled).
199
- const nameBudget = innerCap - 3 - 2 - visibleWidth(metaPlain) - 2;
200
- const providerClipped = clipToWidth(providerPlain, Math.max(0, nameBudget - 12));
201
- const labelBudget = Math.max(10, nameBudget - visibleWidth(providerClipped) - 2);
202
- const label = clipPanelLine(view.label, 0);
203
- const labelClipped = clipToWidth(label, labelBudget);
204
- const nameStyled = providerClipped === ''
205
- ? ansiFg(this.theme.palette.fgMuted) + labelClipped + RESET
206
- : ansiFg(this.theme.palette.fgDefault) + providerClipped + RESET + ' '
207
- + ansiFg(this.theme.palette.fgMuted) + labelClipped + RESET;
208
- const metaStyled = ansiFg(this.theme.palette.fgSubtle) + metaPlain + RESET;
209
- lines.push(connector + icon + ' ' + nameStyled + metaStyled);
210
- const indent = last ? ' ' : '│ ';
211
- const activity = view.lastTool === undefined ? 'working…' : `running ${view.lastTool}…`;
212
- lines.push(indent + '⎿ ' + ansiFg(this.theme.palette.fgSubtle)
213
- + clipToWidth(activity, Math.max(1, innerCap - 8)) + RESET);
214
316
  }
215
- return lines;
317
+ // Defensive: never render an empty name — fall back to `subagent`.
318
+ const rawLabel = clipPanelLine(view.label, 0).replace(/\r/g, '').trim();
319
+ const namePlain = rawLabel === ''
320
+ ? 'subagent'
321
+ : rawLabel;
322
+ // Fixed chrome: prefix (3) + spinner (1) + following space (1) + a safety
323
+ // column. The label takes the remainder of the width budget after meta.
324
+ const fixed = visibleWidth(PREFIX) + 1 + 1 + 1;
325
+ const nameBudget = width - fixed - visibleWidth(metaPlain);
326
+ const nameClipped = clipToWidth(namePlain, Math.max(0, nameBudget));
327
+ // The full PLAIN line, clipped to the terminal width BEFORE styling.
328
+ const plain = PREFIX + glyph + ' ' + nameClipped + metaPlain;
329
+ const clipped = clipToWidth(plain, width);
330
+ // Style segments from the (clipped, guaranteed-identical-when-it-fits)
331
+ // plain pieces: connector subtle, spinner muted, NAME default (prominent),
332
+ // meta (incl. the tail) subtle.
333
+ const connector = ansiFg(this.theme.palette.fgSubtle) + PREFIX + RESET;
334
+ const spinner = ansiFg(this.theme.palette.fgMuted) + glyph + RESET;
335
+ const metaStyled = ansiFg(this.theme.palette.fgSubtle) + metaPlain + RESET;
336
+ const nameStyled = ansiFg(this.theme.palette.fgDefault) + nameClipped + RESET;
337
+ const base = connector + spinner + ' ' + nameStyled + metaStyled;
338
+ // If clipping truncated the plain line (pathological meta), re-clip the
339
+ // assembled styled line's visible width too; otherwise base is exact.
340
+ if (visibleWidth(clipped) < visibleWidth(plain)) {
341
+ // Defensive: fall back to a single muted style over the clipped line so
342
+ // no styled segment can push past the terminal width.
343
+ return ansiFg(this.theme.palette.fgMuted) + clipped + RESET;
344
+ }
345
+ return base;
216
346
  }
217
347
  }
218
348
  //# sourceMappingURL=live-widgets.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"live-widgets.js","sourceRoot":"","sources":["../src/live-widgets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-widgets.js","sourceRoot":"","sources":["../src/live-widgets.ts"],"names":[],"mappings":"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"}
package/lib/messages.d.ts CHANGED
@@ -218,8 +218,10 @@ export declare class TranscriptRenderer {
218
218
  * built at the current terminal width: below 96 columns it degrades to
219
219
  * the whale alone, and every rebuild (relayout/setTheme replay) reads the
220
220
  * width afresh, so narrowing drops the wordmark and widening restores it.
221
- * The quote line is clipped to the terminal width before styling (the
222
- * repo rule — ANSI never goes through the clipper), so it never wraps.
221
+ * The quote line — whale-prefixed (`🐳 「…」`, the same 🐳 icon that
222
+ * speaks inline for the assistant in chat) — is clipped to the terminal
223
+ * width before styling (the repo rule — ANSI never goes through the
224
+ * clipper), so it never wraps.
223
225
  */
224
226
  private renderWelcome;
225
227
  private renderUserMessage;