v0.9.158
Patch Changes
-
#923
b9cecb3rove apinow keeps the recovery half of its error envelope, and drops the last references to the web transport #855 deleted.Seven fixes to the error contract. The two flag-rejection paths in the dispatcher dropped
err.data, so the three highest-traffic refusals on the surface — unknown flag, missing required flag, bad enum value — reached stderr stripped of thehintandnextCommandArgsthe docs promise;api get-taskwith no id gave a caller nothing to run next whileapi nopegave it everything.schema --verb/--groupon a name that does not resolve now answers exactly like the verb itself would (same code, same recovery argv, exit 2 — including the migration step for a REMOVED verb such asfan-out), instead of three different results for one typo.engine-report --kindis a real enum, so a mistyped kind is a local flag rejection naming the 14 legal values rather than an untypedRPC_ERRORthat reads as "the daemon is broken";--detailthat is not JSON is likewiseBAD_FLAG, and the daemon's own kind check carries a machine code.pane-open/pane-closewith no target reportMISSING_TARGETlike every other verb under the same condition, notTASK_NOT_FOUNDfor an id nobody supplied. BothBAD_EFFORTrefusals now carry a recovery command, and all fourSESSION_FAILEDthrows share one constructor, so three of them stop travelling without the id of the task they just failed on.docs/API.mdgains the table of codes the CLI itself raises — all 32 of them, derived from the source rather than remembered, so a caller matching oncodeno longer reads the table and concludes a code cannot happen — and a test now derives that list on every run, so the next code added without a row fails CI instead of drifting. Its exit-3 line no longer promises that something was created.Four cleanups after #855.
web: truewas 21 annotations and one derived allowset that nothing read, describing a browser transport that no longer exists and citing a guard test that does not; it is gone, so nobody mistakes it for a checked-in security decision.rove doctorno longer prints a deadDAEMON_WEB_PORT, fixtures no longer reserve a port for a daemon HTTP listener (KOBE_VISUAL_PORT_BASEnow spans two ports, not three), andAGENTS.md,ARCHITECTURE.md,CONFIGURATION.mdand the daemon design notes stop describing SSE lifetime holders, a browser transport, and a web settings API that were all deleted. — @Sma1lboy -
#927
0a63f8eMake the sidebar tree show seven things it already knewEach of these was a fact the tree had in hand and did not draw, so the row
looked the same as a row where nothing was wrong.- Every task row prints the digit that jumps to it. The
ctrl+<digit>
chord worked; the number was a thing you had to count out. Rows now carry
it at the right edge, starting at2—ctrl+1has no encoding in the
legacy terminal protocol, so the first row shows the digit that actually
works instead of one that does nothing. - A failed deletion is visible on the worktree row. The deletion
coordinator sweeps a task's PTYs before it touches the worktree, so by the
time a deletion fails the task has no activity and no live tab — and the
tab row that would have carried the mark is gated on activity it can never
have again. A stalled deletion was discoverable only through
rove api list. The worktree row now draws!for a failed deletion and
spins while one is in flight, beside adeleting/delete failedword. - A turn whose engine is still writing no longer reads as done. The
daemon's transcript facts reach the tree rows, which is what separates a
finished turn from one whereturn-completefired and a long tool call ran
on in hook silence — measured at nine minutes on a real session, the whole
of which the row spent claiming it was idle. - A freeze-restored tab is distinguishable from a quiet one. When the pty
host dies it keeps each session's scrollback and marks the process gone;
opening such a tab silently re-runs its recorded launch command. The row
wore○, the one glyph that means "nothing to do here". It now wears!. - A
pty.killthat never reaches the host leaves a trace. Closing a tab
this process holds no handle for was a barecatch {}documented as "the
same outcome as the kill succeeding". It is not: a kill that lands drops
the freeze record, and a miss leaves it on disk for the next host to thaw —
the tab you closed comes back with its engine running, which is the one
thingdocs/SESSIONS.mdpromises cannot happen. The miss is now recorded
with its session key.
Also:
anyRowLoading's docstring described itself as the gate the sidebar
uses to park its spinner timer, which a per-row subscription store replaced —
it has no caller, and wiring it to anything today would freeze the spinner
under a still-working row, because it cannot see the transcript. Four
Sidebarprops nothing reads are gone. — @Sma1lboy - Every task row prints the digit that jumps to it. The