mattermost-mobile/app/products/agents/client/rest.ts
Christopher Speller 0c675ec2db
Agents posts on mobile (#9317)
* 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
2025-12-09 03:56:12 -08:00

41 lines
1.2 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
export interface ClientAgentsMix {
getAgentsRoute: () => string;
stopGeneration: (postId: string) => Promise<void>;
regenerateResponse: (postId: string) => Promise<void>;
submitToolApproval: (postId: string, acceptedToolIds: string[]) => Promise<void>;
}
const ClientAgents = (superclass: any) => class extends superclass {
getAgentsRoute = () => {
return '/plugins/mattermost-ai';
};
stopGeneration = async (postId: string) => {
return this.doFetch(
`${this.getAgentsRoute()}/post/${postId}/stop`,
{method: 'post'},
);
};
regenerateResponse = async (postId: string) => {
return this.doFetch(
`${this.getAgentsRoute()}/post/${postId}/regenerate`,
{method: 'post'},
);
};
submitToolApproval = async (postId: string, acceptedToolIds: string[]) => {
return this.doFetch(
`${this.getAgentsRoute()}/post/${postId}/tool_call`,
{
method: 'post',
body: {accepted_tool_ids: acceptedToolIds},
},
);
};
};
export default ClientAgents;