Added
- Say how far a Baileys connection had got when it closed: the
baileys_connection_droppedlog line carriesstageandaliveMs, andlastErrorof a reconnect-looping session ends with a sentence naming the stage. - Warn once per connection when WhatsApp asks for a passkey to finish a Baileys link (
action=baileys_passkey_required); the link stalled with no word of why (#560). - Report a passkey request on a Baileys link as a
passkey_requiredrestriction: it reachesGET /api/sessions/{sessionId}, thesession.restrictionwebhook and the dashboard with no status change, and is lifted when a link reachesready. - List the
passkey_requiredrestriction kind in the JavaScript, Python, Go and Java SDK types. - Accept
inlineMediaon the MCPMessageListtool, so an agent can list messages without the base64 of their media, asinlineMedia=falsedoes onGET /api/sessions/{sessionId}/messages; unset keeps the media inline. - Accept an
idempotencyKeyon the eleven MCP send tools, asIdempotency-Keyworks on the REST send routes: a retry with the same key and arguments returns the first result instead of sending again. - Accept the REST message-list filters
after,direction,type,since,until,orderByandmessageIdon the MCPMessageListtool, andtypeonMessageSearch.
Changed
- Log the restart WhatsApp asks for right after it accepts a Baileys link (close
515) asbaileys_link_restart, where it was logged as a dropped connection. - The MCP
SessionGetPresencetool answersobservedAtas an ISO date-time, asGET /api/sessions/{sessionId}/presence/{chatId}does, where it answered unix milliseconds. - Refuse an MCP tool argument the tool does not name, an unknown key inside
customLinkPreviewincluded, withUnrecognized key: "x", where it was dropped and the call ran without it; the published input schemas now sayadditionalProperties: false. - Carry the
codeof an HTTP error, such asIDEMPOTENCY_KEY_IN_PROGRESS, in an MCP tool error, which returned only its name and message. - Show a session restriction on the dashboard card of a session that is waiting for a scan or a pairing code, where the pairing placeholder showed none.
- The amd64 image's Chrome for Testing 157.0.8103.38 to 157.0.8103.50, picking up the browser security fixes released since; the arm64 image keeps the chromium package Debian ships.
- Refuse an MCP tool call whose arguments hold more than 10,000 array items and object keys before validating them, where a map of tens of thousands of entries with one wrong value was answered with an issue per entry, megabytes of text.
- Refuse a
fromfilter of more than 255 characters on the MCPMessageListandMessageSearchtools, aschatIdalready is.
Fixed
- Stop an abandoned or cut-off Baileys inbound media download from crashing the gateway with
TypeError: terminated, by tying the response body to its decrypting stream in a new install-time patch (#2034). Thanks @voidm4p. - Cut the text of an MCP tool error and its log line at 4096 characters, so a long id a caller sent (a group id, a webhook id, a phone number) no longer comes back whole.
- Accept
linkPreviewon the MCPMessageSendTemplatetool, as send-template does over REST, and say in both text tools that Baileys attaches a preview only fortrue. - Answer 404 for an MCP
GroupFindAllcall on an unknown session, asGET /api/sessions/{sessionId}/groupsdoes, where it answered 400Session is not started. - Return an MCP tool result of up to 32 KiB as text, where anything over 4 KiB was offloaded to a base64 resource that Claude Code saves to a local file and shows the model only as a path.
Documentation
- Add a troubleshooting entry for a Baileys link that is accepted and never becomes
ready: what a first login does, and how to tell which step fails. - State in
CONTRIBUTING.mdanddocs/08-development-guidelines.mdthat the dashboard unit tests need Node.js 22.22.2+ on 22, 24.15+ on 24 or 26+ (jsdom), above the Node.js 22.19 floor of the gateway. - Document in
docs/24-mcp-integration.mdhow an MCP result over the inline limit and a long tool error are shaped and that tool calls are not forwarded between nodes. - Say in the README and
.env.examplethatMCP_READONLYmounts only the read tools unless set tofalse. - Name the fields of a
GroupFindAllentry in the MCP tool description. - Correct
docs/24-mcp-integration.md: with MCP disabled only the MCP module and SDK are skipped, the tool registry is still built. - Correct the MCP result limit (32 KiB) and the argument rule in
docs/06-api-specification.md, and list the changes to MCP answers in the upgrade hazards ofdocs/14-migration-guide.md.
Dependencies
- Update
undicito 8.12.4, which fixes six advisories in its cache and redirect interceptors and infetchintegrity checks; the gateway uses none of those features. - Update
@aws-sdk/client-s3to 3.1163.0,bullmqto 6.7.1,@bull-board/api,@bull-board/expressand@bull-board/nestjsto 9.11.0 and@nestjs/swaggerto 11.4.8 in the gateway. - Update
@tanstack/react-queryto 5.107.1,i18nextto 26.7.2,i18next-browser-languagedetectorto 8.3.0,lucide-reactto 1.70.0,react-i18nextto 17.1.13 andyet-another-react-lightboxto 3.33.0 in the dashboard bundle. - Update
jsdomto 31.0.0 in the dashboard tests; the restart progress test compares the bar width numerically, since jsdom now rounds style numbers to six digits. - Update
eslintto 10.14.0 andglobalsto 17.14.0 in the gateway and the dashboard,viteto 8.3.6 and@vitejs/plugin-reactto 6.2.1 in the dashboard andvitestto 5.1.0 in the JavaScript SDK; these are build, lint and test tooling only.
Upgrade notes (behavior changes)
- An MCP tool call that carries an argument the tool does not declare, an unknown key inside
customLinkPreviewincluded, is refused withUnrecognized key: "x", and the published input schemas sayadditionalProperties: false; before, the argument was dropped and the call ran without it, so a misspelledquotedMessageIdsent the message unquoted. - MCP arguments that were dropped before now take effect:
idempotencyKeyon the eleven send tools (a key reused for a different send answersIDEMPOTENCY_KEY_REUSED, and a retry after a failure that may have sent answersIDEMPOTENCY_OUTCOME_UNKNOWN),linkPreviewonMessageSendTemplate, the filtersafter,direction,type,since,until,orderByandmessageIdonMessageList, andtypeonMessageSearch. Send a fresh key for each intended send and drop a filter the caller did not mean to apply. - An MCP call whose arguments hold more than 10,000 array items and object keys, or a
fromfilter of more than 255 characters onMessageListorMessageSearch, is refused; before, neither had a limit. - The MCP
SessionGetPresencetool answersobservedAtas an ISO date-time, asGET /api/sessions/{sessionId}/presence/{chatId}does, where it answered unix milliseconds. - The MCP
GroupFindAlltool answersNotFoundExceptionfor an unknown session, asGET /api/sessions/{sessionId}/groupsdoes, where it answeredBadRequestException(Session is not started); a session that exists and is not started still answers that. - An MCP tool result of up to 32 KiB arrives as one
textblock, where anything over 4 KiB was an embedded base64resource; a larger result is still offloaded. A tool error carries thecodeof an HTTP error, and its text is cut at 4096 characters. - A new restriction kind,
passkey_required, reachesGET /api/sessions/{sessionId}, thesession.restrictionwebhook and socket event, the dashboard, theopenwa_sessions_restrictedgauge and an audit row when WhatsApp asks a Baileys link for a passkey, where nothing was reported. The status does not change and a link that reachesreadylifts it; a stop, start or logout does not, so delete the session or restart the gateway to drop it. A client with a closed list of kinds must accept the new value. - The close WhatsApp asks for right after it accepts a Baileys link (code
515) is logged asbaileys_link_restart, notbaileys_connection_dropped; that line gainsstageandaliveMs, thereconnect_loopwarning gainsstageandstatusCode, and thelastErrorof a reconnect-looping session ends with a sentence on where the last connection closed. A filter or alert onaction=baileys_connection_droppedno longer matches the restart, and a consumer should match the start oflastError.