v8.8.0
livekit/agents-jsv8.8.0Jun 19, 2026by github-actions[bot]
AI Summary
This feature release significantly enhances the Chatwoot integration with Evolution-API parity, adds session correlation to webhooks, and fixes critical WhatsApp media handling and error retry logic.
Key Highlights
- Chatwoot Evolution-API Parity: Auto-provisioning, message edits/deletes, conversation reopening, and durable retry queues.
- Session ID in Webhooks: Added `session_id` to payloads for multi-tenant event correlation.
- Honest 463 Handling: Removed futile retry logic for WhatsApp's reach-out timelock.
- Media URL Fixes: Returns public URLs for downloaded media and fixes chat-list name fallbacks.
New Features
- Chatwoot auto-provisioning and message threading
- Session ID in webhook payloads
- Saved contact name resolution in Chatwoot
- Public URL for downloaded media
Full Release Notes
## What's New in v8.8.0 đ **Minor Release: Chatwoot Evolution-API Parity, Session-Aware Webhooks, Honest 463 Handling & Media URL Fixes** This release lands a major Chatwoot integration overhaul (auto-provisioning, edits/deletes, conversation reopen, a durable retry queue, and device-scoped routing), adds session correlation to webhooks plus JIDs to app responses, stops masking WhatsApp's server-side 463 reach-out timelock behind a futile client retry, and fixes downloaded-media URLs and chat-list name fallbacks. --- ## ⨠New Features ### Chatwoot Evolution-API Parity - Auto-provisions (or reuses) an API-channel inbox on startup and resolves its id automatically (`CHATWOOT_AUTO_CREATE`, `CHATWOOT_INBOX_NAME`, `CHATWOOT_WEBHOOK_URL`) - Forwards message edits, revokes, and deletes to Chatwoot as threaded notes, with bidirectional WhatsAppâChatwoot markdown and reply/reaction threading via the `WAID:` source-id convention - Reopens/reuses a conversation for returning contacts across both the REST and direct-DB import paths (`CHATWOOT_REOPEN_CONVERSATION`, `CHATWOOT_CONVERSATION_PENDING`), plus a `CHATWOOT_IGNORE_JIDS` ignore list - Routes agent replies back through the resolved device (no cross-account mis-delivery in multi-device deployments) and replays transient WhatsAppâChatwoot failures from a durable retry queue - Adds agent signature support (`CHATWOOT_SIGN_MSG`/`CHATWOOT_SIGN_DELIMITER`), degrades to text when an inbound media download fails instead of dropping the message, and expands unit coverage (chatwoot 22%â58%, pgimport 28%â74%) ### Saved WhatsApp Contact Name in Chatwoot (#714) - Resolves the saved address-book name (`FullName` â `PushName` â `BusinessName`) from the local WhatsApp contact store for 1:1 chats, instead of surfacing the bare phone number - Prefers it over the event pushname for both incoming and outgoing 1:1 chats, falling back to pushname then the phone identifier (fixes #688) ### Session ID in Webhooks & JID in App Responses (#717) - Webhook payloads now include `session_id`, resolved from the device JID at the single forward chokepoint, so multi-tenant events can be correlated back to the session registered via `POST /devices` (closes #578) - `GET /app/status` and `GET /app/devices` now return the WhatsApp `jid` alongside `device_id` - `device_id` stays the JID for backward compatibility; `session_id` is omitted when the JID isn't mapped - Documented in `openapi.yaml` and the webhook payload docs --- ## đ Bug Fixes ### Honest WhatsApp Error 463 Handling (#708) - Removes the client-side pre-warm + token-wait + one-shot retry around error 463 (`NackCallerReachoutTimelocked`), which re-sent without a usable token and simply 463'd again, adding latency and a second reach-out attempt - Error 463 is WhatsApp's server-side reach-out timelock: the trusted-contact token can only arrive from the recipient (inbound message, privacy-token notification, or history sync), so whatsmeow's built-in tctoken lifecycle is the only correct path - Keeps the 463â429 mapping and rewrites `WA_REACHOUT_TIMELOCK` guidance to describe the restriction and its real remedies ### Public URL for Downloaded Media (#716) - Media download responses now return the public URL for the saved file - Aligns the media-download device context in the REST path ### Chat-List Name Fallback (#715) - `ListChats` and `GetChatMessages` now fall back to a JID-derived label when the stored chat name is empty (phone number for 1:1, `Group <id>` / `Newsletter <id>`, and `Status` for `status@broadcast`) - Fixes blank names for chats persisted before a pushname/group subject was known (fixes #675) ### Chatwoot pgimport UUID Cast (#724) - Drops the `::text` cast on `gen_random_uuid()` for the uuid-typed `conversations.uuid` column - Fixes the INSERT failing with `column "uuid" is of type uuid but expression is of type text` on strict/default Chatwoot schemas, which had dropped every chat whose contact was newly created --- ## đ§ Technical Improvements ### Documentation & Tooling - Refreshed the `AGENTS.md` hierarchy for the current branch, runtime paths, Chatwoot conventions, and release workflow - Added an `update-release-note` agent skill ### Dependency Updates - `go.mau.fi/whatsmeow`: refreshed to latest across several updates - Related Go dependency checksums refreshed through `go.mod` / `go.sum` --- ## What's Changed * fix(chatwoot): use saved WhatsApp contact name instead of phone number (#688) by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/714 * fix(chatwoot): trim whitespace from API token and URL (#674) by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/713 * fix(chat): fall back chat-list name to phone number when empty (#675) by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/715 * feat(api): add session_id to webhooks and jid to app responses (#578) by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/717 * fix(media): return public URL for downloaded media by @aldinokemal in https://github.com/aldinokemal/go-whatsapp-web-multidevice/pull/716 * feat: chatwoot integration updates by @aldinokemal * fix(send): stop retrying WhatsApp error 463 and surface it honestly by @aldinokemal * fix(chatwoot): drop ::text cast on conversation uuid in pgimport by @aldinokemal * chore: update whatsmeow to latest by @aldinokemal **Full Changelog**: https://github.com/aldinokemal/go-whatsapp-web-multidevice/compare/v8.7.0...v8.8.0