Diagnostics

Збій Node + tsx

Збій Node + tsx "__name is not a function"

Підсумок

Запуск OpenClaw через Node з tsx завершується помилкою під час старту:

[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

Це почалося після переходу dev-скриптів з Bun на tsx (коміт 2871657e, 2026-01-06). Той самий runtime-шлях працював із Bun.

Середовище

  • Node: v25.x (спостерігалося на v25.3.0)
  • tsx: 4.21.0
  • ОС: macOS (відтворення також імовірне на інших платформах, де працює Node 25)

Відтворення (лише Node)

# in repo root
node --version
pnpm install
node --import tsx src/entry.ts status

Мінімальне відтворення в репозиторії

node --import tsx scripts/repro/tsx-name-repro.ts

Перевірка версії Node

  • Node 25.3.0: падає
  • Node 22.22.0 (Homebrew node@22): падає
  • Node 24: тут ще не встановлено; потребує перевірки

Нотатки / гіпотеза

  • tsx використовує esbuild для трансформації TS/ESM. keepNames в esbuild створює допоміжну функцію __name і обгортає визначення функцій у __name(...).
  • Збій вказує, що __name існує, але під час виконання не є функцією, що означає, що допоміжна функція відсутня або перезаписана для цього модуля в шляху завантажувача Node 25.
  • Схожі проблеми з допоміжною функцією __name повідомлялися в інших споживачів esbuild, коли допоміжна функція була відсутня або переписувалася.

Історія регресії

  • 2871657e (2026-01-06): скрипти змінено з Bun на tsx, щоб зробити Bun необов'язковим.
  • До цього (шлях Bun) openclaw status і gateway:watch працювали.

Обхідні рішення

  • Використовуйте Bun для dev-скриптів (поточний тимчасовий відкат).

  • Використовуйте tsgo для перевірки типів репозиторію, потім запускайте зібраний вивід:

    pnpm tsgo
    node openclaw.mjs status
    
  • Історична примітка: tsc використовувався тут під час налагодження цієї проблеми Node/tsx, але зараз lanes перевірки типів репозиторію використовують tsgo.

  • Вимкніть esbuild keepNames у TS-завантажувачі, якщо можливо (це запобігає вставленню допоміжної функції __name); наразі tsx цього не надає.

  • Перевірте Node LTS (22/24) з tsx, щоб з'ясувати, чи проблема специфічна для Node 25.

Посилання

Наступні кроки

  • Відтворити на Node 22/24, щоб підтвердити регресію Node 25.
  • Перевірити nightly-версію tsx або закріпити ранішу версію, якщо існує відома регресія.
  • Якщо відтворюється на Node LTS, подати мінімальне відтворення upstream зі стеком __name.

Пов'язане