* 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
* Fix iOS citations panel toggle reliability
Remove the animated maxHeight/opacity accordion from agent citations so the Sources section expands and collapses consistently on iOS without hidden or underlapping content.
Made-with: Cursor
* Restore citations panel animation with stable transitions
Use Reanimated enter/exit and layout transitions for the Sources panel so opening and closing stay animated while preserving the iOS reliability fix.
Made-with: Cursor
* Fix citations panel collapse animation overlapping content below
Replace entering/exiting animations with shared-value-driven height
and opacity transitions. Reanimated's exiting animations pull the view
out of layout flow as an absolute overlay, causing the fading content
to overlap the regenerate button during collapse. Using an always-mounted
Animated.View with measured content height and overflow clipping ensures
smooth expand/collapse without overlap.
Made-with: Cursor
* Add two-phase tool call approval for agents in channels
Implements the mobile counterpart to the webapp's multiplayer tool calling
feature. When a bot is @mentioned in a channel, tool call arguments and
results are redacted from other members. Only the invoker can approve/reject
tool execution (Phase 1) and decide whether to share results with the
channel (Phase 2).
See mattermost/mattermost-plugin-agents#491 for the server/webapp changes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add tests for channel tool calling utilities and remote actions
Tests for isToolCallRedacted, isPendingToolResult, getToolApprovalStage,
mergeToolCalls utility functions and fetchToolCallPrivate,
fetchToolResultPrivate, submitToolResult remote actions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add e2e tests and testIDs for agent tool calls in channels
Adds detox e2e tests covering tool call card rendering, approval buttons,
result approval phase, and multi-tool-call scenarios. Adds testID props
to ToolApprovalSet and ToolCard components to support the e2e tests.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Address PR review feedback for two-phase tool call approval
- Fix mergeToolCalls to preserve public-only tools instead of dropping them
- Fix stale closure race in handleToolDecision with functional setState
- Add forceLogoutIfNecessary to tool_private and tool_result remote actions
- Show snackbar on submit failure using existing error types
- Reset isDM in catch block to prevent stale state
- Sync animation shared values when isCollapsed changes externally
- Clear private data on streaming-to-persisted transition
- Wrap action buttons with usePreventDoubleTap
- Use toolCalls reference instead of toolCalls.length in effect dependency
- Fix grammar in warning callout ("its" -> "their")
- Change fontWeight from number to string per RN conventions
Co-authored-by: Cursor <cursoragent@cursor.com>
* Address PR review feedback: withObservables HOC, memoization, typography
- Refactor AgentPost to use withObservables HOC for channel observation
instead of useEffect+subscribe, providing isDM as a prop
- Memoize undecidedCount in ToolApprovalSet and move before early return
- Replace manual font styles with typography() utility in ToolCard
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: ai rewrite
* feat: allow crating content apart from editing it
* feat: feature parity with webapp
* feat: feature parity with webapp
* chore: fixed padding
* map ux to webapp
* refactored ai rewrite logic to separate package
* chore: tests and lint
* Update app/products/ai/rewrite/screens/options/options.tsx
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* rewrite post editor animation
* i18n
* ui feedback, centered icon and less top padding
* chore: lint
* Consolidate @ai product into @agents
Move all rewrite functionality from app/products/ai/ into
app/products/agents/ to unify under a single namespace.
- Add rewrite types, store, hooks, components, and screens to agents
- Merge AI client methods into agents client
- Update screen constants (AI_* -> AGENTS_*)
- Update all consumer imports
- Remove AI state from EphemeralStore
- Remove @ai path alias from config
- Delete app/products/ai/ directory
* refactor: load screens from product package
* refactor: move detection logic to the agents pacakge
* refactor: remove "backwards compatibility"
* refactor: move hooks to proper package
* refactor: styles
* refactor: remove unneedd position attribute
* refactor: remove unneeded cancel animation calls
* refactor: "backwards compat"
* refactor: optimize renderContent with useCallback for performance
* refactor: rename variable to avoid confusion
* refactor: update handleRewrite to use async/await for better error handling
* refactor: simplify handleRewrite by always dismissing keyboard
* refactor: use hook, always all keyboard.dismiss
* chore: enhance AgentSelector component with FlatList support
* feat: add rewriteMessage function for AI message rewriting and integrate it into useRewrite hook
* refactor: simplify message length calculation in useHandleSendMessage hook
* refactor: consolidate agent screen constants and integrate with existing screens
* fix: update dependency array in useMemo for isUnrevealedPost to include post expiration metadata
* refactor: remove unused variable to clean up Typing component
* refactor: simplify logic for atDisabled and slashDisabled flags in QuickActions component
* feat: add AIRewriteAction component for AI message rewriting functionality
* revert: thread.ts changes manually
* refactor: integrate useSafeAreaInsets
* refactor: cleanup unused methods
* chore: add comment to clarify casting
* refactor: use_agents
* chore: lint and test
* fix: trim
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* 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>
* Add editing summary for a checklist
* fix spacing
* fix duplication issue due to rerender off-screen
* remove worktree from cursor as I'm not using that
* add tests
* address PR review feedback
- add double-tap prevention to save button
- rename goToRenamePlaybookRun to goToEditPlaybookRun for consistency
- add debug log when local DB update fails after successful API call
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Update playbook run rename spacing
* [MM-66995] Edit summary gatekeep (#9490)
* gatekeeping summary edit
* Fix playbook run summary edit gating
* more tests
* Use options object for playbook run edit
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: hide Playbooks button when no running playbook runs in team
The PlaybooksButton on the home screen channel list now only appears
when there is at least one in-progress playbook run in the current team,
in addition to requiring the playbooks feature to be enabled.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* improve team query
* test: add unit tests for observeHasRunningPlaybookRunsInTeam query
Add tests to verify the new query correctly:
- Returns true when running playbook runs exist (end_at = 0)
- Returns false when all runs are finished (end_at > 0)
- Returns false when no runs exist
- Filters by team_id correctly
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* fix: skip flaky playIncomingCallsRinging test in calls state
Skip the playIncomingCallsRinging test that has been causing
intermittent failures. Added TODO comment to track that the
root cause still needs to be identified.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* add link to ticket that should fix the test
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* delete button
* prevent deletion if we can't communicate with server
add tests
* I18n
* move to Pressable
* address review comments
* Use dedicated i18n IDs for delete task dialog
Replace reused generic translation IDs (mobile.post.cancel, post_info.del)
with playbooks-specific IDs for better maintainability and to avoid
unintended changes if source messages are modified.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* migrate naming
* temp
* temp 2
* fixed button when editing
* some bugs solved
* fix bugs
* add localization
* some review requests
* review comments
* upgrade db to 16
* Refactor property fields handling to batch database operations for improved performance
* Enhance error handling in PropertyFieldsListComponent by logging fetch errors and improving type definitions for property fields
* added tests for value change
* fix missalignment
* fix indent & typing
* fix test version
* missing version
* restore playbook run renaming
* move rename function to modal
* fix rebase
* prevent saving a non-trimmed value
* fix style
* remove tests that are no longer needed
* refactor: implement custom ExpoImage wrapper for cache control
Add ExpoImage component with automatic cacheKey/cachePath management and replace all expo-image imports across the app
* refactor(ios): convert Gekidou to CocoaPods
Migrate from Swift Package Manager to CocoaPods, add Keychain write operations, refactor notification handler to remove react-native-notifications headers, and upgrade Swift to 5.0
* npm audit
* update fastlane
* feat(ci): integrate Intune MAM for enterprise builds with strict OSS protection
Add Intune submodule, CI actions, Fastlane configuration, developer scripts, pre-commit hooks, and validation workflows to enable internal MAM builds while protecting OSS repository
* fix tests by mocking @mattermost/intune
* feat: implement Intune MAM integration with comprehensive security enforcement
Add IntuneManager, refactor SecurityManager/SessionManager for MAM policies, implement native OIDC auth flow, add biometric enforcement, conditional launch blocking, and file protection controls
* fix alerts when no server database is present
* Unify cache strategy
* fix emit config changed after it was stored in the db
* Handle Mid-Session Enrollment Detection
* fix ADALLogOverrideDisabled missing in Fastfile
* fix flow for initial enrollment
* fix and add unit tests
* enable Intune configuration for PR and beta builds, CLIENT_ID should be changed before actual release
* Update intune submodule with addressed feedback
* fix validate-intune-clean workflow
* feat(intune): add comprehensive error handling and SAML+Entra support
Add production-ready error handling for native Entra authentication with
user-friendly i18n messages, comprehensive test coverage, and support for
Entra login when server requires SAML.
* update i18n
* update intune submodule
* update build-pr token
* fix race condition between server auth and intune enrollment
* fix CI workflow to build with intune
* use deploy key for intune submodule
* set the config directly in the submodule .git
* debug injection
* try setting GIT_SSH_COMMAND
* remove action debug
* fix server url input
* match pod cache with intune hash
* Fastfile and envs
* have workflows check for intune/.git
* have ci cache intune frameworks as well
* update Fastlane to set no-cache to artifacts uploaded
* fix s3 upload
* fix pblist template
* Attempt to remove the cache control for PR uploads to s3
* use hash from commit for S3 path
* Implement crash-resilient selective wipe with automatic retry and add removeInternetPassword to Gekidou Keychain
* Fix surface errors from intune login
* fix postinstall scripts
* use cacheKey for draft md images
* remove unnecessary double await during test
* Have isMinimumLicenseTier accept valid license sku tier as target
* Add missing Auth error messages
* remove the last period for intune errors in i18n
* do not call unenroll with wipe on manual logout
* Fix tests and Intune error messages
* do not filter any SSO type regardless of which is used for Intune
* fix 412 to not retry
* fix tests, app logs sharing and share_extension avatar cache
* apply setScreenCapturePolicy on license change
Co-authored-by: Eva Sarafianou <eva.sarafianou@mattermost.com>
* re-apply screen capture on enrollment
Co-authored-by: Eva Sarafianou <eva.sarafianou@mattermost.com>
* use userData from intunr login and prevent getMe
Co-authored-by: Eva Sarafianou <eva.sarafianou@mattermost.com>
* Check for Biometrics and Jailbreak as we used to
---------
Co-authored-by: Eva Sarafianou <eva.sarafianou@mattermost.com>
* Agents streaming
* Fix bug and lint
* Add reasoning summaries to mobile agents
* Add tool call approval UI for mobile agents
* Add citations and annotations support for mobile agents
Implements Phase 4 from the agents mobile plan:
- WebSocket event handling for annotations control signal
- CitationsList component displaying sources below agent responses
- Collapsible sources section with source count
- Each citation shows title, domain, and opens URL on tap
- Citations persisted in post.props.annotations
- Touch-optimized UI with 44pt minimum tap targets
* Add stop and regenerate controls for mobile agents
* Add tests
* Fix tool approval buttons not updating after accept/reject
- Remove optimistic WebSocket event approach that didn't work
- Clear component streaming state on ENDED event to force switch to persisted data
- Remove delays in streaming store cleanup (500ms and 100ms)
- POST_EDITED event now properly updates UI for both accept and reject
- Remove debug console.log statements
- Fix ESLint issues (unused vars, nested callbacks, nested ternary)
* Refactor agents code: remove unused client mixin, fix bugs, and simplify logic
* Fixes
* Add CLAUDE.md
* Review feedback.
* Review feedback inline functions
* Learnings
* Address review feedback: StyleSheet.create, parent mount checks, utils
* Move to observables
* Last style fix
* Style tweaks
* fix no response + handle error
* address comment review
* add a screen to allow user to name the checklist
* handle local update errors
* can save as a memoized item
* change touchableopacity into a button
* fix typo
* memoize canSave
* [MM-66420] Add missing tests for playbooks
* i18n-extract
* Update message keys to more accurate ones
* Update status update post to use a more standard error handling and fix linter bugs
* Add post-merge tests and address feedback
* Fix failing test
* Address feedback
* add new value to conditionAction
* update progress management regarding conditions
* hide items
* add test to filtering
* icon added for condition reason
* add conditional reason to bottom sheet
* improve UI
* i18n
* this might need to be reverted later. Fix for condition changes not triggering updates
* cosmetic changes
* improve branch icon positioning
* pressing on checklist item should display bottom sheet
* review improvements
* Add select user screen to select owner and task assignee
* Fix i18n
* Add tests
* Address feedback
* Fix test
* Address UX feedback
* Fix test
* Put the no assignee button inline with the search
* Playbook run status update post
* Show Playbooks button in Channel Info screen only if playbooks is enabled
* Handle Playbook links
* Fetch playbook if needed
* fix playbooks migration
* fix deeplinks using parsedUrl
* update last time playbooks where fetched if no errors
* show participants for run status update post
* fix tests
* remove console.log in test
* feedback review
* wrap participants footer
* add fastlane FASTLANE_XCODEBUILD_SETTINGS_RETRIES env vars
* Fix order of finished runs and add a show more button
* Add missing text
* Add prevent double tap
* Fix show more button showing when it shouldn't
* fix tests
---------
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>