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
این مشکل پس از تغییر اسکریپتهای توسعه از Bun به tsx آغاز شد (کامیت 2871657e، 2026-01-06). همین مسیر زمان اجرا با 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 یک helper به نام__nameتولید میکند و تعریفهای تابع را با__name(...)میپوشاند.- این خرابی نشان میدهد
__nameدر زمان اجرا وجود دارد اما تابع نیست، که یعنی این helper برای این ماژول در مسیر loader مربوط به Node 25 وجود ندارد یا بازنویسی شده است. - مشکلات مشابه مربوط به helper
__nameدر مصرفکنندگان دیگر esbuild، زمانی که helper وجود نداشته یا بازنویسی شده، گزارش شدهاند.
تاریخچه رگرسیون
2871657e(2026-01-06): اسکریپتها از Bun به tsx تغییر کردند تا Bun اختیاری شود.- پیش از آن (مسیر Bun)،
openclaw statusوgateway:watchکار میکردند.
راهکارهای موقت
-
از Bun برای اسکریپتهای توسعه استفاده کنید (بازگردانی موقت فعلی).
-
برای بررسی نوع در مخزن از
tsgoاستفاده کنید، سپس خروجی ساختهشده را اجرا کنید:pnpm tsgo node openclaw.mjs status -
یادداشت تاریخی: هنگام اشکالزدایی این مشکل Node/tsx، در اینجا از
tscاستفاده شده بود، اما مسیرهای بررسی نوع مخزن اکنون ازtsgoاستفاده میکنند. -
در صورت امکان،
keepNamesمربوط به esbuild را در loader مربوط به TS غیرفعال کنید (از درج helper__nameجلوگیری میکند)؛ در حال حاضر tsx این قابلیت را ارائه نمیکند. -
Node LTS (22/24) را با
tsxآزمایش کنید تا مشخص شود آیا مشکل مختص Node 25 است یا نه.
منابع
- https://opennext.js.org/cloudflare/howtos/keep_names
- https://esbuild.github.io/api/#keep-names
- https://github.com/evanw/esbuild/issues/1031
گامهای بعدی
- روی Node 22/24 بازتولید کنید تا رگرسیون Node 25 تأیید شود.
- نسخه nightly از
tsxرا آزمایش کنید یا اگر رگرسیون شناختهشدهای وجود دارد، آن را به نسخه قبلی پین کنید. - اگر روی Node LTS بازتولید شد، یک بازتولید حداقلی با ردپای پشته
__nameدر upstream ثبت کنید.