Diagnostics
Awaria Node + tsx
Awaria Node + tsx „__name is not a function”
Podsumowanie
Uruchamianie OpenClaw przez Node z tsx kończy się niepowodzeniem podczas startu:
[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
Problem pojawił się po przełączeniu skryptów deweloperskich z Bun na tsx (commit 2871657e, 2026-01-06). Ta sama ścieżka uruchomieniowa działała z Bun.
Środowisko
- Node: v25.x (zaobserwowano na v25.3.0)
- tsx: 4.21.0
- System operacyjny: macOS (reprodukcja prawdopodobnie także na innych platformach uruchamiających Node 25)
Reprodukcja (tylko Node)
# in repo root
node --version
pnpm install
node --import tsx src/entry.ts status
Minimalna reprodukcja w repozytorium
node --import tsx scripts/repro/tsx-name-repro.ts
Sprawdzenie wersji Node
- Node 25.3.0: kończy się niepowodzeniem
- Node 22.22.0 (Homebrew
node@22): kończy się niepowodzeniem - Node 24: jeszcze nie zainstalowano tutaj; wymaga weryfikacji
Notatki / hipoteza
tsxużywa esbuild do transformacji TS/ESM.keepNamesw esbuild emituje helper__namei opakowuje definicje funkcji przez__name(...).- Awaria wskazuje, że
__nameistnieje, ale w czasie działania nie jest funkcją, co sugeruje, że helpera brakuje albo został nadpisany dla tego modułu w ścieżce loadera Node 25. - Podobne problemy z helperem
__namezgłaszano w innych narzędziach używających esbuild, gdy helpera brakowało albo był przepisywany.
Historia regresji
2871657e(2026-01-06): skrypty zmieniono z Bun na tsx, aby Bun był opcjonalny.- Wcześniej (ścieżka Bun)
openclaw statusigateway:watchdziałały.
Obejścia
-
Użyj Bun dla skryptów deweloperskich (obecne tymczasowe wycofanie).
-
Użyj
tsgodo sprawdzania typów w repozytorium, a następnie uruchom zbudowany wynik:pnpm tsgo node openclaw.mjs status -
Uwaga historyczna: podczas debugowania tego problemu Node/tsx używano tutaj
tsc, ale ścieżki sprawdzania typów w repozytorium używają teraztsgo. -
Wyłącz esbuild keepNames w loaderze TS, jeśli to możliwe (zapobiega wstawianiu helpera
__name); tsx obecnie tego nie udostępnia. -
Przetestuj Node LTS (22/24) z
tsx, aby sprawdzić, czy problem jest specyficzny dla Node 25.
Odnośniki
- https://opennext.js.org/cloudflare/howtos/keep_names
- https://esbuild.github.io/api/#keep-names
- https://github.com/evanw/esbuild/issues/1031
Następne kroki
- Odtwórz na Node 22/24, aby potwierdzić regresję w Node 25.
- Przetestuj nightly
tsxalbo przypnij wcześniejszą wersję, jeśli istnieje znana regresja. - Jeśli problem odtwarza się na Node LTS, zgłoś upstream minimalną reprodukcję ze śladem stosu
__name.