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 مرة أخرى، فالتقط إصدار 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 لمعرفة ما إذا كان الفشل خاصًا بإصدار معين.