Node + tsx “__name is not a function” Crash
Zusammenfassung
OpenClaw über Node mit tsx starten schlägt beim Start fehl mit:
[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
Das begann nach dem Wechsel der Dev-Skripte von Bun auf tsx (Commit 2871657e, 2026-01-06). Der gleiche Runtime-Pfad funktionierte mit Bun.
Umgebung
- Node: v25.x (beobachtet auf v25.3.0)
- tsx: 4.21.0
- OS: macOS (Reproduktion wahrscheinlich auch auf anderen Plattformen mit Node 25)
Reproduktion (nur Node)
# im Repo-Root
node --version
pnpm install
node --import tsx src/entry.ts status
Minimale Reproduktion im Repo
node --import tsx scripts/repro/tsx-name-repro.ts
Node-Versions-Check
- Node 25.3.0: schlägt fehl
- Node 22.22.0 (Homebrew
node@22): schlägt fehl - Node 24: hier noch nicht installiert; Verifizierung nötig
Notizen / Hypothese
tsxnutzt esbuild um TS/ESM zu transformieren. esbuildskeepNamesemittiert einen__name-Helper und umschließt Funktionsdefinitionen mit__name(...).- Der Crash deutet darauf hin, dass
__nameexistiert, aber zur Laufzeit keine Funktion ist, was bedeutet, dass der Helper im Node-25-Loader-Pfad für dieses Modul fehlt oder überschrieben wurde. - Ähnliche
__name-Helper-Probleme wurden bei anderen esbuild-Nutzern gemeldet, wenn der Helper fehlt oder umgeschrieben wird.
Regressions-Verlauf
2871657e(2026-01-06): Skripte von Bun auf tsx geändert, um Bun optional zu machen.- Davor (Bun-Pfad) funktionierten
openclaw statusundgateway:watch.
Workarounds
-
Bun für Dev-Skripte verwenden (aktueller temporärer Revert).
-
Node + tsc watch verwenden, dann kompilierte Ausgabe starten:
pnpm exec tsc --watch --preserveWatchOutput node --watch openclaw.mjs status -
Lokal bestätigt:
pnpm exec tsc -p tsconfig.json+node openclaw.mjs statusfunktioniert auf Node 25. -
esbuild keepNames im TS-Loader deaktivieren, falls möglich (verhindert
__name-Helper-Einbindung); tsx bietet das aktuell nicht an. -
Node LTS (22/24) mit
tsxtesten, um zu prüfen, ob das Problem Node-25-spezifisch ist.
Referenzen
- https://opennext.js.org/cloudflare/howtos/keep_names
- https://esbuild.github.io/api/#keep-names
- https://github.com/evanw/esbuild/issues/1031
Nächste Schritte
- Reproduktion auf Node 22/24, um eine Node-25-Regression zu bestätigen.
tsxNightly testen oder auf frühere Version pinnen, falls eine bekannte Regression vorliegt.- Falls auf Node LTS reproduzierbar, minimale Reproduktion upstream melden mit dem
__nameStack-Trace.