Get started

إعادة هيكلة الحالة وفق نهج قاعدة البيانات أولاً

إعادة هيكلة الحالة مع قاعدة البيانات أولاً

القرار

استخدم تخطيط SQLite من مستويين:

  • قاعدة البيانات العامة: ~/.openclaw/state/openclaw.sqlite
  • قاعدة بيانات الوكيل: قاعدة بيانات SQLite واحدة لكل وكيل لمساحة العمل المملوكة للوكيل، والنص، وVFS، والأثر، وحالة وقت التشغيل الكبيرة لكل وكيل
  • يبقى التكوين مستنداً إلى الملفات: يبقى openclaw.json خارج قاعدة البيانات. تنتقل ملفات تعريف مصادقة وقت التشغيل إلى SQLite؛ وتبقى ملفات بيانات اعتماد المزوّد الخارجي أو CLI مدارة من مالكها خارج قاعدة بيانات OpenClaw.

قاعدة البيانات العامة هي قاعدة بيانات مستوى التحكم. وهي تملك اكتشاف الوكلاء، وحالة Gateway المشتركة، والاقتران، وحالة الجهاز/العقدة، وسجلات المهام والتدفقات، وحالة Plugin، وحالة وقت تشغيل المجدول، وبيانات التعريف للنسخ الاحتياطي، وحالة الترحيل.

قاعدة بيانات الوكيل هي قاعدة بيانات مستوى البيانات. وهي تملك بيانات تعريف جلسة الوكيل، وتدفق أحداث النص، ومساحة عمل VFS أو نطاق المسودات، وآثار الأدوات، وآثار التشغيل، وبيانات التخزين المؤقت المحلية للوكيل القابلة للبحث/الفهرسة.

يوفر هذا رؤية عامة متينة واحدة من دون إجبار مساحات عمل الوكلاء الكبيرة، والنصوص، وبيانات المسودات الثنائية على الدخول في مسار كتابة Gateway المشترك.

العقد الصارم

لهذا الترحيل شكل وقت تشغيل أساسي واحد:

  • تستمر صفوف الجلسات في حفظ بيانات تعريف الجلسة فقط. يجب ألا تحفظ transcriptLocator، أو مسارات ملفات النصوص، أو مسارات JSONL الشقيقة، أو مسارات القفل، أو بيانات تعريف التقليم، أو مؤشرات توافق عصر الملفات.
  • تكون هوية النص دائماً هوية SQLite: {agentId, sessionId} إضافة إلى بيانات تعريف الموضوع الاختيارية حيث يحتاجها البروتوكول.
  • sqlite-transcript://... ليست هوية وقت تشغيل أو بروتوكول. يجب ألا تشتق الشيفرة الجديدة محددات مواقع النصوص أو تحفظها أو تمررها أو تحللها أو ترحّلها. يجب ألا يحتوي وقت التشغيل والاختبارات على محددات مواقع زائفة مطلقاً؛ يجوز للمستندات ذكر السلسلة فقط لحظرها.
  • تنتمي sessions.json القديمة، وJSONL النصوص، و.jsonl.lock، والتقليم، والاقتطاع، ومنطق مسار الجلسة القديم إلى مسار ترحيل/استيراد doctor فقط.
  • تنتمي الأسماء البديلة القديمة لتكوين الجلسة إلى ترحيل doctor فقط. لا يفسر وقت التشغيل session.idleMinutes، أو session.resetByType.dm، أو أسماء الجلسة الرئيسية البديلة عبر الوكلاء agent:main:* لوكيل آخر مكوّن.
  • هوية توجيه الجلسة حالة علائقية ذات نوع محدد. يجب أن تقرأ مسارات وقت التشغيل الساخنة وواجهة المستخدم sessions.session_scope، وsessions.account_id، وsessions.primary_conversation_id، وconversations، و session_conversations؛ ويجب ألا تحلل session_key أو تنقب في session_entries.entry_json عن هوية المزوّد إلا كظل توافق مؤقت أثناء حذف مواقع الاستدعاء القديمة.
  • علامات الرسائل المباشرة على مستوى القناة مثل dm مقابل direct هي مفردات توجيه، وليست محددات مواقع نصوص أو مقابض توافق لمخزن الملفات.
  • ينتمي تكوين معالج الخطافات القديم إلى أسطح تحذير/ترحيل doctor فقط. يجب ألا يحمّل وقت التشغيل hooks.internal.handlers؛ تعمل الخطافات عبر أدلة الخطافات المكتشفة وبيانات تعريف HOOK.md فقط.
  • يجب أن تمرر عمليات بدء وقت التشغيل، ومسارات الرد الساخنة، وCompaction، وإعادة الضبط، والاسترداد، والتشخيصات، وTTS، وخطافات الذاكرة، والوكلاء الفرعيون، وتوجيه أوامر Plugin، وحدود البروتوكول، و الخطافات {agentId, sessionId} عبر وقت التشغيل.
  • يجب أن تزرع الاختبارات صفوف نصوص SQLite وتتحقق منها عبر {agentId, sessionId}. يجب حذف الاختبارات التي تثبت فقط تمرير مسار JSONL، أو حفظ محدد موقع مقدّم من المستدعي، أو توافق ملف النص، إلا إذا كانت تغطي استيراد doctor، أو تجسيد مواد الدعم/التصحيح غير المرتبطة بالجلسة، أو شكل البروتوكول.
  • يجب ألا تقبل runEmbeddedPiAgent(...)، وتشغيلات العمال المحضّرة، والمحاولة المضمنة الداخلية محددات مواقع النصوص. فهي تفتح مدير نصوص SQLite باستخدام {agentId, sessionId} وتمرر ذلك المدير إلى جلسة الوكيل الداخلية المتوافقة مع PI، حتى لا يتمكن المستدعون القدماء من جعل المشغّل يكتب نصوص JSON/JSONL.
  • يجب أن تخزن تشخيصات المشغّل سجلات تتبع وقت التشغيل/التخزين المؤقت/الحمولة في SQLite. يجب ألا تعرض تشخيصات وقت التشغيل مقابض تجاوز ملفات JSONL أو مساعدين عامين لتصدير JSONL النصوص؛ يمكن للصادرات الموجهة للمستخدمين تجسيد آثار صريحة من صفوف قاعدة البيانات من دون تغذية أسماء الملفات مرة أخرى إلى وقت التشغيل.
  • يستخدم تسجيل التدفق الخام OPENCLAW_RAW_STREAM=1 إضافة إلى صفوف تشخيصات SQLite. ليس عقد مسجل الملفات القديم في pi-mono، أي PI_RAW_STREAM وPI_RAW_STREAM_PATH و raw-openai-completions.jsonl، جزءاً من وقت تشغيل OpenClaw أو اختباراته.
  • يجب ألا تفهرس ذاكرة QMD نصوص SQLite إلى ملفات markdown. تفهرس QMD ملفات الذاكرة المكوّنة فقط؛ ويبقى بحث نصوص الجلسات مستنداً إلى SQLite.
  • المسار الفرعي لـ QMD SDK مخصص لـ QMD فقط في الشيفرة الجديدة. تعيش مساعدين فهرسة نصوص جلسات SQLite على memory-core-host-engine-session-transcripts؛ وأي إعادة تصدير من QMD هي توافق فقط ويجب ألا تستخدمها شيفرة وقت التشغيل.
  • تعيش فهارس الذاكرة المدمجة في قاعدة بيانات الوكيل المالك. يجب ألا يعرض تكوين وقت التشغيل و عقود وقت التشغيل المحلولة memorySearch.store.path؛ يحذف doctor مفتاح التكوين القديم هذا وتمرر الشيفرة الحالية databasePath الخاصة بالوكيل داخلياً.

يجب أن يواصل عمل التنفيذ حذف الشيفرة حتى تصبح هذه العبارات صحيحة من دون استثناءات خارج حدود doctor/الاستيراد/التصدير/التصحيح.

حالة الهدف والتقدم

الهدف الصارم

  • تمتلك قاعدة بيانات SQLite عامة واحدة حالة مستوى التحكم: state/openclaw.sqlite.
  • تمتلك قاعدة بيانات SQLite واحدة لكل وكيل حالة مستوى البيانات: agents/<agentId>/agent/openclaw-agent.sqlite.
  • يبقى التكوين مستنداً إلى الملفات. لا يكون openclaw.json جزءاً من إعادة هيكلة قاعدة البيانات هذه.
  • الملفات القديمة هي مدخلات ترحيل doctor فقط.
  • لا يكتب وقت التشغيل أو يقرأ JSONL للجلسات أو النصوص كحالة نشطة مطلقاً.

حالات الهدف

  • not-started: ما زالت شيفرة وقت تشغيل عصر الملفات تكتب حالة نشطة.
  • migrating: تستطيع شيفرة doctor/الاستيراد نقل بيانات الملفات إلى SQLite.
  • dual-read: جسر مؤقت يقرأ من SQLite والملفات القديمة معاً. هذه الحالة محظورة في إعادة الهيكلة هذه إلا إذا وُثقت صراحةً على أنها مخصصة لـ doctor فقط.
  • sqlite-runtime: يقرأ وقت التشغيل ويكتب SQLite فقط.
  • clean: أزيلت واجهات برمجة تطبيقات وقت التشغيل والاختبارات القديمة، ويمنع الحارس التراجعات.
  • done: تثبت المستندات، والاختبارات، والنسخ الاحتياطي، وترحيل doctor، وفحوصات التغيير الحالة النظيفة.

الحالة الحالية

  • الجلسات: clean لوقت التشغيل. تعيش صفوف الجلسات في قاعدة البيانات لكل وكيل، وتستخدم واجهات برمجة تطبيقات وقت التشغيل {agentId, sessionId} أو {agentId, sessionKey}، و sessions.json هو إدخال قديم لـ doctor فقط.
  • النصوص: clean لوقت التشغيل. تعيش أحداث النصوص، والهويات، واللقطات، وأحداث وقت تشغيل المسار في قاعدة البيانات لكل وكيل. لم يعد وقت التشغيل يقبل محددات مواقع النصوص أو مسارات نصوص JSONL.
  • مشغّل PI المضمن: clean. تستخدم تشغيلات PI المضمنة، والعمال المحضّرون، وCompaction، وحلقات إعادة المحاولة نطاق جلسة SQLite وترفض مقابض النصوص القديمة.
  • Cron: clean لوقت التشغيل. يستخدم وقت التشغيل cron_jobs وcron_run_logs؛ وتستخدم اختبارات وقت التشغيل تسمية SQLite storeKey، وتبقى مسارات Cron من عصر الملفات في اختبارات ترحيل doctor القديمة فقط.
  • سجل المهام: clean. تعيش صفوف وقت تشغيل المهام وTask Flow في state/openclaw.sqlite؛ وحُذفت مستوردات SQLite الجانبية غير المشحونة.
  • حالة Plugin: clean. تعيش صفوف حالة/كتل Plugin في قاعدة البيانات العامة المشتركة؛ ويحرس النظام ضد مساعدين SQLite الجانبية القديمة لحالة Plugin.
  • الذاكرة: sqlite-runtime للذاكرة المدمجة وفهرسة نصوص الجلسات. تعيش جداول فهارس الذاكرة في قاعدة البيانات لكل وكيل، وتستخدم حالة ذاكرة Plugin صفوف حالة Plugin المشتركة، وتكون ملفات الذاكرة القديمة مدخلات ترحيل doctor أو محتوى مساحة عمل المستخدم.
  • النسخ الاحتياطي: sqlite-runtime. تضغط مراحل النسخ الاحتياطي لقطات SQLite، وتحذف ملحقات WAL/SHM الحية، وتتحقق من سلامة SQLite، وتسجل تشغيلات النسخ الاحتياطي في قاعدة البيانات العامة.
  • ترحيل doctor: migrating، عمداً. يستورد doctor ملفات JSON القديمة، وJSONL، ومخازن الملحقات الجانبية المتقاعدة إلى SQLite، ويسجل تشغيلات/مصادر الترحيل، ويزيل المصادر الناجحة.
  • سكربتات E2E: clean لتغطية وقت التشغيل. تكتب تهيئة Docker MCP صفوف SQLite. ينشئ سكربت Docker لسياق وقت التشغيل JSONL قديم فقط داخل بذرة ترحيل doctor ويسمي مسار فهرس الجلسات القديم صراحةً.

العمل المتبقي

  • [x] إعادة تسمية متغيرات مخزن اختبارات وقت تشغيل Cron بعيداً عن storePath إلا إذا كانت مدخلات قديمة لـ doctor. الملفات: src/cron/service.test-harness.ts, src/cron/service.runs-one-shot-main-job-disables-it.test.ts, src/cron/service/timer.regression.test.ts, src/cron/service/ops.test.ts, src/cron/service/store.test.ts, src/cron/service.heartbeat-ok-summary-suppressed.test.ts, src/cron/service.main-job-passes-heartbeat-target-last.test.ts, src/cron/store.test.ts. الإثبات: pnpm check:database-first-legacy-stores; rg -n 'storePath' src/cron --glob '!**/commands/doctor/**'.
  • [x] إزالة أو إعادة تسمية محاكيات اختبار التصدير القديمة من عصر الملفات. الملف: src/auto-reply/reply/commands-export-test-mocks.ts. الإثبات: rg -n 'resolveSessionFilePath|sessionFile|storePath|transcriptLocator' src/auto-reply/reply.
  • [x] جعل بذرة JSONL القديمة لسياق وقت تشغيل Docker واضحة بأنها مخصصة لـ doctor فقط. الملف: scripts/e2e/session-runtime-context-docker-client.ts. الإثبات: يظهر rg -n 'sessions\\.json|sessionFile|\\.jsonl' scripts/e2e/session-runtime-context-docker-client.ts فقط seedBrokenLegacySessionForDoctorMigration.
  • [x] الحفاظ على توافق أنواع Kysely المولدة بعد أي تغيير في المخطط. الملفات: src/state/openclaw-state-schema.sql, src/state/openclaw-agent-schema.sql, src/state/*generated*. الإثبات: لا تغيير في المخطط في هذه الجولة؛ pnpm db:kysely:check; pnpm lint:kysely.
  • [x] إعادة تشغيل الاختبارات المركزة للمخازن، والأوامر، والسكربتات التي تم لمسها. الإثبات: pnpm test src/cron/service/store.test.ts src/cron/store.test.ts src/cron/service.heartbeat-ok-summary-suppressed.test.ts src/cron/service.main-job-passes-heartbeat-target-last.test.ts src/cron/service.every-jobs-fire.test.ts src/cron/service.persists-delivered-status.test.ts src/cron/service.runs-one-shot-main-job-disables-it.test.ts src/cron/service/ops.test.ts src/cron/service/timer.regression.test.ts src/auto-reply/reply/commands-export-trajectory.test.ts extensions/telegram/src/thread-bindings.test.ts extensions/slack/src/monitor/message-handler/prepare.test.ts src/acp/translator.session-lineage-meta.test.ts; git diff --check.
  • [x] قبل إعلان done، تشغيل بوابة التغيير أو إثبات واسع عن بعد. الإثبات: نجح pnpm check:changed --timed -- <changed extension paths> على تشغيل Hetzner Crabbox run_3f1cabf6b25c بعد إعداد Node 24/pnpm مؤقت و توجيه مسار صريح لمساحة العمل المتزامنة بلا .git.

لا تتراجع

  • لا محددات مواقع للنصوص.
  • لا ملفات جلسات نشطة.
  • لا تركيبات اختبار JSONL مزيفة إلا في اختبارات ترحيل doctor القديمة.
  • لا وصول خام إلى SQLite حيث يُتوقع Kysely.
  • لا ترحيلات DB قديمة جديدة. لم يُشحن هذا التخطيط؛ أبقِ إصدار المخطط عند 1 ما لم توجد حاجة قوية.

افتراضات قراءة الشيفرة

لا توجد قرارات منتج لاحقة تعرقل هذه الخطة. يجب أن يمضي التنفيذ وفق هذه الافتراضات:

  • استخدم node:sqlite مباشرة واطلب وقت تشغيل Node 22+ لمسار التخزين هذا.
  • احتفظ بملف إعدادات عادي واحد فقط. لا تنقل الإعدادات أو بيانات Plugin manifests أو مساحات عمل Git إلى SQLite في إعادة الهيكلة هذه.
  • ملفات توافق وقت التشغيل غير مطلوبة. ملفات JSON وJSONL القديمة هي مدخلات ترحيل فقط. ملفات SQLite sidecars المحلية للفرع لم تُشحن قط وتُحذف بدلاً من استيرادها.
  • يتولى openclaw doctor --fix خطوة ترحيل الملفات القديمة إلى قاعدة البيانات. يجب ألا يحمل بدء تشغيل وقت التشغيل وopenclaw migrate مسارات ترقية قواعد بيانات OpenClaw القديمة.
  • يتبع توافق بيانات الاعتماد القاعدة نفسها: بيانات اعتماد وقت التشغيل تعيش في SQLite. ملفات auth-profiles.json القديمة وauth.json لكل وكيل وملفات credentials/oauth.json المشتركة هي مدخلات ترحيل doctor، ثم تُزال بعد الاستيراد.
  • حالة كتالوج النماذج المولدة مدعومة بقاعدة بيانات. يجب ألا يكتب كود وقت التشغيل agents/<agentId>/agent/models.json؛ ملفات models.json الحالية هي مدخلات doctor قديمة وتُزال بعد استيرادها إلى agent_model_catalogs.
  • يجب ألا يقوم وقت التشغيل بترحيل محددات مواقع النصوص، أو تطبيعها، أو وصلها. هوية النص النشطة هي {agentId, sessionId} في SQLite. مسارات الملفات هي مدخلات doctor قديمة فقط، ويجب أن يختفي sqlite-transcript://... من أسطح وقت التشغيل والبروتوكول والخطافات وPlugin بدلاً من معاملته كمقبض حدودي.
  • قراءات نصوص SQLite في وقت التشغيل لا تشغل ترحيلات أشكال إدخالات JSONL القديمة ولا تعيد كتابة نصوص كاملة للتوافق. يبقى تطبيع الإدخالات القديمة في أدوات doctor/الاستيراد الصريحة. يطبع doctor ملفات نصوص JSONL القديمة قبل إدراج صفوف SQLite؛ صفوف وقت التشغيل الحالية مكتوبة بالفعل بمخطط النص الحالي. يقرأ تصدير المسار/الجلسة تلك الصفوف كما هي ويجب ألا يجري ترحيلات قديمة وقت التصدير.
  • مساعدات تحليل/ترحيل نصوص JSONL القديمة مخصصة لـ doctor فقط. كود تنسيق نصوص وقت التشغيل يبني سياق نصوص SQLite الحالي فقط؛ ويتولى doctor ترقيات إدخالات JSONL القديمة قبل إدراج الصفوف.
  • حُذف مساعد بث نصوص JSONL القديم المملوك لوقت التشغيل. كود استيراد doctor يتولى قراءات الملفات القديمة الصريحة؛ وقراءات سجل جلسة وقت التشغيل تقرأ صفوف SQLite.
  • تستخدم روابط خادم تطبيق Codex قيمة OpenClaw sessionId كمفتاح معياري في مساحة أسماء حالة Plugin الخاصة بـ Codex. sessionKey هي بيانات وصفية للتوجيه/العرض ويجب ألا تستبدل معرّف الجلسة الدائم أو تعيد إحياء هوية ملف النص.
  • تتلقى محركات السياق عقد وقت التشغيل الحالي مباشرة. يجب ألا يغلّف السجل المحركات بواجهات إعادة محاولة تحذف sessionKey أو transcriptScope أو prompt؛ ويجب أن تفشل المحركات التي لا يمكنها قبول معاملات قاعدة البيانات أولاً الحالية بوضوح بدلاً من وصلها.
  • يجب أن يبقى خرج النسخ الاحتياطي ملف أرشيف واحداً. يجب أن تدخل محتويات قاعدة البيانات إلى ذلك الأرشيف كلقطات SQLite مدمجة، لا كملفات WAL sidecars حية خام.
  • البحث في النصوص مفيد لكنه غير مطلوب في أول انتقال إلى قاعدة البيانات أولاً. صمم المخطط بحيث يمكن إضافة FTS لاحقاً.
  • يجب أن يبقى تنفيذ العمال تجريبياً خلف الإعدادات بينما تستقر حدود قاعدة البيانات.

نتائج قراءة الكود

تجاوز الفرع الحالي بالفعل مرحلة إثبات الفكرة. قاعدة البيانات المشتركة موجودة، وNode node:sqlite موصول عبر مساعد وقت تشغيل صغير، والمخازن السابقة تكتب الآن إلى state/openclaw.sqlite أو قاعدة بيانات openclaw-agent.sqlite المالكة.

العمل المتبقي ليس اختيار SQLite؛ بل إبقاء الحدود الجديدة نظيفة وحذف أي واجهات ذات شكل توافق ما زالت تبدو مثل عالم الملفات القديم:

  • لم يعد storePath الخاص بالجلسة هوية وقت تشغيل أو شكل مثبت اختبار أو حقل حمولة حالة. لم تعد اختبارات وقت التشغيل والجسر تحتوي على اسم عقد storePath؛ كود doctor/الترحيل يملك تلك المفردات القديمة.
  • لم تعد كتابات الجلسة تمر عبر طابور store-writer.ts القديم داخل العملية. تستخدم كتابات ترقيعات SQLite كشف التعارض وإعادة محاولة محدودة بدلاً من ذلك.
  • ما زال لاكتشاف المسارات القديمة استخدامات ترحيل صالحة، لكن يجب أن يتوقف كود وقت التشغيل عن معاملة sessions.json وملفات نصوص JSONL كأهداف كتابة محتملة.
  • الجداول المملوكة للوكلاء تعيش في قواعد بيانات SQLite لكل وكيل. تحتفظ قاعدة البيانات العامة بصفوف السجل/مستوى التحكم؛ وهوية النص هي {agentId, sessionId} في صفوف النص لكل وكيل. يجب ألا يحفظ كود وقت التشغيل مسارات ملفات النصوص أو يرحّل محددات مواقع النصوص.
  • يستورد doctor بالفعل عدة ملفات قديمة. التنظيف المطلوب هو جعل ذلك تنفيذاً صريحاً واحداً للترحيل يستدعيه doctor، مع تقرير ترحيل دائم.

لا توجد أسئلة منتج إضافية تعيق التنفيذ.

شكل الكود الحالي

يملك الفرع بالفعل قاعدة SQLite مشتركة حقيقية:

  • أصبح الحد الأدنى لبيئة التشغيل الآن Node 22+: تتوافق package.json، وحارس تشغيل CLI، وافتراضيات المثبّت، ومحدد موقع بيئة التشغيل على macOS، وCI، ووثائق التثبيت العامة كلها على ذلك. تمت إزالة مسار توافق Node 22 القديم.
  • يفتح src/state/openclaw-state-db.ts الملف openclaw.sqlite، ويضبط WAL، وsynchronous=NORMAL، وbusy_timeout=30000، وforeign_keys=ON، ويطبّق وحدة المخطط المولّدة والمشتقة من src/state/openclaw-state-schema.sql.
  • تُولَّد أنواع جداول Kysely ووحدات مخطط وقت التشغيل من قواعد بيانات SQLite مؤقتة أُنشئت من ملفات .sql الملتزم بها؛ لم تعد شيفرة وقت التشغيل تحتفظ بنصوص مخطط منسوخة وملصوقة لقواعد البيانات العامة أو الخاصة بكل وكيل أو قواعد التقاط البروكسي.
  • تستمد مخازن وقت التشغيل أنواع الصفوف المحددة والمدرجة من واجهات Kysely DB المولّدة تلك بدلاً من محاكاة أشكال صفوف SQLite يدوياً. يبقى SQL الخام محدوداً بتطبيق المخطط، وpragmas، وDDL الخاص بالترحيل فقط.
  • دُمجت مخططات SQLite إلى user_version = 1 لأن تخطيط قاعدة البيانات هذا لم يُشحن بعد. تنشئ فاتحات وقت التشغيل المخطط الحالي فقط؛ ويبقى استيراد الملفات إلى قاعدة البيانات في شيفرة doctor، وتم حذف مساعدات ترقية قاعدة البيانات المحلية للفرع.
  • تُفرض الملكية العلائقية حيث يكون حد الملكية معيارياً: صفوف ترحيل المصدر تتسلسل من migration_runs، وحالة تسليم المهام تتسلسل من task_runs، وصفوف هوية النصوص تتسلسل من أحداث النصوص.
  • تشمل الجداول المشتركة الحالية agent_databases، وauth_profile_stores، وauth_profile_state، وplugin_state_entries، وplugin_blob_entries، وmedia_blobs, وskill_uploads، وcapture_sessions، وcapture_events، وcapture_blobs, وsandbox_registry_entries، وcron_run_logs، وcron_jobs، وcommitments, وdelivery_queue_entries، وmodel_capability_cache, وworkspace_setup_state، وnative_hook_relay_bridges, وcurrent_conversation_bindings، وplugin_binding_approvals, وtui_last_sessions، وacp_sessions، وacp_replay_sessions, وacp_replay_events، وtask_runs، وtask_delivery_state، وflow_runs, وsubagent_runs، وmigration_runs، وbackup_runs.
  • لا تحصل الحالة العشوائية المملوكة للـ Plugin على جداول نمطية مملوكة للمضيف. تستخدم الإضافات المثبّتة plugin_state_entries لحمولات JSON ذات الإصدارات و plugin_blob_entries للبايتات، مع ملكية namespace/key، وتنظيف TTL، والنسخ الاحتياطي، وسجلات ترحيل Plugin. ما زال يمكن لحالة تنسيق Plugin المملوكة للمضيف أن تملك جداول نمطية عندما يمتلك المضيف عقد الاستعلام، مثل plugin_binding_approvals.
  • ترحيلات Plugin هي ترحيلات بيانات فوق مساحات أسماء مملوكة للـ Plugin، وليست ترحيلات مخطط للمضيف. يستطيع Plugin ترحيل إدخالات الحالة/الكتل ذات الإصدارات الخاصة به عبر مزود ترحيل، ويسجل المضيف حالة المصدر/التشغيل في سجل الترحيل المعتاد. لا تتطلب تثبيتات Plugin الجديدة تغيير openclaw-state-schema.sql ما لم يكن المضيف نفسه يتولى ملكية عقد جديد عابر للإضافات.
  • يفتح src/state/openclaw-agent-db.ts agents/<agentId>/agent/openclaw-agent.sqlite، ويسجل قاعدة البيانات في قاعدة البيانات العامة، ويمتلك جداول الجلسات المحلية للوكيل، والنصوص، وVFS، والقطع الأثرية، والذاكرة المؤقتة، وفهرس الذاكرة. يقرأ اكتشاف وقت التشغيل المشترك الآن سجل agent_databases المولّد والمكتوب الأنواع بدلاً من إعادة تنفيذ ذلك الاستعلام في كل موضع استدعاء.
  • تسجل قواعد البيانات العامة والخاصة بكل وكيل صف schema_meta يتضمن دور قاعدة البيانات، وإصدار المخطط، والطوابع الزمنية، ومعرّف الوكيل لقواعد بيانات الوكلاء. يظل التخطيط عند user_version = 1 لأن مخطط SQLite هذا لم يُشحن بعد.
  • تمتلك هوية الجلسة الخاصة بكل وكيل الآن جدول جذر معيارياً sessions مفهرساً حسب session_id، مع session_key، وsession_scope، وaccount_id, وprimary_conversation_id، والطوابع الزمنية، وحقول العرض، وبيانات النموذج الوصفية، ومعرّف الحاضنة، وروابط الأصل/التفريع كأعمدة قابلة للاستعلام. session_routes هو فهرس المسار النشط الفريد من session_key إلى session_id الحالي، بحيث يمكن لمفتاح مسار أن ينتقل إلى جلسة دائمة جديدة دون جعل القراءات الساخنة تختار بين صفوف sessions.session_key مكررة. حمولة التوافق القديمة ذات الشكل session_entries.entry_json تتفرع الآن من جذر session_id الدائم عبر مفتاح أجنبي؛ ولم تعد التمثيل الوحيد على مستوى المخطط للجلسة.
  • هوية المحادثة الخارجية الخاصة بكل وكيل علائقية أيضاً: يخزن conversations هوية المزود/الحساب/المحادثة المطبّعة، ويربط session_conversations جلسة OpenClaw واحدة بمحادثة خارجية واحدة أو أكثر. يغطي ذلك جلسات الرسائل المباشرة shared-main حيث يمكن لأقران متعددين أن يتطابقوا عمداً مع جلسة واحدة دون التضليل في session_key. يفرض SQLite أيضاً التفرد لهوية المزود الطبيعية بحيث لا يمكن لنفس ثلاثية/رباعية channel/account/kind/peer/thread أن تتفرع عبر معرّفات محادثة مختلفة. يُربط أقران الرسائل المباشرة shared-main بدور participant، بحيث تستطيع جلسة OpenClaw واحدة تمثيل عدة أقران DM خارجيين دون خفض الأقران الأقدم إلى صفوف ذات صلة غامضة. ما زال sessions.primary_conversation_id يشير إلى هدف التسليم النمطي الحالي. تُفرض أعمدة التوجيه/الحالة المغلقة بقيود SQLite CHECK بدلاً من الاعتماد على اتحادات TypeScript فقط. يمحو إسقاط جلسة وقت التشغيل ظلال توجيه التوافق من session_entries.entry_json قبل تطبيق أعمدة الجلسة/المحادثة النمطية، لذلك لا تستطيع حمولات JSON القديمة إحياء أهداف التسليم. وبالمثل، يتطلب توجيه إعلان الوكيل الفرعي سياق التسليم النمطي في SQLite؛ ولم يعد يرجع إلى حقول مسار التوافق SessionEntry. يقرأ توريث التسليم الصريح في Gateway chat.send سياق التسليم النمطي في SQLite بدلاً من حقول التوافق origin/last*. وبالمثل يشتق tools.effective سياق المزود/الحساب/الخيط من صفوف التسليم/التوجيه النمطية في SQLite، وليس من ظلال إدخال الجلسة القديمة last*. يعيد سياق مطالبة حدث النظام بناء حقول channel/to/account/thread من حقول التسليم النمطية بدلاً من ظلال origin. يتجاهل مساعد deliveryContextFromSession المشترك ومحوّل الجلسة إلى المحادثة الآن SessionEntry.origin بالكامل؛ ولا يمكن إلا لحقول التسليم النمطية وصفوف المحادثة العلائقية إنشاء هوية مسار ساخنة. تزيل تسوية إدخال جلسة وقت التشغيل origin قبل حفظ entry_json أو إسقاطه، وتكتب البيانات الوصفية الواردة حقول channel/chat النمطية بالإضافة إلى صفوف محادثة علائقية بدلاً من إنشاء ظلال origin جديدة.
  • تشير أحداث النصوص، ولقطات النصوص، وأحداث وقت تشغيل المسار الآن إلى جذر sessions المعياري الخاص بكل وكيل وتتسلسل عند حذف الجلسة. تستمر صفوف هوية/تكرارية النصوص في التسلسل من صف حدث النص المحدد.
  • تستخدم فهارس نواة الذاكرة الآن جداول قاعدة بيانات وكيل صريحة memory_index_meta، وmemory_index_sources، وmemory_index_chunks، و memory_embedding_cache، مع تتبع memory_index_state لتغييرات المراجعة. تُسمى فهارس FTS/vector الجانبية الاختيارية memory_index_chunks_fts و memory_index_chunks_vec بدلاً من جداول عامة مثل meta، أو files، أو chunks, أو chunks_fts، أو chunks_vec. تحتفظ الأسماء المعيارية بشكل صف path/source الحالي وتوافق تضمين serialized embedding. هذه الجداول ذاكرة تخزين مؤقت مشتقة/بحثية، وليست تخزيناً معيارياً للنصوص؛ ويمكن حذفها وإعادة بنائها من ملفات مساحة عمل الذاكرة والمصادر المكوّنة. يؤدي فتح فهرس ذاكرة مشحون بأسماء عامة إلى ترحيل بياناته الوصفية، ومصادره، وقطعه، وذاكرة التضمين المؤقتة إلى الجداول المعيارية؛ وتُعاد بناء جداول FTS/vector المشتقة تحت أسمائها المعيارية.
  • أصبحت حالة استعادة تشغيل الوكيل الفرعي تعيش الآن في صفوف subagent_runs مشتركة ونمطية مع مفاتيح جلسات مفهرسة للابن، والطالب، والمتحكم. ملف subagents/runs.json القديم هو مُدخل ترحيل doctor فقط.
  • تعيش روابط المحادثة الحالية الآن في صفوف current_conversation_bindings مشتركة ونمطية مفهرسة حسب معرّف المحادثة المطبّع، مع أعمدة الوكيل/الجلسة الهدف، ونوع المحادثة، والحالة، والانتهاء، والبيانات الوصفية مخزنة كأعمدة علائقية بدلاً من سجل ربط معتم مكرر. يتضمن مفتاح الربط الدائم نوع المحادثة المطبّع بحيث لا يمكن لمراجع direct/group/channel أن تتصادم، ويرفض SQLite قيم نوع/حالة الربط غير الصالحة. ملف bindings/current-conversations.json القديم هو مُدخل ترحيل doctor فقط.
  • تضيف استعادة طابور التسليم الآن أعمدة طابور نمطية للقناة، والهدف، والحساب، والجلسة، وإعادة المحاولة، والخطأ، وإرسال المنصة، وحالة الاستعادة فوق JSON إعادة التشغيل. يحتفظ entry_json بحمولات إعادة التشغيل، والخطافات، وحمولة التنسيق، لكن الأعمدة النمطية هي المرجع الموثوق لتوجيه/حالة الطابور الساخنة.
  • تعيش مؤشرات استعادة آخر جلسة TUI الآن في صفوف tui_last_sessions مشتركة ونمطية مفهرسة حسب نطاق اتصال/جلسة TUI المُجزأ. ملف TUI JSON القديم هو مُدخل ترحيل doctor فقط.
  • تعيش تفضيلات TTS الافتراضية الآن في صفوف SQLite لحالة Plugin المشتركة والمفهرسة تحت Plugin speech-core. ملف settings/tts.json القديم هو مُدخل ترحيل doctor فقط؛ لم يعد وقت التشغيل يقرأ أو يكتب ملفات JSON لتفضيلات TTS، ويعيش محلل المسار القديم في وحدة ترحيل doctor.
  • تتحدث بيانات هدف السر الوصفية الآن عن المخازن بدلاً من افتراض أن كل هدف اعتماد هو ملف إعداد. يبقى openclaw.json مخزن الإعداد؛ وتستخدم أهداف ملف تعريف المصادقة صفوف SQLite النمطية auth_profile_stores مع بيانات اعتماد مشكّلة حسب المزود محفوظة كحمولات JSON.
  • لم يعد تدقيق الأسرار يمسح ملفات auth.json القديمة الخاصة بكل وكيل. يتولى doctor التحذير من ذلك الملف القديم، واستيراده، وإزالته.
  • تعيش مساعدات مسارات ملفات تعريف المصادقة القديمة الآن في شيفرة doctor القديمة. تعرض مساعدات مسارات ملفات تعريف المصادقة الأساسية هوية مخزن مصادقة SQLite ومواقع العرض، لا مسارات وقت التشغيل auth-profiles.json أو auth-state.json.
  • تفصل وحدات وقت التشغيل لاستعادة تشغيل الوكيل الفرعي وذاكرة قدرات نماذج OpenRouter الآن قارئات/كاتبات لقطات SQLite عن مساعدات استيراد JSON القديمة الخاصة بـ doctor فقط. تستخدم قدرات OpenRouter صفوف model_capability_cache العامة والنمطية تحت provider_id = "openrouter" بدلاً من كتلة ذاكرة مؤقتة معتمة واحدة أو جدول مضيف خاص بمزود. يُخزن taskName لتشغيل الوكيل الفرعي في عمود subagent_runs.task_name النمطي؛ أما نسخة payload_json فهي بيانات إعادة تشغيل/تصحيح، وليست المصدر لحقول العرض أو البحث الساخنة.
  • يطبق src/agents/filesystem/virtual-agent-fs.sqlite.ts نظام VFS مبنياً على SQLite فوق جدول vfs_entries في قاعدة بيانات الوكيل. تستخدم قراءات الدلائل، والتصديرات التكرارية، والحذف، وإعادة التسمية نطاقات بادئة مفهرسة (namespace, path) بدلاً من مسح مساحة اسم كاملة أو الاعتماد على مطابقة المسار بـ LIKE.
  • ينشئ src/agents/runtime-worker.entry.ts مخازن VFS في SQLite، وقطع أدوات أثرية، وقطع تشغيل أثرية، وذاكرة مؤقتة محددة النطاق لكل تشغيل للعاملين.
  • تعيش علامات اكتمال تمهيد مساحة العمل الآن في صفوف workspace_setup_state مشتركة ونمطية مفهرسة حسب مسار مساحة العمل المحلول بدلاً من .openclaw/workspace-state.json؛ لم يعد وقت التشغيل يقرأ أو يعيد كتابة علامة مساحة العمل القديمة، ولم تعد واجهات المساعدة تمرر مساراً زائفاً .openclaw/setup-state فقط لاشتقاق هوية التخزين.
  • تعيش موافقات exec الآن في صف singleton exec_approvals_config النمطي والمشترك في SQLite. يستورد doctor الملف القديم ~/.openclaw/exec-approvals.json؛ لم تعد كتابات وقت التشغيل تنشئ ذلك الملف أو تعيد كتابته أو تبلغ عنه كموقع مخزنها النشط. يقرأ الرفيق على macOS ويكتب صف الجدول نفسه في state/openclaw.sqlite؛ ولا يحتفظ على القرص إلا بمقبس مطالبة Unix لأن ذلك IPC، وليس حالة تشغيل دائمة.
  • تفصل وحدات هوية الجهاز، ومصادقة الجهاز، وتمهيد وقت التشغيل الآن قارئات/كاتبات لقطات SQLite عن مساعدات استيراد JSON القديمة الخاصة بـ doctor فقط. تستخدم هوية الجهاز صفوف device_identities النمطية وتستخدم رموز مصادقة الجهاز صفوف device_auth_tokens النمطية. توفّق كتابات مصادقة الجهاز الصفوف حسب الجهاز/الدور بدلاً من اقتطاع جدول الرموز، ولم يعد وقت التشغيل يوجّه تحديثات الرمز الواحد عبر محوّل المخزن الكامل القديم. القديم توجد حمولات JSON من الإصدار 1 فقط كأشكال استيراد/تصدير خاصة بـ doctor.
  • تستخدم ذاكرة التخزين المؤقت لتبادل رمز GitHub Copilot جدول حالة Plugin المشترك في SQLite ضمن github-copilot/token-cache/default. إنها حالة ذاكرة تخزين مؤقت مملوكة للموفر، ولذلك فهي لا تضيف عمدا جدول مخطط مضيف.
  • لم يعد GitHub Copilot Compaction يكتب ملفات جانبية لمساحة العمل باسم openclaw-compaction-*.json. يستدعي الحاضن RPC الخاص بـ SDK history compaction لجلسة SDK المتتبعة، ويحفظ OpenClaw حالة الجلسة/النص الدائمة في SQLite بدلا من ملفات علامات التوافق.
  • يستخدم وقت تشغيل Swift المشترك (OpenClawKit) صفوف state/openclaw.sqlite نفسها لهوية الجهاز ومصادقة الجهاز. تستورد مساعدات تطبيق macOS مساعدات SQLite المشتركة بدلا من امتلاك مسار JSON أو SQLite ثان. يمنع ملف قديم متبق identity/device.json إنشاء الهوية حتى يستورده doctor إلى SQLite، بما يطابق بوابة بدء تشغيل TypeScript وAndroid.
  • تستخدم هوية جهاز Android مادة المفاتيح المتوافقة نفسها مع TypeScript والمخزنة في صفوف state/openclaw.sqlite#table/device_identities ذات الأنواع. لا تقرأ ولا تكتب أبدا openclaw/identity/device.json؛ يمنع ملف قديم متبق بدء التشغيل حتى يستورده doctor إلى SQLite.
  • تستخدم رموز مصادقة الجهاز المخزنة مؤقتا في Android أيضا صفوف state/openclaw.sqlite#table/device_auth_tokens ذات الأنواع، وتشارك دلالات رمز الإصدار 1 نفسها مع TypeScript وSwift. لم يعد وقت التشغيل يقرأ مفاتيح توافق SecurePrefs gateway.deviceToken*؛ فهذه تخص منطق الترحيل/doctor فقط.
  • يستخدم سجل الحزم الحديثة لإشعارات Android صفوف android_notification_recent_packages ذات الأنواع. لم يعد وقت التشغيل يرحل أو يقرأ مفاتيح CSV القديمة في SharedPreferences.
  • يفشل إنشاء هوية الجهاز بإغلاق آمن عندما يوجد identity/device.json قديم، أو عندما يكون صف هوية SQLite غير صالح، أو عندما يتعذر فتح مخزن هوية SQLite. يستورد doctor ذلك الملف ويزيله أولا، لذلك لا يمكن لبدء تشغيل وقت التشغيل تدوير هوية الاقتران بصمت قبل الترحيل.
  • اختيار هوية الجهاز هو مفتاح صف في SQLite، وليس محدد موقع ملف JSON. تمرر الاختبارات ومساعدات Gateway مفاتيح هوية صريحة؛ ولا يعرف اسم الملف المتقاعد identity/device.json إلا ترحيل doctor وبوابة بدء التشغيل ذات الإغلاق الآمن.
  • أصبح توافق إعادة تعيين الجلسة الآن ضمن ترحيل إعدادات doctor: ينقل session.idleMinutes إلى session.reset.idleMinutes, وينقل session.resetByType.dm إلى session.resetByType.direct، ولا تقرأ سياسة إعادة تعيين وقت التشغيل إلا مفاتيح إعادة التعيين القانونية.
  • أصبح توافق الإعدادات القديمة الآن ضمن src/commands/doctor/. لا يقوم تحقق readConfigFileSnapshot() العادي باستيراد كواشف doctor القديمة أو إضافة ملاحظات على المشكلات القديمة؛ يضيف runDoctorConfigPreflight() تلك المشكلات من أجل إصلاح/تقارير doctor. يستورد مسار إعدادات doctor src/commands/doctor/legacy-config.ts، ويقع إصلاح معرف ملف OAuth الشخصي القديم ضمن src/commands/doctor/legacy/oauth-profile-ids.ts.
  • لا تشغل الأوامر غير الخاصة بـ doctor إصلاح الإعدادات القديمة تلقائيا. على سبيل المثال، يفشل openclaw update --channel الآن عند وجود إعدادات قديمة غير صالحة ويطلب من المستخدم تشغيل doctor، بدلا من استيراد كود ترحيل doctor بصمت.
  • يستخدم Web push وAPNs وVoice Wake وفحوصات التحديث وصحة الإعدادات الآن جداول SQLite مشتركة ذات أنواع للاشتراكات ومفاتيح VAPID وتسجيلات العقد وصفوف المشغلات وصفوف التوجيه وحالة إشعار التحديث وإدخالات صحة الإعدادات بدلا من كتل JSON مبهمة كاملة. أصبحت كتابات لقطات Web push وAPNs الآن توفق الاشتراكات/التسجيلات حسب المفتاح الأساسي بدلا من مسح جداولها؛ وتفعل صحة الإعدادات الشيء نفسه حسب مسار الإعدادات. تحتفظ وحدات وقت التشغيل الخاصة بها بقراء/كتاب لقطات SQLite منفصلين عن مساعدات استيراد JSON القديمة الخاصة بـ doctor فقط.
  • تستخدم إعدادات مضيف Node الآن صفا وحيدا ذا نوع في قاعدة بيانات SQLite المشتركة؛ يستورد doctor ملف node.json القديم قبل الاستخدام العادي لوقت التشغيل.
  • يستخدم اقتران الجهاز/العقدة، واقتران القنوات، وقوائم السماح للقنوات، وحالة التمهيد الآن صفوف SQLite ذات أنواع بدلا من كتل JSON مبهمة كاملة. تتبع موافقات ربط Plugin وحالة مهام Cron الفصل نفسه: تعرض وحدات وقت التشغيل عمليات مدعومة بـ SQLite ومساعدات لقطات محايدة، وتقوم كتابات لقطات الاقتران/التمهيد بالإضافة إلى موافقات ربط Plugin بتوفيق الصفوف حسب المفتاح الأساسي بدلا من اقتطاع الجداول، بينما يستورد doctor ملفات JSON القديمة ويزيلها من خلال وحدات src/commands/doctor/legacy/*.
  • أصبحت سجلات Plugin المثبتة الآن في فهرس Plugin المثبت في SQLite. لم تعد قراءة/كتابة إعدادات وقت التشغيل ترحل أو تحفظ بيانات الإعدادات المؤلفة القديمة plugins.installs؛ يستورد doctor شكل الإعدادات القديم هذا إلى SQLite قبل الاستخدام العادي لوقت التشغيل.
  • أصبحت لقطات استرداد اعتماد QQBot الآن في حالة Plugin ضمن SQLite تحت qqbot/credential-backups. لم يعد وقت التشغيل يكتب qqbot/data/credential-backup*.json؛ يستورد عقد doctor الخاص بـ QQBot ملفات النسخ الاحتياطي القديمة هذه من دليل الحالة النشط ويؤرشفها.
  • تقارن خطة إعادة تحميل Gateway لقطات فهرس Plugin المثبت في SQLite ضمن مساحة أسماء فروق داخلية installedPluginIndex.installRecords.*. لم تعد قرارات إعادة تحميل وقت التشغيل تلف تلك الصفوف داخل كائنات إعدادات زائفة plugins.installs.
  • لم تعد ترقية اعتماد حساب Matrix المسمى تحدث أثناء قراءات وقت التشغيل. يمتلك doctor إعادة تسمية credentials/matrix/credentials.json القديمة ذات المستوى الأعلى عندما يمكن حل حساب Matrix واحد/افتراضي.
  • لم تعد وحدات الاقتران الأساسية ووحدات وقت تشغيل Cron تصدر منشئات مسارات JSON القديمة. تنشئ الوحدات القديمة المملوكة لـ doctor مسارات مصادر pending.json وpaired.json وbootstrap.json وcron/jobs.json لاختبارات الاستيراد والترحيل فقط. تقع تسوية شكل مهمة Cron القديمة واستيراد سجل تشغيل Cron ضمن src/commands/doctor/legacy/cron*.ts.
  • يستورد src/commands/doctor/legacy/runtime-state.ts ملفات حالة JSON القديمة، بما في ذلك إعدادات مضيف العقدة، إلى SQLite من doctor. تبقى مستوردات الملفات القديمة الجديدة ضمن src/commands/doctor/legacy/.
  • يستورد src/commands/doctor/state-migrations.ts ملفات sessions.json القديمة ونصوص *.jsonl مباشرة إلى SQLite ويزيل المصادر الناجحة. لم يعد يمرر نصوص الجذر القديمة عبر agents/<agentId>/sessions/*.jsonl أو ينشئ هدف JSONL قانونيا قبل الاستيراد.
  • لم تعد فحوصات doctor لسلامة الحالة تفحص أدلة الجلسات القديمة أو تعرض حذف JSONL اليتيم. ملفات النصوص القديمة هي مدخلات ترحيل فقط، وتمتلك خطوة الترحيل الاستيراد بالإضافة إلى إزالة المصدر.
  • يقع استيراد سجل sandbox القديم ضمن src/commands/doctor/legacy/sandbox-registry.ts؛ وتبقى قراءات وكتابات سجل sandbox النشط مقتصرة على SQLite.
  • يقع إصلاح صحة/استيراد نص الجلسة القديم ضمن src/commands/doctor/legacy/session-transcript-health.ts؛ لم تعد وحدات أوامر وقت التشغيل تحمل تحليل نصوص JSONL أو كود إصلاح الفرع النشط.

أبرز عمليات الدمج/الحذف المكتملة:

  • تستخدم حالة Plugin الآن قاعدة البيانات المشتركة state/openclaw.sqlite. تمت إزالة مستورد الملف الجانبي القديم الخاص بالفرع المحلي plugin-state/state.sqlite لأن تخطيط SQLite ذلك لم يُشحن قط. تُبلغ مساعدات الفحص/الاختبار عن databasePath المشتركة بدلًا من كشف مسار SQLite خاص بحالة Plugin.
  • أصبحت جداول وقت تشغيل المهام وTask Flow الآن في قاعدة البيانات المشتركة state/openclaw.sqlite بدلًا من tasks/runs.sqlite و tasks/flows/registry.sqlite؛ وأُزيلت مستوردات الملفات الجانبية القديمة للسبب نفسه المتعلق بتخطيط لم يُشحن.
  • لم يعد src/config/sessions/store.ts يحتاج إلى storePath لبيانات التعريف الواردة، أو تحديثات المسار، أو قراءات وقت التحديث. يستخدم استمرار الأوامر، وتنظيف جلسات CLI، وعمق الوكيل الفرعي، وتجاوزات المصادقة، وهوية جلسة النص APIs صفوف الوكيل/الجلسة. تُطبّق الكتابات كتصحيحات صفوف SQLite مع إعادة محاولة عند تعارض تفاؤلي.
  • يعرض حل هدف الجلسة الآن أهداف قواعد بيانات لكل وكيل، وليس مسارات sessions.json القديمة. تعدّد Gateway المشتركة، وبيانات ACP التعريفية، وإصلاح مسار doctor، وopenclaw sessions عناصر agent_databases إضافة إلى الوكلاء المهيّأين.
  • يستخدم توجيه جلسة Gateway الآن resolveGatewaySessionDatabaseTarget؛ يحمل الهدف المُعاد databasePath ومفاتيح صفوف SQLite المرشحة بدلًا من مسار ملف مخزن جلسات قديم.
  • تعرض أنواع وقت تشغيل جلسات القنوات الآن {agentId, sessionKey} لقراءات وقت التحديث، وبيانات التعريف الواردة، وتحديثات آخر مسار. تمت إزالة نوع التوافق القديم saveSessionStore(storePath, store).
  • توجه أسطح وقت تشغيل Plugin وAPI الإضافة ومسطح barrel الخاص بـ config/sessions كود Plugin إلى مساعدات صفوف الجلسات المدعومة بـ SQLite. تبقى صادرات توافق مكتبة الجذر (loadSessionStore, saveSessionStore, resolveStorePath) كواجهات توافق مهملة للمستهلكين الحاليين. أُزيل المساعد القديم resolveLegacySessionStorePath؛ وأصبح بناء مسار sessions.json القديم محليًا في الترحيل وتجهيزات الاختبار.
  • يخزن src/config/sessions/session-entries.sqlite.ts الآن إدخالات الجلسات الأساسية في قاعدة بيانات كل وكيل، ويدعم تصحيح القراءة/الإضافة أو التحديث/الحذف على مستوى الصف. لم تعد عمليات الإضافة أو التحديث/التصحيح/الحذف في وقت التشغيل تفحص اختلافات حالة الأحرف أو تزيل مفاتيح الأسماء البديلة القديمة؛ يتولى doctor التوحيد القياسي. تمت إزالة مساعد استيراد JSON المستقل، وتدمج عملية الترحيل الصفوف الأحدث عبر الإضافة أو التحديث بدلًا من استبدال جدول الجلسات بالكامل. تعرض مساعدات القراءة/السرد/التحميل العامة بيانات تعريف الجلسات النشطة من صفوف sessions وconversations ذات الأنواع؛ ويُعد entry_json ظل توافق/تصحيح وقد يكون قديمًا أو غير صالح دون فقدان هوية الجلسة ذات النوع أو سياق التسليم.
  • يحل src/config/sessions/delivery-info.ts الآن سياق التسليم من صفوف sessions + conversations + session_conversations ذات الأنواع في قاعدة بيانات كل وكيل. لم يعد يعيد بناء هوية التسليم في وقت التشغيل من session_entries.entry_json؛ ويُعد غياب صف محادثة ذي نوع مشكلة ترحيل/إصلاح في doctor، لا مسار تراجع في وقت التشغيل.
  • تفضل قرارات إعادة ضبط الجلسات المخزنة الآن بيانات تعريف sessions.session_scope و sessions.chat_type وsessions.channel ذات الأنواع. يبقى تحليل sessionKey فقط للواحق السلاسل/المواضيع الصريحة على أهداف الأوامر؛ ولم يعد تصنيف إعادة الضبط بين المجموعة والمباشر يأتي من شكل المفتاح.
  • يستخدم تصنيف عرض قائمة/حالة الجلسات الآن بيانات تعريف الدردشة ذات الأنواع ونوع جلسة Gateway. لم يعد يتعامل مع السلاسل الفرعية :group: أو :channel: داخل session_key كحقيقة دائمة عن المجموعة/المباشر.
  • يستخدم اختيار سياسة الرد الصامت الآن نوع المحادثة الصريح أو بيانات تعريف السطح فقط. لم يعد يخمن سياسة المباشر/المجموعة من السلاسل الفرعية في session_key.
  • يتلقى حل نموذج عرض الجلسة الآن معرف الوكيل من هدف قاعدة بيانات جلسة SQLite بدلًا من استخراجه عبر تقسيم session_key.
  • يستخدم إكمال هدف إعلان وكيل إلى وكيل الآن deliveryContext الخاص بـ sessions.list ذي النوع فقط. لم يعد يستعيد توجيه القناة/الحساب/السلسلة من origin القديمة، أو حقول last* المنعكسة، أو شكل session_key.
  • يقرأ رفض هدف السلسلة في sessions_send الآن بيانات تعريف توجيه SQLite ذات الأنواع. لم يعد يرفض الأهداف أو يقبلها عبر تحليل لواحق السلاسل من مفتاح الهدف.
  • يقرأ تحقق سياسة الأدوات ذات نطاق المجموعة الآن توجيه محادثة SQLite ذا النوع للجلسة الحالية أو المنشأة. لم يعد يثق بهوية المجموعة/القناة عبر فك ترميز sessionKey؛ وتُسقط معرفات المجموعة المقدمة من المستدعي عندما لا يوجد صف جلسة ذو نوع يثبت صحتها.
  • تستخدم مطابقة تجاوز نموذج القناة الآن بيانات تعريف المجموعة والمحادثة الأصل الصريحة. لم تعد تفك ترميز معرفات المحادثة الأصل من parentSessionKey.
  • يتطلب توريث تجاوزات النموذج المخزنة الآن مفتاح جلسة أصل صريحًا من سياق الجلسة ذي النوع. لم يعد يشتق تجاوزات الأصل من لواحق :thread: أو :topic: في sessionKey.
  • أُزيل غلاف معلومات سلسلة الجلسة القديم ومحلل سلاسل Plugin المحمل؛ لم يعد أي كود وقت تشغيل يستورد config/sessions/thread-info.
  • لم يعد مساعد محادثة القناة يعرض جسور تحليل مفتاح الجلسة الكامل. ما زال core يطبع معرفات المحادثة الخام المملوكة للمزود عبر resolveSessionConversation(...)، لكنه لا يعيد بناء حقائق المسار من sessionKey.
  • لم يعد تسليم الإكمال، وسياسة الإرسال، وصيانة المهام تشتق نوع الدردشة من شكل session_key. حُذف محلل مفتاح نوع الدردشة القديم؛ وتتطلب هذه المسارات بيانات تعريف جلسة ذات نوع، أو سياق تسليم ذا نوع، أو مفردات هدف تسليم صريحة.
  • لم تعد قائمة/حالة الجلسات، والتشخيصات، وربط حساب الموافقة، وتصفية Heartbeat في TUI، وملخصات الاستخدام تستخرج توجيه المزود/الحساب/السلسلة/العرض من SessionEntry.origin. قراءات origin الوحيدة المتبقية في وقت التشغيل هي مفاهيم غير مرتبطة بالجلسات أو كائنات تسليم الدور الحالي.
  • يقرأ بحث المحادثة الأصلية لطلب الموافقة الآن صفوف توجيه الجلسة ذات الأنواع لكل وكيل. لم يعد يحلل هوية محادثة القناة/المجموعة/السلسلة من sessionKey؛ وغياب بيانات التعريف ذات النوع مشكلة ترحيل/إصلاح.
  • لم تعد حمولات أحداث تغيّر جلسة Gateway/الدردشة/الجلسة تكرر SessionEntry.origin أو ظلال مسارات last*؛ يتلقى العملاء channel وchatType وdeliveryContext ذات الأنواع.
  • يمكن لحل تسليم Heartbeat الآن تلقي deliveryContext الخاص بـ SQLite ذي النوع مباشرة، ويمرر وقت تشغيل Heartbeat صف تسليم جلسة كل وكيل بدلًا من الاعتماد على ظلال session_entries التوافقية للتوجيه الحالي.
  • يحل Cron أيضًا هدف تسليم الوكيل المعزول عبر إكمال مساره الحالي من صف تسليم الجلسة ذي النوع لكل وكيل قبل الرجوع إلى حمولة إدخال التوافق.
  • يمرر حل أصل إعلان الوكيل الفرعي الآن سياق تسليم جلسة الطالب ذا النوع عبر loadRequesterSessionEntry ويفضل ذلك الصف على ظلال التوافق last*/deliveryContext.
  • تدمج تحديثات بيانات تعريف الجلسة الواردة الآن أولًا مع صف التسليم ذي النوع لكل وكيل؛ وتكون حقول تسليم SessionEntry القديمة مجرد خيار تراجع عندما لا يوجد صف محادثة ذو نوع.
  • يسمح استخراج تسليم إعادة التشغيل/التحديث الآن لـ threadId في تسليم SQLite ذي النوع بأن يتغلب على أجزاء الموضوع/السلسلة المحللة من sessionKey؛ ولا يُستخدم التحليل إلا كتراجع للمفاتيح القديمة ذات شكل السلسلة.
  • تفضل معرفات قناة سياق وكيل الخطاف الآن هوية محادثة SQLite ذات النوع، ثم بيانات تعريف الرسالة الصريحة. لم تعد تحلل أجزاء المزود/المجموعة/القناة من sessionKey.
  • يقرأ توريث المسار الخارجي لـ chat.send في Gateway الآن بيانات تعريف توجيه جلسة SQLite ذات الأنواع بدلًا من استنتاج نطاق القناة/المباشر/المجموعة من أجزاء sessionKey. لا ترث الجلسات ذات نطاق القناة إلا عندما تطابق قناة الجلسة ذات النوع ونوع الدردشة سياق التسليم المخزن؛ وتحتفظ جلسات المشترك الرئيسي بقاعدة CLI/لا بيانات تعريف عميل الأشد.
  • يقرأ إيقاظ حارس إعادة التشغيل وتوجيه المتابعة الآن صفوف تسليم/توجيه SQLite ذات الأنواع قبل وضع إيقاظات Heartbeat أو متابعات أدوار الوكيل الموجهة في الطابور. لم يعد يعيد بناء سياق التسليم من ظل JSON الخاص بإدخال الجلسة.
  • يقرأ حل سياق tools.effective في Gateway الآن صفوف تسليم/توجيه SQLite ذات الأنواع لمدخلات المزود، والحساب، والهدف، والسلسلة، ووضع الرد. لم يعد يستعيد حقول التوجيه النشطة تلك من ظلال أصل session_entries.entry_json القديمة.
  • يحل توجيه استشارة الصوت الفوري الآن تسليم الأصل/المكالمة من صفوف جلسات SQLite ذات الأنواع لكل وكيل. لم يعد يرجع إلى ظلال توافق SessionEntry.deliveryContext عند اختيار مسار رسالة الوكيل المضمنة.
  • يقرأ ترحيل Heartbeat الخاص بإنشاء ACP وتوجيه بث الأصل الآن تسليم الأصل من صفوف جلسات SQLite ذات الأنواع. لم يعودا يعيدان بناء سياق تسليم الأصل من ظلال إدخالات الجلسات التوافقية.
  • يتبع حفظ مسار تسليم الجلسة الآن بيانات تعريف الدردشة ذات الأنواع وأعمدة التسليم المستمرة. لم يعد يستخرج تلميحات القناة، أو علامات المباشر/الرئيسي، أو شكل السلسلة من sessionKey؛ ولا ترث مسارات دردشة الويب الداخلية هدفًا خارجيًا إلا عندما يحتوي SQLite مسبقًا على هوية تسليم ذات نوع/مستمرة للجلسة.
  • يقرأ استخراج تسليم الجلسة العام الآن صف تسليم جلسة SQLite ذي النوع المطابق فقط. لم يعد يحلل لواحق السلسلة/الموضوع أو يتراجع من مفتاح ذي شكل سلسلة إلى مفتاح جلسة أساسي.
  • يستخدم إرسال الرد، واسترداد حارس إعادة التشغيل، وتوجيه استشارة الصوت الفوري الآن صفوف جلسة/محادثة SQLite ذات الأنواع المطابقة لتوجيه السلاسل. لم تعد تستعيد معرفات السلاسل أو سياق تسليم الجلسة الأساسية عبر تحليل مفاتيح الجلسات ذات شكل السلسلة.
  • يستخدم تحديد سجل Pi المضمن الآن إسقاط توجيه جلسة SQLite ذا النوع (sessions + conversations الأساسية) للمزود، ونوع الدردشة، وهوية النظير. لم يعد يحلل المزود، أو الرسائل المباشرة، أو المجموعة، أو شكل السلسلة من sessionKey.
  • يستخدم استنتاج تسليم أداة Cron الآن التسليم الصريح أو سياق التسليم الحالي ذي النوع فقط. لم يعد يفك ترميز أهداف القناة أو النظير أو الحساب أو السلسلة من agentSessionKey.
  • لم تعد صفوف جلسات وقت التشغيل تحمل الاسم البديل القديم للمسار lastProvider. تستخدم المساعدات والاختبارات حقلي lastChannel وdeliveryContext ذوي النوع؛ وترحيل doctor هو المكان الوحيد الذي ينبغي أن يترجم أسماء المسارات البديلة الأقدم أو ظلال origin المستمرة.
  • تكتب أحداث النص، وصفوف VFS، وصفوف آثار الأدوات الآن إلى قاعدة بيانات كل وكيل. أُزيل جدول ربط ملفات النصوص العام الذي لم يُشحن؛ ويسجل doctor مسارات المصدر القديمة في صفوف ترحيل دائمة بدلًا من ذلك.
  • لم يعد بحث النص في وقت التشغيل يفحص إزاحات بايت JSONL أو يتحقق من ملفات النصوص القديمة. تقرأ مسارات دردشة/وسائط/سجل Gateway صفوف النصوص من SQLite؛ وأصبح JSONL الخاص بالجلسة الآن إدخالًا قديمًا لـ doctor فقط، وليس حالة وقت تشغيل أو تنسيق تصدير.
  • تستخدم علاقات أصل النص وفرعه بيانات تعريف منظمة parentTranscriptScope: {agentId, sessionId} في رؤوس نصوص SQLite، وليس سلاسل تحديد مواقع شبيهة بالمسارات agent-db:...transcript_events....
  • لم يعد عقد مدير النصوص يعرض منشئات create(cwd) أو continueRecent(cwd) المستمرة الضمنية. تُفتح مديرات النصوص المستمرة بنطاق صريح {agentId, sessionId}؛ وتبقى المديريات داخل الذاكرة فقط بلا نطاق للاختبارات وتحويلات النصوص الصرفة.
  • تحل APIs مخزن النصوص في وقت التشغيل نطاق SQLite، لا مسارات نظام الملفات. أُزيل المساعد القديم resolve...ForPath وخيارات كتابة transcriptPath غير المستخدمة من مستدعي وقت التشغيل.
  • يستخدم حل جلسة وقت التشغيل الآن {agentId, sessionId} ويجب ألا يشتق سلاسل sqlite-transcript://<agent>/<session> للحدود الخارجية. مسارات JSONL المطلقة القديمة هي مدخلات ترحيل doctor فقط.
  • أصبحت سجلات الجسر المباشر لترحيل الخطاف الأصلي الآن في صفوف native_hook_relay_bridges المشتركة ذات الأنواع والمفهرسة بمعرف الترحيل. لم يعد وقت التشغيل يكتب سجل JSON في /tmp أو سجلات عامة معتمة لتلك السجلات الجسرية القصيرة العمر.
  • لم يعد runEmbeddedPiAgent(...) يحتوي على معامل محدد موقع النص. تُسقط واصفات العمال المُحضّرة أيضًا محددات مواقع النصوص. تحمل حالة جلسة وقت التشغيل وتشغيلات المتابعة الموضوعة في الطابور {agentId, sessionId} بدلًا من مقابض النصوص المشتقة.
  • يأخذ Compaction المضمن الآن نطاق SQLite من agentId وsessionId. يجب ألا تتلقى خطافات Compaction، واستدعاءات محرك السياق، وتفويض CLI، وردود البروتوكول مقابض sqlite-transcript://... مشتقة. يمكن لكود التصدير/التصحيح تجسيد عناصر مستخدم صريحة من الصفوف، لكنه لا يوفر مسار تصدير JSONL عامًا للجلسة ولا يعيد أسماء الملفات إلى هوية وقت التشغيل.
  • يقرأ /export-session صفوف النص من SQLite ويكتب عرض HTML المستقل المطلوب فقط. لم يعد العارض المضمن يعيد بناء JSONL الجلسة أو ينزله من تلك الصفوف.
  • لم يعد تفويض محرك السياق يحلل محدد موقع نص لاسترداد هوية الوكيل. يحمل سياق وقت التشغيل المُحضّر agentId المحلول إلى محول Compaction المدمج.
  • أصبحت إعادة كتابة النص واقتطاع نتائج الأدوات الحية تقرأ حالة النص وتثبّتها بواسطة {agentId, sessionId} ولا تشتق محددات مواقع مؤقتة لحمولات أحداث تحديث النص.
  • لم يعد سطح مساعد حالة النص يحتوي على متغيرات readTranscriptState أو replaceTranscriptStateEvents أو persistTranscriptStateMutation القائمة على محدد الموقع. يجب على مستدعي وقت التشغيل استخدام واجهات API الخاصة بـ {agentId, sessionId}. يقرأ استيراد أداة التشخيص الملفات القديمة عبر مسار ملف صريح ويكتب صفوف SQLite؛ ولا يرحّل سلاسل محددات المواقع.
  • لم يعد عقد مدير جلسات وقت التشغيل يكشف open(locator) أو forkFrom(locator) أو setTranscriptLocator(...). يفتح مديرو الجلسات المثبتة بواسطة {agentId, sessionId} فقط؛ وتعيش مساعدات السرد/التفرع على واجهات API الخاصة بالجلسات ونقاط التحقق الموجهة بالصفوف بدلًا من واجهة مدير النص.
  • واجهات API لقارئ نصوص Gateway تعتمد النطاق أولًا. تأخذ {agentId, sessionId} ولا تقبل محدد موقع نص موضعيًا قد يتحول بالخطأ إلى هوية وقت التشغيل. انتهى تحليل محدد موقع النص النشط؛ ولا تقرأ مسارات المصدر القديمة إلا كود استيراد أداة التشخيص.
  • أحداث تحديث النص تعتمد النطاق أولًا أيضًا. لم يعد emitSessionTranscriptUpdate يقبل سلسلة محدد موقع مجردة، ويوجه المستمعون بواسطة {agentId, sessionId} دون تحليل مقبض.
  • يحل بث رسائل جلسات Gateway مفاتيح الجلسة من نطاق الوكيل/الجلسة، لا من محدد موقع نص. أزيل محلل/ذاكرة تخزين مفاتيح الجلسة القديم من محدد موقع النص إلى مفتاح الجلسة.
  • ترشح عوامل SSE لسجل جلسات Gateway التحديثات الحية حسب نطاق الوكيل/الجلسة. لم تعد توحد مرشحي محددات مواقع النصوص أو المسارات الحقيقية أو هويات النصوص ذات شكل الملفات لتقرر ما إذا كان ينبغي أن يتلقى تدفق ما تحديثًا.
  • لم تعد خطافات دورة حياة الجلسة تشتق أو تكشف محددات مواقع النصوص عند session_end. يحصل مستهلكو الخطافات على sessionId وsessionKey ومعرفات الجلسة التالية وسياق الوكيل؛ ولا تكون ملفات النص جزءًا من عقد دورة الحياة.
  • لم تعد خطافات إعادة الضبط تشتق أو تكشف محددات مواقع النصوص أيضًا. تحمل حمولة before_reset رسائل SQLite المستردة مع سبب إعادة الضبط، بينما تبقى هوية الجلسة في سياق الخطاف.
  • لم يعد ضبط حزمة اختبار الوكيل يقبل محدد موقع نص. يُنطاق إرسال إعادة الضبط بواسطة sessionId/sessionKey مع السبب.
  • لم تعد أنواع جلسات امتدادات الوكلاء تكشف transcriptLocator؛ ينبغي للامتدادات استخدام سياق الجلسة وواجهات API الخاصة بوقت التشغيل بدلًا من الوصول إلى هوية نص ذات شكل ملف.
  • لم تعد خطافات Compaction الخاصة بالإضافة تكشف محددات مواقع النصوص. يحمل سياق الخطاف هوية الجلسة بالفعل، ويجب أن تمر قراءات النص عبر واجهات API المدركة لنطاق SQLite بدلًا من مقابض ذات شكل ملفات.
  • لم تعد خطافات before_agent_finalize تكشف transcriptPath، بما في ذلك حمولات ترحيل الخطافات الأصلية. تستخدم خطافات الإنهاء سياق الجلسة فقط.
  • لم تعد ردود إعادة ضبط Gateway تصطنع محدد موقع نص على الإدخال المعاد. تنشئ إعادة الضبط صفوف نص SQLite، وتعيد إدخال الجلسة النظيف، وتترك الوصول إلى النص للقراء المدركين للنطاق.
  • لم تعد نتائج التشغيل المضمن وCompaction تعرض محددات مواقع النصوص لمحاسبة الجلسات. يحدّث Compaction التلقائي فقط sessionId النشط وعدادات Compaction وبيانات الرموز الوصفية.
  • لم تعد نتائج المحاولات المضمنة تعيد transcriptLocatorUsed، ولم تعد نتائج compact() في محرك السياق تعيد محددات مواقع النصوص. تقبل حلقات إعادة محاولة وقت التشغيل sessionId لاحقًا فقط.
  • لم تعد نتائج إلحاق نص مرآة التسليم تعيد محددات مواقع النصوص. يحصل المستدعون على messageId الملحق؛ وتستخدم إشارات تحديث النص نطاق SQLite.
  • لا تعيد مساعدات تفرع الجلسة الأم إلا sessionId المتفرع. يمرر تحضير الوكيل الفرعي نطاق الوكيل/الجلسة الابن إلى المحركات.
  • لم تعد معلمات مشغّل CLI وإعادة زرع السجل تقبل محددات مواقع النصوص. تحل قراءات سجل CLI نطاق نص SQLite من {agentId, sessionId} وسياق مفتاح الجلسة.
  • أصبحت تجهيزات اختبارات CLI والمشغّل المضمن تزرع وتقرأ صفوف نص SQLite بواسطة معرف الجلسة بدلًا من التظاهر بأن الجلسات النشطة ملفات *.jsonl أو تمرير سلسلة sqlite-transcript://... عبر معلمات وقت التشغيل.
  • تصدر أحداث حارس نتائج أدوات الجلسة من نطاق جلسة معروف حتى عندما لا يكون لدى مدير في الذاكرة محدد موقع مشتق. لم تعد اختباراته تزيّف ملفات نصوص نشطة /tmp/*.jsonl.
  • أصبحت مساعدات BTW ونقطة تحقق Compaction تقرأ وتفرع صفوف النصوص بواسطة نطاق SQLite. تخزن بيانات نقطة التحقق الوصفية الآن معرفات الجلسات ومعرفات الورقة/الإدخال فقط؛ ولم تعد محددات المواقع المشتقة تكتب في حمولات نقاط التحقق.
  • يستخدم بحث مفتاح النص في Gateway نطاق نص SQLite عند حدود البروتوكول ولم يعد يستدعي realpath أو stat لأسماء ملفات النصوص.
  • تكتب تدويرة نصوص Compaction التلقائية صفوف النص اللاحقة مباشرة عبر مخزن نصوص SQLite. تحتفظ صفوف الجلسات بهوية الجلسة اللاحقة فقط، لا بمسار JSONL دائم أو محدد موقع مثبت.
  • يستخدم Compaction المضمن في محرك السياق مساعدات تدوير نصوص مسماة وفق SQLite. لم تعد اختبارات التدوير تنشئ مسارات JSONL لاحقة أو تمثل الجلسات النشطة كملفات.
  • يربط احتفاظ الصور الصادرة المُدارة ذاكرة تخزين رسائل النص المؤقتة الخاصة به من إحصاءات نص SQLite بدلًا من استدعاءات stat لنظام الملفات.
  • أزيلت أقفال جلسات وقت التشغيل ومسار أداة التشخيص القديم المستقل .jsonl.lock.
  • لم يعد برميل وقت تشغيل Microsoft Teams وSDK العام للإضافات يعيدان تصدير مساعد قفل الملفات القديم؛ ومسارات حالة الإضافة الدائمة مدعومة بـ SQLite.
  • أزيل تقليم عمر/عدد الجلسات والتنظيف الصريح للجلسات. تتولى أداة التشخيص الاستيراد القديم؛ وتُعاد ضبط الجلسات المتقادمة أو تُحذف صراحة.
  • لم تعد فحوص سلامة أداة التشخيص تعد ملف JSONL قديمًا نصًا نشطًا صالحًا لصف جلسة SQLite. صحة النص النشط تعتمد SQLite فقط؛ وتُبلّغ ملفات JSONL القديمة كمدخلات ترحيل/تنظيف أيتام.
  • لم تعد أداة التشخيص تتعامل مع agents/<agent>/sessions/ كحالة وقت تشغيل مطلوبة. لا تمسح ذلك الدليل إلا عندما يكون موجودًا بالفعل، كمدخل استيراد قديم أو تنظيف أيتام.
  • لم تعد sessions.resolve في Gateway، ومسارات تصحيح/إعادة ضبط/ضغط الجلسات، وتفريخ الوكلاء الفرعيين، والإجهاض السريع، وبيانات ACP الوصفية، والجلسات المعزولة بواسطة Heartbeat، وترقيع TUI ترحّل أو تقلّم مفاتيح الجلسات القديمة كأثر جانبي لعمل وقت التشغيل العادي.
  • أصبح حل جلسة أمر CLI يعيد agentId المالك بدلًا من storePath، ولم يعد ينسخ صفوف الجلسة الرئيسية القديمة أثناء حل --to أو --session-id العادي. توحيد صفوف الرئيسية القديم يخص أداة التشخيص فقط.
  • لم يعد حل عمق الوكيل الفرعي في وقت التشغيل يقرأ sessions.json أو مخازن جلسات JSON5. يقرأ session_entries في SQLite بواسطة معرف الوكيل، ولا يمكن أن تدخل بيانات العمق/الجلسة الوصفية القديمة إلا عبر مسار استيراد أداة التشخيص.
  • تُثبّت تجاوزات جلسات ملف تعريف المصادقة عبر عمليات upsert مباشرة لصفوف {agentId, sessionKey} بدلًا من التحميل الكسول لوقت تشغيل مخزن جلسات ذي شكل ملف.
  • أصبحت بوابة الرد التلقائي المطوّلة ومساعدات تحديث الجلسات تقرأ/تجري upsert لصفوف جلسات SQLite حسب هوية الجلسة ولم تعد تتطلب مسار مخزن قديمًا قبل لمس حالة الصف المثبتة.
  • تستخدم مساعدات بيانات جلسة تشغيل الأوامر الوصفية الآن أسماء ومسارات وحدات موجهة بالإدخال؛ وأزيل سطح مساعد أوامر session-store القديم.
  • أصبحت زراعة ترويسة التمهيد وتقوية حدود Compaction اليدوية تعدل صفوف نص SQLite مباشرة. يمرر مستدعو وقت التشغيل هوية الجلسة، لا مسارات .jsonl قابلة للكتابة.
  • تنسخ إعادة تشغيل تدوير الجلسة الصامتة أحدث أدوار المستخدم/المساعد بواسطة {agentId, sessionId} من صفوف نص SQLite. لم تعد تقبل محددات مواقع نصوص المصدر أو الهدف.
  • لم تعد صفوف جلسات وقت التشغيل الجديدة تخزن محددات مواقع النصوص. يستخدم المستدعون {agentId, sessionId} مباشرة؛ ويمكن لأوامر التصدير/التصحيح اختيار أسماء ملفات الإخراج عند تجسيد الصفوف.
  • بدء جلسة نص مثبتة جديدة يفتح الآن دائمًا صفوف SQLite حسب النطاق. لم يعد مدير الجلسات يعيد استخدام مسار أو محدد موقع نص سابق من حقبة الملفات كهوية للجلسة الجديدة.
  • تستخدم جلسات النصوص المثبتة واجهة API الصريحة openTranscriptSessionManagerForSession({agentId, sessionId}). أزيلت واجهات SessionManager.create/openForSession/list/forkFromSession الثابتة القديمة كي لا تتمكن الاختبارات وكود وقت التشغيل من إعادة إنشاء اكتشاف جلسات حقبة الملفات بالخطأ.
  • لم يعد وقت تشغيل الإضافة يكشف api.runtime.agent.session.resolveTranscriptLocatorPath؛ يستخدم كود الإضافة مساعدات صفوف SQLite وقيم النطاق.
  • لم يعد سطح SDK العام session-store-runtime يصدر إلا مساعدات صفوف الجلسات وصفوف النصوص. تعيش مساعدات مخطط/مسار/معاملات SQLite المركزة في sqlite-runtime؛ وتبقى مساعدات الفتح/الإغلاق/إعادة الضبط الخام محلية فقط لاختبارات الطرف الأول.
  • أصبحت مصنفات أسماء ملفات المسارات/نقاط التحقق القديمة .jsonl تعيش في وحدة ملفات الجلسات القديمة الخاصة بأداة التشخيص. لم يعد تحقق الجلسات الأساسي يستورد مساعدات عناصر الملفات لتقرير معرفات جلسات SQLite العادية.
  • تستخدم تشغيلات الوكيل الفرعي الحاجبة في Active Memory صفوف نص SQLite بدلًا من إنشاء ملفات session.jsonl مؤقتة أو مثبتة تحت حالة الإضافة. أزيل خيار transcriptDir القديم.
  • تستخدم عمليات توليد slug لمرة واحدة وتشغيلات مخطط Crestodian صفوف نص SQLite بدلًا من إنشاء ملفات session.jsonl مؤقتة.
  • تستخدم تشغيلات مساعد llm-task واستخراج الالتزام المخفي أيضًا صفوف نص SQLite، ولذلك لم تعد جلسات المساعد هذه الخاصة بالنموذج فقط تنشئ ملفات نص JSON/JSONL مؤقتة.
  • أصبح TranscriptSessionManager نطاق نص SQLite مفتوحًا فقط الآن. يفتحه كود وقت التشغيل باستخدام openTranscriptSessionManagerForSession({agentId, sessionId})؛ وتعيش تدفقات الإنشاء، والتفريع، والمتابعة، والسرد، والتفرع في مساعدات صفوف SQLite المالكة لها بدلًا من واجهات المدير الثابتة. يعالج كود أداة التشخيص/الاستيراد/التصحيح ملفات المصدر القديمة الصريحة خارج مدير جلسات وقت التشغيل.
  • أزيلت طريقتا الواجهة القديمتان SessionManager.newSession() وSessionManager.createBranchedSession(). تُنشأ الجلسات الجديدة وأحفاد النصوص بواسطة سير عمل SQLite المالك لها بدلًا من تعديل مدير مفتوح بالفعل إلى جلسة مثبتة مختلفة.
  • لم تعد قرارات تفرع النص الأم وإنشاء التفرع تقبل storePath أو sessionsDir؛ بل تستخدم نطاق نص SQLite {agentId, sessionId} بدلًا من بيانات مسار نظام الملفات المحتفظ بها.
  • لم يعد مضيف الذاكرة يصدر مساعدات تصنيف نصوص أدلة الجلسات عديمة الأثر؛ أصبح ترشيح النصوص يُشتق الآن من بيانات صفوف SQLite الوصفية أثناء بناء الإدخال.
  • تستخدم اختبارات تصدير جلسات مضيف الذاكرة وQMD نطاقات نص SQLite. تبقى مسارات agents/<agentId>/sessions/*.jsonl القديمة مغطاة فقط عندما يكون الاختبار يثبت عمدًا توافق أداة التشخيص/الاستيراد/التصدير.
  • يستخدم فحص الجلسات الخام في مختبر QA الآن sessions.list عبر Gateway بدلاً من قراءة agents/qa/sessions/sessions.json؛ أصبحت ملاحظات MSteams تُلحق مباشرة بنصوص SQLite من دون اختلاق مسار JSONL.
  • تحمل دورات القناة الواردة المشتركة الآن {agentId, sessionKey} بدلاً من storePath القديم. تقرأ مسارات التسجيل في LINE وWhatsApp وSlack وDiscord وTelegram وMatrix وSignal وiMessage وBlueBubbles وFeishu وGoogle Chat وIRC وNextcloud Talk وZalo وZalo Personal وQA Channel وMicrosoft Teams وMattermost وSynology Chat وTlon وTwitch وQQBot الآن بيانات updated-at الوصفية وتسجل صفوف الجلسات الواردة عبر هوية SQLite.
  • أُزيل استمرار محدد موقع النص من صفوف الجلسات النشطة. يُرجع resolveSessionTranscriptTarget القيم agentId وsessionId وبيانات الموضوع الوصفية الاختيارية؛ ويكون doctor هو الكود الوحيد الذي يستورد أسماء ملفات النصوص القديمة.
  • تبدأ ترويسات نصوص وقت التشغيل عند إصدار SQLite رقم 1. ترقيات أشكال JSONL V1/V2/V3 القديمة موجودة فقط في استيراد doctor، وتطبّع الترويسات المستوردة إلى إصدار نص SQLite الحالي قبل تخزين الصفوف.
  • يحظر حاجز database-first الآن SessionManager.listAll و SessionManager.forkFromSession؛ يجب أن تبقى مهام سرد الجلسات وسير عمل fork/restore على واجهات SQLite القائمة على الصفوف/النطاقات.
  • يحظر الحاجز أيضاً أسماء مساعدي تحليل JSONL للنصوص القديمة وإصلاح الفرع النشط خارج كود doctor/import، حتى لا يستطيع وقت التشغيل إنشاء مسار ثانٍ لترحيل النصوص القديمة.
  • ترفض عمليات PI المضمنة مقابض النصوص الواردة. تستخدم هوية SQLite {agentId, sessionId} قبل إطلاق العامل ومرة أخرى قبل أن تلمس المحاولة حالة النص. لا يستطيع إدخال /tmp/*.jsonl قديم اختيار هدف كتابة وقت التشغيل.
  • أصبحت سجلات تتبع التخزين المؤقت، وحمولة Anthropic، والبث الخام، والخط الزمني للتشخيصات تُكتب الآن إلى صفوف SQLite diagnostic_events typed. وتكتب حزم استقرار Gateway الآن إلى صفوف SQLite diagnostic_stability_bundles typed. أُزيلت مسارات تجاوز JSONL القديمة diagnostics.cacheTrace.filePath وOPENCLAW_CACHE_TRACE_FILE وOPENCLAW_ANTHROPIC_PAYLOAD_LOG_FILE و OPENCLAW_DIAGNOSTICS_TIMELINE_PATH، ولم يعد الالتقاط العادي للاستقرار يكتب ملفات logs/stability/*.json.
  • أصبحت استمرارية Cron توفّق صفوف SQLite cron_jobs بدلاً من حذف/إعادة إدراج جدول المهام كله عند كل حفظ. تحدّث عمليات الرد بالكتابة لأهداف Plugin صفوف cron المطابقة مباشرة وتحافظ على حالة cron في وقت التشغيل داخل معاملة قاعدة بيانات الحالة نفسها.
  • يستخدم مستدعو وقت تشغيل Cron الآن مفتاح مخزن cron مستقراً في SQLite. مسارات cron.store القديمة هي مدخلات استيراد doctor فقط؛ وتستخدم مسارات Gateway الإنتاجية، وصيانة المهام، والحالة، وسجل التشغيل، والرد بالكتابة لهدف Telegram resolveCronStoreKey ولم تعد تطبّع المفتاح كمسار. تعرض حالة Cron الآن storeKey بدلاً من حقل storePath القديم ذي شكل الملف.
  • لم يعد تحميل وقت تشغيل Cron وجدولته يطبّعان أشكال المهام القديمة المستمرة مثل jobId وschedule.cron وatMs الرقمية والقيم المنطقية النصية، أو sessionTarget المفقود. يمتلك استيراد doctor القديم تلك الإصلاحات قبل إدراج الصفوف في SQLite.
  • لم يعد ACP spawn يحل أو يستمرر مسارات ملفات JSONL للنصوص. يستمرر إعداد spawn وthread-bind صف جلسة SQLite مباشرة ويحافظ على معرّف الجلسة بوصفه هوية النص المحتفظ بها.
  • تقرأ/تسرد/تدرج أو تحدّث واجهات API لبيانات جلسة ACP الوصفية الآن صفوف SQLite حسب agentId ولم تعد تعرض storePath كجزء من عقد إدخال جلسة ACP.
  • أصبحت محاسبة استخدام الجلسة وتجميع استخدام Gateway يحلان النصوص حسب {agentId, sessionId} فقط. ولم تعد ذاكرة cost/usage المؤقتة وملخصات الجلسات المكتشفة تنشئ أو تُرجع سلاسل محدد مواقع النصوص.
  • أصبح إلحاق محادثة Gateway، واستمرار abort-partial، وsessions.send/، وكتابات نصوص وسائط webchat تلحق مباشرة عبر نطاق نص SQLite. لم يعد مساعد حقن النصوص في Gateway يقبل معامل transcriptLocator.
  • أصبح اكتشاف نصوص SQLite يسرد نطاقات النصوص وإحصاءاتها فقط: {agentId, sessionId, updatedAt, eventCount}. اختفى مساعد التوافق الميت listSqliteSessionTranscriptLocators وحقل locator لكل صف.
  • يعرض وقت تشغيل إصلاح النصوص الآن فقط repairTranscriptSessionStateIfNeeded({agentId, sessionId}). حُذف مساعد الإصلاح القديم القائم على المحدد؛ يقرأ كود doctor/debug مسارات ملفات المصدر الصريحة ولا يرحّل سلاسل المحددات أبداً.
  • أصبح وقت تشغيل دفتر إعادة تشغيل ACP يخزّن صفوف إعادة التشغيل لكل جلسة في قاعدة بيانات حالة SQLite المشتركة بدلاً من acp/event-ledger.json؛ يستورد doctor الملف القديم ويزيله.
  • أصبحت مساعدات قارئ نصوص Gateway موجودة الآن في src/gateway/session-transcript-readers.ts بدلاً من اسم الوحدة القديم session-utils.fs. وتسمية فحص سجل إعادة المحاولة الاحتياطي أصبحت مرتبطة بمحتوى نص SQLite بدلاً من سطح مساعد الملفات القديم.
  • أصبحت مساعدات injected-chat وCompaction في Gateway تمرر نطاق نص SQLite عبر واجهات API للمساعدات الداخلية بدلاً من تسمية القيم كمسارات نصوص أو ملفات مصدر.
  • أصبح اكتشاف استمرار bootstrap يفحص صفوف نصوص SQLite عبر hasCompletedBootstrapTranscriptTurn؛ ولم يعد يعرض اسم مساعد ذي شكل ملف.
  • أصبحت اختبارات embedded-runner تستخدم هوية نص SQLite، وفتح مدير نصوص جديد يتطلب دائماً sessionId صريحاً.
  • أصبحت مساعدات فهرسة الذاكرة تستخدم مصطلحات نصوص SQLite من البداية إلى النهاية: يصدّر المضيف listSessionTranscriptScopesForAgent و sessionTranscriptKeyForScope، وتستهدف طوابير المزامنة sessionTranscripts، وتعرض نتائج بحث الجلسات العامة مسارات مبهمة transcript:<agent>:<session>، ومفتاح مصدر قاعدة البيانات الداخلي هو session:<session> تحت source_kind='sessions' بدلاً من مسار ملف مزيف.
  • لم يعد مساعد إزالة التكرار المستمرة العام في Plugin SDK يعرض خيارات ذات شكل ملف. يوفّر المستدعون مفاتيح نطاق SQLite وتعيش صفوف إزالة التكرار المتينة في حالة Plugin المشتركة.
  • انتقلت رموز Microsoft Teams SSO من ملفات JSON مقفلة إلى حالة Plugin في SQLite. يستورد doctor msteams-sso-tokens.json، ويعيد بناء مفاتيح رموز SSO canonical من الحمولات، ويزيل ملف المصدر. تبقى رموز OAuth المفوضة على حدود ملف الاعتمادات الخاصة الحالية.
  • انتقلت حالة ذاكرة مزامنة Matrix المؤقتة من bot-storage.json إلى حالة Plugin في SQLite. يستورد doctor حمولات المزامنة الخام أو المغلفة القديمة ويزيل ملف المصدر. تمرر عملاء Matrix وQA Matrix النشطة دليل جذر مخزن مزامنة SQLite، لا مسار sync-store.json أو bot-storage.json مزيفاً.
  • انتقلت حالة ترحيل التشفير القديم في Matrix من legacy-crypto-migration.json إلى حالة Plugin في SQLite. يستورد doctor ملف الحالة القديم؛ وانتقلت لقطات Matrix SDK IndexedDB من crypto-idb-snapshot.json إلى كتل Plugin في SQLite. مفاتيح استرداد Matrix والاعتمادات هي صفوف حالة Plugin في SQLite؛ وملفات JSON القديمة الخاصة بها هي مدخلات ترحيل doctor فقط.
  • أصبحت سجلات نشاط Memory Wiki تستخدم حالة Plugin في SQLite بدلاً من .openclaw-wiki/log.jsonl. يستورد موفّر ترحيل Memory Wiki سجلات JSONL القديمة؛ وتبقى ملفات wiki markdown ومحتوى خزنة المستخدم مدعومة بالملفات كمحتوى مساحة عمل.
  • لم يعد Memory Wiki ينشئ .openclaw-wiki/state.json أو دليل .openclaw-wiki/locks غير المستخدم. يزيل موفّر الترحيل ملفات بيانات Plugin الوصفية المتقاعدة تلك إذا كانت خزنة أقدم لا تزال تحتوي عليها.
  • أصبحت إدخالات تدقيق Crestodian تستخدم حالة Plugin في SQLite الأساسية بدلاً من audit/crestodian.jsonl. يستورد doctor سجل تدقيق JSONL القديم ويزيله بعد نجاح الاستيراد.
  • أصبحت إدخالات تدقيق كتابة/مراقبة الإعدادات تستخدم حالة Plugin في SQLite الأساسية بدلاً من logs/config-audit.jsonl. يستورد doctor سجل تدقيق JSONL القديم ويزيله بعد نجاح الاستيراد.
  • لم يعد مرافق macOS يكتب ملفات جانبية محلية للتطبيق logs/config-audit.jsonl أو logs/config-health.json أثناء تحرير openclaw.json. يبقى ملف الإعدادات مدعوماً بالملفات، وتبقى لقطات الاسترداد بجانب ملف الإعدادات، وتنتمي حالة تدقيق/صحة الإعدادات المتينة إلى مخزن SQLite الخاص بـ Gateway.
  • أصبحت موافقات الإنقاذ المعلقة في Crestodian تستخدم حالة Plugin في SQLite الأساسية بدلاً من crestodian/rescue-pending/*.json. يستورد doctor ملفات الموافقات المعلقة القديمة ويزيلها بعد نجاح الاستيراد.
  • أصبحت حالة التسليح المؤقتة في Phone Control تستخدم حالة Plugin في SQLite بدلاً من plugins/phone-control/armed.json. يستورد doctor ملف حالة التسليح القديم إلى مساحة الاسم phone-control/arm-state ويزيل الملف.
  • لم يعد doctor يصلح نصوص JSONL في مكانها أو ينشئ ملفات JSONL احتياطية. يستورد الفرع النشط إلى SQLite ويزيل المصدر القديم.
  • يستخدم بحث نصوص خطاف session-memory قراءات SQLite بنطاق {agentId, sessionId} فقط. لم يعد مساعده يقبل أو يشتق محددات نصوص أو قراءات ملفات قديمة أو خيارات إعادة كتابة ملفات.
  • أصبحت ارتباطات محادثة Codex app-server تفتاح حالة Plugin في SQLite حسب مفتاح جلسة OpenClaw أو نطاق {agentId, sessionId} صريح. يجب ألا تحفظ ارتباطات احتياطية لمسارات النصوص.
  • تستخدم قراءات mirrored-history في Codex app-server نطاق نص SQLite فقط؛ ويجب ألا تستعيد الهوية من مسارات ملفات النصوص.
  • لم تعد مسارات role-ordering وإعادة ضبط Compaction تلغي ربط ملفات النصوص القديمة؛ لا تدوّر إعادة الضبط إلا صف جلسة SQLite وهوية النص.
  • تُرجع استجابات إعادة ضبط Gateway وcheckpoint صفوف جلسات نظيفة بالإضافة إلى معرّفات الجلسات. لم تعد تنشئ محددات نصوص SQLite للعملاء.
  • لم يعد Dreaming في memory-core يحذف صفوف الجلسات عبر فحص ملفات JSONL المفقودة. يمر تنظيف subagent عبر واجهة API لوقت تشغيل الجلسة بدلاً من فحوصات وجود نظام الملفات. وتزرع اختبارات إدخال النصوص الخاصة به صفوف SQLite مباشرة بدلاً من إنشاء تجهيزات agents/<id>/sessions أو عناصر نائبة للمحدد.
  • قد تعرض فهرسة نصوص الذاكرة transcript:<agentId>:<sessionId> كمسار افتراضي لنتيجة بحث لمساعدات الاقتباس/القراءة. مصدر الفهرس المتين علائقي (source_kind='sessions', source_key='session:<sessionId>', session_id=<sessionId>)، لذا فالقيمة ليست محدد نص وقت تشغيل، وليست مسار نظام ملفات، ويجب ألا تُمرر أبداً مرة أخرى إلى واجهات API لوقت تشغيل الجلسة.
  • تقرأ حالة ذاكرة doctor في Gateway أعداد short-term recall وphase-signal من صفوف حالة Plugin في SQLite بدلاً من memory/.dreams/*.json؛ ويصف خرج CLI وdoctor الآن ذلك التخزين بأنه مخزن SQLite، لا مساراً.
  • لم تعد واجهات memory-core runtime وحالة CLI وطرق doctor في Gateway وواجهات Plugin SDK تدقق أو تؤرشف ملفات .dreams/session-corpus القديمة. تلك الملفات هي مدخلات ترحيل فقط؛ يستوردها doctor إلى SQLite ويحذف المصدر بعد التحقق. تستخدم صفوف أدلة إدخال الجلسات النشطة الآن مسار SQLite الافتراضي memory/session-ingestion/<day>.txt؛ ولا يكتب وقت التشغيل الحالة من .dreams/session-corpus أو يشتقها أبداً.
  • تعرض الآثار العامة في memory-core أحداث مضيف SQLite كأثر JSON افتراضي memory/events/memory-host-events.json؛ ولم تعد تعيد استخدام مسار المصدر القديم .dreams/events.jsonl.
  • أصبحت سجلات حاويات/متصفحات sandbox تستخدم جدول SQLite المشترك sandbox_registry_entries مع أعمدة typed للجلسة والصورة والطابع الزمني وbackend/config ومنفذ المتصفح. يستورد doctor ملفات سجل JSON القديمة الأحادية والمجزأة ويزيل المصادر الناجحة. تستخدم قراءات وقت التشغيل أعمدة الصفوف typed كمصدر الحقيقة؛ وentry_json ليس إلا نسخة لإعادة التشغيل/debug.
  • أصبحت الالتزامات تستخدم جدول commitments مشتركاً typed بدلاً من كتلة JSON للمتجر كله. تحفظ اللقطات عبر upsert حسب معرّف الالتزام وتحذف الصفوف المفقودة فقط بدلاً من مسح الجدول وإعادة إدراجه. يحمّل وقت التشغيل الالتزامات من أعمدة typed للنطاق ونافذة التسليم والحالة والمحاولة والنص؛ وrecord_json ليس إلا نسخة لإعادة التشغيل/debug. يستورد doctor commitments.json القديم ويزيله بعد استيراد ناجح.
  • لم تعد تعريفات مهام Cron وحالة الجدولة وسجل التشغيل تملك كتّاب أو قرّاء JSON في وقت التشغيل. يستخدم وقت التشغيل صفوف cron_jobs مع schedule typed، أعمدة الحمولة، والتسليم، وتنبيه الفشل، والجلسة، والحالة، وحالة وقت التشغيل بالإضافة إلى بيانات cron_run_logs الوصفية الموصوفة الأنواع للحالة، وملخص التشخيصات، وحالة/خطأ التسليم، والجلسة/التشغيل، والنموذج، وإجماليات الرموز. job_json ليس سوى نسخة لإعادة التشغيل/التصحيح؛ يحتفظ state_json بتشخيصات وقت التشغيل المتداخلة التي ليست لها بعد حقول استعلام ساخنة، بينما يعيد وقت التشغيل ترطيب حقول الحالة الساخنة من الأعمدة الموصوفة الأنواع. يستورد Doctor ملفات jobs.json وjobs-state.json وruns/*.jsonl القديمة ويزيل المصادر المستوردة. تحدّث عمليات الكتابة الراجعة لأهداف Plugin صفوف cron_jobs المطابقة بدلا من تحميل مخزن Cron بالكامل واستبداله.
  • يتجاهل بدء تشغيل Gateway علامات notify: true القديمة في إسقاط وقت التشغيل. يترجمها Doctor إلى تسليم SQLite صريح عندما تكون cron.webhook صالحة، ويزيل العلامات الخاملة عندما لا تكون معيّنة، ويحافظ عليها مع تحذير عندما يكون Webhook المكوّن غير صالح.
  • تحفظ طوابير التسليم الصادر وتسليم الجلسات الآن حالة الطابور، ونوع الإدخال، ومفتاح الجلسة، والقناة، والهدف، ومعرّف الحساب، وعدد إعادة المحاولة، وآخر محاولة/خطأ، وحالة الاسترداد، وعلامات الإرسال عبر المنصة كأعمدة موصوفة الأنواع في جدول delivery_queue_entries المشترك. يقرأ استرداد وقت التشغيل تلك الحقول الساخنة من الأعمدة الموصوفة الأنواع، وتحدّث طفرات إعادة المحاولة/الاسترداد تلك الأعمدة مباشرة دون إعادة كتابة JSON إعادة التشغيل. تبقى حمولة JSON الكاملة فقط بوصفها كتلة إعادة التشغيل/التصحيح لأجسام الرسائل وبيانات إعادة التشغيل الباردة الأخرى.
  • تستخدم سجلات الصور الصادرة المُدارة الآن صفوف managed_outgoing_image_records المشتركة الموصوفة الأنواع مع بقاء بايتات الوسائط مخزنة في media_blobs. يبقى سجل JSON فقط كنسخة إعادة تشغيل/تصحيح.
  • تستخدم تفضيلات منتقي نماذج Discord، وتجزئات نشر الأوامر، وروابط السلاسل الآن حالة Plugin المشتركة في SQLite. تعيش خطط استيراد JSON القديمة الخاصة بها في سطح إعداد/ترحيل doctor في Plugin Discord، وليس في كود ترحيل النواة.
  • تستخدم كواشف استيراد Plugin القديمة وحدات مسماة باسم doctor مثل doctor-legacy-state.ts أو doctor-state-imports.ts؛ ويجب ألا تستورد وحدات وقت تشغيل القنوات العادية كواشف JSON القديمة.
  • تستخدم مؤشرات لحاق BlueBubbles وعلامات إزالة تكرار الوارد الآن حالة Plugin المشتركة في SQLite. تعيش خطط استيراد JSON القديمة الخاصة بها في سطح إعداد/ترحيل doctor في Plugin BlueBubbles، وليس في كود ترحيل النواة.
  • تستخدم إزاحات تحديثات Telegram، وصفوف ذاكرة الملصقات المؤقتة، وصفوف ذاكرة الرسائل المرسلة المؤقتة، وصفوف ذاكرة أسماء المواضيع المؤقتة، وروابط السلاسل الآن حالة Plugin مشتركة في SQLite. تعيش خطط استيراد JSON القديمة الخاصة بها في سطح إعداد/ترحيل doctor في Plugin Telegram، وليس في كود ترحيل النواة.
  • تستخدم مؤشرات لحاق iMessage، وتعيينات معرّفات الردود القصيرة، وصفوف إزالة تكرار صدى الإرسال الآن حالة Plugin مشتركة في SQLite. ملفات imessage/catchup/*.json و imessage/reply-cache.jsonl وimessage/sent-echoes.jsonl القديمة هي مدخلات doctor فقط.
  • تستخدم صفوف إزالة تكرار رسائل Feishu الآن حالة Plugin مشتركة في SQLite بدلا من ملفات feishu/dedup/*.json. تعيش خطة استيراد JSON القديمة الخاصة بها في سطح إعداد/ترحيل doctor في Plugin Feishu، وليس في كود ترحيل النواة.
  • تستخدم محادثات Microsoft Teams، والاستطلاعات، ومخازن التحميل المؤقتة المعلقة، وتعلّمات الملاحظات الآن جداول حالة/كتل Plugin مشتركة في SQLite. يستخدم مسار التحميل المعلّق plugin_blob_entries بحيث تُخزن مخازن الوسائط المؤقتة كـ SQLite BLOBs بدلا من JSON بترميز base64. تستخدم أسماء مساعدات وقت التشغيل الآن تسمية SQLite/الحالة بدلا من تسمية مخزن الملفات *-fs، وأزيل توافق storePath القديم من هذه المخازن. تعيش خطة استيراد JSON القديمة الخاصة بها في سطح إعداد/ترحيل doctor في Plugin Microsoft Teams.
  • تستخدم وسائط Zalo الصادرة المستضافة الآن plugin_blob_entries المشتركة في SQLite بدلا من ملفات JSON/bin الجانبية المؤقتة openclaw-zalo-outbound-media.
  • يستخدم HTML عارض الفروقات وبياناته الوصفية الآن plugin_blob_entries المشتركة في SQLite بدلا من ملفات meta.json/viewer.html المؤقتة. تبقى مخرجات PNG/PDF المعروضة تجسيدات مؤقتة لأن تسليم القناة لا يزال يحتاج إلى مسار ملف.
  • تستخدم مستندات Canvas المُدارة الآن plugin_blob_entries المشتركة في SQLite بدلا من دليل state/canvas/documents افتراضي. يخدم مضيف Canvas تلك الكتل مباشرة؛ ولا تُنشأ الملفات المحلية إلا لمحتوى المشغّل الصريح host.root أو للتجسيد المؤقت عندما يتطلب قارئ وسائط لاحق مسارا.
  • تستخدم قرارات تدقيق File Transfer الآن plugin_state_entries المشتركة في SQLite بدلا من سجل وقت التشغيل غير المحدود audit/file-transfer.jsonl. يستورد Doctor ملف تدقيق JSONL القديم إلى حالة Plugin ويزيل المصدر بعد استيراد نظيف.
  • تستخدم عقود عمليات ACPX وهوية مثيل Gateway الآن حالة Plugin مشتركة في SQLite. يستورد Doctor ملف gateway-instance-id القديم إلى حالة Plugin ويزيل المصدر.
  • سكربتات التغليف المولّدة في ACPX وموطن Codex المعزول هي تجسيد مؤقت تحت جذر OpenClaw المؤقت، وليست حالة OpenClaw دائمة. سجلات وقت تشغيل ACPX الدائمة هي عقد SQLite وصفوف مثيل Gateway؛ أزيل سطح إعداد stateDir القديم في ACPX لأنه لم تعد تُكتب أي حالة وقت تشغيل هناك.
  • تستخدم مرفقات وسائط Gateway الآن جدول SQLite المشترك media_blobs بوصفه مخزن البايتات المعتمد. المسارات المحلية المعادة إلى أسطح توافق القنوات وصندوق الرمل هي تجسيدات مؤقتة لصف قاعدة البيانات، وليست مخزن الوسائط الدائم. لم تعد قوائم سماح وسائط وقت التشغيل تتضمن جذور $OPENCLAW_STATE_DIR/media القديمة أو جذور media في دليل الإعدادات؛ تلك الأدلة هي مصادر استيراد doctor فقط.
  • لم يعد إكمال الصدفة يكتب ملفات ذاكرة مؤقتة في $OPENCLAW_STATE_DIR/completions/*. تستخدم مسارات التثبيت، وdoctor، والتحديث، واختبار الإصدار السريع مخرجات إكمال مولدة أو تحميل ملفات التعريف بدلا من ملفات ذاكرة إكمال دائمة.
  • يستخدم تجهيز رفع Skills في Gateway الآن صفوف skill_uploads المشتركة. تعيش بيانات الرفع الوصفية، ومفاتيح عدم التكرار، وبايتات الأرشيف في SQLite؛ ولا يتلقى المثبّت إلا مسار أرشيف مجسّدا مؤقتا أثناء تشغيل التثبيت.
  • لم تعد مرفقات الوكلاء الفرعيين المضمنة تتجسد تحت .openclaw/attachments/* في مساحة العمل. يجهّز مسار الإنشاء إدخالات بذور SQLite VFS، وتزرع عمليات التشغيل المضمنة تلك الإدخالات في مساحة أسماء الخربشة الخاصة بوقت تشغيل كل وكيل، وتضع الأدوات المدعومة بالقرص طبقة فوق خربشة SQLite تلك لمسارات المرفقات. أزيلت أعمدة سجل دليل مرفقات تشغيل الوكيل الفرعي القديمة وخطافات التنظيف.
  • لم تعد ترطيب صور CLI يحافظ على ملفات ذاكرة مؤقتة مستقرة باسم openclaw-cli-images. لا تزال خلفيات CLI الخارجية تتلقى مسارات ملفات، لكن تلك المسارات هي تجسيدات مؤقتة لكل تشغيل مع تنظيف.
  • تكتب تشخيصات تتبع الذاكرة المؤقتة، وتشخيصات حمولة Anthropic، وتشخيصات تدفق النموذج الخام، وأحداث الخط الزمني للتشخيصات، وحزم استقرار Gateway الآن صفوف SQLite بدلا من ملفات logs/*.jsonl أو logs/stability/*.json. أزيلت أعلام تجاوز مسار وقت التشغيل ومتغيرات البيئة؛ ويمكن لأوامر التصدير/التصحيح تجسيد الملفات صراحة من صفوف قاعدة البيانات.
  • لم يعد مرافق macOS لديه كاتب متداول لـ diagnostics.jsonl. تذهب سجلات التطبيق إلى التسجيل الموحد، وتبقى تشخيصات Gateway الدائمة مدعومة بـ SQLite.
  • تستخدم قائمة سجلات حارس منافذ macOS الآن صفوف macos_port_guardian_records مشتركة موصوفة الأنواع في SQLite بدلا من ملف JSON في Application Support أو كتلة مفردة مبهمة.
  • تستخدم أقفال Gateway المفردة الآن صفوف state_leases مشتركة موصوفة الأنواع تحت نطاق gateway_locks بدلا من ملفات قفل دليل temp. تشير وثائق استكشاف أخطاء Fly وOAuth الآن إلى قفل عقد/تحديث مصادقة SQLite بدلا من تنظيف أقفال الملفات المتقادمة.
  • تستخدم حالة مرصد إعادة تشغيل Gateway الآن صفوف gateway_restart_sentinel مشتركة موصوفة الأنواع في SQLite بدلا من restart-sentinel.json؛ يقرأ وقت التشغيل نوع المرصد، والحالة، والتوجيه، والرسالة، والاستمرار، والإحصاءات من الأعمدة الموصوفة الأنواع. payload_json ليس سوى نسخة إعادة تشغيل/تصحيح. يمسح كود وقت التشغيل صف SQLite مباشرة ولم يعد يحمل تجهيزات تنظيف الملفات.
  • تستخدم نية إعادة تشغيل Gateway وحالة تسليم المشرف الآن صفوف gateway_restart_intent وgateway_restart_handoff مشتركة موصوفة الأنواع في SQLite بدلا من ملفات gateway-restart-intent.json و gateway-supervisor-restart-handoff.json الجانبية.
  • يستخدم تنسيق Gateway المفرد الآن صفوف state_leases موصوفة الأنواع تحت gateway_locks بدلا من كتابة ملفات gateway.<hash>.lock. يملك صف العقد مالك القفل، والانتهاء، وHeartbeat، وحمولة التصحيح؛ وتملك SQLite حد الاكتساب/الإفراج الذري. أزيل خيار دليل قفل الملفات المتقاعد؛ وتستخدم الاختبارات هوية صف SQLite مباشرة.
  • حُذف مساعد تقرير استخدام Cron القديم غير المشار إليه الذي كان يمسح ملفات cron/runs/*.jsonl. يجب أن تقرأ تقارير سجل تشغيل Cron صفوف SQLite الموصوفة الأنواع cron_run_logs.
  • يكتشف استرداد إعادة تشغيل الجلسة الرئيسية الآن الوكلاء المرشحين عبر سجل agent_databases في SQLite بدلا من مسح أدلة agents/*/sessions.
  • يحذف استرداد تلف جلسة Gemini الآن صف الجلسة في SQLite فقط؛ ولم يعد يحتاج إلى بوابة storePath قديمة أو يحاول إلغاء ربط مسار JSONL نصي مشتق.
  • يتعامل ضبط تجاوز المسارات الآن مع قيم البيئة الحرفية undefined/null كغير معيّنة، مما يمنع إنشاء قواعد بيانات undefined/state/*.sqlite عرضيا في جذر المستودع أثناء الاختبارات أو تسليمات الصدفة.
  • تستخدم بصمات صحة الإعدادات الآن صفوف config_health_entries مشتركة موصوفة الأنواع في SQLite بدلا من logs/config-health.json، مع إبقاء ملف الإعدادات العادي هو مستند الإعداد الوحيد غير الاعتمادي. يحتفظ مرافق macOS بحالة صحة محلية للعملية فقط ولا يعيد إنشاء ملف JSON الجانبي القديم.
  • لم يعد وقت تشغيل ملف تعريف المصادقة يستورد أو يكتب ملفات JSON للاعتمادات. مخزن الاعتمادات المعتمد هو SQLite؛ وتعد auth-profiles.json وauth.json لكل وكيل وcredentials/oauth.json المشترك مدخلات ترحيل doctor تُزال بعد الاستيراد.
  • تؤكد اختبارات حفظ/حالة ملف تعريف المصادقة الآن جداول مصادقة SQLite الموصوفة الأنواع مباشرة ولا تستخدم أسماء ملفات ملفات تعريف المصادقة القديمة إلا لمدخلات ترحيل doctor.
  • ينظّف openclaw secrets apply ملف الإعداد، وملف البيئة، ومخزن ملفات تعريف المصادقة في SQLite فقط. لم يعد يحمل منطق توافق يعدّل auth.json المتقاعد لكل وكيل؛ يملك doctor استيراد ذلك الملف وحذفه.
  • تستورد خطط ترحيل أسرار Hermes وتطبيقاتها ملفات تعريف مفاتيح API مباشرة إلى مخزن ملفات تعريف المصادقة في SQLite. لم يعد يكتب أو يتحقق من auth-profiles.json كهدف وسيط.
  • تصف وثائق المصادقة المواجهة للمستخدم الآن state/openclaw.sqlite#table/auth_profile_stores/<agentDir> بدلا من إخبار المستخدمين بفحص أو نسخ auth-profiles.json؛ تبقى أسماء JSON القديمة لـ OAuth/auth موثقة فقط كمدخلات استيراد doctor.
  • لم تعد مساعدات مسار حالة النواة تعرض ملف credentials/oauth.json المتقاعد. اسم الملف القديم محلي لمسار استيراد مصادقة doctor.
  • تصف وثائق التثبيت، والأمان، والإعداد الأولي، ومصادقة النماذج، وSecretRef الآن صفوف ملفات تعريف المصادقة في SQLite والنسخ الاحتياطي/الترحيل للحالة كلها بدلا من ملفات JSON لملفات تعريف المصادقة لكل وكيل.
  • يمرر اكتشاف نماذج PI الآن الاعتمادات المعتمدة إلى تخزين مصادقة pi-coding-agent داخل الذاكرة. لم يعد ينشئ أو ينظّف أو يكتب auth.json لكل وكيل أثناء الاكتشاف.
  • تستخدم إعدادات مشغل Voice Wake والتوجيه الآن جداول مشتركة موصوفة الأنواع في SQLite بدلا من settings/voicewake.json أو settings/voicewake-routing.json أو صفوف عامة مبهمة؛ يستورد doctor ملفات JSON القديمة ويزيلها بعد ترحيل ناجح.
  • تستخدم حالة التحقق من التحديث الآن صفا مشتركا موصوف النوع update_check_state بدلا من update-check.json أو كتلة عامة مبهمة؛ يستورد doctor ملف JSON القديم ويزيله بعد ترحيل ناجح.
  • تستخدم حالة صحة الإعداد الآن صفوف config_health_entries مشتركة موصوفة الأنواع بدلا من logs/config-health.json أو كتلة عامة مبهمة؛ يستورد doctor ملف JSON القديم ويزيله بعد ترحيل ناجح.
  • تستخدم موافقات ربط محادثات Plugin الآن صفوف plugin_binding_approvals موصوفة الأنواع بدلا من حالة SQLite مشتركة مبهمة أو plugin-binding-approvals.json؛ الملف القديم هو مدخل ترحيل doctor.
  • تحفظ ارتباطات المحادثة الحالية العامة الآن صفوف current_conversation_bindings ذات أنواع محددة بدلاً من إعادة كتابة bindings/current-conversations.json؛ يستورد doctor ملف JSON القديم و يزيله بعد نجاح الترحيل.
  • تحفظ سجلات مزامنة المصادر المستوردة في Memory Wiki الآن صفاً واحداً من حالة Plugin في SQLite لكل مفتاح خزنة/مصدر بدلاً من إعادة كتابة .openclaw-wiki/source-sync.json؛ يستورد مزود الترحيل سجل JSON القديم ويزيله.
  • تحفظ سجلات تشغيل استيراد ChatGPT في Memory Wiki الآن صفاً واحداً من حالة Plugin في SQLite لكل معرف خزنة/تشغيل بدلاً من كتابة .openclaw-wiki/import-runs/*.json. تبقى لقطات التراجع ملفات خزنة صريحة إلى أن يُنقل أرشيف لقطات تشغيل الاستيراد إلى تخزين الكائنات الثنائية.
  • تحفظ الملخصات المجمعة في Memory Wiki الآن صفوف كائنات Plugin الثنائية في SQLite بدلاً من كتابة .openclaw-wiki/cache/agent-digest.json و .openclaw-wiki/cache/claims.jsonl. يستورد مزود الترحيل ملفات التخزين المؤقت القديمة ويزيل دليل التخزين المؤقت عندما يصبح فارغاً.
  • يحفظ تتبع تثبيت Skills في ClawHub الآن صفاً واحداً من حالة Plugin في SQLite لكل مساحة عمل/Skill بدلاً من كتابة أو قراءة ملفات جانبية .clawhub/lock.json و .clawhub/origin.json أثناء وقت التشغيل. تستخدم شيفرة وقت التشغيل كائنات حالة التثبيت المتتبع بدلاً من تجريدات ملف القفل/الأصل ذات الشكل الملفي. يستورد Doctor الملفات الجانبية القديمة من مساحات عمل الوكلاء المكونة ويزيلها بعد استيراد نظيف.
  • يقرأ فهرس Plugin المثبت ويكتب الآن صف المفرد installed_plugin_index في SQLite المشترك ذي النوع المحدد بدلاً من plugins/installs.json؛ ملف JSON القديم هو مدخل ترحيل doctor فقط ويُزال بعد الاستيراد.
  • أصبح مساعد مسار plugins/installs.json القديم موجوداً الآن في شيفرة doctor القديمة. تعرض وحدات فهرس Plugin في وقت التشغيل خيارات استمرارية مدعومة بـ SQLite فقط، وليس مسار ملف JSON.
  • تستخدم علامة إعادة تشغيل Gateway، وهدف إعادة التشغيل، وحالة تسليم المشرف الآن صفوف SQLite مشتركة ذات أنواع محددة (gateway_restart_sentinel و gateway_restart_intent و gateway_restart_handoff) بدلاً من كائنات ثنائية عامة مبهمة. لا تحتوي شيفرة إعادة التشغيل في وقت التشغيل على عقد علامة/هدف/تسليم ذي شكل ملفي.
  • يستخدم تخزين مزامنة Matrix المؤقت، وبيانات التخزين الوصفية، وارتباطات السلاسل، وعلامات إزالة تكرار الوارد، وحالة فترة تهدئة تحقق بدء التشغيل، ولقطات تشفير IndexedDB الخاصة بـ SDK، وبيانات الاعتماد، ومفاتيح الاسترداد الآن جداول حالة/كائنات Plugin الثنائية المشتركة في SQLite. لم تعد بُنى مسارات وقت التشغيل تعرض مسار بيانات وصفية storage-meta.json؛ اسم الملف هذا مدخل ترحيل قديم فقط. تعيش خطة استيراد JSON القديمة الخاصة بها في سطح إعداد/ترحيل doctor الخاص بـ Matrix Plugin.
  • لم يعد بدء تشغيل Matrix يفحص أو يبلغ أو يكمل حالة ملفات Matrix القديمة. كشف ملفات Matrix، وإنشاء لقطات التشفير القديمة، وحالة ترحيل استعادة مفاتيح الغرف، والاستيراد، وإزالة المصدر، كلها مملوكة لـ doctor.
  • أُزيلت براميل ترحيل وقت التشغيل في Matrix. يستورد Matrix doctor مساعدات كشف وتعديل الحالة/التشفير القديمة مباشرة بدلاً من أن تكون جزءاً من سطح API وقت التشغيل.
  • تعيش علامات إعادة استخدام لقطات ترحيل Matrix الآن في حالة Plugin في SQLite بدلاً من matrix/migration-snapshot.json؛ لا يزال بإمكان doctor إعادة استخدام أرشيف ما قبل الترحيل نفسه الذي تم التحقق منه دون كتابة ملف حالة جانبي.
  • تستخدم مؤشرات ناقل Nostr وحالة نشر الملف الشخصي الآن حالة Plugin المشتركة في SQLite. تعيش خطة استيراد JSON القديمة الخاصة بها في سطح إعداد/ترحيل doctor الخاص بـ Nostr Plugin.
  • تستخدم مفاتيح تبديل جلسة Active Memory الآن حالة Plugin المشتركة في SQLite بدلاً من session-toggles.json؛ يؤدي تشغيل الذاكرة مرة أخرى إلى حذف الصف بدلاً من إعادة كتابة كائن JSON.
  • تستخدم مقترحات Skill Workshop وعدادات المراجعة الآن حالة Plugin المشتركة في SQLite بدلاً من مخازن skill-workshop/<workspace>.json لكل مساحة عمل. كل مقترح صف منفصل تحت skill-workshop/proposals، وعداد المراجعة صف منفصل تحت skill-workshop/reviews.
  • تستخدم تشغيلات الوكيل الفرعي لمراجع Skill Workshop الآن محلل نصوص جلسة وقت التشغيل بدلاً من إنشاء مسارات جلسة جانبية skill-workshop/<sessionId>.json.
  • تستخدم إيجارات عمليات ACPX الآن حالة Plugin المشتركة في SQLite تحت acpx/process-leases بدلاً من سجل كامل الملف process-leases.json. يُحفظ كل إيجار في صفه الخاص، مع الحفاظ على إزالة العمليات القديمة عند بدء التشغيل دون مسار إعادة كتابة JSON في وقت التشغيل.
  • تُنشأ سكربتات غلاف ACPX وموطن Codex المعزول في جذر OpenClaw المؤقت. يُعاد إنشاؤها عند الحاجة وليست مدخلات نسخ احتياطي أو ترحيل.
  • تستخدم استمرارية سجل تشغيلات الوكلاء الفرعيين صفوف subagent_runs المشتركة ذات الأنواع المحددة. أصبح مسار subagents/runs.json القديم الآن مدخل ترحيل doctor فقط، ولم تعد أسماء مساعدات وقت التشغيل تصف طبقة الحالة بأنها مدعومة بالقرص. لم تعد اختبارات وقت التشغيل تنشئ تركيبات runs.json غير صالحة أو فارغة لإثبات سلوك السجل؛ إنها تزرع/تقرأ صفوف SQLite مباشرة.
  • يجهز النسخ الاحتياطي دليل الحالة قبل الأرشفة، وينسخ الملفات غير القاعدية، ويلتقط قواعد بيانات *.sqlite باستخدام VACUUM INTO، ويحذف ملفات WAL/SHM الجانبية الحية، ويسجل بيانات اللقطة الوصفية في بيان الأرشيف، ويسجل تشغيلات النسخ الاحتياطي المكتملة في SQLite مع بيان الأرشيف. يتحقق openclaw backup create من الأرشيف المكتوب افتراضياً؛ --no-verify هو المسار السريع الصريح.
  • يتحقق openclaw backup restore من الأرشيف قبل الاستخراج، ويعيد استخدام البيان الموحد الخاص بالمدقق، ويستعيد أصول البيان التي تم التحقق منها إلى مسارات المصدر المسجلة. يتطلب --yes للكتابة ويدعم --dry-run لخطة الاستعادة.
  • حُذف مرشح مسارات النسخ الاحتياطي المتطايرة القديم. لم يعد النسخ الاحتياطي يحتاج إلى قائمة تخطي live-tar لملفات JSON/JSONL القديمة الخاصة بالجلسات أو cron لأن لقطات SQLite تُجهز قبل إنشاء الأرشيف.
  • لم يعد إعداد مساحة العمل في الإعداد العادي والإلحاق ينشئ أدلة agents/<agentId>/sessions/. إنها تنشئ التكوين/مساحة العمل فقط؛ تُنشأ صفوف جلسات SQLite وصفوف النصوص عند الطلب في قاعدة البيانات لكل وكيل.
  • يستهدف إصلاح أذونات الأمان الآن قواعد بيانات SQLite العامة ولكل وكيل بالإضافة إلى ملفات WAL/SHM الجانبية بدلاً من sessions.json وملفات نصوص JSONL.
  • تصف أسماء وقت تشغيل سجل sandbox الآن أنواع سجل SQLite مباشرة بدلاً من حمل مصطلحات سجل JSON القديمة عبر المخزن النشط.
  • يزيل openclaw reset --scope config+creds+sessions قواعد بيانات openclaw-agent.sqlite لكل وكيل بالإضافة إلى ملفات WAL/SHM الجانبية، وليس فقط أدلة sessions/ القديمة.
  • تستخدم مساعدات جلسات Gateway المجمعة الآن أسماء موجهة إلى الإدخالات: يعيد loadCombinedSessionEntriesForGateway القيمة { databasePath, entries }. أُزيلت تسمية المخزن المدمج القديمة من مستدعي وقت التشغيل.
  • يكتب زرع قناة Docker MCP الآن صف الجلسة الرئيسي وأحداث النصوص في قاعدة بيانات SQLite لكل وكيل بدلاً من إنشاء sessions.json ونص JSONL.
  • يحل خطاف ذاكرة الجلسة المضمن الآن سياق الجلسة السابقة من SQLite بواسطة {agentId, sessionId}. لم يعد يفحص أو يخزن أو يصطنع مسارات النصوص أو أدلة workspace/sessions.
  • يكتب خطاف مسجل الأوامر المضمن الآن صفوف تدقيق الأوامر إلى جدول SQLite المشترك command_log_entries بدلاً من الإلحاق بـ logs/commands.log.
  • تعرض قوائم السماح لإقران القنوات الآن فقط مساعدات قراءة/كتابة مدعومة بـ SQLite في وقت التشغيل وفي Plugin SDK. يعيش محلل مسار *-allowFrom.json القديم وقارئ الملف فقط تحت شيفرة استيراد doctor القديمة.
  • تسجل migration_runs تنفيذات ترحيل الحالة القديمة مع الحالة، والطوابع الزمنية، وتقارير JSON.
  • تسجل migration_sources كل مصدر ملف قديم مستورد مع التجزئة، والحجم، وعدد السجلات، والجدول الهدف، ومعرف التشغيل، والحالة، وحالة إزالة المصدر.
  • تسجل backup_runs مسارات أرشيفات النسخ الاحتياطي، والحالة، وبيانات JSON.
  • لا يحتفظ المخطط العام بجدول سجل agents غير مستخدم. اكتشاف قواعد بيانات الوكلاء هو سجل agent_databases المعياري إلى أن يحصل وقت التشغيل على مالك سجل وكيل حقيقي.
  • يُخزن تكوين كتالوج النماذج المولد في صفوف SQLite العامة agent_model_catalogs ذات الأنواع المحددة والمفهرسة حسب دليل الوكيل. يستخدم مستدعو وقت التشغيل ensureOpenClawModelCatalog؛ لا توجد API توافق models.json في شيفرة وقت التشغيل. يكتب التنفيذ إلى SQLite ويُرطب سجل PI المضمن من تلك الحمولة المخزنة دون إنشاء ملف models.json.
  • أُزيل تصدير markdown لنصوص جلسات QMD وتكوين memory.qmd.sessions. لا توجد مجموعة نصوص QMD، ولا مسار وقت تشغيل qmd/sessions*، ولا جسر ذاكرة جلسات مدعوم بالملفات.
  • تستورد ذاكرة النواة في وقت التشغيل مساعدات فهرسة نصوص SQLite من openclaw/plugin-sdk/memory-core-host-engine-session-transcripts، وليس من مسار SDK الفرعي الخاص بـ QMD. يحتفظ مسار QMD الفرعي بإعادة تصدير توافق فقط للمستدعين الخارجيين إلى أن تتمكن عملية تنظيف SDK رئيسية من إزالته.
  • أصبح index.sqlite الخاص بـ QMD الآن تجسيد وقت تشغيل مؤقتاً مدعوماً بجدول SQLite الرئيسي plugin_blob_entries. لم يعد وقت التشغيل ينشئ ملفاً جانبياً دائماً ~/.openclaw/agents/<agentId>/qmd.
  • لم يعد Plugin الاختياري memory-lancedb ينشئ ~/.openclaw/memory/lancedb كمخزن مُدار ضمنياً من OpenClaw. إنه واجهة LanceDB خلفية خارجية ويبقى معطلاً إلى أن يهيئ المشغل dbPath صريحاً.
  • يفشل check:database-first-legacy-stores المصدر الجديد في وقت التشغيل الذي يقرن أسماء المخازن القديمة بواجهات API لنظام الملفات ذات نمط الكتابة. ويفشل أيضاً مصدر وقت التشغيل الذي يعيد إدخال علامات جسر النصوص المتقاعدة transcriptLocator أو sqlite-transcript://.... تبقى شيفرة الترحيل وdoctor والاستيراد والتصدير الصريح غير المتعلق بالجلسات مسموحة. لا تزال أسماء العقود القديمة الأوسع مثل sessionFile و storePath وواجهات حقبة الملفات القديمة SessionManager لها ملاك حاليون وتحتاج إلى عمل حراسة ترحيل منفصل قبل أن تصبح فحصاً تمهيدياً مطلوباً. يغطي الحارس الآن أيضاً مخازن وقت التشغيل cache/*.json، والملفات الجانبية العامة thread-bindings.json، وJSON حالة/سجل تشغيل cron، وJSON صحة التكوين، وملفات إعادة التشغيل والقفل الجانبية، وإعدادات Voice Wake، وموافقات ارتباطات Plugin، وJSON فهرس Plugin المثبت، وJSONL تدقيق File Transfer، وسجلات نشاط Memory Wiki، وسجل النص القديم command-logger المضمن، ومفاتيح تشخيصات JSONL للتدفق الخام في pi-mono. كما يحظر أسماء وحدات doctor القديمة على مستوى الجذر حتى تبقى شيفرة التوافق تحت src/commands/doctor/. تستخدم معالجات تصحيح أخطاء Android أيضاً مخرجات logcat/داخل الذاكرة بدلاً من تجهيز ملفات تخزين مؤقت camera_debug.log أو debug_logs.txt.

شكل المخطط المستهدف

أبقِ المخططات صريحة. تستخدم حالة وقت التشغيل المملوكة للمضيف جداول typed. تستخدم الحالة المعتمة المملوكة لـ Plugin ‏plugin_state_entries / plugin_blob_entries؛ ولا يوجد جدول kv عام للمضيف.

قاعدة البيانات العامة:

text
state_leases(scope, lease_key, owner, expires_at, heartbeat_at, payload_json, created_at, updated_at)exec_approvals_config(config_key, raw_json, socket_path, has_socket_token, default_security, default_ask, default_ask_fallback, auto_allow_skills, agent_count, allowlist_count, updated_at_ms)schema_meta(meta_key, role, schema_version, agent_id, app_version, created_at, updated_at)agent_databases(agent_id, path, schema_version, last_seen_at, size_bytes)task_runs(...)task_delivery_state(...)flow_runs(...)subagent_runs(run_id, child_session_key, requester_session_key, controller_session_key, created_at, ended_at, cleanup_handled, payload_json)current_conversation_bindings(binding_key, binding_id, target_agent_id, target_session_id, target_session_key, channel, account_id, conversation_kind, parent_conversation_id, conversation_id, target_kind, status, bound_at, expires_at, metadata_json, updated_at)plugin_binding_approvals(plugin_root, channel, account_id, plugin_id, plugin_name, approved_at)tui_last_sessions(scope_key, session_key, updated_at)plugin_state_entries(plugin_id, namespace, entry_key, value_json, created_at, expires_at)plugin_blob_entries(plugin_id, namespace, entry_key, metadata_json, blob, created_at, expires_at)media_blobs(subdir, id, content_type, size_bytes, blob, created_at, updated_at)skill_uploads(upload_id, kind, slug, force, size_bytes, sha256, actual_sha256, received_bytes, archive_blob, created_at, expires_at, committed, committed_at, idempotency_key_hash)web_push_subscriptions(endpoint_hash, subscription_id, endpoint, p256dh, auth, created_at_ms, updated_at_ms)web_push_vapid_keys(key_id, public_key, private_key, subject, updated_at_ms)apns_registrations(node_id, transport, token, relay_handle, send_grant, installation_id, topic, environment, distribution, token_debug_suffix, updated_at_ms)node_host_config(config_key, version, node_id, token, display_name, gateway_host, gateway_port, gateway_tls, gateway_tls_fingerprint, updated_at_ms)device_identities(identity_key, device_id, public_key_pem, private_key_pem, created_at_ms, updated_at_ms)device_auth_tokens(device_id, role, token, scopes_json, updated_at_ms)macos_port_guardian_records(pid, port, command, mode, timestamp)workspace_setup_state(workspace_key, workspace_path, version, bootstrap_seeded_at, setup_completed_at, updated_at)native_hook_relay_bridges(relay_id, pid, hostname, port, token, expires_at_ms, updated_at_ms)model_capability_cache(provider_id, model_id, name, input_text, input_image, reasoning, supports_tools, context_window, max_tokens, cost_input, cost_output, cost_cache_read, cost_cache_write, updated_at_ms)agent_model_catalogs(catalog_key, agent_dir, raw_json, updated_at)managed_outgoing_image_records(attachment_id, session_key, message_id, created_at, updated_at, retention_class, alt, original_media_id, original_media_subdir, original_content_type, original_width, original_height, original_size_bytes, original_filename, record_json)gateway_restart_sentinel(sentinel_key, version, kind, status, ts, session_key, thread_id, delivery_channel, delivery_to, delivery_account_id, message, continuation_json, doctor_hint, stats_json, payload_json, updated_at_ms)channel_pairing_requests(channel_key, account_id, request_id, code, created_at, last_seen_at, meta_json)channel_pairing_allow_entries(channel_key, account_id, entry, sort_order, updated_at)voicewake_triggers(config_key, position, trigger, updated_at_ms)voicewake_routing_config(config_key, version, default_target_mode, default_target_agent_id, default_target_session_key, updated_at_ms)voicewake_routing_routes(config_key, position, trigger, target_mode, target_agent_id, target_session_key, updated_at_ms)update_check_state(state_key, last_checked_at, last_notified_version, last_notified_tag, last_available_version, last_available_tag, auto_install_id, auto_first_seen_version, auto_first_seen_tag, auto_first_seen_at, auto_last_attempt_version, auto_last_attempt_at, auto_last_success_version, auto_last_success_at, updated_at_ms)config_health_entries(config_path, last_known_good_json, last_promoted_good_json, last_observed_suspicious_signature, updated_at_ms)sandbox_registry_entries(registry_kind, container_name, session_key, backend_id, runtime_label, image, created_at_ms, last_used_at_ms, config_label_kind, config_hash, cdp_port, no_vnc_port, entry_json, updated_at)cron_run_logs(store_key, job_id, seq, ts, status, error, summary, diagnostics_summary, delivery_status, delivery_error, delivered, session_id, session_key, run_id, run_at_ms, duration_ms, next_run_at_ms, model, provider, total_tokens, entry_json, created_at)cron_jobs(store_key, job_id, name, description, enabled, delete_after_run, created_at_ms, agent_id, session_key, schedule_kind, schedule_expr, schedule_tz, every_ms, anchor_ms, at, stagger_ms, session_target, wake_mode, payload_kind, payload_message, payload_model, payload_fallbacks_json, payload_thinking, payload_timeout_seconds, payload_allow_unsafe_external_content, payload_external_content_source_json, payload_light_context, payload_tools_allow_json, delivery_mode, delivery_channel, delivery_to, delivery_thread_id, delivery_account_id, delivery_best_effort, failure_delivery_mode, failure_delivery_channel, failure_delivery_to, failure_delivery_account_id, failure_alert_disabled, failure_alert_after, failure_alert_channel, failure_alert_to, failure_alert_cooldown_ms, failure_alert_include_skipped, failure_alert_mode, failure_alert_account_id, next_run_at_ms, running_at_ms, last_run_at_ms, last_run_status, last_error, last_duration_ms, consecutive_errors, consecutive_skipped, schedule_error_count, last_delivery_status, last_delivery_error, last_delivered, last_failure_alert_at_ms, job_json, state_json, runtime_updated_at_ms, schedule_identity, sort_order, updated_at)delivery_queue_entries(queue_name, id, status, entry_kind, session_key, channel, target, account_id, retry_count, last_attempt_at, last_error, recovery_state, platform_send_started_at, entry_json, enqueued_at, updated_at, failed_at)commitments(id, agent_id, session_key, channel, account_id, recipient_id, thread_id, sender_id, kind, sensitivity, source, status, reason, suggested_text, dedupe_key, confidence, due_earliest_ms, due_latest_ms, due_timezone, source_message_id, source_run_id, created_at_ms, updated_at_ms, attempts, last_attempt_at_ms, sent_at_ms, dismissed_at_ms, snoozed_until_ms, expired_at_ms, record_json)migration_runs(id, started_at, finished_at, status, report_json)migration_sources(source_key, migration_kind, source_path, target_table, source_sha256, source_size_bytes, source_record_count, last_run_id, status, imported_at, removed_source, report_json)backup_runs(id, created_at, archive_path, status, manifest_json)

قاعدة بيانات الوكيل:

text
schema_meta(meta_key, role, schema_version, agent_id, app_version, created_at, updated_at)sessions(session_id, session_key, session_scope, created_at, updated_at, started_at, ended_at, status, chat_type, channel, account_id, primary_conversation_id, model_provider, model, agent_harness_id, parent_session_key, spawned_by, display_name)conversations(conversation_id, channel, account_id, kind, peer_id, parent_conversation_id, thread_id, native_channel_id, native_direct_user_id, label, metadata_json, created_at, updated_at)session_conversations(session_id, conversation_id, role, first_seen_at, last_seen_at)session_routes(session_key, session_id, updated_at)session_entries(session_id, session_key, entry_json, updated_at)transcript_events(session_id, seq, event_json, created_at)transcript_event_identities(session_id, event_id, seq, event_type, has_parent, parent_id, message_idempotency_key, created_at)transcript_snapshots(session_id, snapshot_id, reason, event_count, created_at, metadata_json)vfs_entries(namespace, path, kind, content_blob, metadata_json, updated_at)tool_artifacts(run_id, artifact_id, kind, metadata_json, blob, created_at)run_artifacts(run_id, path, kind, metadata_json, blob, created_at)trajectory_runtime_events(session_id, run_id, seq, event_json, created_at)memory_index_meta(key, value)memory_index_sources(path, source, hash, mtime, size)memory_index_chunks(id, path, source, start_line, end_line, hash, model, text, embedding, updated_at)memory_embedding_cache(provider, model, provider_key, hash, embedding, dims, updated_at)memory_index_state(id, revision)cache_entries(scope, key, value_json, blob, expires_at, updated_at)

يمكن أن يضيف البحث المستقبلي جداول FTS من دون تغيير جداول الأحداث canonical:

text
transcript_events_fts(session_id, seq, text)vfs_entries_fts(namespace, path, text)

ينبغي أن تستخدم القيم الكبيرة أعمدة blob، وليس ترميز سلاسل JSON. أبقِ value_json للبيانات البنيوية الصغيرة التي يجب أن تظل قابلة للفحص بأدوات SQLite العادية.

agent_databases هو السجل canonical لهذا الفرع. لا تضف جدول agents إلى أن يوجد مالك فعلي لسجل الوكيل؛ يبقى إعداد الوكيل في openclaw.json.

شكل ترحيل Doctor

ينبغي أن يستدعي Doctor خطوة ترحيل صريحة واحدة قابلة للإبلاغ وآمنة لإعادة التشغيل:

bash
openclaw doctor --fix

يستدعي openclaw doctor --fix تنفيذ ترحيل الحالة بعد فحص الإعدادات الأولي العادي وينشئ نسخة احتياطية مُتحقَّقًا منها قبل الاستيراد. يجب ألا يستورد بدء تشغيل وقت التشغيل وopenclaw migrate ملفات حالة OpenClaw القديمة.

خصائص الترحيل:

  • تكتشف تمريرة ترحيل واحدة جميع مصادر الملفات القديمة وتنتج خطة قبل تعديل أي شيء.
  • ينشئ Doctor أرشيف نسخة احتياطية مُتحقَّقًا منه قبل الترحيل وقبل استيراد الملفات القديمة.
  • تكون عمليات الاستيراد idempotent ومفهرسة حسب مسار المصدر وmtime والحجم والهاش والجدول الهدف.
  • تُزال ملفات المصدر الناجحة أو تُؤرشف بعد أن تعتمد قاعدة البيانات الهدف التغييرات.
  • تترك عمليات الاستيراد الفاشلة المصدر بلا تغيير وتسجل تحذيرًا في migration_runs.
  • تقرأ شيفرة وقت التشغيل من SQLite فقط بعد وجود الترحيل.
  • لا يلزم مسار للرجوع إلى إصدار أقدم أو التصدير إلى ملفات وقت التشغيل.

جرد الترحيل

انقل هذه إلى قاعدة البيانات العامة:

  • تستخدم كتابات وقت تشغيل سجل المهام الآن قاعدة البيانات المشتركة؛ وقد حُذف مستورد الملف الجانبي غير المشحون tasks/runs.sqlite. تحفظ اللقطات بإدراج أو تحديث حسب معرف المهمة وتحذف فقط صفوف المهمة/التسليم المفقودة.
  • تستخدم كتابات وقت تشغيل تدفق المهام الآن قاعدة البيانات المشتركة؛ وقد حُذف مستورد الملف الجانبي غير المشحون tasks/flows/registry.sqlite. تحفظ اللقطات بإدراج أو تحديث حسب معرف التدفق وتحذف فقط صفوف التدفق المفقودة.
  • تستخدم كتابات وقت تشغيل حالة Plugin الآن قاعدة البيانات المشتركة؛ وقد حُذف مستورد الملف الجانبي غير المشحون plugin-state/state.sqlite.
  • لم يعد بحث الذاكرة المدمج يستخدم memory/<agentId>.sqlite افتراضياً؛ فجداول الفهرس الخاصة به تعيش في قاعدة بيانات الوكيل المالكة، وقد أُحيل خيار الاشتراك الصريح للملف الجانبي memorySearch.store.path إلى ترحيل إعدادات doctor.
  • تعيد إعادة فهرسة الذاكرة المدمجة ضبط الجداول المملوكة للذاكرة فقط في قاعدة بيانات الوكيل. ويجب ألا تستبدل ملف SQLite بأكمله، لأن قاعدة البيانات نفسها تملك الجلسات، والنصوص، وصفوف VFS، والقطع الأثرية، وذاكرات وقت التشغيل المؤقتة.
  • سجلات حاويات/متصفحات Sandbox من JSON أحادي ومجزأ. تستخدم كتابات وقت التشغيل الآن قاعدة البيانات المشتركة؛ ويبقى استيراد JSON القديم.
  • تستخدم تعريفات مهام Cron وحالة الجدولة وسجل التشغيل الآن SQLite المشتركة؛ ويستورد doctor ملفات jobs.json وjobs-state.json و cron/runs/*.jsonl القديمة ويزيلها
  • هوية/مصادقة الجهاز، والدفع، وفحص التحديث، والتعهدات، وذاكرة نماذج OpenRouter المؤقتة، وفهرس Plugins المثبتة، وارتباطات خادم التطبيق
  • تستخدم سجلات اقتران الجهاز/العقدة والتمهيد الآن جداول SQLite ذات أنواع
  • يستخدم مشتركو إشعارات إقران الجهاز وعلامات الطلبات المسلّمة الآن جدول Plugin-state المشترك في SQLite بدلاً من device-pair-notify.json.
  • تستخدم سجلات مكالمات voice-call الآن جدول Plugin-state المشترك في SQLite ضمن مساحة الاسم voice-call / calls بدلاً من calls.jsonl؛ ويعرض Plugin CLI سجل المكالمات المدعوم بـ SQLite ويلخصه.
  • تستخدم جلسات Gateway في QQBot وسجلات المستخدمين المعروفين وذاكرة اقتباسات فهرس المراجع الآن حالة Plugin في SQLite ضمن مساحات أسماء qqbot (gateway-sessions, known-users, ref-index) بدلاً من session-*.json وknown-users.json وref-index.jsonl. تلك الملفات القديمة ذاكرات مؤقتة ولا تُرحّل.
  • تستخدم تفضيلات منتقي النماذج في Discord، وتجزئات نشر الأوامر، وارتباطات السلاسل الآن حالة Plugin في SQLite ضمن مساحات أسماء discord (model-picker-preferences, command-deploy-hashes, thread-bindings) بدلاً من model-picker-preferences.json وcommand-deploy-cache.json و thread-bindings.json؛ ويستورد ترحيل doctor/setup في Discord الملفات القديمة ويزيلها.
  • تستخدم مؤشرات catchup في BlueBubbles وعلامات إزالة التكرار للوارد الآن حالة Plugin في SQLite ضمن مساحات أسماء bluebubbles (catchup-cursors, inbound-dedupe) بدلاً من bluebubbles/catchup/*.json و bluebubbles/inbound-dedupe/*.json؛ ويستورد ترحيل doctor/setup في BlueBubbles الملفات القديمة ويزيلها.
  • تستخدم إزاحات تحديث Telegram، ومدخلات ذاكرة الملصقات المؤقتة، ومدخلات ذاكرة رسائل سلسلة الردود المؤقتة، ومدخلات ذاكرة الرسائل المرسلة المؤقتة، ومدخلات ذاكرة أسماء الموضوعات المؤقتة، وارتباطات السلاسل الآن حالة Plugin في SQLite ضمن مساحات أسماء telegram (update-offsets, sticker-cache, message-cache, sent-messages, topic-names, thread-bindings) بدلاً من update-offset-*.json و sticker-cache.json و*.telegram-messages.json و *.telegram-sent-messages.json و*.telegram-topic-names.json و thread-bindings-*.json؛ ويستورد ترحيل doctor/setup في Telegram الملفات القديمة ويزيلها.
  • تستخدم مؤشرات catchup في iMessage، وتعيينات معرفات الرد القصيرة، وصفوف إزالة تكرار صدى الإرسال الآن حالة Plugin في SQLite ضمن مساحات أسماء imessage (catchup-cursors, reply-cache, sent-echoes) بدلاً من imessage/catchup/*.json و imessage/reply-cache.jsonl وimessage/sent-echoes.jsonl؛ ويستورد ترحيل doctor/setup في iMessage الملفات القديمة ويزيلها.
  • تستخدم محادثات Microsoft Teams، والاستطلاعات، ورموز SSO، وتعلّمات الملاحظات الآن مساحات أسماء حالة Plugin في SQLite (conversations, polls, sso-tokens, feedback-learnings) بدلاً من msteams-conversations.json و msteams-polls.json وmsteams-sso-tokens.json و*.learnings.json؛ ويستورد ترحيل doctor/setup في Microsoft Teams الملفات القديمة ويؤرشفها. التحميلات المعلقة ذاكرة SQLite مؤقتة قصيرة العمر، ولا تُرحّل ملفات ذاكرة JSON المؤقتة القديمة.
  • تستخدم ذاكرة مزامنة Matrix المؤقتة، وبيانات التخزين الوصفية، وارتباطات السلاسل، وعلامات إزالة تكرار الوارد، وحالة تهدئة التحقق عند بدء التشغيل، وبيانات الاعتماد، ومفاتيح الاسترداد، ولقطات تشفير IndexedDB في SDK الآن مساحات أسماء حالة/كائنات Plugin في SQLite ضمن matrix (sync-store, storage-meta, thread-bindings, inbound-dedupe, startup-verification, credentials, recovery-key, idb-snapshots) بدلاً من bot-storage.json وstorage-meta.json وthread-bindings.json و inbound-dedupe.json وstartup-verification.json وcredentials.json و recovery-key.json وcrypto-idb-snapshot.json؛ ويستورد ترحيل doctor/setup في Matrix تلك الملفات القديمة من جذور تخزين Matrix المحددة بنطاق الحساب ويزيلها.
  • تستخدم مؤشرات حافلة Nostr وحالة نشر الملف الشخصي الآن حالة Plugin في SQLite ضمن مساحات أسماء nostr (bus-state, profile-state) بدلاً من bus-state-*.json وprofile-state-*.json؛ ويستورد ترحيل doctor/setup في Nostr الملفات القديمة ويزيلها.
  • تستخدم مفاتيح تبديل جلسات Active Memory الآن حالة Plugin في SQLite ضمن active-memory/session-toggles بدلاً من session-toggles.json.
  • تستخدم طوابير مقترحات Skill Workshop وعدادات المراجعة الآن حالة Plugin في SQLite ضمن skill-workshop/proposals وskill-workshop/reviews بدلاً من ملفات skill-workshop/<workspace>.json لكل مساحة عمل.
  • تتشارك طوابير التسليم الصادر وتسليم الجلسات الآن جدول SQLite العام delivery_queue_entries ضمن أسماء طوابير منفصلة (outbound-delivery, session-delivery) بدلاً من ملفات delivery-queue/*.json وdelivery-queue/failed/*.json و session-delivery-queue/*.json الدائمة. تستورد خطوة الحالة القديمة في doctor الصفوف المعلقة والفاشلة، وتزيل علامات التسليم القديمة، وتحذف ملفات JSON القديمة بعد الاستيراد. حقول التوجيه الساخن وإعادة المحاولة أعمدة ذات أنواع؛ ويُحتفظ بحمولة JSON فقط للإعادة/التصحيح.
  • تستخدم عقود عمليات ACPX الآن حالة Plugin في SQLite ضمن acpx/process-leases بدلاً من process-leases.json.
  • بيانات تشغيل النسخ الاحتياطي والترحيل الوصفية

انقل هذه إلى قواعد بيانات الوكلاء:

  • جذور جلسات الوكيل وحمولات إدخال الجلسة ذات شكل التوافق. تم ذلك لكتابات وقت التشغيل: بيانات الجلسة الوصفية الساخنة قابلة للاستعلام في sessions، بينما تبقى حمولة SessionEntry الكاملة ذات الشكل القديم في session_entries.
  • أحداث نصوص الوكيل. تم ذلك لكتابات وقت التشغيل.
  • نقاط تحقق Compaction ولقطات النصوص. تم ذلك لكتابات وقت التشغيل: نسخ نصوص نقاط التحقق هي صفوف نصوص في SQLite وبيانات نقاط التحقق الوصفية تُسجّل في transcript_snapshots. تسمي مساعدات نقاط تحقق Gateway هذه القيم الآن لقطات نصية بدلاً من ملفات مصدر.
  • مساحات أسماء scratch/workspace في VFS الخاصة بالوكيل. تم ذلك لكتابات VFS وقت التشغيل.
  • حمولات مرفقات الوكيل الفرعي. تم ذلك لكتابات وقت التشغيل: هي إدخالات بذور VFS في SQLite وليست ملفات مساحة عمل دائمة أبداً.
  • قطع الأدوات الأثرية. تم ذلك لكتابات وقت التشغيل.
  • قطع التشغيل الأثرية. تم ذلك لكتابات وقت تشغيل العامل عبر جدول run_artifacts لكل وكيل.
  • ذاكرات وقت التشغيل المؤقتة المحلية للوكيل. تم ذلك لكتابات ذاكرة وقت تشغيل العامل المؤقتة ذات النطاق عبر جدول cache_entries لكل وكيل. تبقى ذاكرات النماذج المؤقتة على مستوى Gateway في قاعدة البيانات العامة ما لم تصبح خاصة بالوكيل.
  • سجلات دفق أصل ACP. تم ذلك لكتابات وقت التشغيل.
  • جلسات دفتر إعادة تشغيل ACP. تم ذلك لكتابات وقت التشغيل عبر acp_replay_sessions وacp_replay_events؛ ويبقى acp/event-ledger.json القديم كمدخل لـ doctor فقط.
  • بيانات جلسات ACP الوصفية. تم ذلك لكتابات وقت التشغيل عبر acp_sessions؛ كتل entry.acp القديمة في sessions.json هي مدخل ترحيل doctor فقط.
  • الملفات الجانبية للمسارات عندما لا تكون ملفات تصدير صريحة. تم ذلك لكتابات وقت التشغيل: يكتب التقاط المسار صفوف trajectory_runtime_events في قاعدة بيانات الوكيل ويعكس القطع الأثرية ذات نطاق التشغيل إلى SQLite. الملفات الجانبية القديمة هي مدخلات استيراد doctor فقط؛ ويمكن للتصدير إنشاء مخرجات حزمة دعم JSONL جديدة لكنه لا يقرأ أو يرحّل ملفات المسارات/النصوص الجانبية القديمة في وقت التشغيل. يعرض التقاط المسار وقت التشغيل نطاق SQLite؛ ومساعدات مسار JSONL معزولة لدعم التصدير/التصحيح ولا يُعاد تصديرها من وحدة وقت التشغيل. تسجل بيانات مسار embedded-runner الوصفية هوية {agentId, sessionId, sessionKey} بدلاً من الاحتفاظ بمحدد موقع نص.

أبقِ هذه مدعومة بالملفات حالياً:

  • openclaw.json
  • ملفات بيانات اعتماد المزوّد أو CLI
  • بيانات Plugin/package
  • مساحات عمل المستخدم ومستودعات Git عند اختيار وضع القرص
  • السجلات المعدّة لتتبعها من قبل المشغّل، ما لم يُنقل سطح سجل محدد

خطة الترحيل

المرحلة 0: تثبيت الحد

اجعل حد الحالة الدائمة صريحاً قبل نقل مزيد من الصفوف:

  • أضف جدول migration_runs إلى قاعدة البيانات العامة. تم ذلك لتقارير تنفيذ ترحيل الحالة القديمة.
  • أضف خدمة ترحيل حالة واحدة مملوكة لـ doctor للاستيراد من ملف إلى قاعدة بيانات. تم ذلك: يستخدم openclaw doctor --fix تنفيذ ترحيل الحالة القديمة.
  • اجعل plan للقراءة فقط واجعل apply ينشئ نسخة احتياطية، ويستورد، ويتحقق، ثم يحذف الملفات القديمة أو يعزلها. تم ذلك: ينشئ doctor نسخة احتياطية متحققاً منها قبل الترحيل، ويمرر مسار النسخة الاحتياطية إلى migration_runs، ويعيد استخدام مسارات المستورد/الإزالة.
  • أضف حظراً ثابتاً حتى لا يتمكن كود وقت التشغيل الجديد من كتابة ملفات الحالة القديمة بينما لا يزال بإمكان كود الترحيل والاختبارات زرعها/قراءتها. تم ذلك للمتاجر القديمة المرحّلة حالياً؛ ويفحص الحارس أيضاً الاختبارات المتداخلة بحثاً عن عقود محدد موقع النص المحظورة في وقت التشغيل.

المرحلة 1: إنهاء مستوى التحكم العام

احتفظ بحالة التنسيق المشتركة في state/openclaw.sqlite:

  • الوكلاء وسجل قواعد بيانات الوكلاء
  • سجلات المهام وتدفق المهام
  • حالة Plugin
  • سجل حاويات/متصفحات Sandbox
  • سجل تشغيل Cron/المجدول
  • الاقتران، والجهاز، والدفع، وفحص التحديث، وTUI، وذاكرات OpenRouter/النماذج المؤقتة، وغيرها من حالات وقت التشغيل الصغيرة ذات نطاق Gateway
  • بيانات النسخ الاحتياطي والترحيل الوصفية
  • بايتات مرفقات وسائط Gateway. تم ذلك لكتابات وقت التشغيل؛ مسارات الملفات المباشرة هي إنشاءات مؤقتة للتوافق مع مرسلي القنوات وتجهيز Sandbox. تقبل قوائم السماح في وقت التشغيل مسارات إنشاء SQLite، لا جذور وسائط الحالة/الإعدادات القديمة. يستورد doctor ملفات الوسائط القديمة إلى media_blobs ويزيل ملفات المصدر بعد نجاح كتابة الصفوف.
  • جلسات التقاط وكيل التصحيح، والأحداث، وكائنات الحمولة. تم ذلك: تعيش الالتقاطات في قاعدة بيانات الحالة المشتركة وتُفتح عبر تمهيد قاعدة بيانات الحالة المشتركة، والمخطط، وWAL، وإعدادات مهلة الانشغال. تُضغط بايتات الحمولة باستخدام gzip في capture_blobs.data؛ ولا يوجد تجاوز لقاعدة بيانات جانبية وقت التشغيل خاصة بوكيل التصحيح، ولا دليل كائنات، ولا هدف مخطط/توليد كود مولّد خاص بالتقاطات الوكيل فقط. يستورد ترحيل doctor/بدء التشغيل صفوف debug-proxy/capture.sqlite المشحونة وكائنات الحمولة المشار إليها، بما في ذلك تجاوزات بيئة قاعدة البيانات/الكائنات القديمة النشطة، ثم يؤرشف تلك المصادر مع ترك شهادات CA سليمة.

تحذف هذه المرحلة أيضاً فاتحات الملفات الجانبية المكررة، ومساعدات الأذونات، وإعداد WAL، وتنظيف نظام الملفات، وكتّاب التوافق من تلك الأنظمة الفرعية.

المرحلة 2: تقديم قواعد بيانات لكل وكيل

أنشئ قاعدة بيانات واحدة لكل وكيل وسجلها من قاعدة البيانات العامة:

text
~/.openclaw/state/openclaw.sqlite~/.openclaw/agents/<agentId>/agent/openclaw-agent.sqlite

يخزن صف agent_databases العام المسار، وإصدار المخطط، وطابع آخر ظهور زمني، وبيانات وصفية أساسية للحجم/السلامة. يطلب كود وقت التشغيل قاعدة بيانات الوكيل من السجل بدلاً من اشتقاق مسارات الملفات مباشرة.

تملك قاعدة بيانات الوكيل:

  • sessions بوصفه جذر الجلسات المعياري، مع session_entries بوصفه جدول الحمولات ذات شكل التوافق المرتبط بذلك الجذر، و session_routes بوصفه مرجع البحث الفريد عن session_key النشط
  • conversations وsession_conversations بوصفهما هوية توجيه المزوّد المطبّعة المرتبطة بالجلسات
  • transcript_events
  • لقطات النصوص ونقاط تحقق Compaction. تم ذلك لكتابات وقت التشغيل.
  • vfs_entries
  • tool_artifacts ومخرجات التشغيل
  • صفوف وقت التشغيل/التخزين المؤقت المحلية للوكيل. تم ذلك للتخزينات المؤقتة المحددة بنطاق العامل.
  • أحداث تدفق ACP الأصلية
  • أحداث وقت تشغيل المسار عندما لا تكون مخرجات تصدير صريحة

المرحلة 3: استبدال واجهات برمجة تطبيقات مخزن الجلسات

تم ذلك لوقت التشغيل. لم يعد سطح مخزن الجلسات ذي شكل الملفات عقدا نشطا لوقت التشغيل:

  • لم يعد وقت التشغيل يستدعي loadSessionStore(storePath) أو يتعامل مع storePath على أنه هوية الجلسة.
  • عمليات صفوف وقت التشغيل هي getSessionEntry وupsertSessionEntry و patchSessionEntry وdeleteSessionEntry وlistSessionEntries.
  • أزيلت من وقت التشغيل مساعدات إعادة كتابة المخزن بالكامل، وكاتبات الملفات، واختبارات الطابور، وتشذيب الأسماء البديلة، ومعاملات حذف المفاتيح القديمة.
  • لا تزال صادرات التوافق المهملة لحزمة الجذر تكيّف مسارات sessions.json المعيارية على واجهات برمجة تطبيقات صفوف SQLite.
  • يبقى تحليل sessions.json فقط في كود ترحيل/استيراد doctor و اختبارات doctor.
  • تقرأ آلية الرجوع في دورة حياة وقت التشغيل رؤوس نصوص SQLite، لا الأسطر الأولى من JSONL.

واصل حذف أي شيء يعيد إدخال معاملات قفل الملفات، أو مفردات التشذيب/الاقتطاع باعتبارها صيانة ملفات، أو هوية مسار المخزن، أو الاختبارات التي يكون تأكيدها الوحيد هو استمرار JSON.

المرحلة 4: نقل النصوص، وتدفقات ACP، والمسارات، وVFS

اجعل كل تدفق بيانات للوكيل أصيلا في قاعدة البيانات:

  • تمر كتابات إلحاق النصوص عبر معاملة SQLite واحدة تضمن رأس الجلسة، وتتحقق من عدم تكرار الرسالة، وتحدد ذيل الأصل، وتدرج في transcript_events، وتسجل بيانات تعريف الهوية القابلة للاستعلام في transcript_event_identities. تم ذلك لإلحاقات رسائل النصوص المباشرة و إلحاقات TranscriptSessionManager الدائمة العادية؛ تحتفظ عمليات الفرع الصريحة باختيار الأصل الصريح الخاص بها ولا تزال تكتب صفوف SQLite من دون اشتقاق أي محدد موقع ملف.
  • تصبح سجلات تدفق ACP الأصلية صفوفا، لا ملفات .acp-stream.jsonl. تم.
  • لم يعد إعداد إنشاء ACP يحفظ مسارات JSONL للنصوص. تم.
  • تكتب عملية التقاط المسار في وقت التشغيل صفوف/مخرجات الأحداث مباشرة. لا يزال بإمكان أمر الدعم/التصدير الصريح إنتاج مخرجات JSONL لحزمة الدعم كتنسيق تصدير، لكن تصدير الجلسة لا يعيد إنشاء JSONL للجلسات. تم.
  • تبقى مساحات العمل القرصية على القرص عند تهيئتها في وضع القرص.
  • تستخدم مساحة VFS المؤقتة ووضع مساحة العمل التجريبي الخاص بـ VFS فقط قاعدة بيانات الوكيل.

يستورد الترحيل ملفات JSONL القديمة مرة واحدة، ويسجل الأعداد/التجزئات في migration_runs، ويزيل الملفات المستوردة بعد فحوصات السلامة.

المرحلة 5: النسخ الاحتياطي، والاستعادة، وVacuum، والتحقق

تبقى النسخ الاحتياطية ملف أرشيف واحدا:

  • ضع نقطة تحقق لكل قاعدة بيانات عامة وقاعدة بيانات وكيل.
  • التقط لقطة لكل قاعدة بيانات باستخدام دلالات النسخ الاحتياطي في SQLite أو VACUUM INTO.
  • أرشف لقطات قواعد البيانات المضغوطة، والتهيئة، وبيانات الاعتماد الخارجية، وعمليات تصدير مساحات العمل المطلوبة.
  • احذف ملفات *.sqlite-wal و*.sqlite-shm الحية الخام.
  • تحقق بفتح كل لقطة قاعدة بيانات وتشغيل PRAGMA integrity_check. يقوم openclaw backup create بهذا التحقق من الأرشيف افتراضيا؛ يتخطى --no-verify فقط تمريرة الأرشيف بعد الكتابة، لا فحص سلامة إنشاء اللقطة.
  • تنسخ الاستعادة اللقطات مرة أخرى إلى مساراتها المستهدفة. يعيد هذا الفرع ضبط تخطيط SQLite غير المشحون إلى user_version = 1؛ يمكن لتغييرات المخطط المشحونة مستقبلا إضافة عمليات ترحيل صريحة عند الحاجة.

المرحلة 6: وقت تشغيل العامل

أبق وضع العامل تجريبيا أثناء إدخال تقسيم قاعدة البيانات:

  • يتلقى العاملون معرّف الوكيل، ومعرّف التشغيل، ووضع نظام الملفات، وهوية سجل قاعدة البيانات.
  • يفتح كل عامل اتصال SQLite خاصا به.
  • يحتفظ الأصل بسلطة تسليم القنوات، والموافقات، والتهيئة، والإلغاء.
  • ابدأ بعامل واحد لكل تشغيل نشط؛ أضف التجميع فقط بعد استقرار دورة الحياة وملكية اتصال قاعدة البيانات.

المرحلة 7: حذف العالم القديم

تم ذلك لإدارة جلسات وقت التشغيل. لا يسمح بالعالم القديم إلا كإدخال صريح لـ doctor أو كمخرج دعم/تصدير:

  • لا كتابات وقت تشغيل إلى sessions.json، أو JSONL للنصوص، أو JSON لسجل sandbox، أو SQLite جانبي للمهام، أو SQLite جانبي لحالة Plugin.
  • لا تشذيب لملفات JSON/الجلسات، ولا اقتطاع لنصوص الملفات، ولا أقفال ملفات جلسات، ولا اختبارات جلسات ذات شكل الأقفال.
  • لا صادرات توافق في وقت التشغيل غرضها إبقاء ملفات الجلسات القديمة محدثة.
  • تبقى صادرات الدعم الصريحة تنسيقات أرشيف/تجسيد يطلبها المستخدم ويجب ألا تعيد أسماء الملفات إلى هوية وقت التشغيل.

النسخ الاحتياطي والاستعادة

ينبغي أن تكون النسخ الاحتياطية ملف أرشيف واحدا، لكن التقاط قاعدة البيانات يجب أن يكون أصيلا في SQLite:

  1. أوقف نشاط الكتابة طويل الأمد أو ادخل حاجز نسخ احتياطي قصيرا.
  2. لكل قاعدة بيانات عامة وقاعدة بيانات وكيل، شغّل نقطة تحقق.
  3. التقط لقطة لكل قاعدة بيانات باستخدام دلالات النسخ الاحتياطي في SQLite أو VACUUM INTO داخل دليل نسخ احتياطي مؤقت.
  4. أرشف لقطات قواعد البيانات المضغوطة، وملف التهيئة، ودليل بيانات الاعتماد، ومساحات العمل المحددة، وبيانا.
  5. تحقق من الأرشيف بفتح كل لقطة SQLite مضمنة وتشغيل PRAGMA integrity_check. يقوم openclaw backup create بذلك افتراضيا؛ --no-verify مخصص فقط لتخطي تمريرة الأرشيف بعد الكتابة عمدا.

لا تعتمد على نسخ *.sqlite و*.sqlite-wal و*.sqlite-shm الحية الخام بوصفها تنسيق النسخ الاحتياطي الأساسي. يجب أن يسجل بيان الأرشيف دور قاعدة البيانات، ومعرّف الوكيل، وإصدار المخطط، ومسار المصدر، ومسار اللقطة، وحجم البايتات، وحالة السلامة.

يجب أن تعيد الاستعادة بناء قاعدة البيانات العامة وملفات قواعد بيانات الوكلاء من لقطات الأرشيف. وبما أن تخطيط SQLite لم يشحن بعد، يحتفظ هذا التحسين البنيوي بمخطط الإصدار 1 فقط إضافة إلى استيراد doctor من ملف إلى قاعدة بيانات. يتحقق أمر الاستعادة من الأرشيف أولا، ثم يستبدل كل أصل في البيان من الحمولة المستخرجة المتحقق منها.

خطة تحسين وقت التشغيل بنيويا

  1. أضف واجهات برمجة تطبيقات لسجل قاعدة البيانات.

    • حل مسارات قاعدة البيانات العامة وقواعد البيانات لكل وكيل.
    • أبق المخططات غير المشحونة عند user_version = 1؛ لا تضف كود مشغّل ترحيل المخطط حتى يحتاج مخطط مشحون إلى ذلك.
    • أضف مساعدات الإغلاق/نقاط التحقق/السلامة التي تستخدمها الاختبارات، والنسخ الاحتياطي، وdoctor.
  2. ادمج مخازن SQLite الجانبية.

    • انقل جداول حالة Plugin إلى قاعدة البيانات العامة. تم ذلك لكتابات وقت التشغيل؛ حُذف مستورد SQLite الجانبي القديم غير المشحون.
    • انقل جداول سجل المهام إلى قاعدة البيانات العامة. تم ذلك لكتابات وقت التشغيل؛ حُذف مستورد SQLite الجانبي القديم غير المشحون.
    • انقل جداول Task Flow إلى قاعدة البيانات العامة. تم ذلك لكتابات وقت التشغيل؛ حُذف مستورد SQLite الجانبي القديم غير المشحون.
    • انقل جداول البحث في الذاكرة المضمنة إلى كل قاعدة بيانات وكيل. تم؛ أصبح memorySearch.store.path المخصص الصريح يزال الآن بترحيل تهيئة doctor. يعمل إعادة الفهرسة الكامل في مكانه ضد جداول الذاكرة فقط؛ حُذف مسار تبديل الملف الكامل القديم ومساعد تبديل الفهرس الجانبي.
    • احذف فاتحات قواعد البيانات المكررة، وإعداد WAL، ومساعدات الأذونات، ومسارات الإغلاق من تلك الأنظمة الفرعية.
  3. انقل الجداول المملوكة للوكيل إلى قواعد بيانات لكل وكيل.

    • أنشئ قاعدة بيانات الوكيل عند الطلب عبر سجل قاعدة البيانات العامة. تم.
    • انقل إدخالات جلسات وقت التشغيل، وأحداث النصوص، وصفوف VFS، و مخرجات الأدوات إلى قواعد بيانات الوكلاء. تم.
    • لا ترحّل إدخالات جلسات قاعدة البيانات المشتركة المحلية للفرع، أو أحداث النصوص، أو صفوف VFS، أو مخرجات الأدوات؛ فهذا التخطيط لم يشحن قط. احتفظ فقط باستيراد الملفات القديمة إلى قاعدة البيانات في doctor.
  4. استبدل واجهات برمجة تطبيقات مخزن الجلسات.

    • أزل storePath بوصفه هوية وقت التشغيل. تم ذلك لوقت التشغيل ومحمي بواسطة check:database-first-legacy-stores: أصبحت بيانات تعريف الجلسة، وتحديثات المسارات، واستمرار الأوامر، وتنظيف جلسات CLI، ومعاينات استدلال Feishu، واستمرار حالة النصوص، وعمق الوكيل الفرعي، وتجاوزات جلسة ملف تعريف المصادقة، ومنطق تفرع الأصل، وفحص QA-lab تحل الآن قاعدة البيانات من مفاتيح الوكيل/الجلسة المعيارية. تعرض استجابات قوائم جلسات Gateway/TUI/UI/macOS الآن databasePath بدلا من path القديم؛ تعرض أسطح تصحيح macOS قاعدة البيانات لكل وكيل كحالة للقراءة فقط بدلا من كتابة تهيئة session.store. لم تعد /status، وتصدير المسار المدفوع بالدردشة، ووكلاء تبعيات CLI تنشر مسارات المخزن القديمة؛ تقرأ آلية الرجوع لاستخدام النصوص SQLite بهوية الوكيل/الجلسة. لم تعد اختبارات وقت التشغيل والجسر تعرض storePath؛ تملك مدخلات doctor/الترحيل اسم الحقل القديم هذا. لم يعد تحميل الجلسات المجمعة في Gateway يملك فرعا خاصا في وقت التشغيل لقيم session.store غير القالبية؛ بل يجمع صفوف SQLite لكل وكيل. أزيل مسار doctor القديم لقفل الجلسات ومساعد تنظيف .jsonl.lock الخاص به؛ أصبح SQLite الآن حد تزامن الجلسات. تستخدم مواقع الاستدعاء الساخنة في وقت التشغيل أسماء مساعدات موجهة بالصفوف مثل resolveSessionRowEntry؛ أزيل الاسم البديل القديم resolveSessionStoreEntry للتوافق من وقت التشغيل وصادرات Plugin SDK.
  • استخدم عمليات صفوف { agentId, sessionKey }. تم: أصبحت getSessionEntry وupsertSessionEntry وdeleteSessionEntry و patchSessionEntry وlistSessionEntries واجهات برمجة تطبيقات تعتمد SQLite أولا ولا تتطلب مسار مخزن جلسات. أصبحت أوامر ملخص الحالة، وحالة الوكيل المحلي، والصحة، وقائمة openclaw sessions تقرأ صفوف كل وكيل مباشرة وتعرض مسارات قواعد بيانات SQLite لكل وكيل بدلا من مسارات sessions.json.
  • استبدل حذف/إدراج المخزن بالكامل بـ upsertSessionEntry و deleteSessionEntry وlistSessionEntries واستعلامات تنظيف SQL. تم ذلك لوقت التشغيل: تستخدم المسارات الساخنة الآن واجهات برمجة تطبيقات الصفوف وتصحيحات الصفوف المعاد تجربتها عند التعارض؛ تقتصر مساعدات استيراد/استبدال المخزن بالكامل المتبقية على كود استيراد الترحيل واختبارات خلفية SQLite.
    • احذف store-writer.ts واختبارات طابور الكاتب. تم.
    • احذف تشذيب المفاتيح القديمة في وقت التشغيل ومعاملات حذف الأسماء البديلة من عمليات إدراج/تصحيح صفوف الجلسات. تم.
  1. احذف سلوك سجل JSON في وقت التشغيل.
    • اجعل قراءات وكتابات سجل sandbox خاصة بـ SQLite فقط. تم.
    • استورد JSON الأحادي والمجزأ فقط من خطوة الترحيل. تم.
    • أزل أقفال السجل المجزأ وكتابات JSON. تم.
  • احتفظ بجدول سجل نمطي واحد بدلا من تخزين صفوف السجل كـ JSON عام معتم إذا ظل الشكل حالة تشغيلية في المسار الساخن. تم.
  1. احذف طفرة الجلسات ذات شكل قفل الملفات.

    • تم ذلك لإنشاء الأقفال في وقت التشغيل وواجهات برمجة تطبيقات الأقفال في وقت التشغيل.
    • أزيل مسار تنظيف doctor المستقل القديم لـ .jsonl.lock.
    • session.writeLock هو تهيئة قديمة يرحلها doctor، وليس إعدادا نمطيا في وقت التشغيل.
    • لم تعد سلامة الحالة تحتوي على مسار منفصل لتشذيب ملفات النصوص اليتيمة؛ يستورد ترحيل doctor مصادر JSONL القديمة ويزيلها في مكان واحد.
    • يستخدم تنسيق المفردة في Gateway صفوف state_leases النمطية في SQLite تحت gateway_locks ولم يعد يعرض سطح دليل قفل ملفات.
    • لم يعد استمرار إزالة التكرار العام في Plugin SDK يستخدم أقفال ملفات أو ملفات JSON؛ بل يكتب صفوف حالة Plugin في SQLite المشتركة. تم.
    • يستخدم تنسيق تضمين QMD تأجير حالة في SQLite بدلا من qmd/embed.lock. تم.
  2. اجعل العاملين واعين بقاعدة البيانات.

    • يفتح العاملون اتصالات SQLite خاصة بهم.
    • يملك الأصل التسليم، واستدعاءات القنوات، والتهيئة.
    • يتلقى العامل معرّف الوكيل، ومعرّف التشغيل، ووضع نظام الملفات، وهوية سجل قاعدة البيانات، لا مقابض حية.
    • يبقى vfs-only تجريبيا ويستخدم قاعدة بيانات الوكيل بوصفها جذر التخزين الخاص به.
    • احتفظ بعامل واحد لكل تشغيل نشط أولا. يمكن للتجميع الانتظار حتى تصبح مدة حياة اتصال قاعدة البيانات وسلوك الإلغاء عاديين.
  3. تكامل النسخ الاحتياطي.

    • علّم النسخ الاحتياطي أخذ لقطات لقواعد البيانات العامة وقواعد بيانات الوكلاء عبر النسخ الاحتياطي في SQLite أو VACUUM INTO. تم ذلك لملفات *.sqlite المكتشفة ضمن أصل الحالة.
    • أضف تحقق النسخ الاحتياطي لسلامة SQLite وإصدار المخطط. تم ذلك لفحوصات السلامة عند إنشاء النسخ الاحتياطي والتحقق الافتراضي من الأرشيف.
    • سجّل بيانات تشغيل النسخ الاحتياطي الوصفية في SQLite. تم ذلك عبر جدول backup_runs المشترك مع مسار الأرشيف والحالة وJSON البيان.
    • أضف الاستعادة من لقطات الأرشيف المتحقق منها. تم: يتحقق openclaw backup restore قبل الاستخراج، ويستخدم البيان المطبّع من أداة التحقق، ويدعم --dry-run، ويتطلب --yes قبل استبدال مسارات المصدر المسجلة.
    • ضمّن تصدير VFS/مساحة العمل فقط عند الطلب؛ لا تصدّر داخليات الجلسات بصيغة JSON أو JSONL.
  4. احذف الاختبارات والكود المتقادمين. تم ذلك لأسطح جلسات وقت التشغيل المعروفة.

  • أزل الاختبارات التي تؤكد إنشاء وقت التشغيل لملف sessions.json أو ملفات JSONL للنصوص المنسوخة. تم ذلك لمخزن الجلسات الأساسي، والدردشة، وأحداث نصوص Gateway المنسوخة، والمعاينة، ودورة الحياة، وتحديثات إدخال جلسة الأوامر، وإعادة تعيين/تتبع الرد التلقائي، و تجهيزات Dreaming في نواة الذاكرة، وتوجيه هدف الموافقة، وإصلاح نص الجلسة المنسوخ، وإصلاح أذونات الأمان، وتصدير المسار، وتصدير الجلسة. اختبارات نصوص Active-memory المنسوخة تؤكد الآن نطاقات SQLite وعدم إنشاء ملفات JSONL مؤقتة أو مستمرة. أزيل اختبار الانحدار القديم لتقليم نصوص Heartbeat المنسوخة لأن وقت التشغيل لم يعد يقتطع نصوص JSONL المنسوخة. اختبارات أداة قائمة جلسات الوكيل لم تعد تنمذج مسارات sessions.json القديمة كشكل استجابة Gateway؛ تستخدم اختبارات التطبيق/UI/macOS databasePath. اختبارات استخدام النص المنسوخ في /status تزرع الآن صفوف نصوص SQLite المنسوخة مباشرة بدل كتابة ملفات JSONL. اختبارات دورة حياة جلسات Gateway تستخدم الآن مساعدات زرع نصوص SQLite المنسوخة مباشرة؛ اختفى شكل تجهيز ملف الجلسة أحادي السطر القديم من تغطية إعادة التعيين والحذف. لم يعد sessions.delete يعيد حقل عصر الملفات archived: []؛ يبلغ الحذف عن نتيجة تعديل الصف فقط. كما اختفى خيار deleteTranscript القديم: حذف جلسة يزيل جذر sessions القانوني ويترك SQLite يسلّسل حذف صفوف النصوص المنسوخة واللقطات والمسارات المملوكة للجلسة، لذلك لا يستطيع أي مستدعٍ ترك نصوص منسوخة يتيمة أو نسيان فرع تنظيف. اختبارات التقاط مسار محرك السياق تقرأ الآن صفوف trajectory_runtime_events من قاعدة بيانات وكيل معزولة بدلاً من قراءة session.trajectory.jsonl. سكربتات زرع قناة Docker MCP تزرع الآن صفوف SQLite مباشرة. تقتصر الكتابات المباشرة إلى sessions.json على تجهيزات doctor. يقرأ اختبار Tool Search Gateway E2E دليل استدعاء الأداة من صفوف نصوص SQLite المنسوخة بدل فحص ملفات agents/<agentId>/sessions/*.jsonl. أصبحت أحداث مضيف نواة الذاكرة وصفوف مسودة corpus الجلسة تعيش الآن في حالة Plugin المشتركة في SQLite؛ يعد events.jsonl وsession-corpus/*.txt مدخلات ترحيل doctor قديمة فقط. تستخدم الصفوف النشطة مسارات افتراضية memory/session-ingestion/، لا .dreams/session-corpus. أزيلت وحدة إصلاح Dreaming القديمة في نواة الذاكرة واختبارات CLI/Gateway الخاصة بها لأن وقت التشغيل لم يعد يملك إصلاح أرشيف الملفات لذلك corpus. اختبارات جسر/قطعة أثرية عامة في نواة الذاكرة لم تعد تعرض .dreams/events.jsonl؛ بل تستخدم اسم قطعة JSON الأثرية الافتراضية المدعومة بـ SQLite. تقول مستندات اختبار SDK/Codex العامة الآن حالة جلسات SQLite بدل ملفات الجلسات، ولم يعد مثال دورة القناة يعرض وسيطة storePath. تستخدم حالة مزامنة Matrix الآن مخزن حالة Plugin في SQLite مباشرة. تمرر عقود العميل/وقت التشغيل النشطة جذر تخزين حساب، وليس مسار bot-storage.json، ويستورد doctor ملف bot-storage.json القديم إلى SQLite قبل حذف المصدر. سيناريوهات QA Matrix لإعادة التشغيل/التدمير تعدّل الآن صف مزامنة SQLite مباشرة بدل إنشاء أو حذف ملفات bot-storage.json وهمية، وتمرر طبقة E2EE الأساسية جذر مخزن مزامنة بدل مسار sync-store.json وهمي. لم يعد اختيار جذر تخزين Matrix يسجل الجذور حسب ملفات JSON القديمة للمزامنة/الخيوط؛ بل يستخدم بيانات وصفية متينة للجذر مع حالة تشفير حقيقية. لم تعد حزمة اختبارات خلفية جلسات SQLite في وقت التشغيل تصطنع sessions.json؛ تعيش تجهيزات المصدر القديمة الآن في اختبارات doctor التي تستوردها. لم تعد اختبارات جلسات Gateway تعرض مساعد createSessionStoreDir أو إعداد مسار مخزن جلسات مؤقت غير مستخدم؛ أدلة التجهيز صريحة، والإعداد المباشر للصفوف يستخدم تسمية صفوف جلسات SQLite. انتقلت تغطية محلل مخزن الجلسات JSON5 الخاصة بـ doctor فقط من اختبارات البنية التحتية إلى اختبارات ترحيل doctor، لذلك لم تعد حزم اختبارات وقت التشغيل تملك تحليل ملفات الجلسات القديمة. لم تعد اختبارات Microsoft Teams لوقت التشغيل الخاصة بـ SSO/الرفع المعلق تحمل تجهيزات أو محللات JSON جانبية؛ يعيش تحليل رمز SSO القديم فقط في وحدة ترحيل Plugin. لم تعد اختبارات Telegram تزرع مسارات مخزن /tmp/*.json وهمية؛ بل تعيد ضبط ذاكرة الرسائل المؤقتة المدعومة بـ SQLite مباشرة. لم يعد مساعد حالة الاختبار العام في OpenClaw يعرض كاتب auth-profiles.json قديم؛ تملك اختبارات ترحيل مصادقة doctor ذلك التجهيز محليًا. اختبارات وقت التشغيل لمؤشرات آخر جلسة في TUI، وموافقات التنفيذ، ومفاتيح active-memory، والتحقق من إزالة التكرار/بدء التشغيل في Matrix، ومزامنة مصدر Memory Wiki، وروابط المحادثة الحالية، ومصادقة الإعداد، واستيرادات أسرار Hermes لم تعد تصطنع ملفات جانبية قديمة أو تؤكد غياب أسماء الملفات القديمة. إنها تثبت السلوك عبر صفوف SQLite وواجهات API العامة للمخزن؛ اختبارات doctor/الترحيل هي المكان الوحيد الذي تنتمي إليه أسماء ملفات المصدر القديمة. اختبارات وقت التشغيل لإقران الجهاز/العقدة، وchannel allowFrom، ونوايا إعادة التشغيل، وتسليم إعادة التشغيل، وإدخالات طابور تسليم الجلسات، وصحة الإعدادات، وذاكرات iMessage المؤقتة، ومهام Cron، وترويسات نصوص PI المنسوخة، وسجلات الوكلاء الفرعيين، ومرفقات الصور المُدارة لم تعد تنشئ أيضًا ملفات JSON/JSONL متقاعدة فقط لإثبات أنها متجاهلة أو غائبة. لم يعد استرداد فائض PI يحتوي على احتياطي إعادة كتابة/اقتطاع في SessionManager: اقتطاع نتائج الأدوات وإعادات كتابة النصوص المنسوخة في محرك السياق تعدّل صفوف نصوص SQLite المنسوخة، ثم تحدّث حالة الموجه النشط من قاعدة البيانات. تفوض إلحاقات رسائل SessionManager المستمرة إلى مساعد إلحاق نصوص SQLite المنسوخة الذري لاختيار الأصل وتحقيق idempotency. تختار إلحاقات بيانات الوصف/الإدخالات المخصصة العادية أيضًا الأصل الحالي داخل SQLite، لذلك لا تعيد مثيلات المدير القديمة إحياء سباقات سلسلة الأصل قبل SQLite. تنظيف ذيل PI الاصطناعي للفحوصات المسبقة وسط الدورة وsessions_yield يقتطع الآن حالة نصوص SQLite المنسوخة مباشرة؛ حُذف جسر إزالة الذيل القديم في SessionManager واختباراته. التقاط نقطة تحقق Compaction يأخذ اللقطات من SQLite فقط أيضًا؛ لم يعد المستدعون يمررون SessionManager حيًا كمصدر بديل للنصوص المنسوخة.

  • أبقِ الاختبارات التي تزرع الملفات القديمة للترحيل فقط.

  • استُبدل دليل ملفات JSON بدليل صفوف SQL لأسطح وقت التشغيل النشطة.

  • أضف حظرًا ثابتًا لكتابات وقت التشغيل إلى مسارات JSON القديمة للجلسات/الذاكرات المؤقتة. تم ذلك لحارس المستودع.

  1. اجعل تقرير الترحيل قابلاً للتدقيق.
    • سجّل عمليات الترحيل في SQLite مع طوابع وقت البدء/الانتهاء، ومسارات المصدر، وتجزئات المصدر، والأعداد، والتحذيرات، ومسار النسخ الاحتياطي. تم: أصبحت تنفيذات ترحيل الحالة القديمة تستمر في حفظ تقرير migration_runs مع مخزون مسارات/جداول المصدر، وSHA-256 لملف المصدر، والأحجام، وأعداد السجلات، والتحذيرات، ومسار النسخ الاحتياطي. تم: تحفظ تنفيذات ترحيل الحالة القديمة أيضًا صفوف migration_sources للتدقيق على مستوى المصدر وقرارات التخطي/الإكمال اللاحقة في المستقبل.
    • اجعل التطبيق idempotent. عند إعادة التشغيل بعد استيراد جزئي، ينبغي إما تخطي مصدر مستورد بالفعل أو دمجه بمفتاح مستقر. تم: تستورد فهارس الجلسات، والنصوص المنسوخة، وطوابير التسليم، وحالة Plugin، ودفاتر المهام، وصفوف SQLite العامة المملوكة للوكيل عبر مفاتيح مستقرة أو دلالات upsert/replace، لذلك تدمج عمليات إعادة التشغيل دون تكرار الصفوف المتينة.
    • يجب أن تبقي الاستيرادات الفاشلة ملف المصدر الأصلي في مكانه. تم: تترك استيرادات النصوص المنسوخة الفاشلة الآن مصدر JSONL الأصلي في مساره المكتشف، ويسجل migration_sources المصدر كـ warning مع removed_source=0 لتشغيل doctor التالي.

قواعد الأداء

  • اتصال واحد لكل خيط/عملية مقبول؛ لا تشارك المقابض بين العاملين.
  • استخدم WAL، وforeign_keys=ON، ومهلة انشغال 30 ثانية، ومعاملات كتابة قصيرة BEGIN IMMEDIATE.
  • أبقِ مساعدات معاملات الكتابة متزامنة ما لم/حتى تضيف واجهة API معاملات غير متزامنة دلالات mutex/backpressure صريحة.
  • أبقِ كتابات تسليم الأصل صغيرة وضمن معاملات.
  • تجنب إعادة كتابة المخزن كله؛ استخدم upsert/delete على مستوى الصف.
  • أضف فهارس لمسارات القائمة حسب الوكيل، والقائمة حسب الجلسة، وupdated-at، ومعرّف التشغيل، والانتهاء قبل نقل الكود الساخن.
  • خزّن القطع الأثرية الكبيرة والوسائط والمتجهات كـ BLOBs أو صفوف BLOB مجزأة، لا JSON بترميز base64 أو مصفوفات رقمية.
  • أبقِ إدخالات حالة Plugin المعتمة صغيرة ومحددة النطاق.
  • أضف تنظيف SQL لـ TTL/الانتهاء بدل تقليم نظام الملفات. تم ذلك للمخازن وقت التشغيل المملوكة لقاعدة البيانات: الوسائط، وحالة Plugin، وكتل Plugin الثنائية، وإزالة التكرار المستمرة، وذاكرة الوكيل المؤقتة، كلها تنتهي عبر صفوف SQLite. يقتصر تنظيف نظام الملفات المتبقي على التمثيلات المؤقتة أو أوامر الإزالة الصريحة.

الحظر الثابت

أضف فحص مستودع يفشل كتابات وقت التشغيل الجديدة إلى مسارات الحالة القديمة:

  • sessions.json
  • *.trajectory.jsonl باستثناء مخرجات حزمة الدعم المنشأة فعليًا
  • .acp-stream.jsonl
  • acp/event-ledger.json
  • ملفات ذاكرة التخزين المؤقت وقت التشغيل cache/*.json
  • agents/<agentId>/agent/auth.json
  • agents/<agentId>/agent/models.json
  • credentials/oauth.json
  • github-copilot.token.json
  • openrouter-models.json
  • auth-profiles.json
  • auth-state.json
  • exec-approvals.json
  • workspace-state.json
  • ملفات Matrix credentials*.json وrecovery-key.json
  • cron/runs/*.jsonl
  • cron/jobs.json
  • jobs-state.json
  • device-pair-notify.json
  • devices/pending.json
  • devices/paired.json
  • devices/bootstrap.json
  • nodes/pending.json
  • nodes/paired.json
  • identity/device.json
  • identity/device-auth.json
  • push/web-push-subscriptions.json
  • push/vapid-keys.json
  • push/apns-registrations.json
  • process-leases.json
  • gateway-instance-id
  • session-toggles.json
  • Memory-core .dreams/events.jsonl
  • Memory-core .dreams/session-corpus/
  • Memory-core .dreams/daily-ingestion.json
  • Memory-core .dreams/session-ingestion.json
  • Memory-core .dreams/short-term-recall.json
  • Memory-core .dreams/phase-signals.json
  • Memory-core .dreams/short-term-promotion.lock
  • Skill Workshop skill-workshop/<workspace>.json
  • Skill Workshop skill-workshop/skill-workshop-review-*.json
  • Nostr bus-state-*.json
  • Nostr profile-state-*.json
  • calls.jsonl
  • known-users.json
  • ref-index.jsonl
  • QQBot session-*.json
  • BlueBubbles bluebubbles/catchup/*.json
  • BlueBubbles bluebubbles/inbound-dedupe/*.json
  • Telegram update-offset-*.json
  • Telegram sticker-cache.json
  • Telegram *.telegram-messages.json
  • Telegram *.telegram-sent-messages.json
  • Telegram *.telegram-topic-names.json
  • Telegram thread-bindings-*.json
  • iMessage catchup/*.json
  • iMessage reply-cache.jsonl
  • iMessage sent-echoes.jsonl
  • Microsoft Teams msteams-conversations.json
  • Microsoft Teams msteams-polls.json
  • Microsoft Teams msteams-sso-tokens.json
  • Microsoft Teams *.learnings.json
  • Matrix bot-storage.json
  • Matrix sync-store.json
  • Matrix thread-bindings.json
  • Matrix inbound-dedupe.json
  • Matrix startup-verification.json
  • Matrix storage-meta.json
  • Matrix crypto-idb-snapshot.json
  • Discord model-picker-preferences.json
  • Discord command-deploy-cache.json
  • ملفات JSON لشظايا سجل sandbox
  • ملفات JSON لجسر /tmp الخاص بترحيل الخطاف الأصلي
  • plugin-state/state.sqlite
  • ملفات جانبية وقت التشغيل مخصصة openclaw-state.sqlite
  • tasks/runs.sqlite
  • tasks/flows/registry.sqlite
  • bindings/current-conversations.json
  • restart-sentinel.json
  • gateway-restart-intent.json
  • gateway-supervisor-restart-handoff.json
  • gateway.<hash>.lock
  • qmd/embed.lock
  • commands.log
  • config-health.json
  • port-guard.json
  • settings/voicewake.json
  • settings/voicewake-routing.json
  • plugin-binding-approvals.json
  • plugins/installs.json
  • audit/file-transfer.jsonl
  • audit/crestodian.jsonl
  • crestodian/rescue-pending/*.json
  • plugins/phone-control/armed.json
  • Memory Wiki .openclaw-wiki/log.jsonl
  • Memory Wiki .openclaw-wiki/state.json
  • Memory Wiki .openclaw-wiki/locks/
  • Memory Wiki .openclaw-wiki/source-sync.json
  • Memory Wiki .openclaw-wiki/import-runs/*.json
  • Memory Wiki .openclaw-wiki/cache/agent-digest.json
  • Memory Wiki .openclaw-wiki/cache/claims.jsonl
  • ClawHub .clawhub/lock.json
  • ClawHub .clawhub/origin.json
  • زخرفة ملف تعريف المتصفح .openclaw-profile-decorated
  • فاتحات جلسات مدعومة بالملفات SessionManager.open(...)
  • واجهات سرد النصوص SessionManager.listAll(...) وTranscriptSessionManager.listAll(...)
  • واجهات تفريع النصوص SessionManager.forkFromSession(...) و TranscriptSessionManager.forkFromSession(...)
  • واجهات استبدال الجلسات القابلة للتغيير SessionManager.newSession(...) وTranscriptSessionManager.newSession(...)
  • واجهات جلسات الفروع SessionManager.createBranchedSession(...) و TranscriptSessionManager.createBranchedSession(...)

يجب أن يسمح الحظر للاختبارات بإنشاء تجهيزات قديمة، وأن يسمح لكود الترحيل بقراءة مصادر الملفات القديمة أو استيرادها أو إزالتها. تبقى ملفات SQLite الجانبية غير المشحونة محظورة، ولا تحصل على سماحات استيراد في doctor.

معايير الإنجاز

  • تنتقل كتابات بيانات وقت التشغيل وذاكرة التخزين المؤقت إلى قاعدة بيانات SQLite العامة أو الخاصة بالوكيل.
  • لم يعد وقت التشغيل يكتب فهارس الجلسات أو JSONL للنصوص أو JSON لسجل sandbox أو SQLite جانبية للمهام أو SQLite جانبية لحالة Plugin. تُحذف مستوردات SQLite الجانبية غير المشحونة للمهام وحالة Plugin.
  • استيراد الملفات القديمة يقتصر على doctor فقط.
  • ينتج النسخ الاحتياطي أرشيفًا واحدًا يحتوي على لقطات SQLite مدمجة وإثبات سلامة.
  • يمكن لعمال الوكلاء العمل باستخدام القرص أو مساحة خدش VFS أو تخزين VFS-only التجريبي.
  • تبقى ملفات الإعدادات وملفات بيانات الاعتماد الصريحة هي ملفات التحكم الدائمة غير المعتمدة على قاعدة بيانات الوحيدة المتوقعة.
  • تمنع فحوصات المستودع إعادة إدخال مخازن ملفات وقت التشغيل القديمة.
Was this useful?
On this page

On this page