Fallo de Node + tsx
Fallo “__name is not a function” en Node + tsx
Sección titulada «Fallo “__name is not a function” en Node + tsx»Resumen
Sección titulada «Resumen»Ejecutar OpenClaw a través de Node con tsx falla al inicio 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:20Esto 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
Sección titulada «Entorno»- Node: v25.x (observado en v25.3.0)
- tsx: 4.21.0
- SO: macOS (es probable que también se reproduzca en otras plataformas que ejecuten Node 25)
Reproducción (solo Node)
Sección titulada «Reproducción (solo Node)»# in repo rootnode --versionpnpm installnode --import tsx src/entry.ts statusReproducción mínima en el repositorio
Sección titulada «Reproducción mínima en el repositorio»node --import tsx scripts/repro/tsx-name-repro.tsComprobación de versión de Node
Sección titulada «Comprobació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
Sección titulada «Notas / hipótesis»tsxutiliza esbuild para transformar TS/ESM. ElkeepNamesde esbuild emite un helper__namey envuelve las definiciones de funciones con__name(...).- El fallo indica que
__nameexiste pero no es una función en tiempo de ejecución, lo que implica que el helper falta o ha sido sobrescrito para este módulo en la ruta del cargador 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 regresiones
Sección titulada «Historial de regresiones»2871657e(2026-01-06): scripts cambiados de Bun a tsx para hacer que Bun sea opcional.- Antes de eso (ruta con Bun),
openclaw statusygateway:watchfuncionaban.
Soluciones temporales
Sección titulada «Soluciones temporales»-
Usar Bun para los scripts de desarrollo (reversión temporal actual).
-
Usar Node + tsc watch y luego ejecutar el resultado compilado:
Ventana de terminal pnpm exec tsc --watch --preserveWatchOutputnode --watch openclaw.mjs status -
Confirmado localmente:
pnpm exec tsc -p tsconfig.json+node openclaw.mjs statusfunciona en Node 25. -
Deshabilitar esbuild keepNames en el cargador TS si es posible (evita la inserción del helper
__name); tsx actualmente no expone esto. -
Probar Node LTS (22/24) con
tsxpara ver si el problema es específico de Node 25.
Referencias
Sección titulada «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
Sección titulada «Próximos pasos»- Reproducir en Node 22/24 para confirmar la regresión en Node 25.
- Prueba
tsxnightly o fija una versión anterior si existe una regresión conocida. - Si se reproduce en Node LTS, envía un repro mínimo upstream con el stack trace
__name.