@pentoshi/clai 3.8.0 → 3.8.2

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.
@@ -1,11 +1,14 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
2
  /** @jsxImportSource @opentui/react */
3
3
  /**
4
- * Chrome under the composer.
4
+ * Chrome under the composer — responsive density so chips never pile over
5
+ * the token count / scroll badges on the right.
5
6
  *
6
- * Idle: centered clickable chips (`/:commands`, ^T/^O/^U/^D/^X, ^H) with hover.
7
- * Running: spinner + activity · Esc:cancel.
8
- * Scroll remainder badges (`▲ N` / `▼ N`) sit on the far right.
7
+ * Density (by content width):
8
+ * - xs (<48): MODE · tokens · ▲▼
9
+ * - sm (<68): MODE · ^H · tokens · ▲▼ (+ spinner/activity when running)
10
+ * - md (<96): MODE · core keys · ^H · tokens · ▲▼
11
+ * - lg (≥96): full shortcut row
9
12
  */
10
13
  import { useEffect, useState } from "react";
11
14
  import { TextAttributes } from "@opentui/core";
@@ -13,13 +16,34 @@ import { formatContextChip, } from "../../../llm/token-usage.js";
13
16
  import { useSessionState } from "../../state/use-session-state.js";
14
17
  import { EMPTY_SCROLL_METRICS, transcriptScrollPort, } from "../transcript/transcript-scroll-port.js";
15
18
  const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
19
+ /** Map content width → chrome density. */
20
+ export function statusDensityForWidth(width) {
21
+ if (width < 48)
22
+ return "xs";
23
+ if (width < 68)
24
+ return "sm";
25
+ if (width < 96)
26
+ return "md";
27
+ return "lg";
28
+ }
16
29
  export function modeIndicatorPresentation(mode) {
17
30
  return { label: mode.toUpperCase(), description: "" };
18
31
  }
19
- export function tasksToggleLabel(visible, compact = false) {
20
- if (compact)
21
- return visible ? "HIDE TASKS" : "SHOW TASKS";
22
- return visible ? "^H · HIDE TASKS" : "^H · SHOW TASKS";
32
+ /**
33
+ * Tasks pane toggle label by density.
34
+ * - xs: hidden (caller skips chip)
35
+ * - sm: `^H`
36
+ * - md: `^H hide` / `^H show`
37
+ * - lg: `^H · hide` / `^H · show`
38
+ */
39
+ export function tasksToggleLabel(visible, density = "lg") {
40
+ // Back-compat: tests/callers that pass `compact: true` map to sm.
41
+ const d = typeof density === "boolean" ? (density ? "sm" : "lg") : density;
42
+ if (d === "xs" || d === "sm")
43
+ return "^H";
44
+ if (d === "md")
45
+ return visible ? "^H hide" : "^H show";
46
+ return visible ? "^H · hide" : "^H · show";
23
47
  }
24
48
  function clip(value, max) {
25
49
  if (max <= 1)
@@ -29,74 +53,89 @@ function clip(value, max) {
29
53
  return `${value.slice(0, Math.max(0, max - 1))}…`;
30
54
  }
31
55
  /** Collapse router/agent status noise into a single clean activity phrase. */
32
- function formatActivity(activity, elapsedSec) {
56
+ function formatActivity(activity, elapsedSec, maxLen) {
33
57
  let base = (activity ?? "waiting for model").replace(/\s+/g, " ").trim() || "working";
34
58
  base = base.replace(/^[⏳·•\s]+/, "").replace(/\n/g, " ").trim();
35
- // Never show classic /output path spam or long paths in the footer.
36
59
  if (/\/output\b|open full output|Ctrl\+O or|full output saved|\.clai\/outputs/i.test(base)) {
37
60
  base = "tool finished";
38
61
  }
39
- // Keep activity short: first token path-ish (tool name) only when huge.
40
- if (base.length > 48) {
62
+ if (base.length > maxLen) {
41
63
  const toolish = base.match(/^[\w.-]+/);
42
- base = toolish ? toolish[0] : `${base.slice(0, 45)}…`;
64
+ base = toolish ? toolish[0] : `${base.slice(0, Math.max(0, maxLen - 1))}…`;
43
65
  }
44
66
  if (/rate limited|retrying in/i.test(base) && !base.startsWith("⏳")) {
45
67
  base = `⏳ ${base}`;
46
68
  }
47
69
  return `${base} · ${elapsedSec}s`;
48
70
  }
49
- /** Pick full or compact context chip for terminal width. */
50
- function contextChipForWidth(usage, width) {
71
+ /**
72
+ * Token chip tiers:
73
+ * - xs: `12k` / `~12k`
74
+ * - sm: `12k tok`
75
+ * - md+: full formatContextChip
76
+ */
77
+ function contextChipForDensity(usage, density) {
51
78
  if (!usage)
52
79
  return undefined;
53
- return formatContextChip(usage, { compact: width < 56 });
80
+ if (density === "xs") {
81
+ // Bare count — no "tok" unit (saves ~4 cols next to mode).
82
+ const raw = formatContextChip(usage, { compact: true });
83
+ return raw.replace(/\s*tok\s*$/i, "");
84
+ }
85
+ if (density === "sm") {
86
+ return formatContextChip(usage, { compact: true });
87
+ }
88
+ return formatContextChip(usage, { compact: density === "md" });
54
89
  }
55
90
  function ContextChip(props) {
56
91
  const { chip, theme, exact } = props;
57
92
  return (_jsx("text", { selectable: false, content: chip, style: {
58
93
  fg: exact ? theme.cyan : theme.muted,
59
94
  attributes: exact ? TextAttributes.BOLD : TextAttributes.DIM,
95
+ flexShrink: 0,
60
96
  } }));
61
97
  }
62
- function sep(theme) {
63
- return _jsx("text", { selectable: false, content: " \u2502 ", style: { fg: theme.muted } });
98
+ function sep(theme, tight = false) {
99
+ return (_jsx("text", { selectable: false, content: tight ? "" : " │ ", style: { fg: theme.muted, flexShrink: 0 } }));
64
100
  }
65
101
  /** Far-right amber remaining-line badges. */
66
102
  function ScrollRemainderBadges(props) {
67
- const { theme, metrics } = props;
103
+ const { theme, metrics, compact = false } = props;
68
104
  if (metrics.linesAbove <= 0 && metrics.linesBelow <= 0)
69
105
  return null;
70
- return (_jsxs("box", { style: { flexDirection: "row", alignItems: "center", flexShrink: 0 }, children: [metrics.linesAbove > 0 ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " " }), _jsx("text", { selectable: false, content: ` ▲ ${metrics.linesAbove} `, style: {
106
+ return (_jsxs("box", { style: { flexDirection: "row", alignItems: "center", flexShrink: 0 }, children: [metrics.linesAbove > 0 ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " " }), _jsx("text", { selectable: false, content: compact ? `▲${metrics.linesAbove}` : ` ▲ ${metrics.linesAbove} `, style: {
71
107
  fg: theme.white,
72
108
  bg: theme.queued,
73
109
  attributes: TextAttributes.BOLD,
74
- } })] })) : null, metrics.linesBelow > 0 ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " " }), _jsx("text", { selectable: false, content: ` ▼ ${metrics.linesBelow} `, style: {
110
+ } })] })) : null, metrics.linesBelow > 0 ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " " }), _jsx("text", { selectable: false, content: compact ? `▼${metrics.linesBelow}` : ` ▼ ${metrics.linesBelow} `, style: {
75
111
  fg: theme.white,
76
112
  bg: theme.queued,
77
113
  attributes: TextAttributes.BOLD,
78
114
  } })] })) : null] }));
79
115
  }
80
116
  /**
81
- * Clickable status chip idle is muted; hover gets a filled chip so the
82
- * user can see it is interactive; active (toggled on) stays cyan/bold.
83
- *
84
- * Always `selectable={false}` + preventDefault on mouse-down so a click
85
- * toggles without starting a drag-selection of the label text.
117
+ * Compact chip that expands on hover.
118
+ * Idle: short chord (`^T`). Hover: full action (`show thinking`).
119
+ * `accent`: cyan emphasis for primary actions (Esc · cancel while running).
86
120
  */
87
121
  function ClickableHint(props) {
88
- const { label, active, theme, onClick } = props;
122
+ const { short, expand, active, theme, onClick, accent = false } = props;
89
123
  const [hovered, setHovered] = useState(false);
90
- // Hover: inverse chip (white on selection). Active: cyan bold. Idle: muted.
124
+ const full = expand ?? short;
125
+ // Hover always shows the expanded phrase (with padding so the chip reads).
126
+ const content = hovered ? ` ${full} ` : accent ? ` ${short} ` : short;
91
127
  const fg = hovered
92
128
  ? theme.white
93
- : active
129
+ : active || accent
94
130
  ? theme.cyan
95
131
  : theme.muted;
96
- const bg = hovered ? theme.selection : theme.background;
97
- const attributes = hovered || active ? TextAttributes.BOLD : TextAttributes.NONE;
132
+ const bg = hovered
133
+ ? theme.selection
134
+ : accent
135
+ ? theme.chip
136
+ : theme.background;
137
+ const attributes = hovered || active || accent ? TextAttributes.BOLD : TextAttributes.NONE;
98
138
  return (_jsx("box", { onMouseDown: (event) => {
99
- // Block OpenTUI selection before it claims the press.
100
139
  event.preventDefault();
101
140
  event.stopPropagation();
102
141
  onClick?.();
@@ -105,17 +144,22 @@ function ClickableHint(props) {
105
144
  alignItems: "center",
106
145
  flexShrink: 0,
107
146
  backgroundColor: bg,
108
- }, children: _jsx("text", { selectable: false, content: hovered ? ` ${label} ` : label, style: {
109
- fg,
110
- bg,
111
- attributes,
112
- } }) }));
147
+ }, children: _jsx("text", { selectable: false, content: content, style: { fg, bg, attributes } }) }));
113
148
  }
114
149
  function ModeBadge(props) {
115
- const { mode, theme } = props;
150
+ const { mode, theme, short = false } = props;
116
151
  const label = modeIndicatorPresentation(mode).label;
117
- const bg = mode === "plan" ? theme.mode : mode === "ask" ? theme.chipIndigo : theme.chipTeal;
118
- return (_jsx("text", { selectable: false, content: ` ${label} MODE `, style: { fg: theme.white, bg, attributes: TextAttributes.BOLD } }));
152
+ const bg = mode === "plan"
153
+ ? theme.mode
154
+ : mode === "ask"
155
+ ? theme.chipIndigo
156
+ : theme.chipTeal;
157
+ return (_jsx("text", { selectable: false, content: short ? ` ${label} ` : ` ${label} MODE `, style: {
158
+ fg: theme.white,
159
+ bg,
160
+ attributes: TextAttributes.BOLD,
161
+ flexShrink: 0,
162
+ } }));
119
163
  }
120
164
  export function StatusLine(props) {
121
165
  const { session, mode, theme, activity, width, hasActivePlan, planVisible, thinkingExpanded = false, outputExpanded = false, onToggleThinking, onToggleOutput, onTogglePlan, onJumpTop, onJumpBottom, onClearDraft, onOpenShortcuts, } = props;
@@ -125,8 +169,10 @@ export function StatusLine(props) {
125
169
  const [startedAt, setStartedAt] = useState(undefined);
126
170
  const [scrollMetrics, setScrollMetrics] = useState(EMPTY_SCROLL_METRICS);
127
171
  const queued = state.queued.length;
128
- const compact = width < 56;
172
+ const density = statusDensityForWidth(width);
129
173
  const busy = state.running || state.compacting;
174
+ const showTasks = (hasActivePlan || planVisible) && density !== "xs";
175
+ const shortMode = density === "xs" || density === "sm";
130
176
  useEffect(() => transcriptScrollPort.onMetrics(setScrollMetrics), []);
131
177
  useEffect(() => {
132
178
  if (!busy) {
@@ -152,14 +198,22 @@ export function StatusLine(props) {
152
198
  return;
153
199
  setElapsed(Math.max(0, Math.floor((Date.now() - startedAt) / 1000)));
154
200
  }, [busy, startedAt, activity]);
201
+ const ctxChip = contextChipForDensity(state.contextUsage, density);
202
+ const scrollCompact = density === "xs" || density === "sm";
203
+ // ── Running / compacting ──────────────────────────────────────────────
155
204
  if (busy) {
156
- const activityText = state.compacting
157
- ? `compacting conversation · ${elapsed}s`
158
- : formatActivity(activity, elapsed);
159
- const ctxChip = contextChipForWidth(state.contextUsage, width);
160
- // Reserve room for mode badge + spinner + ctx chip + Esc:cancel.
161
- const ctxReserve = ctxChip ? ctxChip.length + 4 : 0;
162
- const activityMax = Math.max(12, width - (compact ? 28 : 40) - ctxReserve);
205
+ // Left: MODE · spinner · activity·timer · Esc:cancel · ^H · queue
206
+ // Right: tokens · ▲▼ (never sandwich Esc between tokens and scroll)
207
+ const activityMax = density === "xs"
208
+ ? 0
209
+ : density === "sm"
210
+ ? Math.max(8, width - 40)
211
+ : Math.max(12, width - 52);
212
+ const activityText = density === "xs"
213
+ ? undefined
214
+ : state.compacting
215
+ ? `compact · ${elapsed}s`
216
+ : formatActivity(activity, elapsed, activityMax);
163
217
  return (_jsxs("box", { style: {
164
218
  flexDirection: "row",
165
219
  width: "100%",
@@ -169,31 +223,44 @@ export function StatusLine(props) {
169
223
  backgroundColor: theme.background,
170
224
  paddingLeft: 1,
171
225
  paddingRight: 1,
172
- }, children: [_jsxs("box", { style: { flexDirection: "row", alignItems: "center", flexShrink: 1 }, children: [_jsx(ModeBadge, { mode: mode, theme: theme }), _jsx("text", { selectable: false, content: " " }), _jsx("text", { selectable: false, content: `${SPINNER_FRAMES[frame]} `, style: { fg: theme.spinner } }), _jsx("text", { selectable: false, content: clip(activityText, activityMax), style: { fg: theme.activity } }), ctxChip ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " \u00B7 ", style: { fg: theme.muted } }), _jsx(ContextChip, { chip: ctxChip, theme: theme, exact: state.contextUsage?.exact === true })] })) : null] }), _jsxs("box", { style: { flexDirection: "row", alignItems: "center", flexShrink: 0 }, children: [hasActivePlan || planVisible ? (_jsxs(_Fragment, { children: [_jsx(ClickableHint, { label: tasksToggleLabel(planVisible, compact), active: planVisible, theme: theme, onClick: onTogglePlan }), _jsx("text", { selectable: false, content: " " })] })) : null, queued > 0 ? (_jsx("text", { selectable: false, content: `${queued} queued `, style: { fg: theme.mode } })) : null, state.compacting ? (_jsx("text", { selectable: false, content: "COMPACTING", style: { fg: theme.mode } })) : (_jsx("text", { selectable: false, content: "Esc:cancel", style: { fg: theme.muted } })), (scrollMetrics.linesAbove > 0 || scrollMetrics.linesBelow > 0) ? (_jsx("text", { selectable: false, content: " " })) : null, _jsx(ScrollRemainderBadges, { theme: theme, metrics: scrollMetrics })] })] }));
226
+ }, children: [_jsxs("box", { style: {
227
+ flexDirection: "row",
228
+ alignItems: "center",
229
+ flexShrink: 1,
230
+ minWidth: 0,
231
+ }, children: [_jsx(ModeBadge, { mode: mode, theme: theme, short: shortMode }), _jsx("text", { selectable: false, content: " " }), _jsx("text", { selectable: false, content: `${SPINNER_FRAMES[frame]} `, style: { fg: theme.spinner, flexShrink: 0 } }), activityText ? (_jsx("text", { selectable: false, content: clip(activityText, activityMax), style: { fg: theme.activity, flexShrink: 1 } })) : null, density !== "xs" && !state.compacting ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " ", style: { flexShrink: 0 } }), _jsx(ClickableHint, { short: density === "sm" ? "Esc" : "Esc · cancel", expand: "cancel turn", active: false, theme: theme, accent: true, onClick: () => {
232
+ if (session.getState().running)
233
+ session.abort();
234
+ } })] })) : null, state.compacting && density !== "xs" ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " " }), _jsx("text", { selectable: false, content: "COMPACT", style: { fg: theme.mode, flexShrink: 0 } })] })) : null, showTasks ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " " }), _jsx(ClickableHint, { short: tasksToggleLabel(planVisible, density), expand: planVisible ? "hide tasks" : "show tasks", active: planVisible, theme: theme, onClick: onTogglePlan })] })) : null, queued > 0 && density !== "xs" ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " " }), _jsx("text", { selectable: false, content: `${queued}q`, style: { fg: theme.mode, flexShrink: 0 } })] })) : null] }), _jsxs("box", { style: {
235
+ flexDirection: "row",
236
+ alignItems: "center",
237
+ flexShrink: 0,
238
+ justifyContent: "flex-end",
239
+ }, children: [ctxChip ? (_jsx(_Fragment, { children: _jsx(ContextChip, { chip: ctxChip, theme: theme, exact: state.contextUsage?.exact === true }) })) : null, _jsx(ScrollRemainderBadges, { theme: theme, metrics: scrollMetrics, compact: scrollCompact })] })] }));
173
240
  }
174
- // Idle: centered chips; context tokens left of scroll badges on the right.
175
- // Three columns (flexGrow left + center + flexGrow right) keep the middle true-center.
176
- const idleCtx = contextChipForWidth(state.contextUsage, width);
241
+ // ── Idle ─────────────────────────────────────────────────────────────
242
+ // Left: mode (+ optional center chips that may shrink)
243
+ // Right: tokens + scroll (never shrink away)
177
244
  return (_jsxs("box", { style: {
178
245
  flexDirection: "row",
179
246
  width: "100%",
180
247
  height: 1,
181
248
  alignItems: "center",
249
+ justifyContent: "space-between",
182
250
  backgroundColor: theme.background,
183
251
  paddingLeft: 1,
184
252
  paddingRight: 1,
185
- }, children: [_jsx("box", { style: { flexGrow: 1, flexShrink: 1, minWidth: 0 } }), _jsxs("box", { style: {
253
+ }, children: [_jsxs("box", { style: {
186
254
  flexDirection: "row",
187
255
  alignItems: "center",
188
- flexShrink: 0,
189
- justifyContent: "center",
190
- }, children: [_jsx(ModeBadge, { mode: mode, theme: theme }), width >= 42 ? (_jsxs(_Fragment, { children: [sep(theme), _jsx("text", { selectable: false, content: "/:commands", style: { fg: theme.muted } })] })) : null, !compact ? (_jsxs(_Fragment, { children: [sep(theme), _jsx(ClickableHint, { label: thinkingExpanded ? "^T thinking on" : "^T thinking", active: thinkingExpanded, theme: theme, onClick: onToggleThinking }), sep(theme), _jsx(ClickableHint, { label: outputExpanded ? "^O output on" : "^O output", active: outputExpanded, theme: theme, onClick: onToggleOutput }), sep(theme), _jsx(ClickableHint, { label: "^U top", active: false, theme: theme, onClick: onJumpTop }), sep(theme), _jsx(ClickableHint, { label: "^D end", active: false, theme: theme, onClick: onJumpBottom }), sep(theme), _jsx(ClickableHint, { label: "^X clear", active: false, theme: theme, onClick: onClearDraft }), width >= 72 ? (_jsxs(_Fragment, { children: [sep(theme), _jsx(ClickableHint, { label: "/shortcuts", active: false, theme: theme, onClick: onOpenShortcuts })] })) : null] })) : null, hasActivePlan || planVisible ? (_jsxs(_Fragment, { children: [sep(theme), _jsx(ClickableHint, { label: tasksToggleLabel(planVisible, width < 72), active: planVisible, theme: theme, onClick: onTogglePlan })] })) : null, queued > 0 ? (_jsxs(_Fragment, { children: [sep(theme), _jsx("text", { selectable: false, content: `${queued} queued`, style: { fg: theme.mode } })] })) : null] }), _jsxs("box", { style: {
191
- flexGrow: 1,
192
256
  flexShrink: 1,
193
257
  minWidth: 0,
258
+ overflow: "hidden",
259
+ }, children: [_jsx(ModeBadge, { mode: mode, theme: theme, short: shortMode }), density === "md" || density === "lg" ? (_jsxs(_Fragment, { children: [sep(theme), _jsx("text", { selectable: false, content: density === "lg" ? "/:commands" : "/", style: { fg: theme.muted, flexShrink: 0 } })] })) : null, density === "md" || density === "lg" ? (_jsxs(_Fragment, { children: [sep(theme), _jsx(ClickableHint, { short: "^T", expand: thinkingExpanded ? "hide thinking" : "show thinking", active: thinkingExpanded, theme: theme, onClick: onToggleThinking }), sep(theme), _jsx(ClickableHint, { short: "^O", expand: outputExpanded ? "hide output" : "show output", active: outputExpanded, theme: theme, onClick: onToggleOutput }), sep(theme), _jsx(ClickableHint, { short: "^U", expand: "jump to top", active: false, theme: theme, onClick: onJumpTop }), sep(theme), _jsx(ClickableHint, { short: "^D", expand: "jump to end", active: false, theme: theme, onClick: onJumpBottom }), sep(theme), _jsx(ClickableHint, { short: "^X", expand: "clear draft", active: false, theme: theme, onClick: onClearDraft })] })) : null, density === "lg" ? (_jsxs(_Fragment, { children: [sep(theme), _jsx(ClickableHint, { short: "/shortcuts", expand: "keyboard shortcuts", active: false, theme: theme, onClick: onOpenShortcuts })] })) : null, showTasks ? (_jsxs(_Fragment, { children: [sep(theme), _jsx(ClickableHint, { short: tasksToggleLabel(planVisible, density), expand: planVisible ? "hide tasks" : "show tasks", active: planVisible, theme: theme, onClick: onTogglePlan })] })) : null, queued > 0 && density !== "xs" ? (_jsxs(_Fragment, { children: [sep(theme), _jsx("text", { selectable: false, content: density === "sm" ? `${queued}q` : `${queued} queued`, style: { fg: theme.mode, flexShrink: 0 } })] })) : null] }), _jsxs("box", { style: {
194
260
  flexDirection: "row",
195
- justifyContent: "flex-end",
196
261
  alignItems: "center",
197
- }, children: [idleCtx ? (_jsxs(_Fragment, { children: [_jsx(ContextChip, { chip: idleCtx, theme: theme, exact: state.contextUsage?.exact === true }), (scrollMetrics.linesAbove > 0 || scrollMetrics.linesBelow > 0) ? (_jsx("text", { selectable: false, content: " " })) : null] })) : null, _jsx(ScrollRemainderBadges, { theme: theme, metrics: scrollMetrics })] })] }));
262
+ flexShrink: 0,
263
+ justifyContent: "flex-end",
264
+ }, children: [ctxChip ? (_jsxs(_Fragment, { children: [_jsx("text", { selectable: false, content: " " }), _jsx(ContextChip, { chip: ctxChip, theme: theme, exact: state.contextUsage?.exact === true })] })) : null, _jsx(ScrollRemainderBadges, { theme: theme, metrics: scrollMetrics, compact: scrollCompact })] })] }));
198
265
  }
199
266
  //# sourceMappingURL=status-line.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-line.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/status/status-line.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status-line.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/status/status-line.tsx"],"names":[],"mappings":"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"}
@@ -10,21 +10,12 @@ export interface ComposerEditorProps {
10
10
  readonly services: AppServices;
11
11
  readonly theme: Theme;
12
12
  readonly width: number;
13
- /**
14
- * Maximum editable text rows (not including the rounded border).
15
- * The box starts at 1 row and grows with content up to this cap.
16
- */
13
+ /** Max editable text rows (grows from 1 up to this cap). */
17
14
  readonly height: number;
18
- /** The command window gets denser on tall terminals, never a one-row list. */
19
15
  readonly maxSuggestions?: number | undefined;
20
- /** Mirrors the legacy composer hint while a turn is active. */
21
16
  readonly running?: boolean | undefined;
22
- /** Visual region focus from the shell (Tab cycle). */
23
17
  readonly focused: boolean;
24
- /**
25
- * When set (e.g. Edit on a queued prompt), replace the input with this
26
- * draft. `token` must change each time so the same text can be re-applied.
27
- */
18
+ /** Edit-queue seed; `token` must change each re-apply. */
28
19
  readonly seedDraft?: {
29
20
  readonly token: number;
30
21
  readonly text: string;
@@ -13,7 +13,8 @@ import { getConfig } from "../../store/config.js";
13
13
  import { chordFromKeyEvent } from "../actions/chord-from-key.js";
14
14
  import { PromptHistory } from "./prompt-history.js";
15
15
  import { ARROW_BURST_WINDOW_MS, resolveArrowIntent, } from "./arrow-intent.js";
16
- import { isLargePaste, PasteRegistry } from "./paste-placeholder.js";
16
+ import { isLargePaste, PasteRegistry, } from "./paste-placeholder.js";
17
+ import { PasteChipRow } from "../components/composer/paste-chip.js";
17
18
  import { resolveCompletionMenu } from "./completion.js";
18
19
  import { buildComposerTextareaOverrides } from "./textarea-keybindings.js";
19
20
  import { composerActionPort } from "./composer-action-port.js";
@@ -25,22 +26,20 @@ import { clipComposerMeta, formatComposerMeta } from "./composer-meta.js";
25
26
  import { transcriptScrollPort } from "../components/transcript/transcript-scroll-port.js";
26
27
  import { consumePlanSuggestionInput } from "../app/plan-lifecycle.js";
27
28
  import { countComposerVisualLines, resolveComposerTextRows, } from "./composer-height.js";
29
+ import { tryScrollComposerDraft } from "./composer-wheel.js";
28
30
  const textareaKeyBindings = buildComposerTextareaOverrides();
29
31
  export function ComposerEditor(props) {
30
32
  const { services, theme } = props;
31
33
  const editorRef = useRef(null);
32
34
  const promptHistory = useRef(new PromptHistory());
33
35
  const pasteRegistry = useRef(new PasteRegistry());
34
- /** Trackpad-as-arrows: count rapid ↑/↓ so we scroll chat instead of history. */
35
36
  const arrowBurst = useRef({ count: 0, lastAt: 0 });
36
37
  const [menu, setMenu] = useState({ kind: "none" });
37
38
  const [selected, setSelected] = useState(0);
38
39
  const [acceptedSlash, setAcceptedSlash] = useState(undefined);
39
- /** Visual rows of current prompt — drives grow-with-content height. */
40
40
  const [contentRows, setContentRows] = useState(1);
41
- // Refs mirror React state so OpenTUI key handlers never see a stale menu
42
- // after @ completion or focus reclaim (the intermittent "arrows dead / /
43
- // menu missing" failure mode).
41
+ const [pasteChips, setPasteChips] = useState([]);
42
+ // Refs keep OpenTUI key handlers off stale menu state after focus reclaim.
44
43
  const menuRef = useRef(menu);
45
44
  const selectedRef = useRef(selected);
46
45
  const acceptedSlashRef = useRef(acceptedSlash);
@@ -186,16 +185,28 @@ export function ComposerEditor(props) {
186
185
  editorRef.current?.insertText(entry.token);
187
186
  queueMicrotask(syncContentRows);
188
187
  });
189
- /** Grow/shrink the input box with newlines and soft-wrap (classic parity). */
188
+ function expandPasteChip(id) {
189
+ const editor = editorRef.current;
190
+ if (!editor)
191
+ return;
192
+ editor.setText(pasteRegistry.current.expandOne(editor.plainText, id));
193
+ editor.gotoBufferEnd();
194
+ queueMicrotask(() => {
195
+ syncContentRows();
196
+ refreshMenu();
197
+ });
198
+ }
199
+ /** Grow/shrink input with newlines/wrap; refresh paste chips. */
190
200
  function syncContentRows() {
191
201
  const editor = editorRef.current;
192
202
  if (!editor) {
193
203
  setContentRows(1);
204
+ setPasteChips([]);
194
205
  return;
195
206
  }
196
- // Prompt "❯ " (2) + horizontal padding (2) leave this for wrapped text.
197
207
  const wrapWidth = Math.max(10, props.width - 4);
198
208
  setContentRows(countComposerVisualLines(editor.plainText, wrapWidth));
209
+ setPasteChips(pasteRegistry.current.activeIn(editor.plainText));
199
210
  }
200
211
  function refreshMenu() {
201
212
  const editor = editorRef.current;
@@ -378,6 +389,7 @@ export function ComposerEditor(props) {
378
389
  setMenu({ kind: "none" });
379
390
  setAcceptedSlash(undefined);
380
391
  setContentRows(1);
392
+ setPasteChips([]);
381
393
  if (!expanded)
382
394
  return;
383
395
  if (shouldStoreInPromptHistory(expanded))
@@ -424,19 +436,27 @@ export function ComposerEditor(props) {
424
436
  await services.session.submit(prompt);
425
437
  }
426
438
  }
427
- /**
428
- * Trackpad over the input must scroll the chat — never prompt history.
429
- * OpenTUI hit-tests the focused textarea first; without this, wheel never
430
- * reaches the transcript ScrollBox.
431
- */
439
+ /** Overflowing draft scrolls in place; short draft yields wheel to chat. */
432
440
  function onComposerWheel(event) {
433
441
  if (!event.scroll || overlay.kind !== "none")
434
442
  return;
435
443
  event.preventDefault();
436
444
  event.stopPropagation();
437
- services.focus.focusRegion("transcript");
438
- editorRef.current?.blur();
439
445
  const { direction, delta } = event.scroll;
446
+ const editor = editorRef.current;
447
+ const visible = resolveComposerTextRows(contentRows, props.height);
448
+ if (editor &&
449
+ shouldOwnKeyboard &&
450
+ tryScrollComposerDraft(editor, {
451
+ contentLines: contentRows,
452
+ visibleRows: visible,
453
+ direction,
454
+ delta,
455
+ })) {
456
+ return;
457
+ }
458
+ services.focus.focusRegion("transcript");
459
+ editor?.blur();
440
460
  const step = Math.max(1, delta || 1) * 3;
441
461
  const dy = direction === "up" ? -step : direction === "down" ? step : 0;
442
462
  if (dy !== 0)
@@ -532,6 +552,7 @@ export function ComposerEditor(props) {
532
552
  if (chord === "ctrl+x") {
533
553
  key.preventDefault();
534
554
  editor.clear();
555
+ pasteRegistry.current.clear();
535
556
  promptHistory.current.reset();
536
557
  menuRef.current = { kind: "none" };
537
558
  menuKindRef.current = "none";
@@ -539,6 +560,7 @@ export function ComposerEditor(props) {
539
560
  setMenu({ kind: "none" });
540
561
  setAcceptedSlash(undefined);
541
562
  setContentRows(1);
563
+ setPasteChips([]);
542
564
  notify(services, "Draft cleared · ^X", { key: "draft", durationMs: 1400 });
543
565
  return;
544
566
  }
@@ -595,22 +617,16 @@ export function ComposerEditor(props) {
595
617
  }
596
618
  }
597
619
  function onKeyDown(key) {
598
- // Only handle when the composer actually owns input — never steal from
599
- // transcript scroll by force-focusing on every key event. (Menu keys are
600
- // also routed from the global useKeyboard when focus glitches.)
601
620
  if (!shouldOwnKeyboard && menuKindRef.current === "none")
602
621
  return;
603
622
  handleMenuOrComposerKey(key);
604
623
  }
605
- // Re-measure soft-wrap rows when the terminal width changes.
606
624
  useEffect(() => {
607
625
  syncContentRows();
608
626
  // eslint-disable-next-line react-hooks/exhaustive-deps -- width-only reflow
609
627
  }, [props.width]);
610
628
  const inputWidth = Math.max(20, props.width);
611
- // Grow with content (Shift+Enter, wrap, history); never exceed shell budget.
612
629
  const textRows = resolveComposerTextRows(contentRows, props.height);
613
- // Editable rows + top/bottom border only — meta sits ON the top border.
614
630
  const boxHeight = textRows + 2;
615
631
  const metaShown = clipComposerMeta(metaLabel, inputWidth);
616
632
  function hoverCompletion(index) {
@@ -619,23 +635,19 @@ export function ComposerEditor(props) {
619
635
  services.focus.focusRegion("composer");
620
636
  editorRef.current?.focus();
621
637
  }
622
- /** Mouse click: slash/file accept; directory drills open (browse). */
623
638
  function activateCompletion(index) {
624
639
  services.focus.focusRegion("composer");
625
640
  editorRef.current?.focus();
626
641
  const current = menuRef.current;
627
642
  if (current.kind === "none")
628
643
  return;
629
- if (current.kind === "mention") {
630
- const item = current.items[index];
631
- if (item?.isDir) {
632
- acceptSuggestion({ index, drillDir: true });
633
- return;
634
- }
644
+ if (current.kind === "mention" && current.items[index]?.isDir) {
645
+ acceptSuggestion({ index, drillDir: true });
646
+ return;
635
647
  }
636
648
  acceptSuggestion({ index });
637
649
  }
638
- return (_jsxs("box", { style: { flexDirection: "column", width: "100%", flexShrink: 0 }, onMouseScroll: onComposerWheel, children: [_jsx(CompletionMenuView, { menu: menu, selected: selected, theme: theme, width: inputWidth, maxRows: props.maxSuggestions ?? 10, onHoverIndex: hoverCompletion, onActivateIndex: activateCompletion }), _jsxs("box", { border: true, borderStyle: "rounded", ...(metaShown
650
+ return (_jsxs("box", { style: { flexDirection: "column", width: "100%", flexShrink: 0 }, onMouseScroll: onComposerWheel, children: [_jsx(CompletionMenuView, { menu: menu, selected: selected, theme: theme, width: inputWidth, maxRows: props.maxSuggestions ?? 10, onHoverIndex: hoverCompletion, onActivateIndex: activateCompletion }), _jsx(PasteChipRow, { entries: pasteChips, theme: theme, width: inputWidth, onExpand: expandPasteChip }), _jsxs("box", { border: true, borderStyle: "rounded", ...(metaShown
639
651
  ? {
640
652
  title: ` ${metaShown} `,
641
653
  titleAlignment: "right",
@@ -650,7 +662,6 @@ export function ComposerEditor(props) {
650
662
  paddingRight: 1,
651
663
  flexDirection: "row",
652
664
  }, onMouseDown: () => {
653
- // Explicitly reclaim composer focus when the user clicks the input.
654
665
  services.focus.focusRegion("composer");
655
666
  editorRef.current?.focus();
656
667
  }, onMouseScroll: onComposerWheel, children: [_jsx("text", { content: "\u276F ", style: {
@@ -658,9 +669,7 @@ export function ComposerEditor(props) {
658
669
  width: 2,
659
670
  flexShrink: 0,
660
671
  attributes: TextAttributes.BOLD,
661
- } }), _jsx("textarea", { ref: editorRef, focused: shouldOwnKeyboard,
662
- // No mouse text-selection — OpenTUI selection steals clicks/touch.
663
- selectable: false, placeholder: props.running
672
+ } }), _jsx("textarea", { ref: editorRef, focused: shouldOwnKeyboard, selectable: false, placeholder: props.running
664
673
  ? "type to queue a message…"
665
674
  : `ask anything · @ file or folder · Shift+Enter newline`, placeholderColor: theme.muted, textColor: theme.foreground, backgroundColor: theme.statusBackground, cursorColor: theme.inputBorder, keyBindings: textareaKeyBindings, wrapMode: "word", onSubmit: submit, onContentChange: () => {
666
675
  refreshMenu();