Diagnostics
Збій Node + tsx
Аварійне завершення Node + tsx з помилкою "__name is not a function"
Стан
Вирішено. Це аварійне завершення не відтворюється з поточною версією tsx, зафіксованою в
package.json (4.22.3), або з поточними випусками Node. Цю сторінку збережено на випадок, якщо
майбутнє оновлення tsx/esbuild знову спричинить проблему.
Початковий симптом
Запуск сценаріїв розробки OpenClaw через tsx завершувався помилкою під час запуску:
[openclaw] Failed to start CLI: TypeError: __name is not a function at createSubsystemLogger (src/logging/subsystem.ts) at <caller> (src/agents/auth-profiles/constants.ts)Номери рядків опущено; обидва файли змінилися після початкового аварійного завершення, тому конкретні рядки більше не збігаються.
Проблема виникла після переходу сценаріїв розробки з Bun на tsx (2871657e,
2026-01-06), щоб зробити Bun необов’язковим. Еквівалентний шлях на основі Bun не спричиняв аварійного завершення.
Спочатку проблему спостерігали з Node v25.3.0 у macOS; вважалося, що вона також
імовірно впливає на інші платформи, де використовується Node 25.
Причина
tsx перетворює TS/ESM за допомогою esbuild із жорстко заданим параметром keepNames: true
у параметрах перетворення. Через цей параметр esbuild обгортає іменовані оголошення функцій і класів
у виклик допоміжної функції __name, щоб значення fn.name зберігалося після мініфікації
та пакування. Аварійне завершення означає, що в місці виклику для цього модуля
в проблемній комбінації tsx/Node допоміжна функція була відсутня або перекрита, тому __name(...)
викидала помилку замість повернення обгорнутого значення.
Поточна перевірка відтворення
node --versionpnpm installnode --import tsx src/entry.ts statusМінімальне ізольоване відтворення (завантажує лише модуль із початкового трасування стека):
node --import tsx scripts/repro/tsx-name-repro.tsНаразі обидві команди завершуються без помилок. Якщо будь-яка з них знову викине помилку __name is not a function, перед надсиланням звіту до upstream-проєкту збережіть точну версію Node, версію tsx
(node_modules/tsx/package.json) і повне трасування стека.
Обхідні шляхи (якщо аварійне завершення повернеться)
-
Запускайте сценарії розробки за допомогою Bun замість
node --import tsx. -
Запустіть
pnpm tsgoдля перевірки типів, а потім запускайте зібраний результат замість вихідного коду черезtsx:bash pnpm tsgonode openclaw.mjs status -
Спробуйте іншу версію
tsx(pnpm add -D tsx@<version>змінює залежності й відповідно до політики репозиторію потребує схвалення), щоб методом поділу діапазону визначити, чи версія esbuild у її складі знову спричинила цю помилку. -
Перевірте з іншою основною або додатковою версією Node, щоб з’ясувати, чи залежить помилка від версії.