> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wolffi.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# خطّ معالجة الوكيل

> كيف تتدفق رسالة عبر وولف فيش من المدخل إلى الرد

# مسار الرسالة

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

```
رسالة المستخدم
  → prefrontal.buildContext()
    → thalamus.stream()
      → broca.streamToUI()
        → wernicke.parse()
          → [في حال وجود استدعاءات أدوات: amygdala → motor → cerebellum → حلقة]
            → hippocampus.appendEpisode()
              → basalganglia.recordOutcome()
                → انتهى
```

## خطوة بخطوة

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

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

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

هذه هي أهم خطوة. تقوم القشرة الأمامية الجبهية بما يلي:

1. تقرأ كل ملفات Markdown في مساحة العمل (الهوية، الذاكرة، المهارات)
2. تستدعي `cerebellum` للحصول على تعريفات الأدوات من القدرات المحمَّلة
3. تستدعي `cortex` للبحث في الذاكرة (SQLite FTS5)
4. تمرر كل المرشحين عبر `ras` لتسجيل الصلة
5. تطبق توزيع ميزانية الرموز (15% هوية / 10% prefrontal / 30% ذاكرة / 20% مهارات / 25% سجل)
6. تجمّع المُطالبة النظامية النهائية مع وسوم XML
7. تكتب لقطة تصحيح في `brain/prefrontal/.debug/`

<Info>
  يمكنك فحص ما استلمه نموذج اللغة بالضبط بقراءة ملفات لقطات التصحيح. هكذا تصحّح أسئلة "لماذا فعل وولف فيش ذلك؟".
</Info>

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

يذهب السياق المُجمَّع إلى `thalamus.stream()`، الذي:

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

### 4. تدفق الرد (broca)

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

### 5. تحليل الرد (wernicke)

يحلل `wernicke` الرد المتدفق، ويوحّد بين تنسيقات المزودين:

* **DeepSeek**: كائنات `function_call` متوافقة مع OpenAI
* **Anthropic**: كتل محتوى `tool_use`
* **OpenAI**: كائنات `function_call`
* **Ollama**: JSON مهيكَل في الاستجابة

كل الأربعة تُوحَّد في نوع واحد `ToolCall`: `{ name, args, id }`.

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

إذا وجد `wernicke` استدعاءات أدوات، تبدأ الحلقة (بحد أقصى 8 تكرارات):

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

قبل كل استدعاء لنموذج اللغة في التكرار، يفحص ضغط السياق ما إذا كانت مصفوفة الرسائل تتجاوز 75% من ميزانية سياق النموذج. إذا تجاوزت، تُقتطع الرسائل القديمة تناسبياً مباشرةً ويُنتج استدعاء LLM واحد ملخصاً منظماً مع تذكير بالمتابعة — مما يضمن أن النموذج يُكمل المهام متعددة الخطوات حتى بعد الضغط.

<Card title="ضغط السياق" icon="compress" href="/ar/architecture/context-compaction">
  كيف يحافظ الاقتطاع التناسبي والتلخيص بمرة واحدة على استمرار المحادثات الطويلة دون فقدان المعلومات.
</Card>

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

بعد اكتمال الرد:

* يضيف `hippocampus` ملخصًا للدور إلى ملف حلقة اليوم (`brain/hippocampus/episodes/YYYY-MM-DD.md`)
* يسجل `basalganglia` النتيجة (نجاح/فشل/رفض) في ملف ملاحظات اليوم

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

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