Diagnostics
Node + tsx のクラッシュ
Node + tsx の「__name is not a function」クラッシュ
状態
解決済みです。このクラッシュは、package.json で固定されている現在の tsx バージョン(4.22.3)でも、現在の Node リリースでも再現しません。今後の tsx/esbuild のアップグレードで再発した場合に備えて、ここに記録を残しています。
元の症状
tsx を介して OpenClaw の開発スクリプトを実行すると、起動時に次のエラーで失敗しました。
[openclaw] Failed to start 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 メジャー/マイナーバージョンでテストし、障害が特定のバージョンに固有かどうかを確認します。