v7.1.0 — Forge

Forge 7.1 is a GUI-only point release that cleans up the chat terminal regressions introduced alongside v7.0.0's `bytes_received` cursor work. Typing in chat mode no longer line-steps with `[Agent stopped]` floods between chunks, Run All / Wildfire starts (and phase transitions) now render the daemon-sent initial prompt instead of dropping it, same-process stream blips no longer replay the buffer onto a stale xterm and stack overlapping Claude Code banners, and the intermittent `timed out waiting for previous agent to stop` toast when switching modes is gone. The TUI streaming path and the daemon's `SubscribeRawOutput` protocol are untouched — the fix is GUI-only and lives in four renderer files.

### Fixed

- **GUI chat — typing no longer line-steps with `[Agent stopped]` floods between chunks.** A transient gRPC error in `fetchStatus` was synthesising `{isRunning: false}`, and ChatTab's auto-restart effect immediately fired `startAgent('chat')` against the still-live agent, killing it and writing an `[Agent stopped]` marker between streamed output chunks. The store now preserves the last-known status on transport errors, so chat sessions keep typing cleanly through gRPC churn.
- **GUI mode switcher — Generate / Plan / Run All / Wildfire actually start; no more `timed out waiting for previous agent to stop` toast.** A race between the in-flight `startAgent` RPC and ChatTab's auto-restart effect was collapsing every special mode back to chat and occasionally tripping the daemon's 10 s cleanup-polling timeout. `ModesControl` no longer pre-calls `stopAgent` (the daemon already does an atomic kill+restart), and a per-project `startAgentInFlight` flag short-circuits status polls during the switch.
- **Run All / Wildfire — initial prompt actually renders on start and on phase transitions.** Each daemon `Process` restart resets the raw-byte counter to zero, but the terminal hook only reset its cursor on project change — reconnecting with a stale cursor against the new Process landed past the new buffer's end and ate the daemon's initial prompt (`Implement Task #…`, Wildfire refine, Wildfire generate). The subscribe effect now keys off `agentStatus.startedAt` and resets emulator + cursor on a real generation change.
- **Same-process stream blip no longer replays the daemon buffer onto a stale xterm.** An earlier fix attempt zeroed the cursor inside `onEnd`, forcing the daemon to re-send its full raw buffer on the next subscribe; the absolute cursor-positioning escapes from Claude Code's UI redraw landed at xterm's current cursor position and stacked overlapping banners. `onEnd` now leaves the cursor alone, schedules a 200 ms reconnect, and the `[Agent stopped]` marker write is removed entirely.