/** * Admin Settings API endpoints * Handles system settings management for administrators */ import { apiClient } from '../client' /** * System settings interface */ export interface SystemSettings { // Registration settings registration_enabled: boolean email_verify_enabled: boolean // Default settings default_balance: number default_concurrency: number // OEM settings site_name: string site_logo: string site_subtitle: string api_base_url: string contact_info: string doc_url: string home_content: string // SMTP settings smtp_host: string smtp_port: number smtp_username: string smtp_password_configured: boolean smtp_from_email: string smtp_from_name: string smtp_use_tls: boolean // Cloudflare Turnstile settings turnstile_enabled: boolean turnstile_site_key: string turnstile_secret_key_configured: boolean // LinuxDo Connect OAuth settings linuxdo_connect_enabled: boolean linuxdo_connect_client_id: string linuxdo_connect_client_secret_configured: boolean linuxdo_connect_redirect_url: string // Model fallback configuration enable_model_fallback: boolean fallback_model_anthropic: string fallback_model_openai: string fallback_model_gemini: string fallback_model_antigravity: string // Identity patch configuration (Claude -> Gemini) enable_identity_patch: boolean identity_patch_prompt: string // Ops Monitoring (vNext) ops_monitoring_enabled: boolean ops_realtime_monitoring_enabled: boolean ops_query_mode_default: 'auto' | 'raw' | 'preagg' | string ops_metrics_interval_seconds: number } export interface UpdateSettingsRequest { registration_enabled?: boolean email_verify_enabled?: boolean default_balance?: number default_concurrency?: number site_name?: string site_logo?: string site_subtitle?: string api_base_url?: string contact_info?: string doc_url?: string home_content?: string smtp_host?: string smtp_port?: number smtp_username?: string smtp_password?: string smtp_from_email?: string smtp_from_name?: string smtp_use_tls?: boolean turnstile_enabled?: boolean turnstile_site_key?: string turnstile_secret_key?: string linuxdo_connect_enabled?: boolean linuxdo_connect_client_id?: string linuxdo_connect_client_secret?: string linuxdo_connect_redirect_url?: string enable_model_fallback?: boolean fallback_model_anthropic?: string fallback_model_openai?: string fallback_model_gemini?: string fallback_model_antigravity?: string enable_identity_patch?: boolean identity_patch_prompt?: string ops_monitoring_enabled?: boolean ops_realtime_monitoring_enabled?: boolean ops_query_mode_default?: 'auto' | 'raw' | 'preagg' | string ops_metrics_interval_seconds?: number } /** * Get all system settings * @returns System settings */ export async function getSettings(): Promise { const { data } = await apiClient.get('/admin/settings') return data } /** * Update system settings * @param settings - Partial settings to update * @returns Updated settings */ export async function updateSettings(settings: UpdateSettingsRequest): Promise { const { data } = await apiClient.put('/admin/settings', settings) return data } /** * Test SMTP connection request */ export interface TestSmtpRequest { smtp_host: string smtp_port: number smtp_username: string smtp_password: string smtp_use_tls: boolean } /** * Test SMTP connection with provided config * @param config - SMTP configuration to test * @returns Test result message */ export async function testSmtpConnection(config: TestSmtpRequest): Promise<{ message: string }> { const { data } = await apiClient.post<{ message: string }>('/admin/settings/test-smtp', config) return data } /** * Send test email request */ export interface SendTestEmailRequest { email: string smtp_host: string smtp_port: number smtp_username: string smtp_password: string smtp_from_email: string smtp_from_name: string smtp_use_tls: boolean } /** * Send test email with provided SMTP config * @param request - Email address and SMTP config * @returns Test result message */ export async function sendTestEmail(request: SendTestEmailRequest): Promise<{ message: string }> { const { data } = await apiClient.post<{ message: string }>( '/admin/settings/send-test-email', request ) return data } /** * Admin API Key status response */ export interface AdminApiKeyStatus { exists: boolean masked_key: string } /** * Get admin API key status * @returns Status indicating if key exists and masked version */ export async function getAdminApiKey(): Promise { const { data } = await apiClient.get('/admin/settings/admin-api-key') return data } /** * Regenerate admin API key * @returns The new full API key (only shown once) */ export async function regenerateAdminApiKey(): Promise<{ key: string }> { const { data } = await apiClient.post<{ key: string }>('/admin/settings/admin-api-key/regenerate') return data } /** * Delete admin API key * @returns Success message */ export async function deleteAdminApiKey(): Promise<{ message: string }> { const { data } = await apiClient.delete<{ message: string }>('/admin/settings/admin-api-key') return data } /** * Stream timeout settings interface */ export interface StreamTimeoutSettings { enabled: boolean action: 'temp_unsched' | 'error' | 'none' temp_unsched_minutes: number threshold_count: number threshold_window_minutes: number } /** * Get stream timeout settings * @returns Stream timeout settings */ export async function getStreamTimeoutSettings(): Promise { const { data } = await apiClient.get('/admin/settings/stream-timeout') return data } /** * Update stream timeout settings * @param settings - Stream timeout settings to update * @returns Updated settings */ export async function updateStreamTimeoutSettings( settings: StreamTimeoutSettings ): Promise { const { data } = await apiClient.put( '/admin/settings/stream-timeout', settings ) return data } export const settingsAPI = { getSettings, updateSettings, testSmtpConnection, sendTestEmail, getAdminApiKey, regenerateAdminApiKey, deleteAdminApiKey, getStreamTimeoutSettings, updateStreamTimeoutSettings } export default settingsAPI