Agent conversations
Every contact, company and deal has an Agent tab — a conversation with the research agent, scoped to that record.
What you can ask
Open the tab and type. The agent answers from everything it can read about the record — emails, meetings, its own research, and your CRM history:
- "Who is this person?"
- "Have we talked to them before?"
- "What should I know before this call?"
- "Where does this deal stand?"
A contact is asked "Who is this person?", a company "What do they do?", a deal "Where does this stand?" — the questions offered on an empty thread are the tell that the panel is built into the record rather than bolted on.
It opens already knowing the record
A conversation doesn't spend its first two answers finding out what it's looking at. A deal session starts knowing the stage, the amount, the close date and who's on it; a company session can name its own contacts, with ids. The record travels to the agent in a signed 2-minute token, never as text prepended to your message — so your question stays yours.
A conversation is a question, not a work plan
Told nothing, the agent assumed every session was a research pass with a budget — which is how a question once got a work plan back. It now knows whether a session was opened by the dispatcher (research) or by a rep in the sheet (a conversation), and answers accordingly.
Conversations are kept
A record accumulates conversations, and they survive a reload.
| Resume | Reopen the record — the tab picks up the last thread with its full history above the composer. Works across a reload or a link sent to a colleague later. Sessions are kept for 30 days. |
| Start new | Once a thread has clearly ended, the tab offers Start a new conversation. The old thread stays visible above; a fresh one begins below. |
| Delete | Remove an old conversation from the conversation picker if you don't want it kept. |
| Which thread is open | Lives in the URL (?thread=), like every other view state in the sheet — a refresh keeps your place. |
| Scoped to you | Two people asking about the same contact are having two separate conversations. |
Offline vs. working
An ended thread offers a button, not a locked box — it's a permanent state, not a wait of seconds. An unreachable agent reads as offline, and the transcript is served from the CRM's own event archive (which is also what keeps a thread older than 30 days readable), with the composer still usable.
Turning it on
Same value in both the app and the API processes, from the one root .env:
AGENT_URL="http://127.0.0.1:2000" # the default
AGENT_BRIDGE_SECRET="$(openssl rand -base64 32)"AGENT_BRIDGE_SECRET unset means the bridge refuses rather than opens — the panel stops working, the agent keeps running its own schedule. An optional capability's absence never widens access.
| Symptom | Cause |
|---|---|
503, "not configured for this install" | AGENT_BRIDGE_SECRET unset in the app's process |
401 | The two processes hold different secrets |
502, "not reachable" | The agent isn't running, or AGENT_URL is wrong |
AGENT_URL defaults to 127.0.0.1 rather than localhost on purpose: the agent listens on IPv4 only, and Node resolves localhost to ::1 first.