/**
* 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 = `
`
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 += `| ${k} | ${escHtml(String(v))} |
`
}
html += '
'
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, '>')
}