v0.30.4
Headline: sweep of the user-reported bug + onboarding queue from the 0.30.2 / 0.30.3 launch day. Resume now restores the full session state (cache hit %, cost, last context bar — previously they all showed zero on a fresh boot until the first turn landed). The model pill on assistant cards reflects the model that actually answered after /model or /preset switches it. Bare /model opens an interactive picker — typed-id entry stays for power users. PowerShell users get Shift+Tab back via three additional encodings (modifier-encoded back-tab, modifyOtherKeys, Kitty keyboard). And a class of "junk text after exit" on Linux/fish (terminal-feature replies leaking into the parent shell) gets a defensive stdin drain in the exit path.
--dir is now discoverable for beginners — surfaced in the welcome banner, the /status panel, the filesystem sandbox-escape error, and a Getting Started callout in both READMEs.
Bug fixes
- fix(stats): persist cache totals + lastPromptTokens across resume (#364, PR #384) —
SessionMetaonly carriedtotalCostUsd/turnCount, so on every resume/statusshowed 0 context + 0% cache hit until the first turn actually fired (even though the prefix was already cached, costing $0.01 per turn). Three new fields are persisted per-turn and seeded intoSessionStatson resume. - fix(ui): /model + /preset update active model so the next card pill is fresh (#372, PR #385) —
state.session.modelwas set once ininitialState()and never mutated, so the pill showed the launch-time model regardless of what actually answered. Newsession.model.changeevent; cards already opened keep their captured model so mid-turn auto-escalation doesn't retroactively relabel. - fix(input): recognize PowerShell / modifyOtherKeys / Kitty Shift+Tab variants (#373, PR #386) — adds
\x1b[1;2Z(PowerShell modifier-encoded back-tab),\x1b[27;2;9~(modifyOtherKeys level 2),\x1b[9;2u(Kitty keyboard) alongside\x1b[Z./modetyped fallback continues to work. - fix(tty): drain pending feature-detection replies on exit (#365, PR #391) — Linux reporters saw
^[]11;rgb:...^[\^[[33;1R^[[?62;1;4cprinted by fish / bash after exit. Those bytes are responses to OSC 11 / CPR / DA1 queries the runtime emits during startup that sit in stdin's queue until exit. NewdrainTtyResponses(50ms)reads-and-discards anything queued before control returns to the parent shell. Layered on top of 0.30.3's alt-screen mitigation.
Features
- feat(ui): /model with no arg opens an interactive picker (#371, PR #387) — arrow-key list, current model marked,
[r]refreshes the catalog, esc cancels. Seeds from the live DeepSeek catalog; falls back to the four known DeepSeek ids when the catalog hasn't loaded yet so the picker isn't empty on first open. The current id is always included even when the API didn't return it./model <id>typed entry stays for power users. - feat(ui): surface --dir / pinned workspace for first-time users (#370, PR #389) — WelcomeBanner shows the workspace + relaunch hint in code mode;
/statusadds aworkspace <path> · pinned at launchline; the filesystem sandbox-escape error points atreasonix code --dir <path>instead of just dropping a raw error; both READMEs gain a Getting Started subsection on--dir. No new slash command — mid-session retargeting is intentionally not supported (the message log + memory paths get tangled with stale roots).
Install
```bash
npm install -g reasonix@0.30.4
or
bunx reasonix@0.30.4 code
```
Full Changelog: v0.30.3...v0.30.4