Diagnostics
Node + tsx のクラッシュ
Node + tsx の「__name is not a function」クラッシュ
ステータス
解決済みです。このクラッシュは、現在 package.json に固定されている tsx バージョン(4.22.3)でも、現在の Node リリースでも再現しません。今後の tsx/esbuild アップグレードで再発した場合に備えて、ここに残しています。
当初の症状
tsx を介して OpenClaw の開発スクリプトを実行すると、起動時に次のエラーが発生しました。
[openclaw] CLI の起動に失敗しました: TypeError: __name is not a function at createSubsystemLogger (src/logging/subsystem.ts) at <caller> (src/agents/auth-profiles/constants.ts)元のクラッシュ以降、両方のファイルが変更され、該当する行が一致しなくなったため、行番号は省略しています。
これは、Bun をオプションにするため、開発スクリプトが Bun から tsx(2871657e、2026-01-06)に切り替わった後に発生しました。同等の Bun ベースのパスではクラッシュしませんでした。当初は macOS 上の Node v25.3.0 で確認されましたが、Node 25 を実行する他のプラットフォームも影響を受ける可能性が高いと考えられていました。
原因
tsx は、変換オプションに keepNames: true をハードコードし、esbuild を介して TS/ESM を変換します。この設定により、esbuild は名前付き関数やクラスの宣言を __name ヘルパーの呼び出しでラップし、ミニファイやバンドル後も fn.name が維持されるようにします。このクラッシュは、影響を受ける tsx/Node の組み合わせにおいて、そのモジュールの呼び出し箇所でヘルパーが欠落していたか、シャドーイングされていたことを意味します。そのため、__name(...) はラップされた値を返さず、例外をスローしました。
現在の再現確認
node --versionpnpm installnode --import tsx src/entry.ts status最小限の独立した再現手順(元のスタックトレースに含まれるモジュールのみを読み込みます):
node --import tsx scripts/repro/tsx-name-repro.ts現在、どちらのコマンドも正常に終了します。いずれかで __name is not a function が再びスローされた場合は、アップストリームに報告する前に、正確な Node バージョン、tsx バージョン(node_modules/tsx/package.json)、および完全なスタックトレースを記録してください。
回避策(クラッシュが再発した場合)
-
node --import tsxの代わりに Bun で開発スクリプトを実行します。 -
型チェックには
pnpm tsgoを実行し、tsxを介してソースを実行する代わりに、ビルドされた出力を実行します。bash pnpm tsgonode openclaw.mjs status -
別の
tsxバージョンを試し(pnpm add -D tsx@<version>は依存関係の変更であり、リポジトリポリシーに従って承認が必要です)、同梱されている esbuild のバージョンでバグが再発したかどうかを切り分けます。 -
別の Node メジャー/マイナーバージョンでテストし、障害が特定のバージョンに固有かどうかを確認します。