import { invoke } from "@tauri-apps/api/core"; import type { ActivityEntry, ComponentStatus, LocalSingBoxConfig, Profile, ProfileInput, SubscriptionCache, SubscriptionServer, Target, TargetInput, } from "../domain/types"; export interface CommandError { code: string; message: string; details?: Array<{ field: string; message: string; }>; } export interface AdminStatusResponse { isWindows: boolean; isElevated: boolean; canRestartElevated: boolean; message: string; } export interface SavedStateResponse { profiles: Profile[]; targets: Target[]; generatedConfigPath: string; } export interface StartupSnapshotResponse { adminStatus: AdminStatusResponse; savedState: SavedStateResponse; components: ComponentStatus[]; proxifyreSetupStatus: ProxiFyreSetupStatus; singboxStatus: LocalSingBoxStatusResponse; singboxSetupStatus: SingBoxSetupStatus; } export interface ProxiFyreSetupItem { id: string; name: string; installed: boolean; version?: string; details: string; } export interface ProxiFyreSetupStatus { ready: boolean; missingCount: number; items: ProxiFyreSetupItem[]; } export interface ProxiFyreSetupProgress { operation: "idle" | "install" | "uninstall" | string; status: "idle" | "running" | "succeeded" | "failed" | string; activeStep?: string; percent: number; message: string; updatedAt?: string; } export type SingBoxSetupItem = ProxiFyreSetupItem; export interface SingBoxSetupStatus { ready: boolean; missingCount: number; items: SingBoxSetupItem[]; } export interface LocalSingBoxStatusResponse { config: LocalSingBoxConfig; cache?: SubscriptionCache; component: ComponentStatus; generatedConfigPath: string; lanListenHost?: string; subscriptionIdentity?: SubscriptionRequestIdentity; } export interface SubscriptionRequestIdentity { headers: SubscriptionRequestHeader[]; } export interface SubscriptionRequestHeader { name: string; value: string; } export interface PingServerResponse { id: string; tag: string; server: string; serverPort: number; ok: boolean; latency?: number; error?: string; } export type ApplyPhaseStatus = "succeeded" | "failed" | "rolledback" | "skipped" | "warning"; export interface ApplyPhase { id: string; status: ApplyPhaseStatus; message: string; } export interface ApplyConfigurationInput { routeMode: "external" | "local-singbox"; profile: ProfileInput; externalTarget?: TargetInput; disableOtherProfiles?: boolean; } export interface ApplyConfigurationResult { success: boolean; changed: boolean; partialState: boolean; message: string; errorCode?: string; generatedConfigPath: string; singboxGeneratedConfigPath?: string; restartRequired: Array<"control-app" | "proxyfier" | "singbox">; phases: ApplyPhase[]; } export interface ProxyProbeResponse { id: string; name: string; url: string; ok: boolean; status?: number; latency?: number; ip?: string; error?: string; } export interface ProxyTargetCheckResponse { tag: string; server: string; serverPort: number; ok: boolean; latency?: number; error?: string; probes: ProxyProbeResponse[]; } export interface GenerateSingBoxConfigResponse { success: boolean; message: string; adapterId: string; generatedConfigPath: string; selectedServerTag: string; listenHost: string; listenPort: number; check?: { checked: boolean; success: boolean; message: string; }; activity: ActivityEntry; } export function restartAsAdmin(): Promise { return invoke("restart_as_admin"); } export function getStartupSnapshot(): Promise { return invoke("get_startup_snapshot"); } export function getSavedState(): Promise { return invoke("get_saved_state"); } export function getComponents(): Promise { return invoke("get_components"); } export function getProxiFyreSetupStatus(): Promise { return invoke("get_proxifyre_setup_status"); } export function getProxiFyreSetupProgress(): Promise { return invoke("get_proxifyre_setup_progress"); } export function getSingBoxStatus(): Promise { return invoke("get_singbox_status"); } export function getSingBoxSetupStatus(): Promise { return invoke("get_singbox_setup_status"); } export function saveSingBoxSubscription( subscriptionUrl: string, ): Promise { return invoke("save_singbox_subscription", { input: { subscriptionUrl }, }); } export function fetchSingBoxSubscription(): Promise { return invoke("fetch_singbox_subscription"); } export function forgetSingBoxSubscription(): Promise { return invoke("forget_singbox_subscription"); } export function selectSingBoxServer( server: SubscriptionServer, ): Promise { return invoke("select_singbox_server", { input: { id: server.id, tag: server.tag, server: server.server, serverPort: server.serverPort, }, }); } export function pingSingBoxServer( server: SubscriptionServer, ): Promise { return invoke("ping_singbox_server", { input: { id: server.id, tag: server.tag }, }); } export function pingAllSingBoxServers(): Promise { return invoke("ping_all_singbox_servers"); } export function pingProxyTarget( host: string, port: number, ): Promise { return invoke("ping_proxy_target", { input: { host, port }, }); } export function generateSingBoxConfig(): Promise { return invoke("generate_singbox_config"); } export function applyConfiguration( input: ApplyConfigurationInput, ): Promise { return invoke("apply_configuration", { input }); } export function startProxiFyreService(): Promise { return invoke("start_proxifyre_service"); } export function stopProxiFyreService(): Promise { return invoke("stop_proxifyre_service"); } export function installProxiFyre(): Promise { return invoke("install_proxifyre"); } export function configureProxiFyreFirewallRules(): Promise { return invoke("configure_proxifyre_firewall_rules"); } export function uninstallProxiFyre(): Promise { return invoke("uninstall_proxifyre"); } export function startSingBoxService(): Promise { return invoke("start_singbox_service"); } export function stopSingBoxService(): Promise { return invoke("stop_singbox_service"); } export function installSingBox(): Promise { return invoke("install_singbox"); } export function uninstallSingBox(): Promise { return invoke("uninstall_singbox"); }