altair823
f08fefec1d
feat(kebab-tui): P9-3 Ask pane — streaming answer + citation panel + explain toggle
P9-1 Library 의 ? 키 활성화. App.ask slot 채움 (parallel-safety contract
그대로). Worker thread 가 kebab-app::ask_with_config 호출하면서
AskOpts.stream_sink 로 token 을 mpsc 채널 에 보냄, 메인 스레드 (TUI) 는
매 render frame 마다 drain 으로 문자열 누적 → 답변 영역 이 token-by-token
업데이트.
핵심:
- AskState 본체 (`app.rs`) — input / explain / streaming / partial /
answer / thread JoinHandle / rx Receiver / scroll / last_error.
- `src/ask.rs`:
- `render_ask` — input bar / 답변 영역 (streaming 시 ▍ cursor) /
bottom split (status: grounded/model/prompt/k/refusal · citations
or explain panel).
- `handle_key_ask`: typing → input. Enter → spawn_ask_worker (input
있음 + not streaming). e (input empty 시) → toggle explain.
j/k (input empty 시) → scroll. Esc → SwitchPane(Library) +
streaming/rx/thread 클리어 (best-effort cancel).
- `spawn_ask_worker` — mpsc::channel + thread::spawn(|| ask_with_config).
- run-loop hooks: `drain_stream` (try_iter → partial), `poll_worker`
(handle.is_finished → take + join → answer 채움 또는 ErrorOverlay).
- run.rs: Pane::Ask arm 이 handle_key_ask + render_ask. Idle tick 마다
drain_stream + poll_worker. SwitchPane(Ask) 시 lazy init.
테스트 13개 (`tests/ask.rs`) — Esc/typing/backspace/e toggle (input
empty)/e typed (input nonempty)/Enter empty/Enter while streaming
no-op/render pre-submission hint/streaming partial+cursor/grounded
answer + citation [1]/refusal score_gate 패널 panic 없음/explain panel
title flip/no slot.
Spec deviation (HOTFIXES `2026-05-02 P9-3`):
- `render_ask<B: Backend>` generic 제거 — ratatui 0.28 Frame
backend-agnostic (P9-1/P9-2 와 동일).
- e/j/k 가 input 빈 상태 일 때만 command 키, 입력 있으면 typing —
vim "command vs insert" 변형. spec literal 의 단순 \"e=toggle\" 은
\"explain\" / \"javascript\" 같은 단어 입력 깨뜨림.
Docs (sync rule):
- README: TUI 행 \"Library + Search + Ask 패널\" + Quick start 코멘트.
- HANDOFF: 한 줄 요약 + Phase status (P9 2/5 → 3/5) + deviation 한 줄.
- HOTFIXES: P9-3 entry.
- tasks/p9/p9-3 status: completed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 15:24:26 +00:00
..
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 07:37:56 +00:00
2026-05-02 09:28:06 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 15:24:26 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 15:24:26 +00:00
2026-05-02 09:07:03 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00
2026-05-02 04:01:55 +00:00