Patch Changes
- 1f04ff7: The dev TUI renders Markdown through a real GFM parser (width-fitted tables, code blocks, task lists, links), presents every builtin tool with semantic activity copy (
Fetch <url>,Run <command>,Search <query>— includingweb_searchacross provider input shapes,todo,ask_question,agent, andconnection_search), and shows rejected tool approvals as denied instead of successful. Tool activity now accumulates in place: an in-flight batch renders as one counted header with its newest calls listed first behind a│rail and a… (N more)elision, then collapses to a single past-tense line (▪ Fetched 30 URLs) once every call settles — failures keep their itemized per-call error rail — and eachwrite_filekeeps its own block rendering a real line diff (+/-rows with context, computed from content the session has already seen — prior writes and full-file reads; new files show all additions).ask_questionprompts open as a numbered overlay panel above the input (number keys select directly, the "Type your own answer" row focuses its inline editor on reach, Esc dismisses to plain text input), committing as? question ⎿ answerin the transcript. Thetodotool no longer emits transcript blocks; it drives a pinned panel above the input showing per-task state, which commits as a completed block once every task settles. An empty prompt now shows a quiet›mark with a rotating placeholder of things to try, switching to the active❯once typing starts. Reasoning defaults to a fixed one-line thinking indicator that updates in place (persisting as○ Thought for 12sonly for long thoughts;--reasoning fullrestores the streaming trace), the prompt stays anchored during a turn with Enter inert (the draft carries into the next prompt), and completed turns close with a└ Done in <duration>stats coda (per-turn token flow, context fill) when the turn was long or expensive. Subagent calls render as individual※ subagent(<name>) #Nsections in the tool column whose child rows window to the three most recently active (failures stay itemized while settled work condenses to one counted row) and close on a corner that reportsDoneonce the call's final message arrives; captured server output renders as one open-railed○ stderr/○ stdoutstream section per source (streams are continuous — no closing corner, and interleaved activity never fragments them): the section sits at its newest write's position — everything that happened after the last error displays after it — and shows only that newest write, with earlier ones behind an… (N more)count (the stored-diagnostics pointer carries the history); the status bar names the model's actual routing and credential (via ai-gateway(oidc:<project>),via ai-gateway(api-key), orvia <provider>⌝for a directly-authored endpoint); an empty prompt no longer submits; and a mid-conversation session replacement marks the context cut with a┌── Session restarted, clear context.boundary line.