What's Changed
- fix(web): persist AskUserQuestion draft answers across session switches by @IanMStevenson in #1853
- fix(web): filter unread badge count through sidebar eligibility by @IanMStevenson in #1850
- fix(cli,hub): finalize canceled permission requests and surface stale answers by @IanMStevenson in #1854
- fix(grok): preserve ACP text delta chunks by @Aqi77su in #1860
- test(ios): stabilize QuestionCard viewport assertions by @techotaku39 in #1865
- docs(guide): document HAPI Markdown math delimiters by @techotaku39 in #1862
- test(ios): assert Scratchlist preview visibility after focus by @techotaku39 in #1861
- perf(hub): cache prepared statements and memoize per-socket session access by @miuiadmin in #1851
- fix(web): refresh cached session tails with a small page by @techotaku39 in #1847
- fix(hub): keepalive-only sessions reconcile to an idle lifecycle (#1820) by @heavygee in #1821
- fix(cursor): pin Auto to CLI --model auto instead of account default by @swear01 in #1819
- feat(web): auto-hide primary session scrollbars by @techotaku39 in #1730
- feat(web): setting to open external links in a new tab by @IanMStevenson in #1884
- fix(web): save composer draft on visibilitychange, not only on unmount by @IanMStevenson in #1883
- fix(web): synchronize assistant runtime and history loading by @swear01 in #1893
- fix(kimi): discover configured models dynamically by @MiroVanDyro in #1873
- fix(cli): change_title updates metadata.name for visible renames by @heavygee in #1896
- fix(codex): reject history sync for active sessions by @tiborsekera in #1895
- feat(web): dictate keyboard shortcut (Ctrl/Cmd+Shift+D) by @heavygee in #1902
- fix(runner,hub): cross-platform orphan reap on archive / tracking loss by @heavygee in #1911
- test(ios): make SessionSplit width assertion responsive by @techotaku39 in #1907
- Add 130% app font size by @rapind in #1975
- feat(ios): add Russian locale by @mrudybtw in #1964
- fix(web): render Codex goal responses as cards by @junmo-kim in #1954
- feat(web): add Russian locale and detect initial language by @mrudybtw in #1958
- feat(android): add Russian locale by @mrudybtw in #1963
- feat(web): Enlarge button for dictation and text submission (#2006) by @heavygee in #2007
- fix(cli): stamp and reap orphan HAPI MCP bridge helpers by @heavygee in #2004
- fix(cli): strip agent-context env from web Terminal PTYs by @heavygee in #2014
- fix(codex): announce automatic context compaction when it starts by @junmo-kim in #1999
- fix(voice): configurable ElevenLabs max conversation duration by @heavygee in #2017
- fix(web): 48px session search clear with calendar left of it by @heavygee in #2034
- fix(web): shed session toolbar icons by keep rank instead of overlapping by @heavygee in #2040
- fix(codex): keep status summaries out of intermediate messages by @techotaku39 in #2041
- feat(opencode): support OpenCode v2 alongside v1 sessions by @junmo-kim in #2042
- fix(web): remove composer attachments without waiting for cleanup by @techotaku39 in #2128
- fix(web): stop composer image previews from dragging after release by @techotaku39 in #2124
- feat(android): settled permission verdict details by @miuiadmin in #2123
- feat(android): persistent permission-mode chip + inactive gating by @miuiadmin in #2125
- perf(hub): cached settings reads (SWR + single-flight) for hot paths by @miuiadmin in #2122
- fix(codex): distinguish compaction waits from unknown delivery by @techotaku39 in #2115
- fix: show Claude sessions waiting on background tasks (#2100) by @swear01 in #2102
- fix(web): ignore pending requests on archived sessions in the sidebar by @swear01 in #2101
- fix(web): load one older page when the cold tail is tool-only by @swear01 in #2098
- fix(web): give the rich composer its own undo history by @swear01 in #2097
- feat(cli): add hapi set-mode to change a session's permission mode (#2094) by @swear01 in #2095
- fix(cli): forward Claude Code 2.x subagent transcripts in local mode (#1904) by @swear01 in #2091
- feat(codex): expose Approve for me as a permission mode (#2016) by @swear01 in #2090
- fix(hub): judge liveness by hub receive time, not runner clock (#1986) by @swear01 in #2089
- fix(claude): seed local-mode context window from the configured model (#1858) by @swear01 in #2088
- fix(cli): forward Claude API error records with null service_tier (#1857) by @swear01 in #2087
- fix(runner): preserve slow Codex sessions across startup deadlines by @techotaku39 in #2078
- fix(web): contain transient scrollbar overflow during resize by @techotaku39 in #2077
- fix(web): preserve composer image previews across updates by @techotaku39 in #2070
- fix(hub): mint a localId for user messages sent without one by @swear01 in #2069
- fix(runner): add webhook timeout configuration hint by @HuangYincan in #2066
- fix(web): explain redirected hub requests instead of "Failed to fetch" by @junmo-kim in #2065
- feat(pi): display inline tool-result images by @swear01 in #2060
- feat(cli): HAPI_DISABLE_PEER_TOOLS — hide peer-session tools from wrapped agents by @miuiadmin in #2052
- fix(hub): single-flight cache for session enumeration RPCs by @miuiadmin in #2032
- fix(dsh): default ACP entrypoint to the official dsh CLI by @miuiadmin in #2031
- feat(dsh): model selection for DeepSeek Harness (ACP config options) by @miuiadmin in #2030
- perf(web): stop hidden and unchanged sidebar rows from re-rendering by @swear01 in #2165
- fix(claude): keep remote permission downgrades effective by @swear01 in #2158
- fix(claude): pass the session permission mode to the local TUI by @swear01 in #2159
- fix(cli): replay the latest runtime heartbeat on connect by @swear01 in #2054
- fix(codex): persist Round duration across session reloads by @swear01 in #2025
- fix(web): contain image preview labels to prevent chat layout shifts by @techotaku39 in #2116
- feat(web): fixed session order display setting by @miuiadmin in #2033
- feat(web): To agent control for terminal scrollback or selection into composer by @heavygee in #2012
- feat(android): session-list sidebar parity — dedup, stub hiding, relevance search by @miuiadmin in #2104
- feat(android): permission input semantics parity (editor inputType, URL confirm, grok auto gate) by @miuiadmin in #2127
- feat(android): remember new-session launch defaults per machine and agent by @miuiadmin in #2138
- feat(android): add scratchlist row move, copy, and delete-confirm actions by @miuiadmin in #2132
- fix(codex): allow larger histories over shared WebSockets by @Nicholasjl in #2171
- feat(android): session list date-range filter with activity-aware picker by @miuiadmin in #2141
New Contributors
- @IanMStevenson made their first contribution in #1853
- @miuiadmin made their first contribution in #1851
- @MiroVanDyro made their first contribution in #1873
- @tiborsekera made their first contribution in #1895
- @rapind made their first contribution in #1975
- @mrudybtw made their first contribution in #1964
- @HuangYincan made their first contribution in #2066
- @Nicholasjl made their first contribution in #2171
Full Changelog: v0.30.6...v0.31.2