---
read_when:
    - تحتاج إلى تصحيح أخطاء معرّفات الجلسات أو JSONL لسجل المحادثة أو حقول sessions.json
    - أنت تغيّر سلوك Compaction التلقائي أو تضيف أعمال صيانة «ما قبل Compaction»
    - تريد تنفيذ عمليات تفريغ الذاكرة أو دورات النظام الصامتة
summary: 'تعمّق: مخزن الجلسات والسجلات النصية، ودورة الحياة، والآليات الداخلية لـ Compaction (التلقائي)'
title: تعمّق في إدارة الجلسات
x-i18n:
    generated_at: "2026-05-02T21:02:15Z"
    model: gpt-5.5
    provider: openai
    source_hash: 8271d7b0786e1c47a8cec6e7bd73c3c86a433d629e17937fdd87fa756ed78d73
    source_path: reference/session-management-compaction.md
    workflow: 16
---

تدير OpenClaw الجلسات من البداية إلى النهاية عبر هذه المجالات:

- **توجيه الجلسات** (كيف تُطابَق الرسائل الواردة مع `sessionKey`)
- **مخزن الجلسات** (`sessions.json`) وما يتتبعه
- **حفظ سجل المحادثة** (`*.jsonl`) وبنيته
- **نظافة سجل المحادثة** (تصحيحات خاصة بالمزوّد قبل التشغيلات)
- **حدود السياق** (نافذة السياق مقابل الرموز المتتبعة)
- **Compaction** (اليدوي والتلقائي) وموضع ربط العمل السابق لـ Compaction
- **الصيانة الصامتة** (كتابات الذاكرة التي يجب ألا تنتج مخرجات مرئية للمستخدم)

إذا أردت نظرة عامة أعلى مستوى أولًا، فابدأ بـ:

- [إدارة الجلسات](/ar/concepts/session)
- [Compaction](/ar/concepts/compaction)
- [نظرة عامة على الذاكرة](/ar/concepts/memory)
- [بحث الذاكرة](/ar/concepts/memory-search)
- [تقليم الجلسات](/ar/concepts/session-pruning)
- [نظافة سجل المحادثة](/ar/reference/transcript-hygiene)

---

## مصدر الحقيقة: Gateway

صُممت OpenClaw حول **عملية Gateway** واحدة تمتلك حالة الجلسات.

- يجب أن تستعلم واجهات المستخدم (تطبيق macOS، وواجهة Control UI على الويب، وTUI) من Gateway عن قوائم الجلسات وعدّادات الرموز.
- في الوضع البعيد، تكون ملفات الجلسات على المضيف البعيد؛ لذلك لن يعكس "فحص ملفات جهاز Mac المحلي" ما يستخدمه Gateway.

---

## طبقتا حفظ

تحفظ OpenClaw الجلسات في طبقتين:

1. **مخزن الجلسات (`sessions.json`)**
   - خريطة مفتاح/قيمة: `sessionKey -> SessionEntry`
   - صغيرة، قابلة للتغيير، وآمنة للتحرير (أو حذف الإدخالات)
   - تتتبع بيانات تعريف الجلسة (معرّف الجلسة الحالي، وآخر نشاط، والمفاتيح، وعدّادات الرموز، وغير ذلك)

2. **سجل المحادثة (`<sessionId>.jsonl`)**
   - سجل محادثة للإلحاق فقط ببنية شجرية (تحتوي الإدخالات على `id` + `parentId`)
   - يخزّن المحادثة الفعلية + استدعاءات الأدوات + ملخصات Compaction
   - يُستخدم لإعادة بناء سياق النموذج للمنعطفات المستقبلية
   - تُتخطى نقاط فحص التصحيح الكبيرة السابقة لـ Compaction بمجرد أن يتجاوز سجل المحادثة النشط حد حجم نقطة الفحص، مما يتجنب إنشاء نسخة `.checkpoint.*.jsonl` عملاقة ثانية.

ينبغي لقراء تاريخ Gateway تجنب تحميل سجل المحادثة بأكمله في الذاكرة ما لم يكن السطح يحتاج صراحةً إلى وصول تاريخي عشوائي. تستخدم صفحة التاريخ الأولى، وتاريخ الدردشة المضمّن، واسترداد إعادة التشغيل، وفحوصات الرموز/الاستخدام قراءات ذيل محدودة. تمر عمليات فحص سجل المحادثة الكاملة عبر فهرس سجل المحادثة غير المتزامن، والذي يُخزَّن مؤقتًا حسب مسار الملف بالإضافة إلى `mtimeMs`/`size` ويُشارَك بين القراء المتزامنين.

---

## المواقع على القرص

لكل وكيل، على مضيف Gateway:

- المخزن: `~/.openclaw/agents/<agentId>/sessions/sessions.json`
- سجلات المحادثة: `~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl`
  - جلسات مواضيع Telegram: `.../<sessionId>-topic-<threadId>.jsonl`

تحل OpenClaw هذه المسارات عبر `src/config/sessions.ts`.

---

## صيانة المخزن وضوابط القرص

يحتوي حفظ الجلسات على ضوابط صيانة تلقائية (`session.maintenance`) لـ `sessions.json`، وآثار سجل المحادثة، والملفات الجانبية للمسارات:

- `mode`: `warn` (افتراضي) أو `enforce`
- `pruneAfter`: حد عمر الإدخال القديم (افتراضي `30d`)
- `maxEntries`: حد الإدخالات في `sessions.json` (افتراضي `500`)
- `resetArchiveRetention`: مدة الاحتفاظ بأرشيفات سجل المحادثة `*.reset.<timestamp>` (افتراضيًا: مثل `pruneAfter`؛ يعطل `false` التنظيف)
- `maxDiskBytes`: ميزانية اختيارية لدليل الجلسات
- `highWaterBytes`: هدف اختياري بعد التنظيف (افتراضيًا `80%` من `maxDiskBytes`)

تمر كتابات Gateway العادية عبر كاتب جلسات لكل مخزن يسلسل التغييرات داخل العملية دون أخذ قفل ملف وقت التشغيل. تستعير مساعدات التصحيح في المسار الساخن الذاكرة المؤقتة القابلة للتغيير والمتحقق منها أثناء احتفاظها بفتحة الكاتب تلك، لذلك لا تُنسخ ملفات `sessions.json` الكبيرة أو تُعاد قراءتها لكل تحديث بيانات تعريف. يجب أن يفضّل كود وقت التشغيل `updateSessionStore(...)` أو `updateSessionStoreEntry(...)`؛ أما عمليات حفظ المخزن بالكامل مباشرةً فهي أدوات توافق وصيانة دون اتصال. عندما يمكن الوصول إلى Gateway، تفوّض أوامر `openclaw sessions cleanup` و`openclaw agents delete` غير التجريبية تغييرات المخزن إلى Gateway حتى ينضم التنظيف إلى طابور الكاتب نفسه؛ ويكون `--store <path>` مسار الإصلاح الصريح دون اتصال لصيانة الملفات مباشرةً. لا يزال تنظيف `maxEntries` مجمعًا على دفعات للحدود ذات أحجام الإنتاج، لذلك قد يتجاوز المخزن الحد المكوّن لفترة وجيزة قبل أن يعيده تنظيف حد الماء العالي التالي إلى الأسفل. لا تقلم قراءات مخزن الجلسات الإدخالات أو تضع لها حدًا أثناء بدء تشغيل Gateway؛ استخدم الكتابات أو `openclaw sessions cleanup --enforce` للتنظيف. لا يزال `openclaw sessions cleanup --enforce` يطبّق الحد المكوّن فورًا.

تحافظ الصيانة على مؤشرات المحادثات الخارجية الدائمة مثل جلسات المجموعات وجلسات الدردشة ذات نطاق السلاسل، لكن لا يزال من الممكن إزالة إدخالات وقت التشغيل الاصطناعية لـ cron، والخطافات، وHeartbeat، وACP، والوكلاء الفرعيين عندما تتجاوز العمر أو العدد أو ميزانية القرص المكوّنة.

لم تعد OpenClaw تنشئ نسخًا احتياطية دورانية تلقائية `sessions.json.bak.*` أثناء كتابات Gateway. يُتجاهل مفتاح `session.maintenance.rotateBytes` القديم ويزيله `openclaw doctor --fix` من الإعدادات الأقدم.

تستخدم تغييرات سجل المحادثة قفل كتابة جلسة على ملف سجل المحادثة. ينتظر الحصول على القفل حتى `session.writeLock.acquireTimeoutMs` قبل إظهار خطأ جلسة مشغولة؛ الافتراضي هو `60000` مللي ثانية. ارفع هذه القيمة فقط عندما تتزاحم أعمال التحضير أو التنظيف أو Compaction أو مرآة سجل المحادثة المشروعة لمدة أطول على الأجهزة البطيئة. تبقى سياسات اكتشاف الأقفال القديمة وتحذيرات مدة الاحتفاظ القصوى منفصلة.

ترتيب الإنفاذ لتنظيف ميزانية القرص (`mode: "enforce"`):

1. أزل أولًا أقدم الآثار المؤرشفة، أو سجلات المحادثة اليتيمة، أو آثار المسارات اليتيمة.
2. إذا ظل الاستخدام أعلى من الهدف، فاطرد أقدم إدخالات الجلسات وملفات سجل المحادثة/المسارات الخاصة بها.
3. استمر حتى يصبح الاستخدام عند `highWaterBytes` أو أقل منه.

في `mode: "warn"`، تبلّغ OpenClaw عن عمليات طرد محتملة لكنها لا تغيّر المخزن/الملفات.

شغّل الصيانة عند الطلب:

```bash
openclaw sessions cleanup --dry-run
openclaw sessions cleanup --enforce
```

---

## جلسات Cron وسجلات التشغيل

تنشئ تشغيلات cron المعزولة أيضًا إدخالات جلسات وسجلات محادثة، ولها ضوابط احتفاظ مخصصة:

- `cron.sessionRetention` (افتراضي `24h`) يقلم جلسات تشغيل cron المعزولة القديمة من مخزن الجلسات (يعطل `false` ذلك).
- `cron.runLog.maxBytes` + `cron.runLog.keepLines` يقلّمان ملفات `~/.openclaw/cron/runs/<jobId>.jsonl` (الافتراضات: `2_000_000` بايت و`2000` سطر).

عندما ينشئ cron جلسة تشغيل معزولة جديدة قسرًا، فإنه ينظف إدخال جلسة `cron:<jobId>` السابق قبل كتابة الصف الجديد. يحمل تفضيلات آمنة مثل إعدادات التفكير/السريع/المطوّل، والتسميات، وتجاوزات النموذج/المصادقة التي اختارها المستخدم صراحةً. ويسقط سياق المحادثة المحيط مثل توجيه القناة/المجموعة، وسياسة الإرسال أو الطابور، والرفع، والأصل، وربط وقت تشغيل ACP حتى لا ترث تشغيلة معزولة جديدة تسليمًا قديمًا أو صلاحية وقت تشغيل من تشغيل أقدم.

---

## مفاتيح الجلسة (`sessionKey`)

يحدد `sessionKey` _سلة المحادثة_ التي أنت فيها (التوجيه + العزل).

أنماط شائعة:

- الدردشة الرئيسية/المباشرة (لكل وكيل): `agent:<agentId>:<mainKey>` (افتراضي `main`)
- المجموعة: `agent:<agentId>:<channel>:group:<id>`
- الغرفة/القناة (Discord/Slack): `agent:<agentId>:<channel>:channel:<id>` أو `...:room:<id>`
- Cron: `cron:<job.id>`
- Webhook: `hook:<uuid>` (ما لم يُتجاوز)

القواعد القانونية موثقة في [/concepts/session](/ar/concepts/session).

---

## معرّفات الجلسة (`sessionId`)

يشير كل `sessionKey` إلى `sessionId` حالي (ملف سجل المحادثة الذي يواصل المحادثة).

قواعد عامة:

- **إعادة الضبط** (`/new`، `/reset`) تنشئ `sessionId` جديدًا لذلك `sessionKey`.
- **إعادة الضبط اليومية** (افتراضيًا 4:00 صباحًا بالتوقيت المحلي على مضيف Gateway) تنشئ `sessionId` جديدًا عند الرسالة التالية بعد حد إعادة الضبط.
- **انتهاء الخمول** (`session.reset.idleMinutes` أو `session.idleMinutes` القديم) ينشئ `sessionId` جديدًا عندما تصل رسالة بعد نافذة الخمول. عندما تكون إعادة الضبط اليومية والخمول مكوّنين معًا، يفوز ما ينتهي أولًا.
- **أحداث النظام** (Heartbeat، وتنبيهات cron، وإشعارات exec، ومسك دفاتر Gateway) قد تغيّر صف الجلسة لكنها لا تمدد حداثة إعادة الضبط اليومية/الخمول. يتخلص انتقال إعادة الضبط من إشعارات أحداث النظام الموجودة في الطابور للجلسة السابقة قبل بناء الموجه الجديد.
- **سياسة تفرع الأصل** تستخدم الفرع النشط لـ PI عند إنشاء سلسلة أو تفرع وكيل فرعي. إذا كان ذلك الفرع كبيرًا جدًا، تبدأ OpenClaw الابن بسياق معزول بدل الفشل أو وراثة تاريخ غير قابل للاستخدام. سياسة التحجيم تلقائية؛ يزيل `openclaw doctor --fix` إعداد `session.parentForkMaxTokens` القديم.

تفصيل تنفيذي: يحدث القرار في `initSessionState()` في `src/auto-reply/reply/session.ts`.

---

## مخطط مخزن الجلسات (`sessions.json`)

نوع قيمة المخزن هو `SessionEntry` في `src/config/sessions.ts`.

حقول أساسية (ليست شاملة):

- `sessionId`: معرّف سجل المحادثة الحالي (يُشتق اسم الملف منه ما لم يكن `sessionFile` مضبوطًا)
- `sessionStartedAt`: طابع وقت البدء لـ `sessionId` الحالي؛ تستخدم حداثة إعادة الضبط اليومية هذا. قد تشتقه الصفوف القديمة من ترويسة جلسة JSONL.
- `lastInteractionAt`: طابع وقت آخر تفاعل حقيقي للمستخدم/القناة؛ تستخدم حداثة إعادة ضبط الخمول هذا حتى لا تبقي أحداث Heartbeat وcron وexec الجلسات حية. تعود الصفوف القديمة التي لا تحتوي هذا الحقل إلى وقت بدء الجلسة المسترد لحداثة الخمول.
- `updatedAt`: طابع وقت آخر تغيير لصف المخزن، يُستخدم للإدراج والتقليم ومسك الدفاتر. ليس هو المرجع لحداثة إعادة الضبط اليومية/الخمول.
- `sessionFile`: تجاوز اختياري صريح لمسار سجل المحادثة
- `chatType`: `direct | group | room` (يساعد واجهات المستخدم وسياسة الإرسال)
- `provider`، `subject`، `room`، `space`، `displayName`: بيانات تعريف لتسمية المجموعة/القناة
- المفاتيح:
  - `thinkingLevel`، `verboseLevel`، `reasoningLevel`، `elevatedLevel`
  - `sendPolicy` (تجاوز لكل جلسة)
- اختيار النموذج:
  - `providerOverride`، `modelOverride`، `authProfileOverride`
- عدّادات الرموز (أفضل جهد / معتمدة على المزوّد):
  - `inputTokens`، `outputTokens`، `totalTokens`، `contextTokens`
- `compactionCount`: عدد مرات اكتمال Compaction التلقائي لمفتاح الجلسة هذا
- `memoryFlushAt`: طابع وقت آخر تفريغ ذاكرة سابق لـ Compaction
- `memoryFlushCompactionCount`: عدد Compaction عند تشغيل آخر تفريغ

المخزن آمن للتحرير، لكن Gateway هو المرجع: قد يعيد كتابة الإدخالات أو يعيد ترطيبها أثناء تشغيل الجلسات.

---

## بنية سجل المحادثة (`*.jsonl`)

تُدار سجلات المحادثة بواسطة `SessionManager` في `@mariozechner/pi-coding-agent`.

الملف بصيغة JSONL:

- السطر الأول: ترويسة الجلسة (`type: "session"`، ويتضمن `id`، و`cwd`، و`timestamp`، و`parentSession` اختياريًا)
- ثم: إدخالات جلسة تحتوي على `id` + `parentId` (شجرة)

أنواع إدخالات بارزة:

- `message`: رسائل المستخدم/المساعد/نتيجة الأداة
- `custom_message`: رسائل محقونة من الامتداد _تدخل_ سياق النموذج (يمكن إخفاؤها من واجهة المستخدم)
- `custom`: حالة امتداد _لا تدخل_ سياق النموذج
- `compaction`: ملخص Compaction محفوظ يتضمن `firstKeptEntryId` و`tokensBefore`
- `branch_summary`: ملخص محفوظ عند التنقل في فرع شجري

لا تقوم OpenClaw عمدًا بـ "تصحيح" سجلات المحادثة؛ يستخدم Gateway `SessionManager` لقراءتها/كتابتها.

---

## نوافذ السياق مقابل الرموز المتتبعة

هناك مفهومان مختلفان مهمان:

1. **نافذة سياق النموذج**: حد صارم لكل نموذج (الرموز المرئية للنموذج)
2. **عدّادات مخزن الجلسات**: إحصاءات متحركة تُكتب في `sessions.json` (تُستخدم في /status ولوحات المعلومات)

إذا كنت تضبط الحدود:

- تأتي نافذة السياق من كتالوج النماذج (ويمكن تجاوزها عبر الإعدادات).
- `contextTokens` في المخزن قيمة تقديرية/إبلاغية وقت التشغيل؛ لا تتعامل معها كضمان صارم.

للمزيد، راجع [/token-use](/ar/reference/token-use).

---

## Compaction: ما هو

يلخص Compaction المحادثة الأقدم في إدخال `compaction` محفوظ في سجل المحادثة ويبقي الرسائل الحديثة كما هي.

بعد Compaction، ترى المنعطفات المستقبلية:

- ملخص Compaction
- الرسائل بعد `firstKeptEntryId`

Compaction **دائم** (على عكس تقليم الجلسات). راجع [/concepts/session-pruning](/ar/concepts/session-pruning).

## حدود أجزاء Compaction وإقران الأدوات

عندما يقسم OpenClaw نصًا طويلًا إلى أجزاء Compaction، فإنه يبقي
استدعاءات أدوات المساعد مقترنة بإدخالات `toolResult` المطابقة لها.

- إذا وقع تقسيم حصة الرموز بين استدعاء أداة ونتيجته، ينقل OpenClaw
  الحد إلى رسالة استدعاء الأداة من المساعد بدلًا من فصل
  الزوج.
- إذا كانت كتلة نتيجة أداة لاحقة ستدفع الجزء إلى تجاوز الهدف،
  يحافظ OpenClaw على كتلة الأداة المعلقة تلك ويبقي الذيل غير الملخص
  كما هو.
- لا تبقي كتل استدعاء الأدوات المجهضة/ذات الخطأ التقسيم المعلق مفتوحًا.

---

## متى يحدث Compaction التلقائي (وقت تشغيل Pi)

في وكيل Pi المضمن، يتم تشغيل Compaction التلقائي في حالتين:

1. **استرداد التجاوز**: يعيد النموذج خطأ تجاوز السياق
   (`request_too_large`, `context length exceeded`, `input exceeds the maximum
number of tokens`, `input token count exceeds the maximum number of input
tokens`, `input is too long for the model`, `ollama error: context length
exceeded`، ومتغيرات مشابهة بصياغة الموفر) ← ضغط ← إعادة المحاولة.
2. **صيانة العتبة**: بعد دورة ناجحة، عندما:

`contextTokens > contextWindow - reserveTokens`

حيث:

- `contextWindow` هي نافذة سياق النموذج
- `reserveTokens` هي مساحة احتياطية محجوزة للمطالبات + خرج النموذج التالي

هذه هي دلالات وقت تشغيل Pi (يستهلك OpenClaw الأحداث، لكن Pi يقرر متى يضغط).

يمكن لـ OpenClaw أيضًا تشغيل Compaction محلي استباقي قبل فتح التشغيل التالي
عندما يكون `agents.defaults.compaction.maxActiveTranscriptBytes` مضبوطًا ويصل
ملف النص النشط إلى ذلك الحجم. هذا حاجز لحجم الملف لتكلفة إعادة الفتح المحلية،
وليس أرشفة خامًا: لا يزال OpenClaw يشغل Compaction الدلالي العادي،
ويتطلب `truncateAfterCompaction` كي يصبح الملخص المضغوط نصًا لاحقًا
جديدًا.

بالنسبة إلى تشغيلات Pi المضمنة، يضيف `agents.defaults.compaction.midTurnPrecheck.enabled: true`
حارس حلقة أدوات اختياريًا. بعد إلحاق نتيجة أداة وقبل استدعاء النموذج
التالي، يقدر OpenClaw ضغط المطالبة باستخدام منطق الميزانية الاستباقية نفسه
المستخدم عند بداية الدورة. إذا لم يعد السياق مناسبًا، لا يضغط الحارس
داخل خطاف `transformContext` الخاص بـ Pi. بل يرفع إشارة فحص مسبق وسط الدورة
منظمة، ويوقف إرسال المطالبة الحالي، ويترك حلقة التشغيل الخارجية تستخدم
مسار الاسترداد القائم: اقتطاع نتائج الأدوات كبيرة الحجم عندما يكون ذلك كافيًا،
أو تشغيل وضع Compaction المكوّن وإعادة المحاولة. الخيار معطل افتراضيًا
ويعمل مع وضعي Compaction `default` و`safeguard`، بما في ذلك Compaction
الحماية المدعوم بموفر.
هذا مستقل عن `maxActiveTranscriptBytes`: يعمل حاجز حجم البايت قبل فتح
دورة، بينما يعمل الفحص المسبق وسط الدورة لاحقًا في حلقة أدوات Pi المضمنة
بعد إلحاق نتائج أدوات جديدة.

---

## إعدادات Compaction (`reserveTokens`, `keepRecentTokens`)

توجد إعدادات Compaction الخاصة بـ Pi في إعدادات Pi:

```json5
{
  compaction: {
    enabled: true,
    reserveTokens: 16384,
    keepRecentTokens: 20000,
  },
}
```

يفرض OpenClaw أيضًا حدًا أدنى للأمان للتشغيلات المضمنة:

- إذا كان `compaction.reserveTokens < reserveTokensFloor`، يرفعه OpenClaw.
- الحد الأدنى الافتراضي هو `20000` رمز.
- اضبط `agents.defaults.compaction.reserveTokensFloor: 0` لتعطيل الحد الأدنى.
- إذا كان أعلى بالفعل، يتركه OpenClaw كما هو.
- يحترم `/compact` اليدوي قيمة `agents.defaults.compaction.keepRecentTokens`
  الصريحة ويحافظ على نقطة قطع الذيل الحديث في Pi. من دون ميزانية إبقاء صريحة،
  يبقى Compaction اليدوي نقطة تحقق صارمة ويبدأ السياق المعاد بناؤه من
  الملخص الجديد.
- اضبط `agents.defaults.compaction.midTurnPrecheck.enabled: true` لتشغيل
  الفحص المسبق الاختياري لحلقة الأدوات بعد نتائج الأدوات الجديدة وقبل استدعاء
  النموذج التالي. هذا مجرد مشغل؛ لا يزال توليد الملخص يستخدم مسار
  Compaction المكوّن. وهو مستقل عن `maxActiveTranscriptBytes`، الذي يمثل
  حاجزًا لحجم بايت النص النشط عند بداية الدورة.
- اضبط `agents.defaults.compaction.maxActiveTranscriptBytes` إلى قيمة بايت أو
  سلسلة مثل `"20mb"` لتشغيل Compaction محلي قبل دورة عندما يكبر النص النشط.
  لا يكون هذا الحارس نشطًا إلا عندما يكون `truncateAfterCompaction` مفعّلًا
  أيضًا. اتركه غير مضبوط أو اضبطه على `0` للتعطيل.
- عند تفعيل `agents.defaults.compaction.truncateAfterCompaction`،
  يدوّر OpenClaw النص النشط إلى ملف JSONL لاحق مضغوط بعد
  Compaction. يبقى النص الكامل القديم مؤرشفًا ومربوطًا من نقطة تحقق
  Compaction بدلًا من إعادة كتابته في مكانه.

السبب: ترك مساحة كافية لأعمال "التدبير" متعددة الدورات (مثل كتابات الذاكرة) قبل أن يصبح Compaction لا مفر منه.

التنفيذ: `ensurePiCompactionReserveTokens()` في `src/agents/pi-settings.ts`
(يُستدعى من `src/agents/pi-embedded-runner.ts`).

---

## موفرو Compaction القابلون للتوصيل

يمكن لـ Plugins تسجيل موفر Compaction عبر `registerCompactionProvider()` على واجهة API الخاصة بـ Plugin. عندما يتم ضبط `agents.defaults.compaction.provider` على معرّف موفر مسجل، يفوض امتداد الحماية التلخيص إلى ذلك الموفر بدلًا من مسار `summarizeInStages` المدمج.

- `provider`: معرّف Plugin موفر Compaction مسجل. اتركه غير مضبوط لاستخدام تلخيص LLM الافتراضي.
- يؤدي ضبط `provider` إلى فرض `mode: "safeguard"`.
- يتلقى الموفرون تعليمات Compaction نفسها وسياسة الحفاظ على المعرّفات نفسها مثل المسار المدمج.
- لا تزال الحماية تحافظ على سياق لاحقة الدورة الحديثة والدورة المقسمة بعد خرج الموفر.
- يعيد التلخيص المدمج للحماية تقطير الملخصات السابقة مع الرسائل الجديدة
  بدلًا من الحفاظ على الملخص السابق الكامل حرفيًا.
- يفعّل وضع الحماية تدقيقات جودة الملخص افتراضيًا؛ اضبط
  `qualityGuard.enabled: false` لتخطي سلوك إعادة المحاولة عند الخرج المشوه.
- إذا فشل الموفر أو أعاد نتيجة فارغة، يعود OpenClaw تلقائيًا إلى تلخيص LLM المدمج.
- يعاد رمي إشارات الإجهاض/انتهاء المهلة (ولا تُبتلع) لاحترام إلغاء المستدعي.

المصدر: `src/plugins/compaction-provider.ts`, `src/agents/pi-hooks/compaction-safeguard.ts`.

---

## الأسطح المرئية للمستخدم

يمكنك مراقبة حالة Compaction والجلسة عبر:

- `/status` (في أي جلسة دردشة)
- `openclaw status` (CLI)
- `openclaw sessions` / `sessions --json`
- الوضع المطول: `🧹 Auto-compaction complete` + عدد مرات Compaction

---

## التدبير الصامت (`NO_REPLY`)

يدعم OpenClaw دورات "صامتة" لمهام الخلفية حيث لا ينبغي للمستخدم أن يرى خرجًا وسيطًا.

العرف:

- يبدأ المساعد خرجه بالرمز الصامت الدقيق `NO_REPLY` /
  `no_reply` للإشارة إلى "لا تسلّم ردًا إلى المستخدم".
- يزيل OpenClaw هذا/يكبته في طبقة التسليم.
- كبت الرمز الصامت الدقيق غير حساس لحالة الأحرف، لذلك يُحسب كل من `NO_REPLY` و
  `no_reply` عندما تكون الحمولة كاملة هي الرمز الصامت فقط.
- هذا مخصص فقط لدورات الخلفية/عدم التسليم الحقيقية؛ وليس اختصارًا
  لطلبات المستخدم العادية القابلة للتنفيذ.

اعتبارًا من `2026.1.10`، يكبت OpenClaw أيضًا **بث المسودة/الكتابة** عندما
تبدأ قطعة جزئية بـ `NO_REPLY`، بحيث لا تسرب العمليات الصامتة خرجًا جزئيًا
في منتصف الدورة.

---

## "تفريغ الذاكرة" قبل Compaction (منفذ)

الهدف: قبل حدوث Compaction التلقائي، تشغيل دورة وكيلية صامتة تكتب حالة دائمة
إلى القرص (مثل `memory/YYYY-MM-DD.md` في مساحة عمل الوكيل) كي لا يستطيع Compaction
محو سياق حرج.

يستخدم OpenClaw نهج **التفريغ قبل العتبة**:

1. مراقبة استخدام سياق الجلسة.
2. عندما يتجاوز "عتبة لينة" (أدنى من عتبة Compaction في Pi)، شغّل توجيهًا صامتًا
   إلى الوكيل بعنوان "اكتب الذاكرة الآن".
3. استخدم الرمز الصامت الدقيق `NO_REPLY` / `no_reply` كي لا يرى المستخدم
   شيئًا.

الإعداد (`agents.defaults.compaction.memoryFlush`):

- `enabled` (افتراضيًا: `true`)
- `model` (تجاوز اختياري دقيق للموفر/النموذج لدورة التفريغ، مثل `ollama/qwen3:8b`)
- `softThresholdTokens` (افتراضيًا: `4000`)
- `prompt` (رسالة المستخدم لدورة التفريغ)
- `systemPrompt` (مطالبة نظام إضافية ملحقة لدورة التفريغ)

ملاحظات:

- تتضمن المطالبة/مطالبة النظام الافتراضية تلميح `NO_REPLY` لكبت
  التسليم.
- عند ضبط `model`، تستخدم دورة التفريغ ذلك النموذج من دون وراثة سلسلة الرجوع
  الخاصة بالجلسة النشطة، بحيث لا تعود أعمال التدبير المحلية فقط بصمت
  إلى نموذج محادثة مدفوع.
- يعمل التفريغ مرة واحدة لكل دورة Compaction (متتبع في `sessions.json`).
- يعمل التفريغ فقط لجلسات Pi المضمنة (تتخطاه خلفيات CLI).
- يتم تخطي التفريغ عندما تكون مساحة عمل الجلسة للقراءة فقط (`workspaceAccess: "ro"` أو `"none"`).
- راجع [الذاكرة](/ar/concepts/memory) لمعرفة تخطيط ملفات مساحة العمل وأنماط الكتابة.

يعرض Pi أيضًا خطاف `session_before_compact` في واجهة API الخاصة بالامتداد، لكن منطق
التفريغ في OpenClaw يعيش اليوم على جانب Gateway.

---

## قائمة تحقق استكشاف الأخطاء وإصلاحها

- مفتاح الجلسة خاطئ؟ ابدأ من [/concepts/session](/ar/concepts/session) وتأكد من `sessionKey` في `/status`.
- عدم تطابق بين المخزن والنص؟ تأكد من مضيف Gateway ومسار المخزن من `openclaw status`.
- رسائل Compaction متكررة؟ تحقق من:
  - نافذة سياق النموذج (صغيرة جدًا)
  - إعدادات Compaction (`reserveTokens` العالي جدًا بالنسبة إلى نافذة النموذج قد يسبب Compaction أبكر)
  - تضخم نتائج الأدوات: فعّل/اضبط تشذيب الجلسة
- الدورات الصامتة تتسرب؟ تأكد من أن الرد يبدأ بـ `NO_REPLY` (رمز دقيق غير حساس لحالة الأحرف) وأنك تستخدم بناءً يتضمن إصلاح كبت البث.

## مرتبط

- [إدارة الجلسة](/ar/concepts/session)
- [تشذيب الجلسة](/ar/concepts/session-pruning)
- [محرك السياق](/ar/concepts/context-engine)
