import type { AliasTargetInput, AliasUpsertInput, ConfigExportView, ConfigImportInput, ConfigImportResult, DesktopPrefsSaveResult, AliasView, DesktopPrefsView, DoctorRunResult, MetaView, Overview, ProviderImportInput, ProviderImportResult, ProviderSaveResult, ProviderStateInput, ProviderUpsertInput, ProviderView, ProxyStatusView, SyncInput, SyncPreview, SyncResult, } from './types' type ApiEnvelope = { data: T error?: string } function isWails(): boolean { return typeof window.go?.desktop?.App !== 'undefined' } async function http(path: string, init?: RequestInit): Promise { const response = await fetch(path, { headers: { 'Content-Type': 'application/json' }, ...init, }) const payload = (await response.json()) as ApiEnvelope if (!response.ok) { throw new Error(payload.error || 'request failed') } return payload.data } function bridge() { const app = window.go?.desktop?.App if (!app) { throw new Error('Wails bridge unavailable') } return app } export async function getMeta(): Promise { if (isWails()) { const data = await bridge().Meta() return { version: data.version || 'dev', shell: data.shell || 'wails' } } return http('/api/meta') } export function getOverview(): Promise { return isWails() ? bridge().Overview() : http('/api/overview') } export function exportConfig(): Promise { return isWails() ? bridge().ExportConfig() : http('/api/config/export') } export function importConfig(input: ConfigImportInput): Promise { return isWails() ? bridge().ImportConfig(input) : http('/api/config/import', { method: 'POST', body: JSON.stringify(input) }) } export function listProviders(): Promise { return isWails() ? bridge().Providers() : http('/api/providers') } export function listAliases(): Promise { return isWails() ? bridge().Aliases() : http('/api/aliases') } export function saveProvider(input: ProviderUpsertInput): Promise { return isWails() ? bridge().SaveProvider(input) : http('/api/providers', { method: 'POST', body: JSON.stringify(input) }) } export function setProviderState(input: ProviderStateInput): Promise { return isWails() ? bridge().SetProviderState(input) : http('/api/providers/state', { method: 'POST', body: JSON.stringify(input) }) } export async function deleteProvider(id: string): Promise { if (isWails()) { await bridge().DeleteProvider(id) return } await http<{ ok: boolean }>('/api/providers/delete', { method: 'POST', body: JSON.stringify({ id }) }) } export function importProviders(input: ProviderImportInput): Promise { return isWails() ? bridge().ImportProviders(input) : http('/api/providers/import', { method: 'POST', body: JSON.stringify(input) }) } export function saveAlias(input: AliasUpsertInput): Promise { return isWails() ? bridge().SaveAlias(input) : http('/api/aliases', { method: 'POST', body: JSON.stringify(input) }) } export async function deleteAlias(alias: string): Promise { if (isWails()) { await bridge().DeleteAlias(alias) return } await http<{ ok: boolean }>('/api/aliases/delete', { method: 'POST', body: JSON.stringify({ alias }) }) } export function bindAliasTarget(input: AliasTargetInput): Promise { return isWails() ? bridge().BindTarget(input) : http('/api/aliases/bind', { method: 'POST', body: JSON.stringify(input) }) } export function setAliasTargetState(input: AliasTargetInput): Promise { return isWails() ? bridge().SetTargetState(input) : http('/api/aliases/state', { method: 'POST', body: JSON.stringify(input) }) } export function unbindAliasTarget(input: AliasTargetInput): Promise { return isWails() ? bridge().UnbindTarget(input) : http('/api/aliases/unbind', { method: 'POST', body: JSON.stringify(input) }) } export function getDesktopPrefs(): Promise { return isWails() ? bridge().DesktopPrefs() : http('/api/desktop-prefs') } export function saveDesktopPrefs(input: DesktopPrefsView): Promise { return isWails() ? bridge().SavePrefs(input) : http('/api/desktop-prefs', { method: 'POST', body: JSON.stringify(input) }) } export function runDoctor(): Promise { return isWails() ? bridge().DoctorRun() : http('/api/doctor', { method: 'POST' }) } export function getProxyStatus(): Promise { return isWails() ? bridge().ProxyStatus() : http('/api/proxy/status') } export function startProxy(): Promise { return isWails() ? bridge().StartProxy() : http('/api/proxy/start', { method: 'POST' }) } export function stopProxy(): Promise { return isWails() ? bridge().StopProxy() : http('/api/proxy/stop', { method: 'POST' }) } export function previewSync(input: SyncInput): Promise { return isWails() ? bridge().PreviewSync(input) : http('/api/opencode-sync/preview', { method: 'POST', body: JSON.stringify(input) }) } export function applySync(input: SyncInput): Promise { return isWails() ? bridge().ApplySync(input) : http('/api/opencode-sync/apply', { method: 'POST', body: JSON.stringify(input) }) }