-
fix(spaces): self-healing live client — the '@rowboat is working' status is back (#983)
发布于
2026-09-08 09:07:30 +00:00 The working chips (and ALL live presence) died whenever core's SpacesLive
wedged: a hung token fetch pinnedconnectingtrue forever, a connect
attempt that threw scheduled no retry, and bounce() no-oped without a
socket object — REST kept working, so replies still arrived while every
presence frame was silently dropped. Verified live against the running
packaged app: 60s with zero reconnect attempts to the org server.- SpacesLive: token resolution timeout (20s), watchdog revives a dead
attempt and drops sockets stuck mid-handshake, bounce() reconnects even
with no socket, presence/whiteboard sends kick-start the connection
(the agent's 10s lease renewals now revive a downed socket mid-turn). - subscribeSpace (main + server): the per-space cache re-subscribes when
a re-auth replaced the org's live client instance. - New tests: live.test.ts covers every recovery path with a scripted
fake WebSocket.
Plus the two asks on the working indicator, both column modes:
- "Open chat" one-click link on the working strip (stream + thread pane)
and a persistent "Chat" header link once the thread has a session. - Stop button: new spaces:stopRowboat channel (Electron main + server
RPC, dual-mode) → core stopTopicAgent cancels the thread session's
live turn; the watchdog's receipt + agent_idle lease close the loop.
Co-authored-by: Claude Fable 5 noreply@anthropic.com
下载附件
- SpacesLive: token resolution timeout (20s), watchdog revives a dead