Files
clash-verge-rev/src/services/bindings.ts
T
Tunglies 6e08a77a84 refactor(backend): specta ipc bindings (#8195)
* refactor(ipc): generate bindings with Specta

* fix(profile): project IPC inputs to consumed fields

* fix(events): remove unused refresh payloads

* fix(webdav): return only consumed backup metadata

* fix(network): trim unused interface metadata

* fix(sysinfo): return only displayed system fields

* chore(knip): check generated runtime exports

* fix(proxy): confirm runtime chain updates before UI changes

* fix(clipboard): propagate proxy environment copy failures

* refactor(dns): remove ignored runtime patch

* refactor(core): trim unused upgrade response fields

* refactor(ipc): avoid redundant response copies

* refactor(proxy): clarify automatic proxy query naming

* chore(tests): remove added IPC regression tests

* refactor(ipc): enforce typed command boundaries

* chore(contract): check generated bindings before push

* refactor(ipc): remove unused proxy liveness payloads
2026-10-12 06:16:05 +00:00

1059 lines
33 KiB
TypeScript

// 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<SystemInfo>('get_system_info'),
/** 获取应用的运行时间(毫秒) */
getAppUptime: () => __TAURI_INVOKE<number>('get_app_uptime'),
exportDiagnosticInfo: () => __TAURI_INVOKE<null>('export_diagnostic_info'),
probeListener: (request: ListenerProbe) =>
__TAURI_INVOKE<ListenerProbeOutcome>('probe_listener', { request }),
saveProxyPorts: (settings: ProxyPortSettings) =>
__TAURI_INVOKE<SaveProxyPortsOutcome>('save_proxy_ports', { settings }),
getSysProxy: () => __TAURI_INVOKE<SystemProxy>('get_sys_proxy'),
getAutoProxy: () => __TAURI_INVOKE<AutoProxy>('get_auto_proxy'),
getEmbeddedServerPort: () =>
__TAURI_INVOKE<number>('get_embedded_server_port'),
openAppDir: () => __TAURI_INVOKE<null>('open_app_dir'),
openLogsDir: () => __TAURI_INVOKE<null>('open_logs_dir'),
openCoreDir: () => __TAURI_INVOKE<null>('open_core_dir'),
getNetworkInterfaces: () =>
__TAURI_INVOKE<string[]>('get_network_interfaces'),
getSystemHostname: () => __TAURI_INVOKE<string>('get_system_hostname'),
restartApp: () => __TAURI_INVOKE<null>('restart_app'),
installUpdate: (version: string, onEvent: Channel<DownloadEvent>) =>
__TAURI_INVOKE<boolean>('install_update', { version, onEvent }),
cancelUpdateDownload: () => __TAURI_INVOKE<void>('cancel_update_download'),
restartCore: () => __TAURI_INVOKE<null>('restart_core'),
/** Replaces the managed core binary atomically instead of letting mihomo overwrite itself. */
upgradeClashCore: (force: boolean) =>
__TAURI_INVOKE<CoreUpgradeReport>('upgrade_clash_core', { force }),
/** Returns one coherent core/service snapshot instead of independently refreshed state. */
getRuntimeState: () => __TAURI_INVOKE<RunStateView>('get_runtime_state'),
getPendingFailures: () =>
__TAURI_INVOKE<PendingFailure[]>('get_pending_failures'),
getSidecarFailure: () =>
__TAURI_INVOKE<SidecarFailureSnapshot>('get_sidecar_failure'),
entryLightweightMode: () => __TAURI_INVOKE<null>('entry_lightweight_mode'),
installService: () =>
__TAURI_INVOKE<ServiceInstallOutcome>('install_service'),
uninstallService: () => __TAURI_INVOKE<null>('uninstall_service'),
reinstallService: () =>
__TAURI_INVOKE<ServiceInstallOutcome>('reinstall_service'),
repairService: () => __TAURI_INVOKE<ServiceInstallOutcome>('repair_service'),
continueWithSidecar: () => __TAURI_INVOKE<null>('continue_with_sidecar'),
syncRuntimeProviders: () => __TAURI_INVOKE<void>('sync_runtime_providers'),
getClashInfo: () => __TAURI_INVOKE<ClashInfo>('get_clash_info'),
patchClashConfig: (payload: YamlMapping) =>
__TAURI_INVOKE<null>('patch_clash_config', { payload }),
patchClashMode: (payload: string) =>
__TAURI_INVOKE<null>('patch_clash_mode', { payload }),
/** Reads the saved mode without depending on strict mihomo `/configs` deserialization. */
getClashMode: () => __TAURI_INVOKE<string | null>('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<ProxyViewV1_Serialize>('get_proxy_view'),
getRuntimeYaml: () => __TAURI_INVOKE<string>('get_runtime_yaml'),
getRuntimeLogs: () => __TAURI_INVOKE<RuntimeLogs>('get_runtime_logs'),
getRuntimeProxyChainConfig: (proxyChainExitNode: string) =>
__TAURI_INVOKE<string>('get_runtime_proxy_chain_config', {
proxyChainExitNode,
}),
updateProxyChainConfigInRuntime: (proxyChainConfig: JsonValue | null) =>
__TAURI_INVOKE<ValidationOutcome>('update_proxy_chain_config_in_runtime', {
proxyChainConfig,
}),
invokeUwpTool: () => __TAURI_INVOKE<null>('invoke_uwp_tool'),
copyClashEnv: () => __TAURI_INVOKE<null>('copy_clash_env'),
syncTrayProxySelection: () =>
__TAURI_INVOKE<null>('sync_tray_proxy_selection'),
/** Merges one selection pair into fresh backend state to avoid stale-list overwrites. */
recordSelectedNode: (groupName: string, node: string) =>
__TAURI_INVOKE<null>('record_selected_node', { groupName, node }),
forgetSelectedNode: (groupName: string) =>
__TAURI_INVOKE<null>('forget_selected_node', { groupName }),
saveDnsConfig: (dnsConfig: YamlMapping) =>
__TAURI_INVOKE<null>('save_dns_config', { dnsConfig }),
applyDnsConfig: (apply: boolean) =>
__TAURI_INVOKE<null>('apply_dns_config', { apply }),
setDnsOverride: (
profileUid: string,
enabled: boolean,
confirmation: string | null,
) =>
__TAURI_INVOKE<DnsOverrideOutcome>('set_dns_override', {
profileUid,
enabled,
confirmation,
}),
takeDnsOverrideNotice: () =>
__TAURI_INVOKE<boolean>('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<boolean>('take_service_repair_notice'),
takeServiceOwnerNotice: () =>
__TAURI_INVOKE<string | null>('take_service_owner_notice'),
takeDiscardedKeysNotice: () =>
__TAURI_INVOKE<string | null>('take_discarded_keys_notice'),
getDnsConfigContent: () =>
__TAURI_INVOKE<string | null>('get_dns_config_content'),
validateDnsConfig: () =>
__TAURI_INVOKE<ValidationOutcome>('validate_dns_config'),
getClashLogs: () => __TAURI_INVOKE<string[]>('get_clash_logs'),
/** 获取Verge配置 */
getVergeConfig: () => __TAURI_INVOKE<IVerge_Serialize>('get_verge_config'),
/** 修改Verge配置 */
patchVergeConfig: (payload: IVerge_Deserialize) =>
__TAURI_INVOKE<null>('patch_verge_config', { payload }),
testDelay: (url: string) => __TAURI_INVOKE<number>('test_delay', { url }),
getAppDir: () => __TAURI_INVOKE<string>('get_app_dir'),
copyIconFile: (path: string, iconInfo: IconInfo) =>
__TAURI_INVOKE<string>('copy_icon_file', { path, iconInfo }),
downloadIconCache: (url: string, name: string) =>
__TAURI_INVOKE<string>('download_icon_cache', { url, name }),
openDevtools: () => __TAURI_INVOKE<void>('open_devtools'),
exitApp: () => __TAURI_INVOKE<void>('exit_app'),
getNetworkInterfacesInfo: () =>
__TAURI_INVOKE<NetworkInterfaceView[]>('get_network_interfaces_info'),
getProfiles: () => __TAURI_INVOKE<IProfiles_Serialize>('get_profiles'),
enhanceProfiles: () => __TAURI_INVOKE<ValidationOutcome>('enhance_profiles'),
patchProfilesConfig: (profiles: ProfileSelection) =>
__TAURI_INVOKE<ValidationOutcome>('patch_profiles_config', { profiles }),
viewProfile: (index: string) =>
__TAURI_INVOKE<null>('view_profile', { index }),
patchProfile: (index: string, profile: ProfilePatch_Deserialize) =>
__TAURI_INVOKE<null>('patch_profile', { index, profile }),
createProfile: (item: ProfileCreate_Deserialize, fileData: string | null) =>
__TAURI_INVOKE<null>('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<null>('import_profile', { url, option }),
reorderProfile: (activeId: string, overId: string) =>
__TAURI_INVOKE<null>('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<null>('update_profile', { index, option }),
deleteProfile: (index: string) =>
__TAURI_INVOKE<null>('delete_profile', { index }),
readProfileFile: (index: string) =>
__TAURI_INVOKE<string>('read_profile_file', { index }),
/** 保存profiles的配置 */
saveProfileFile: (index: string, fileData: string | null) =>
__TAURI_INVOKE<ValidationOutcome>('save_profile_file', { index, fileData }),
getNextUpdateTime: (uid: string) =>
__TAURI_INVOKE<number | null>('get_next_update_time', { uid }),
createLocalBackup: () => __TAURI_INVOKE<null>('create_local_backup'),
listLocalBackup: () => __TAURI_INVOKE<LocalBackupFile[]>('list_local_backup'),
deleteLocalBackup: (filename: string) =>
__TAURI_INVOKE<null>('delete_local_backup', { filename }),
restoreLocalBackup: (filename: string) =>
__TAURI_INVOKE<null>('restore_local_backup', { filename }),
importLocalBackup: (source: string) =>
__TAURI_INVOKE<string>('import_local_backup', { source }),
exportLocalBackup: (filename: string, destination: string) =>
__TAURI_INVOKE<null>('export_local_backup', { filename, destination }),
createWebdavBackup: () => __TAURI_INVOKE<null>('create_webdav_backup'),
saveWebdavConfig: (url: string, username: string, password: string) =>
__TAURI_INVOKE<null>('save_webdav_config', { url, username, password }),
listWebdavBackup: () => __TAURI_INVOKE<WebDavFile[]>('list_webdav_backup'),
deleteWebdavBackup: (filename: string) =>
__TAURI_INVOKE<null>('delete_webdav_backup', { filename }),
restoreWebdavBackup: (filename: string) =>
__TAURI_INVOKE<null>('restore_webdav_backup', { filename }),
getUnlockItems: () => __TAURI_INVOKE<UnlockItem[]>('get_unlock_items'),
checkMediaUnlock: (onComplete: Channel<UnlockItem>) =>
__TAURI_INVOKE<UnlockItem[]>('check_media_unlock', { onComplete }),
checkMediaUnlockItem: (name: string) =>
__TAURI_INVOKE<UnlockItem>('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
latency_test_urls?: { [key in string]: string } | 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
latency_test_urls?: { [key in string]: string } | 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
latency_test_urls?: { [key in string]: string } | 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
latency_test_urls: { [key in string]: string } | 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[]
extra: { [key in string]: ProxyLatencyHistory }
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[]
extra: { [key in string]: ProxyLatencyHistory }
members: ProxyMemberRef[]
} & ProxyCapabilities
export type ProxyLatencyHistory = {
history: DelayHistory[]
}
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[]
extra: { [key in string]: ProxyLatencyHistory }
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[]
extra: { [key in string]: ProxyLatencyHistory }
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