Node + tsx “__name is not a function” クラッシュ
概要
Node で tsx を使って OpenClaw を実行すると、起動時に以下のエラーで失敗します:
[openclaw] Failed to start CLI: TypeError: __name is not a function
at createSubsystemLogger (.../src/logging/subsystem.ts:203:25)
at .../src/agents/auth-profiles/constants.ts:25:20
この問題は、開発スクリプトを Bun から tsx に切り替えた後に発生しました(コミット 2871657e、2026-01-06)。同じランタイムパスは Bun では動作していました。
環境
- Node: v25.x(v25.3.0 で確認)
- tsx: 4.21.0
- OS: macOS(他のプラットフォームでも Node 25 で再現の可能性あり)
再現手順(Node のみ)
# リポジトリルートで
node --version
pnpm install
node --import tsx src/entry.ts status
リポジトリ内の最小再現
node --import tsx scripts/repro/tsx-name-repro.ts
Node バージョンの確認
- Node 25.3.0: 失敗
- Node 22.22.0(Homebrew
node@22): 失敗 - Node 24: 未インストールのため要検証
補足 / 仮説
tsxは esbuild を使って TS/ESM を変換します。esbuild のkeepNamesは__nameヘルパーを出力し、関数定義を__name(...)でラップします。- クラッシュは
__nameが存在するが実行時に関数ではないことを示しており、Node 25 のローダーパスでこのモジュールのヘルパーが欠落または上書きされていることを意味します。 - 同様の
__nameヘルパーの問題は、ヘルパーが欠落または書き換えられた際に他の esbuild コンシューマーでも報告されています。
リグレッション履歴
2871657e(2026-01-06): スクリプトが Bun から tsx に変更され、Bun をオプションに。- それ以前(Bun パス)では
openclaw statusとgateway:watchは動作。
回避策
-
開発スクリプトに Bun を使用(現在の一時的な revert)。
-
Node + tsc watch を使用し、コンパイルされた出力を実行:
pnpm exec tsc --watch --preserveWatchOutput node --watch openclaw.mjs status -
ローカルで確認済み:
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スタックトレースの最小再現を上流に報告。