Repository navigation
🔒 Your conversations stay yours — and channels that talk back
Released 2026-10-19
This release fixes a security issue in the chat widget, reported by Patrick Cornelißen (KIberblick) and published as GHSA-rfh4-6ghv-m2rr. Every install should upgrade. It also brings interactive messages to WhatsApp, Messenger, Instagram and Telegram, lets you connect WhatsApp and Messenger through your own Meta app, and adds an end-to-end test suite that found and fixed a long list of bugs.
Security
Typing an email no longer opens someone else's chat — GHSA-rfh4-6ghv-m2rr (High)
On a widget without token authentication, which is the default, a visitor could type an existing customer's email and get a token for that customer's open conversation: read it and reply as them. An email someone types proves nothing, but the widget treated it as identity.
Widget tokens now carry a key for the browser that started the conversation, and every conversation records the key that created it. A typed email still links a visitor to the same customer, so the inbox keeps showing one person, but it only ever reaches conversations started from that browser. The same rule closes the related routes:
- Pre-claimed addresses. Once your site signs a person in through
/generate-token, a token the widget issued earlier, from an address someone typed, can no longer stand for them. - Lead capture. A visitor can't merge a known customer away, or be merged into one, by typing an email. Nothing is recorded against a customer they don't own.
- Customer details. The contact form, workflow forms and ticket capture only change a customer the visitor's own browser created, and the AI only repeats a stored name or email inside that customer's own conversation.
- Tickets. A ticket opened from a conversation that can't speak for its customer carries no customer, so the investigator never looks up or quotes their records.
Visitors your site signs in with /generate-token resume their conversations as before, across devices.
What visitors will notice: a visitor who types their email in a new browser starts a fresh chat, and the inbox still shows them as one person. Widget visitors are no longer merged into an existing customer by a typed email, and direct iframe embeds start a fresh chat on each reload. Visitors in the middle of a conversation when you upgrade start a new one once.
agno no longer reports agent runs to its own servers
agno sends a report for every agent run to api.agno.com unless told not to, and it waits for that call inside the run. When the call was slow, the run ran out of time and the visitor got "I encountered an error" instead of an answer. It is now off by default for every agent and worker. To opt in, set AGNO_TELEMETRY=true (or AGNO_MONITOR=true) in backend/.env.
Channels
- WhatsApp interactive messages and delivery receipts (#349). Replies can carry buttons and lists, and the inbox shows sent, delivered and read.
- Reply buttons on Messenger, Instagram and Telegram (#352), behind a per-agent switch.
- Your own Meta app (#364). WhatsApp numbers and Messenger Pages connected with your own Meta app credentials now receive messages through a per-account webhook.
- Accounts that need reconnecting are flagged (#369) when Meta or a provider stops accepting their access.
- Extension points for external apps on channel conversations (#350).
Fixes
- Shopify only shares an order with the email it was placed with (#348), and the
read_all_ordersscope is mirrored (#363). - Product prices show the currency's decimals in the widget (#351).
- A widget socket without a customer is refused with a reason the widget acts on, instead of failing on the insert (#362).
- Setup wizard: readable errors, a recoverable Teach step and an honest crawler status (#361). New signups get guided to a live agent (#359).
- A taken organization domain returns 409 instead of 500, and
localhostis refused (#358). - One shared SMTP config builder for every email sender (#354).
Testing
A Playwright end-to-end suite now drives the real dashboard, widget and backend against a throwaway database and a fake model (#355, #357, #366). It covers the widget, handover, tickets, leads, workflows, every channel and the integrations, and it found and fixed the bugs listed in #357. The API is fuzzed with Schemathesis 4 (#367).
Upgrading
Pull, rebuild and restart as usual. The migration session_conversation_key_001 runs on start: it adds conversation_key to sessions and customers, plus an index on session_to_agents.customer_id built without locking the table. If a start dies while that index is building, drop ix_session_to_agents_customer_id and start again.
Thanks to Patrick Cornelißen for the report and for his patience while we built the fix properly.