Open the agent (⌘K or click "Ask Kodori") and notice the persistent state — every conversation is saved server-side and listed in the History rail visible when you click "Expand" in the drawer header.
The History rail has a search input above the conversation list. Type any keyword (or quoted phrase, or `-exclusion`) and Kodori runs a Postgres full-text search across every message you've authored or received in this workspace, returning ranked matches with a snippet showing the matched terms in context. Empty the input to fall back to the recent-first conversation list.
What's there:
- **History rail** (expanded mode) — your past conversations newest-first, capped at 50. The active one is highlighted; click any row to switch threads. Hover over a row to surface a small × that soft-deletes the conversation from your sidebar. Soft-delete keeps the rows in place so the audit log stays attributable; if you need a hard delete (e.g. a compliance request), email hello@kumokodo.ai. - **"+ New" button** in the drawer header starts a fresh conversation without losing your view. Use it when you're switching topics — keeping unrelated questions in separate threads makes the rail easier to navigate. - **Footer usage strip** ("Questions 12 / 600 · Opus 3 / 120 · Team →") shows your monthly cap utilization. Pills go amber at 80% and red at 100%; the link on the right opens /settings/billing. Hidden when usage is unlimited (Enterprise plan).
Persistence shape:
- Conversations are **per-user, not per-tenant**. Your queries about a privileged matter aren't visible to teammates just because you share a workspace. Document-level permission trimming still applies inside any conversation regardless of who hydrates it — if the agent's tool calls fetched a doc only you could read, replaying that conversation with a different account wouldn't surface it. - The user message persists BEFORE the stream starts and the assistant message persists when the stream completes. An interrupted stream (network drop, browser crash) still leaves your question in the thread so reloading shows it and you can re-ask without retyping. - Title is the truncated first user message. A future iteration may auto-summarise into tighter labels; for now what you see in the rail is what you typed.
The conversation system uses the AI SDK's native message shape on disk so a stored thread hydrates directly into useChat without translation. That's why tool-invocation cards (the collapsible "tool · searchKeyword ✓" blocks) re-render identically when you load an old conversation.