v0.9.163
Patch Changes
-
#940
e52f624A dead engine'sexit.tailno longer ships raw terminal control bytes to API consumers.terminalRows— the one stripper behindget-task/collect/inspectandread-output— covered CSI and OSC escapes but not bare C0 (a shell's BEL, a spinner's backspace) or theESC ( Bcharset select every full redraw emits, so all three reachedpty-exits.jsonand every reader of it verbatim. Records already on disk are stripped on read, not just on write..runningandsendnow share one judgement about which tabs hold an engine..runningread the persistedkindlabel alone, so a live session the tab snapshot had lost — theunregisteredrowsget-taskalready renders — made a task reportrunning: falsewhilesenddelivered into it happily.Internal: the daemon stops guessing at values kobe owns.
runAutoTitlePass/trackedWorktreestake the default vendor as a required argument instead of a dead"claude"literal that would not have followedDEFAULT_TASK_VENDOR, and theui-prefschannel reportstheme: nullwhenstate.jsonnames no selection rather than naming a theme the daemon has no registry to validate. A duplicated UTF-8 chunk decoder inpr-status-collector.tsnow calls its same-package twin, and the event-channel payload types moved out of the channel registry intochannels-events.ts. — @Sma1lboy -
#934
fe2be33Rove can now reload itself after an update — the amberDAEMON OUT OF DATEbanner is an action instead of a chore list. Rove ships several times a day and the daemon is a long-lived process that outlives annpm i -g, so "new binary, stale daemon" is the ordinary result of updating; until now the only cure was quitting, runningrove daemon restart, and starting Rove again by hand, because a running TUI keeps executing the bundle it launched with. Pressctrl+aron the banner (proposed chord, awaiting sign-off) and Rove restarts the daemon and relaunches itself on the installed build after one confirmation. Running engine sessions are untouched — they live in the separate PTY host — and open tabs reattach to the same sessions. The chord is bound only while the two builds actually differ, so it never appears (or shows up in the command guide) on a Rove that is already current, and there is no auto-refresh: Rove offers, you decide.Settings → Dev → Restart backend now actually restarts. It used to destroy the renderer and exit, leaving you at a shell prompt to type
roveagain — which never reloaded the client's own code, the half the dev loop it exists for needs reloaded. It now stops the daemon and relaunches this window on the installed build, so an edit to daemon / orchestrator / engine code takes effect in one step.rove daemon restarttells attached windows why it is stopping. The daemon'sdaemon.stoppingframe carries areason(restart/stop/idle/socket-lost) and its own build version (protocol v5, additive — older daemons and older clients keep working unchanged). An attached Rove learns its code is about to be a build behind while the outgoing daemon is still on the wire, instead of inferring it from a socket close plus a reconnect under backoff. Plugins readingdaemon.stoppingcan branch on the same field; seedocs/PLUGIN-SDK.md. — @Sma1lboy -
#939
396be3cWindows sees its running engines again. Every task reportedrunning: false, and every engine tabengineAlive: falsewithliveVendor: null, while Claude Code sat at the prompt inside it — sorove api send --tab tab-Nrefused withENGINE_NOT_RUNNING("it is a plain shell right now"),addfell into the pending-init branch instead of confirming a launch, and the sidebar showed live tasks as stopped. Two things were wrong, both Windows-only. The process snapshot ranps -A, and thepson a Git for Windows PATH is a Cygwin build that rejects-Aand exits with empty output — which parsed to zero processes and was published as a confident "no engine anywhere"; Windows now readsGet-CimInstance Win32_Processinstead. And an npm-installed engine launches through a.cmdshim whosecmd.exeexits immediately, leaving the engine's parent chain pointing at a dead pid, so no walk from the tab's shell could ever reach it — Rove now asks the tab's own ConPTY console which processes are on it (through theconpty_console_listaddonnode-ptyalready ships) and rebuilds the chain from that. macOS and Linux take and read the snapshot exactly as before.A process probe that fails now travels as unknown everywhere instead of as "no engine": a snapshot with no processes in it is a failed look, not an empty machine. Readers (
collect,get-task,inspect, the sidebar) leaveengineAlive/liveVendorunset and hold the last knownrunningrather than reporting a live task as stopped, androve api sendrefuses withENGINE_PROBE_FAILED— which says "could not check", not "this tab is a bare shell". — @Sma1lboy