-
v1.5.3 Stable
released this
2026-09-10 10:10:52 +00:00 | 237 commits to main since this releaseFixed
Every tmux-backed run was silently unpersisted, so a resumed session showed nothing.
dashboard_runs.modeisNOT NULL,recordRunswallows insert errors by design, andpty-run.jspassedmode: null— so the insert threw on every single run and nothing was recorded. In a live database the newest run row predatedpty-run.jsreplacingrun-spawner.js.publicRunreadscwd,model,prompt_preview,started_atandsession_idoff that row (the handle itself is recomputed from tmux on every read), which produced the two visible symptoms:- the runs modal showed a live row with no cwd, no model, no prompt and a start date of Jan 1 1970;
- a resumed session kept its separate
externalbadge, because the client dedupes an external session against the session ids carried by run rows and no run row ever carried one.
Changes:
pty-run.jsrecordsmode: "interactive"— every run here is one interactive pane.dashboard-runs.jsstill never fails a live run on a db error, but now warns instead of swallowing silently. That silence is what hid this for six weeks.RunHistoryrenders a missing start time as-instead of dating the row to the epoch.
Adopting a busy pane no longer reports work it did not do. A
start/resume against a lane whose pane is already running an agent now returns409 ERUNLIVE(from the lane start action andPOST /api/run) when the request carried apromptor aresumeSessionId— that argv cannot be typed over a live agent, so answering200claimed a resume that never spawned. A start that asks for nothing but a pane still adopts it silently.Verification
server/__tests__/pty-run.test.js+4 tests (row lands with cwd/model/prompt/lane/started_at and a non-nullmode; a resumed run carries the session id; the two ERUNLIVE refusals; a bare start still adopts). Regression proven by flippingmodeback to null — the suite fails.npm run test:server1707 passing ·npm run test:client488 passing.
Downloads