Node + tsx の「__name is not a function」クラッシュ
概要
tsx を使って Node 経由で OpenClaw を実行すると、起動時に次のように失敗します。
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は TS/ESM の変換に esbuild を使用します。esbuild のkeepNamesは__nameヘルパーを出力し、関数定義を__name(...)でラップします。- このクラッシュは、実行時に
__nameは存在するが関数ではないことを示しており、Node 25 のローダーパスにおいて、このモジュールのヘルパーが欠落しているか上書きされていることを示唆します。 - 同様の
__nameヘルパーの問題は、ヘルパーが欠落しているか書き換えられている場合に、他の esbuild 利用側でも報告されています。
リグレッション履歴
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 固有かどうかを確認する
参照
- https://opennext.js.org/cloudflare/howtos/keep_names
- https://esbuild.github.io/api/#keep-names
- https://github.com/evanw/esbuild/issues/1031
次のステップ
- Node 22/24 で再現し、Node 25 のリグレッションかどうかを確認する
tsxのナイトリー版を試すか、既知のリグレッションがあるなら以前のバージョンに固定する- Node LTS でも再現する場合は、
__nameのスタックトレースを含む最小再現を upstream に報告する