Archived
Parse the daemon-owned `pendingAsk` in `parseSessionStatus` and validate `ask.opened` / `ask.closed` frames rather than accepting them on their type, since they drive a form the user answers on the model's behalf. Add `submitAsk` / `cancelAsk` through `request()` + `sessionPath()`, both returning the recomputed session status so closing an ask needs no follow-up status request, and derive `pendingAsk` in `SessionController` from status plus live events with `sessions.askUser` capability gating. New `askDrafts.ts` keeps what the user has typed in browser-local storage under `pi-web:ask-draft:<sessionId>:<askId>` and owns the pure answer-state helpers, so the daemon owns "there is an open ask" and the browser owns "what I have typed so far".