概要
Node 上でtsx を使用して OpenClaw を実行しようとすると、起動時に以下の TypeError で失敗する場合があります:
tsx へ切り替えた後(コミット 2871657e, 2026-01-06)に発生し始めました。Bun を使用した実行パスでは問題なく動作していました。
環境
- Node: v25.x (v25.3.0 で確認)
- tsx: 4.21.0
- OS: macOS (Node 25 が動作する他のプラットフォームでも再現する可能性があります)
再現手順 (Node のみ)
リポジトリ内の最小再現コード
Node バージョンごとの状況
- Node 25.3.0: 失敗
- Node 22.22.0 (Homebrew
node@22): 失敗 - Node 24: 未検証
原因の仮説
tsxは TypeScript/ESM の変換に esbuild を使用しています。esbuild のkeepNamesオプションは__nameヘルパーを生成し、関数定義を__name(...)でラップします。- クラッシュの内容は、実行時に
__nameは存在するものの関数ではないことを示しています。これは、Node 25 のローダーパスにおいて、このモジュールのヘルパーが欠落しているか、あるいは上書きされている可能性を示唆しています。 - 他の esbuild 利用者からも、同様の
__nameヘルパーに関する問題が報告されています。
回帰の経緯
2871657e(2026-01-06): Bun を必須条件から外すため、スクリプトを Bun から tsx へ変更。- それ以前 (Bun パス) では、
openclaw statusやgateway:watchは正常に動作していました。
回避策
- 開発スクリプトには Bun を使用する(現在の一時的な暫定処置)。
-
Node + tsc watch を使用し、コンパイル後の出力を実行する:
-
ローカル環境で
pnpm exec tsc -p tsconfig.json+node openclaw.mjs statusが Node 25 上で動作することを確認済みです。 -
可能であれば TS ローダーで esbuild の keepNames を無効化する(
__nameヘルパーの挿入を防ぐ)。ただし、現在 tsx はこの設定を公開していません。 -
Node LTS (22/24) と
tsxの組み合わせで、この問題が Node 25 固有のものかどうかをテストする。
参考資料
次のステップ
- Node 22/24 で再現を試み、Node 25 での回帰(デグレード)かどうかを特定する。
tsxのナイトリービルドを試すか、既知の不具合がある場合は以前のバージョンに固定する。- Node LTS でも再現する場合は、
__nameのスタックトレースを添えてアップストリームに最小再現例を報告する。