/** 工作台桥接服务客户端:所有数据经由 gyxx-workbench 宿主插件的本机回环桥接。 */ export function bridgeBase() { if (typeof window !== 'undefined') { if (window.__GYXX_WB_BRIDGE__) return window.__GYXX_WB_BRIDGE__ try { const saved = window.localStorage?.getItem('gyxx.wb.bridge') if (saved) return saved } catch { // localStorage 不可用时使用默认值 } } return 'http://127.0.0.1:8790' } async function request(method, path, body) { const response = await fetch(`${bridgeBase()}${path}`, { method, headers: { accept: 'application/json', ...(body !== undefined ? { 'content-type': 'application/json', 'x-gyxx-workbench': '1' } : {}), }, body: body === undefined ? undefined : JSON.stringify(body), }) let payload try { payload = await response.json() } catch { payload = { ok: false, error: `桥接服务返回了非 JSON 内容(HTTP ${response.status})` } } if (!response.ok) { throw new Error(payload?.error ?? `桥接服务错误(HTTP ${response.status})`) } return payload } export const api = { listWorkflows: () => request('GET', '/bridge/workflows'), workflowDetail: (workflowId) => request('GET', `/bridge/workflows/${encodeURIComponent(workflowId)}`), workflowRuns: (workflowId, limit = 6) => request('GET', `/bridge/workflows/${encodeURIComponent(workflowId)}/runs?limit=${limit}`), diagnosis: (workflowId, runId) => request( 'GET', `/bridge/workflows/${encodeURIComponent(workflowId)}/diagnosis${runId ? `?run_id=${encodeURIComponent(runId)}` : ''}`, ), alerts: () => request('GET', '/bridge/alerts'), markAlertSeen: (id) => request('POST', '/bridge/alerts/seen', { id }), trigger: (payload) => request('POST', '/bridge/trigger', payload), cancel: (payload) => request('POST', '/bridge/cancel', payload), ask: (payload) => request('POST', '/bridge/ask', payload), }