Skip to main content

مسار الرسالة

كل رسالة تتبع هذا المسار بالضبط عبر النظام. لا استثناءات، ولا اختصارات.

خطوة بخطوة

1. استلام الرسالة

يرسل المستخدم رسالة من واجهة الدردشة. تصل في العملية الرئيسية عبر IPC وتدخل حلقة الوكيل.

2. تجميع السياق (prefrontal)

هذه هي أهم خطوة — وهي رشيقة بالتصميم. موجّه النظام لمحادثة جديدة يبلغ نحو 5,000 رمز (كان نحو 44,000). تجمّع القشرة الأمامية الجبهية فقط ما يلي:
  1. <identity> — ملفا soul.md + user.md، مملوكان للمستخدم
  2. <device> — حقائق ثابتة عن الجهاز (~40 رمزًا)
  3. <prefrontal> — عقد التشغيل agents.core.md (~1.4 ألف رمز) بالإضافة إلى خلاصة التفضيلات المتعلَّمة المحدودة من basalganglia (~500 رمز)
  4. <capabilities> — فهرس بسطر واحد لكل قدرة: الاسم، ووصف لا يتجاوز 90 حرفًا، وعدد الأدوات، وعلامة [loaded] على القدرات القابلة للاستدعاء الآن. ~800 رمز؛ وبعد 60 قدرة مثبَّتة تنهار البقية غير المحمَّلة إلى عدادات مجمَّعة، فتكون التكلفة O(1) مهما ثبَّتَّ من قدرات
  5. <memory_map> — خريطة تغطية لما هو موجود ويمكن استرجاعه: أعداد السجلات لكل مصدر (مقرَّبة إلى فئات خشنة)، ونطاقات التواريخ، ومواضيع ملفات المعرفة، وأعداد المحادثات والمُخرَجات. إنها خريطة، وليست محتوى أبدًا، وتُخزَّن مؤقتًا لكل يوم تقويمي حتى لا تُزعزع مخزن موجّهات المزوّد المؤقت
  6. <runtime> — منحَّف؛ عدادات الحلقة الحية تركب ذيلًا متقلبًا في نهاية مصفوفة الرسائل الصادرة تمامًا، وليس في الموجّه
  7. تراكبات شرطية: الدور (قائد سير العمل/وكيله — يتضمّن تراكب القائد كتالوج <workflow_models> بالنماذج القابلة للإطلاق)، تنسيق القناة (WhatsApp)، وتراكب الصدق <local_model> للنماذج المشغَّلة محليًا
ما ليس في الموجّه عمدًا: لا إغراق للذاكرة، ولا سجل حلقات، ولا كتالوج أدوات نثري، ولا نصوص مهارات. كل ذلك مفهرس على القرص ويُسترجَع جراحيًا حين يحتاجه الدور فعلًا — memory_search للذاكرة وtool_search للأدوات. تُكتب لقطة تصحيح لكل موجّه مُجمَّع في brain/prefrontal/.debug/ (بحد أقصى 50 ملفًا مع تدوير).
يمكنك فحص ما استلمه نموذج اللغة بالضبط بقراءة ملفات لقطات التصحيح. هكذا تصحّح أسئلة “لماذا فعل وولفيش ذلك؟“.

3. اختيار الأدوات (cerebellum)

تُشحَن مخططات JSON الكاملة فقط لـالمجموعة الأساسية — نحو 29–47 أداة بحسب ما هو متصل: tool-discovery وintrospect وfilesystem وshell وask وutilities (send_file) وweb-search وsecrets وsystem وworkflow (متاحة للقائد وحده)، بالإضافة إلى أدوات الإرسال telegram/whatsapp/electron ما دامت تلك القنوات متصلة. هذا نحو 4 آلاف رمز من المخططات، ليصبح الطلب الجديد ≈9.4 ألف رمز إجمالًا (مقابل ~94 ألفًا قبل إعادة التصميم الرشيقة). كل شيء آخر — github وgoogle وnotion والمتصفح واستخدام الحاسوب وأدوات الوسائط والمستندات وجميع خوادم MCP — قابل للاكتشاف:
  • tool_search(query) — بحث بالمصطلحات في أسماء القدرات وأوصافها ومحفّزاتها وأسماء أدواتها؛ يُحمَّل أفضل تطابق تلقائيًا وتصبح أدواته قابلة للاستدعاء في الدور نفسه.
  • tool_activate(capability) — تحميل صريح بالاسم.
  • استدعاء أداة معروفة لكن غير محمَّلة مباشرةً يعمل ببساطة (تفعيل تلقائي). أما الأداة المجهولة تمامًا فتُرجع خطأً حتميًا يشير إلى tool_search.
التفعيل على مستوى المحادثة: كل محادثة تحمل مجموعتها النشطة الخاصة (مقيَّدة بآلية LRU عند 10 قدرات غير أساسية)، لذا فإن تحميل github في تشغيلٍ لنبض القلب لا يُبطل أبدًا مخزن الموجّهات المؤقت لدردشة حية. الإخلاء غير مرئي — استدعاء أداة مُخلاة يُعيد تفعيلها تلقائيًا وتُنفَّذ بشكل طبيعي. ويضيف pinnedCapabilities في config.json قدرات إضافية محمَّلة دائمًا (بالتحرير اليدوي؛ لا واجهة له). موجّه النظام ومخططات الأدوات يُثبَّتان عند بداية الدور ويُعاد استخدامهما عبر تكرارات الحلقة — ولا يُعاد بناؤهما إلا حين تتغير مجموعة أدوات هذه المحادثة فعلًا (تفعيل tool_search في منتصف الدور، أو إنشاء مهارة أو تحريرها، أو تغيّر في سطح MCP). في أسوأ الحالات، الأساس زائد أثقل 10 تفعيلات ≈41.5 ألف رمز — أي أقل من نصف الحد الأدنى القديم.

4. استدعاء نموذج اللغة (thalamus)

يذهب السياق المُجمَّع إلى thalamus.stream()، الذي:
  1. يتحقق من net.isOnline() لكشف وضع عدم الاتصال فوريًا
  2. يستدعي نموذج الدماغ — الذي اخترته صراحةً من مبدّل النماذج في حقل إدخال المحادثة (وفي وضع سير العمل، يحلّ لكل وكيل النموذج الذي اختاره له القائد)
  3. عند خطأ عابر، يُعيد محاولة دماغ السحابة نفسه وفق جدول تراجع؛ لا يوجد تدرّج تلقائي إلى مزوّد آخر
  4. يُرجع مولّدًا غير متزامن موحدًا من نوع StreamChunk

5. تدفق الرد (broca)

يستلم broca قطع التدفق ويمررها إلى المُعرِّض (renderer) عبر IPC للعرض في الوقت الفعلي في واجهة الدردشة.

6. تحليل الرد (wernicke)

يحلل wernicke الرد المتدفق، ويوحّد بين تنسيقات المزودين:
  • DeepSeek: كائنات function_call متوافقة مع OpenAI
  • Anthropic: كتل محتوى tool_use
  • OpenAI: كائنات function_call
  • Ollama: JSON مهيكَل في الاستجابة
كل الأربعة تُوحَّد في نوع واحد ToolCall: { name, args, id }.

7. حلقة تنفيذ الأدوات (إن وُجدت استدعاءات أدوات)

إذا وجد wernicke استدعاءات أدوات، تبدأ الحلقة. لا يوجد سقف رقمي للتكرارات — يقرأ النموذج موضعه في الحلقة من عدادات وقت التشغيل الحية ويتولى بنفسه قرار الإنهاء:
  1. amygdala.classify() — يتحقق من استدعاء الأداة مقابل أنماط الخطر المُحمَّلة من ملفات SKILL.md. ثلاث نتائج: safe (المتابعة)، confirm (إظهار مربع حوار موافقة)، block (الرفض).
  2. motor.execute() — ينشئ ملف TASK-{id}.md، ويسجل الخطوة، ويستدعي الإضافة مع منطق إعادة المحاولة (3 مرات بتأجيل 2ث/6ث/18ث).
  3. cerebellum.executeTool() — يوجّه الاستدعاء إلى إضافة القدرة الصحيحة.
  4. تعود النتائج إلى نموذج اللغة للتكرار التالي.
يُعالَج سجل المحادثات الطويلة قبل أن يبدأ الدور أصلًا: بعد نحو 120 ألف حرف من النمو، تُعاد الأدوار الأقدم على هيئة ملخص متجدد مُخزَّن بالإضافة إلى آخر 8 رسائل حرفيًا، وتُعاد نتائج الأدوات الضخمة القديمة (≥2,000 حرف، الأقدم من آخر تبادلَين) على هيئة بدائل استرجاع مختصرة تحمل مؤشرًا. وداخل الدور، تبقى شبكة أمان: إذا تجاوزت مصفوفة الرسائل 75% من ميزانية سياق النموذج (معايَرة مقابل الرموز الفعلية المفوترة من المزوّد)، تُقتطع الرسائل القديمة تناسبيًا في مكانها ويُنتج استدعاء LLM واحد ملخصًا منظمًا مع تذكير بالمتابعة — بالإضافة إلى إعادة محاولة مفروضة عند خطأ فيضان 400 وحارس امتلاء السياق للحالات المرضية.

دورة حياة السياق

كيف يُبقي الملخص المتجدد المُخزَّن والذيل الحرفي وشبكة الأمان داخل الدور المحادثات الطويلة مستمرةً دون فقدان المعلومات.

8. الذاكرة (hippocampus + basalganglia)

بعد اكتمال الرد:
  • يضيف hippocampus ملخصًا للدور موسومًا بمصدره (## HH:MM [heartbeat] — …) إلى ملف حلقة اليوم (brain/hippocampus/episodes/YYYY-MM-DD.md)
  • يسجل basalganglia النتيجة (نجاح/فشل/رفض) في ملف ملاحظات اليوم
  • يفحص مُلخِّصٌ يعمل بأسلوب أطلِق-وانسَ المحادثةَ المحفوظة: عندما تتجاوز المنطقة غير الملخَّصة نحو 120 ألف حرف، يطوي كل ما قبل حدّ الدور في ملخص واحد مُخزَّن (≤6 آلاف حرف)، مع إبقاء آخر 8 رسائل حرفيًا. استدعاء تلخيص واحد لكل ~120 ألف حرف من النمو، إلى الأبد — والرسائل الأصلية لا تُعدَّل ولا تُحذَف أبدًا.

ما ليس في خطّ المعالجة

لا توجد استدعاءات لنموذج اللغة من أجل التصنيف أو التوجيه أو اختيار السياق. كل ذلك عمليات كود حتمية. يُستدعى نموذج اللغة مرة واحدة بالضبط للرد (بالإضافة إلى مرة لكل تكرار استخدام أداة). الاستدعاء الآخر الوحيد هو طيّ الملخص المتجدد غير المتزامن — بحد أقصى مرة واحدة لكل ~120 ألف حرف من نمو المحادثة، ولا يقع أبدًا في مسار الرسالة. هذا يبقي خطّ المعالجة سريعًا، ورخيصًا، وقابلًا للتنبؤ.