Conversations
The Conversations screen (/conversations) is the global browse view across every instance and every channel.
Listing
- Pagination. 20 conversations per page (
PAGE_SIZEinpackages/web/src/app/(admin)/conversations/page.tsx). - Search. Full-text search over message content. Implemented as PostgreSQL FTS with the
simpleconfig (no language stop-words) so multilingual content works. - Filters. Single drop-down to filter by instance — there is no date-range filter and no channel filter on the list page.
- Columns. Title (auto-generated), instance, channel, message count, last activity, status.
The list is ordered by last-activity desc by default. Click a column header to sort by another field.
Conversation detail
Click a conversation row to open the detail view. You see:
- Header. Title, instance, channel, conversation id (copyable), open/closed, language detected.
- Metadata grid. Started at, last message at, message count, total tokens (in/out), estimated cost.
- Message list. Each message displays role (
user,assistant,tool,system), content, and timestamp. - Tool calls. Tool calls are rendered inline under the assistant message that issued them, with the tool name, arguments, return value, and duration.
- Attachments. Photos and PDFs from WhatsApp/Telegram appear inline when the engine has S3 storage configured (
PLATFORM_S3_*env vars).
Conversation state
Besides its messages, a conversation carries a state store: a small key/value blob that tools and hooks read and write during a turn. It is how one tool hands a derived value (a resolved customer id, a field mapped in from an HTTP-channel payload) to the next tool or to the next turn, without routing it through the model.
- The store is read once per turn; writes are buffered and flushed when the turn commits, so a failed turn does not leave half-written state.
- Concurrent turns on the same conversation merge per key rather than overwriting the whole blob.
- It is not in the prompt by default. Turning on Conversation state in prompt (Settings) renders a truncated, read-only view into the turn so the model can see the known facts; the store stays the source of truth either way.
GET /api/conversations/{conversationId}/state returns the current blob (permission conversation:read).
Hook executions
GET /api/conversations/{conversationId}/hooks returns the lifecycle-hook executions recorded for the conversation: event, function, success, duration, and any control signal the hook requested. Use it to confirm whether a hook fired on a given turn and what it did. See Hooks.
Per-message debug payload
When an agent has Debug payload enabled (Settings), GET /api/conversations/{conversationId}/messages/{messageId}/debug returns the exact LLM request behind that assistant turn — full system prompt, messages array, and tool definitions. It is off by default because it stores personal data at rest.
Deletion
Delete a single conversation from its detail page (top-right, Delete button), or bulk-delete from the list (select rows, Delete selected). Deletion cascades in one transaction: messages, AI-gateway call logs, pipeline traces, tool audit logs, governance events, hook executions, memories extracted from the conversation, its state store, and its encrypted per-conversation credentials.
The same cascade runs unattended when an agent has a retention policy.
Tip. When auditing, export the conversation first (the Export JSON button in the detail view), then delete. Exported conversations are full-fidelity dumps including system prompts and tool internals.