Chat UI
The chat UI is where you talk to every agent in Onnie. Onnie AI, Onniebots, and the Superagent all use the same surface — the same composer, the same message list, the same thread structure.
The chat surface
The chat pane lives in the right-hand column of the desktop layout. It has three main areas:
- Header strip — shows the bot name and avatar (or the bot picker before you send your first message), plus the chat title and actions.
- Message list — the scrollable history of turns. User messages appear right-aligned; bot messages appear left-aligned with inline artifact cards for Tasks, bots, images, and other entities.
- Composer — the text editor at the bottom, with a toolbar row above it for settings, attachments, and the send/stop button.
When a chat has not started yet, the message area shows an empty state: a time-of-day greeting, starter prompt chips, and a tier upgrade CTA if applicable. Once the chat is open, the message list takes over.
The chat browser panel is a left-side aside that lists all your past chats, bucketed by recency. Open it from the app icon rail. It has a search input and filter chips (All / Starred / Archived).
Composing a message
Type in the editor at the bottom of the chat pane. The composer is a rich text editor — it supports plain text and inline references.
Inline references let you link workspace entities directly in your message. The format is [label](ref:type:id), where type is the entity type and id is the entity UUID or alias. For example, linking a project:
[My Project](ref:project:550e8400-e29b-41d4-a716-446655440000)
When Onnie AI sees a reference to a project, page, table, or record in your message, it scopes its context to that project automatically. See References for the full reference format and supported entity types.
The toolbar row above the editor holds:
- Settings popover (left) — tier (
fast/pro), variant (standard/high), web search toggle, code execution toggle. - Plus popover (left) — attach a file, insert a snippet, open the prompt template picker.
- Context cell (right) — token usage for the current execution. Shows input / output / cache breakdown.
- Send / Stop button (right) — sends the message or cancels an in-flight turn.
To cancel a running turn, click Stop or use the keyboard shortcut. The engine receives a cancel signal and stops the loop at the next iteration boundary.
Reading agent output
Agent output arrives in two phases:
Live text — while the agent is working, text chunks stream in over the WebSocket and accumulate in the bot message area. A trace tail appears below the message showing what the agent is doing ("Onnie is searching projects…", "Onnie is creating a task…"). A status pill in the composer area shows whether the agent is streaming or waiting for your input.
Committed messages — when the engine writes the completed turn to engine_messages, the live text is replaced by the authoritative message. Each bot message can contain:
- Plain text rendered as markdown (headers, code blocks, tables, lists).
- Artifact cards — inline cards for entities the agent created or referenced: Tasks, bots, images, pages. Task cards include approve/reject actions when the task is awaiting approval.
- A question card when the agent calls
request_input— a structured form for clarification, approval, or multi-part questions. Submit your answer directly from the card; the turn resumes.
If the agent generates an image, it appears inline in the bot message as an image card.
The WebSocket is a render hint. If the connection drops mid-turn, the live text clears and the message list reloads from the persisted state in Supabase — you won't lose committed output.
Threads, history, and search
Each chat is a persistent thread tied to one bot. The thread's full history is stored in engine_messages and loads when you open the chat. Long threads are handled via a checkpoint stored on Cloudflare R2 — the engine rehydrates from the checkpoint on reconnect, so the full history is always available.
You can:
- Star a chat to pin it to the Starred filter in the browser panel.
- Rename a chat — double-click the title in the header, or use the row action in the browser panel.
- Archive a chat to remove it from the default view without deleting it.
- Delete a chat to remove it permanently.
Search in the browser panel filters by chat title and bot name. Full-text search across message content is not yet available.
Each bot is locked to the chat it was started with. To switch from Onnie AI to a Onniebot (or between Onniebots), open a new chat and select the bot in the picker before sending your first message.
Keyboard shortcuts
| Action | Shortcut |
|---|---|
| Send message | Enter |
| Insert newline in composer | Shift + Enter |
| Global workspace search | Cmd + K / Ctrl + K |
The Cmd + K shortcut opens the global search palette (not the prompt picker). From there you can navigate to a chat, create a new one, or search across the workspace.
The send button in the toolbar is always available as an alternative to Enter; the stop button appears in place of send while a turn is in flight.