发布

  • fix(spaces): self-healing live client — the '@rowboat is working' status is back (#983)

    frostbyte_neo 发布于 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 pinned connecting true 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

    下载附件