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 is not a function در 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) و ردپای کامل پشته را ثبت کنید.
راهکارهای موقت (اگر ازکارافتادگی بازگردد)
-
اسکریپتهای توسعه را بهجای
node --import tsxبا Bun اجرا کنید. -
برای بررسی نوعها،
pnpm tsgoرا اجرا کنید؛ سپس بهجای اجرای کد منبع از طریقtsx، خروجی ساختهشده را اجرا کنید:bash pnpm tsgonode openclaw.mjs status -
نسخهٔ دیگری از
tsxرا امتحان کنید (pnpm add -D tsx@<version>تغییری در وابستگی است و طبق خطمشی مخزن به تأیید نیاز دارد) تا با دونیمسازی مشخص شود آیا نسخهٔ esbuild همراه آن دوباره باگ را ایجاد کرده است. -
روی نسخهٔ اصلی/فرعی دیگری از Node آزمایش کنید تا مشخص شود آیا خرابی مختص نسخه است.