type Platform = | 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd' /** * defines in `vite.config.ts` */ declare const OS_PLATFORM: Platform /** * Some interface for clash api */ interface IConfigData { port: number mode: string ipv6: boolean 'socket-port': number 'allow-lan': boolean 'log-level': string 'mixed-port': number 'redir-port': number 'socks-port': number 'tproxy-port': number 'external-controller': string 'external-controller-cors': { 'allow-private-network': boolean 'allow-origins': string[] } secret: string 'unified-delay': boolean tun: { stack: string device: string 'auto-route': boolean 'auto-redirect'?: boolean 'auto-detect-interface': boolean 'dns-hijack': string[] 'route-exclude-address'?: string[] 'strict-route': boolean mtu: number } dns?: { enable?: boolean listen?: string 'enhanced-mode'?: 'fake-ip' | 'redir-host' 'fake-ip-range'?: string 'fake-ip-filter'?: string[] 'fake-ip-filter-mode'?: 'blacklist' | 'whitelist' 'prefer-h3'?: boolean 'respect-rules'?: boolean nameserver?: string[] fallback?: string[] 'default-nameserver'?: string[] 'proxy-server-nameserver'?: string[] 'direct-nameserver'?: string[] 'direct-nameserver-follow-policy'?: boolean 'nameserver-policy'?: Record 'use-hosts'?: boolean 'use-system-hosts'?: boolean 'fallback-filter'?: { geoip?: boolean 'geoip-code'?: string ipcidr?: string[] domain?: string[] } } tunnels?: { network: string[] address: string target: string proxy?: string }[] 'proxy-groups'?: IProxyGroupItem[] } interface IProxyItem { name: string type: string udp: boolean xudp: boolean tfo: boolean mptcp: boolean smux: boolean history: { time: string delay: number }[] testUrl?: string all?: string[] now?: string hidden?: boolean icon?: string provider?: string // 记录是否来自provider fixed?: string // 记录固定(优先)的节点 } type IProxyGroupItem = Omit & { all: IProxyItem[] } interface IProxyProviderItem { name: string type: string proxies: IProxyItem[] updatedAt: string vehicleType: string subscriptionInfo?: { Upload: number Download: number Total: number Expire: number } } interface IRuleProviderItem { name: string behavior: string format: string ruleCount: number type: string updatedAt: string vehicleType: string } interface ITrafficItem { up: number down: number up_rate?: number down_rate?: number last_updated?: number } interface IFormattedTrafficData { up_rate_formatted: string down_rate_formatted: string total_up_formatted: string total_down_formatted: string is_fresh: boolean } interface IFormattedMemoryData { inuse_formatted: string oslimit_formatted: string usage_percent: number is_fresh: boolean } // 增强的类型安全接口定义,确保所有字段必需 interface ISystemMonitorOverview { traffic: { raw: { up: number down: number up_rate: number down_rate: number } formatted: { up_rate: string down_rate: string total_up: string total_down: string } is_fresh: boolean } memory: { raw: { inuse: number oslimit: number usage_percent: number } formatted: { inuse: string oslimit: string usage_percent: number } is_fresh: boolean } overall_status: 'active' | 'inactive' | 'error' | 'unknown' | 'healthy' } // 类型安全的数据验证器 interface ISystemMonitorOverviewValidator { validate(data: any): data is ISystemMonitorOverview sanitize(data: any): ISystemMonitorOverview } interface ILogItem { type: string time?: string payload: string } type LogLevel = import('tauri-plugin-mihomo-api').LogLevel type LogFilter = 'all' | 'debug' | 'info' | 'warn' | 'err' type LogOrder = 'asc' | 'desc' interface IClashLog { enable: boolean logLevel: LogLevel logFilter: LogFilter logOrder: LogOrder } interface IConnectionsItem { id: string metadata: { network: string type: string host: string sourceIP: string sourcePort: string destinationPort: string destinationIP?: string remoteDestination?: string process?: string processPath?: string } upload: number download: number start: string chains: string[] rule: string rulePayload: string curUpload?: number // upload speed, calculate at runtime curDownload?: number // download speed, calculate at runtime } interface IConnections { downloadTotal: number uploadTotal: number connections: IConnectionsItem[] } interface IConnectionSetting { layout: 'table' | 'list' } /** * Some interface for command */ interface IClashInfo { // status: string; mixed_port?: number // clash mixed port socks_port?: number // clash socks port redir_port?: number // clash redir port tproxy_port?: number // clash tproxy port port?: number // clash http port server?: string // external-controller secret?: string } interface IProfileItem { uid: string type?: 'local' | 'remote' | 'merge' | 'script' name?: string desc?: string file?: string url?: string updated?: number selected?: { name?: string now?: string }[] extra?: { upload: number download: number total: number expire: number } option?: IProfileOption home?: string } interface IProfileOption { user_agent?: string with_proxy?: boolean self_proxy?: boolean update_interval?: number timeout_seconds?: number danger_accept_invalid_certs?: boolean allow_auto_update?: boolean merge?: string script?: string rules?: string proxies?: string groups?: string } interface IProfilesConfig { current?: string items?: IProfileItem[] } interface IVergeTestItem { uid: string name?: string icon?: string url: string } interface IAddress { V4?: { ip: string broadcast?: string netmask?: string } V6?: { ip: string broadcast?: string netmask?: string } } interface INetworkInterface { name: string addr: IAddress[] mac_addr?: string index: number } interface ISeqProfileConfig { prepend: [] append: [] delete: [] } interface IProxyGroupConfig { name: string type: 'select' | 'url-test' | 'fallback' | 'load-balance' | 'relay' proxies?: string[] use?: string[] url?: string interval?: number lazy?: boolean timeout?: number 'max-failed-times'?: number 'disable-udp'?: boolean 'interface-name': string 'routing-mark'?: number 'include-all'?: boolean 'include-all-proxies'?: boolean 'include-all-providers'?: boolean filter?: string 'exclude-filter'?: string 'exclude-type'?: string 'expected-status'?: string hidden?: boolean icon?: string } interface WsOptions { path?: string headers?: { [key: string]: string } 'max-early-data'?: number 'early-data-header-name'?: string 'v2ray-http-upgrade'?: boolean 'v2ray-http-upgrade-fast-open'?: boolean } interface HttpOptions { method?: string path?: string[] headers?: { [key: string]: string[] } } interface H2Options { path?: string host?: string } interface GrpcOptions { 'grpc-service-name'?: string } interface RealityOptions { 'public-key'?: string 'short-id'?: string } type ClientFingerprint = | 'chrome' | 'firefox' | 'safari' | 'iOS' | 'android' | 'edge' | '360' | 'qq' | 'random' type NetworkType = 'ws' | 'http' | 'h2' | 'grpc' | 'tcp' type CipherType = | 'none' | 'auto' | 'dummy' | 'aes-128-gcm' | 'aes-192-gcm' | 'aes-256-gcm' | 'lea-128-gcm' | 'lea-192-gcm' | 'lea-256-gcm' | 'aes-128-gcm-siv' | 'aes-256-gcm-siv' | '2022-blake3-aes-128-gcm' | '2022-blake3-aes-256-gcm' | 'aes-128-cfb' | 'aes-192-cfb' | 'aes-256-cfb' | 'aes-128-ctr' | 'aes-192-ctr' | 'aes-256-ctr' | 'chacha20' | 'chacha20-ietf' | 'chacha20-ietf-poly1305' | '2022-blake3-chacha20-poly1305' | 'rabbit128-poly1305' | 'xchacha20-ietf-poly1305' | 'xchacha20' | 'aegis-128l' | 'aegis-256' | 'aez-384' | 'deoxys-ii-256-128' | 'rc4-md5' type MieruTransport = 'TCP' | 'UDP' type MieruMultiplexing = | 'MULTIPLEXING_OFF' | 'MULTIPLEXING_LOW' | 'MULTIPLEXING_MIDDLE' | 'MULTIPLEXING_HIGH' type SudokuAeadMethod = 'chacha20-poly1305' | 'aes-128-gcm' | 'none' type SudokuTableType = 'prefer_ascii' | 'prefer_entropy' type SudokuHttpMaskMode = 'legacy' | 'stream' | 'poll' | 'auto' type SudokuHttpMaskStrategy = 'random' | 'post' | 'websocket' // base interface IProxyBaseConfig { tfo?: boolean mptcp?: boolean 'interface-name'?: string 'routing-mark'?: number 'ip-version'?: 'dual' | 'ipv4' | 'ipv6' | 'ipv4-prefer' | 'ipv6-prefer' 'dialer-proxy'?: string } // direct interface IProxyDirectConfig extends IProxyBaseConfig { name: string type: 'direct' } // dns interface IProxyDnsConfig extends IProxyBaseConfig { name: string type: 'dns' } // http interface IProxyHttpConfig extends IProxyBaseConfig { name: string type: 'http' server?: string port?: number username?: string password?: string tls?: boolean sni?: string 'skip-cert-verify'?: boolean fingerprint?: string headers?: { [key: string]: string } } // socks5 interface IProxySocks5Config extends IProxyBaseConfig { name: string type: 'socks5' server?: string port?: number username?: string password?: string tls?: boolean udp?: boolean 'skip-cert-verify'?: boolean fingerprint?: string } // ssh interface IProxySshConfig extends IProxyBaseConfig { name: string type: 'ssh' server?: string port?: number username?: string password?: string 'private-key'?: string 'private-key-passphrase'?: string 'host-key'?: string 'host-key-algorithms'?: string } // trojan interface IProxyTrojanConfig extends IProxyBaseConfig { name: string type: 'trojan' server?: string port?: number password?: string alpn?: string[] sni?: string 'skip-cert-verify'?: boolean fingerprint?: string udp?: boolean network?: NetworkType 'reality-opts'?: RealityOptions 'grpc-opts'?: GrpcOptions 'ws-opts'?: WsOptions 'ss-opts'?: { enabled?: boolean method?: string password?: string } 'client-fingerprint'?: ClientFingerprint } // anytls interface IProxyAnyTLSConfig extends IProxyBaseConfig { name: string type: 'anytls' server?: string port?: number password?: string alpn?: string[] sni?: string 'client-fingerprint'?: ClientFingerprint 'skip-cert-verify'?: boolean fingerprint?: string certificate?: string 'private-key'?: string 'ech-opts'?: { enable?: boolean config?: string } udp?: boolean 'idle-session-check-interval'?: number 'idle-session-timeout'?: number 'min-idle-session'?: number } // tuic interface IProxyTuicConfig extends IProxyBaseConfig { name: string type: 'tuic' server?: string port?: number token?: string uuid?: string password?: string ip?: string 'heartbeat-interval'?: number alpn?: string[] 'reduce-rtt'?: boolean 'request-timeout'?: number 'udp-relay-mode'?: string 'congestion-controller'?: string 'disable-sni'?: boolean 'max-udp-relay-packet-size'?: number 'fast-open'?: boolean 'max-open-streams'?: number cwnd?: number 'skip-cert-verify'?: boolean fingerprint?: string ca?: string 'ca-str'?: string 'recv-window-conn'?: number 'recv-window'?: number 'disable-mtu-discovery'?: boolean 'max-datagram-frame-size'?: number sni?: string 'udp-over-stream'?: boolean 'udp-over-stream-version'?: number } // mieru interface IProxyMieruConfig extends IProxyBaseConfig { name: string type: 'mieru' server?: string port?: number 'port-range'?: string transport?: MieruTransport udp?: boolean username?: string password?: string multiplexing?: MieruMultiplexing 'handshake-mode'?: string } // masque interface IProxyMasqueConfig extends IProxyBaseConfig { name: string type: 'masque' server?: string port?: number 'private-key'?: string 'public-key'?: string ip?: string ipv6?: string mtu?: number udp?: boolean 'remote-dns-resolve'?: boolean dns?: string[] } // vless interface IProxyVlessConfig extends IProxyBaseConfig { name: string type: 'vless' server?: string port?: number uuid?: string flow?: string tls?: boolean alpn?: string[] udp?: boolean 'packet-addr'?: boolean xudp?: boolean 'packet-encoding'?: string network?: NetworkType 'reality-opts'?: RealityOptions 'http-opts'?: HttpOptions 'h2-opts'?: H2Options 'grpc-opts'?: GrpcOptions 'ws-opts'?: WsOptions 'ws-path'?: string 'ws-headers'?: { [key: string]: string } 'skip-cert-verify'?: boolean fingerprint?: string servername?: string 'client-fingerprint'?: ClientFingerprint smux?: boolean } // vmess interface IProxyVmessConfig extends IProxyBaseConfig { name: string type: 'vmess' server?: string port?: number uuid?: string alterId?: number cipher?: CipherType udp?: boolean network?: NetworkType tls?: boolean alpn?: string[] 'skip-cert-verify'?: boolean fingerprint?: string servername?: string 'reality-opts'?: RealityOptions 'http-opts'?: HttpOptions 'h2-opts'?: H2Options 'grpc-opts'?: GrpcOptions 'ws-opts'?: WsOptions 'packet-addr'?: boolean xudp?: boolean 'packet-encoding'?: string 'global-padding'?: boolean 'authenticated-length'?: boolean 'client-fingerprint'?: ClientFingerprint smux?: boolean } interface WireGuardPeerOptions { server?: string port?: number 'public-key'?: string 'pre-shared-key'?: string reserved?: number[] 'allowed-ips'?: string[] } // wireguard interface IProxyWireguardConfig extends IProxyBaseConfig, WireGuardPeerOptions { name: string type: 'wireguard' ip?: string ipv6?: string 'private-key'?: string workers?: number mtu?: number udp?: boolean 'persistent-keepalive'?: number peers?: WireGuardPeerOptions[] 'remote-dns-resolve'?: boolean dns?: string[] 'refresh-server-ip-interval'?: number } // hysteria interface IProxyHysteriaConfig extends IProxyBaseConfig { name: string type: 'hysteria' server?: string port?: number ports?: string protocol?: string 'obfs-protocol'?: string up?: string 'up-speed'?: number down?: string 'down-speed'?: number auth?: string 'auth-str'?: string obfs?: string sni?: string 'skip-cert-verify'?: boolean fingerprint?: string alpn?: string[] ca?: string 'ca-str'?: string 'recv-window-conn'?: number 'recv-window'?: number 'disable-mtu-discovery'?: boolean 'fast-open'?: boolean 'hop-interval'?: number } // hysteria2 interface IProxyHysteria2Config extends IProxyBaseConfig { name: string type: 'hysteria2' server?: string port?: number ports?: string 'hop-interval'?: number protocol?: string 'obfs-protocol'?: string up?: string down?: string password?: string obfs?: string 'obfs-password'?: string sni?: string 'skip-cert-verify'?: boolean fingerprint?: string alpn?: string[] ca?: string 'ca-str'?: string cwnd?: number 'udp-mtu'?: number } // shadowsocks interface IProxyShadowsocksConfig extends IProxyBaseConfig { name: string type: 'ss' server?: string port?: number password?: string cipher?: CipherType udp?: boolean plugin?: 'obfs' | 'v2ray-plugin' | 'shadow-tls' | 'restls' 'plugin-opts'?: { mode?: string host?: string password?: string path?: string tls?: string fingerprint?: string headers?: { [key: string]: string } 'skip-cert-verify'?: boolean version?: number mux?: boolean 'v2ray-http-upgrade'?: boolean 'v2ray-http-upgrade-fast-open'?: boolean 'version-hint'?: string 'restls-script'?: string } 'udp-over-tcp'?: boolean 'udp-over-tcp-version'?: number 'client-fingerprint'?: ClientFingerprint smux?: boolean } // sudoku interface IProxySudokuConfig extends IProxyBaseConfig { name: string type: 'sudoku' server?: string port?: number key?: string 'aead-method'?: SudokuAeadMethod 'padding-min'?: number 'padding-max'?: number 'table-type'?: SudokuTableType 'enable-pure-downlink'?: boolean 'http-mask'?: boolean 'http-mask-mode'?: SudokuHttpMaskMode 'http-mask-tls'?: boolean 'http-mask-host'?: string 'http-mask-strategy'?: SudokuHttpMaskStrategy 'custom-table'?: string 'custom-tables'?: string[] } // shadowsocksR interface IProxyshadowsocksRConfig extends IProxyBaseConfig { name: string type: 'ssr' server?: string port?: number password?: string cipher?: CipherType obfs?: string 'obfs-param'?: string protocol?: string 'protocol-param'?: string udp?: boolean } // sing-mux interface IProxySmuxConfig { smux?: { enabled?: boolean protocol?: 'smux' | 'yamux' | 'h2mux' 'max-connections'?: number 'min-streams'?: number 'max-streams'?: number padding?: boolean statistic?: boolean 'only-tcp'?: boolean 'brutal-opts'?: { enabled?: boolean up?: string down?: string } } } // snell interface IProxySnellConfig extends IProxyBaseConfig { name: string type: 'snell' server?: string port?: number psk?: string udp?: boolean version?: number } interface IProxyConfig extends IProxyBaseConfig, IProxyDirectConfig, IProxyDnsConfig, IProxyHttpConfig, IProxySocks5Config, IProxySshConfig, IProxyTrojanConfig, IProxyAnyTLSConfig, IProxyTuicConfig, IProxyMieruConfig, IProxyMasqueConfig, IProxyVlessConfig, IProxyVmessConfig, IProxyWireguardConfig, IProxyHysteriaConfig, IProxyHysteria2Config, IProxyShadowsocksConfig, IProxySudokuConfig, IProxyshadowsocksRConfig, IProxySmuxConfig, IProxySnellConfig { type: | 'ss' | 'ssr' | 'direct' | 'dns' | 'snell' | 'http' | 'trojan' | 'anytls' | 'hysteria' | 'hysteria2' | 'tuic' | 'wireguard' | 'ssh' | 'socks5' | 'masque' | 'vmess' | 'vless' | 'mieru' | 'sudoku' } interface IVergeConfig { app_log_level?: 'trace' | 'debug' | 'info' | 'warn' | 'error' | string app_log_max_size?: number // KB app_log_max_count?: number language?: string tray_event?: | 'main_window' | 'tray_menu' | 'system_proxy' | 'tun_mode' | string env_type?: 'bash' | 'cmd' | 'powershell' | 'fish' | string startup_script?: string start_page?: string clash_core?: string theme_mode?: 'light' | 'dark' | 'system' traffic_graph?: boolean enable_memory_usage?: boolean enable_group_icon?: boolean pause_render_traffic_stats_on_blur?: boolean menu_icon?: 'monochrome' | 'colorful' | 'disable' menu_order?: string[] notice_position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' collapse_navbar?: boolean tray_icon?: 'monochrome' | 'colorful' common_tray_icon?: boolean sysproxy_tray_icon?: boolean tun_tray_icon?: boolean // enable_tray_speed?: boolean; // enable_tray_icon?: boolean; tray_proxy_groups_display_mode?: 'default' | 'inline' | 'disable' tray_inline_outbound_modes?: boolean enable_tun_mode?: boolean enable_auto_light_weight_mode?: boolean auto_light_weight_minutes?: number enable_auto_launch?: boolean enable_silent_start?: boolean enable_system_proxy?: boolean enable_global_hotkey?: boolean enable_dns_settings?: boolean proxy_auto_config?: boolean pac_file_content?: string proxy_host?: string enable_random_port?: boolean verge_mixed_port?: number verge_socks_port?: number verge_redir_port?: number verge_tproxy_port?: number verge_port?: number verge_redir_enabled?: boolean verge_tproxy_enabled?: boolean verge_socks_enabled?: boolean verge_http_enabled?: boolean enable_proxy_guard?: boolean enable_bypass_check?: boolean use_default_bypass?: boolean proxy_guard_duration?: number system_proxy_bypass?: string web_ui_list?: string[] hotkeys?: string[] theme_setting?: { primary_color?: string secondary_color?: string primary_text?: string secondary_text?: string info_color?: string error_color?: string warning_color?: string success_color?: string font_family?: string css_injection?: string background_image?: string background_blend_mode?: string background_opacity?: number } auto_close_connection?: boolean auto_check_update?: boolean default_latency_test?: string default_latency_timeout?: number enable_auto_delay_detection?: boolean auto_delay_detection_interval_minutes?: number enable_builtin_enhanced?: boolean auto_log_clean?: 0 | 1 | 2 | 3 | 4 enable_auto_backup_schedule?: boolean auto_backup_interval_hours?: number auto_backup_on_change?: boolean proxy_layout_column?: number test_list?: IVergeTestItem[] webdav_url?: string webdav_username?: string webdav_password?: string home_cards?: Record enable_hover_jump_navigator?: boolean hover_jump_navigator_delay?: number enable_external_controller?: boolean } interface IWebDavFile { filename: string href: string last_modified: string content_length: number content_type: string tag: string } interface ILocalBackupFile { filename: string path: string last_modified: string content_length: number } interface IWebDavConfig { url: string username: string password: string } // Traffic monitor types interface ITrafficDataPoint { up: number down: number timestamp: number name: string } interface ISamplingConfig { rawDataMinutes: number compressedDataMinutes: number compressionRatio: number } interface ISamplerStats { rawBufferSize: number compressedBufferSize: number compressionQueueSize: number totalMemoryPoints: number } interface ITrafficWorkerInitMessage { type: 'init' config: ISamplingConfig & { snapshotIntervalMs: number defaultRangeMinutes: number } } interface ITrafficWorkerAppendMessage { type: 'append' payload: { up: number down: number timestamp?: number } } interface ITrafficWorkerClearMessage { type: 'clear' } interface ITrafficWorkerSetRangeMessage { type: 'setRange' minutes: number } interface ITrafficWorkerRequestSnapshotMessage { type: 'requestSnapshot' } type TrafficWorkerRequestMessage = | ITrafficWorkerInitMessage | ITrafficWorkerAppendMessage | ITrafficWorkerClearMessage | ITrafficWorkerSetRangeMessage | ITrafficWorkerRequestSnapshotMessage interface ITrafficWorkerSnapshotMessage { type: 'snapshot' dataPoints: ITrafficDataPoint[] availableDataPoints: ITrafficDataPoint[] samplerStats: ISamplerStats rangeMinutes: number lastTimestamp?: number reason: | 'init' | 'interval' | 'range-change' | 'request' | 'append-throttle' | 'clear' } interface ITrafficWorkerLogMessage { type: 'log' message: string } type TrafficWorkerResponseMessage = | ITrafficWorkerSnapshotMessage | ITrafficWorkerLogMessage