Complete rewrite of the support bot to stateless architecture:
- State derived from group composition + chat history (survives restarts)
- Card dashboard in team group with live status, preview, /join commands
- Two-profile architecture (main + Grok) with profileMutex serialization
- Grok join race condition fix via bufferedGrokInvitations
- Card preview: newest-first truncation, newline sanitization, sender prefixes
- Best-effort startup (invite link, group profile update)
- Team group preferences: directMessages, fullDelete, commands
- 122 tests across 27 suites
- Group preferences applied once at creation, not on every startup
- /join restricted to team group only
- Team/Grok reply or reaction auto-completes conversation (✅)
- Customer message reverts to incomplete
- Card updates debounced globally with 15-minute batch flush
* simplex-chat-nodejs: add apiCreateMemberContact and apiSendMemberContactInvitation
* simplex-chat-nodejs: add integration test for apiCreateMemberContact and apiSendMemberContactInvitation
Test creates a 3-user group with direct messages enabled, then verifies:
- apiCreateMemberContact creates a DM contact between group members
- apiSendMemberContactInvitation sends an invitation that the recipient receives
* simplex-chat-nodejs: bump @simplex-chat/types to ^0.4.0
The @simplex-chat/types package (auto-generated from Haskell types) added
a required `userChatRelay: boolean` field to the NewUser interface, but
apiCreateActiveUser was never updated to pass it, causing a TypeScript
compilation error.
Set userChatRelay to false, which preserves the pre-existing behavior
(no chat relay provisioned for the new user profile).
* core: fix opening chats on new unread items (after sent or viewed items)
* fix test
* sqlite schema and query plan change
* fix postgresql, update schema
* stabilize tests
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
* fix: jump to quoted message in search and content filter
When tapping a quoted message during search or content filter,
scrollToItem bailed out silently instead of navigating to the message.
Load around the target without search/filter params using
openAroundItemId, which closes search/filter and positions at the
target.
Fixes the overly broad guard added in 219381f9 (#5315).
* remove logs
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
* directory: reflect search/filter state in URL hash
Show current view in the URL fragment so links can be shared
and browser Back/Forward navigates between views:
#active — active groups
#new — recently added
#q=… — search query
Button clicks push history entries; typing replaces state
to avoid flooding the history stack.
* refactor
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>