yoi/tickets/submit-tui-completion.md
2026-04-30 12:46:48 +09:00

79 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# サブミット入力: TUI 補完 + 型付き atom 化
## 背景
`tickets/submit-segment-protocol.md` で protocol が `Vec<Segment>` を運べるようになった前提で、TUI 側に「`@` / `#` / `/` を打鍵中に候補を出し、確定したら typed atom (= 送出時の `Segment`) に昇格させる」UX を載せる。
`@` / `#` / `/` は TUI の入力アフォーダンスであって protocol contract ではないGUI などは同じ intent をボタンや picker で表す)。本チケットは TUI 限定の UX に閉じる。
## 要件
### token 検出と昇格
入力中に prefix を検出して候補を浮かせる:
- `@<部分パス>` — workspace 内のファイル / ディレクトリ候補
- `#<部分slug>` — Knowledge slug
- `/<部分slug>` — Workflow slug + client-side コマンド(`/clear` など)
トリガー条件:
- prefix 記号の直前が「行頭 or 空白 or paste 等の indivisible atom」のときのみ候補ポップアップを開く
- 開いた後に prefix 直後がスペースになった時点(例: `@ `, `/ `)で候補を閉じ、通常テキストに戻す
確定Tab / Enter 等、入力 UX の詳細は実装で)で対象範囲を `Atom::FileRef` / `Atom::KnowledgeRef` / `Atom::WorkflowInvoke` の indivisible atom に置き換える。挙動は既存の `Atom::Paste` と同等cursor は中に入れない、Backspace で塊ごと削除。submit 時に対応する `Segment` 変種に変換して送る。
### 候補列挙のための protocol query
補完用に Pod へ問い合わせる軽量経路を追加。`Method::GetHistory` と同じパターンを踏襲する: 専用 `Method` variant を受信した IPC server 層 (`crates/pod/src/ipc/server.rs`) で Controller を介さず直接処理し、対応する `Event` 変種を同ソケットに write back するbroadcast には流さない)。
扱う query:
- ファイル候補Pod scope 内、prefix マッチ)— 本チケットで実装
- Knowledge / Workflow slug 候補kind 指定 + prefix マッチ)— wire の枠だけ用意し、resolver 未登録時は空応答。実体はそれぞれのチケット側
### Pod 側ファイル resolverauto-read 切り出し)
現状 `crates/pod/src/compact/worker.rs``mark_read_required` ツールと `crates/pod/src/pod.rs` の再読ロジックに散らばっている auto-read 機構を、「Pod から見たファイルシステム操作」を担う独立モジュール(または新規クレート)に集約する:
- 既存の auto-read`ScopedFs` 経由の読み込み + budget 管理)をこのモジュールに移動
- 補完候補の prefix マッチ列挙を同モジュールに新設
このモジュールは Pod の Interceptor / Hook 経路から呼び出される。compact からの利用も新モジュール経由に切り替える。memory / workflow チケットの resolver はここには含めない。
### 表示
確定後の atom は paste と同じ「indivisible chip」スタイルで描画する。`@` / `#` / `/` ごとに色を変える程度の差異化を入れる。`Block::UserMessage` 側でも同一スタイルで再描画する(`Event::UserMessage` が typed segment で来る前提)。
## 範囲外
- Knowledge / Workflow slug の Pod 側 resolver 実装(それぞれ memory / workflow チケット側で実装。本チケットでは wire の枠と空応答のみ)
- 候補スコアリング、fuzzy search、preview 等の高度な補完体験
- リッチクライアントGUI / webの同等 UX
## 完了条件
- `@` / `#` / `/` を打鍵すると候補が出て、確定で chip 化される
- chip 化された atom が対応する `Segment` として Pod に送出され、`Event::UserMessage` で戻ってきた typed segment が同じ見た目で再描画される
- 候補列挙の query / response が wire を通る
- 既存ビルド・テストを壊さない
## 依存
- `tickets/submit-segment-protocol.md`
## 参照
- `crates/tui/src/input.rs``Atom` 体系の拡張)
- `crates/tui/src/app.rs``submit_input`、`Block::UserMessage` 描画)
- `crates/pod/src/ipc/server.rs``GetHistory` パターン: Method 受信 → 同ソケットに Event を直接 write back
- `crates/pod/src/compact/worker.rs` / `crates/pod/src/pod.rs`(切り出し対象の auto-read 機構)
- `docs/plan/memory.md` §retrieval 経路slug 補完対象)
- `docs/plan/workflow.md` §呼び出しと依存
## Review
- 状態: Approve
- レビュー詳細: [./submit-tui-completion.review.md](./submit-tui-completion.review.md)
- 日付: 2026-04-30