231e613d3d
Bot Mode always hides canonical 'Bot Chat' sessions, but _find_bot_chat's GET /api/sessions listing used the default include_hidden=False path, so the existing hidden row was invisible, _ensure_bot_chat tried to create a duplicate, and the peer DB's UNIQUE(title) guard rejected it — DM failed. - api_server: GET /api/sessions now accepts an exact-title lookup (?title=...) and honors include_hidden=1 ONLY alongside a title filter, so canonical hidden rows resolve without exposing a blanket hidden listing on the client surface. The title needle is pushed into SQL (search_query) so old hidden rows outside the recency window are found. - peer dm client: _find_bot_chat sends title + include_hidden=1; older peers ignore the unknown params and degrade to today's behavior. - Clear diagnosable error on the older-peer duplicate-create rejection, naming the hidden canonical chat and the PATCH hidden:false workaround. - Unit tests (hidden resolution, no duplicate create, older-peer error, older-peer visible fallback) + real-gateway E2E over a real state.db. Root-cause analysis and regression recipe by @kubaboski in #91583. Fixes #91583