Repository navigation
feat(gpui): copy a whole thread as Markdown - #118
Conversation
Adds "Copy thread" to the root message's menu in the thread panel. It copies the loaded thread with the root's link, notes about unloaded replies and thread banners, each message in time order with author and UTC time, and each agent's activity status. Closes #95 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tee8z <tee8z@protonmail.com>
|
Caution Review failedThe pull request is closed. Walkthrough
Merge Risk:
|
|
@coderabbitai review |
Action not completed
|
|
Native runtime verification completed for
Reviewed the diff against #95 and the activity vision. No blocking correctness, security, or agreed-contract findings. Minimalism 9/10; elegance 9/10; correctness 9/10. The declared root-menu-only scope remains explicit. Agent testing does not attest human app acceptance. |
Closes #95.
Problem
The GPUI app can copy one message or its link, but not a whole thread. To share a thread with a person or an agent, a developer must paste each message, take screenshots, or run
buzz messages threadwith their private key. Copied text also loses agent state such as "Could not finish" and remote session banners.Change
The root message's More message actions menu in the thread panel now has Copy thread, under Copy message. It puts this Markdown on the clipboard:
buzz://link(agent)for agents, UTC time, body as written (mentions stay@Name), then attachment URLs. Undelivered messages are markednot sent.The copy uses only what the panel has loaded and shows. It contains no keys, tokens, or telemetry payloads.
Implementation
message_copy::threadformats aLoadedThread. It is a pure function, so it is unit tested without the app.ThreadPanel::copy_textbuilds theLoadedThreadfrom the thread snapshot, the thread banner registry, and the agent activity observer.Hooks::copy_threadandActions::copy_threadshow the menu entry only on pages that can copy a thread. Media comments also setin_thread, soin_threadis not used for this gate.bubble::statusgives an agent's status as text, consistent with the bubble.Validation
cargo test -p buzz-gpui --features voltage-sandbox: new tests cover time order, the heading and link, notes, attachments, agent suffix, activity lines, an unavailable root, an unsent reply, name escaping, and the menu gate (root only, and only when the page provides the hook).cargo clippy -p buzz-gpui --all-targets --locked --features voltage-sandbox -- -D warningsandcargo fmt --all --checkpass.--features voltage-sandbox, Linux) on an #engineering agent thread: the copy had the heading and link, messages in time order with UTC times,(agent)suffixes, and tables and Markdown kept as written.Limits
🤖 Generated with Claude Code
Summary by CodeRabbit