متعدد الوكلاء

الحضور

"حضور" OpenClaw هو عرض خفيف الوزن وذو جهد أفضل لـ:

  • البوابة نفسها، و
  • العملاء المتصلين بالبوابة (تطبيق ماك، WebChat، CLI، إلخ.)

يُستخدم الحضور بشكل أساسي لعرض تبويب الحالات في تطبيق macOS ولتوفير رؤية سريعة للمشغل.

حقول الحضور (ما يظهر)

إدخالات الحضور هي كائنات منظمة تحتوي على حقول مثل:

  • instanceId (اختياري ولكن موصى به بشدة): هوية مستقرة للعميل (عادةً connect.client.instanceId)
  • host: اسم مضيف مفهوم للإنسان
  • ip: عنوان IP ذو جهد أفضل
  • version: سلسلة إصدار العميل
  • deviceFamily / modelIdentifier: تلميحات للأجهزة
  • mode: ui, webchat, cli, backend, probe, test, node, …
  • lastInputSeconds: "الثواني منذ آخر إدخال للمستخدم" (إذا كان معروفًا)
  • reason: self, connect, node-connected, periodic, …
  • ts: طابع زمني آخر تحديث (مللي ثانية منذ العصر)

المنتجون (مصدر بيانات الحضور)

يتم إنتاج إدخالات الحضور من مصادر متعددة ويتم دمجها.

1) إدخال البوابة الذاتي

تقوم البوابة دائمًا بإنشاء إدخال "ذاتي" عند بدء التشغيل حتى تعرض الواجهات مضيف البوابة حتى قبل اتصال أي عملاء.

2) اتصال WebSocket

يبدأ كل عميل WS بطلب connect. عند اكتمال المصافحة بنجاح، تقوم البوابة بإدراج أو تحديث إدخال حضور لهذا الاتصال.

لماذا لا تظهر أوامر CLI الفردية

غالبًا ما يتصل CLI لأوامر فردية قصيرة. لتجنب إغراق قائمة الحالات، لا يتم تحويل client.mode === "cli" إلى إدخال حضور.

3) إشارات system-event الدورية

يمكن للعملاء إرسال إشارات دورية أكثر تفصيلاً عبر طريقة system-event. يستخدم تطبيق ماك هذا للإبلاغ عن اسم المضيف، وعنوان IP، وlastInputSeconds.

4) اتصال العقد (دور: node)

عندما تتصل عقدة عبر WebSocket الخاص بالبوابة بـ role: node، تقوم البوابة بإدراج أو تحديث إدخال حضور لتلك العقدة (نفس تدفق عملاء WS الآخرين).

قواعد الدمج وإزالة التكرار (أهمية instanceId)

يتم تخزين إدخالات الحضور في خريطة ذاكرة واحدة:

  • يتم فهرسة الإدخالات بواسطة مفتاح حضور.
  • أفضل مفتاح هو instanceId مستقر (من connect.client.instanceId) يبقى بعد إعادة التشغيل.
  • المفاتيح لا تراعي حالة الأحرف.

إذا أعاد العميل الاتصال بدون instanceId مستقر، فقد يظهر كصف مكرر.

مدة الصلاحية والحجم المحدود

الحضور قصير الأجل عن قصد:

  • مدة الصلاحية (TTL): يتم حذف الإدخالات الأقدم من 5 دقائق
  • الحد الأقصى للإدخالات: 200 (يتم حذف الأقدم أولاً)

هذا يحافظ على نضارة القائمة ويتجنب نمو الذاكرة غير المحدود.

تحذير بشأن النفق/الاتصال عن بُعد (عناوين IP loopback)

عندما يتصل عميل عبر نفق SSH / إعادة توجيه منفذ محلي، قد ترى البوابة العنوان البعيد كـ 127.0.0.1. لتجنب الكتابة فوق عنوان IP جيد أبلغ عنه العميل، يتم تجاهل عناوين loopback البعيدة.

المستهلكون

تبويب الحالات في macOS

يعرض تطبيق macOS ناتج `system-presence ويطبق مؤشر حالة صغير (نشط/خامل/قديم) بناءً على عمر آخر تحديث.

نصائح التصحيح

  • لرؤية القائمة الأولية، استدعِ system-presence ضد البوابة.
  • إذا رأيت تكرارات:
    • تأكد من أن العملاء يرسلون client.instanceId مستقر في المصافحة
    • تأكد من أن الإشارات الدورية تستخدم نفس instanceId
    • تحقق مما إذا كان الإدخال المشتق من الاتصال يفتقد instanceId (التكرارات متوقعة في هذه الحالة)

توجيه متعدد الوكلاءالرسائل