- الرئيسية
- Documentation
- الإضافات
- تحميل الامتدادات (وحدات TypeScript/JavaScript)
تحميل الامتدادات (وحدات TypeScript/JavaScript)
تتناول هذه الوثيقة كيفية اكتشاف وكيل البرمجة وتحميل وحدات الامتدادات (.ts/.js) عند بدء التشغيل.
لا تتناول امتدادات بيان gemini-extension.json (موثقة بشكل منفصل).
ما الذي يقوم به هذا النظام الفرعي
Section titled “ما الذي يقوم به هذا النظام الفرعي”يقوم تحميل الامتدادات ببناء قائمة بملفات إدخال الوحدات، واستيراد كل وحدة باستخدام Bun، وتنفيذ المصنع الخاص بها، ويُعيد:
- تعريفات الامتدادات المحملة
- أخطاء التحميل لكل مسار (دون إيقاف عملية التحميل بأكملها)
- كائن وقت تشغيل الامتداد المشترك الذي يستخدمه لاحقًا
ExtensionRunner
ملفات التنفيذ الأساسية
Section titled “ملفات التنفيذ الأساسية”src/extensibility/extensions/loader.ts— اكتشاف المسار + الاستيراد/التنفيذsrc/extensibility/extensions/index.ts— الصادرات العامةsrc/extensibility/extensions/runner.ts— تنفيذ وقت التشغيل/الأحداث بعد التحميلsrc/discovery/builtin.ts— موفر الاكتشاف التلقائي الأصلي لوحدات الامتداداتsrc/config/settings.ts— تحميل إعداداتextensions/disabledExtensionsالمدمجة
مدخلات تحميل الامتدادات
Section titled “مدخلات تحميل الامتدادات”1) وحدات الامتدادات الأصلية المكتشفة تلقائيًا
Section titled “1) وحدات الامتدادات الأصلية المكتشفة تلقائيًا”تبدأ discoverAndLoadExtensions() بطلب العناصر ذات قدرة extension-module من موفري الاكتشاف، ثم تحتفظ بعناصر موفر native فقط.
المواقع الأصلية الفعلية:
- المشروع:
<cwd>/.xcsh/extensions - المستخدم:
~/.xcsh/agent/extensions
تأتي جذور المسارات من الموفر الأصلي (SOURCE_PATHS.native).
ملاحظات:
- يعتمد الاكتشاف التلقائي الأصلي حاليًا على
.xcsh. - لا يزال يُقبل
.piالقديم في مفاتيح بيانpackage.json(pi.extensions)، لكنه لا يُستخدم كجذر أصلي هنا.
2) المسارات المهيأة صراحةً
Section titled “2) المسارات المهيأة صراحةً”بعد الاكتشاف التلقائي، تُضاف المسارات المهيأة ويتم حلها.
مصادر المسارات المهيأة في مسار بدء تشغيل الجلسة الرئيسي (sdk.ts):
- المسارات المقدمة عبر CLI (
--extension/-e، كما يُعامَل--hookأيضًا كمسار امتداد) - مصفوفة
extensionsفي الإعدادات (الإعدادات العامة والمشروع المدمجة)
ملف الإعدادات العامة:
~/.xcsh/agent/config.yml(أو دليل وكيل مخصص عبرPI_CODING_AGENT_DIR)
ملف إعدادات المشروع:
<cwd>/.xcsh/settings.json
أمثلة:
extensions: - ~/my-exts/safety.ts - ./local/ext-pack{ "extensions": ["./.xcsh/extensions/my-extra"]}عناصر التحكم في التفعيل/التعطيل
Section titled “عناصر التحكم في التفعيل/التعطيل”تعطيل الاكتشاف
Section titled “تعطيل الاكتشاف”- CLI:
--no-extensions - خيار SDK:
disableExtensionDiscovery
تقسيم السلوك:
- SDK: عند تعيين
disableExtensionDiscovery=true، لا يزال يحمّلadditionalExtensionPathsعبرloadExtensions(). - بناء مسار CLI (
main.ts) يمسح مسارات امتداد CLI حاليًا عند تعيين--no-extensions، لذا لا يتم إعادة توجيه-e/--hookالصريح في هذا الوضع.
تعطيل وحدات امتداد محددة
Section titled “تعطيل وحدات امتداد محددة”يُصفي إعداد disabledExtensions بناءً على تنسيق معرّف الامتداد:
extension-module:<derivedName>
يعتمد derivedName على مسار الإدخال (getExtensionNameFromPath)، على سبيل المثال:
/x/foo.ts->foo/x/bar/index.ts->bar
مثال:
disabledExtensions: - extension-module:fooدقة المسار والإدخال
Section titled “دقة المسار والإدخال”تطبيع المسار
Section titled “تطبيع المسار”بالنسبة للمسارات المهيأة:
- تطبيع المسافات Unicode
- توسيع
~ - إذا كان نسبيًا، يُحل بالنسبة إلى
cwdالحالي
إذا كان المسار المهيأ ملفًا
Section titled “إذا كان المسار المهيأ ملفًا”يُستخدم مباشرةً كمرشح لإدخال الوحدة.
إذا كان المسار المهيأ دليلًا
Section titled “إذا كان المسار المهيأ دليلًا”ترتيب الدقة:
package.jsonفي ذلك الدليل معxcsh.extensions(أوpi.extensionsالقديم) -> استخدام الإدخالات المُعلنةindex.tsindex.js- وإلا فحص مستوى واحد بحثًا عن إدخالات الامتداد:
*.ts/*.jsالمباشرةindex.ts/index.jsفي دليل فرعيpackage.jsonفي دليل فرعي معxcsh.extensions/pi.extensions
القواعد والقيود:
- لا يوجد اكتشاف متكرر يتجاوز مستوى دليل فرعي واحد
- تُحل إدخالات بيان
extensionsالمُعلنة بالنسبة لدليل الحزمة ذلك - تُدرج الإدخالات المُعلنة فقط إذا كان الملف موجودًا/الوصول مسموحًا به
- في أزواج
*/index.{ts,js}، يُفضَّل TypeScript على JavaScript - تُعامَل الروابط الرمزية كملفات/أدلة مؤهلة
يختلف سلوك التجاهل حسب المصدر
Section titled “يختلف سلوك التجاهل حسب المصدر”- يستخدم الاكتشاف التلقائي الأصلي (
discoverExtensionModulePathsفي مساعدات الاكتشاف) glob أصلي معgitignore: trueوhidden: false. - لا يطبّق فحص الدليل المهيأ الصريح في
loader.tsقواعدreaddirولا يُطبق تصفية gitignore.
ترتيب التحميل والأسبقية
Section titled “ترتيب التحميل والأسبقية”تبني discoverAndLoadExtensions() قائمة واحدة مرتبة ثم تستدعي loadExtensions().
الترتيب:
- الوحدات المكتشفة تلقائيًا الأصلية
- المسارات المهيأة الصريحة (بالترتيب المقدم)
في sdk.ts، الترتيب المهيأ هو:
- المسارات الإضافية لـ CLI
- إعدادات
extensions
إلغاء التكرار:
- يعتمد على المسار المطلق
- أول مسار مرئي يفوز
- تُتجاهل التكرارات اللاحقة
الاستنتاج: إذا كان نفس مسار الوحدة مكتشفًا تلقائيًا ومهيأًا صراحةً، فيتم تحميله مرة واحدة في الموضع الأول (مرحلة الاكتشاف التلقائي).
استيراد الوحدة وعقد المصنع
Section titled “استيراد الوحدة وعقد المصنع”يتم تحميل كل مسار مرشح باستخدام الاستيراد الديناميكي:
await import(resolvedPath)- المصنع هو
module.default ?? module - يجب أن يكون المصنع دالة (
ExtensionFactory)
إذا لم يكن التصدير دالة، يفشل ذلك المسار بخطأ منظم وتستمر عملية التحميل.
معالجة الفشل والعزل
Section titled “معالجة الفشل والعزل”أثناء التحميل
Section titled “أثناء التحميل”يتم التقاط حالات الفشل لكل مسار امتداد كـ { path, error } ولا تمنع تحميل المسارات الأخرى.
الحالات الشائعة:
- فشل الاستيراد / ملف مفقود
- تصدير مصنع غير صالح (غير دالة)
- استثناء مُلقى أثناء تنفيذ المصنع
نموذج عزل وقت التشغيل
Section titled “نموذج عزل وقت التشغيل”- الامتدادات غير معزولة في صندوق رمل (نفس العملية/وقت التشغيل).
- تتشارك في
EventBusواحد وكائنExtensionRuntimeواحد. - أثناء التحميل، تُلقي أساليب إجراء وقت التشغيل عمدًا
ExtensionRuntimeNotInitializedError؛ يحدث ربط الإجراءات لاحقًا فيExtensionRunner.initialize().
بعد التحميل
Section titled “بعد التحميل”عند تشغيل الأحداث عبر ExtensionRunner، يتم التقاط استثناءات المعالج وإصدارها كأخطاء امتداد بدلًا من إسقاط حلقة التشغيل.
أمثلة تخطيط المستخدم/المشروع الدنيا
Section titled “أمثلة تخطيط المستخدم/المشروع الدنيا”على مستوى المستخدم
Section titled “على مستوى المستخدم”~/.xcsh/agent/ config.yml extensions/ guardrails.ts audit/ index.tsعلى مستوى المشروع
Section titled “على مستوى المشروع”<repo>/ .xcsh/ settings.json extensions/ checks/ package.json lint-gates.tschecks/package.json:
{ "xcsh": { "extensions": ["./src/check-a.ts", "./src/check-b.js"] }}لا يزال يُقبل مفتاح البيان القديم:
{ "pi": { "extensions": ["./index.ts"] }}