{"title":"بنية Synapse","slug":"architecture","category":"concepts","summary":"كيف بُني Synapse — Fastify، PostgreSQL، FTS5، التضمينات، خادم MCP.","audience":["human","llm"],"tags":["architecture","design","components"],"difficulty":"intermediate","updated":"2026-06-27","word_count":431,"read_minutes":2,"lang":"ar","translated":true,"requested_lang":"ar","content_markdown":"\n# بنية Synapse\n\nSynapse واجهة ذاكرة متعددة المستأجرين مبنية على Fastify، و PostgreSQL مع FTS5،\nوخدمة تضمينات اختيارية للبحث الدلالي.\n\n## البنية عالية المستوى\n\n```\n┌──────────────────────────────────────────────────────────┐\n│                       Clients                            │\n├──────────────┬──────────────┬──────────────┬─────────────┤\n│  LLM Agents  │  Web Browsers│  MCP Clients │  Webhooks   │\n│  (curl/SDK)  │  (humans)    │ (Claude/etc) │  (external) │\n└──────┬───────┴──────┬───────┴──────┬───────┴──────┬──────┘\n       │              │              │              │\n       └──────────────┴──────────────┴──────────────┘\n                              │\n                              ▼\n              ┌───────────────────────────────┐\n              │    Synapse API (Fastify)      │\n              │    port 12800                 │\n              │    - REST endpoints           │\n              │    - Auth (Mind Key / JWT)    │\n              │    - Rate limiting            │\n              │    - Static file serving      │\n              └───────────────┬───────────────┘\n                              │\n              ┌───────────────┼───────────────┐\n              ▼               ▼               ▼\n       ┌─────────────┐ ┌─────────────┐ ┌─────────────┐\n       │ PostgreSQL  │ │ Embeddings  │ │ MCP Server  │\n       │ + FTS5      │ │ Service     │ │ (separate)  │\n       │             │ │ (optional)  │ │ port 13100  │\n       │ - memories  │ │             │ │             │\n       │ - tasks     │ │ - generate  │ │ - 79 tools  │\n       │ - chat      │ │   embeddings│ │ - stdio/SSE │\n       │ - scripts   │ │             │ │ - WebSocket │\n       └─────────────┘ └─────────────┘ └─────────────┘\n```\n\n## المكوّنات الأساسية\n\n### 1. Synapse API (Fastify)\n\nخادم HTTP الرئيسي. يتولى:\n\n- نقاط نهاية REST (`/memory`، `/chat`، `/mind/tasks`، إلخ)\n- المصادقة (Mind Key للوكلاء، JWT للبشر)\n- حدود المعدل (مصادقة `?key=` فقط)\n- تقديم الملفات الثابتة (واجهة الويب في `/human`، `/docs`، إلخ)\n- إرسال الـ webhooks\n\nبُني بـ **Fastify 5** للأداء. يعمل على المنفذ 12800 في الإنتاج.\n\n### 2. PostgreSQL مع FTS5\n\nمخزن البيانات الأساسي. يستخدم PostgreSQL مع امتداد FTS5 للبحث\nبنص كامل.\n\n**الجداول الرئيسية:**\n\n| الجدول | الغرض |\n|-------|---------|\n| `users` | حسابات المستخدمين |\n| `minds` | نطاقات العقل (لكل واحد Mind Key) |\n| `memories` | سجلات الذاكرة مع جدول FTS5 الافتراضي |\n| `tasks` | إدارة المهام |\n| `chat_messages` | سجل الدردشة |\n| `scripts` | السكربتات الدائمة |\n| `webhooks` | تسجيلات الـ webhooks |\n| `cron_jobs` | المهام المجدولة |\n| `variables` | تخزين القيم الأساسية |\n| `audit_log` | مسار التدقيق |\n\nيُمكّن **FTS5** بحثًا نصيًا كاملًا أقل من مللي ثانية عبر جميع محتويات الذاكرة.\nراجع [بحث FTS5](/docs/concepts/fts5-search) للتفاصيل.\n\n### 3. خدمة التضمينات (اختيارية)\n\nللبحث الدلالي، يُولّد Synapse تضمينات متجهة لمحتوى الذاكرة.\nتُخزّن بجانب الذكريات وتُستخدم للبحث عن التشابه.\n\n- المزوّد: قابل للإعداد (OpenAI، نموذج محلي، إلخ)\n- يُخزَّن كعمود `vector` في جدول `memories`\n- يُستخدم بواسطة نقطة النهاية `/memory/semantic-search`\n- راجع [البحث الدلالي](/docs/concepts/semantic-search)\n\n### 4. خادم MCP (خدمة منفصلة)\n\nيعمل خادم Synapse MCP كعملية منفصلة (المنفذ 13100). يقوم بـ:\n\n- عرض 79 أداة عبر Model Context Protocol\n- دعم نقل stdio و HTTP/SSE و WebSocket\n- ترجمة استدعاءات أدوات MCP إلى استدعاءات Synapse API\n- متعدد المستأجرين: Mind Key واحد لكل جلسة\n\n### 5. وكيل المتصفح (خدمة منفصلة)\n\nلأتمتة المتصفح، تعمل خدمة منفصلة قائمة على Playwright على المنفذ 13000.\nيمكن لخادم MCP استدعاؤها لأدوات `browser_*`.\n\n### 6. وكيل SSH (خدمة منفصلة)\n\nلأوامر SSH البعيدة، تعمل خدمة منفصلة على المنفذ 12900.\n\n## نموذج تعدد المستأجرين\n\n```\nUser Account (email + password)\n  │\n  ├── Mind 1 (Mind Key 1)\n  │   ├── Memories\n  │   ├── Tasks\n  │   ├── Chat\n  │   └── Scripts\n  │\n  ├── Mind 2 (Mind Key 2)\n  │   └── ... (isolated from Mind 1)\n  │\n  └── Mind 3 (Mind Key 3)\n      └── ...\n```\n\nكل عقل معزول تمامًا. تمنح Mind Keys الوصول إلى عقل واحد فقط.\nتمنح JWTs الوصول إلى حساب المستخدم (لإدارة العقول).\n\nراجع [تعدد المستأجرين](/docs/concepts/multi-tenancy) للتفاصيل.\n\n## تدفق الطلبات\n\n### طلب تخزين الذاكرة\n\n```\n1. Client sends POST /memory with Authorization: Bearer mk_xxx\n2. Fastify receives request\n3. Auth middleware validates Mind Key, attaches mind_id to request\n4. Memory route handler:\n   a. Validate JSON body (zod schema)\n   b. Insert into memories table\n   c. Update FTS5 index\n   d. (Async) Generate embedding if embeddings enabled\n   e. Trigger webhooks for memory.store event\n5. Return { id, status: \"stored\" }\n```\n\n### طلب بحث الذاكرة\n\n```\n1. Client sends GET /memory/search?q=docker\n2. Auth middleware validates Mind Key\n3. Memory route handler:\n   a. Parse query (FTS5 syntax)\n   b. Execute FTS5 MATCH against memories table\n   c. Filter by mind_id (tenant isolation)\n   d. Rank by relevance\n   e. Return results\n```\n\n## النشر\n\nيُنشر Synapse كحاوية Docker. راجع `docker-compose.yml`:\n\n```yaml\nservices:\n  synapse:\n    image: registry.gitlab.com/schaefer-services/synapse:latest\n    ports:\n      - \"12800:12800\"\n    environment:\n      - DATABASE_URL=postgres://...\n      - JWT_SECRET=...\n      - SYNAPSE_HOST=0.0.0.0\n      - SYNAPSE_PORT=12800\n    depends_on:\n      - postgres\n  \n  postgres:\n    image: postgres:16\n    volumes:\n      - pgdata:/var/lib/postgresql/data\n    environment:\n      - POSTGRES_DB=synapse\n      - POSTGRES_PASSWORD=...\n```\n\n## خصائص الأداء\n\n| العملية | زمن الاستجابة | الإنتاجية |\n|-----------|---------|------------|\n| تخزين ذاكرة | ~5 مللي ث | 1000+ طلب/ث |\n| استدعاء ذاكرة | ~20 مللي ث | 500 طلب/ث |\n| بحث FTS5 | ~10 مللي ث | 800 طلب/ث |\n| بحث دلالي | ~50 مللي ث | 200 طلب/ث |\n| استطلاع الدردشة | ~5 مللي ث | 2000 طلب/ث |\n\n## الخطوات التالية\n\n- [نموذج الذاكرة](/docs/concepts/memory-model)\n- [تعدد المستأجرين](/docs/concepts/multi-tenancy)\n- [بحث FTS5](/docs/concepts/fts5-search)\n","content_html":"<h1>بنية Synapse</h1>\n<p>Synapse واجهة ذاكرة متعددة المستأجرين مبنية على Fastify، و PostgreSQL مع FTS5،\nوخدمة تضمينات اختيارية للبحث الدلالي.</p>\n<h2>البنية عالية المستوى</h2>\n<pre><code class=\"hljs language-plaintext\">┌──────────────────────────────────────────────────────────┐\n│                       Clients                            │\n├──────────────┬──────────────┬──────────────┬─────────────┤\n│  LLM Agents  │  Web Browsers│  MCP Clients │  Webhooks   │\n│  (curl/SDK)  │  (humans)    │ (Claude/etc) │  (external) │\n└──────┬───────┴──────┬───────┴──────┬───────┴──────┬──────┘\n       │              │              │              │\n       └──────────────┴──────────────┴──────────────┘\n                              │\n                              ▼\n              ┌───────────────────────────────┐\n              │    Synapse API (Fastify)      │\n              │    port 12800                 │\n              │    - REST endpoints           │\n              │    - Auth (Mind Key / JWT)    │\n              │    - Rate limiting            │\n              │    - Static file serving      │\n              └───────────────┬───────────────┘\n                              │\n              ┌───────────────┼───────────────┐\n              ▼               ▼               ▼\n       ┌─────────────┐ ┌─────────────┐ ┌─────────────┐\n       │ PostgreSQL  │ │ Embeddings  │ │ MCP Server  │\n       │ + FTS5      │ │ Service     │ │ (separate)  │\n       │             │ │ (optional)  │ │ port 13100  │\n       │ - memories  │ │             │ │             │\n       │ - tasks     │ │ - generate  │ │ - 79 tools  │\n       │ - chat      │ │   embeddings│ │ - stdio/SSE │\n       │ - scripts   │ │             │ │ - WebSocket │\n       └─────────────┘ └─────────────┘ └─────────────┘</code></pre><h2>المكوّنات الأساسية</h2>\n<h3>1. Synapse API (Fastify)</h3>\n<p>خادم HTTP الرئيسي. يتولى:</p>\n<ul>\n<li>نقاط نهاية REST (<code>/memory</code>، <code>/chat</code>، <code>/mind/tasks</code>، إلخ)</li>\n<li>المصادقة (Mind Key للوكلاء، JWT للبشر)</li>\n<li>حدود المعدل (مصادقة <code>?key=</code> فقط)</li>\n<li>تقديم الملفات الثابتة (واجهة الويب في <code>/human</code>، <code>/docs</code>، إلخ)</li>\n<li>إرسال الـ webhooks</li>\n</ul>\n<p>بُني بـ <strong>Fastify 5</strong> للأداء. يعمل على المنفذ 12800 في الإنتاج.</p>\n<h3>2. PostgreSQL مع FTS5</h3>\n<p>مخزن البيانات الأساسي. يستخدم PostgreSQL مع امتداد FTS5 للبحث\nبنص كامل.</p>\n<p><strong>الجداول الرئيسية:</strong></p>\n<table>\n<thead>\n<tr>\n<th>الجدول</th>\n<th>الغرض</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>users</code></td>\n<td>حسابات المستخدمين</td>\n</tr>\n<tr>\n<td><code>minds</code></td>\n<td>نطاقات العقل (لكل واحد Mind Key)</td>\n</tr>\n<tr>\n<td><code>memories</code></td>\n<td>سجلات الذاكرة مع جدول FTS5 الافتراضي</td>\n</tr>\n<tr>\n<td><code>tasks</code></td>\n<td>إدارة المهام</td>\n</tr>\n<tr>\n<td><code>chat_messages</code></td>\n<td>سجل الدردشة</td>\n</tr>\n<tr>\n<td><code>scripts</code></td>\n<td>السكربتات الدائمة</td>\n</tr>\n<tr>\n<td><code>webhooks</code></td>\n<td>تسجيلات الـ webhooks</td>\n</tr>\n<tr>\n<td><code>cron_jobs</code></td>\n<td>المهام المجدولة</td>\n</tr>\n<tr>\n<td><code>variables</code></td>\n<td>تخزين القيم الأساسية</td>\n</tr>\n<tr>\n<td><code>audit_log</code></td>\n<td>مسار التدقيق</td>\n</tr>\n</tbody></table>\n<p>يُمكّن <strong>FTS5</strong> بحثًا نصيًا كاملًا أقل من مللي ثانية عبر جميع محتويات الذاكرة.\nراجع <a href=\"/docs/concepts/fts5-search\">بحث FTS5</a> للتفاصيل.</p>\n<h3>3. خدمة التضمينات (اختيارية)</h3>\n<p>للبحث الدلالي، يُولّد Synapse تضمينات متجهة لمحتوى الذاكرة.\nتُخزّن بجانب الذكريات وتُستخدم للبحث عن التشابه.</p>\n<ul>\n<li>المزوّد: قابل للإعداد (OpenAI، نموذج محلي، إلخ)</li>\n<li>يُخزَّن كعمود <code>vector</code> في جدول <code>memories</code></li>\n<li>يُستخدم بواسطة نقطة النهاية <code>/memory/semantic-search</code></li>\n<li>راجع <a href=\"/docs/concepts/semantic-search\">البحث الدلالي</a></li>\n</ul>\n<h3>4. خادم MCP (خدمة منفصلة)</h3>\n<p>يعمل خادم Synapse MCP كعملية منفصلة (المنفذ 13100). يقوم بـ:</p>\n<ul>\n<li>عرض 79 أداة عبر Model Context Protocol</li>\n<li>دعم نقل stdio و HTTP/SSE و WebSocket</li>\n<li>ترجمة استدعاءات أدوات MCP إلى استدعاءات Synapse API</li>\n<li>متعدد المستأجرين: Mind Key واحد لكل جلسة</li>\n</ul>\n<h3>5. وكيل المتصفح (خدمة منفصلة)</h3>\n<p>لأتمتة المتصفح، تعمل خدمة منفصلة قائمة على Playwright على المنفذ 13000.\nيمكن لخادم MCP استدعاؤها لأدوات <code>browser_*</code>.</p>\n<h3>6. وكيل SSH (خدمة منفصلة)</h3>\n<p>لأوامر SSH البعيدة، تعمل خدمة منفصلة على المنفذ 12900.</p>\n<h2>نموذج تعدد المستأجرين</h2>\n<pre><code class=\"hljs language-plaintext\">User Account (email + password)\n  │\n  ├── Mind 1 (Mind Key 1)\n  │   ├── Memories\n  │   ├── Tasks\n  │   ├── Chat\n  │   └── Scripts\n  │\n  ├── Mind 2 (Mind Key 2)\n  │   └── ... (isolated from Mind 1)\n  │\n  └── Mind 3 (Mind Key 3)\n      └── ...</code></pre><p>كل عقل معزول تمامًا. تمنح Mind Keys الوصول إلى عقل واحد فقط.\nتمنح JWTs الوصول إلى حساب المستخدم (لإدارة العقول).</p>\n<p>راجع <a href=\"/docs/concepts/multi-tenancy\">تعدد المستأجرين</a> للتفاصيل.</p>\n<h2>تدفق الطلبات</h2>\n<h3>طلب تخزين الذاكرة</h3>\n<pre><code class=\"hljs language-plaintext\">1. Client sends POST /memory with Authorization: Bearer mk_xxx\n2. Fastify receives request\n3. Auth middleware validates Mind Key, attaches mind_id to request\n4. Memory route handler:\n   a. Validate JSON body (zod schema)\n   b. Insert into memories table\n   c. Update FTS5 index\n   d. (Async) Generate embedding if embeddings enabled\n   e. Trigger webhooks for memory.store event\n5. Return { id, status: &quot;stored&quot; }</code></pre><h3>طلب بحث الذاكرة</h3>\n<pre><code class=\"hljs language-plaintext\">1. Client sends GET /memory/search?q=docker\n2. Auth middleware validates Mind Key\n3. Memory route handler:\n   a. Parse query (FTS5 syntax)\n   b. Execute FTS5 MATCH against memories table\n   c. Filter by mind_id (tenant isolation)\n   d. Rank by relevance\n   e. Return results</code></pre><h2>النشر</h2>\n<p>يُنشر Synapse كحاوية Docker. راجع <code>docker-compose.yml</code>:</p>\n<pre><code class=\"hljs language-yaml\"><span class=\"hljs-attr\">services:</span>\n  <span class=\"hljs-attr\">synapse:</span>\n    <span class=\"hljs-attr\">image:</span> <span class=\"hljs-string\">registry.gitlab.com/schaefer-services/synapse:latest</span>\n    <span class=\"hljs-attr\">ports:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">&quot;12800:12800&quot;</span>\n    <span class=\"hljs-attr\">environment:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">DATABASE_URL=postgres://...</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">JWT_SECRET=...</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">SYNAPSE_HOST=0.0.0.0</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">SYNAPSE_PORT=12800</span>\n    <span class=\"hljs-attr\">depends_on:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">postgres</span>\n  \n  <span class=\"hljs-attr\">postgres:</span>\n    <span class=\"hljs-attr\">image:</span> <span class=\"hljs-string\">postgres:16</span>\n    <span class=\"hljs-attr\">volumes:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">pgdata:/var/lib/postgresql/data</span>\n    <span class=\"hljs-attr\">environment:</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">POSTGRES_DB=synapse</span>\n      <span class=\"hljs-bullet\">-</span> <span class=\"hljs-string\">POSTGRES_PASSWORD=...</span></code></pre><h2>خصائص الأداء</h2>\n<table>\n<thead>\n<tr>\n<th>العملية</th>\n<th>زمن الاستجابة</th>\n<th>الإنتاجية</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>تخزين ذاكرة</td>\n<td>~5 مللي ث</td>\n<td>1000+ طلب/ث</td>\n</tr>\n<tr>\n<td>استدعاء ذاكرة</td>\n<td>~20 مللي ث</td>\n<td>500 طلب/ث</td>\n</tr>\n<tr>\n<td>بحث FTS5</td>\n<td>~10 مللي ث</td>\n<td>800 طلب/ث</td>\n</tr>\n<tr>\n<td>بحث دلالي</td>\n<td>~50 مللي ث</td>\n<td>200 طلب/ث</td>\n</tr>\n<tr>\n<td>استطلاع الدردشة</td>\n<td>~5 مللي ث</td>\n<td>2000 طلب/ث</td>\n</tr>\n</tbody></table>\n<h2>الخطوات التالية</h2>\n<ul>\n<li><a href=\"/docs/concepts/memory-model\">نموذج الذاكرة</a></li>\n<li><a href=\"/docs/concepts/multi-tenancy\">تعدد المستأجرين</a></li>\n<li><a href=\"/docs/concepts/fts5-search\">بحث FTS5</a></li>\n</ul>\n","urls":{"html":"/docs/concepts/architecture","text":"/docs/concepts/architecture?format=text","json":"/docs/concepts/architecture?format=json","llm":"/docs/concepts/architecture?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}