/** * Gateway 连接诊断页面 */ import { api, isTauriRuntime } from '../lib/tauri-api.js' import { toast } from '../components/toast.js' import { t } from '../lib/i18n.js' const STEP_LABELS = { config: () => t('diagnose.stepConfig'), device_key: () => t('diagnose.stepDeviceKey'), allowed_origins: () => t('diagnose.stepOrigins'), tcp_port: () => t('diagnose.stepTcp'), http_health: () => t('diagnose.stepHttp'), err_log: () => t('diagnose.stepErrLog'), } export async function render() { const page = document.createElement('div') page.className = 'page' page.innerHTML = `
${t('diagnose.noData')}
` const btnDiagnose = page.querySelector('#btn-diagnose') btnDiagnose.onclick = async () => { btnDiagnose.disabled = true btnDiagnose.textContent = t('diagnose.running') page.querySelector('#diagnose-summary').innerHTML = '' page.querySelector('#diagnose-steps').innerHTML = '
'.repeat(6) try { const result = await api.diagnoseGatewayConnection() renderResult(page, result) } catch (e) { toast.error(`${t('diagnose.diagnoseFailed')}: ${e}`) page.querySelector('#diagnose-steps').innerHTML = `
${t('diagnose.diagnoseFailed')}: ${e}
` } finally { btnDiagnose.disabled = false btnDiagnose.textContent = t('diagnose.runDiagnose') } } return page } function renderResult(page, result) { // Summary const summaryEl = page.querySelector('#diagnose-summary') if (result.overallOk) { summaryEl.innerHTML = `
${t('diagnose.allPassed')}
` } else { summaryEl.innerHTML = `
⚠️ ${result.summary}
` } // Steps const stepsEl = page.querySelector('#diagnose-steps') stepsEl.innerHTML = result.steps.map(step => { const label = STEP_LABELS[step.name]?.() || step.name const icon = step.ok ? '✅' : '❌' const status = step.ok ? t('diagnose.passed') : t('diagnose.failed') const bgColor = step.ok ? 'var(--bg-secondary,#f9fafb)' : 'var(--error-bg,#fef2f2)' return `
${icon} ${label}
${step.durationMs}ms
${escHtml(step.message)}
` }).join('') // Env info const envEl = page.querySelector('#diagnose-env') envEl.style.display = '' const env = result.env const rows = [ [t('diagnose.openclawDir'), env.openclawDir], [t('diagnose.port'), env.port], [t('diagnose.authMode'), env.authMode], [t('diagnose.deviceKey'), env.deviceKeyExists ? '✅' : '❌'], ] let html = '' for (const [k, v] of rows) { html += `` } html += '
${k}${escHtml(String(v))}
' if (env.errLogExcerpt) { html += `
${t('diagnose.errLogExcerpt')}
${escHtml(env.errLogExcerpt)}
` } page.querySelector('#env-content').innerHTML = html } function escHtml(s) { return s.replace(/&/g, '&').replace(//g, '>') }