Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 46 additions & 7 deletions .github/i18n/README.ar.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,17 @@ opencode-mem **لا** يتطلب وحدة معالجة رسومات (GPU). تع

على macOS وLinux، يمكن لعدة جلسات OpenCode مشاركة نفس `storagePath` عبر `multiprocess_wal` التجريبي من Turso (يجب أن يستخدم كل عملية نفس الوضع — أعد تشغيل جميع الجلسات بعد الترقية). على Windows يرفض المحرك ذلك العلم، لذا يمكن لجلسة OpenCode واحدة فقط امتلاك قواعد بيانات الذاكرة في وقت واحد.

يفتح `tursoMultiprocessWal: false` في وضع المالك الواحد بدلًا من ذلك: تفشل العمليات الأخرى بـ `database is locked` بدل مشاركة المخزن. هذا الخيار أكثر أمانًا إذا لمست أدوات خارج المكوّن الإضافي نفس الملفات، لأن عملية SQLite أجنبية _تكتب_ تجعل فهرس WAL لـ Turso قديمًا وتُفقد الكتابة التالية بصمت. ينقل `tursoAutoHeal` (الافتراضي `true`) ملفات الفهرس الجانبية `-shm`/`-tshm` للمخزن إلى `storagePath/recovery/<db>-<timestamp>/` ويعيد المحاولة مرة عند فشل الفتح بسبب فهرس WAL قديم، بعد التحقق من نسخة من قاعدة البيانات الرئيسية. لا يُنقل `-wal` غير الفارغ أبدًا، فتبقى المعاملات المُلتزَم بها وغير المُتحققَنَة؛ يُزال فقط `-wal` المفقود أو ذو حجم 0 بايت. تُسلسل الجلسات المتزامنة الإصلاح عبر `storagePath/recovery/<db>.lock`.

عند أول تشغيل بعد الترقية، يرحّل opencode-mem تلقائيًا قواعد بيانات أجزاء الذاكرة الحالية إلى تنسيق متجهات Turso/libSQL الأصلي:

- يُنسخ كل جزء احتياطيًا باسم `<shard>.db.legacy.bak` قبل إعادة الكتابة
- يُتتبَّع التقدم لكل جزء في `<shard>.db.turso-migrate.json`
- تُكتب علامة عالمية `.turso-migrated` فقط بعد التحقق الناجح من جميع الأجزاء
- لا تُبطل الإدراجات والحذف العادية ترحيل جزء مكتمل؛ لا يزال البدء يتحقق من أن المتجهات قابلة للقراءة وتطابق الأبعاد المخزّنة
- لا تشغّل عدة نسخ من OpenCode ضد نفس `storagePath` أثناء الترحيل؛ يمنع ملف قفل (`.turso-migrate.lock`) الترحيل المتزامن
- تستخدم ترحيلات الأبعاد اليدوية `.turso-operation.lock`؛ ترفض عمليات المكون الإضافي الأخرى كتابات الذاكرة الجديدة حتى ينتهي الترحيل
- تنتهي الأقفال بعد 30 دقيقة دون تحديث طابع زمني للتقدم (أو وقت تعديل الملف إن تعذّر الطابع)، حتى لو كانت العملية المالكة حيّة. يستخدم هذا الإيجار ساعة الحائط: قفزة ساعة للأمام أكبر من 30 دقيقة قد تُنهي عملية جارية مبكرًا؛ قفزة للخلف أو قفل مؤرخ في المستقبل قد يمدّد عمر قفل خامل. تحمل الأقفال معرّف اقتناء فريدًا، وتنظيف الأقفال البالية يزيل فقط الملف الذي فحصه. ترسل الترحيلات نبضات أثناء التقدم وتُلغى إذا اكتشفت فقدان الملكية. يُسجَّل تنظيف الأقفال البالية للتشخيص.

إذا انقطع الترحيل، يستأنف التشغيل التالي تلقائيًا من النسخة الاحتياطية.

Expand Down Expand Up @@ -161,15 +165,27 @@ opencode-mem **لا** يتطلب وحدة معالجة رسومات (GPU). تع

ما زال البحث/الإضافة/القائمة اليدوية تعمل حتى لو لم يكن للالتقاط التلقائي مزود مُعَد. يحتاج الالتقاط التلقائي وتعلّم ملف المستخدم مزودًا يمكنه إرجاع مخرجات منظمة/استدعاء أدوات.

### الذاكرة مقابل AGENTS.md / وثائق المشروع
### الذاكرة مقابل AGENTS.md مقابل Skills

| خزّن في **الذاكرة** | خزّن في **AGENTS.md** / الوثائق الثابتة | خزّن كـ **Skills** (واجهة الويب / `skills.db`) |
| -------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- |
| قرارات خاصة بالمشروع، أنماط أخطاء، «جرّبنا X وفشل» | قواعد وسير عمل مستقرة نادرًا ما تتغير | إجراءات قابلة لإعادة الاستخدام يحمّلها الوكيل عند الحاجة |
| تفضيلات المستخدم المكتشفة عبر الجلسات | اصطلاحات البرمجة والعملية الدائمة | حزم skills قابلة للتحرير من الفريق عبر نفس التخزين |
| حقائق يجب أن تتبعك عبر المحادثات | تعليمات يجب أن يراها كل وكيل بغض النظر عن الاسترجاع | أداة `skill` الأصلية في OpenCode (جسر إضافة V2) |

قاعدة عامة: تعليمات المشروع الدائمة دائمًا → `AGENTS.md`؛ سياق العمل المتنامي → الذاكرة؛ الإجراءات عند الطلب القابلة لإعادة الاستخدام → **Skills**.

#### Shared Skills (V2)

| خزّن في **الذاكرة** | خزّن في **AGENTS.md** / الوثائق الثابتة |
| -------------------------------------------------- | --------------------------------------------------- |
| قرارات خاصة بالمشروع، أنماط أخطاء، «جرّبنا X وفشل» | قواعد وسير عمل مستقرة نادرًا ما تتغير |
| تفضيلات المستخدم المكتشفة عبر الجلسات | اصطلاحات البرمجة والعملية الدائمة |
| حقائق يجب أن تتبعك عبر المحادثات | تعليمات يجب أن يراها كل وكيل بغض النظر عن الاسترجاع |
- أنشئ/حرّر المهارات في مستكشف الويب (علامة تبويب **Skills** في `/skill-library`).
- تُحفَظ في `skills.db` تحت مسار تخزين المكوّن الإضافي (وليست متجهات ذاكرة).
- على OpenCode **V2** يسجّل المكوّن الإضافي المهارات المفعّلة عبر `ctx.skill.transform` حتى يحمّلها الوكيل بأداة `skill` الأصلية.
- كتالوج HTTP اختياري لنسخ OpenCode الأخرى: `"skills": ["http://127.0.0.1:4747/skills/"]` (يقدّم `/skills/index.json` و`/skills/<id>/<id>.md` — منفصل عن مسار الواجهة).
- REST: `GET/POST /api/skills`، `GET/PUT/DELETE /api/skills/:id`.

قاعدة عامة: إذا كانت تعليمات مشروع دائمة، ضعها في AGENTS.md؛ إذا كان سياقًا ينمو من العمل الفعلي، دع الذاكرة (أو الالتقاط التلقائي) تحتفظ به.
### إحصاءات الصحة

تعرض علامة تبويب **Stats** في واجهة الويب (في `/stats`) صحة نظام الذاكرة بنظرة واحدة: إجماليات لكل نطاق، وعدّادات الذاكرة لكل جزء مع تحذيرات الأجزاء البالية/المفقودة ووكيل تكرار نفس الوسم، وإصدار ملف المستخدم النشط، وسلسلة نشاط لـ14 يومًا (التقاطات، التقاطات المتخطاة، حقن الملف/الضغط، وأخطاء مجمّعة حسب الرسالة) مُحلَّلة من سجلات المكوّن الإضافي المنظَّمة في `~/.opencode-mem/`. للقراءة فقط — `GET /api/stats` — وتتراجع لكل قسم إن تعذّر الوصول إلى قاعدة بيانات، فتواصل الإبلاغ أثناء الحوادث.

### استخراج الذاكرة الذكي المستند إلى المطالبات

Expand Down Expand Up @@ -219,6 +235,29 @@ memory({ mode: "import", inputPath: "./memories.json" });

ينشئ المكون الإضافي قالبًا كاملًا معلَّقًا في هذا المسار عند أول تشغيل. لكل إعداد وتعليق، انظر [`opencode-mem.example.jsonc`](../../opencode-mem.example.jsonc).

### خلفية Markdown vault (`memoryBackend`)

افتراضيًا تعيش الذكريات فقط في Turso تحت `storagePath`. يمكنك اختياريًا تعيين **مجلد Markdown عام** كمصدر حقيقة (ملفات `.md` عادية متوافقة مع Obsidian/Raneto — وليست تكاملًا خاصًا بـ Obsidian):

```jsonc
{
"memoryBackend": "markdown",
"markdownPath": "~/Documents/LLM-Wiki",
}
```

| المفتاح | الافتراضي | ماذا يفعل |
| --------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `memoryBackend` | `"database"` | `"database"` يبقي المحتوى في Turso. `"markdown"` يستخدم كل ملفات `.md` تحت `markdownPath` كمصدر حقيقة. |
| `markdownPath` | — | مطلوب عندما يكون `memoryBackend` هو `"markdown"`. مسار مطلق أو `~/…` لمجلد الـ vault. لا مجلد ذاكرة فرعي منفصل — المسار _هو_ المخزن. |

عند تفعيل وضع Markdown:

- تُكتب الذكريات التي ينشئها المكوّن الإضافي كـ `{id}.md` مع YAML frontmatter + المحتوى.
- تُستورد/تُفهرس الملاحظات الموجودة في المجلد (أي أسلوب صفحة Markdown)؛ وTurso مجرد فهرس بحث دلالي قابل لإعادة البناء.
- تُراقَب إضافات/تعديلات/حذف الملفات ويُعاد فهرستها؛ تعرض واجهة الويب صفحة شريط جانبي **Markdown** (الحالة، قائمة الملفات، إعادة الفهرسة) في هذا الوضع فقط.
- التبديل إلى Markdown يعيد بناء الفهرس من المجلد — تُسقَط صفوف قاعدة البيانات فقط بلا ملف مطابق. صدّر أولًا بـ `memory export` إن احتجت الإبقاء على ذكريات قاعدة البيانات القديمة.

### التقاط رسائل الدردشة وحقنها (`chatMessage`)

تعيش هذه الإعدادات تحت المفتاح `chatMessage` في `~/.config/opencode/opencode-mem.jsonc`:
Expand Down
Loading