// This file has been generated by Tauri Specta. Do not edit this file manually. import { invoke as __TAURI_INVOKE, Channel } from '@tauri-apps/api/core' /** Commands */ export const commands = { getSystemInfo: () => __TAURI_INVOKE('get_system_info'), /** 获取应用的运行时间(毫秒) */ getAppUptime: () => __TAURI_INVOKE('get_app_uptime'), exportDiagnosticInfo: () => __TAURI_INVOKE('export_diagnostic_info'), probeListener: (request: ListenerProbe) => __TAURI_INVOKE('probe_listener', { request }), saveProxyPorts: (settings: ProxyPortSettings) => __TAURI_INVOKE('save_proxy_ports', { settings }), getSysProxy: () => __TAURI_INVOKE('get_sys_proxy'), getAutoProxy: () => __TAURI_INVOKE('get_auto_proxy'), getEmbeddedServerPort: () => __TAURI_INVOKE('get_embedded_server_port'), openAppDir: () => __TAURI_INVOKE('open_app_dir'), openLogsDir: () => __TAURI_INVOKE('open_logs_dir'), openCoreDir: () => __TAURI_INVOKE('open_core_dir'), getNetworkInterfaces: () => __TAURI_INVOKE('get_network_interfaces'), getSystemHostname: () => __TAURI_INVOKE('get_system_hostname'), restartApp: () => __TAURI_INVOKE('restart_app'), installUpdate: (version: string, onEvent: Channel) => __TAURI_INVOKE('install_update', { version, onEvent }), cancelUpdateDownload: () => __TAURI_INVOKE('cancel_update_download'), restartCore: () => __TAURI_INVOKE('restart_core'), /** Replaces the managed core binary atomically instead of letting mihomo overwrite itself. */ upgradeClashCore: (force: boolean) => __TAURI_INVOKE('upgrade_clash_core', { force }), /** Returns one coherent core/service snapshot instead of independently refreshed state. */ getRuntimeState: () => __TAURI_INVOKE('get_runtime_state'), getPendingFailures: () => __TAURI_INVOKE('get_pending_failures'), getSidecarFailure: () => __TAURI_INVOKE('get_sidecar_failure'), entryLightweightMode: () => __TAURI_INVOKE('entry_lightweight_mode'), installService: () => __TAURI_INVOKE('install_service'), uninstallService: () => __TAURI_INVOKE('uninstall_service'), reinstallService: () => __TAURI_INVOKE('reinstall_service'), repairService: () => __TAURI_INVOKE('repair_service'), continueWithSidecar: () => __TAURI_INVOKE('continue_with_sidecar'), syncRuntimeProviders: () => __TAURI_INVOKE('sync_runtime_providers'), getClashInfo: () => __TAURI_INVOKE('get_clash_info'), patchClashConfig: (payload: YamlMapping) => __TAURI_INVOKE('patch_clash_config', { payload }), patchClashMode: (payload: string) => __TAURI_INVOKE('patch_clash_mode', { payload }), /** Reads the saved mode without depending on strict mihomo `/configs` deserialization. */ getClashMode: () => __TAURI_INVOKE('get_clash_mode'), changeClashCore: (clashCore: string) => __TAURI_INVOKE<{ /** Stable frontend identifier, when classified. */ code?: string | null /** Human-readable diagnostic detail. */ detail: string /** Requested operation when known by the command. */ operation?: FailedOperation | null } | null>('change_clash_core', { clashCore }), getRuntimeConfig: () => __TAURI_INVOKE<{ [key in string]: JsonValue } | null>('get_runtime_config'), getProxyView: () => __TAURI_INVOKE('get_proxy_view'), getRuntimeYaml: () => __TAURI_INVOKE('get_runtime_yaml'), getRuntimeLogs: () => __TAURI_INVOKE('get_runtime_logs'), getRuntimeProxyChainConfig: (proxyChainExitNode: string) => __TAURI_INVOKE('get_runtime_proxy_chain_config', { proxyChainExitNode, }), updateProxyChainConfigInRuntime: (proxyChainConfig: JsonValue | null) => __TAURI_INVOKE('update_proxy_chain_config_in_runtime', { proxyChainConfig, }), invokeUwpTool: () => __TAURI_INVOKE('invoke_uwp_tool'), copyClashEnv: () => __TAURI_INVOKE('copy_clash_env'), syncTrayProxySelection: () => __TAURI_INVOKE('sync_tray_proxy_selection'), /** Merges one selection pair into fresh backend state to avoid stale-list overwrites. */ recordSelectedNode: (groupName: string, node: string) => __TAURI_INVOKE('record_selected_node', { groupName, node }), forgetSelectedNode: (groupName: string) => __TAURI_INVOKE('forget_selected_node', { groupName }), saveDnsConfig: (dnsConfig: YamlMapping) => __TAURI_INVOKE('save_dns_config', { dnsConfig }), applyDnsConfig: (apply: boolean) => __TAURI_INVOKE('apply_dns_config', { apply }), setDnsOverride: ( profileUid: string, enabled: boolean, confirmation: string | null, ) => __TAURI_INVOKE('set_dns_override', { profileUid, enabled, confirmation, }), takeDnsOverrideNotice: () => __TAURI_INVOKE('take_dns_override_notice'), takeServiceFallbackNotice: () => __TAURI_INVOKE< | { kind: 'unavailable' } | { kind: 'coreRejected'; reason: string } | { kind: 'notAutoStarted' } | null >('take_service_fallback_notice'), getCoreStartupError: () => __TAURI_INVOKE< | { kind: 'startFailed'; detail: string } | { kind: 'serviceCoreStopped'; detail: string } | null >('get_core_startup_error'), takeServiceRepairNotice: () => __TAURI_INVOKE('take_service_repair_notice'), takeServiceOwnerNotice: () => __TAURI_INVOKE('take_service_owner_notice'), takeDiscardedKeysNotice: () => __TAURI_INVOKE('take_discarded_keys_notice'), getDnsConfigContent: () => __TAURI_INVOKE('get_dns_config_content'), validateDnsConfig: () => __TAURI_INVOKE('validate_dns_config'), getClashLogs: () => __TAURI_INVOKE('get_clash_logs'), /** 获取Verge配置 */ getVergeConfig: () => __TAURI_INVOKE('get_verge_config'), /** 修改Verge配置 */ patchVergeConfig: (payload: IVerge_Deserialize) => __TAURI_INVOKE('patch_verge_config', { payload }), testDelay: (url: string) => __TAURI_INVOKE('test_delay', { url }), getAppDir: () => __TAURI_INVOKE('get_app_dir'), copyIconFile: (path: string, iconInfo: IconInfo) => __TAURI_INVOKE('copy_icon_file', { path, iconInfo }), downloadIconCache: (url: string, name: string) => __TAURI_INVOKE('download_icon_cache', { url, name }), openDevtools: () => __TAURI_INVOKE('open_devtools'), exitApp: () => __TAURI_INVOKE('exit_app'), getNetworkInterfacesInfo: () => __TAURI_INVOKE('get_network_interfaces_info'), getProfiles: () => __TAURI_INVOKE('get_profiles'), enhanceProfiles: () => __TAURI_INVOKE('enhance_profiles'), patchProfilesConfig: (profiles: ProfileSelection) => __TAURI_INVOKE('patch_profiles_config', { profiles }), viewProfile: (index: string) => __TAURI_INVOKE('view_profile', { index }), patchProfile: (index: string, profile: ProfilePatch_Deserialize) => __TAURI_INVOKE('patch_profile', { index, profile }), createProfile: (item: ProfileCreate_Deserialize, fileData: string | null) => __TAURI_INVOKE('create_profile', { item, fileData }), importProfile: ( url: string, option: { user_agent?: string | null with_proxy?: boolean | null self_proxy?: boolean | null update_interval?: number | null /** * HTTP request timeout in seconds * default is 60 seconds */ timeout_seconds?: number | null /** default is `false` */ danger_accept_invalid_certs?: boolean | null allow_auto_update?: boolean | null merge?: string | null script?: string | null rules?: string | null proxies?: string | null groups?: string | null } | null, ) => __TAURI_INVOKE('import_profile', { url, option }), reorderProfile: (activeId: string, overId: string) => __TAURI_INVOKE('reorder_profile', { activeId, overId }), updateProfile: ( index: string, option: { user_agent?: string | null with_proxy?: boolean | null self_proxy?: boolean | null update_interval?: number | null /** * HTTP request timeout in seconds * default is 60 seconds */ timeout_seconds?: number | null /** default is `false` */ danger_accept_invalid_certs?: boolean | null allow_auto_update?: boolean | null merge?: string | null script?: string | null rules?: string | null proxies?: string | null groups?: string | null } | null, ) => __TAURI_INVOKE('update_profile', { index, option }), deleteProfile: (index: string) => __TAURI_INVOKE('delete_profile', { index }), readProfileFile: (index: string) => __TAURI_INVOKE('read_profile_file', { index }), /** 保存profiles的配置 */ saveProfileFile: (index: string, fileData: string | null) => __TAURI_INVOKE('save_profile_file', { index, fileData }), getNextUpdateTime: (uid: string) => __TAURI_INVOKE('get_next_update_time', { uid }), createLocalBackup: () => __TAURI_INVOKE('create_local_backup'), listLocalBackup: () => __TAURI_INVOKE('list_local_backup'), deleteLocalBackup: (filename: string) => __TAURI_INVOKE('delete_local_backup', { filename }), restoreLocalBackup: (filename: string) => __TAURI_INVOKE('restore_local_backup', { filename }), importLocalBackup: (source: string) => __TAURI_INVOKE('import_local_backup', { source }), exportLocalBackup: (filename: string, destination: string) => __TAURI_INVOKE('export_local_backup', { filename, destination }), createWebdavBackup: () => __TAURI_INVOKE('create_webdav_backup'), saveWebdavConfig: (url: string, username: string, password: string) => __TAURI_INVOKE('save_webdav_config', { url, username, password }), listWebdavBackup: () => __TAURI_INVOKE('list_webdav_backup'), deleteWebdavBackup: (filename: string) => __TAURI_INVOKE('delete_webdav_backup', { filename }), restoreWebdavBackup: (filename: string) => __TAURI_INVOKE('restore_webdav_backup', { filename }), getUnlockItems: () => __TAURI_INVOKE('get_unlock_items'), checkMediaUnlock: (onComplete: Channel) => __TAURI_INVOKE('check_media_unlock', { onComplete }), checkMediaUnlockItem: (name: string) => __TAURI_INVOKE('check_media_unlock_item', { name }), } /* Types */ export type AutoProxy = { enable: boolean url: string } export type ClashInfo = { /** clash core port */ mixed_port: number socks_port: number port: number /** same as `external-controller` */ server: string /** clash secret */ secret: string | null } /** Structured command failure returned to the frontend. */ export type CommandFailure = | CommandFailure_Serialize | CommandFailure_Deserialize /** Structured command failure returned to the frontend. */ export type CommandFailure_Deserialize = { /** Stable frontend identifier, when classified. */ code: string | null /** Human-readable diagnostic detail. */ detail: string /** Requested operation when known by the command. */ operation: FailedOperation | null } /** Structured command failure returned to the frontend. */ export type CommandFailure_Serialize = { /** Stable frontend identifier, when classified. */ code?: string | null /** Human-readable diagnostic detail. */ detail: string /** Requested operation when known by the command. */ operation?: FailedOperation | null } /** Why the Core is not running, kept until a Core starts again. */ export type CoreFailure = | { kind: 'startFailed'; detail: string } | { kind: 'serviceCoreStopped'; detail: string } export type CoreUpgradeReport = { /** False when the managed core was already at the latest version. */ upgraded: boolean } export type DelayHistory = { time: string delay: number } export type DnsOverrideOutcome = | { status: 'applied' } | { status: 'confirmation_required'; source: string } /** Same wire shape as the updater plugin's JS `DownloadEvent`. */ export type DownloadEvent = | { event: 'Started' data: { contentLength: number | null } } | { event: 'Progress' data: { chunkLength: number } } | { event: 'Finished' } /** Operation associated with a pending failure. */ export type FailedOperation = | 'systemProxyEnable' | 'systemProxyDisable' | 'systemProxyRestore' | 'systemProxyGuard' /** Define the `profiles.yaml` schema */ export type IProfiles = IProfiles_Serialize | IProfiles_Deserialize /** Define the `profiles.yaml` schema */ export type IProfiles_Deserialize = { current?: string | null items?: PrfItem_Deserialize[] | null } /** Define the `profiles.yaml` schema */ export type IProfiles_Serialize = { current: string | null items: PrfItem_Serialize[] | null } /** ### `verge.yaml` schema */ export type IVerge = IVerge_Serialize | IVerge_Deserialize export type IVergeTestItem = { uid?: string | null name?: string | null icon?: string | null url?: string | null } export type IVergeTheme = { primary_color?: string | null secondary_color?: string | null primary_text?: string | null secondary_text?: string | null info_color?: string | null error_color?: string | null warning_color?: string | null success_color?: string | null font_family?: string | null css_injection?: string | null } /** ### `verge.yaml` schema */ export type IVerge_Deserialize = { /** silent | error | warn | info | debug | trace */ app_log_level?: string | null /** Maximum app log size in KiB. */ app_log_max_size?: number | null app_log_max_count?: number | null language?: string | null /** `light` or `dark` or `system` */ theme_mode?: string | null tray_event?: string | null env_type?: string | null start_page?: string | null startup_script?: string | null traffic_graph?: boolean | null /** show memory info (only for Clash Meta) */ enable_memory_usage?: boolean | null enable_group_icon?: boolean | null pause_render_traffic_stats_on_blur?: boolean | null common_tray_icon?: boolean | null menu_icon?: string | null menu_order?: string[] | null proxy_group_tools_position?: string | null notice_position?: string | null collapse_navbar?: boolean | null sysproxy_tray_icon?: boolean | null tun_tray_icon?: boolean | null enable_tun_mode?: boolean | null enable_auto_launch?: boolean | null enable_silent_start?: boolean | null enable_system_proxy?: boolean | null enable_proxy_guard?: boolean | null enable_bypass_check?: boolean | null /** Initial DNS override preference for profiles without a saved setting. */ enable_dns_settings?: boolean | null profile_dns_settings?: { [key in string]: ProfileDnsSettings_Deserialize } use_default_bypass?: boolean | null system_proxy_bypass?: string | null proxy_guard_duration?: number | null proxy_auto_config?: boolean | null pac_file_content?: string | null proxy_host?: string | null theme_setting?: IVergeTheme | null web_ui_list?: string[] | null clash_core?: string | null /** format: {func},{key} */ hotkeys?: string[] | null enable_global_hotkey?: boolean | null home_cards?: JsonValue | null auto_close_connection?: boolean | null auto_check_update?: boolean | null default_latency_test?: string | null default_latency_timeout?: number | null enable_auto_delay_detection?: boolean | null /** 自动检测当前节点延迟的间隔(分钟) */ auto_delay_detection_interval_minutes?: number | null enable_builtin_enhanced?: boolean | null proxy_layout_column?: number | null test_list?: IVergeTestItem[] | null /** 0: 不清理; 1: 1天;2: 7天; 3: 30天; 4: 90天 */ auto_log_clean?: number | null enable_auto_backup_schedule?: boolean | null /** Automatic backup interval in hours */ auto_backup_interval_hours?: number | null auto_backup_on_change?: boolean | null verge_mixed_port?: number | null verge_socks_port?: number | null verge_socks_enabled?: boolean | null verge_port?: number | null verge_http_enabled?: boolean | null webdav_url?: string | null webdav_username?: string | null webdav_password?: string | null tray_proxy_groups_display_mode?: string | null tray_inline_outbound_modes?: boolean | null enable_auto_light_weight_mode?: boolean | null /** 自动进入轻量模式的延迟(分钟) */ auto_light_weight_minutes?: number | null enable_hover_jump_navigator?: boolean | null /** 代理页面自动滚动延迟(毫秒) */ hover_jump_navigator_delay?: number | null enable_external_controller?: boolean | null tray_icon?: string | null verge_redir_port?: number | null verge_redir_enabled?: boolean | null verge_tproxy_port?: number | null verge_tproxy_enabled?: boolean | null enable_tray_speed?: boolean | null } /** ### `verge.yaml` schema */ export type IVerge_Serialize = { /** silent | error | warn | info | debug | trace */ app_log_level: string | null /** Maximum app log size in KiB. */ app_log_max_size: number | null app_log_max_count: number | null language: string | null /** `light` or `dark` or `system` */ theme_mode: string | null tray_event: string | null env_type: string | null start_page: string | null startup_script: string | null traffic_graph: boolean | null /** show memory info (only for Clash Meta) */ enable_memory_usage: boolean | null enable_group_icon?: boolean | null pause_render_traffic_stats_on_blur: boolean | null common_tray_icon?: boolean | null menu_icon?: string | null menu_order?: string[] | null proxy_group_tools_position?: string | null notice_position?: string | null collapse_navbar: boolean | null sysproxy_tray_icon: boolean | null tun_tray_icon: boolean | null enable_tun_mode: boolean | null enable_auto_launch: boolean | null enable_silent_start: boolean | null enable_system_proxy: boolean | null enable_proxy_guard: boolean | null enable_bypass_check: boolean | null /** Initial DNS override preference for profiles without a saved setting. */ enable_dns_settings: boolean | null profile_dns_settings?: { [key in string]: ProfileDnsSettings_Serialize } use_default_bypass: boolean | null system_proxy_bypass: string | null proxy_guard_duration: number | null proxy_auto_config: boolean | null pac_file_content: string | null proxy_host: string | null theme_setting: IVergeTheme | null web_ui_list: string[] | null clash_core?: string | null /** format: {func},{key} */ hotkeys?: string[] | null enable_global_hotkey: boolean | null home_cards: JsonValue | null auto_close_connection: boolean | null auto_check_update: boolean | null default_latency_test: string | null default_latency_timeout: number | null enable_auto_delay_detection: boolean | null /** 自动检测当前节点延迟的间隔(分钟) */ auto_delay_detection_interval_minutes: number | null enable_builtin_enhanced: boolean | null proxy_layout_column: number | null test_list: IVergeTestItem[] | null /** 0: 不清理; 1: 1天;2: 7天; 3: 30天; 4: 90天 */ auto_log_clean: number | null enable_auto_backup_schedule: boolean | null /** Automatic backup interval in hours */ auto_backup_interval_hours: number | null auto_backup_on_change: boolean | null verge_mixed_port: number | null verge_socks_port: number | null verge_socks_enabled: boolean | null verge_port: number | null verge_http_enabled: boolean | null webdav_url?: string | null webdav_username?: string | null webdav_password?: string | null tray_proxy_groups_display_mode?: string | null tray_inline_outbound_modes: boolean | null enable_auto_light_weight_mode: boolean | null /** 自动进入轻量模式的延迟(分钟) */ auto_light_weight_minutes: number | null enable_hover_jump_navigator: boolean | null /** 代理页面自动滚动延迟(毫秒) */ hover_jump_navigator_delay: number | null enable_external_controller: boolean | null tray_icon?: string | null verge_redir_port?: number | null verge_redir_enabled?: boolean | null verge_tproxy_port?: number | null verge_tproxy_enabled?: boolean | null enable_tray_speed?: boolean | null } export type IconInfo = { name: string previous_t: string current_t: string } export type InterfaceAddress = | ({ V4: IpAddress } & { V6?: never }) | ({ V6: IpAddress } & { V4?: never }) export type IpAddress = { ip: string } export type JsonValue = | null | boolean | number | null | string | JsonValue[] | { [key in string]: JsonValue } export type ListenerProbe = { address: string transports: ListenerTransport[] } export type ListenerProbeOutcome = | { status: 'available' } | { status: 'conflict'; port: number; transport: ListenerTransport } | { status: 'invalid'; message: string } | { status: 'indeterminate'; message: string } export type ListenerTransport = 'tcp' | 'udp' export type LocalBackupFile = { filename: string path: string last_modified: string content_length: number } export type NetworkInterfaceView = { name: string addr: InterfaceAddress[] mac_addr: string | null } export type NoticeStatus = | 'info' | 'import_sub_url::ok' | 'import_sub_url::error' | 'set_config::error' | 'core_start::error' | 'service_core::repair_required' | 'service_core::app_data_not_owned' | 'service_core::sidecar_fallback' | 'dns_override::auto_disabled' | 'enhance::discarded_keys' | 'tun_mode::auto_disabled' | 'tun_mode::auto_disable_failed' | 'app_restart::core_stop_failed' | 'app_quit::core_stop_failed' | 'update_with_clash_proxy' | 'update_failed_even_with_clash' | 'reactivate_profiles::error' | 'update_failed' | 'config_validate::boot_error' | 'config_validate::error' | 'config_validate::process_terminated' | 'config_validate::script_error' | 'config_validate::script_syntax_error' | 'config_validate::script_missing_main' | 'config_validate::file_not_found' | 'config_validate::yaml_syntax_error' | 'config_validate::yaml_read_error' | 'config_validate::yaml_mapping_error' | 'config_validate::merge_syntax_error' | 'config_validate::merge_mapping_error' | 'config_core::change_success' | 'config_core::change_error' | 'mixed_port::fallback' | 'mixed_port::fallback_error' export type PendingAction = | 'install' | 'uninstall' | 'reinstall' | 'forceReinstall' /** Latest unresolved failure for one stable code. */ export type PendingFailure = { /** Stable code used as the table key. */ code: string /** Full diagnostic context chain. */ detail: string operation: FailedOperation /** Monotonic identity for repeated failures under the same code. */ sequence: number } export type PlatformVergeFields = { tray_icon?: string | null verge_redir_port?: number | null verge_redir_enabled?: boolean | null verge_tproxy_port?: number | null verge_tproxy_enabled?: boolean | null enable_tray_speed?: boolean | null } export type PrfExtra = { upload: number download: number total: number expire: number } export type PrfItem = PrfItem_Serialize | PrfItem_Deserialize export type PrfItem_Deserialize = { uid?: string | null /** enum value: remote | local | script | merge */ type?: string | null name?: string | null file?: string | null desc?: string | null url?: string | null selected?: PrfSelected[] | null extra?: PrfExtra | null updated?: number | null option?: PrfOption_Deserialize | null home?: string | null } export type PrfItem_Serialize = { uid: string | null /** enum value: remote | local | script | merge */ type: string | null name: string | null file: string | null desc?: string | null url?: string | null selected?: PrfSelected[] | null extra?: PrfExtra | null updated: number | null option?: PrfOption_Serialize | null home?: string | null } export type PrfOption = PrfOption_Serialize | PrfOption_Deserialize export type PrfOption_Deserialize = { user_agent?: string | null with_proxy?: boolean | null self_proxy?: boolean | null update_interval?: number | null /** * HTTP request timeout in seconds * default is 60 seconds */ timeout_seconds?: number | null /** default is `false` */ danger_accept_invalid_certs?: boolean | null allow_auto_update?: boolean | null merge?: string | null script?: string | null rules?: string | null proxies?: string | null groups?: string | null } export type PrfOption_Serialize = { user_agent?: string | null with_proxy?: boolean | null self_proxy?: boolean | null update_interval?: number | null /** * HTTP request timeout in seconds * default is 60 seconds */ timeout_seconds?: number | null /** default is `false` */ danger_accept_invalid_certs?: boolean | null allow_auto_update?: boolean | null merge: string | null script: string | null rules: string | null proxies: string | null groups: string | null } export type PrfSelected = { name?: string | null now?: string | null } export type ProfileCreate = ProfileCreate_Serialize | ProfileCreate_Deserialize export type ProfileCreate_Deserialize = { type?: string | null name?: string | null desc?: string | null url?: string | null option?: PrfOption_Deserialize | null } export type ProfileCreate_Serialize = { type: string | null name: string | null desc: string | null url: string | null option: PrfOption_Serialize | null } export type ProfileDnsSettings = | ProfileDnsSettings_Serialize | ProfileDnsSettings_Deserialize export type ProfileDnsSettings_Deserialize = { enabled: boolean confirmation?: string | null } export type ProfileDnsSettings_Serialize = { enabled: boolean confirmation?: string | null } export type ProfilePatch = ProfilePatch_Serialize | ProfilePatch_Deserialize export type ProfilePatch_Deserialize = { type?: string | null name?: string | null desc?: string | null file?: string | null url?: string | null selected?: PrfSelected[] | null extra?: PrfExtra | null updated?: number | null option?: PrfOption_Deserialize | null } export type ProfilePatch_Serialize = { type: string | null name: string | null desc: string | null file: string | null url: string | null selected: PrfSelected[] | null extra: PrfExtra | null updated: number | null option: PrfOption_Serialize | null } export type ProfileSelection = { current?: string | null } export type ProfileUpdatePayload = { uid: string } export type ProxyCapabilities = { udp: boolean xudp: boolean tfo: boolean mptcp: boolean smux: boolean } export type ProxyGroupView = | ProxyGroupView_Serialize | ProxyGroupView_Deserialize export type ProxyGroupView_Deserialize = { name: string type: string now: string | null fixed: string | null hidden: boolean | null icon: string | null testUrl: string | null history: DelayHistory[] members: ProxyMemberRef[] } & ProxyCapabilities export type ProxyGroupView_Serialize = { name: string type: string now?: string | null fixed?: string | null hidden?: boolean | null icon?: string | null testUrl?: string | null history: DelayHistory[] members: ProxyMemberRef[] } & ProxyCapabilities export type ProxyMemberRef = | { kind: 'group'; name: string } | { kind: 'node'; name: string; recordId: string } | { kind: 'unresolved'; name: string; reason: ProxyMemberUnresolvedReason } export type ProxyMemberUnresolvedReason = | 'missing' | 'ambiguous' | 'provider-unavailable' export type ProxyNodeSource = | { kind: 'core'; proxyName: string } | { kind: 'provider'; providerName: string; proxyName: string } export type ProxyNodeView = ProxyNodeView_Serialize | ProxyNodeView_Deserialize export type ProxyNodeView_Deserialize = { recordId: string name: string type: string history: DelayHistory[] id: string | null hidden: boolean | null icon: string | null testUrl: string | null source: ProxyNodeSource } & ProxyCapabilities export type ProxyNodeView_Serialize = { recordId: string name: string type: string history: DelayHistory[] id?: string | null hidden?: boolean | null icon?: string | null testUrl?: string | null source: ProxyNodeSource } & ProxyCapabilities export type ProxyPortSettings = { mixedPort: number socks: ToggleableProxyPort http: ToggleableProxyPort redir: ToggleableProxyPort tproxy: ToggleableProxyPort } export type ProxyProviderVehicleType = 'HTTP' | 'File' | 'Inline' export type ProxyProviderView = | ProxyProviderView_Serialize | ProxyProviderView_Deserialize export type ProxyProviderView_Deserialize = { name: string vehicleType: ProxyProviderVehicleType updatedAt: string | null subscriptionInfo: ProxySubscriptionInfo | null proxyRecordIds: string[] } export type ProxyProviderView_Serialize = { name: string vehicleType: ProxyProviderVehicleType updatedAt?: string | null subscriptionInfo?: ProxySubscriptionInfo | null proxyRecordIds: string[] } export type ProxySubscriptionInfo = { upload: number download: number total: number expire: number } export type ProxyViewOrderSource = 'runtime' | 'fallback' export type ProxyViewProviderState = 'ready' | 'unavailable' export type ProxyViewV1 = ProxyViewV1_Serialize | ProxyViewV1_Deserialize export type ProxyViewV1_Deserialize = { schemaVersion: number orderSource: ProxyViewOrderSource providerState: ProxyViewProviderState global: ProxyGroupView_Deserialize | null direct: string | null groups: ProxyGroupView_Deserialize[] records: { [key in string]: ProxyNodeView_Deserialize } standalone: string[] providers: ProxyProviderView_Deserialize[] } export type ProxyViewV1_Serialize = { schemaVersion: number orderSource: ProxyViewOrderSource providerState: ProxyViewProviderState global: ProxyGroupView_Serialize | null direct: string | null groups: ProxyGroupView_Serialize[] records: { [key in string]: ProxyNodeView_Serialize } standalone: string[] providers: ProxyProviderView_Serialize[] } export type RunStateView = { mode: RunningMode service: ServiceHealthKind serviceUnavailableReason: string | null pendingAction: PendingAction | null sidecarAllowed: boolean isAdmin: boolean opInFlight: boolean serviceUsable: boolean tunCapable: boolean serviceNeedsAttention: boolean } export type RunningMode = 'Service' | 'Sidecar' | 'NotRunning' export type RuntimeLogs = { [key in string]: [string, string][] } export type SaveProxyPortsOutcome = | { status: 'saved' } | { status: 'conflict'; port: number; transport: ListenerTransport } /** Why the Service was unavailable when the core fell back to Sidecar. */ export type ServiceFallbackNotice = | { kind: 'unavailable' } | { kind: 'coreRejected'; reason: string } | { kind: 'notAutoStarted' } export type ServiceHealthKind = | 'unknown' | 'ready' | 'notInstalled' | 'versionMismatch' | 'unavailable' export type ServiceInstallOutcome = | { status: 'installed' } | { status: 'sidecar'; reason: string } /** A removal has a revision too, so a delayed read cannot restore a resolved failure. */ export type SidecarFailureSnapshot = { revision: number detail: string | null } export type SystemInfo = { system_name: string system_version: string } export type SystemProxy = { enable: boolean server: string bypass: string } export type ToggleableProxyPort = { enabled: boolean port: number } export type UnlockItem = { name: string status: string region: string | null check_time: string | null } export type ValidationErrorKind = | 'fileMissing' | 'fileRead' | 'yamlSyntax' | 'yamlMapping' | 'scriptSyntax' | 'scriptMissingMain' | 'coreRejected' | 'processTerminated' | 'timeout' export type ValidationOutcome = | { status: 'valid' } | { status: 'invalid'; kind: ValidationErrorKind; message: string } | { status: 'skipped'; reason: ValidationSkipReason } | { status: 'busy' } export type ValidationSkipReason = 'exiting' | 'debounced' export type VergeEventPayloads = { 'verge://refresh-clash-config': null 'verge://refresh-verge-config': null 'verge://refresh-profiles': null 'verge://refresh-proxy-config': null 'verge://notice-message': [NoticeStatus, string] 'profile-changed': string 'verge://timer-updated': string 'profile-update-started': ProfileUpdatePayload 'profile-update-completed': ProfileUpdatePayload 'verge://run-state-changed': RunStateView 'verge://pending-failures-changed': null } export type WebDavFile = { href: string last_modified: string } export type YamlMapping = { [key in string]: JsonValue } export type YamlValue = JsonValue