From 2998f37b5a48405af908fdf32ef41de7c450045b Mon Sep 17 00:00:00 2001 From: Hare Date: Mon, 15 Jun 2026 16:02:54 +0900 Subject: [PATCH] ticket: record single-pod selection implementation --- .yoi/tickets/00001KV4YAAVY/item.md | 2 +- .yoi/tickets/00001KV4YAAVY/thread.md | 65 ++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/.yoi/tickets/00001KV4YAAVY/item.md b/.yoi/tickets/00001KV4YAAVY/item.md index fede6e9d..b7a3a980 100644 --- a/.yoi/tickets/00001KV4YAAVY/item.md +++ b/.yoi/tickets/00001KV4YAAVY/item.md @@ -2,7 +2,7 @@ title: 'single-Pod View Item text をマウスドラッグで選択・コピーできるようにする' state: 'inprogress' created_at: '2026-06-15T06:08:19Z' -updated_at: '2026-06-15T06:39:16Z' +updated_at: '2026-06-15T07:02:42Z' assignee: null readiness: 'implementation_ready' risk_flags: ['tui', 'mouse-input', 'selection', 'clipboard', 'single-pod-view'] diff --git a/.yoi/tickets/00001KV4YAAVY/thread.md b/.yoi/tickets/00001KV4YAAVY/thread.md index 1040cb50..ec8b2609 100644 --- a/.yoi/tickets/00001KV4YAAVY/thread.md +++ b/.yoi/tickets/00001KV4YAAVY/thread.md @@ -93,3 +93,68 @@ Critical risks / reviewer focus: Routing decision と accepted implementation plan を記録済み。blocking relation / unresolved OrchestrationPlan blocker はなく、single-Pod View work は同時に開始する Panel composer work と主対象が異なるため、implementation side effects の前に `queued -> inprogress` acceptance を記録する。 --- + + + +## Implementation report + +Implementation report from Coder Pod `yoi-coder-00001KV4YAAVY`: + +Commit: +- `09f5e9d5 feat: add single-pod text selection` + +Changed files: +- `crates/tui/src/text_selection.rs` + - New transient selection state, coordinate mapping, extraction, and focused tests. +- `crates/tui/src/app.rs` + - Local non-persistent selection state on `App`. +- `crates/tui/src/ui.rs` + - Selectable history row metadata, highlight rendering, snapshot wiring, selectable/non-text tests. +- `crates/tui/src/single_pod.rs` + - Drag mouse handling, `Esc` clear, `y` copy+clear, OSC52 copy, tests. +- `crates/tui/src/lib.rs` + - Module registration. +- `crates/tui/Cargo.toml`, `Cargo.lock` + - Added direct `base64` dependency for OSC52 clipboard payloads. + +Behavior / implementation decisions: +- Selectable Items: + - `UserMessage` + - `SystemMessage` + - `AssistantText` +- Non-text/tool Items: + - tool calls, thinking, stats, greetings, alerts, turn headers, etc. are not selectable/copyable through this path. + - extraction skips non-selectable rows. +- Cross-item selection separator: + - copied text follows rendered row order and preserves selectable blank spacer rows, giving deterministic `\n\n` between adjacent text-like Items. +- Copy target: + - terminal clipboard via OSC52 (`ESC ] 52 ; c ; base64 BEL`), not OS clipboard APIs. + - avoids adding platform clipboard runtime behavior. +- Copy diagnostics: + - actionbar-only sanitized messages: + - success: `copied selected text to terminal clipboard` + - failure: `terminal clipboard write failed` + - no selected content appears in diagnostics. +- Selection persistence: + - selection state/copied text remains TUI-local only. + - not appended to Pod history, model context, session logs, Ticket records, memory, or durable state. +- Mouse tracking: + - single-Pod TUI now enables button-event drag tracking (`?1002h`) but not all-motion tracking (`?1003h`). + - Panel code was not changed. + +Validation reported by coder: +- Passed: `cargo fmt --check` +- Passed: `cargo check -p tui --all-targets` +- Passed: `cargo test -p tui text_selection` +- Passed: `cargo test -p tui single_pod::tests` +- Passed: `cargo test -p tui ui::tests::history_rows_mark_text_items_selectable_and_non_text_unselectable` +- Passed: `git diff --check` + +Repository status: +- Child implementation worktree clean after commit. + +Residual risks / notes: +- OSC52 clipboard success means sequence written/flushed; actual clipboard acceptance depends on terminal/multiplexer policy. +- No real PTY/E2E validation was run; coverage is focused unit-level mouse/key/selection/render extraction behavior. + +---