Session Routing Rewrite

The Rule

One function. One rule.

getSessionTarget(sessionId) → div[data-session=X]

Every event has a session ID. Every session has a div. Event comes in → has session ID → find the div → put content there. No botId. No domain. No active session comparison. No hide/show filtering. The div might be hidden (viewing different session). Content still goes in. When user switches to that session, everything is already there.


state.ts — The Router


render.ts — addMessage


message-list.ts — renderMessages + tool events


chat-events.ts — Delta/final/error streaming


main.ts — SSE event handlers


typing.ts — Typing indicators (8 call sites)


history.ts — History loading


spawn-bubbles.ts — CS spawn UI (4 call sites)


messaging.ts — Send + queue


sessions.ts — Working state


tasks-sidebar.ts — Task UI


ui.ts — Bot switching


Server side (already done, needs restart)


Other (already done)


Deploy


Summary

34 frontend changes across 11 files. 5 server changes done. 1 restart.

One function. One rule. Session ID in, div out.