5851c64ba1
Three related improvements to the IM-session experience: - Auto-generated titles: a new IM session starts untitled and gets a content-based title from its first message via the same GenerateTitleAsync flow web sessions use, instead of an identity title like "user · dm". Falls back to the identity title when the first message has no text. All platforms. - In-flight reply recovery (web chat): opening a session whose reply is still being generated on an IM channel made the web client attach via continue-stream and fail (the IM answer never streams through this server), flashing a "stream failed" toast and forcing a manual refresh. Treat a failed attach to an IM reply (channel === 'im') as recoverable — poll until it completes, then reload the thread; on timeout surface the standard error. Web/api replies keep the original behaviour, untouched. - Source-filter classification: the sidebar filter treats "web" as sessions with no IM mapping, but the list join excluded soft-deleted mappings, so /clear'd IM sessions leaked into the user's own web chats. Include soft-deleted mappings so a session ever bound to an IM channel stays under its platform. Adds a repository regression test.