openclaw doctor 是 OpenClaw 的修复和迁移工具。它会修复过期的配置/状态,检查健康状况,并提供可执行的修复步骤。
快速开始
无头和自动化模式
- --yes
- --fix
- --lint
- --fix --force
- --non-interactive
- --deep
只读 lint 模式
openclaw doctor --lint 是适合自动化的 openclaw doctor --fix 同级命令。两者运行相同的健康检查;只有姿态不同:
| 模式 | 提示 | 写入配置/状态 | 输出 | 用途 |
|---|---|---|---|---|
openclaw doctor | 是 | 否 | 友好的健康报告 | 人工检查状态 |
openclaw doctor --fix | 有时 | 是,遵循修复策略 | 友好的修复日志 | 应用已批准的修复 |
openclaw doctor --lint | 否 | 否 | 结构化发现 | CI、预检和审核门禁 |
repair() 实现;doctor --fix 会在存在时应用它,否则回退到旧版 Doctor 修复流程。该契约将 detect()(报告发现)与 repair()(报告更改/diff/副作用)分离,从而为未来的 doctor --fix --dry-run 保留路径,而不会把 lint 检查变成变更规划器。
ok:是否有任何发现达到所选严重性阈值checksRun/checksSkipped:计数(按配置文件、--only或--skip跳过)findings:结构化诊断,包含checkId、severity、message,以及可选的path、line、column、ocPath、source、target、requirement、fixHint
| 代码 | 含义 |
|---|---|
0 | 没有达到或超过所选阈值的发现 |
1 | 一个或多个发现达到所选阈值 |
2 | 在能够输出发现之前发生命令/运行时失败 |
--severity-min info|warning|error(默认warning):同时控制打印内容和导致非零退出的条件。--all:运行每个已注册检查,包括默认自动化集合中排除的选择加入检查。--only <id>(可重复):仅运行指定的检查 ID;未知 ID 会报告为错误发现。--skip <id>(可重复):排除某个检查,同时保持其余运行处于活动状态。--json、--severity-min、--all、--only和--skip需要--lint;普通openclaw doctor和--fix运行会拒绝它们。
它做什么(摘要)
健康、UI 和更新
健康、UI 和更新
- git 安装的可选预检更新(仅交互式)。
- UI 协议新鲜度检查(当协议 schema 更新时重建 Control UI)。
- 健康检查 + 重启提示。
- Skills 状态摘要(符合条件/缺失/被阻止)和插件状态。
配置和迁移
配置和迁移
- 针对旧版值形状的配置规范化。
- Talk 配置迁移:从旧版扁平
talk.*字段迁移到talk.provider+talk.providers.<provider>。 - 针对旧版 Chrome 扩展配置和 Chrome MCP 就绪性的浏览器迁移检查。
- OpenCode 提供商覆盖警告(
models.providers.opencode/opencode-zen/opencode-go)。 - 旧版 OpenAI Codex 提供商/配置文件迁移(
openai-codex→openai),以及过期models.providers.openai-codex的遮蔽警告。 - OpenAI Codex OAuth 配置文件的 OAuth TLS 前置条件检查。
- 当
plugins.allow受限但工具策略仍要求通配符或插件拥有的工具时,发出插件/工具 allowlist 警告。 - 旧版磁盘状态迁移(会话/Agent 目录/WhatsApp 凭证)。
- 旧版插件清单契约键迁移(
speechProviders、realtimeTranscriptionProviders、realtimeVoiceProviders、mediaUnderstandingProviders、imageGenerationProviders、videoGenerationProviders、webFetchProviders、webSearchProviders→contracts)。 - 旧版 cron 存储迁移(
jobId、schedule.cron、顶层 delivery/payload 字段、payloadprovider、notify: truewebhook 回退任务)。 - Codex CLI 运行时固定值修复(
agentRuntime.id: "codex-cli"→"codex"),覆盖agents.defaults、agents.list[]和models.providers.*(包括逐模型条目)。 - 插件启用时清理过期插件配置;当
plugins.enabled=false时,过期插件引用会作为惰性隔离配置保留。
状态和完整性
状态和完整性
- 会话锁文件检查和过期锁清理。
- 修复受影响 2026.4.24 构建创建的重复提示重写分支的会话转录。
- 检测卡住的子智能体重启恢复 tombstone,并通过
--fix支持清除过期的已中止恢复标志,避免启动时继续将子项视为重启中止。 - 状态完整性和权限检查(会话、转录、状态目录)。
- 本地运行时的配置文件权限检查(chmod 600)。
- 模型凭证健康:检查 OAuth 过期情况,可以刷新即将过期的令牌,并报告凭证配置文件的冷却/禁用状态。
Gateway 网关、服务和 supervisor
Gateway 网关、服务和 supervisor
- 启用沙箱隔离时修复沙箱镜像。
- 旧版服务迁移和额外 Gateway 网关检测。
- Matrix 渠道旧版状态迁移(在
--fix/--repair模式中)。 - Gateway 网关运行时检查(服务已安装但未运行;缓存的 launchd 标签)。
- 渠道状态警告(从正在运行的 Gateway 网关探测)。
- 渠道特定权限检查位于
openclaw channels capabilities下;例如,Discord 语音渠道权限通过openclaw channels capabilities --channel discord --target channel:<channel-id>审计。 - 当本地 TUI 客户端仍在运行且 Gateway 网关事件循环健康下降时,检查 WhatsApp 响应性;
--fix只会停止已验证的本地 TUI 客户端。 - 修复主模型、回退、图像/视频生成模型、heartbeat/子智能体/压缩覆盖、Hooks、渠道模型覆盖和会话路由固定中的旧版
openai-codex/*模型引用;--fix会将它们重写为openai/*,将openai-codex:*凭证配置文件/顺序迁移为openai:*,移除过期的会话/整 Agent 运行时固定值,并在默认 Codex harness 上保留规范的 OpenAI Agent 引用。 - supervisor 配置审计(launchd/systemd/schtasks),可选修复。
- 清理安装或更新期间捕获 shell
HTTP_PROXY/HTTPS_PROXY/NO_PROXY值的 Gateway 网关服务中的嵌入式代理环境。 - Gateway 网关运行时最佳实践检查(Node 与 Bun、版本管理器路径)。
- Gateway 网关端口冲突诊断(默认
18789)。
凭证、安全和配对
凭证、安全和配对
- 开放私信策略的安全警告。
- local token 模式的 Gateway 网关凭证检查(当不存在令牌来源时提供令牌生成;不会覆盖令牌 SecretRef 配置)。
- 设备配对问题检测(待处理的首次配对请求、待处理的角色/权限范围升级、过期本地设备令牌缓存漂移,以及已配对记录的凭证漂移)。
工作区和 shell
工作区和 shell
- Linux 上的 systemd linger 检查。
- 工作区 bootstrap 文件大小检查(上下文文件截断/接近限制警告)。
- 默认 Agent 的 Skills 就绪检查;报告因缺少二进制文件、环境变量、配置或 OS 要求而不可用的允许技能,并且
--fix可以在skills.entries中禁用不可用技能。 - shell 补全状态检查和自动安装/升级。
- 记忆搜索 embedding 提供商就绪检查(本地模型、远程 API key 或 QMD 二进制文件)。
- 源码安装检查(pnpm 工作区不匹配、缺少 UI 资源、缺少 tsx 二进制文件)。
- 写入更新后的配置 + 向导元数据。
Dreams UI 回填和重置
Control UI Dreams 场景包含面向 grounded dreaming 工作流的 回填、重置 和 清除 Grounded 操作。这些操作使用 Gateway 网关 Doctor 风格的 RPC 方法,但不属于openclaw doctor CLI 修复/迁移的一部分。
| 操作 | 作用 |
|---|---|
| 回填 | 扫描活动工作区中的历史 memory/YYYY-MM-DD.md 文件,运行 grounded REM 日记 pass,并将可逆的回填条目写入 DREAMS.md。 |
| 重置 | 仅从 DREAMS.md 中移除标记的回填日记条目。 |
| 清除 Grounded | 仅移除来自历史回放、尚未累积实时召回或每日支持的暂存 grounded-only 短期条目。 |
MEMORY.md、运行完整 Doctor 迁移,或自行将 grounded 候选项暂存到实时短期提升存储中。要将 grounded 历史回放送入正常的深度提升通道,请改用 CLI 流程:
DREAMS.md 保持为审核界面。
详细行为和理由
0. 可选更新(git 安装)
0. 可选更新(git 安装)
1. 配置规范化
1. 配置规范化
talk.provider + talk.providers.<provider>,实时语音配置位于 talk.realtime.* 下。Doctor 会把旧的 talk.voiceId / talk.voiceAliases / talk.modelId / talk.outputFormat / talk.apiKey 形状重写到提供商映射中,并把旧版顶层实时选择器(talk.mode、talk.transport、talk.brain、talk.model、talk.voice)重写到 talk.realtime。当 plugins.allow 非空且工具策略使用通配符或插件拥有的工具条目时,Doctor 也会警告。tools.allow: ["*"] 只匹配实际加载的插件中的工具;它不会绕过独占插件允许列表。2. 旧版配置键迁移
2. 旧版配置键迁移
openclaw doctor。Doctor 会说明发现了哪些旧版键,展示它应用的迁移,并使用更新后的 schema 重写 ~/.openclaw/openclaw.json。Gateway 网关启动会拒绝旧版配置格式,并要求你运行 openclaw doctor --fix;它不会在启动时重写 openclaw.json。Cron 作业存储迁移也由 openclaw doctor --fix 处理。routing.queue、routing.bindings、routing.agents/defaultAgentId、
routing.transcribeAudio、顶层 agent.*,或来自多 Agent 前配置形状的顶层 identity)
不再有迁移路径;现在使用它们的配置会验证失败,而不是被重写。
在 Doctor 可以继续之前,请根据当前配置参考手动修复这些键。| 旧版键 | 当前键 |
|---|---|
routing.allowFrom | channels.whatsapp.allowFrom |
routing.groupChat.requireMention | channels.whatsapp/telegram/imessage.groups."*".requireMention |
routing.groupChat.historyLimit | messages.groupChat.historyLimit |
routing.groupChat.mentionPatterns | messages.groupChat.mentionPatterns |
channels.telegram.requireMention | channels.telegram.groups."*".requireMention |
channels.webchat, gateway.webchat | 已移除(WebChat 已退役) |
channels.feishu.accounts.<accountId>.botName | channels.feishu.accounts.<accountId>.name |
session.threadBindings.ttlHours, channels.<id>.threadBindings.ttlHours(以及按账号配置) | ...threadBindings.idleHours |
旧版 talk.voiceId/talk.voiceAliases/talk.modelId/talk.outputFormat/talk.apiKey | talk.provider + talk.providers.<provider> |
旧版顶层实时 Talk 选择器(talk.mode/talk.transport/talk.brain/talk.model/talk.voice) | talk.realtime |
messages.tts.<provider>(openai/elevenlabs/microsoft/edge) | messages.tts.providers.<provider> |
messages.tts.provider: "edge" / messages.tts.providers.edge | messages.tts.provider: "microsoft" / messages.tts.providers.microsoft |
TTS 说话人字段 voice/voiceName/voiceId | speakerVoice/speakerVoiceId |
channels.<id>.tts.<provider> / channels.<id>.accounts.<accountId>.tts.<provider>(除 Discord 外的所有渠道) | ...tts.providers.<provider> |
channels.<id>.voice.tts.<provider> / channels.<id>.accounts.<accountId>.voice.tts.<provider>(所有渠道,包括 Discord) | ...voice.tts.providers.<provider> |
plugins.entries.voice-call.config.tts.<provider>(openai/elevenlabs/microsoft/edge) | plugins.entries.voice-call.config.tts.providers.<provider> |
plugins.entries.voice-call.config.tts.provider: "edge" / ...tts.providers.edge | provider: "microsoft" / ...tts.providers.microsoft |
plugins.entries.voice-call.config.provider: "log" | "mock" |
plugins.entries.voice-call.config.twilio.from | plugins.entries.voice-call.config.fromNumber |
plugins.entries.voice-call.config.streaming.sttProvider | plugins.entries.voice-call.config.streaming.provider |
plugins.entries.voice-call.config.streaming.openaiApiKey/sttModel/silenceDurationMs/vadThreshold | plugins.entries.voice-call.config.streaming.providers.openai.* |
models.providers.*.api: "openai" | "openai-completions"(Gateway 网关启动也会跳过 api 为未来/未知枚举值的提供商,而不是失败关闭) |
browser.ssrfPolicy.allowPrivateNetwork | browser.ssrfPolicy.dangerouslyAllowPrivateNetwork |
browser.profiles.*.driver: "extension" | "existing-session" |
browser.relayBindHost | 已移除(旧版 Chrome 扩展中继设置) |
mcp.servers.*.type(CLI 原生别名) | mcp.servers.*.transport |
plugins.entries.codex.config.codexDynamicToolsProfile | 已移除(Codex app-server 始终保持 Codex 原生工作区工具为原生) |
commands.modelsWrite | 已移除(/models add 已弃用) |
agents.defaults/list[].silentReplyRewrite, surfaces.*.silentReplyRewrite | 已移除(精确的 NO_REPLY 不再被重写为可见的回退文本) |
agents.defaults/list[].systemPromptOverride | 已移除(OpenClaw 拥有生成的系统提示) |
agents.defaults/list[].embeddedPi | embeddedAgent |
agents.defaults/list[].sandbox.perSession | sandbox.scope |
agents.defaults.llm | 已移除(对慢模型/提供商超时使用 models.providers.<id>.timeoutSeconds,并保持低于 Agent/运行超时上限) |
顶层 memorySearch | agents.defaults.memorySearch |
memorySearch.provider: "auto" | "openai" |
memorySearch.store.path(任何层级) | 已移除(记忆索引位于每个 Agent 数据库中) |
顶层 heartbeat | agents.defaults.heartbeat / channels.defaults.heartbeat |
plugins.openai-codex 策略 ID | plugins.openai |
tools.web.x_search.apiKey | plugins.entries.xai.config.webSearch.apiKey |
session.maintenance.rotateBytes, session.parentForkMaxTokens | 已移除(已弃用) |
diagnostics.memoryPressureBundle | diagnostics.memoryPressureSnapshot |
plugins.entries.voice-call.config.* 行由
Voice Call 插件自身在每次配置加载时规范化,而不是由 openclaw doctor 规范化。该插件也会记录一条启动警告,指向 openclaw doctor --fix,但 Doctor 目前不会为这些键重写
openclaw.json;插件自身的规范化会在运行时应用该更改。- 如果配置了两个或更多
channels.<channel>.accounts条目,却没有配置channels.<channel>.defaultAccount或accounts.default,Doctor 会警告回退路由可能选中意外账号。 - 如果
channels.<channel>.defaultAccount被设置为未知账号 ID,Doctor 会警告并列出已配置的账号 ID。
2b. OpenCode 提供商覆盖
2b. OpenCode 提供商覆盖
models.providers.opencode、opencode-zen 或 opencode-go,它会覆盖来自 openclaw/plugin-sdk/llm 的内置 OpenCode 目录。这可能会迫使模型使用错误的 API,或把成本清零。Doctor 会警告,以便你移除该覆盖并恢复按模型划分的 API 路由 + 成本。2c. 浏览器迁移和 Chrome MCP 就绪状态
2c. 浏览器迁移和 Chrome MCP 就绪状态
browser.profiles.*.driver: "extension" → "existing-session";移除 browser.relayBindHost)。当你使用 defaultProfile: "user" 或已配置的 existing-session 配置文件时,Doctor 也会审计主机本地 Chrome MCP 路径:- 检查同一主机上是否安装了 Google Chrome,以用于默认自动连接配置
- 检查检测到的 Chrome 版本,并在低于 Chrome 144 时发出警告
- 提醒你在浏览器检查页面中启用远程调试(例如
chrome://inspect/#remote-debugging、brave://inspect/#remote-debugging或edge://inspect/#remote-debugging)
responsebody、PDF 导出、下载拦截和批量操作等高级路由仍然需要托管浏览器或原始 CDP 配置。此检查不适用于 Docker、沙箱、远程浏览器或其他无头流程,这些流程继续使用原始 CDP。2d. OAuth TLS 前置条件
2d. OAuth TLS 前置条件
UNABLE_TO_GET_ISSUER_CERT_LOCALLY、证书过期或自签名证书),Doctor 会输出特定平台的修复指导。在使用 Homebrew Node 的 macOS 上,修复通常是 brew postinstall ca-certificates。使用 --deep 时,即使 Gateway 网关健康,也会运行该探测。2e. Codex OAuth 提供商覆盖
2e. Codex OAuth 提供商覆盖
models.providers.openai-codex 下添加了旧版 OpenAI 传输设置,它们可能会遮蔽较新版本自动使用的内置 Codex OAuth 提供商路径。Doctor 在看到这些旧传输设置与 Codex OAuth 同时存在时会发出警告,这样你就可以移除或重写过时的传输覆盖,并恢复内置路由/回退行为。自定义代理和仅标头覆盖仍受支持,并且不会触发此警告。2f. Codex 路由修复
2f. Codex 路由修复
openai-codex/* 模型引用。Native Codex harness 路由使用规范的 openai/* 模型引用;OpenAI 智能体轮次会经过 Codex app-server harness,而不是 OpenClaw OpenAI provider 路径。在 --fix / --repair 模式下,Doctor 会重写受影响的默认智能体和每个智能体的引用,包括主模型、回退、图像/视频生成模型、Heartbeat/子智能体/压缩覆盖、Hooks、渠道模型覆盖,以及过时的持久化会话路由状态:openai-codex/gpt-*会变为openai/gpt-*。- Codex 意图会移动到已修复智能体模型引用的按提供商/模型限定的
agentRuntime.id: "codex"条目。 - 过时的整智能体运行时配置和持久化会话运行时固定项会被移除,因为运行时选择按提供商/模型限定。
- 除非修复后的旧版模型引用需要 Codex 路由来保留旧凭证路径,否则会保留现有的提供商/模型运行时策略。
- 现有模型回退列表会保留,并重写其中的旧版条目;复制的按模型设置会从旧版键移动到规范的
openai/*键。 - 持久化会话
modelProvider/providerOverride、model/modelOverride、回退通知和凭证配置固定项会在所有发现的智能体会话存储中修复。 - Doctor 还会分别将过时的
agentRuntime.id: "codex-cli"固定项(一个不同的旧版运行时 ID)修复为"codex",范围包括agents.defaults、agents.list[]和models.providers.*模型条目。 /codex ...表示“从聊天中控制或绑定原生 Codex 对话。”/acp ...或runtime: "acp"表示“使用外部 ACP/acpx 适配器。”
2g. 会话路由清理
2g. 会话路由清理
openclaw doctor --fix 可以清除自动创建的过时状态,例如 modelOverrideSource: "auto" 模型固定项、运行时模型元数据、固定的 harness ID、CLI 会话绑定,以及当其所属路由不再配置时的自动凭证配置覆盖。显式用户或旧版会话模型选择会被报告以供手动审查,并保持不变;当不再希望使用该路由时,可用 /model ...、/new 切换它们,或重置会话。3. 旧版状态迁移(磁盘布局)
3. 旧版状态迁移(磁盘布局)
- 会话存储 + 转录稿:从
~/.openclaw/sessions/到~/.openclaw/agents/<agentId>/sessions/ - 智能体目录:从
~/.openclaw/agent/到~/.openclaw/agents/<agentId>/agent/ - WhatsApp 凭证状态(Baileys):从旧版
~/.openclaw/credentials/*.json(oauth.json除外)到~/.openclaw/credentials/whatsapp/<accountId>/...(默认账户 ID:default)
openclaw doctor 迁移。Talk 提供商/提供商映射规范化会按结构相等性比较,因此仅键顺序不同的差异不再触发重复的空操作 doctor --fix 更改。3a. 旧版插件清单迁移
3a. 旧版插件清单迁移
speechProviders、realtimeTranscriptionProviders、realtimeVoiceProviders、mediaUnderstandingProviders、imageGenerationProviders、videoGenerationProviders、webFetchProviders、webSearchProviders)。找到后,它会提议把它们移动到 contracts 对象,并就地重写清单文件。此迁移是幂等的;如果 contracts 已有相同值,则会移除旧版键而不复制数据。3b. 旧版 cron 存储迁移
3b. 旧版 cron 存储迁移
~/.openclaw/cron/jobs.json,或覆盖时的 cron.store),查找调度器仍为兼容性而接受的旧任务形状。当前 cron 清理包括:jobId→idschedule.cron→schedule.expr- 顶层载荷字段(
message、model、thinking、…)→payload - 顶层投递字段(
deliver、channel、to、provider、…)→delivery - 载荷
provider投递别名 → 显式delivery.channel - 旧版
notify: truewebhook 回退任务 → 设置了cron.webhook时,改为显式 webhook 投递;公告任务保留其聊天投递,并获得delivery.completionDestination。未设置cron.webhook时,会为无目标任务移除惰性的顶层notify标记(现有投递,包括公告,会保留),因为运行时投递从不读取它。
jobs.json 移除前复制到活动存储旁边的 jobs-quarantine.json;Doctor 会报告已隔离的行,方便你手动审查或修复。Gateway 网关启动会规范化运行时投影并忽略顶层 notify 标记,但会保留持久化的 cron 配置以供 Doctor 修复。未设置 cron.webhook 时,Doctor 会移除没有迁移目标的任务中的惰性标记(delivery.mode 为 none/缺失、webhook 目标不可用,或已有公告/聊天投递),并保持现有投递不变,因此重复运行 doctor --fix 不再对同一任务重复警告。如果设置了 cron.webhook 但不是有效的 HTTP(S) URL,Doctor 仍会发出警告并保留该标记,以便你修复 URL。在 Linux 上,当用户的 crontab 仍调用旧版 ~/.openclaw/bin/ensure-whatsapp.sh 时,Doctor 也会发出警告。当前 OpenClaw 不维护这个主机本地脚本,并且当 cron 无法访问 systemd 用户总线时,它可能会向 ~/.openclaw/logs/whatsapp-health.log 写入错误的 Gateway inactive 消息。用 crontab -e 移除过时的 crontab 条目;使用 openclaw channels status --probe、openclaw doctor 和 openclaw gateway status 执行当前健康检查。3c. 会话锁清理
3c. 会话锁清理
--fix / --repair 模式下,它会自动移除所有者已死、孤立、已回收、格式错误且较旧,或属于非 OpenClaw 的锁。仍由存活 OpenClaw 进程拥有的旧锁会被报告但保留原位,这样 Doctor 不会切断活动的转录稿写入器。3d. 会话转录稿分支修复
3d. 会话转录稿分支修复
--fix / --repair 模式下,Doctor 会把每个受影响文件备份到原文件旁边,并将转录稿重写为活动分支,使 Gateway 网关历史记录和记忆读取器不再看到重复轮次。4. 状态完整性检查(会话持久化、路由和安全)
4. 状态完整性检查(会话持久化、路由和安全)
- 状态目录缺失:警告灾难性状态丢失,提示重新创建目录,并提醒你它无法恢复缺失的数据。
- 状态目录权限:验证可写性;提议修复权限(并在检测到所有者/组不匹配时发出
chown提示)。 - macOS 云同步状态目录:当状态解析到 iCloud Drive(
~/Library/Mobile Documents/com~apple~CloudDocs/...)或~/Library/CloudStorage/...下时发出警告,因为同步支持的路径可能导致更慢的 I/O 和锁/同步竞争。 - Linux SD 或 eMMC 状态目录:当状态解析到
mmcblk*挂载源时发出警告,因为 SD/eMMC 支持的随机 I/O 在会话和凭证写入下可能更慢且磨损更快。 - Linux 易失性状态目录:当状态解析到
tmpfs或ramfs时发出警告,因为会话、凭证、配置和 SQLite 状态(带 WAL/journal 旁文件)会在重启时消失。Dockeroverlay挂载有意不被标记,因为只要容器保留,其可写层就会在主机重启后继续存在。 - 会话目录缺失:
sessions/和会话存储目录是持久化历史记录并避免ENOENT崩溃所必需的。 - 转录稿不匹配:当最近会话条目缺少转录稿文件时发出警告。
- 主会话“1 行 JSONL”:当主转录稿只有一行时标记(历史记录没有累积)。
- 多个状态目录:当多个主目录中存在多个
~/.openclaw文件夹,或OPENCLAW_STATE_DIR指向其他位置时发出警告(历史记录可能在安装之间分裂)。 - 远程模式提醒:如果
gateway.mode=remote,Doctor 会提醒你在远程主机上运行它(状态位于那里)。 - 配置文件权限:如果
~/.openclaw/openclaw.json可被组/全局读取,则发出警告并提议收紧到600。
5. 模型凭证健康(OAuth 过期)
5. 模型凭证健康(OAuth 过期)
--non-interactive 会跳过刷新尝试。当 OAuth 刷新永久失败时(例如 refresh_token_reused、invalid_grant,或提供商要求你重新登录),Doctor 会报告需要重新认证,并打印要运行的确切 openclaw models auth login --provider ... 命令。Doctor 还会报告因短暂冷却(速率限制/超时/认证失败)或较长时间禁用(计费/额度失败)而暂时不可用的凭证配置文件。对于令牌位于 macOS Keychain 中的旧版 Codex OAuth 配置文件(基于文件的 sidecar 布局之前的旧版新手引导),只由 Doctor 修复。从交互式终端运行一次 openclaw doctor --fix,将 Keychain 支持的旧版令牌内联迁移到 auth-profiles.json;之后,嵌入式轮次(Telegram、cron、子智能体分发)会将它们解析为规范的 OpenAI OAuth 配置文件。6. Hooks 模型验证
6. Hooks 模型验证
hooks.gmail.model,Doctor 会根据目录和允许列表验证模型引用,并在它无法解析或被禁止时发出警告。7. 沙箱镜像修复
7. 沙箱镜像修复
7b. 插件安装清理
7b. 插件安装清理
openclaw doctor --fix / openclaw doctor --repair 模式下移除旧版 OpenClaw 生成的插件依赖暂存状态:过期的生成依赖根目录、旧的安装阶段目录、早期内置插件依赖修复代码留下的包内残留,以及可能遮蔽当前内置清单的孤立或已恢复的托管 npm 内置 @openclaw/* 插件副本。Doctor 还会将宿主 openclaw 包重新链接到声明了 peerDependencies.openclaw 的托管 npm 插件中,这样 openclaw/plugin-sdk/* 等包内运行时导入在更新或 npm 修复后仍能继续解析。当配置引用了可下载插件但本地插件注册表找不到它们时,Doctor 也可以重新安装缺失的可下载插件(物化的 plugins.entries、已配置的渠道/提供商/搜索设置、已配置的 Agent Runtimes)。在包更新期间,Doctor 会避免在核心包被替换时运行包管理器插件修复;如果更新后某个已配置插件仍需要恢复,请再次运行 openclaw doctor --fix。Gateway 网关启动和配置重载不会运行包管理器;插件安装仍然是显式的 Doctor/install/update 工作。8. Gateway 网关服务迁移和清理提示
8. Gateway 网关服务迁移和清理提示
openclaw gateway status --deep 或 openclaw doctor --deep 检查,然后移除重复项;如果 Gateway 网关生命周期由系统 supervisor 管理,请设置 OPENCLAW_SERVICE_REPAIR_POLICY=external。8b. 启动时 Matrix 迁移
8b. 启动时 Matrix 迁移
--fix / --repair 模式下创建迁移前快照,然后运行尽力而为的迁移步骤:旧版 Matrix 状态迁移和旧版加密状态准备。这两个步骤都不是致命错误;错误会被记录,启动会继续。在只读模式(不带 --fix 的 openclaw doctor)下,此检查会被完全跳过。8c. 设备配对和凭证漂移
8c. 设备配对和凭证漂移
- 待处理的首次配对请求
- 已配对设备的待处理角色或权限范围升级
- 设备 ID 仍匹配但设备身份不再匹配已批准记录的公钥不匹配修复
- 已配对记录缺少已批准角色的有效令牌
- 权限范围漂移到已批准配对基线之外的已配对令牌
- 当前机器上早于 Gateway 网关侧令牌轮换,或携带过期权限范围元数据的本地缓存设备令牌条目
- 使用
openclaw devices list检查待处理请求 - 使用
openclaw devices approve <requestId>批准确切请求 - 使用
openclaw devices rotate --device <deviceId> --role <role>轮换新令牌 - 使用
openclaw devices remove <deviceId>移除并重新批准过期记录
9. 安全警告
9. 安全警告
10. systemd linger(Linux)
10. systemd linger(Linux)
11. 工作区状态(Skills、插件和 TaskFlows)
11. 工作区状态(Skills、插件和 TaskFlows)
- Skills 状态:统计符合条件、缺少要求以及被允许列表阻止的 Skills。
- 插件状态:统计已启用/已禁用/出错的插件;列出所有错误的插件 ID;报告内置插件能力。
- 插件兼容性警告:标记与当前运行时存在兼容性问题的插件。
- 插件诊断:显示插件注册表在加载时发出的任何警告或错误。
- TaskFlow 恢复:显示需要手动检查或取消的可疑托管 TaskFlows。
11b. Bootstrap 文件大小
11b. Bootstrap 文件大小
AGENTS.md、CLAUDE.md 或其他注入的上下文文件)是否接近或超过已配置的字符预算。它会报告每个文件的原始字符数与注入字符数、截断百分比、截断原因(max/file 或 max/total),以及总注入字符数占总预算的比例。当文件被截断或接近限制时,Doctor 会打印用于调整 agents.defaults.bootstrapMaxChars 和 agents.defaults.bootstrapTotalMaxChars 的提示。11c. Shell 补全
11c. Shell 补全
- 如果 shell 配置文件使用较慢的动态补全模式(
source <(openclaw completion ...)),Doctor 会将其升级为更快的缓存文件变体。 - 如果配置文件中已配置补全但缓存文件缺失,Doctor 会自动重新生成缓存。
- 如果完全没有配置补全,Doctor 会提示安装它(仅限交互模式;使用
--non-interactive时跳过)。
openclaw completion --write-state 可手动重新生成缓存。11d. 过期渠道插件清理
11d. 过期渠道插件清理
openclaw doctor --fix 移除缺失的渠道插件时,它还会移除引用该插件的悬空渠道范围配置:channels.<id> 条目、命名该渠道的 Heartbeat 目标,以及 agents.*.models["<channel>/*"] 覆盖项。这可以防止渠道运行时已消失但配置仍要求 Gateway 网关绑定到它而导致的 Gateway 网关启动循环。12. Gateway 网关凭证检查(本地令牌)
12. Gateway 网关凭证检查(本地令牌)
- 如果令牌模式需要令牌且不存在令牌来源,Doctor 会提供生成一个令牌的选项。
- 如果
gateway.auth.token由 SecretRef 管理但不可用,Doctor 会发出警告,并且不会用明文覆盖它。 openclaw doctor --generate-gateway-token只会在未配置令牌 SecretRef 时强制生成。
12b. 感知 SecretRef 的只读修复
12b. 感知 SecretRef 的只读修复
openclaw doctor --fix会使用与状态类命令相同的只读 SecretRef 摘要模型进行定向配置修复。- 示例:Telegram
allowFrom/groupAllowFrom@username修复会在可用时尝试使用已配置的 Bot 凭证。 - 如果 Telegram Bot 令牌通过 SecretRef 配置,但在当前命令路径中不可用,Doctor 会报告该凭证已配置但不可用,并跳过自动解析,而不是崩溃或误报令牌缺失。
13. Gateway 健康检查 + 重启
13. Gateway 健康检查 + 重启
13b. 记忆搜索就绪状态
13b. 记忆搜索就绪状态
- QMD 后端:探测
qmd二进制文件是否可用且可启动。如果不可用,会打印修复指导,包括npm install -g @tobilu/qmd(或 Bun 等效命令)以及手动二进制路径选项。 - 显式本地提供商:检查本地模型文件或可识别的远程/可下载模型 URL。如果缺失,建议切换到远程提供商。
- 显式远程提供商(
openai、voyage等):验证环境或凭证存储中是否存在 API 密钥。如果缺失,会打印可执行的修复提示。 - 旧版自动提供商:将
memorySearch.provider: "auto"视为 OpenAI,检查 OpenAI 就绪状态,并由doctor --fix将其重写为provider: "openai"。
openclaw memory status --deep 在运行时验证嵌入就绪状态。14. 渠道状态警告
14. 渠道状态警告
15. Supervisor 配置审计 + 修复
15. Supervisor 配置审计 + 修复
openclaw doctor在重写 supervisor 配置前会提示。openclaw doctor --yes接受默认修复提示。openclaw doctor --fix无需提示即可应用推荐修复(--repair是别名)。openclaw doctor --fix --force覆盖自定义 supervisor 配置。OPENCLAW_SERVICE_REPAIR_POLICY=external让 doctor 对 Gateway 网关服务生命周期保持只读。它仍会报告服务健康状态并运行非服务修复,但会跳过服务安装/启动/重启/引导、supervisor 配置重写以及旧版服务清理,因为外部 supervisor 拥有该生命周期。- 在 Linux 上,当匹配的 systemd Gateway 网关单元处于活动状态时,doctor 不会重写命令/入口点元数据。它还会在重复服务扫描期间忽略处于非活动状态且非旧版的额外类似 Gateway 网关的单元,因此配套服务文件不会产生清理噪音。
- 如果 token auth 需要 token 且
gateway.auth.token由 SecretRef 管理,doctor 服务安装/修复会验证 SecretRef,但不会将解析出的明文 token 值持久化到 supervisor 服务环境元数据中。 - Doctor 会检测旧版 LaunchAgent、systemd 或 Windows Scheduled Task 安装以内联方式嵌入的托管
.env/SecretRef 支持的服务环境值,并重写服务元数据,使这些值从运行时来源加载,而不是从 supervisor 定义加载。 - Doctor 会检测服务命令在
gateway.port变更后是否仍固定旧的--port,并将服务元数据重写为当前端口。 - 如果 token auth 需要 token 且配置的 token SecretRef 未解析,doctor 会阻止安装/修复路径,并提供可操作的指导。
- 如果同时配置了
gateway.auth.token和gateway.auth.password,且gateway.auth.mode未设置,doctor 会阻止安装/修复,直到显式设置 mode。 - 对于 Linux 用户 systemd 单元,doctor token 漂移检查在比较服务 auth 元数据时同时包含
Environment=和EnvironmentFile=来源。 - 当配置最后由较新版本写入时,Doctor 服务修复会拒绝从较旧的 OpenClaw 二进制文件重写、停止或重启 Gateway 网关服务。请参阅 Gateway 故障排查。
- 你始终可以通过
openclaw gateway install --force强制进行完整重写。
16. Gateway 网关运行时 + 端口诊断
16. Gateway 网关运行时 + 端口诊断
18789)上的端口冲突,并报告可能原因(Gateway 网关已在运行、SSH 隧道)。17. Gateway 网关运行时最佳实践
17. Gateway 网关运行时最佳实践
nvm、fnm、volta、asdf 等)上时,Doctor 会发出警告。WhatsApp 和 Telegram 渠道需要 Node,而版本管理器路径在升级后可能会失效,因为服务不会加载你的 shell 初始化配置。Doctor 会在可用时提供迁移到系统 Node 安装的选项(Homebrew/apt/choco)。新安装或修复的 macOS LaunchAgent 使用规范的系统 PATH(/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin),而不是复制交互式 shell PATH,因此 Homebrew 管理的系统二进制文件仍然可用,同时 Volta、asdf、fnm、pnpm 和其他版本管理器目录不会改变 Node 子进程解析的内容。Linux 服务仍会保留显式环境根目录(NVM_DIR、FNM_DIR、VOLTA_HOME、ASDF_DATA_DIR、BUN_INSTALL、PNPM_HOME)和稳定的用户 bin 目录,但推测的版本管理器回退目录只有在这些目录存在于磁盘上时才会写入服务 PATH。18. 配置写入 + 向导元数据
18. 配置写入 + 向导元数据
19. 工作区提示(备份 + 记忆系统)
19. 工作区提示(备份 + 记忆系统)