openclaw源码解读(4)——server.impl.ts 真正的启动引擎 第二阶段:插件 & 运行时配置

0 阅读4分钟

 L842 开始是"配置回写的兼容保留路径",然后进入第二阶段。

L8 24 -8 35 applyReloadableGatewayAuthRefs

​编辑

作用:这是 auth 覆盖的第二层。之前第一阶段有 resolvedStartupAuthOverride(普通值覆盖),这个是专门处理那些走 SecretRef 路径的 token/password——它们的真实值在 secrets 解密后才拿到,所以需要单独一层覆盖函数。

和第一阶段的 applyFixedGatewayOverlays(L786-823) 的关系:applyFixedGatewayOverlays 覆盖非 secret 的 auth + tailscale + control UI;applyReloadableGatewayAuthRefs 专门覆盖 secret ref 类型的 token/password。两个函数共同构成完整的 auth 覆盖链。

L8 36 -8 76 prepareReloadCandidate — 热重载候选准备

​编辑

这不是启动时执行的,它是一个闭包工具函数,留给后面配置热重载时用。核心逻辑:

  1. 环境变量不变性检查:assertGatewayConfigEnvSelectionUnchanged ——确保新旧配置引用的环境变量集一致
  2. 准备运行时环境:prepareConfigRuntimeEnv ——根据配置变更计算新的环境变量
  3. 插件重载候选:resolveGatewayReloadPluginActivationCandidate ——判断哪些插件需要重新激活
  4. 覆盖函数链:reapplyRuntimeOverlays = applyFixedGatewayOverlays ∘ applyReloadableGatewayAuthRefs ∘ reapplyCompareOverlays

设计要点:启动时把所有覆盖逻辑封装成纯函数,热重载时直接调用这些函数而不需要重新解析命令行参数。

L879-885 配置回写兼容

​编辑

作用:如果启动过程中修改了配置文件(比如自动生成了 token 持久化到了 openclaw.json),重新读取一次文件快照作为"启动后的最终状态"。这是兼容旧行为的保留路径——注释写了 keep the old startup-write suppression path intact。

L886-894 运行时快照 + 环境变量初始化

​编辑

两个动作:

  • setAppliedRuntimeConfigSnapshot:把启动阶段的配置快照注册为"已应用的运行时配置",后续 getRuntimeConfig() 就能读到了
  • initializePublishedConfigRuntimeEnv:把配置文件里声明的环境变量写入 process.env,但保留用户已有的环境变量(preserveExistingOwnership: true)——不覆盖用户手动设置的

L895-900 Worker 环境启动

​编辑

作用:从持久化存储中加载 Worker 环境的状态(哪些 Worker 之前注册过、placement 记录等)。如果是最小测试模式则跳过。

Worker 环境是 OpenClaw 的分布式执行概念——可以在远程 Node 上运行 Agent,这里只是从存储中恢复之前的注册信息。

L901-914插件引导

这是第二阶段的重头戏:

​编辑

关键参数解读

参数含义
cfgAtStart经过 auth + tailscale + secret 全部覆盖后的最终配置
activationSourceConfig原始配置文件的 source(用于判断插件激活变化)
startupRuntimeConfig含命令行 --profile / --dev 覆盖后的配置
pluginMetadataSnapshot插件发现阶段的元数据(哪些插件可用、版本、manifest)
loadRuntimePlugins: false不在 bootstrap 阶段加载完整运行时插件(延迟到后面)
loadSetupRuntimePlugins: true但 setup 阶段的插件现在就加载(保证基础能力就绪)

这个函数做的事(在 server-startup-plugins.ts 里):

  1. 构建 插件查找表(pluginLookUpTable)——把所有可用插件索引起来
  2. 分类:启动插件 vs 延迟通道插件
  3. 提取基础 gateway 方法(核心 RPC)
  4. 生成 gatewayPluginConfigAtStart——融合了插件激活后的最终配置

L9 15 -9 23 拆包 + 插桩打点

​编辑

然后注册插件元数据快照 + 打性能指标:

​编辑

这里传了 三个 compatible configs:运行时覆盖版、启动版、插件激活版——任一匹配都不需要重新发现插件。

L9 60 -9 92 Worker 环境服务 + Placement 运行时​编辑

​编辑

分两步:

  1. Worker Environment Runtime:管理远程 worker 的生命周期
  2. Placement Runtime:决定 Agent run 分配到哪个 worker 上执行

两个都是有条件启动的——取决于是否有配置的 worker profiles。

L9 98 -101 9 通道日志 + 方法注册

​编辑

为每个通道插件创建独立的子 logger(如 discord、telegram、wecom 各一个),日志输出时带通道前缀。

​编辑

动态过滤可用方法:如果 worker dispatch 不可用,就从方法列表中移除 sessions.dispatch;reclaim 同理。实现了"功能按能力开关"的机制。

L10 20 -10 47 运行时配置合并 resolveGatewayRuntimeConfig

​编辑

​编辑

作用:把配置文件 + 命令行覆盖 + 启动阶段的各种中间结果,合并成一份最终的运行时配置对象。返回的字段包括: