mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-10-30 10:42:09 +08:00
* 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
1059 lines
33 KiB
TypeScript
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
|