Release the pointer after selecting message text to reveal two adjacent actions above the selection. The toolbar stays hidden during dragging, hides on a new pointer press or cancelled selection, and also supports completed keyboard selections: Add to chat appends the selection to the current draft; Chat in new branch checks out the selected conversation message, reloads that session, and appends the selection to its draft. The next explicit send creates a sibling branch while preserving the previous history. Checkout failures leave the draft unchanged and show an error; pending checkout disables both actions. The selection toolbar uses compact 28 px actions with 3 px outer padding, 8 px corner radius, a subtle border and shadow, equal rounded action targets separated by a short inset divider, and an opaque theme-aware popover background. Hover and pressed states mix solid theme colors, never replace the background with a translucent overlay. Keyboard focus has a visible outline. The message action row also quotes a whole message. Quotes append Markdown blockquotes to that conversation's draft and focus its composer. Existing drafts and attachments remain intact; sending is explicit.
Historical user messages open an inline composer with the same text field, file mention picker, attachment processing and preview strip as the bottom composer. Existing attachments can be removed; images and documents can be picked, pasted or dropped. URLs remain editable text. Cancel discards only the edit. Save and resend creates a sibling branch through the existing edit route. Errors retain the edit and show a retryable message.
References: the user-supplied Codex selection screenshot establishes the selection action; no external product parity is claimed. Separate side-chat windows are outside this change.
The quote action in the message row and the two selection actions use the shared animated-icons components. GitBranchIcon remains the existing pqoqubbw/icons implementation. The upstream catalog has no Quote component, so QuoteIcon follows the existing Monitor and Pin fallback: the official Lucide glyph, the shared imperative start/stop interface, and the existing CopyIcon spring and translation. No SVG path or new motion style is authored. The whole button drives animation on pointer hover and keyboard focus; leaving or blurring resets it when neither interaction remains. Disabled controls and reduced-motion users receive static icons. Existing sizes, colors, surfaces, draft updates, session ownership and branch requests remain unchanged.
Bounded plan: add the shared QuoteIcon and a chat action animation hook; connect the existing action row and selection toolbar; verify the real components in the quote/edit browser test under normal and reduced motion, then run chat UI, accessibility, TypeScript and documentation link checks. Runtime, composer semantics, backend APIs and unrelated surfaces are excluded. Independent specification and quality review precede any integration; this source patch does not update the installed App.
Per-pane session ownership is explicit. Uploaded bytes use the existing bounded attachment persistence and image dispatch path. Retained image copies are read through the authorized raw-file API; retained legacy attachment blocks stay lossless. No automatic submission and no new permission modes.
Gate: focused browser interaction tests for quote draft preservation and split ownership, inline attachment editing and failure retention; REST edit attachment validation and dispatch tests; TypeScript check; documentation links; production build during the standard local refresh. Independent specification and quality review precede integration.
Icon consistency status: source changes and the two normal/reduced-motion browser cases are verified. TypeScript, chat UI and documentation links pass. The global accessibility check remains blocked by the unchanged canvas-controls role-button keyboard handler failure, reproduced at the task base. Independent specification and quality reviews pass. Integration and the production build remain pending; the installed App is unchanged.
Existing quote/edit status: specification and quality reviews pass. Six REST attachment cases, the split-pane browser interaction test (including retained and pasted images), thirteen existing attachment cases, the local attachment path contract, TypeScript and documentation links pass. Production packaging uses the standard local App refresh.