تفاصيل المساهمة الداخلية
هذه الصفحة للمساهمين الذين يغيّرون الأجزاء الداخلية من EstaCoda. الهدف منها أن توضّح أين يعيش الكود، ما الحدود التي يجب احترامها، وكيف تضيف جزءًا من بيئة التشغيل دون إضعاف نموذج الأمان.
إرشادات المساهمة العامة، توقعات طلبات السحب، وأوامر التحقق الكاملة موجودة في CONTRIBUTING.md و AGENTS.md في جذر المستودع. هذه الصفحة تركّز على بنية الكود وأنماط التنفيذ.
ما تغطيه هذه الصفحة
استخدم هذه الصفحة عندما تحتاج إلى:
- إضافة أو تعديل موائم مزوّد
- إضافة أو تعديل أداة
- إضافة أو تعديل موائم قناة
- تتبع إنشاء بيئة التشغيل أو إعداد
AgentLoop - لمس الذاكرة، البوابة، الأمان، تجميع المحث، أو توجيه المزوّدين
- كتابة اختبارات تحتاج إلى محاكاة أجزاء من بيئة التشغيل
- تحديد ما إذا كان نوع معيّن يجب أن يعيش في
src/contracts/
إذا كان التغيير يمس الأوامر، الموافقات، الاعتمادات السرية، الذاكرة، القنوات البعيدة، تحميل المهارات، ثقة مساحة العمل، أو محثات المزوّدين، فتعامل معه كتغيير حساس أمنيًا.
توزيع الكود
تنظّم EstaCoda الكود حسب مجال التشغيل. من أهم المجلدات تحت src/:
| المجلد | المسؤولية |
|---|---|
src/runtime/ | إنشاء بيئة التشغيل، ربط حلقة الوكيل، دمج حلقة المزوّد، وبناء الجلسات |
src/providers/ | موائمات المزوّدين، بيانات المزوّدين، حل مسارات النماذج، ومساعدات تنفيذ المزوّد |
src/tools/ | تعريفات الأدوات الأصلية، مزوّدو الأدوات، وخطة تسجيل الأدوات |
src/prompt/ | تجميع المحث، إعداد سجل المزوّد، الاختزال، وحزم السياق |
src/memory/ | الذاكرة المحلية، تكامل الذاكرة الخارجية، الاسترجاع، الفهرسة، والاختزال |
src/security/ | ثقة مساحة العمل، الموافقات، تقييم الأوامر، وبناء سياسة الأمان |
src/channels/ | موائمات القنوات، بوابة القنوات، ومساعدات التسليم |
src/gateway/ | مشرف البوابة، الخطافات، المرونة، ودورة حياة الخدمة |
src/cron/ | أدوات ومخزن مهام cron |
src/delegation/ | تفويض الوكلاء الفرعيين، مشغلات الأطفال، وتشخيصات التفويض |
src/workflow/ | تنفيذ سير العمل الدائم وحالة سير العمل |
src/evolution/ | مراجعة تطور الوكيل، المقترحات، القيود، ومسارات التصدير |
src/knowledge/ | دعم رسم علاقات الكود وذاكرة المعرفة |
src/lifecycle/ | مساعدات التثبيت، التحديث، الإزالة، وحفظ الحالة |
src/packs/ | تثبيت الحزم، السجل، وتصنيف المخاطر |
src/setup/ | الإعداد الأولي، محرر الإعداد، التحقق، ونصوص الإعداد المحلية |
src/acp/ | تكامل محرر ACP |
src/cli/ | أوامر CLI، حلقة الجلسة التفاعلية، ومسار التشغيل |
src/config/ | تحميل إعدادات التشغيل، حل الملفات الشخصية، ومسارات حالة EstaCoda |
src/contracts/ | عقود TypeScript المشتركة بين الأنظمة الفرعية |
اعتبر هذا الجدول خريطة عملية، وليس قائمة حصرية. نظام الملفات هو مصدر الحقيقة.
حدود الاستيراد
استخدم العقود المشتركة للحدود بين الأنظمة الفرعية. أبقِ وحدات التنفيذ خلف واجهات صغيرة وواضحة.
قواعد عملية:
- يمكن للأنظمة الطرفية أن تستورد من
src/contracts/، وبشكل محدود منsrc/config/. - يجب أن تتجنب الأنظمة الطرفية استيراد كود تركيب بيئة التشغيل.
src/runtime/منطقة تركيب. من الطبيعي أن تربط الأنظمة ببعضها.- يمكن لمداخل CLI والبوابة استدعاء إنشاء بيئة التشغيل.
- يمكن للاختبارات أن تستورد أسطحًا أعمق عندما يتطلب السلوك المختبر ذلك.
src/index.ts هو مدخل CLI. يقرأ خيارات CLI المبكرة، يتعامل مع الإعداد والأوامر التي لا تحتاج إلى آثار جانبية، يحمّل الإعدادات، يفتح قاعدة بيانات الجلسات، وينشئ بيئة تشغيل CLI عبر createRuntime().
عندما تضيف اعتمادًا بين نظامين فرعيين، اسأل أولًا ما إذا كان نوع عقد أو دالة حدية صغيرة سيجعل الملكية أوضح.
العقود
العقود العابرة للأنظمة الفرعية تعيش في src/contracts/.
| الملف | ما يعرّفه |
|---|---|
provider.ts | معرفات المزوّدين، ملفات النماذج، طلبات واستجابات المزوّدين، أحداث البث، وبيانات المسار |
tool.ts | تعريفات الأدوات، فئات المخاطر، مزوّدو الأدوات، ومعالجات الأدوات |
channel.ts | رسائل القنوات، الردود، قدرات الموائمات، وموائمات القنوات |
memory.ts | سجلات الذاكرة، سياق الذاكرة للمحث، وعقود مزوّد الذاكرة الخارجية |
security.ts | أوضاع الموافقة، نوع البيئة، ومدخلات سياسة الأمان |
session.ts | سجلات الجلسات، الرسائل، الأحداث، والتشخيصات |
runtime-event.ts | أحداث بيئة التشغيل أثناء العمل |
يجب ألا تستورد العقود وحدات تنفيذ. يمكنها أن تستورد عقودًا أخرى عندما تكون الحدود بين الأنظمة تتطلب ذلك فعلًا.
لا تغيّر عقدًا فقط لأن تنفيذًا جديدًا أُضيف. غيّر العقد عندما تتغير الحدود نفسها.
أمثلة:
- المزوّد الجديد غالبًا يطبّق عقد
ProviderAdapterالموجود. - القناة الجديدة غالبًا تطبّق عقد
ChannelAdapterالموجود. - خلفية ذاكرة خارجية جديدة غالبًا تطبّق عقد مزوّد الذاكرة الخارجية الموجود.
- قدرة جديدة تعبر أكثر من نظام فرعي قد تحتاج إلى تغيير عقد واختبارات لكل تنفيذ متأثر.
تركيب بيئة التشغيل
createRuntime() في src/runtime/create-runtime.ts هو سطح التركيب الأساسي. يبني البنية المشتركة لبيئة التشغيل، مثل السجلات، المخازن، بنية الذاكرة، دورة حياة المتصفح، دعم cron، تحميل المهارات، مدخلات سجل المزوّدين، وربط سياسة الأمان.
البناء الخاص بالجلسة يتم عبر AgentLoopBuilder في src/runtime/agent-loop-builder.ts.
| المرحلة | مدة الحياة | أمثلة |
|---|---|---|
| بنية بيئة التشغيل | مدة حياة العملية أو بيئة التشغيل | المخازن، السجلات، الإعدادات المشتقة من الملف الشخصي، دورة حياة المتصفح، مخزن cron، الخدمات المشتركة |
| بناء الجلسة | مدة حياة الجلسة | سجل الأدوات، أدوات الجلسة، حلقة المزوّد، حلقة الوكيل، مدير التفويض |
إذا كان المكوّن يجب أن يبقى بين أدوار جلسة بوابة، فعادةً مكانه في بنية بيئة التشغيل. وإذا كان يجب أن يكون جديدًا لكل جلسة، فعادةً مكانه في بناء الجلسة.
قد تستخدم جلسات البوابة RuntimeCache من src/runtime/runtime-cache.ts. التخزين المؤقت يعتمد على سياق الجلسة ويُبطَل عندما تتغير بصمة بيئة التشغيل.
إضافة مزوّد
موائمات المزوّدين تطبّق ProviderAdapter من src/contracts/provider.ts.
الدوال المطلوبة:
| الدالة | الغرض |
|---|---|
health(endpointOverride?) | فحص توفر الموائم |
listModels() | إرجاع ملفات النماذج القابلة للتشغيل من الموائم |
complete(request, options) | تنفيذ طلب غير بثي |
الدوال الاختيارية:
| الدالة | الغرض |
|---|---|
stream(request, options) | تنفيذ طلب بث عندما يدعمه المزوّد |
الخطوات المعتادة:
- أضف تنفيذ المزوّد تحت
src/providers/. - طبّق عقد المزوّد الموجود.
- أضف أو حدّث بيانات المزوّد فقط عندما يحتاج المسار إلى بيانات تتجاوز التنفيذ نفسه.
- سجّل الموائم في المكان الذي يُبنى فيه سجل المزوّدين.
- أضف اختبارات لتشكيل الطلب، الاعتمادات، قائمة النماذج، معالجة الأخطاء، وأي سلوك رجوع احتياطي.
- حدّث بيئة تشغيل المزوّد فقط إذا تغير سلوك التشغيل أو حدود دعم المزوّد.
لا تفترض أن كل مزوّد يدعم الأدوات، البث، المخرجات المنظمة، التفكير، الصور، أو سجل الأدوات الأصلي. هذه القدرات يجب أن تأتي من بيانات المسار، قدرات ملف النموذج، وسلوك الموائم.
إضافة أداة
الأدوات تُعرّف في src/tools/ وتُعرض عبر مزوّدي أدوات.
الأداة المسجلة تتضمن:
| الخاصية | الغرض |
|---|---|
name | معرّف ثابت يراه النموذج |
description | وصف يراه النموذج |
inputSchema | JSON Schema للمدخلات المقبولة |
riskClass | فئة الخطر للموافقة والتنفيذ |
toolsets | مجموعات القدرات التي تعرض الأداة أو ترشحها |
progressLabel | تسمية قصيرة للحالة أثناء تشغيل الأداة |
maxResultSizeChars | حد لنص النتيجة المرسل للنموذج |
isAvailable() | فحص توفر الأداة في بيئة التشغيل أو الجلسة |
run(input, context) | معالج الأداة |
فئات خطر الأدوات الحالية:
read-only-local
read-only-network
workspace-write
external-side-effect
credential-access
destructive-local
shared-state-mutation
spend-money
sandbox-escape
تسجيل الأدوات مركزي عبر toolRegistrationPlan في src/tools/index.ts.
| المرحلة | الاستخدام المعتاد |
|---|---|
pre-skill-visibility | الأدوات الأساسية قبل تثبيت رؤية المهارات |
post-skill-visibility | الأدوات التي تعرضها المهارات المحملة |
post-memory-provider | الأدوات التي تعتمد على إعداد مزوّد الذاكرة |
post-tool-executor | الأدوات التي تعتمد على بنية منفّذ الأدوات |
الخطوات المعتادة:
- أضف أو حدّث مزوّد أداة تحت
src/tools/. - استخدم أضيق
riskClassصحيح. - تحقّق من المسارات، الأوامر، عناوين URL، الاعتمادات، والأهداف الخارجية قبل أي أثر جانبي.
- أرجع أخطاء منظمة بدل الرمي للحالات المتوقعة من المستخدم أو بيئة التشغيل.
- سجّل المزوّد في المرحلة المناسبة.
- أضف اختبارات مركزة للنجاح، الفشل، الرفض، وسلوك الحدود.
- حدّث بيئة تشغيل الأدوات إذا تغيرت دلالات التنفيذ.
لا توسّع الموافقات على الأوامر، فحوصات الثقة، أو التعامل مع المسارات لجعل الأداة أسهل في الاستدعاء.
إضافة موائم قناة
موائمات القنوات تطبّق ChannelAdapter من src/contracts/channel.ts.
حقول ودوال شائعة:
| الحقل أو الدالة | الغرض |
|---|---|
kind | معرّف القناة مثل telegram أو discord أو email |
delivery | قدرات التسليم والبث الاختيارية |
start(handler) | بدء موائم طويل العمر وتمرير الرسائل الداخلة إلى البوابة |
stop() | إيقاف موارد الموائم بشكل نظيف |
receive(event) | تحويل حدث منصة إلى حدث أو رسالة قناة |
send(reply) | تسليم رد |
getCapabilities() | إرجاع بيانات القدرات الثابتة |
pollOnce() | جلب رسائل داخلة بنمط polling |
pair() | تشغيل مسار ربط |
joinVoiceChannelForMessage() | الانضمام إلى قناة صوتية لرسالة |
leaveVoiceChannelForMessage() | مغادرة قناة صوتية لرسالة |
الخطوات المعتادة:
- أضف الموائم تحت
src/channels/. - طبّق عقد
ChannelAdapter. - أضف دعم الإعداد والتشغيل في المكان الذي يُنشأ فيه الموائم.
- أضف أو حدّث سياسة مصادقة القناة إذا كانت القناة تقبل مستخدمين بعيدين.
- استخدم مسار مرونة البوابة للموائمات طويلة العمر عندما يكون ذلك مناسبًا.
- أضف اختبارات للمصادقة، تحويل الرسائل، سلوك الطابور، التسليم، والإيقاف.
- حدّث البوابة الداخلية إذا تغير سلوك المشرف أو البوابة.
يجب ألا تملك الموائمات توجيه الموافقات. ChannelGateway يملك المصادقة، نطاق الجلسة، سلوك طابور الموافقات، الأفعال المضمنة، وإبطال بيئة التشغيل.
أنماط الاختبار
تستخدم الاختبارات Vitest وتعمل على Node.js. يمكن أن يكون Bun مفيدًا للسرعة محليًا، لكنه ليس خط الأساس المدعوم.
فضّل اختبارات السلوك على اللقطات الواسعة. استخدم أنماط المساعدات الموجودة قرب الكود الذي تختبره.
| الهدف | النمط المفضل |
|---|---|
| سلوك المزوّد | محاكاة ProviderAdapter أو استخدام مساعدات الاختبار المحلية |
| تخزين الجلسات | استخدام InMemorySessionDB أو SQLite في مجلد مؤقت |
| سلوك نظام الملفات | استخدام مجلدات مؤقتة وتجنب home الحقيقي |
| جلسات بيئة التشغيل | تفضيل AgentLoopBuilder أو اختبارات Runtime مركزة بدل إعداد كامل غير لازم |
| سلوك القناة | اختبار المصادقة، تحويل الرسائل، الطوابير، والتنظيف دون اعتمادات حية |
| سلوك الأمان | اختبار مسارات السماح والرفض معًا |
أوامر مركزة:
pnpm exec vitest run src/providers/<file>.test.ts
pnpm exec vitest run src/tools/<file>.test.ts
pnpm exec vitest run src/channels/<file>.test.ts
التحقق القياسي للمستودع مذكور في AGENTS.md. لا تقل إن فحصًا نجح إلا إذا شغّلته فعلًا.
معالجة الأخطاء
استخدم أبسط شكل خطأ يحافظ على تدفق التحكم والتشخيصات.
| النمط | متى يستخدم |
|---|---|
Result<Ok, Err> | حالات فشل متوقعة يجب على المستدعي التفرع بناءً عليها |
throw | خرق الثوابت، أخطاء المبرمج، والحالات غير المتوقعة |
AggregateError | عدة حالات فشل مستقلة |
AbortController | إلغاء طلبات المزوّد، الأدوات، الأدوار، والعمل طويل المدى |
يجب أن تتضمن حالات فشل المزوّد بيانات منظمة كافية للتشخيص دون تسريب أسرار. يجب أن تكون أخطاء الأدوات قابلة للالتقاط من حلقة الوكيل وظاهرة للنموذج عندما يكون ذلك مناسبًا. أخطاء القنوات والبوابة القابلة للتعافي يجب عزلها وتصنيفها وإظهارها دون إفساد حالة الجلسة بصمت.
حدود الحالة والإعدادات
حالة التشغيل تنتمي إلى home الخاص بـ EstaCoda، وليس إلى مسارات عشوائية داخل المصدر.
| الحد | القاعدة |
|---|---|
| الحالة العامة | حالة مشتركة تحت ~/.estacoda/، مثل اختيار الملف النشط، الثقة، الموافقات، الجلسات، الذاكرة المشتركة، الحزم، وحل الملفات الشخصية |
| حالة الملف الشخصي | حالة مرتبطة بملف شخصي تحت ~/.estacoda/profiles/<id>/، مثل الإعداد، .env الخاص بالملف، ملفات الذاكرة، المهارات، السجلات، حالة البوابة، ومجلدات الوسائط أو التخزين المؤقت |
| حالة مساحة العمل | ثقة مساحة العمل حالة عامة مرتبطة بمسار الدليل؛ لا تعامل ملفات المشروع كإعداد موثوق |
| قاعدة بيانات الجلسات | استمرار الجلسات يتم عبر مسار قاعدة بيانات الجلسات المكوّن |
| الإعداد | بيئة التشغيل تحمّل إعداد ملف شخصي واحد لكل تشغيل؛ اعتمادات المزوّدين تُحل عبر أسماء متغيرات البيئة المكوّنة ودعم .env الخاص بالملف الشخصي |
إذا أضفت ملف حالة جديدًا، قرر هل هو عام، مرتبط بملف شخصي، مرتبط بجلسة، أم مؤقت. استخدم محللات المسارات الموجودة في src/config/ بدل تثبيت مسار home يدويًا.
التغييرات الحساسة أمنيًا
هذه الأسطح تحتاج مراجعة إضافية:
| السطح | سبب الحساسية |
|---|---|
| ثقة مساحة العمل | تتحكم فيما إذا كان يمكن لـ EstaCoda العمل داخل دليل |
| موافقات الأدوات | تتحكم فيما إذا كانت الأفعال الخطرة يمكن أن تعمل |
| تنفيذ الأوامر | قد يتحول إلى تنفيذ كود محلي |
| التعامل مع المسارات | قد يتحول إلى تجاوز مسارات أو وصول غير مقصود للملفات |
| الأسرار والإعداد | قد يسرّب مفاتيح API، رموز bots، مسارات خاصة، أو اعتمادات |
| البوابة والقنوات | يمكن لمستخدمين بعيدين إرسال رسائل وموافقات |
| الذاكرة | سياق دائم قد يؤثر على السلوك المستقبلي |
| المهارات والحزم | التعليمات والأدوات المحملة قد تغيّر سلوك بيئة التشغيل |
| تجميع المحث | المحتوى غير الموثوق قد يؤثر على سلوك المزوّد |
استخدم مساعدات المسار الآمن، التنقيح، الموافقة، الثقة، والسياسة الموجودة في النظام الذي تلمسه. إذا لم يكن هناك مساعد مناسب، أضف مساعدًا ضيقًا مع اختبارات بدل تجاوز الحد.
لا تجمع التغييرات الحساسة أمنيًا مع إعادة هيكلة غير مرتبطة.
مهام شائعة
إضافة ملف نموذج
- حدّث مسار كتالوج المزوّد أو النموذج الذي يستخدمه ذلك المزوّد.
- اضبط بيانات القدرة مثل
contextWindowTokensوsupportsToolsوsupportsVisionوsupportsStructuredOutputوapiModeعندما تنطبق. - أضف أو حدّث اختبارات تحميل الكتالوج، حل المسار، الأسماء البديلة، تشخيصات المزوّد، وسلوك الرجوع الاحتياطي.
إضافة intent أصلي
- غيّر
src/contracts/intent.tsفقط إذا تغير عقد intent. - أضف سلوك توجيه حتمي في الموجّه أو النظام المناسب.
- أضف المعالج في حلقة الوكيل أو في اعتراض قبل الحلقة عند الحاجة.
- اختبر التعرف، المعالجة، النتائج الإيجابية الخاطئة، النتائج السلبية الخاطئة، والمطالبات الملتبسة.
إضافة حدث تشخيصي
- أضف شكل الحدث إلى العقد المناسب إذا كان الحدث يُحفظ أو يعبر حدود الأنظمة.
- أرسله من النظام الذي يملكه.
- أبقِ الحمولة عامة وآمنة من الأسرار.
- أضف اختبارات للحدث وللحقول التي يجب حذفها.
إضافة gateway hook
- أضف اسم الخطاف ونوع الحمولة في سجل خطافات البوابة.
- أرسله من المشرف أو طبقة المرونة.
- أبقِ الحمولة خالية من نص الرسالة الخام، الرموز، الأسرار، والمعرّفات غير اللازمة.
- أضف اختبارات لإرسال الخطاف والتنظيف.
ملفات تستحق الفحص
ابدأ بهذه الملفات عند تتبع التفاصيل الداخلية:
| الملف | ما يوضحه |
|---|---|
src/index.ts | مدخل CLI وإنشاء بيئة تشغيل CLI |
src/runtime/create-runtime.ts | بناء بنية بيئة التشغيل |
src/runtime/agent-loop-builder.ts | بناء الجلسة ومراحل تسجيل الأدوات |
src/runtime/runtime-cache.ts | سلوك تخزين بيئة التشغيل مؤقتًا للبوابة |
src/contracts/provider.ts | عقود طلبات واستجابات وموائمات المزوّدين |
src/contracts/tool.ts | تعريفات الأدوات، المزوّدون، وفئات المخاطر |
src/contracts/channel.ts | رسائل القنوات، التسليم، القدرات، وعقود الموائمات |
src/config/runtime-config.ts | تحميل الإعدادات وتطبيعها |
src/security/security-policy-factory.ts | بناء سياسة الأمان |
src/prompt/prompt-assembly.ts | ترتيب بناء المحث وإعداد سجل المزوّد |