Features

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. 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 (Speed / Balance / Deep), web search toggle, code execution toggle. See Onnie AI → Chat modes for what each tier maps to.
  • 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.

Attachments

You can attach images (PNG, JPEG, GIF, WebP) and PDFs to any message. Click the + button in the toolbar and pick files (up to 20 MB per image, 32 MB per PDF, 8 attachments per turn).

Each attachment is uploaded to storage as soon as you pick it — a chip appears above the composer showing uploading… until it lands. Once the chip turns to its normal state, the file is ready to send. If an upload fails (wrong file type, too large, or network error), the chip turns red with a failed label; remove it and try again. The Send button stays disabled while any attachment is still uploading.

When you send the message, Onnie sees the attachments inline — images and PDFs are passed through to the model as visual content. The model can describe what's in an image, extract data from a PDF, or answer questions about either. Past attachments stay visible in the chat history; click an image to view it full-size, or click a PDF pill to open it in a new tab.

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.

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

ActionShortcut
Send messageEnter
Insert newline in composerShift + Enter
Global workspace searchCmd + 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.