مترجَم عن الأصل الصيني. وعند الاختلاف بينهما، يُعتد بالأصل.
Confer — معمارية النظام
هذه الوثيقة تصف المعمارية المنشودة، لا ما هو مُنفَّذ فعلاً. التنفيذ الحالي هو بوابة من عملية واحدة ونسخة واحدة: جدول اتصالات WebSocket، وقيم nonce التي تحمي من إعادة إرسال طلبات A2A، وعدّادات تحديد المعدّل — كلها تعيش في ذاكرة عملية البوابة (
ws/handler.ts،lib/nonce-cache.ts،middleware/rate-limit.ts).ولهذا لا يمكن تشغيل نسخة ثانية من البوابة. إضافة نسخ تكسر حماية إعادة الإرسال في A2A بصمت: يقع الطلب المُعاد على نسخة أخرى جدول nonce فيها فارغ، فيمرّ. كما تفوت إشعارات WS المستخدمين المتصلين بنسخة أخرى، ويتضاعف حدّ تحديد المعدّل بعدد النسخ.
أما NATS وRedis المذكوران أدناه فهما الحل المقترح عند التوسّع الأفقي؛ وهما اليوم غير منشورَين ولا موصولَين بشيء (أُزيلا من
docker-compose*.ymlومنenv.tsفي 2026-08-07؛ وقبل ذلك كانا حاويتين تدوران في الفراغ ومتغيّر بيئة لم يقرأه أحد). ولو أردنا التوسّع الأفقي فعلاً، فالخطوة الأولى نقل هذه الحالات الثلاث من ذاكرة العملية إلى تخزين مشترك، وفي مقدّمتها nonce لأنها حرجة أمنياً.
المعمارية العامة
┌────────────────────────────────────────────────────────────┐
│ Clients (Tauri 2.0) │
│ iOS · Android · Windows · macOS · Linux │
└──────────────────────────┬─────────────────────────────────┘
│ WSS / HTTPS / SSE
▼
┌────────────────────────────────────────────────────────────┐
│ Edge API Gateway (Bun + Hono) │
│ Auth · Rate limit · Routing · WS fan-out │
└─────┬─────────────┬─────────────────┬────────────────┬─────┘
│ │ │ │
▼ ▼ ▼ ▼
┌────────┐ ┌─────────────┐ ┌────────────┐ ┌──────────────┐
│ Agent │ │Conversation │ │ Identity & │ │ MCP / Tools │
│Runtime │ │ Hub │ │A2A Gateway │ │ Connector │
└───┬────┘ └──────┬──────┘ └─────┬──────┘ └──────┬───────┘
│ │ │ │
▼ ▼ ▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ Data layer: PostgreSQL · Redis · NATS · Vector (Qdrant)·S3 │
└──────────────────────────────────────────────────────────────┘
│ │
▼ ▼
LLM providers Other instances' Agents
(Claude / GPT / (federation via A2A
DeepSeek / Qwen) over HTTPS)
مبادئ التصميم
- حافة بلا حالة، ونواة ذات حالة (هدف لم يتحقّق بعد): البوابة بلا حالة وقابلة للتوسّع الأفقي هي الشكل المنشود؛ أما اليوم فللبوابة حالة داخل العملية، فلا تحتمل إلا نسخة واحدة، كما تقول الملاحظة في صدر الوثيقة.
- جاهزية للاتحاد منذ اليوم الأول: هوية DID:web مع AgentFacts، وحتى النسخة المفردة تعمل وفق بروتوكول الاتحاد، فالانتقال إلى الاتحاد لاحقاً لا يكلّف أي ترحيل.
- أحضِر مفتاح نموذجك: المنصّة لا تتحمّل كلفة النموذج اللغوي؛ كل مستخدم يستعمل مفتاح واجهته البرمجية.
- البروتوكول أولاً: التفاعلات الجوهرية تجري ببروتوكولات مفتوحة (A2A، MCP، DID:web، NANDA AgentFacts)، دون الارتباط ببروتوكول خاص بنا.
- Bun وTypeScript في كامل المكدّس: الخلفية Bun وHono، والعميل Tauri وReact، والأنواع مشتركة.
حدود الخدمات
1. Edge API Gateway
انظر docs/05-api.md.
- المسؤولية: إنهاء TLS، والتحقّق المزدوج من الهوية (المستخدم وA2A)، وتحديد المعدّل في أربعة أبعاد، وتوجيه HTTP/WS/SSE، والبثّ إلى عدّة أجهزة.
- التقنية: Bun + Hono.
- الاعتماديات الأساسية: JWKS (التحقّق من رمز المستخدم)، ذاكرة وثائق DID المؤقتة، NATS (البثّ).
- ما لا تفعله: منطق العمل، وحفظ بيانات العمل، واستدعاء النموذج اللغوي.
2. Agent Runtime
لكل مستخدم نسخة وكيل مقيمة.
- المسؤولية:
- حفظ حالة وكيل المستخدم (اختيار النموذج، الأدوات، السياسة، الذاكرة).
- حلقة استدعاء النموذج اللغوي (تجريد يشمل عدّة مزوّدين).
- عميل MCP، موصول بخوادم الأدوات التي ثبّتها المستخدم.
- استدعاءات A2A الصادرة (الذهاب للحديث مع وكيل شخص آخر).
- محرّك السياسات (تقرير ما يجوز إخبار الطرف الآخر به).
- دورة الحياة: يستيقظ عند الطلب. ما إن تصل رسالة أو طلب A2A حتى يحمّل حالته من PostgreSQL، وينفّذ دورة، ثم يكتبها من جديد.
- الاعتماديات الأساسية: مزوّدو النماذج اللغوية، خوادم MCP، خدمة الهوية.
3. Conversation Hub
- المسؤولية: تخزين الرسائل والاشتراك فيها وإيصالها.
- أنواع الحوارات المدعومة:
- المستخدم ↔ وكيله هو.
- المستخدم ↔ وكيل طرف آخر (عبر وكيله هو).
- المستخدم ↔ المستخدم (مراسلة عادية).
- المجموعات (مستخدمون ووكلاء معاً).
- الاعتماديات الأساسية: NATS Streams (الاستمرارية والبثّ)، PostgreSQL (سجلّ الرسائل)، Redis (الحضور، عدّاد غير المقروء).
4. Identity & A2A Gateway
- المسؤولية:
- إدارة وثائق DID:web الخاصة بالمستخدمين.
- إعلان AgentFacts وتخزينها مؤقتاً.
- معالجة طلبات A2A الواردة (التحقّق من توقيع HTTP ورمز الصلاحية).
- تمرير طلبات A2A الصادرة.
- تحديد المعدّل ومكافحة الإزعاج للأقران المتّحدين.
- الاعتماديات الأساسية: PostgreSQL (ذاكرة DID والأقران المؤقتة)، Redis (عدّادات تحديد المعدّل).
التصميم التفصيلي للبروتوكول في docs/03-protocol.md.
5. MCP / Tools Connector
- المسؤولية:
- إدارة الاتصال بخوادم أدوات MCP التي ثبّتها المستخدم.
- من هنا يستدعي Agent Runtime الأدوات.
- تغليف موحّد لنتائج استدعاء الأدوات.
- الاعتماديات الأساسية:
@modelcontextprotocol/sdk.
طبقة البيانات
| المكوّن | الغرض | الحالة |
|---|---|---|
| PostgreSQL | المستخدمون والوكلاء والحوارات والرسائل والأذونات وعلاقات الأقران (التخزين الرئيسي) | ✅ مستخدَم |
| Qdrant | استرجاع ذاكرة الوكيل بعيدة المدى، وفهرسة قواعد معرفة المستخدم | ✅ مستخدَم |
| متوافق مع S3 (MinIO) | تخزين ملفات قواعد المعرفة | ✅ مستخدَم |
| Redis | الجلسات، الحضور، عدّادات تحديد المعدّل، ذاكرة البيانات الساخنة | ⬜ غير منشور؛ لن يلزم إلا عند التوسّع الأفقي |
| NATS Streams | بثّ الرسائل (user.{uid}.events) وطابور مهام Agent Runtime | ⬜ غير منشور؛ لن يلزم إلا عند التوسّع الأفقي |
معمارية العميل
- الأساس: Tauri 2.0 (نواة Rust مع عرض عبر WebView).
- الواجهة: React 19 وTypeScript وTailwind CSS.
- إدارة الحالة: Zustand أو Jotai (خفيفتان).
- التوجيه: TanStack Router.
- الشبكة: fetch الأصلي وWebSocket الأصلي وEventSource (SSE).
- التخزين المحلي: SQLite ومخزن المفتاح/القيمة اللذان يوفّرهما Tauri (ذاكرة الحوارات، مسوّدات الرسائل دون اتصال).
التغطية عبر المنصّات
| المنصّة | عبر |
|---|---|
| iOS | دعم iOS في Tauri 2.0 |
| Android | دعم Android في Tauri 2.0 |
| Windows | Tauri 2.0 |
| macOS | Tauri 2.0 |
| Linux | Tauri 2.0 |
قاعدة شيفرة واحدة، بلا بدائل أصلية.
إضافة Claude Code
انظر docs/06-claude-code-plugin.md.
- عملية خادم MCP مستقلة، مكتوبة بـ Node.js أو Bun.
- يثبّتها المستخدم بالأمر
claude mcp add confer <command>. - ترتبط بحساب المستخدم في Confer عبر OAuth أو رمز.
معمارية النشر
نسخة مفردة (أفراد / فرق صغيرة)
ملف docker-compose.prod.yml الفعلي (agent-runtime وidentity مكتبتان داخل البوابة، لا خدمتان مستقلّتان):
- gateway (خدمة Bun، نسخة واحدة — انظر الملاحظة في الصدر)
- client (واجهة أمامية يقدّمها nginx)
- migrate (مهمّة تُنفَّذ مرة واحدة)
- postgres
- qdrant
- minio
النشر: docker compose -f docker-compose.prod.yml up -d ويصبح جاهزاً للاستعمال.
نسخة المؤسسة
- نفس Docker Compose مرفوعاً كنشر مستقلّ.
- بنطاق خاص (
acme.com). - مع إعلان
https://acme.com/.well-known/did.jsonوhttps://acme.com/.well-known/agent.json. - ويدخل المستخدمون الداخليون عبر الدخول الموحّد.
السحابة (سحابة Confer نفسها)
شرط مسبق: البوابة اليوم بنسخة واحدة (حالة داخل العملية). وقبل تعدّد النسخ يجب نقل جدول اتصالات WS وقيم nonce الخاصة بـ A2A وعدّادات تحديد المعدّل إلى تخزين مشترك، وإلا سقطت حماية إعادة الإرسال بصمت.
- Kubernetes متعدّد المستأجرين.
- لكل مستخدم أو شركة نطاق أسماء أو مخطّط خاص به.
- طبقة تجريد مشتركة لمزوّدي النماذج اللغوية (مع بقاء المفتاح ملكاً لصاحبه).
- نشر في مناطق متعدّدة حول العالم، والدخول من أقرب منطقة.
الاتحاد (بين النسخ)
أي نسخة من Confer — مستضافة ذاتياً أو سحابية — تستطيع التخاطب مع غيرها عبر بروتوكول A2A.
[acme.com] [vendor-x.com] [confer.cloud]
Agent A <─── A2A ───> Agent B <─── A2A ───> Agent C
الهوية والاكتشاف:
- كل نسخة تُعلن وثيقة DID الخاصة بها على
/.well-known/did.json. - كل وكيل يُعلن AgentFacts الخاصة به على
/.well-known/agent.json. - البحث بين النسخ: بثّ إلى النسخ المعروفة إضافةً إلى سجلّ عام.
قابلية الرصد
- التتبّع: OpenTelemetry؛ يُحقَن
trace_idفي البوابة ويمرّ عبر كل الخدمات. - السجلّات: JSON مهيكل، تُجمع بـ Vector / Loki.
- المقاييس: Prometheus، وأهمّها:
gateway_active_ws_connections{user_id}agent_runtime_llm_tokens_total{provider,role}a2a_inbound_requests_total{peer_domain,status}mcp_tool_calls_total{tool,result}
الحدود الأمنية
- المستخدم ↔ البوابة: رمز JWT يُتحقَّق منه عبر JWKS.
- قرين A2A ↔ البوابة: HTTP Message Signatures (RFC 9421) مع مفتاح DID:web العام.
- الاستدعاءات الداخلية بين الخدمات: mTLS أو سرّ مشترك (داخل شبكة Docker).
- استدعاء مزوّدي النماذج اللغوية: مفتاح الواجهة مخزَّن مشفَّراً (AES-256، والمفتاح في Vault / KMS).
- ملفات المستخدمين: تشفير من جانب خادم S3.
القرارات التقنية الفاصلة
| القرار | الاختيار | البدائل | السبب |
|---|---|---|---|
| لغة الخلفية | Bun + TypeScript | Go | حِزم تطوير MCP وA2A مكتوبة لـ TypeScript أولاً؛ والأنواع مشتركة عبر المكدّس |
| إطار الويب | Hono | Elysia، Fastify | خفيف وسريع ومنظومته مستقرّة |
| العميل | Tauri 2.0 | Flutter، Electron | قاعدة شيفرة واحدة لخمس منصّات، وأمان Rust، وحجم صغير |
| التخزين الرئيسي | PostgreSQL 18 | MySQL | دعم جيّد لـ JSON، وقابلية توسيع عالية، وpgvector عند الحاجة |
| ناقل الرسائل | NATS | Kafka، Redis Pub/Sub | خفيف، ذو استمرارية، واشتراك دقيق |
| قاعدة المتّجهات | Qdrant | Pinecone، pgvector | ناضجة للاستضافة الذاتية، مكتوبة بـ Rust، وأداؤها مستقرّ |
| الهوية | DID:web | DID:key، OAuth وحده | متوافقة مع بنية الويب القائمة، وتوصي بها NANDA |
| البروتوكول | A2A + MCP + AgentFacts | بروتوكول خاص | نراهن على منظومة البروتوكولات المفتوحة |