import { backendApi } from '@/lib/api-client'; export interface ComposioCategory { id: string; name: string; } export interface CompositoCategoriesResponse { success: boolean; categories: ComposioCategory[]; total: number; error?: string; } export interface ComposioToolkit { slug: string; name: string; description?: string; logo?: string; tags: string[]; auth_schemes: string[]; categories: string[]; } export interface AuthConfigField { name: string; displayName: string; type: string; description?: string; required: boolean; default?: string; legacy_template_name?: string; } export interface AuthConfigDetails { name: string; mode: string; fields: { [fieldType: string]: { [requirementLevel: string]: AuthConfigField[]; }; }; } export interface DetailedComposioToolkit { slug: string; name: string; description?: string; logo?: string; tags: string[]; auth_schemes: string[]; categories: string[]; auth_config_details: AuthConfigDetails[]; connected_account_initiation_fields?: { [requirementLevel: string]: AuthConfigField[]; }; base_url?: string; } export interface DetailedComposioToolkitResponse { success: boolean; toolkit: DetailedComposioToolkit; error?: string; } export interface ComposioTool { slug: string; name: string; description: string; version: string; input_parameters: { properties: Record; required?: string[]; }; output_parameters: { properties: Record; }; scopes?: string[]; tags?: string[]; no_auth: boolean; } export interface ComposioToolsResponse { success: boolean; tools: ComposioTool[]; total_items: number; current_page: number; total_pages: number; next_cursor?: string; error?: string; } export interface ComposioToolkitsResponse { success: boolean; toolkits: ComposioToolkit[]; total_items: number; total_pages: number; current_page: number; next_cursor?: string; has_more: boolean; error?: string; } export interface ComposioProfile { profile_id: string; profile_name: string; display_name: string; toolkit_slug: string; toolkit_name: string; mcp_url: string; redirect_url?: string; connected_account_id?: string; is_connected: boolean; is_default: boolean; created_at: string; } export interface ComposioProfilesResponse { success: boolean; profiles: ComposioProfile[]; error?: string; } export interface CreateComposioProfileRequest { toolkit_slug: string; profile_name: string; display_name?: string; user_id?: string; mcp_server_name?: string; is_default?: boolean; initiation_fields?: Record; } export interface CreateComposioProfileResponse { success: boolean; profile_id: string; redirect_url?: string; mcp_url: string; error?: string; } export interface ComposioMcpConfigResponse { success: boolean; mcp_config: { name: string; type: string; mcp_qualified_name: string; toolkit_slug: string; config: { profile_id: string; }; enabledTools: string[]; }; error?: string; } export interface ComposioProfileSummary { profile_id: string; profile_name: string; display_name: string; toolkit_slug: string; toolkit_name: string; is_connected: boolean; is_default: boolean; created_at: string; has_mcp_url: boolean; } export interface ComposioToolkitGroup { toolkit_slug: string; toolkit_name: string; icon_url?: string; profiles: ComposioProfileSummary[]; } export interface ComposioCredentialsResponse { success: boolean; toolkits: ComposioToolkitGroup[]; total_profiles: number; } export interface ComposioMcpUrlResponse { success: boolean; mcp_url: string; profile_name: string; toolkit_name: string; warning: string; } export interface DeleteProfileResponse { message: string; } export interface BulkDeleteProfilesRequest { profile_ids: string[]; } export interface BulkDeleteProfilesResponse { success: boolean; deleted_count: number; failed_profiles: string[]; message: string; } export const composioApi = { async getCategories(): Promise { const result = await backendApi.get( '/composio/categories', { errorContext: { operation: 'load categories', resource: 'Composio categories' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to get categories'); } return result.data!; }, async getToolkits(search?: string, category?: string, cursor?: string): Promise { const params = new URLSearchParams(); if (search) { params.append('search', search); } if (category) { params.append('category', category); } if (cursor) { params.append('cursor', cursor); } const result = await backendApi.get( `/composio/toolkits${params.toString() ? `?${params.toString()}` : ''}`, { errorContext: { operation: 'load toolkits', resource: 'Composio toolkits' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to get toolkits'); } return result.data!; }, async getProfiles(params?: { toolkit_slug?: string; is_active?: boolean }): Promise { const queryParams = new URLSearchParams(); if (params?.toolkit_slug) { queryParams.append('toolkit_slug', params.toolkit_slug); } if (params?.is_active !== undefined) { queryParams.append('is_active', params.is_active.toString()); } const result = await backendApi.get( `/composio/profiles${queryParams.toString() ? `?${queryParams.toString()}` : ''}`, { errorContext: { operation: 'load profiles', resource: 'Composio profiles' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to get profiles'); } return result.data!.profiles; }, async createProfile(request: CreateComposioProfileRequest): Promise { const result = await backendApi.post( '/composio/profiles', request, { errorContext: { operation: 'create profile', resource: 'Composio profile' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to create profile'); } return result.data!; }, async getMcpConfigForProfile(profileId: string): Promise { const result = await backendApi.get( `/composio/profiles/${profileId}/mcp-config`, { errorContext: { operation: 'get MCP config', resource: 'Composio profile MCP config' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to get MCP config'); } return result.data!; }, async discoverTools(profileId: string): Promise<{ success: boolean; tools: any[]; toolkit_name: string; total_tools: number }> { const result = await backendApi.post<{ success: boolean; tools: any[]; toolkit_name: string; total_tools: number }>( `/composio/discover-tools/${profileId}`, {}, { errorContext: { operation: 'discover tools', resource: 'Composio profile tools' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to discover tools'); } return result.data!; }, async getCredentialsProfiles(): Promise { const response = await backendApi.get('/secure-mcp/composio-profiles'); return response.data.toolkits; }, async getMcpUrl(profileId: string): Promise { const response = await backendApi.get(`/secure-mcp/composio-profiles/${profileId}/mcp-url`); return response.data; }, async getToolkitIcon(toolkitSlug: string): Promise<{ success: boolean; icon_url?: string }> { const response = await backendApi.get<{ success: boolean; toolkit_slug: string; icon_url?: string; message?: string }>(`/composio/toolkits/${toolkitSlug}/icon`); return { success: response.data.success, icon_url: response.data.icon_url }; }, async getToolkitDetails(toolkitSlug: string): Promise { const result = await backendApi.get( `/composio/toolkits/${toolkitSlug}/details`, { errorContext: { operation: 'get toolkit details', resource: 'Composio toolkit details' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to get toolkit details'); } return result.data!; }, async getTools(toolkitSlug: string, limit: number = 50): Promise { const result = await backendApi.post( `/composio/tools/list`, { toolkit_slug: toolkitSlug, limit }, { errorContext: { operation: 'get tools', resource: 'Composio tools' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to get tools'); } return result.data!; }, async deleteProfile(profileId: string): Promise { const result = await backendApi.delete( `/secure-mcp/credential-profiles/${profileId}`, { errorContext: { operation: 'delete profile', resource: 'Composio profile' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to delete profile'); } return result.data!; }, async bulkDeleteProfiles(profileIds: string[]): Promise { const result = await backendApi.post( '/secure-mcp/credential-profiles/bulk-delete', { profile_ids: profileIds }, { errorContext: { operation: 'bulk delete profiles', resource: 'Composio profiles' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to bulk delete profiles'); } return result.data!; }, async setDefaultProfile(profileId: string): Promise<{ message: string }> { const result = await backendApi.put<{ message: string }>( `/secure-mcp/credential-profiles/${profileId}/set-default`, {}, { errorContext: { operation: 'set default profile', resource: 'Composio profile' }, } ); if (!result.success) { throw new Error(result.error?.message || 'Failed to set default profile'); } return result.data!; }, };