Files
deepseek-harness/.agents/notes/archived/feature/2026-07-27-user-message-icon-actions.md
Tianyi Cui f2c0021941 docs(notes): aggressive archive sweep of low-value decision records
Archive 21 implemented triplets whose shipped decisions are complete and
whose bodies no longer guide future work (one-off UI chrome, generator
applications whose scripts are self-explanatory, superseded implementation
detail, process history owned by current contracts/skills). Delete 4
rejected triplets whose premises are obsolete: the DeepReadonly proposal
(dev-invariants note now carries the alternative inline), the collapse
tool-owned presentation proposal (superseded by the shipped render-intent
union), retire-mid-turn-steering (steering is now load-bearing across
plan-mode/apiproxy/TUI), and single-session-ACP (automation-only ACP
resolved the question; multi-session isolation is pinned by tests).

Repair every inbound link: retarget intentional historical citations to
archived paths, replace decision-current citations with the surviving
authority, and fix the stale example-execute-over-tsx pointer in
pnpm-workspace.yaml. Re-record pairing sidecars and seal the archive
manifest (append-only; existing seals unchanged).
2026-07-28 00:00:51 +08:00

1.9 KiB

Agent Note: User-message IconActions under the bubble

Status: implemented Archived: 2026-07-27

English | 中文

Problem

The chat user bubble had no under-bubble action chrome. The Harness design (figma User_Bubble/message_container) shows three IconActions — copy, branch in new chat, and edit — right-aligned under the bubble, matching the product action-bar pattern used elsewhere.

Decision

MessageItem owns the actions for kind: 'user' only. Layout is a column (align-items: flex-end, 6px gap): bubble, then a 28px action row with 10px gaps and 28px circular icon buttons (IconCopyOutline16, IconBranchOutline16, IconEditOutline16). Tooltips carry Chinese labels. Actions stay visible by default; @media (hover: hover) hides them until the row is hovered or focus-within, so touch / hover: none devices keep discoverable controls (opacity alone still hit-tests).

Copy writes the bubble's joined text blocks to the clipboard (navigator.clipboard.writeText, with an execCommand fallback). Branch and edit are present chrome with no handlers yet — they reserve the design seats without inventing session-fork or edit-resubmit behavior.

Steering bubbles keep the badge-only form and do not show these actions.

Alternatives considered

Wire branch/edit to real session fork and draft-edit now. Rejected for this change: those product flows are not specified; shipping inert buttons matches the requested scope and avoids half-built mutation paths.

Always hide with opacity: 0 outside hover. Rejected for touch: without @media (hover: hover), idle opacity still hit-tests while looking empty. Hover-capable pointers keep the fade; others keep the actions visible.

Consequences

User messages expose copy immediately; branch/edit remain clickable stubs until a later decision owns their behavior. Tests pin the three buttons, copy payload, and steering exclusion.