Skip to content

Gateway

Gateway هو مستوى التحكم المركزي لـ Triggerfish -- خدمة محلية طويلة التشغيل تنسق الجلسات والقنوات والأدوات والأحداث وعمليات الوكيل من خلال نقطة نهاية WebSocket واحدة. كل ما يحدث في Triggerfish يتدفق عبر Gateway.

البنية

بنية Gateway: القنوات على اليسار تتصل عبر Gateway المركزي بالخدمات على اليمين

يستمع Gateway على منفذ قابل للتكوين (افتراضي 18789) ويقبل الاتصالات من محولات القنوات، وأوامر CLI، والتطبيقات المرافقة، والخدمات الداخلية. جميع الاتصالات تستخدم JSON-RPC عبر WebSocket.

خدمات Gateway

يوفر Gateway هذه الخدمات من خلال نقاط نهاية WebSocket و HTTP:

الخدمةالوصفتكامل الأمان
الجلساتإنشاء، سرد، استرجاع السجل، إرسال بين الجلسات، إنشاء مهام خلفيةتتبع taint الجلسة لكل جلسة
القنواتتوجيه الرسائل، إدارة الاتصالات، إعادة محاولة التسليم الفاشل، تقسيم الرسائل الكبيرةفحوصات تصنيف على كل مخرج
Cronجدولة المهام المتكررة وإيقاظ triggers من TRIGGER.mdإجراءات cron تمر عبر hooks السياسات
Webhooksقبول الأحداث الواردة من خدمات خارجية عبر POST /webhooks/:sourceIdتُصنف البيانات الواردة عند الاستيعاب
Rippleتتبع حالة الاتصال ومؤشرات الكتابة عبر القنواتلا تُكشف بيانات حساسة
التكوينإعادة تحميل الإعدادات ساخنة بدون إعادة تشغيلالمسؤول فقط في المؤسسات
واجهة التحكملوحة ويب لصحة gateway وإدارتهمُصادق عليها بالرمز
Tide Poolاستضافة مساحة عمل A2UI المرئية المدفوعة بالوكيلالمحتوى يخضع لـ hooks المخرجات
الإشعاراتتسليم إشعارات عبر القنوات مع توجيه بالأولويةتنطبق قواعد التصنيف

بروتوكول WebSocket JSON-RPC

يتصل العملاء بـ Gateway عبر WebSocket ويتبادلون رسائل JSON-RPC 2.0. كل رسالة هي استدعاء طريقة بمعاملات مُنمطة واستجابة مُنمطة.

typescript
// يُرسل العميل:
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "sessions.list",
  "params": { "filter": "active" }
}

// يستجيب Gateway:
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": [
    { "id": "sess_abc", "taint": "CONFIDENTIAL", "channel": "telegram" },
    { "id": "sess_def", "taint": "PUBLIC", "channel": "cli" }
  ]
}

يخدم Gateway أيضاً نقاط نهاية HTTP لاستيعاب webhook. عند إرفاق SchedulerService، تتوفر مسارات POST /webhooks/:sourceId لأحداث webhook الواردة.

واجهة الخادم

typescript
interface GatewayServerOptions {
  /** المنفذ للاستماع عليه. استخدم 0 لمنفذ عشوائي متاح. */
  readonly port?: number;
  /** رمز المصادقة للاتصالات. */
  readonly authToken?: string;
  /** خدمة جدولة اختيارية لنقاط نهاية webhook. */
  readonly schedulerService?: SchedulerService;
}

interface GatewayAddr {
  readonly port: number;
  readonly hostname: string;
}

interface GatewayServer {
  /** بدء الخادم. يُعيد العنوان المُرتبط. */
  start(): Promise<GatewayAddr>;
  /** إيقاف الخادم بشكل رشيق. */
  stop(): Promise<void>;
}

المصادقة

اتصالات Gateway مُصادقة بالرمز. يُنشأ الرمز أثناء الإعداد (triggerfish dive) ويُخزن محلياً.

SECURITY يرتبط Gateway بـ 127.0.0.1 افتراضياً وليس مكشوفاً على

الشبكة. يتطلب الوصول عن بُعد تكوين نفق صريح. لا تكشف أبداً WebSocket الخاص بـ Gateway على الإنترنت العام بدون مصادقة. :::

إدارة الجلسات

يدير Gateway دورة حياة الجلسات الكاملة. الجلسات هي الوحدة الأساسية لحالة المحادثة، كل منها مع تتبع taint مستقل.

أنواع الجلسات

النوعنمط المفتاحالوصف
رئيسيmainالمحادثة المباشرة الرئيسية مع المالك. تستمر عبر إعادات التشغيل.
قناةchannel:<type>:<id>واحدة لكل قناة متصلة. taint معزول لكل قناة.
خلفيةbg:<task_id>تُنشأ لمهام cron ومهام webhook. تبدأ بـ taint PUBLIC.
وكيلagent:<agent_id>جلسات لكل وكيل للتوجيه متعدد الوكلاء.
مجموعةgroup:<channel>:<group_id>جلسات محادثة جماعية.

أدوات الجلسات

يتفاعل الوكيل مع الجلسات عبر هذه الأدوات، جميعها موجهة عبر Gateway:

الأداةالوصفتأثيرات Taint
sessions_listسرد الجلسات النشطة مع مرشحات اختياريةلا تغيير في taint
sessions_historyاسترجاع نص الجلسةTaint يرث من الجلسة المُشار إليها
sessions_sendإرسال رسالة إلى جلسة أخرىيخضع لفحص منع الكتابة للأسفل
sessions_spawnإنشاء جلسة مهمة خلفيةالجلسة الجديدة تبدأ بـ taint PUBLIC
session_statusفحص حالة الجلسة الحالية والنموذج والتكلفةلا تغيير في taint

الاتصال بين الجلسات عبر sessions_send يخضع لنفس قواعد منع الكتابة

للأسفل كأي مخرج آخر. لا يمكن لجلسة CONFIDENTIAL إرسال بيانات إلى جلسة متصلة بقناة PUBLIC. :::

توجيه القنوات

يوجه Gateway الرسائل بين القنوات والجلسات عبر موجه القنوات. يتعامل الموجه مع:

  • بوابة التصنيف: كل رسالة صادرة تمر عبر PRE_OUTPUT قبل التسليم
  • إعادة المحاولة مع تراجع: يُعاد محاولة التسليم الفاشل بتراجع أُسّي عبر sendWithRetry()
  • تقسيم الرسائل: تُقسم الرسائل الكبيرة إلى أجزاء مناسبة للمنصة (مثل حد Telegram البالغ 4096 حرفاً)
  • البث: تُبث الاستجابات للقنوات التي تدعمه
  • إدارة الاتصال: connectAll() و disconnectAll() لإدارة دورة الحياة

خدمة الإشعارات

يدمج Gateway خدمة إشعارات من الدرجة الأولى تحل محل أنماط "إخطار المالك" المؤقتة عبر المنصة. جميع الإشعارات تتدفق عبر NotificationService واحد.

typescript
interface NotificationService {
  notify(recipient: UserId, notification: Notification): Promise<void>;
  getPreferences(userId: UserId): Promise<NotificationPreference>;
  setPreferences(userId: UserId, prefs: NotificationPreference): Promise<void>;
  getPending(userId: UserId): Promise<Notification[]>;
}

توجيه الأولوية

الأولويةالسلوك
CRITICALتجاوز ساعات الهدوء، التسليم لجميع القنوات المتصلة فوراً
HIGHالتسليم للقناة المفضلة فوراً، ترتيب في قائمة الانتظار إذا غير متصل
NORMALالتسليم للجلسة النشطة، أو ترتيب لبدء الجلسة التالية
LOWترتيب، التسليم على دفعات أثناء الجلسات النشطة

مصادر الإشعارات

المصدرالفئةالأولوية الافتراضية
انتهاكات السياساتsecurityCRITICAL
تنبيهات استخبارات التهديدsecurityCRITICAL
طلبات الموافقة على المهاراتapprovalHIGH
فشل مهام cronsystemHIGH
تحذيرات صحة النظامsystemHIGH
أحداث webhookinfoNORMAL
تحديثات The Reef المتاحةinfoLOW

تُخزن الإشعارات عبر StorageProvider (مساحة الاسم: notifications:) وتنجو من إعادات التشغيل. الإشعارات غير المُسلمة يُعاد محاولتها عند بدء Gateway التالي أو اتصال الجلسة.

تفضيلات التسليم

يُكوّن المستخدمون تفضيلات الإشعارات لكل قناة:

yaml
notifications:
  preferred_channel: telegram
  quiet_hours:
    start: "22:00"
    end: "07:00"
    timezone: "America/Chicago"
  overrides:
    security: all_channels
    approval: preferred_channel
    info: active_session

تكامل المجدول

يستضيف Gateway خدمة المجدول، التي تدير:

  • حلقة tick لـ cron: تقييم دوري للمهام المجدولة
  • إيقاظ triggers: إيقاظ الوكيل المُعرّف في TRIGGER.md
  • نقاط نهاية HTTP لـ webhook: POST /webhooks/:sourceId للأحداث الواردة
  • عزل المنسق: كل مهمة مجدولة تعمل في OrchestratorFactory خاص بها مع حالة جلسة معزولة

المهام المُشغلة بـ cron و webhook تُنشئ جلسات خلفية بـ taint PUBLIC

جديد. لا ترث taint أي جلسة موجودة، مما يضمن أن المهام المستقلة تبدأ بحالة تصنيف نظيفة. :::

الصحة والتشخيص

يتصل أمر triggerfish patrol بـ Gateway ويُجري فحوصات صحة تشخيصية، ويتحقق من:

  • Gateway يعمل ويستجيب
  • جميع القنوات المُكوّنة متصلة
  • التخزين يمكن الوصول إليه
  • المهام المجدولة تُنفذ في الوقت المحدد
  • لا توجد إشعارات حرجة غير مُسلمة عالقة في قائمة الانتظار