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 statusgateway: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 固有かどうかを確認。

参考

次のステップ

  • Node 22/24 で再現し、Node 25 のリグレッションであることを確認。
  • tsx のナイトリービルドをテストするか、既知のリグレッションがあれば以前のバージョンにピン留め。
  • Node LTS でも再現する場合は、__name スタックトレースの最小再現を上流に報告。