diff --git a/src/main.js b/src/main.js
index 248b8fc..abf9fb2 100644
--- a/src/main.js
+++ b/src/main.js
@@ -599,12 +599,62 @@ function showGuardianRecovery() {
${statusIcon('warn', 16)}
Gateway 反复启动失败,可能配置有误
-
-
-
服务管理
+
+
查看日志
`
+ banner.querySelector('#btn-gw-recover-fix')?.addEventListener('click', async (e) => {
+ const btn = e.target
+ btn.disabled = true
+ btn.textContent = '修复中...'
+ // 弹出修复弹窗
+ const overlay = document.createElement('div')
+ overlay.className = 'modal-overlay'
+ overlay.innerHTML = `
+
+
🔧 自动修复
+
+ 正在执行 openclaw doctor --fix,自动检测并修复常见配置问题...
+
+
⏳ 执行中...\n
+
+
+
+
+
+ `
+ document.body.appendChild(overlay)
+ const logEl = overlay.querySelector('#fix-log')
+ const statusEl = overlay.querySelector('#fix-status')
+ const closeBtn = overlay.querySelector('#fix-close')
+ closeBtn.onclick = () => overlay.remove()
+
+ try {
+ const result = await api.doctorFix()
+ const output = result?.stdout || result?.output || JSON.stringify(result, null, 2)
+ logEl.textContent = output || '✅ 修复完成(无输出)'
+ logEl.scrollTop = logEl.scrollHeight
+ if (result?.errors) {
+ statusEl.innerHTML = `⚠ 修复完成,但有警告:${escapeHtml(String(result.errors).slice(0, 200))}`
+ } else {
+ statusEl.innerHTML = '✅ 修复完成,正在重启 Gateway...'
+ resetAutoRestart()
+ try {
+ await api.startService('ai.openclaw.gateway')
+ statusEl.innerHTML = '✅ 修复完成,Gateway 已重启'
+ } catch {
+ statusEl.innerHTML = '✅ 修复完成,但 Gateway 启动失败,请手动检查'
+ }
+ }
+ } catch (err) {
+ logEl.textContent += '\n❌ ' + (err.message || String(err))
+ statusEl.innerHTML = `❌ 修复失败:${escapeHtml(String(err.message || err).slice(0, 200))}`
+ }
+ closeBtn.style.display = ''
+ btn.textContent = '一键修复'
+ btn.disabled = false
+ })
banner.querySelector('#btn-gw-recover-restart')?.addEventListener('click', async (e) => {
const btn = e.target
btn.disabled = true
@@ -618,9 +668,6 @@ function showGuardianRecovery() {
btn.disabled = false
}
})
- banner.querySelector('#btn-gw-recover-backup')?.addEventListener('click', () => {
- navigate('/services')
- })
}
// === 全局版本更新检测 ===