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`}