Conversations
The Conversations section provides a complete history of all interactions between users and assistants. Every chat session, task execution, and email exchange creates a conversation record.
Browsing Conversations
Navigate to Conversations in the sidebar to see all conversations, ordered by most recently updated. Each entry shows:
- The subject of the conversation
- The assistant that participated
- The user or contact involved
- The originating channel (if any)
- The number of messages
- When the conversation was last updated
Click on a conversation to view its full message thread.
Searching Conversations
Use the search bar at the top of the conversations page to find past conversations by their content. The search looks across both message content and conversation subjects, returning results grouped by conversation with highlighted context snippets showing where matches were found.
Type a search term and click Search (or press Enter). Results display the conversation subject along with up to two matching message excerpts with the search terms highlighted.
Filters
Narrow results using the filter controls alongside the search bar:
| Filter | Description |
|---|---|
| Participant | Search by user name, contact name, or contact email |
| Assistant | Show only conversations with a specific assistant |
| Channel | Filter by originating channel (e.g. Slack, Postmark, Widget) |
| Date range | Restrict to conversations created within a from/to date range |
Filters work both with and without a search query. When combined with a search term, only conversations matching both the search and the active filters are shown.
Click Clear to reset all filters and return to the full conversation list.
Results are paginated — use the page controls at the bottom to navigate through large result sets. All active filters and search terms are preserved as you navigate between pages.
Conversation Detail
The detail view shows the complete message thread in chronological order. Each message displays:
- Role — Whether the message is from the user or the assistant
- Content — The full message text, rendered with markdown formatting
- Timestamp — When the message was sent
- Source — Where the message originated (text chat, voice, email, widget)
Conversation Sources
Conversations can originate from several places:
| Source | Description |
|---|---|
| Text Chat | Messages from the authenticated chat interface (admin or staff) |
| Voice | Transcribed messages from WebRTC voice chat |
| Messages received via the Postmark email channel | |
| Widget | Messages from visitors using the embeddable chat widget |
| Telegram | Messages from Telegram bot conversations |
| Slack | Messages from Slack direct messages |
| Task Run | Automated conversations created by scheduled task execution |
Associated Content
If an assistant created any deliverables during a conversation, they’re linked to that conversation. You can browse these from the Content section, which groups deliverables by conversation.
Session Lifecycle
Conversations have a defined lifecycle from start to end:
- Created — A new conversation starts (chat opened, email received, widget message, or task triggered)
- Greeting — If the assistant has a greeting message, it’s added automatically
- Messages — User and assistant exchange messages
- Processing — While the assistant is generating a response, the conversation is marked as “processing” (shown as a typing indicator in the UI)
- Content — The assistant may create deliverables during the conversation
- Ended — The conversation is explicitly closed (see below)
Ending a Conversation
A conversation can end in two ways:
| Trigger | Description |
|---|---|
| User-initiated | The user clicks the “End” button in the chat header (available in both internal chat and the widget) |
| Guided completion | A guided-mode assistant (guided_strict or guided_flexible) automatically ends the conversation when its scripted goal is complete |
Once ended:
- The conversation shows an “Ended” badge
- The input area is replaced with a message indicating the conversation has ended and a link to start a new chat
- No new messages can be sent
- If feedback is configured for the channel, the post-session feedback form is shown
- New messages from the same user/contact start a fresh conversation
Ended conversations remain visible in the conversation list and can be reviewed at any time.
Loading States
While the assistant is processing a response, the chat UI shows:
- An animated typing bubble with bouncing dots
- A “Thinking…” label next to the bubble
- The send button and input are disabled to prevent duplicate messages
- If processing takes longer than 60 seconds, a timeout warning appears: “This is taking longer than usual…”
The widget shows similar loading states, plus skeleton placeholders (animated shimmer bars) while conversation history is loading.
Technical Details
Conversation state — Beyond its messages, each conversation carries persistent state that drives system behavior. The processing flag enables real-time UI updates (the thinking indicator). For guided conversations, a guided_progress JSON structure tracks which script questions have been answered, which are still pending, and the overall status — this is injected into the system prompt on each turn. The activated_skill_ids field records which skills the assistant has loaded during this conversation, so they persist across turns without re-activation.
Session lifecycle fields — The ended_at timestamp is NULL for active conversations and set when the session ends. The end_reason field records why the conversation ended: "user_ended" for manual closure or "guided_complete" for automatic completion of guided scripts. These fields determine whether new messages are accepted and whether the feedback form should be shown.
Delegation tracking — When an assistant delegates to another assistant, the delegated work runs in a child conversation linked to the parent via parent_conversation_id. The delegation depth is tracked to enforce a maximum depth of 3, preventing infinite delegation chains.
Message dual storage — Messages store two representations of their content. The content field holds display-friendly plain text for the conversation list and detail view. The content_json field holds the full structured blocks — text, tool call inputs, tool results, and thinking text — preserving the complete agent interaction for the API log viewer.
Conversation indexing — Completed conversations can be indexed into the project’s knowledge base. The system summarizes the conversation, chunks the text, generates vector embeddings, and stores them as searchable knowledge. This means insights from past interactions become available to future conversations through semantic search.