Chat Collaboration
The Problem
Agent chat is single-player. You have your session, your tabs, your context. If a teammate wants to see what you’re working on, you screenshot it or describe it. If two people want to work with the same agent at the same time, they can’t — they get separate sessions with separate context.
Chat collaboration makes agent sessions shareable in real time.
How It Works
You click a sync button in the chat and pick a teammate who’s online. From that point, you both see the same thing — same messages, same agent responses streaming in, same tabs.
Either person can type. Either can stop the sync. When you disconnect, you’re back to your own independent session — nothing gets mixed up.
What It’s For
- Working together with an agent — one person drives, the other watches and jumps in. Both see the agent’s work live.
- Showing someone what happened — instead of screenshotting a conversation, just sync and let them see it directly.
- Handing off work — sync with a teammate, walk them through the current state, disconnect. They pick up where you left off.
- Training — new team members watch how experienced users interact with the agent, in real time, not from a recording.
Why It Matters
The hardest part of working with an agent isn’t the agent — it’s explaining to someone else what the agent did. You copy message blocks, screenshot output, say “just trust me.” That breaks down when you need a second opinion, a sign-off, or a clean handoff.
Collaboration removes that translation layer. Instead of describing what happened, you show it. The other person sees the same conversation, the same streaming output, the same context. They can ask follow-up questions in the same session. The agent hears both of you.
This matters most when agents are doing non-trivial work — multi-file changes, architecture decisions, complex debugging. Those are the moments where a second pair of eyes is worth it, and where “here’s a screenshot” doesn’t cut it.
Technical Detail — Sync Architecture
Collaboration is powered by Convex real-time subscriptions via the chatCollaboration module. Key functions:
getChatSyncPartners— lists eligible online usersstartSync/stopSync— establishes or terminates a sync sessiongetSyncedScreens— returns shared screen/layout stategetSyncedTabs— returns shared tab list and active tab
The useChatSync hook in features/chat/hooks/ manages the client-side sync lifecycle. The ChatSyncButton component in the chat header shows sync status and partner selection.
Technical Detail — What Syncs vs What Doesn't
Synced (via Convex subscriptions):
- Active chat tab and full tab list
- Message history and streaming responses
- Screen/layout state (visible panels, split view)
Not synced (stays per-user):
- Personal settings and preferences
- Superpower selections (each user keeps their own focus mode)
- File uploads in progress (only completed attachments appear)
- Zustand local store state beyond tab/screen data
Sync state is stored in Convex, not in the browser — so it survives page refreshes and works across devices.