* Add agents RHS functionality for mobile
Implements a dedicated agents interface accessible from the home screen, featuring:
- Agent chat screen with bot selector and message input
- Thread list screen showing all agent conversations
- Remote actions for fetching bots and threads from plugin API
- Navigation between chat, threads, and individual conversations
- Integration with plus menu for easy access
Follows similar pattern to playbooks with modal screens and navigation helpers.
* Fix icon name for agents menu item
Change robot-happy-outline to robot-happy to resolve PropType validation error.
* Add agents button to sidebar and fix agent chat issues
- Add AgentsButton component to channel list sidebar below Drafts
- Fix thread navigation to use fetchAndSwitchToThread instead of switchToChannelById
- Replace custom TextInput with PostDraft component in agent_chat
- Fix icon name from message-reply-text-outline to reply-outline
- Add missing i18n translations for agents UI
* Implement automatic navigation to thread after sending agent message
* Implement bot selector bottom sheet with avatars. Replace click-and-cycle behavior with a proper bottom sheet menu showing all available agents with their profile pictures. Add bot avatar display to the dropdown button for better visual identification.
* Top bar design modifications.
* Add intro graphic and text
* Fix autocomplete not working
* Tweak styles and icons.
* Remove unused
* Add version/enabled check
* Remove excessive agent button
* Style fixes
* Use non-blocking then() for onPostCreated callback in send message hook
* Add unit tests for agents product components and actions
* Review feedback, offline support
* I18n
* Tests
* Address PR review feedback: deletion handling, UI fixes, schema docs
* Remove unnecessary deleteNotPresent flag from agents handlers
* Fix agents archived channel, empty data guard, and stale relative time
* Add smoke test for AgentChat and extend ToolCard test coverage
* Fix test quality issues: remove useless tests, strengthen assertions
* Address PR review: remove barrel file, add version comment
* Mock reanimated in CitationsList test to fix CI failure
* Fix CitationsList tests after always-mounted animation change
* Address PR review: typography, Pressable, FormattedText, schema bump, and cleanup
* Apply CLAUDE.md patterns across agents codebase: Pressable, typography, FormattedText, logDebug
* Fix schema test to expect version 19
* Add support for Channel Summarization, inline citations
* Add support for Channel Summarization, inline citations
* Revert package-lock to master
* i18n fixes
* e2e fixes
* Remove a few tests as they're already covered by unit
* Ensure channel summary is offline compatible
- Add channel persistence check before switching to summary channel
- Fetch and persist channel/membership if not in database
- Fix TypeScript error handling for unknown error types
- Update tests to properly mock DatabaseManager
* Fixes
* Fix expo-image patch file - remove accidental build artifacts
The patch file was accidentally corrupted with build artifacts from
node_modules/expo-image/android/build/ including .dex files, results.bin,
and Oops.rej. This was causing the 16KB page size compatibility patch
to fail during CI.
* Fix iOS date picker spacing and placeholder text
- Increase snap points on iOS to accommodate inline date picker spinner
- Update AI prompt placeholder to "Ask AI about this channel"
* Fix padding
* Address PR review feedback from larkox
- Fix i18n: use defineMessages pattern instead of separate labelId/defaultLabel
- Replace custom SummaryOptionItem with existing OptionItem component
- Add ScrollView for scrollability on smaller phones
- Extract AgentItem to separate file, use FlatList for virtualization
- Extract DateInputField component, unify DateTimePicker, add useCallback
- Consolidate types into app/products/agents/types/api.ts
- Remove unnecessary fetchPostById (WebSocket handles post delivery)
- Use jest.mocked() instead of 'as jest.Mock' for type safety
- Improve transform.ts: use urlParse, add post ID length constraint,
validate internal links with serverUrl parameter, add subpath support
- Add transform.test.ts cases for external links, subpaths, URL encoding
- Remove unnecessary Platform.select in inline_entity_link
- Revert video_file.tsx and prefetch.ts to use cachePath (patches include types)
* Update en.json with new channel summary option translations
Added missing translation keys for the defineMessages pattern used
in channel summary sheet options.
* Fix regex patterns and add negative assertions per PR review
- Use exact 26-character constraint in post ID regex instead of
permissive pattern followed by validation
- Use specific identifier pattern in channel regex instead of [^/]+
- Remove unused ID_PATH_PATTERN and IDENTIFIER_PATH_PATTERN imports
- Add negative assertions to processInlineEntities tests to verify
mutual exclusivity of link vs inline_entity_link nodes
* Add test cases for non-internal URLs and escaped slashes
Per PR review feedback, added tests for:
- Non-internal URLs with similar shape to internal links
- URLs with escaped slashes (%2F) in various positions
* Improve UI consistency for channel summary date picker and AI input
- Add focus state (border highlight) to AI prompt input on Ask Agents sheet
- Add active state highlight to Start/End date fields in date range picker
- Increase back button tap area on date range picker using hitSlop
- Fix date picker theme mismatch by setting themeVariant based on app theme
- Apply initial date when opening picker so value matches displayed date
Co-authored-by: Cursor <cursoragent@cursor.com>
* Gate AskAgentsOption behind agents plugin availability check
Add a plugin availability check for the "Ask Agents" feature that
mirrors the webapp's useGetAgentsBridgeEnabled hook. Calls
GET /api/v4/agents/status on WebSocket connect and plugin status
change events, stores the result in an RxJS BehaviorSubject
ephemeral store, and conditionally renders the AskAgentsOption
component based on the plugin being available.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Fix quick actions tests and default date range to last 7 days
Mock useAgentsConfig in quick actions tests so the Ask Agents button
renders when agents plugin availability is gated. Default the date
range picker to the last 7 days instead of empty.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Address enahum's review feedback on channel summaries PR
- Remove pluginEnabled=false on network error in agents_status
- Use enableDynamicSizing for channel summary bottom sheet
- Extract channel navigation logic to switchToChannelByName action
- Move icon color to stylesheet, null guard to parent in InlineEntityLink
- Replace custom URL parsing with parseDeepLink in transform.ts
- Reorder channel membership check before API request in channel_summary
- Use FormattedText, FormattedDate, FloatingTextInput consistently
- Use getErrorMessage for proper intl error handling in alerts
- Simplify agent_item to always use expo-image, memoize styles
- Gate Ask Agents item count on agentsEnabled in header.tsx
- Clean up CLAUDE-IOS-SIMULATOR.md per review suggestions
- Update tests to match new behavior
Co-authored-by: Cursor <cursoragent@cursor.com>
* Fix i18n extraction for date_range_picker translated strings
Add defineMessages declarations so the i18n extraction tool can find
the translated string IDs passed through custom props to DateInputField.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Fix agent profile image not rendering on agent selector
* Reduce channel summary bottom sheet max height from 80% to 50%
The 80% snap point created too much whitespace below the options.
50% fits the main content well while still leaving room for the
iOS date picker spinner when the custom date range view is shown.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Adjust channel summary bottom sheet max height to 65%
50% was too short, cutting off the iOS date picker spinner.
65% provides enough room for the date range view with spinner
while keeping the main options view compact.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Use platform-specific max height for channel summary bottom sheet
iOS uses 65% to accommodate the inline date picker spinner.
Android uses 50% since its modal date picker doesn't need extra space.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Reduce height on android slightly
* Final tweaks for spacing
* Address PR review feedback from larkox and pvev
- Use MessageDescriptor props instead of separate id/defaultMessage strings in DateInputField
- Extract hitSlop constant outside component for render stability
- Normalize date range to UTC start/end of day to avoid timezone data loss
- Replace hardcoded '#FFFFFF' with theme.buttonColor
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Added scaffolding for unrevealed BoR post
* Displayed reveal UI
* Displayed expiry timer
* WIP
* Displayed own post indicator and blur text
* restored button
* Ungrouped BoR posts
* WIP
* WIP
* DIsplayed error message on revealing
* Added last run check on mobile app cleanup job
* Cleanup
* lint fix
* i18n-fix
* Added tests
* test: add test suite for revealBoRPost function
* test: add unrevealed burn on read post test file
* feat: add tests for UnrevealedBurnOnReadPost component
* test: update UnrevealedBurnOnReadPost test with PostModel type
* test: replace toBeTruthy with toBeVisible for component visibility assertions
* test: add initial test file for expiry timer component
* test: add comprehensive tests for ExpiryCountdown component
* refactor: clean up test formatting and remove redundant test case
* fix: adjust test timing for ExpiryCountdown onExpiry callback
* test: fix timer test by advancing timers in smaller increments
* Added tests
* Updated tests
* fixed accidental change
* restored package.resolved
* WIP review fixes
* Review fixes
* Review fixes
* Fixed tests
* restored package.resolved
* WIP
* test: add test for skipping BoR post cleanup within 15 minutes
* test: add comprehensive test cases for expiredBoRPostCleanup
* WIP
* WIP
* test: add bor.test.ts placeholder file
* test: add comprehensive tests for BoR utility functions
* test: add comprehensive tests for formatTime function
* WIP
* test: add comprehensive tests for getLastBoRPostCleanupRun function
* Added tests
* removed a commented code
* post list optimization
* test: add test case for updating unrevealed burn-on-read post
* fix: handle error logging in expiredBoRPostCleanup test
* test: add test case for updateLastBoRCleanupRun error handling
* review fixes
* lint fixes
* Added WS event handling (#9320)
* Added WS event handling
* test: add burn on read websocket action test
* test: add tests for handleBoRPostRevealedEvent in burn_on_read
* Added tests
* test: add comprehensive error handling test cases for burn on read
* Added tests and error handling
* BoR post - restricted actions (#9315)
* Restricted post actions for BoR post type
* Prevent opening thread fr nBoR post
* WIP
* fix: remove redundant observable wrapping in post options
* fixed a change
* removed broken
* restored package.resolved
* Added tests
* Awaiting for last run to be set
* Added tests for validating expiry timer behaviour (#9338)
* Added tests for validating expiry timer behaviour
* No need of use event setup
* Bor ux fixes (#9336)
* WIP
* UI and delete fixes
* lint fixes
* fixed tests
* Improved mocking
* Improved test
* feat(MM-63936): add mark function in performance metrics manager
* feat(MM-63563): fetch initial team data ONLY on entry
* remove all performance mark()
* revert changes to processEntryModels
* using processNextTeam to download team in sequence
* separate restDeferredAppEntryActions into two parts
* remove console.log
* fixed issue with conflict post.id
* regression from fetchPostsForUnreadChannels
* extracted deferred functions into deferred.ts
* missing mock
* extract combineChannelsData to it's own function
* remove isDelete
* use logDebug vs logInfo
* add logDebug and logWarning in the mocking
* add combineChannelsData test
* revert the use of logDebug
* spelling errors
* undo logDebug changes
* moving fetchMissingDirectChannelsInfo into setTimeout saved quite a bit of time when it comes to TTI
* changes to accommodate other recent changes
* keep the channelsMap smaller by moving delete_at.
* using for loop instead of recursive
* making this function more readable
* add jsdoc
* changes based on review
* team will not get omitted from the sidebar if there is an error
* fix test as well
* added a new test
* remove comments on categories
* add categories to fix failing test
* fix failing test
* Add the channel options to get into playbooks (#8750)
* Add the channel options to get into playbooks
* Use playbook run id instead of playbook id
* i18n
* Fix issues and move playbooks to the products folder
* Address some tests
* Fix test
* Address design issues
* Add requested comment
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Playbooks database (#8802)
* Add lastPlaybookFetchAt to channel table (#8916)
* Add lastPlaybookFetchAt to channel table
* Add missing commit
* Use my_channel table instead
* Fix test
* Address feedback
* First implementation of playbooks API (#8897)
* First implementation of playbooks API
* Add version check
* Address feedback
* Fix test
* Add last fetch at usage and other improvements
* Simplify test
* Add sort_order, update_at and previousReminder columns (#8927)
* Add sort_order, update_at and previousReminder columns
* Remove order from the schema
* Fix tests
* Add tests
* Add websockets for playbooks (#8947)
* Add websocket events for playbooks
* Fix typo
* Add playbook run list (#8761)
* Add the channel options to get into playbooks
* Use playbook run id instead of playbook id
* i18n
* Fix issues and move playbooks to the products folder
* Address some tests
* Fix test
* Add playbook run list
* Add missing texts
* Add back button support and item size to flash list
* Address design issues
* Add requested comment
* Standardize tag and use it in the card
* Fix merge
* Add API related functionality
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Add playbooks run details (#8872)
* Add the channel options to get into playbooks
* Use playbook run id instead of playbook id
* i18n
* Fix issues and move playbooks to the products folder
* Address some tests
* Fix test
* Add playbook run list
* Add missing texts
* Add back button support and item size to flash list
* Address design issues
* Add requested comment
* Standardize tag and use it in the card
* Add playbooks run details
* Fix merge
* Add API related functionality
* Add API related changes
* Order fixes
* Several fixes
* Add error state on playbook run
* i18n-extract
* Fix tests
* Fix test
* Several fixes
* Fixes and add missing UI elements
* i18n-extract
* Fix tests
* Remove files from bad merge
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Add missing tests for playbooks (#8976)
* Add the channel options to get into playbooks
* Use playbook run id instead of playbook id
* i18n
* Fix issues and move playbooks to the products folder
* Address some tests
* Fix test
* Add playbook run list
* Add missing texts
* Add back button support and item size to flash list
* Address design issues
* Add requested comment
* Standardize tag and use it in the card
* Add playbooks run details
* Fix merge
* Add API related functionality
* Add API related changes
* Order fixes
* Several fixes
* Add error state on playbook run
* i18n-extract
* Fix tests
* Fix test
* Several fixes
* Fixes and add missing UI elements
* i18n-extract
* Fix tests
* Remove files from bad merge
* Add tests
* Fix typo
* Add missing strings
* Fix tests and skip some
* Fix test
* Fix typo
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Address feedback
* Address feedback and fix tests
* Address comments and fix tests
* Address feedback
* Address plugin changes and fix bugs
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Network metrics
* update network-client ref
* fix unit tests
* missing catch error parsing
* Replace API's to fetch all teams and channels for a user
Update groupLabel to use a type definition
Include effective Latency and Average Speed in the metrics
Include parallel and sequential request counts
* update network library and fix tests
* feat(MM-61865): send network request telemetry data to the server (#8436)
* feat(MM-61865): send network info telemetry data
* unit testing
* fix latency vs effectiveLatency
* cleanup test
* fix failing tests
* fix spelling error
* fix failing test
* more cleanup
* fix: improve parallel requests calculation (#8439)
* fix: improve parallel requests calculation
* fix test issue
* multiple parallelGroups testing
* calculateAverageSpeedWithCategories test
* categorizedRequests in it's own describe
* clean up duplicate tests
* check for when groupLabel is non-existent
* a case when groupLabel is non-existent
* more testing with effective latency.
* resolveAndFlattenModels with a capital F
* add try..catch within resolveAndFlattenModels
* update groupLabel to fix failing lint
* fix linting issue due to unknown group label
* forgot to push changes
* fix the indentation problem again
* add env var option for COLLECT_NETWORK_METRICS
---------
Co-authored-by: Rahim Rahman <rahim.rahman@mattermost.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
* host remove command, host removed feedback
* add view profile control
* i18n; dismissBottomSheet later
* PR comments
* remove confusing setPreviousCall(null)
* our own separator, bit more space for Android
* no need for previousCall due to changes on server
* move host removed alert to an error
* channel_id is not send via the msg.broadcast
* channel_id is still sent via the msg.broadcast
* mobile support for live captions
* add the 'Live captions turned on' ephemeral notice
* PR comments
* message should be translatable
* run i18n-extract
* call_recording_state -> call_job_state; ccAvailable is now dynamic
* backwards compatibility with pre calls v0.26.0
* correct mobile version in deprecation comments
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Only call app entry on websocket reconnect
* Handle notification on its own entry and run app entry on websocket initialization
* Fix notification entry issues
* Fix login entry and add retry on entry failure
* feedback review
* Put back handleEntryAfterLoadNavigation before the batching
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Remove watermelondb limitation on updating an already updated model
* Add logic to handle different prepare states and improve logging
* fix tests
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
* Fix several issues around team join
* Open in modal and fix channel list
* Add joining states and fix issues
* i18n-extract
* add specific message for group related failures on joining teams
* Address feedback
* Address feedback
* Use error from server response