Skip to content

v0.9.3

Choose a tag to compare

@sausheong sausheong released this 21 Jun 12:07
· 14 commits to main since this release

Fixes cross-session chat spill-over: a turn streaming in one session no longer renders into another session when you switch mid-generation.

Highlights

No more cross-session spill-over. Every streamed event now carries its originating session scope (agentId/sessionKey) end-to-end, and the chat client renders an event only into the session it belongs to. Switching sessions while a turn is generating no longer pours that turn's output into the session you switched to.

Background turns keep running. A turn you switch away from continues generating server-side. The session's sidebar row shows a green running dot while it works in the background, and the composer lock is now per-session — you can start a new turn in an idle session while another keeps generating.

Live re-attach on switch-back. Returning to a still-generating session reloads the full conversation history and then overlays the in-flight turn live (via chat.subscribe), so you see prior scrollback plus the response continuing in real time. Re-attach is scope-gated and idempotent — rapid back-and-forth switching rebuilds the view cleanly with no duplicate or mis-routed output.

Under the hood

  • Server stamps agentId/sessionKey on all streamed frames (chat.send stream, chat.subscribe stream, trace marks, run_attached).
  • Client holds the visible pane globally but scope-gates every streaming case; composer lock moved to a per-session map.
  • Backed by a concurrent-scope isolation regression test (two turns on different sessions over one connection must never cross-label) and race-clean across the gateway.