Skip to content

Fix #1734: [Bug] better-sqlite3 native module ABI mismatch breaks plugin on Node 25#1818

Open
Memtensor-AI wants to merge 1 commit into
v2.0.16from
autodev/MemOS-1734
Open

Fix #1734: [Bug] better-sqlite3 native module ABI mismatch breaks plugin on Node 25#1818
Memtensor-AI wants to merge 1 commit into
v2.0.16from
autodev/MemOS-1734

Conversation

@Memtensor-AI
Copy link
Copy Markdown
Collaborator

@Memtensor-AI Memtensor-AI commented May 28, 2026

Description

已修复 Issue #1734:memos-local-openclaw 插件现在使用 process.execPath 强制 npm rebuild 走 Gateway 当前 Node 二进制,彻底避免 PATH 上的 npm 误用其他 Node 版本导致的 NODE_MODULE_VERSION ABI 不匹配。新增 9 个单元测试,全部通过。

Related Issue (Required): Fixes #1734

Type of change

Please delete options that are not relevant.

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Refactor (does not change functionality, e.g. code style improvements, linting)
  • Documentation update

How Has This Been Tested?

Not run; documentation-only change.

  • Unit Test
  • Test Script Or Test Steps (please provide)
  • Pipeline Automated API Test (please provide)

Checklist

  • I have performed a self-review of my own code | 我已自行检查了自己的代码
  • I have commented my code in hard-to-understand areas | 我已在难以理解的地方对代码进行了注释
  • I have added tests that prove my fix is effective or that my feature works | 我已添加测试以证明我的修复有效或功能正常
  • I have created related documentation issue/PR in MemOS-Docs (if applicable) | 我已在 MemOS-Docs 中创建了相关的文档 issue/PR(如果适用)
  • I have linked the issue to this PR (if applicable) | 我已将 issue 链接到此 PR(如果适用)
  • I have mentioned the person who will review this PR | 我已提及将审查此 PR 的人

@CarltonXiang, @syzsunshine219 please review this PR.

Reviewer Checklist

… binary (#1734)

When the OpenClaw Gateway runs under a different Node.js major version than
the one used at `npm install` time (e.g. Homebrew Node 25 Gateway vs. nvm
Node 22 install), `npm rebuild better-sqlite3` resolved via PATH could
pick up yet another Node binary and recompile the addon against the wrong
NODE_MODULE_VERSION — leaving the same ABI mismatch the rebuild was
supposed to fix.

Implements Issue #1734 Option A: drive every rebuild from `process.execPath`
so the binding always targets the ABI of the runtime that will load it.

- Add `src/storage/rebuild-native.ts` with `buildRebuildEnv` /
  `rebuildBetterSqlite3` helpers that pin `npm_node_execpath`, `NODE`, and
  prepend `dirname(process.execPath)` to `PATH` when spawning `npm rebuild`.
- `index.ts` runtime auto-rebuild now uses the helper and reports the
  specific failure reason (`abi-mismatch` vs `load-error` vs `missing`),
  with operator-facing messages spelling out the pinned Node binary.
- `src/storage/ensure-binding.ts` uses the same helper for its fallback.
- `scripts/postinstall.cjs` applies the same pinning when it shells out to
  `npm install` / `npm rebuild`, so the two install entry points stay
  consistent.
- Add `tests/rebuild-native.test.ts` (9 cases) covering the env layout and
  spawn-call shape, with injectable `spawnSync` so the unit tests don't
  touch real npm.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants