Bun 兼容性
Bun 是 OpenClaw CLI、Gateway 和托管节点主机中显式选择启用的运行时。Node 仍然是主要且推荐的运行时。本参考涵盖 Bun 的要求和兼容性;有关安装和选择启用步骤,请参见 Bun;有关 Node 要求,请参见 Node.js 兼容性。
要求¶
OpenClaw 需要 Bun 1.4.0+、可用的 node:sqlite API,以及与 Node 相同的 WAL 安全 SQLite 下限。
| 平台 | Bun 使用的 SQLite 库 | 扩展加载 | OpenClaw 的行为 |
|---|---|---|---|
| Linux | 静态链接 SQLite;Bun 1.4.2 中为 3.53.2 | 支持 | 无需额外库配置。 |
| macOS | 默认使用 Apple 系统 SQLite | Apple 库中不可用 | 自动选择合适库;见下文。 |
| Windows | 与 Linux 相同的静态 SQLite 构建 | 支持 | 无需额外库配置。 |
平台默认值来自 Bun 的 SQLite 构建策略;Bun 1.4.2 版本定义 固定 SQLite 3.53.2。
macOS 上的 SQLite 库选择¶
安装 Homebrew SQLite 以支持原生 sqlite-vec KNN 内存查询:
在打开数据库之前,OpenClaw 按以下顺序选择库:
- 内部提供的显式库路径,否则为
OPENCLAW_SQLITE_LIBRARY。 $HOMEBREW_PREFIX/opt/sqlite/lib/libsqlite3.dylib。/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib。/usr/local/opt/sqlite/lib/libsqlite3.dylib。/opt/local/lib/libsqlite3.dylib(MacPorts)。
候选库必须满足 WAL 安全下限并支持扩展加载,然后才会被选择。如果自动发现未找到符合条件的库,Bun 会保留其运行时库;如果该库满足 WAL 下限,普通代理数据库仍可打开。内存 KNN 子进程使用同一已选库。
SQLite 存储工作进程继承主进程已选择的库。打开另一个数据库或重启存储工作进程会复用该选择,而不会重复 Bun 的一次性库初始化。
在启动 OpenClaw 之前,在进程环境中设置 OPENCLAW_SQLITE_LIBRARY 以覆盖发现:
在 macOS 上,openclaw gateway install --runtime bun、openclaw node install --runtime bun 以及基于包装器的安装会将安装 shell 中的 OPENCLAW_SQLITE_LIBRARY 和 HOMEBREW_PREFIX 持久化到托管服务定义中,因此服务会选择相同的库。若要更改已安装服务的这些值,请从具有所需值的 shell 中重新安装:openclaw gateway install --runtime bun --force(对于托管节点主机,使用 openclaw node install --runtime bun --force);对已加载服务进行普通重新安装不会生效。直接 Node 运行时服务从不持久化这些值。
无效的覆盖会失败,并显示:
Cannot use SQLite library <path>: <reason>. Fix or unset OPENCLAW_SQLITE_LIBRARY; install a supported library with brew install sqlite.
Node 和非 macOS 上的 Bun 会忽略此覆盖,并在 Gateway 启动日志中发出警告。当选择某个库时,Gateway 启动日志会记录 SQLite: using <path> (<version>, extension loading enabled)。openclaw doctor 会报告 doctor 进程的选择。
守护进程安装、openclaw gateway start 修复、openclaw doctor 和服务审计会通过相同的选择流程探测候选 Bun 可执行文件,因此它们会判断并报告 Gateway 实际打开的库,而不是 Bun 的运行时 SQLite。无效的覆盖会使这些探测以上述消息失败,而不是建议升级 Bun 或将服务切换到 Node。
如果你之前使用了调用 Database.setCustomSQLite() 的预加载,请移除它,并改为将 OPENCLAW_SQLITE_LIBRARY 设置为相同路径。该钩子是一次性的:保留预加载会导致 SQLite already loaded,即使两个选择指向同一库。OpenClaw 的覆盖还会将该路径转发给 KNN 子进程。
无扩展支持库时的内存搜索¶
当 KNN 子进程无法加载扩展时,内存搜索会回退到批量嵌入扫描。它会保留提供者和来源过滤器以及批次之间的取消检查,但在大型索引上可能更慢。参见 内存配置。
浏览器子进程¶
浏览器插件使用运行 OpenClaw 的 Bun 可执行文件启动其辅助进程,因此浏览器自动化无需单独安装 Node:
- Chrome MCP: 现有会话配置文件 会在 Bun 上启动打包的 Chrome DevTools MCP 服务器,用于
--autoConnect、browserUrl和wsEndpoint连接。操作、快照、屏幕截图、坐标点击、跨站点导航期间的等待以及服务器进程树的清理行为与 Node 上相同。自定义mcpCommand按配置运行。 - Chrome 扩展: 在 macOS 和 Linux 上,原生消息主机及其启动的中继守护进程使用运行
openclaw browser extension install的运行时。
仅 Bun 安装¶
将 Gateway 服务固定到你的 Bun 可执行文件,以便更新和 Doctor 保留它。如果没有 Node,openclaw 启动器无法启动,因此使用 Bun 运行包入口点:
更新、修复和 Doctor 维护子进程使用正在运行的 Bun 可执行文件。
Bun 包管理器探测和安装使用显式可执行文件:更新其根目录时使用已验证的服务 Bun,否则当更新器在 Bun 下运行时使用 process.execPath,最后回退到 PATH 中的裸 bun。即使 PATH 中没有 Bun 或包含不同构建,这也会保留所选的 Bun。
当受所有权的受管 Bun Gateway 从与 CLI 不同的包根提供服务时,
openclaw update 会就地升级 Gateway 安装,并保持调用该命令的 CLI 安装不变。更新器会验证该服务实际使用的 Bun 是否满足 Bun 1.4+ 以及 WAL 安全的 node:sqlite,而不会将其模拟的 Node 版本与 engines.node 进行比较。如果更新器运行在 Node 上,则该 Node 也必须满足目标包的 Node 和 SQLite 要求,因为最终化会使用它。
现有的服务安装/重启路径会保留已记录的 Bun 固定版本。Node 拆分根路由保持不变,仅位于
~/.openclaw 下的路径本身不会建立 Bun 全局安装所有权。
从另一个安装运行 Doctor 或 openclaw update repair 时,该 Bun
Gateway 会保持在其自身根目录下。显式修复会报告安装漂移,并在停止服务前拒绝维护。请使用
<bun> <service-root>/openclaw.mjs update repair 或
<bun> <service-root>/openclaw.mjs doctor --fix 从服务自身的安装进行修复。
在没有持久 Node 的情况下,首次安装和更新器暂存要求将 OPENCLAW_PACKAGE_BUN_LAUNCHER 设置为启动 CLI 的绝对 Bun 可执行文件路径。更新器在 Bun 下运行时会自动设置它;应用必须在首次执行 bun add -g --trust openclaw@<version> 时设置它。Preinstall 会验证该启动器为 Bun 1.4+。如果没有该标记,preinstall 仍要求存在持久 Node;即使设置了标记,在 PATH 上找到的 Node 也必须满足包的 Node 要求。
截至 2026.9.6 的已发布更新器无法更新仅 Bun 安装。它们不会设置该标记,因此新包的 preinstall 会停止暂存(global-install-failed)。如果调用方设置了该标记,其自身的裸 node 探测会改为启动失败(update-executor-settlement-failed)。两种拒绝都发生在 Gateway 停止之前,Gateway 会继续运行。必须由修复版本来驱动更新;安装修复候选版本无法更改已经运行的更新器。
已安装的更新器会先运行。在 Linux 拆分根测试夹具中,已发布的
2026.9.6 会因 ENOENT 提前拒绝,当 PATH 中不存在 Bun 时,Gateway
和两个安装均保持不变。当 PATH 中存在 fork Bun 时,同一个已发布驱动会就地更新 Gateway 安装并使其健康重启,同时保持调用该命令的 CLI 不变。上述路由和显式
Bun 选择从包含修复的第一个更新器开始生效;更新的候选版本无法更改已安装更新器的首跳行为。
npm 来源的插件在 Bun 下使用 OpenClaw 捆绑的 npm 11.20.0 CLI,不需要单独安装 Node 或 npm。
已知限制¶
- 桌面 WebSocket: OpenClaw 使用已安装的
ws传输用于桌面观察器和配对节点桌面/门户流。Bun 1.4.2 内置的ws服务器适配器缺少 pause/resume 和 Duplex 流桥接;已安装的传输会在桌面断开时保留背压、负载限制和清理。 - 生命周期脚本: 除非使用
bun pm trust显式信任,否则 Bun 会阻止依赖项生命周期脚本。 - 包脚本: 某些脚本硬编码了 pnpm,因此
bun run内部仍会调用 pnpm。 - PTY 终端: macOS 和 Linux 仅在提供
Bun.Terminal.pause()和Bun.Terminal.resume()的构建中,才使用 Bun 的原生 PTY 而不需要 Node 运行时,例如同时包含 macOS 子进程退出修复 的 OpenClaw Bun fork 构建。其他 Bun 版本使用 Node 辅助程序,并且终端 I/O 需要已安装的 Node 运行时。OpenClaw 在选择该运行时时会跳过 Bun 的node垫片,包括在bun --bun下。Windows 保留node-pty。 - Windows 浏览器扩展: 原生消息注册仅接受
node.exe作为宿主解释器。在 Windows 上请使用 Node 运行openclaw browser extension install。 - 启动的桌面应用: Node 在启动时将继承的描述符标记为 close-on-exec,而 Bun 1.4.2 不会,因此由 Gateway 计算机控制启动的应用会继承辅助程序的标准流。随后,Gateway 的 30 秒清理超时会在其执行关闭时停止该应用。OpenClaw 的 Bun fork 在 openclaw/bun#12 中采用了 Node 的行为。
- SQLite 句柄: Bun 1.4.2 在
DatabaseSync.close()或Symbol.dispose()之后可能保留语句句柄和 WAL/共享内存文件;OpenClaw 无法通过 Bun 公开的node:sqliteAPI 最终化它们。参见 上游关闭修复;当提示文件释放很重要时,请使用 Node。 - 共享状态读取: 成功的读取会复用其 worker 和原生 reader。在 Bun 上,关闭或替换 reader 仍会等待 worker 退出,包括宿主请求的清理。空闲 reader 会在 30 分钟后随其 worker 一起退役;转录发现仍会在释放捕获的数据库别名之前退役其 worker。
- SQLite 存储 worker: Bun 为每个不同数据库使用一个 worker,并可在宿主的 64 个客户端上限内使用多达 64 个专用 worker。同一数据库的客户端共享其 worker。关闭最后一个客户端时会等待 worker 退出以释放原生句柄;容量耗尽会拒绝新工作,而不会中断现有存储。Node 在四个共享 worker 之间复用数据库。在上游关闭修复发布,并且反复的关闭/重新打开测试证明原生句柄和锁已释放后,可以重新评估 Bun 的专用布局。
- Windows 上的无头 node 更新: 运行在 Bun 上的 node 宿主仍会使用 npm 准备更新,因为 Bun 的 Windows 二进制启动器无法暂存。Windows 仅 Bun 宿主会在每次每小时检查时记录该失败,并继续运行当前版本。
- 工作区安装:
bun install无法解析此仓库的 pnpm 工作区布局。请使用pnpm install。
有关工作流和生命周期信任命令,请参阅 Bun。
版本历史¶
| 版本 | 变更 |
| 版本 | 变更 |
|---|---|
| ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 未发布(main) | macOS 和 Linux 上的无头节点更新会在进程内获取并验证注册表存档,并使用 Bun 准备私有运行时,无需 Node 或 npm。Windows 准备仍需要 npm。#160575 |
| 未发布(main) | 就地更新自有 split-root Bun Gateway 安装,保留其运行时固定版本,并使用显式 Bun 可执行文件进行包管理器探测和安装。 |
| 未发布(main) | 保留 Bun 维护子进程和服务运行时选择,并新增 OPENCLAW_PACKAGE_BUN_LAUNCHER,用于仅 Bun 安装的预安装验证和更新器暂存。 |
| 未发布(main) | 无头节点更新检查在 Bun 下进程内读取 npm 注册表,而不是运行 npm view。#160154 |
| 未发布(main) | 在 Bun 下运行捆绑的 npm 11.20.0 CLI,用于来自 npm 的插件安装、更新和移除,无需单独安装 Node 或 npm。 |
| 未发布(main) | 隐式 Gateway 和受管节点主机重装、更新刷新以及 Doctor 的未加载服务重装会保留受支持的已记录 Bun 可执行文件,而不创建运行时固定版本。 |
| 未发布(main) | Tool Search 代码模式(tool_search_code)已退役;结构化 Tool Search 在 Bun 下无需 Node。 |
| 未发布(main) | 使用当前运行时启动打包的 Chrome DevTools MCP 服务器,因此现有会话的浏览器配置文件在 Bun 下不再需要安装 Node。 |
| 未发布(main) | Gateway 计算机控制在其自身运行时上运行其主机工作进程,因此 Bun Gateway 可以在未安装 Node 的情况下控制其受管桌面。 |
| 未发布(main) | 在 macOS/Linux 上使用无需 Node 的原生 PTY,并配合 Terminal.pause()/resume()(OpenClaw 分叉,包含 macOS 退出修复);其他 Bun 构建保留 Node 辅助程序。Windows 保留 node-pty。 |
| 未发布(main) | 将 Bun SQLite 存储从四个数据库扩展到最多 64 个专用工作进程,同时保持在现有 64 个客户端上限内,并保留工作进程退出清理。 |
| 未发布(main) | macOS 上的受管 Bun 服务会持久化安装 shell 中的 OPENCLAW_SQLITE_LIBRARY 和 HOMEBREW_PREFIX。 |
| 未发布(main) | 守护进程安装、修复、doctor 和服务审计通过 Gateway 启动时相同的 SQLite 库选择来探测 Bun 可执行文件,并使用最小探测环境。#142186 |
| 未发布(main) | 自动选择 WAL 安全且支持扩展的 macOS SQLite 库,并将其传播到内存 KNN 子进程。新增 OPENCLAW_SQLITE_LIBRARY。#141854 |
| 未发布(main) | 记录 Bun 1.4.2 在关闭或释放后保留原生语句和 WAL/共享内存文件,并在提示文件释放重要时建议使用 Node。#141846 |
| 未发布(main) | 当 KNN 子进程无法加载扩展时,添加批量嵌入扫描回退,保留提供程序/来源过滤器以及批次之间的取消。#141104 |
| 未发布(main) | 允许在不加载扩展的 SQLite 构建上使用普通代理数据库。原生向量搜索仍需要支持扩展的库。#139487 |
| v2026.8.2 | 修复 Bun 1.4 已认证 Gateway WebSocket 与已安装 npm 接收器的兼容性,保留负载限制和请求调度。#134282 |
| v2026.8.1 | 恢复 CLI、Gateway 和受管节点主机的显式受管服务选择,要求 Bun 1.4.0+、node:sqlite 以及 WAL 安全的 SQLite。#129593 |
| v2026.7.2-beta.5;稳定版 v2026.8.1 | 恢复为提供 node:sqlite 的构建提供实验性 CLI/Gateway 支持,文档记录为 1.4.0 canary 及更高版本;此阶段守卫使用 API 探测,没有数值型 Bun 最低版本。#114256 |
| v2026.7.2-beta.5;稳定版 v2026.8.1 | 记录 bun install 在 pnpm 工作区布局上失败,并将依赖说明更改为 pnpm install;Bun 仍作为脚本运行器。#114256 |
| v2026.7.1;main v2026.7.2-beta.1 | 由于 node:sqlite 不可用,拒绝使用 Bun CLI/Gateway,使受管运行时选择仅限 Node,并将旧版 Bun 服务引导至 Node。包脚本使用仍然可用。#106065 |
| v2026.1.12 | 将 Bun Gateway 使用标记为实验性且不建议,因为存在 WhatsApp/Telegram 缺陷;建议生产环境使用 Node。 |
| 版本 | 变更 |
|---|---|
| v2026.1.9 | 从交互式 daemon-runtime 选择器中移除 Bun,同时显式验证器仍接受 Bun。 |
| v2026.1.8 | 将 Bun 记录为本地构建/测试的可选包脚本运行器,并可在当时进行可选依赖安装。pnpm 仍为主要方式。 |
| v2026.1.8 | 记录了被忽略的 pnpm 锁文件、历史 postinstall 补丁桥接、生命周期信任以及内部调用 pnpm 的脚本。补丁桥接不是当前的安装建议。 |
| v2026.1.8 | 在 WhatsApp 被禁用时引入可选的 --daemon-runtime bun,因为 Baileys WebSocket 重连路径在 Bun 下可能会损坏内存。Node 仍然是默认值和推荐值。 |
相关¶
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw