* 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
89 lines
2.8 KiB
TypeScript
89 lines
2.8 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
import clientAgents from './rest';
|
|
|
|
describe('ClientAgents', () => {
|
|
const mockDoFetch = jest.fn();
|
|
|
|
const BaseClass = class {
|
|
doFetch = mockDoFetch;
|
|
};
|
|
const Client = clientAgents(BaseClass);
|
|
const client = new Client();
|
|
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
describe('getAgentsRoute', () => {
|
|
it('should return the correct route', () => {
|
|
expect(client.getAgentsRoute()).toBe('/plugins/mattermost-ai');
|
|
});
|
|
});
|
|
|
|
describe('getAIBots', () => {
|
|
it('should make correct API call', async () => {
|
|
await client.getAIBots();
|
|
expect(mockDoFetch).toHaveBeenCalledWith(
|
|
'/plugins/mattermost-ai/ai_bots',
|
|
{method: 'get'},
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('getAIThreads', () => {
|
|
it('should make correct API call', async () => {
|
|
await client.getAIThreads();
|
|
expect(mockDoFetch).toHaveBeenCalledWith(
|
|
'/plugins/mattermost-ai/ai_threads',
|
|
{method: 'get'},
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('stopGeneration', () => {
|
|
it('should make correct API call', async () => {
|
|
await client.stopGeneration('post-123');
|
|
expect(mockDoFetch).toHaveBeenCalledWith(
|
|
'/plugins/mattermost-ai/post/post-123/stop',
|
|
{method: 'post'},
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('regenerateResponse', () => {
|
|
it('should make correct API call', async () => {
|
|
await client.regenerateResponse('post-456');
|
|
expect(mockDoFetch).toHaveBeenCalledWith(
|
|
'/plugins/mattermost-ai/post/post-456/regenerate',
|
|
{method: 'post'},
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('submitToolApproval', () => {
|
|
it('should make correct API call with accepted tool IDs', async () => {
|
|
const acceptedToolIds = ['tool-1', 'tool-2'];
|
|
await client.submitToolApproval('post-789', acceptedToolIds);
|
|
expect(mockDoFetch).toHaveBeenCalledWith(
|
|
'/plugins/mattermost-ai/post/post-789/tool_call',
|
|
{
|
|
method: 'post',
|
|
body: {accepted_tool_ids: acceptedToolIds},
|
|
},
|
|
);
|
|
});
|
|
|
|
it('should make correct API call with empty tool IDs', async () => {
|
|
await client.submitToolApproval('post-789', []);
|
|
expect(mockDoFetch).toHaveBeenCalledWith(
|
|
'/plugins/mattermost-ai/post/post-789/tool_call',
|
|
{
|
|
method: 'post',
|
|
body: {accepted_tool_ids: []},
|
|
},
|
|
);
|
|
});
|
|
});
|
|
});
|