* 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
41 lines
1.2 KiB
TypeScript
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;
|