diff --git a/ui-tui-opentui-v2/src/view/composer.tsx b/ui-tui-opentui-v2/src/view/composer.tsx
index 6ab8033afff..b9328ffa7e7 100644
--- a/ui-tui-opentui-v2/src/view/composer.tsx
+++ b/ui-tui-opentui-v2/src/view/composer.tsx
@@ -178,15 +178,20 @@ export function Composer(props: {
paddingRight: 1
}}
>
+ {/* the completion dropdown is transient input chrome (menu rows + the
+ key-hint) — not transcript content — so it's excluded from mouse
+ selection (item 4). */}
{(c, i) => (
-
+
{c.display || c.text}
{c.meta ? ` ${c.meta}` : ''}
)}
- Tab complete · Esc dismiss
+
+ Tab complete · Esc dismiss
+
{/* prompt glyph + textarea — the glyph (item 3) marks the input line so the
diff --git a/ui-tui-opentui-v2/src/view/messageLine.tsx b/ui-tui-opentui-v2/src/view/messageLine.tsx
index 8ca6f4d6e9f..0fa345506e8 100644
--- a/ui-tui-opentui-v2/src/view/messageLine.tsx
+++ b/ui-tui-opentui-v2/src/view/messageLine.tsx
@@ -61,7 +61,8 @@ export function MessageLine(props: { message: Message }) {
}
>
-
+
+ {/* streaming caret — a cursor glyph, not content (item 4) */}
▍
diff --git a/ui-tui-opentui-v2/src/view/reasoningPart.tsx b/ui-tui-opentui-v2/src/view/reasoningPart.tsx
index e5ba311ef45..a1690915d06 100644
--- a/ui-tui-opentui-v2/src/view/reasoningPart.tsx
+++ b/ui-tui-opentui-v2/src/view/reasoningPart.tsx
@@ -50,7 +50,10 @@ export function ReasoningPart(props: { text: string; streaming?: boolean }) {
{expanded() ? '▼' : '▶'}
-
+ {/* the header is a collapsible-section LABEL (Thinking/Thought + title)
+ — chrome, not the reasoning body — so a free-form drag yields only
+ the markdown body below, not the section label (item 4). */}
+
{/* accent chevron marks it; muted label keeps reasoning in the dim,
secondary tier alongside tool calls (Ink hierarchy). */}
{label()}
diff --git a/ui-tui-opentui-v2/src/view/toolPart.tsx b/ui-tui-opentui-v2/src/view/toolPart.tsx
index 3292788ffba..6f44d1b25b3 100644
--- a/ui-tui-opentui-v2/src/view/toolPart.tsx
+++ b/ui-tui-opentui-v2/src/view/toolPart.tsx
@@ -103,7 +103,11 @@ export function ToolPart(props: { part: ToolPartState }) {
-
+ {/* the whole header row is a collapsed SUMMARY (tool name + args-preview
+ + duration + "(N lines)") — chrome, not the copyable body — so a
+ free-form drag over a tool yields only the expanded output/args
+ content, never the header label (item 4). */}
+
{props.part.name}
…
@@ -134,7 +138,8 @@ export function ToolPart(props: { part: ToolPartState }) {
>
-
+ {/* section label — chrome, not content (item 4) */}
+
args
{/* parsed key: value lines (tidy), or raw argsText when unparseable */}
@@ -158,14 +163,16 @@ export function ToolPart(props: { part: ToolPartState }) {
)}
ARGS_MAX}>
-
+ {/* overflow annotation — chrome, not content (item 4) */}
+
{`… +${argEntries().length - ARGS_MAX} more`}
-
+ {/* section label — chrome, not content (item 4) */}
+
output
@@ -176,13 +183,15 @@ export function ToolPart(props: { part: ToolPartState }) {
)}
+ {/* truncation annotations — chrome (the "… omitted N" / "… +N more
+ lines" notes are not part of the real output body) (item 4). */}
-
+
{`… omitted ${props.part.omittedNote}`}
0 && !props.part.omittedNote}>
-
+
{`… +${body().hiddenLines} more lines`}