Diagnostics
Сбой Node + tsx
Сбой Node + tsx «__name is not a function»
Статус
Устранено. Этот сбой не воспроизводится на текущей версии tsx, зафиксированной в
package.json (4.22.3), или в текущих выпусках Node. Эта информация сохранена на случай, если
будущее обновление tsx/esbuild вновь вызовет проблему.
Исходный симптом
Запуск сценариев разработки OpenClaw через tsx завершался ошибкой при запуске:
[openclaw] Не удалось запустить CLI: TypeError: __name не является функцией в createSubsystemLogger (src/logging/subsystem.ts) в <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, перед отправкой отчёта в вышестоящий проект зафиксируйте точную версию 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, чтобы выяснить, зависит ли сбой от версии.