diff --git a/eslint.config.js b/eslint.config.js index 9cd0afc35..f6bd4cea9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -858,12 +858,6 @@ export default [ "no-restricted-syntax": "off", }, }, - { - files: ["src/lib/api/appConfig.ts"], - rules: { - "no-restricted-imports": "off", - }, - }, { files: [ "src/lib/api/agentRuntime.ts", @@ -900,14 +894,4 @@ export default [ "no-restricted-syntax": "off", }, }, - { - files: [ - "src/lib/api/channelsRuntime.ts", - "src/lib/api/experimentalFeatures.ts", - "src/lib/api/memoryRuntime.ts", - ], - rules: { - "no-restricted-imports": "off", - }, - }, ]; diff --git a/src/hooks/useTauri.ts b/src/hooks/useTauri.ts index 3183b953a..7b734926b 100644 --- a/src/hooks/useTauri.ts +++ b/src/hooks/useTauri.ts @@ -4,6 +4,109 @@ import { ensureWorkspaceReady as ensureProjectWorkspaceReady, } from "@/lib/api/project"; import { revealPathInFinder } from "@/lib/api/fileSystem"; +import type { + AssistantConfig, + ChatAppearanceConfig, + Config, + ContentCreatorConfig, + CrashReportingConfig, + EnvironmentConfig, + EnvironmentPreview, + EnvironmentPreviewEntry, + EnvironmentVariableOverride, + ImageGenConfig, + MultiSearchConfig, + MultiSearchEngineEntryConfig, + NavigationConfig, + QuotaExceededConfig, + RemoteManagementConfig, + ResponseCacheConfig, + ShellImportPreview, + TlsConfig, + UserProfile, + VoiceConfig, +} from "@/lib/api/appConfig"; +import type { + ChannelsConfig, + CloudflaredInstallResult, + CloudflaredInstallStatus, + CloudflareTunnelConfig, + DiscordAccountConfig, + DiscordActionsConfig, + DiscordAgentComponentsConfig, + DiscordAutoPresenceConfig, + DiscordBotConfig, + DiscordChannelConfig, + DiscordExecApprovalsConfig, + DiscordGatewayAccountStatus, + DiscordGatewayStatus, + DiscordGuildConfig, + DiscordIntentsConfig, + DiscordProbeResult, + DiscordThreadBindingsConfig, + DiscordUiComponentsConfig, + DiscordUiConfig, + DiscordVoiceAutoJoinConfig, + DiscordVoiceConfig, + FeishuAccountConfig, + FeishuBotConfig, + FeishuGatewayAccountStatus, + FeishuGatewayStatus, + FeishuGroupConfig, + FeishuProbeResult, + GatewayChannelStatusResponse, + GatewayConfig, + GatewayTunnelConfig, + GatewayTunnelCreateResponse, + GatewayTunnelProbeResult, + GatewayTunnelStatus, + GatewayTunnelSyncWebhookResponse, + TelegramBotConfig, + TelegramGatewayAccountStatus, + TelegramGatewayStatus, + TelegramProbeResult, +} from "@/lib/api/channelsRuntime"; +import type { + ExperimentalFeatures, + SmartInputConfig, + ToolCallingConfig, +} from "@/lib/api/experimentalFeatures"; +import type { + AutoMemoryIndexItem, + AutoMemoryIndexResponse, + CleanupMemoryResult, + EffectiveMemorySource, + EffectiveMemorySourcesResponse, + MemoryAnalysisResult, + MemoryAutoConfig, + MemoryAutoToggleResponse, + MemoryCategoryStat, + MemoryConfig, + MemoryEntryPreview, + MemoryOverviewResponse, + MemoryProfileConfig, + MemoryResolveConfig, + MemorySourcesConfig, + MemoryStatsResponse, +} from "@/lib/api/memoryRuntime"; +import type { + AmpConfig, + AmpModelMapping, + ApiKeyEntry, + CheckResult, + ClaudeCustomStatus, + CredentialEntry, + CredentialPoolConfig, + EnvVariable, + GeminiApiKeyEntry, + GeminiCredentialStatus, + IFlowCredentialEntry, + KiroCredentialStatus, + OpenAICustomStatus, + QwenCredentialStatus, + VertexApiKeyEntry, + VertexModelAlias, +} from "@/lib/api/providerRuntime"; export { checkAndReloadCredentials, checkAndReloadGeminiCredentials, @@ -75,6 +178,28 @@ export { setDefaultProvider, updateProviderEnvVars, } from "@/lib/api/appConfig"; +export type { + AssistantConfig, + ChatAppearanceConfig, + Config, + ContentCreatorConfig, + CrashReportingConfig, + EnvironmentConfig, + EnvironmentPreview, + EnvironmentPreviewEntry, + EnvironmentVariableOverride, + ImageGenConfig, + MultiSearchConfig, + MultiSearchEngineEntryConfig, + NavigationConfig, + QuotaExceededConfig, + RemoteManagementConfig, + ResponseCacheConfig, + ShellImportPreview, + TlsConfig, + UserProfile, + VoiceConfig, +} from "@/lib/api/appConfig"; export { clearDiagnosticLogHistory, clearLogs, @@ -92,12 +217,15 @@ export type { NetworkInfo, TestResult } from "@/lib/api/serverTools"; export type { AmpConfig, AmpModelMapping, + ApiKeyEntry, CheckResult, ClaudeCustomStatus, CredentialEntry, + CredentialPoolConfig, EnvVariable, GeminiApiKeyEntry, GeminiCredentialStatus, + IFlowCredentialEntry, KiroCredentialStatus, OpenAICustomStatus, QwenCredentialStatus, @@ -107,6 +235,7 @@ export type { export type { ExperimentalFeatures, SmartInputConfig, + ToolCallingConfig, } from "@/lib/api/experimentalFeatures"; export type { ModelInfo } from "@/lib/api/modelCatalog"; export type { @@ -116,30 +245,59 @@ export type { } from "@/lib/api/usageStats"; export type { AutoMemoryIndexResponse, + CleanupMemoryResult, EffectiveMemorySourcesResponse, + EffectiveMemorySource, + MemoryAnalysisResult, MemoryAutoConfig, MemoryAutoToggleResponse, + MemoryCategoryStat, MemoryConfig, + MemoryEntryPreview, MemoryOverviewResponse, MemoryProfileConfig, MemoryResolveConfig, MemorySourcesConfig, + MemoryStatsResponse, } from "@/lib/api/memoryRuntime"; export type { ChannelsConfig, CloudflaredInstallResult, CloudflaredInstallStatus, + CloudflareTunnelConfig, + DiscordAccountConfig, + DiscordActionsConfig, + DiscordAgentComponentsConfig, + DiscordAutoPresenceConfig, DiscordBotConfig, + DiscordChannelConfig, + DiscordExecApprovalsConfig, + DiscordGatewayAccountStatus, + DiscordGatewayStatus, + DiscordGuildConfig, + DiscordIntentsConfig, DiscordProbeResult, + DiscordThreadBindingsConfig, + DiscordUiComponentsConfig, + DiscordUiConfig, + DiscordVoiceAutoJoinConfig, + DiscordVoiceConfig, + FeishuAccountConfig, FeishuBotConfig, + FeishuGatewayAccountStatus, + FeishuGatewayStatus, + FeishuGroupConfig, FeishuProbeResult, GatewayChannelStatusResponse, GatewayConfig, + GatewayTunnelConfig, GatewayTunnelCreateResponse, GatewayTunnelProbeResult, GatewayTunnelStatus, GatewayTunnelSyncWebhookResponse, TelegramBotConfig, + TelegramGatewayAccountStatus, + TelegramGatewayStatus, TelegramProbeResult, } from "@/lib/api/channelsRuntime"; export type { @@ -164,901 +322,6 @@ export type { export type { LogEntry } from "@/lib/api/logs"; import { safeInvoke } from "@/lib/dev-bridge"; -// TLS Configuration -export interface TlsConfig { - enable: boolean; - cert_path: string | null; - key_path: string | null; -} - -// Response Cache Configuration -export interface ResponseCacheConfig { - enabled: boolean; - ttl_secs: number; - max_entries: number; - max_body_bytes: number; - cacheable_status_codes: number[]; -} - -// Remote Management Configuration -export interface RemoteManagementConfig { - allow_remote: boolean; - secret_key: string | null; - disable_control_panel: boolean; -} - -// Quota Exceeded Configuration -export interface QuotaExceededConfig { - switch_project: boolean; - switch_preview_model: boolean; - cooldown_seconds: number; -} - -// Amp Model Mapping -export interface AmpModelMapping { - from: string; - to: string; -} - -// Amp CLI Configuration -export interface AmpConfig { - upstream_url: string | null; - model_mappings: AmpModelMapping[]; - restrict_management_to_localhost: boolean; -} - -// Gemini API Key Entry -export interface GeminiApiKeyEntry { - id: string; - api_key: string; - base_url: string | null; - proxy_url: string | null; - excluded_models: string[]; - disabled: boolean; -} - -// Vertex Model Alias -export interface VertexModelAlias { - name: string; - alias: string; -} - -// Vertex API Key Entry -export interface VertexApiKeyEntry { - id: string; - api_key: string; - base_url: string | null; - models: VertexModelAlias[]; - proxy_url: string | null; - disabled: boolean; -} - -// iFlow Credential Entry -export interface IFlowCredentialEntry { - id: string; - token_file: string | null; - auth_type: string; - cookies: string | null; - proxy_url: string | null; - disabled: boolean; -} - -// Credential Entry (OAuth) -export interface CredentialEntry { - id: string; - token_file: string; - disabled: boolean; - proxy_url: string | null; -} - -// Credential Pool Configuration -export interface CredentialPoolConfig { - kiro: CredentialEntry[]; - gemini: CredentialEntry[]; - qwen: CredentialEntry[]; - openai: ApiKeyEntry[]; - claude: ApiKeyEntry[]; - gemini_api_keys: GeminiApiKeyEntry[]; - vertex_api_keys: VertexApiKeyEntry[]; - codex: CredentialEntry[]; - iflow: IFlowCredentialEntry[]; -} - -// API Key Entry -export interface ApiKeyEntry { - id: string; - api_key: string; - base_url: string | null; - disabled: boolean; - proxy_url: string | null; -} - -export interface MultiSearchEngineEntryConfig { - name: string; - url_template: string; - enabled: boolean; -} - -export interface MultiSearchConfig { - priority?: string[]; - engines?: MultiSearchEngineEntryConfig[]; - max_results_per_engine?: number; - max_total_results?: number; - timeout_ms?: number; -} - -// ============ 实验室功能配置 ============ - -/** - * 截图对话功能配置 - */ -export interface SmartInputConfig { - /** 是否启用截图对话功能 */ - enabled: boolean; - /** 触发截图的全局快捷键 */ - shortcut: string; -} - -/** - * 实验室功能配置 - */ -export interface ExperimentalFeatures { - /** 截图对话功能配置 */ - screenshot_chat: SmartInputConfig; -} - -/** - * Tool Calling 2.0 配置 - */ -export interface ToolCallingConfig { - /** 总开关 */ - enabled: boolean; - /** 动态过滤(网页噪音过滤) */ - dynamic_filtering: boolean; - /** 原生 input examples 透传 */ - native_input_examples: boolean; -} - -/** - * 内容创作配置 - */ -export interface MediaGenerationPreferenceConfig { - preferredProviderId?: string; - preferredModelId?: string; - allowFallback?: boolean; -} - -export interface MediaGenerationDefaultsConfig { - image?: MediaGenerationPreferenceConfig; - video?: MediaGenerationPreferenceConfig; - voice?: MediaGenerationPreferenceConfig; -} - -export interface ContentCreatorConfig { - /** 启用的主题列表 */ - enabled_themes: string[]; - /** 全局媒体生成默认设置 */ - media_defaults?: MediaGenerationDefaultsConfig; -} - -/** - * 导航栏配置 - */ -export interface NavigationConfig { - /** 启用的导航模块列表 */ - enabled_items: string[]; -} - -/** - * 聊天外观配置 - */ -export interface ChatAppearanceConfig { - /** 字体大小 (12-18) */ - fontSize?: number; - /** 消息过渡模式 */ - transitionMode?: "none" | "fadeIn" | "smooth"; - /** 气泡样式 */ - bubbleStyle?: "default" | "minimal" | "colorful"; - /** 显示头像 */ - showAvatar?: boolean; - /** 显示时间戳 */ - showTimestamp?: boolean; - /** 推荐点击时自动附带当前选中文本上下文 */ - append_selected_text_to_recommendation?: boolean; -} - -/** - * 记忆管理系统配置 - */ -export interface MemoryProfileConfig { - /** 当前学习/工作状态(单选) */ - current_status?: string; - /** 擅长领域(多选) */ - strengths?: string[]; - /** 偏好的解释风格(多选) */ - explanation_style?: string[]; - /** 遇到难题时的偏好(多选) */ - challenge_preference?: string[]; -} - -/** - * 记忆来源配置 - */ -export interface MemorySourcesConfig { - /** 组织级策略文件路径 */ - managed_policy_path?: string | null; - /** 项目记忆文件(按目录层级向上发现) */ - project_memory_paths?: string[]; - /** 项目规则目录(按目录层级向上发现) */ - project_rule_dirs?: string[]; - /** 用户级记忆文件路径 */ - user_memory_path?: string | null; - /** 项目本地记忆文件路径 */ - project_local_memory_path?: string | null; -} - -/** - * 自动记忆配置 - */ -export interface MemoryAutoConfig { - /** 是否启用自动记忆 */ - enabled?: boolean; - /** 入口文件名 */ - entrypoint?: string; - /** 启动时加载入口的最大行数 */ - max_loaded_lines?: number; - /** 自动记忆根目录 */ - root_dir?: string | null; -} - -/** - * 记忆解析行为配置 - */ -export interface MemoryResolveConfig { - /** 额外目录(例如外部 workspace) */ - additional_dirs?: string[]; - /** 是否跟随 @import */ - follow_imports?: boolean; - /** 最大导入深度 */ - import_max_depth?: number; - /** 是否加载额外目录中的记忆来源 */ - load_additional_dirs_memory?: boolean; -} - -/** - * 记忆管理系统配置 - */ -export interface MemoryConfig { - /** 是否启用记忆功能 */ - enabled: boolean; - /** 最大记忆条数 */ - max_entries?: number; - /** 记忆保留天数 */ - retention_days?: number; - /** 自动清理过期记忆 */ - auto_cleanup?: boolean; - /** 记忆偏好画像 */ - profile?: MemoryProfileConfig; - /** 记忆来源配置 */ - sources?: MemorySourcesConfig; - /** 自动记忆配置 */ - auto?: MemoryAutoConfig; - /** 记忆解析行为配置 */ - resolve?: MemoryResolveConfig; -} - -/** - * 语音服务配置 - */ -export interface VoiceConfig { - /** TTS 服务商 */ - tts_service?: "openai" | "azure" | "google" | "edge" | "macos"; - /** STT 服务商 */ - stt_service?: "openai" | "azure" | "google" | "whisper"; - /** TTS 语音 */ - tts_voice?: string; - /** TTS 语速 (0.1-2.0) */ - tts_rate?: number; - /** TTS 音调 (0.1-2.0) */ - tts_pitch?: number; - /** TTS 音量 (0-1) */ - tts_volume?: number; - /** STT 语言 */ - stt_language?: string; - /** 自动停止录音 */ - stt_auto_stop?: boolean; - /** 启用语音输入 */ - voice_input_enabled?: boolean; - /** 启用语音输出 */ - voice_output_enabled?: boolean; -} - -/** - * 图像生成服务配置 - */ -export interface ImageGenConfig { - /** 默认图像生成服务 */ - default_service?: "dall_e" | "midjourney" | "stable_diffusion" | "flux"; - /** 默认图像数量 */ - default_count?: number; - /** 默认图像尺寸 */ - default_size?: - | "256x256" - | "512x512" - | "1024x1024" - | "1792x1024" - | "1024x1792"; - /** 默认图像质量 */ - default_quality?: "standard" | "hd"; - /** 默认图像风格 */ - default_style?: "vivid" | "natural"; - /** 启用图像增强 */ - enable_enhancement?: boolean; - /** 自动下载生成的图像 */ - auto_download?: boolean; - /** 图片搜索(Pexels)API Key */ - image_search_pexels_api_key?: string; - /** 图片搜索(Pixabay)API Key */ - image_search_pixabay_api_key?: string; -} - -/** - * 助理配置 - */ -export interface AssistantConfig { - /** 默认助理 ID */ - default_assistant_id?: string; - /** 自定义助理列表 */ - custom_assistants?: Array<{ - id: string; - name: string; - description?: string; - model?: string; - system_prompt?: string; - temperature?: number; - max_tokens?: number; - }>; - /** 启用助理自动选择 */ - auto_select?: boolean; - /** 显示助理建议 */ - show_suggestions?: boolean; -} - -/** - * 用户资料配置 - */ -export interface UserProfile { - /** 用户头像 URL */ - avatar_url?: string; - /** 昵称 */ - nickname?: string; - /** 个人简介 */ - bio?: string; - /** 邮箱 */ - email?: string; - /** 偏好标签 */ - tags?: string[]; -} - -// ============ 渠道配置类型 ============ - -export interface TelegramBotConfig { - enabled: boolean; - bot_token: string; - allowed_user_ids: string[]; - default_model?: string; -} - -export interface DiscordBotConfig { - enabled: boolean; - bot_token: string; - allowed_server_ids: string[]; - default_model?: string; - default_account?: string; - accounts?: Record; - dm_policy?: string; - allow_from?: string[]; - group_policy?: string; - group_allow_from?: string[]; - groups?: Record; - streaming?: string; - reply_to_mode?: string; - intents?: DiscordIntentsConfig; - actions?: DiscordActionsConfig; - thread_bindings?: DiscordThreadBindingsConfig; - auto_presence?: DiscordAutoPresenceConfig; - voice?: DiscordVoiceConfig; - agent_components?: DiscordAgentComponentsConfig; - ui?: DiscordUiConfig; - exec_approvals?: DiscordExecApprovalsConfig; - response_prefix?: string; - ack_reaction?: string; -} - -export interface DiscordAccountConfig { - enabled?: boolean; - name?: string; - bot_token?: string; - allowed_server_ids?: string[]; - default_model?: string; - dm_policy?: string; - allow_from?: string[]; - group_policy?: string; - group_allow_from?: string[]; - groups?: Record; - streaming?: string; - reply_to_mode?: string; - intents?: DiscordIntentsConfig; - actions?: DiscordActionsConfig; - thread_bindings?: DiscordThreadBindingsConfig; - auto_presence?: DiscordAutoPresenceConfig; - voice?: DiscordVoiceConfig; - agent_components?: DiscordAgentComponentsConfig; - ui?: DiscordUiConfig; - exec_approvals?: DiscordExecApprovalsConfig; - response_prefix?: string; - ack_reaction?: string; -} - -export interface DiscordGuildConfig { - enabled?: boolean; - require_mention?: boolean; - group_policy?: string; - allow_from?: string[]; - channels?: Record; -} - -export interface DiscordChannelConfig { - enabled?: boolean; - require_mention?: boolean; - group_policy?: string; - allow_from?: string[]; -} - -export interface DiscordIntentsConfig { - message_content?: boolean; - guild_members?: boolean; - presence?: boolean; -} - -export interface DiscordActionsConfig { - reactions?: boolean; - messages?: boolean; - threads?: boolean; - moderation?: boolean; - presence?: boolean; -} - -export interface DiscordThreadBindingsConfig { - enabled?: boolean; - idle_hours?: number; - max_age_hours?: number; - spawn_subagent_sessions?: boolean; - spawn_acp_sessions?: boolean; -} - -export interface DiscordAutoPresenceConfig { - enabled?: boolean; - interval_ms?: number; - min_update_interval_ms?: number; - healthy_text?: string; - degraded_text?: string; - exhausted_text?: string; -} - -export interface DiscordVoiceAutoJoinConfig { - guild_id: string; - channel_id: string; -} - -export interface DiscordVoiceConfig { - enabled?: boolean; - auto_join?: DiscordVoiceAutoJoinConfig[]; - dave_encryption?: boolean; - decryption_failure_tolerance?: number; -} - -export interface DiscordAgentComponentsConfig { - enabled?: boolean; -} - -export interface DiscordUiComponentsConfig { - accent_color?: string; -} - -export interface DiscordUiConfig { - components?: DiscordUiComponentsConfig; -} - -export interface DiscordExecApprovalsConfig { - enabled?: boolean; - approvers?: string[]; - agent_filter?: string[]; - session_filter?: string[]; - cleanup_after_resolve?: boolean; - target?: string; -} - -export interface FeishuBotConfig { - enabled: boolean; - app_id: string; - app_secret: string; - verification_token?: string; - encrypt_key?: string; - default_model?: string; - default_account?: string; - accounts?: Record; - domain?: string; - connection_mode?: string; - webhook_host?: string; - webhook_port?: number; - webhook_path?: string; - dm_policy?: string; - allow_from?: string[]; - group_policy?: string; - group_allow_from?: string[]; - groups?: Record; - streaming?: string; - reply_to_mode?: string; -} - -export interface FeishuGroupConfig { - enabled?: boolean; - require_mention?: boolean; - group_policy?: string; - allow_from?: string[]; -} - -export interface FeishuAccountConfig { - enabled?: boolean; - name?: string; - app_id?: string; - app_secret?: string; - verification_token?: string; - encrypt_key?: string; - default_model?: string; - domain?: string; - connection_mode?: string; - webhook_host?: string; - webhook_port?: number; - webhook_path?: string; - dm_policy?: string; - allow_from?: string[]; - group_policy?: string; - group_allow_from?: string[]; - groups?: Record; - streaming?: string; - reply_to_mode?: string; -} - -export interface CloudflareTunnelConfig { - account_id?: string; - tunnel_name?: string; - tunnel_id?: string; - run_token?: string; - credentials_file?: string; - dns_name?: string; -} - -export interface GatewayTunnelConfig { - enabled?: boolean; - provider?: string; - mode?: string; - binary_path?: string; - local_host?: string; - local_port?: number; - public_base_url?: string; - cloudflare?: CloudflareTunnelConfig; -} - -export interface GatewayConfig { - tunnel?: GatewayTunnelConfig; -} - -export interface ChannelsConfig { - telegram: TelegramBotConfig; - discord: DiscordBotConfig; - feishu: FeishuBotConfig; -} - -export interface CrashReportingConfig { - enabled: boolean; - dsn?: string | null; - environment?: string; - sample_rate?: number; - send_pii?: boolean; -} - -export interface ShellEnvironmentImportConfig { - enabled: boolean; - timeout_ms: number; -} - -export interface EnvironmentVariableOverride { - key: string; - value: string; - enabled: boolean; -} - -export interface EnvironmentConfig { - shell_import: ShellEnvironmentImportConfig; - variables: EnvironmentVariableOverride[]; -} - -export interface EnvironmentPreviewEntry { - key: string; - value: string; - maskedValue: string; - source: string; - sourceLabel: string; - sensitive: boolean; - overriddenSources: string[]; -} - -export interface ShellImportPreview { - enabled: boolean; - status: string; - message: string; - importedCount: number; - durationMs?: number | null; -} - -export interface EnvironmentPreview { - shellImport: ShellImportPreview; - entries: EnvironmentPreviewEntry[]; -} - -export interface Config { - server: { - host: string; - port: number; - api_key: string; - tls: TlsConfig; - response_cache: ResponseCacheConfig; - }; - providers: { - kiro: { - enabled: boolean; - credentials_path: string | null; - region: string | null; - }; - gemini: { - enabled: boolean; - credentials_path: string | null; - }; - qwen: { - enabled: boolean; - credentials_path: string | null; - }; - openai: { - enabled: boolean; - api_key: string | null; - base_url: string | null; - }; - claude: { - enabled: boolean; - api_key: string | null; - base_url: string | null; - }; - }; - default_provider: string; - remote_management: RemoteManagementConfig; - quota_exceeded: QuotaExceededConfig; - ampcode: AmpConfig; - credential_pool: CredentialPoolConfig; - proxy_url: string | null; - /** 关闭时最小化到托盘(而不是退出应用) */ - minimize_to_tray: boolean; - /** 用户界面语言 ("zh" 或 "en") */ - language: string; - /** 实验室功能配置 */ - experimental?: ExperimentalFeatures; - /** Tool Calling 2.0 配置 */ - tool_calling?: ToolCallingConfig; - /** 内容创作配置 */ - content_creator?: ContentCreatorConfig; - /** 导航栏配置 */ - navigation?: NavigationConfig; - /** 聊天外观配置 */ - chat_appearance?: ChatAppearanceConfig; - /** 统一环境变量配置 */ - environment?: EnvironmentConfig; - /** 网络搜索配置 */ - web_search?: { - engine: "google" | "xiaohongshu"; - provider?: - | "tavily" - | "multi_search_engine" - | "duckduckgo_instant" - | "bing_search_api" - | "google_custom_search"; - provider_priority?: Array< - | "tavily" - | "multi_search_engine" - | "duckduckgo_instant" - | "bing_search_api" - | "google_custom_search" - >; - tavily_api_key?: string | null; - bing_search_api_key?: string | null; - google_search_api_key?: string | null; - google_search_engine_id?: string | null; - multi_search?: MultiSearchConfig; - }; - /** 记忆管理配置 */ - memory?: MemoryConfig; - /** 语音服务配置 */ - voice?: VoiceConfig; - /** 图像生成服务配置 */ - image_gen?: ImageGenConfig; - /** 助理配置 */ - assistant?: AssistantConfig; - /** 用户资料 */ - user_profile?: UserProfile; - /** Gateway 全局配置 */ - gateway?: GatewayConfig; - /** 渠道配置(Telegram / Discord / 飞书 Bot) */ - channels?: ChannelsConfig; - /** 崩溃上报配置(Sentry 协议兼容) */ - crash_reporting?: CrashReportingConfig; -} - -export interface TelegramGatewayAccountStatus { - account_id: string; - running: boolean; - bot_username?: string | null; - started_at?: string | null; - last_error?: string | null; - last_update_id?: number | null; - last_message_at?: string | null; -} - -export interface TelegramGatewayStatus { - running_accounts: number; - accounts: TelegramGatewayAccountStatus[]; -} - -export interface FeishuGatewayAccountStatus { - account_id: string; - running: boolean; - connection_mode: string; - started_at?: string | null; - last_error?: string | null; - last_event_at?: string | null; - last_message_at?: string | null; - webhook_endpoint?: string | null; -} - -export interface FeishuGatewayStatus { - running_accounts: number; - accounts: FeishuGatewayAccountStatus[]; -} - -export interface DiscordGatewayAccountStatus { - account_id: string; - running: boolean; - connected: boolean; - bot_id?: string | null; - bot_username?: string | null; - application_id?: string | null; - message_content_intent?: string | null; - started_at?: string | null; - last_error?: string | null; - last_event_at?: string | null; - last_message_at?: string | null; - last_disconnect?: string | null; - reconnect_attempts?: number | null; -} - -export interface DiscordGatewayStatus { - running_accounts: number; - accounts: DiscordGatewayAccountStatus[]; -} - -export interface GatewayChannelStatusResponse { - channel: string; - status: unknown; -} - -export interface TelegramProbeResult { - account_id: string; - ok: boolean; - bot_id?: number | null; - username?: string | null; - message: string; -} - -export interface FeishuProbeResult { - account_id: string; - ok: boolean; - app_id?: string | null; - message: string; -} - -export interface DiscordProbeResult { - account_id: string; - ok: boolean; - bot_id?: string | null; - username?: string | null; - application_id?: string | null; - message_content_intent?: string | null; - message: string; -} - -export interface GatewayTunnelStatus { - running: boolean; - provider: string; - mode: string; - binary: string; - local_url: string; - public_base_url?: string | null; - pid?: number | null; - started_at?: string | null; - last_error?: string | null; - last_exit?: string | null; - command_preview?: string | null; - connector_active?: boolean | null; - connector_message?: string | null; -} - -export interface GatewayTunnelProbeResult { - ok: boolean; - provider: string; - mode: string; - binary: string; - version?: string | null; - config_ready: boolean; - message: string; -} - -export interface CloudflaredInstallStatus { - installed: boolean; - binary: string; - version?: string | null; - platform: string; - package_manager?: string | null; - install_supported: boolean; - install_command?: string | null; - requires_privilege: boolean; - message: string; -} - -export interface CloudflaredInstallResult { - ok: boolean; - attempted: boolean; - platform: string; - package_manager?: string | null; - command?: string | null; - exit_code?: number | null; - installed: boolean; - version?: string | null; - stdout: string; - stderr: string; - message: string; -} - -export interface GatewayTunnelCreateResponse { - result: { - ok: boolean; - tunnel_name: string; - tunnel_id?: string | null; - credentials_file?: string | null; - dns_name?: string | null; - public_base_url?: string | null; - message: string; - }; - status: GatewayTunnelStatus; -} - -export interface GatewayTunnelSyncWebhookResponse { - channel: string; - account_id?: string | null; - webhook_path: string; - public_base_url: string; - webhook_url: string; - persisted: boolean; -} - export async function revealInFinder(path: string): Promise { return revealPathInFinder(path); } @@ -1173,88 +436,6 @@ export async function setEndpointProvider( */ // ============ 记忆管理 API ============ -export interface MemoryStatsResponse { - total_entries: number; - storage_used: number; - memory_count: number; -} - -export interface MemoryCategoryStat { - category: "identity" | "context" | "preference" | "experience" | "activity"; - count: number; -} - -export interface MemoryEntryPreview { - id: string; - session_id: string; - file_type: string; - category: "identity" | "context" | "preference" | "experience" | "activity"; - title: string; - summary: string; - updated_at: number; - tags: string[]; -} - -export interface MemoryOverviewResponse { - stats: MemoryStatsResponse; - categories: MemoryCategoryStat[]; - entries: MemoryEntryPreview[]; -} - -export interface CleanupMemoryResult { - cleaned_entries: number; - freed_space: number; -} - -export interface MemoryAnalysisResult { - analyzed_sessions: number; - analyzed_messages: number; - generated_entries: number; - deduplicated_entries: number; -} - -export interface EffectiveMemorySource { - kind: string; - path: string; - exists: boolean; - loaded: boolean; - line_count: number; - import_count: number; - warnings: string[]; - preview?: string | null; -} - -export interface EffectiveMemorySourcesResponse { - working_dir: string; - total_sources: number; - loaded_sources: number; - follow_imports: boolean; - import_max_depth: number; - sources: EffectiveMemorySource[]; -} - -export interface AutoMemoryIndexItem { - title: string; - relative_path: string; - exists: boolean; - summary?: string | null; -} - -export interface AutoMemoryIndexResponse { - enabled: boolean; - root_dir: string; - entrypoint: string; - max_loaded_lines: number; - entry_exists: boolean; - total_lines: number; - preview_lines: string[]; - items: AutoMemoryIndexItem[]; -} - -export interface MemoryAutoToggleResponse { - enabled: boolean; -} - /** * 获取记忆统计信息 */ diff --git a/src/lib/api/appConfig.ts b/src/lib/api/appConfig.ts index e27782758..9ae969400 100644 --- a/src/lib/api/appConfig.ts +++ b/src/lib/api/appConfig.ts @@ -1,19 +1,29 @@ import { safeInvoke } from "@/lib/dev-bridge"; -import type { - Config, - EnvironmentPreview, -} from "@/hooks/useTauri"; +import type { Config, EnvironmentPreview } from "./appConfigTypes"; export type { Config, CrashReportingConfig, + ChatAppearanceConfig, + ContentCreatorConfig, EnvironmentConfig, EnvironmentPreview, EnvironmentPreviewEntry, EnvironmentVariableOverride, + ImageGenConfig, + MultiSearchConfig, + MultiSearchEngineEntryConfig, + NavigationConfig, + QuotaExceededConfig, + RemoteManagementConfig, + ResponseCacheConfig, ShellImportPreview, + TlsConfig, ToolCallingConfig, -} from "@/hooks/useTauri"; + UserProfile, + VoiceConfig, + AssistantConfig, +} from "./appConfigTypes"; export async function getConfig(): Promise { return safeInvoke("get_config"); diff --git a/src/lib/api/appConfigTypes.ts b/src/lib/api/appConfigTypes.ts new file mode 100644 index 000000000..dd1f50802 --- /dev/null +++ b/src/lib/api/appConfigTypes.ts @@ -0,0 +1,257 @@ +import type { ChannelsConfig, GatewayConfig } from "./channelsRuntimeTypes"; +import type { + ExperimentalFeatures, + ToolCallingConfig, +} from "./experimentalFeatureTypes"; +import type { MemoryConfig } from "./memoryRuntimeTypes"; +import type { AmpConfig, CredentialPoolConfig } from "./providerRuntimeTypes"; + +export type { ToolCallingConfig } from "./experimentalFeatureTypes"; + +export interface TlsConfig { + enable: boolean; + cert_path: string | null; + key_path: string | null; +} + +export interface ResponseCacheConfig { + enabled: boolean; + ttl_secs: number; + max_entries: number; + max_body_bytes: number; + cacheable_status_codes: number[]; +} + +export interface RemoteManagementConfig { + allow_remote: boolean; + secret_key: string | null; + disable_control_panel: boolean; +} + +export interface QuotaExceededConfig { + switch_project: boolean; + switch_preview_model: boolean; + cooldown_seconds: number; +} + +export interface MultiSearchEngineEntryConfig { + name: string; + url_template: string; + enabled: boolean; +} + +export interface MultiSearchConfig { + priority?: string[]; + engines?: MultiSearchEngineEntryConfig[]; + max_results_per_engine?: number; + max_total_results?: number; + timeout_ms?: number; +} + +export interface MediaGenerationPreferenceConfig { + preferredProviderId?: string; + preferredModelId?: string; + allowFallback?: boolean; +} + +export interface MediaGenerationDefaultsConfig { + image?: MediaGenerationPreferenceConfig; + video?: MediaGenerationPreferenceConfig; + voice?: MediaGenerationPreferenceConfig; +} + +export interface ContentCreatorConfig { + enabled_themes: string[]; + media_defaults?: MediaGenerationDefaultsConfig; +} + +export interface NavigationConfig { + enabled_items: string[]; +} + +export interface ChatAppearanceConfig { + fontSize?: number; + transitionMode?: "none" | "fadeIn" | "smooth"; + bubbleStyle?: "default" | "minimal" | "colorful"; + showAvatar?: boolean; + showTimestamp?: boolean; + append_selected_text_to_recommendation?: boolean; +} + +export interface VoiceConfig { + tts_service?: "openai" | "azure" | "google" | "edge" | "macos"; + stt_service?: "openai" | "azure" | "google" | "whisper"; + tts_voice?: string; + tts_rate?: number; + tts_pitch?: number; + tts_volume?: number; + stt_language?: string; + stt_auto_stop?: boolean; + voice_input_enabled?: boolean; + voice_output_enabled?: boolean; +} + +export interface ImageGenConfig { + default_service?: "dall_e" | "midjourney" | "stable_diffusion" | "flux"; + default_count?: number; + default_size?: + | "256x256" + | "512x512" + | "1024x1024" + | "1792x1024" + | "1024x1792"; + default_quality?: "standard" | "hd"; + default_style?: "vivid" | "natural"; + enable_enhancement?: boolean; + auto_download?: boolean; + image_search_pexels_api_key?: string; + image_search_pixabay_api_key?: string; +} + +export interface AssistantConfig { + default_assistant_id?: string; + custom_assistants?: Array<{ + id: string; + name: string; + description?: string; + model?: string; + system_prompt?: string; + temperature?: number; + max_tokens?: number; + }>; + auto_select?: boolean; + show_suggestions?: boolean; +} + +export interface UserProfile { + avatar_url?: string; + nickname?: string; + bio?: string; + email?: string; + tags?: string[]; +} + +export interface CrashReportingConfig { + enabled: boolean; + dsn?: string | null; + environment?: string; + sample_rate?: number; + send_pii?: boolean; +} + +export interface ShellEnvironmentImportConfig { + enabled: boolean; + timeout_ms: number; +} + +export interface EnvironmentVariableOverride { + key: string; + value: string; + enabled: boolean; +} + +export interface EnvironmentConfig { + shell_import: ShellEnvironmentImportConfig; + variables: EnvironmentVariableOverride[]; +} + +export interface EnvironmentPreviewEntry { + key: string; + value: string; + maskedValue: string; + source: string; + sourceLabel: string; + sensitive: boolean; + overriddenSources: string[]; +} + +export interface ShellImportPreview { + enabled: boolean; + status: string; + message: string; + importedCount: number; + durationMs?: number | null; +} + +export interface EnvironmentPreview { + shellImport: ShellImportPreview; + entries: EnvironmentPreviewEntry[]; +} + +export interface Config { + server: { + host: string; + port: number; + api_key: string; + tls: TlsConfig; + response_cache: ResponseCacheConfig; + }; + providers: { + kiro: { + enabled: boolean; + credentials_path: string | null; + region: string | null; + }; + gemini: { + enabled: boolean; + credentials_path: string | null; + }; + qwen: { + enabled: boolean; + credentials_path: string | null; + }; + openai: { + enabled: boolean; + api_key: string | null; + base_url: string | null; + }; + claude: { + enabled: boolean; + api_key: string | null; + base_url: string | null; + }; + }; + default_provider: string; + remote_management: RemoteManagementConfig; + quota_exceeded: QuotaExceededConfig; + ampcode: AmpConfig; + credential_pool: CredentialPoolConfig; + proxy_url: string | null; + minimize_to_tray: boolean; + language: string; + experimental?: ExperimentalFeatures; + tool_calling?: ToolCallingConfig; + content_creator?: ContentCreatorConfig; + navigation?: NavigationConfig; + chat_appearance?: ChatAppearanceConfig; + environment?: EnvironmentConfig; + web_search?: { + engine: "google" | "xiaohongshu"; + provider?: + | "tavily" + | "multi_search_engine" + | "duckduckgo_instant" + | "bing_search_api" + | "google_custom_search"; + provider_priority?: Array< + | "tavily" + | "multi_search_engine" + | "duckduckgo_instant" + | "bing_search_api" + | "google_custom_search" + >; + tavily_api_key?: string | null; + bing_search_api_key?: string | null; + google_search_api_key?: string | null; + google_search_engine_id?: string | null; + multi_search?: MultiSearchConfig; + }; + memory?: MemoryConfig; + voice?: VoiceConfig; + image_gen?: ImageGenConfig; + assistant?: AssistantConfig; + user_profile?: UserProfile; + gateway?: GatewayConfig; + channels?: ChannelsConfig; + crash_reporting?: CrashReportingConfig; +} diff --git a/src/lib/api/channelsRuntime.ts b/src/lib/api/channelsRuntime.ts index 2e92c8ab5..66eb9ecb6 100644 --- a/src/lib/api/channelsRuntime.ts +++ b/src/lib/api/channelsRuntime.ts @@ -10,25 +10,48 @@ import type { GatewayTunnelStatus, GatewayTunnelSyncWebhookResponse, TelegramProbeResult, -} from "@/hooks/useTauri"; +} from "./channelsRuntimeTypes"; export type { ChannelsConfig, CloudflaredInstallResult, CloudflaredInstallStatus, + DiscordAccountConfig, + DiscordActionsConfig, + DiscordAgentComponentsConfig, DiscordBotConfig, + DiscordChannelConfig, + DiscordExecApprovalsConfig, + DiscordGatewayAccountStatus, + DiscordGatewayStatus, + DiscordGuildConfig, + DiscordIntentsConfig, DiscordProbeResult, + DiscordThreadBindingsConfig, + DiscordUiComponentsConfig, + DiscordUiConfig, + DiscordVoiceAutoJoinConfig, + DiscordVoiceConfig, + DiscordAutoPresenceConfig, FeishuBotConfig, + FeishuAccountConfig, + FeishuGatewayAccountStatus, + FeishuGatewayStatus, + FeishuGroupConfig, FeishuProbeResult, + CloudflareTunnelConfig, GatewayChannelStatusResponse, GatewayConfig, GatewayTunnelCreateResponse, + GatewayTunnelConfig, GatewayTunnelProbeResult, GatewayTunnelStatus, GatewayTunnelSyncWebhookResponse, TelegramBotConfig, + TelegramGatewayAccountStatus, + TelegramGatewayStatus, TelegramProbeResult, -} from "@/hooks/useTauri"; +} from "./channelsRuntimeTypes"; export async function gatewayChannelStart(params?: { channel?: "telegram" | "feishu" | "discord"; diff --git a/src/lib/api/channelsRuntimeTypes.ts b/src/lib/api/channelsRuntimeTypes.ts new file mode 100644 index 000000000..b62199c36 --- /dev/null +++ b/src/lib/api/channelsRuntimeTypes.ts @@ -0,0 +1,374 @@ +export interface TelegramBotConfig { + enabled: boolean; + bot_token: string; + allowed_user_ids: string[]; + default_model?: string; +} + +export interface DiscordBotConfig { + enabled: boolean; + bot_token: string; + allowed_server_ids: string[]; + default_model?: string; + default_account?: string; + accounts?: Record; + dm_policy?: string; + allow_from?: string[]; + group_policy?: string; + group_allow_from?: string[]; + groups?: Record; + streaming?: string; + reply_to_mode?: string; + intents?: DiscordIntentsConfig; + actions?: DiscordActionsConfig; + thread_bindings?: DiscordThreadBindingsConfig; + auto_presence?: DiscordAutoPresenceConfig; + voice?: DiscordVoiceConfig; + agent_components?: DiscordAgentComponentsConfig; + ui?: DiscordUiConfig; + exec_approvals?: DiscordExecApprovalsConfig; + response_prefix?: string; + ack_reaction?: string; +} + +export interface DiscordAccountConfig { + enabled?: boolean; + name?: string; + bot_token?: string; + allowed_server_ids?: string[]; + default_model?: string; + dm_policy?: string; + allow_from?: string[]; + group_policy?: string; + group_allow_from?: string[]; + groups?: Record; + streaming?: string; + reply_to_mode?: string; + intents?: DiscordIntentsConfig; + actions?: DiscordActionsConfig; + thread_bindings?: DiscordThreadBindingsConfig; + auto_presence?: DiscordAutoPresenceConfig; + voice?: DiscordVoiceConfig; + agent_components?: DiscordAgentComponentsConfig; + ui?: DiscordUiConfig; + exec_approvals?: DiscordExecApprovalsConfig; + response_prefix?: string; + ack_reaction?: string; +} + +export interface DiscordGuildConfig { + enabled?: boolean; + require_mention?: boolean; + group_policy?: string; + allow_from?: string[]; + channels?: Record; +} + +export interface DiscordChannelConfig { + enabled?: boolean; + require_mention?: boolean; + group_policy?: string; + allow_from?: string[]; +} + +export interface DiscordIntentsConfig { + message_content?: boolean; + guild_members?: boolean; + presence?: boolean; +} + +export interface DiscordActionsConfig { + reactions?: boolean; + messages?: boolean; + threads?: boolean; + moderation?: boolean; + presence?: boolean; +} + +export interface DiscordThreadBindingsConfig { + enabled?: boolean; + idle_hours?: number; + max_age_hours?: number; + spawn_subagent_sessions?: boolean; + spawn_acp_sessions?: boolean; +} + +export interface DiscordAutoPresenceConfig { + enabled?: boolean; + interval_ms?: number; + min_update_interval_ms?: number; + healthy_text?: string; + degraded_text?: string; + exhausted_text?: string; +} + +export interface DiscordVoiceAutoJoinConfig { + guild_id: string; + channel_id: string; +} + +export interface DiscordVoiceConfig { + enabled?: boolean; + auto_join?: DiscordVoiceAutoJoinConfig[]; + dave_encryption?: boolean; + decryption_failure_tolerance?: number; +} + +export interface DiscordAgentComponentsConfig { + enabled?: boolean; +} + +export interface DiscordUiComponentsConfig { + accent_color?: string; +} + +export interface DiscordUiConfig { + components?: DiscordUiComponentsConfig; +} + +export interface DiscordExecApprovalsConfig { + enabled?: boolean; + approvers?: string[]; + agent_filter?: string[]; + session_filter?: string[]; + cleanup_after_resolve?: boolean; + target?: string; +} + +export interface FeishuBotConfig { + enabled: boolean; + app_id: string; + app_secret: string; + verification_token?: string; + encrypt_key?: string; + default_model?: string; + default_account?: string; + accounts?: Record; + domain?: string; + connection_mode?: string; + webhook_host?: string; + webhook_port?: number; + webhook_path?: string; + dm_policy?: string; + allow_from?: string[]; + group_policy?: string; + group_allow_from?: string[]; + groups?: Record; + streaming?: string; + reply_to_mode?: string; +} + +export interface FeishuGroupConfig { + enabled?: boolean; + require_mention?: boolean; + group_policy?: string; + allow_from?: string[]; +} + +export interface FeishuAccountConfig { + enabled?: boolean; + name?: string; + app_id?: string; + app_secret?: string; + verification_token?: string; + encrypt_key?: string; + default_model?: string; + domain?: string; + connection_mode?: string; + webhook_host?: string; + webhook_port?: number; + webhook_path?: string; + dm_policy?: string; + allow_from?: string[]; + group_policy?: string; + group_allow_from?: string[]; + groups?: Record; + streaming?: string; + reply_to_mode?: string; +} + +export interface CloudflareTunnelConfig { + account_id?: string; + tunnel_name?: string; + tunnel_id?: string; + run_token?: string; + credentials_file?: string; + dns_name?: string; +} + +export interface GatewayTunnelConfig { + enabled?: boolean; + provider?: string; + mode?: string; + binary_path?: string; + local_host?: string; + local_port?: number; + public_base_url?: string; + cloudflare?: CloudflareTunnelConfig; +} + +export interface GatewayConfig { + tunnel?: GatewayTunnelConfig; +} + +export interface ChannelsConfig { + telegram: TelegramBotConfig; + discord: DiscordBotConfig; + feishu: FeishuBotConfig; +} + +export interface TelegramGatewayAccountStatus { + account_id: string; + running: boolean; + bot_username?: string | null; + started_at?: string | null; + last_error?: string | null; + last_update_id?: number | null; + last_message_at?: string | null; +} + +export interface TelegramGatewayStatus { + running_accounts: number; + accounts: TelegramGatewayAccountStatus[]; +} + +export interface FeishuGatewayAccountStatus { + account_id: string; + running: boolean; + connection_mode: string; + started_at?: string | null; + last_error?: string | null; + last_event_at?: string | null; + last_message_at?: string | null; + webhook_endpoint?: string | null; +} + +export interface FeishuGatewayStatus { + running_accounts: number; + accounts: FeishuGatewayAccountStatus[]; +} + +export interface DiscordGatewayAccountStatus { + account_id: string; + running: boolean; + connected: boolean; + bot_id?: string | null; + bot_username?: string | null; + application_id?: string | null; + message_content_intent?: string | null; + started_at?: string | null; + last_error?: string | null; + last_event_at?: string | null; + last_message_at?: string | null; + last_disconnect?: string | null; + reconnect_attempts?: number | null; +} + +export interface DiscordGatewayStatus { + running_accounts: number; + accounts: DiscordGatewayAccountStatus[]; +} + +export interface GatewayChannelStatusResponse { + channel: string; + status: unknown; +} + +export interface TelegramProbeResult { + account_id: string; + ok: boolean; + bot_id?: number | null; + username?: string | null; + message: string; +} + +export interface FeishuProbeResult { + account_id: string; + ok: boolean; + app_id?: string | null; + message: string; +} + +export interface DiscordProbeResult { + account_id: string; + ok: boolean; + bot_id?: string | null; + username?: string | null; + application_id?: string | null; + message_content_intent?: string | null; + message: string; +} + +export interface GatewayTunnelStatus { + running: boolean; + provider: string; + mode: string; + binary: string; + local_url: string; + public_base_url?: string | null; + pid?: number | null; + started_at?: string | null; + last_error?: string | null; + last_exit?: string | null; + command_preview?: string | null; + connector_active?: boolean | null; + connector_message?: string | null; +} + +export interface GatewayTunnelProbeResult { + ok: boolean; + provider: string; + mode: string; + binary: string; + version?: string | null; + config_ready: boolean; + message: string; +} + +export interface CloudflaredInstallStatus { + installed: boolean; + binary: string; + version?: string | null; + platform: string; + package_manager?: string | null; + install_supported: boolean; + install_command?: string | null; + requires_privilege: boolean; + message: string; +} + +export interface CloudflaredInstallResult { + ok: boolean; + attempted: boolean; + platform: string; + package_manager?: string | null; + command?: string | null; + exit_code?: number | null; + installed: boolean; + version?: string | null; + stdout: string; + stderr: string; + message: string; +} + +export interface GatewayTunnelCreateResponse { + result: { + ok: boolean; + tunnel_name: string; + tunnel_id?: string | null; + credentials_file?: string | null; + dns_name?: string | null; + public_base_url?: string | null; + message: string; + }; + status: GatewayTunnelStatus; +} + +export interface GatewayTunnelSyncWebhookResponse { + channel: string; + account_id?: string | null; + webhook_path: string; + public_base_url: string; + webhook_url: string; + persisted: boolean; +} diff --git a/src/lib/api/experimentalFeatureTypes.ts b/src/lib/api/experimentalFeatureTypes.ts new file mode 100644 index 000000000..ec7f9dc1e --- /dev/null +++ b/src/lib/api/experimentalFeatureTypes.ts @@ -0,0 +1,14 @@ +export interface SmartInputConfig { + enabled: boolean; + shortcut: string; +} + +export interface ExperimentalFeatures { + screenshot_chat: SmartInputConfig; +} + +export interface ToolCallingConfig { + enabled: boolean; + dynamic_filtering: boolean; + native_input_examples: boolean; +} diff --git a/src/lib/api/experimentalFeatures.ts b/src/lib/api/experimentalFeatures.ts index 4b7fd5f68..693fd0d40 100644 --- a/src/lib/api/experimentalFeatures.ts +++ b/src/lib/api/experimentalFeatures.ts @@ -1,7 +1,11 @@ import { safeInvoke } from "@/lib/dev-bridge"; -import type { ExperimentalFeatures } from "@/hooks/useTauri"; +import type { ExperimentalFeatures } from "./experimentalFeatureTypes"; -export type { ExperimentalFeatures, SmartInputConfig } from "@/hooks/useTauri"; +export type { + ExperimentalFeatures, + SmartInputConfig, + ToolCallingConfig, +} from "./experimentalFeatureTypes"; export async function getExperimentalConfig(): Promise { return safeInvoke("get_experimental_config"); diff --git a/src/lib/api/memoryRuntime.ts b/src/lib/api/memoryRuntime.ts index 8397df979..83e746591 100644 --- a/src/lib/api/memoryRuntime.ts +++ b/src/lib/api/memoryRuntime.ts @@ -4,19 +4,26 @@ import type { EffectiveMemorySourcesResponse, MemoryAutoToggleResponse, MemoryOverviewResponse, -} from "@/hooks/useTauri"; +} from "./memoryRuntimeTypes"; export type { AutoMemoryIndexResponse, + AutoMemoryIndexItem, + CleanupMemoryResult, EffectiveMemorySourcesResponse, + EffectiveMemorySource, + MemoryAnalysisResult, MemoryAutoConfig, MemoryAutoToggleResponse, + MemoryCategoryStat, MemoryConfig, + MemoryEntryPreview, MemoryOverviewResponse, MemoryProfileConfig, MemoryResolveConfig, MemorySourcesConfig, -} from "@/hooks/useTauri"; + MemoryStatsResponse, +} from "./memoryRuntimeTypes"; export async function getMemoryOverview( limit?: number, diff --git a/src/lib/api/memoryRuntimeTypes.ts b/src/lib/api/memoryRuntimeTypes.ts new file mode 100644 index 000000000..2ef1c33b1 --- /dev/null +++ b/src/lib/api/memoryRuntimeTypes.ts @@ -0,0 +1,121 @@ +export interface MemoryProfileConfig { + current_status?: string; + strengths?: string[]; + explanation_style?: string[]; + challenge_preference?: string[]; +} + +export interface MemorySourcesConfig { + managed_policy_path?: string | null; + project_memory_paths?: string[]; + project_rule_dirs?: string[]; + user_memory_path?: string | null; + project_local_memory_path?: string | null; +} + +export interface MemoryAutoConfig { + enabled?: boolean; + entrypoint?: string; + max_loaded_lines?: number; + root_dir?: string | null; +} + +export interface MemoryResolveConfig { + additional_dirs?: string[]; + follow_imports?: boolean; + import_max_depth?: number; + load_additional_dirs_memory?: boolean; +} + +export interface MemoryConfig { + enabled: boolean; + max_entries?: number; + retention_days?: number; + auto_cleanup?: boolean; + profile?: MemoryProfileConfig; + sources?: MemorySourcesConfig; + auto?: MemoryAutoConfig; + resolve?: MemoryResolveConfig; +} + +export interface MemoryStatsResponse { + total_entries: number; + storage_used: number; + memory_count: number; +} + +export interface MemoryCategoryStat { + category: "identity" | "context" | "preference" | "experience" | "activity"; + count: number; +} + +export interface MemoryEntryPreview { + id: string; + session_id: string; + file_type: string; + category: "identity" | "context" | "preference" | "experience" | "activity"; + title: string; + summary: string; + updated_at: number; + tags: string[]; +} + +export interface MemoryOverviewResponse { + stats: MemoryStatsResponse; + categories: MemoryCategoryStat[]; + entries: MemoryEntryPreview[]; +} + +export interface CleanupMemoryResult { + cleaned_entries: number; + freed_space: number; +} + +export interface MemoryAnalysisResult { + analyzed_sessions: number; + analyzed_messages: number; + generated_entries: number; + deduplicated_entries: number; +} + +export interface EffectiveMemorySource { + kind: string; + path: string; + exists: boolean; + loaded: boolean; + line_count: number; + import_count: number; + warnings: string[]; + preview?: string | null; +} + +export interface EffectiveMemorySourcesResponse { + working_dir: string; + total_sources: number; + loaded_sources: number; + follow_imports: boolean; + import_max_depth: number; + sources: EffectiveMemorySource[]; +} + +export interface AutoMemoryIndexItem { + title: string; + relative_path: string; + exists: boolean; + summary?: string | null; +} + +export interface AutoMemoryIndexResponse { + enabled: boolean; + root_dir: string; + entrypoint: string; + max_loaded_lines: number; + entry_exists: boolean; + total_lines: number; + preview_lines: string[]; + items: AutoMemoryIndexItem[]; +} + +export interface MemoryAutoToggleResponse { + enabled: boolean; +} diff --git a/src/lib/api/providerRuntime.ts b/src/lib/api/providerRuntime.ts index 02caddef2..3097f43c4 100644 --- a/src/lib/api/providerRuntime.ts +++ b/src/lib/api/providerRuntime.ts @@ -1,97 +1,32 @@ import { safeInvoke } from "@/lib/dev-bridge"; +import type { + CheckResult, + ClaudeCustomStatus, + EnvVariable, + GeminiCredentialStatus, + KiroCredentialStatus, + OpenAICustomStatus, + QwenCredentialStatus, +} from "./providerRuntimeTypes"; -export interface AmpModelMapping { - from: string; - to: string; -} - -export interface AmpConfig { - upstream_url: string | null; - model_mappings: AmpModelMapping[]; - restrict_management_to_localhost: boolean; -} - -export interface GeminiApiKeyEntry { - id: string; - api_key: string; - base_url: string | null; - proxy_url: string | null; - excluded_models: string[]; - disabled: boolean; -} - -export interface VertexModelAlias { - name: string; - alias: string; -} - -export interface VertexApiKeyEntry { - id: string; - api_key: string; - base_url: string | null; - models: VertexModelAlias[]; - proxy_url: string | null; - disabled: boolean; -} - -export interface CredentialEntry { - id: string; - token_file: string; - disabled: boolean; - proxy_url: string | null; -} - -export interface KiroCredentialStatus { - loaded: boolean; - has_access_token: boolean; - has_refresh_token: boolean; - region: string | null; - auth_method: string | null; - expires_at: string | null; - creds_path: string; -} - -export interface EnvVariable { - key: string; - value: string; - masked: string; -} - -export interface CheckResult { - changed: boolean; - new_hash: string; - reloaded: boolean; -} - -export interface GeminiCredentialStatus { - loaded: boolean; - has_access_token: boolean; - has_refresh_token: boolean; - expiry_date: number | null; - is_valid: boolean; - creds_path: string; -} - -export interface QwenCredentialStatus { - loaded: boolean; - has_access_token: boolean; - has_refresh_token: boolean; - expiry_date: number | null; - is_valid: boolean; - creds_path: string; -} - -export interface OpenAICustomStatus { - enabled: boolean; - has_api_key: boolean; - base_url: string; -} - -export interface ClaudeCustomStatus { - enabled: boolean; - has_api_key: boolean; - base_url: string; -} +export type { + AmpConfig, + AmpModelMapping, + ApiKeyEntry, + CheckResult, + ClaudeCustomStatus, + CredentialEntry, + CredentialPoolConfig, + EnvVariable, + GeminiApiKeyEntry, + GeminiCredentialStatus, + IFlowCredentialEntry, + KiroCredentialStatus, + OpenAICustomStatus, + QwenCredentialStatus, + VertexApiKeyEntry, + VertexModelAlias, +} from "./providerRuntimeTypes"; export async function refreshKiroToken(): Promise { return safeInvoke("refresh_kiro_token"); diff --git a/src/lib/api/providerRuntimeTypes.ts b/src/lib/api/providerRuntimeTypes.ts new file mode 100644 index 000000000..b2f3da05d --- /dev/null +++ b/src/lib/api/providerRuntimeTypes.ts @@ -0,0 +1,121 @@ +export interface AmpModelMapping { + from: string; + to: string; +} + +export interface AmpConfig { + upstream_url: string | null; + model_mappings: AmpModelMapping[]; + restrict_management_to_localhost: boolean; +} + +export interface GeminiApiKeyEntry { + id: string; + api_key: string; + base_url: string | null; + proxy_url: string | null; + excluded_models: string[]; + disabled: boolean; +} + +export interface VertexModelAlias { + name: string; + alias: string; +} + +export interface VertexApiKeyEntry { + id: string; + api_key: string; + base_url: string | null; + models: VertexModelAlias[]; + proxy_url: string | null; + disabled: boolean; +} + +export interface IFlowCredentialEntry { + id: string; + token_file: string | null; + auth_type: string; + cookies: string | null; + proxy_url: string | null; + disabled: boolean; +} + +export interface CredentialEntry { + id: string; + token_file: string; + disabled: boolean; + proxy_url: string | null; +} + +export interface ApiKeyEntry { + id: string; + api_key: string; + base_url: string | null; + disabled: boolean; + proxy_url: string | null; +} + +export interface CredentialPoolConfig { + kiro: CredentialEntry[]; + gemini: CredentialEntry[]; + qwen: CredentialEntry[]; + openai: ApiKeyEntry[]; + claude: ApiKeyEntry[]; + gemini_api_keys: GeminiApiKeyEntry[]; + vertex_api_keys: VertexApiKeyEntry[]; + codex: CredentialEntry[]; + iflow: IFlowCredentialEntry[]; +} + +export interface KiroCredentialStatus { + loaded: boolean; + has_access_token: boolean; + has_refresh_token: boolean; + region: string | null; + auth_method: string | null; + expires_at: string | null; + creds_path: string; +} + +export interface EnvVariable { + key: string; + value: string; + masked: string; +} + +export interface CheckResult { + changed: boolean; + new_hash: string; + reloaded: boolean; +} + +export interface GeminiCredentialStatus { + loaded: boolean; + has_access_token: boolean; + has_refresh_token: boolean; + expiry_date: number | null; + is_valid: boolean; + creds_path: string; +} + +export interface QwenCredentialStatus { + loaded: boolean; + has_access_token: boolean; + has_refresh_token: boolean; + expiry_date: number | null; + is_valid: boolean; + creds_path: string; +} + +export interface OpenAICustomStatus { + enabled: boolean; + has_api_key: boolean; + base_url: string; +} + +export interface ClaudeCustomStatus { + enabled: boolean; + has_api_key: boolean; + base_url: string; +}