Crash de Node + tsx “__name is not a function”
Resumen
Ejecutar OpenClaw vía Node con tsx falla al iniciar con:
[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
Esto comenzó después de cambiar los scripts de desarrollo de Bun a tsx (commit 2871657e, 2026-01-06). La misma ruta de ejecución funcionaba con Bun.
Entorno
- Node: v25.x (observado en v25.3.0)
- tsx: 4.21.0
- SO: macOS (probablemente reproducible en otras plataformas que ejecuten Node 25)
Reproducción (solo Node)
# en la raíz del repo
node --version
pnpm install
node --import tsx src/entry.ts status
Reproducción mínima en el repo
node --import tsx scripts/repro/tsx-name-repro.ts
Verificación de versión de Node
- Node 25.3.0: falla
- Node 22.22.0 (Homebrew
node@22): falla - Node 24: aún no instalado aquí; necesita verificación
Notas / hipótesis
tsxusa esbuild para transformar TS/ESM. ElkeepNamesde esbuild emite un helper__namey envuelve las definiciones de funciones con__name(...).- El crash indica que
__nameexiste pero no es una función en tiempo de ejecución, lo que implica que el helper falta o fue sobreescrito para este módulo en la ruta del loader de Node 25. - Se han reportado problemas similares con el helper
__nameen otros consumidores de esbuild cuando el helper falta o es reescrito.
Historial de regresión
2871657e(2026-01-06): los scripts cambiaron de Bun a tsx para hacer Bun opcional.- Antes de eso (ruta Bun),
openclaw statusygateway:watchfuncionaban.
Soluciones alternativas
-
Usar Bun para scripts de desarrollo (reversión temporal actual).
-
Usar Node + tsc watch, luego ejecutar la salida compilada:
pnpm exec tsc --watch --preserveWatchOutput node --watch openclaw.mjs status -
Confirmado localmente:
pnpm exec tsc -p tsconfig.json+node openclaw.mjs statusfunciona en Node 25. -
Deshabilitar keepNames de esbuild en el loader de TS si es posible (previene la inserción del helper
__name); tsx actualmente no expone esta opción. -
Probar Node LTS (22/24) con
tsxpara ver si el problema es específico de Node 25.
Referencias
- https://opennext.js.org/cloudflare/howtos/keep_names
- https://esbuild.github.io/api/#keep-names
- https://github.com/evanw/esbuild/issues/1031
Próximos pasos
- Reproducir en Node 22/24 para confirmar la regresión de Node 25.
- Probar la versión nightly de
tsxo fijar a una versión anterior si existe una regresión conocida. - Si se reproduce en Node LTS, reportar una reproducción mínima upstream con la traza de pila de
__name.