Group Chat
The panel group-chat window: a three-panel team chat surface with attribution bubbles, sidebar history, and @-mention auto-complete.
Group chat is the panel surface where a team of agents converses in one shared, durable thread. It turns a team from "able to run" into "good to use, easy to revisit": speakers are visually distinct, history is resumable from the sidebar, and @-mentions are discoverable instead of hand-typed.
Design Philosophy
- Identity-first — every message is attributed to a speaker by emoji avatar + display name, not buried in metadata.
- Resumable — a team chat enters the sidebar history like a single-agent chat; you return to it any time.
- Discoverable mentions — typing
@opens a roster palette, so you never silently lose a misspelled@<id>.
The Three-Panel Window
Opening a team enters the group-chat window, which is laid out in three panels:
┌──────────────┬─────────────────────────────────┬──────────────────┐
│ Roster │ Message Flow │ Workspace │
│ (left) │ (middle) │ (right) │
├──────────────┼─────────────────────────────────┼──────────────────┤
│ 👑 leader │ 🦊 Fox │ [Artifacts] │
│ ● online │ ┌──────────────────────────┐ │ [Tasks/Kanban] │
│ 🦉 Owl │ │ message text │ │ │
│ ● working │ └──────────────────────────┘ │ ┌────────────┐ │
│ 🐢 Turtle │ │ merged follow-up message │ │ │ artifact │ │
│ ○ idle │ └──────────────────────────┘ │ │ task card │ │
│ │ 🦉 Owl │ │ ... │ │
│ │ ┌──────────────────────────┐ │ └────────────┘ │
│ │ │ message text │ │ (collapsible) │
│ │ └──────────────────────────┘ │ │
└──────────────┴─────────────────────────────────┴──────────────────┘Left — Roster
The team roster, with a leader badge on the team leader and a status dot per member (online / working / idle). This is the live membership of the team for this thread.
Middle — Message Flow (attribution bubbles)
The conversation, rendered as attribution bubbles in a classic-IM layout:
- Each incoming message shows an avatar (the agent's
emoji, falling back to a name-initial monogram) outside the bubble, the display name above the bubble, and plain text inside the bubble. - The avatar's background is a stable color derived from
hash(agent_id)— so a member keeps the same color regardless of roster order or membership changes. - Consecutive same-agent messages merge: when a message has the same
agent_idas the one above it, the avatar and name are hidden (the bubble is indented under the first), so a run of replies reads as one block. - Your own messages stay right-aligned with no avatar or name.
Avatar color is keyed on
agent_id, not roster index — adding or removing a member never re-colors anyone else.
Right — Workspace
A collapsible workspace with two tabs:
- Artifacts — deliverables produced during the conversation.
- Tasks / Kanban — the team's coordination tasks as a board.
Sidebar — Group Chats history
The chat sidebar gains a Group Chats section above the single-agent chats, sharing one scroll list:
- Each row shows a member-preview avatar cluster (the team's members, colored via
hash(agent_id)) and a last-message snippet as the subtitle. - The section is collapsible; if the selected agent is in no teams, it hides entirely.
- Clicking a row re-enters the team: it loads the roster, replays the chat history into the message flow, and subscribes to live team events. The sidebar row is the durable entry point — you come back by clicking the list.
@-Mentions
Typing @ in the composer (while in a team) opens a roster auto-complete palette:
- Each entry renders the member's avatar + display name + a grey
id, plus an@allspecial entry. - Filtering matches name or id, case-insensitively, against the text typed after
@. - Selecting an entry inserts the canonical
@<id>(or@all). Inside bubbles the literal@<id>token is kept and lightly highlighted — it is not rewritten to a name, so there is no ambiguity between same-named agents.
Mentions are resolved against the roster's agent_id; a token that doesn't match a member is simply not delivered.
Auto-Naming
A team created without a name (blank-named team) is auto-named by the LLM on its first message, so it shows a meaningful title in the Group Chats history instead of a placeholder.
RPC Layers
Group chat sits on two distinct RPC layers — keep them separate:
Team work-thread
The durable, per-team group-chat thread. Its history powers the attribution-bubble replay when you re-enter a team from the sidebar.
| Method | Purpose |
|---|---|
teams.chat.send | Send a message into the team's group-chat thread (fans out to members). |
teams.chat.thread | The team's work-thread (tasks / deliverables view). |
teams.chat.history | Replay the durable chat bubbles for a team, oldest-first. |
agents.teams returns each team's summary augmented with a small members_preview (for the avatar cluster) and last_message (for the row subtitle), so the sidebar avoids an N+1 of per-team lookups.
Group-chat session primitive
The lower-level session primitive that drives a live multi-agent conversation:
| Method | Purpose |
|---|---|
group_chat.start | Begin a group-chat session. |
group_chat.continue | Advance the session with the next turn. |
group_chat.end | End the session. |
group_chat.history | Read the session's message history. |
group_chat.list | List active / known sessions. |
group_chat.mention | Resolve / route an @-mention within the session. |
See Also
- Teams — leader, Team Strata planning, and Coord Tasks
- Agent Runtime — how individual agents work
- Arena — multi-agent collaboration workspace