Gateway

التنفيذ في الخلفية وأداة العمليات

OpenClaw يشغّل أوامر الصدفة عبر أداة exec ويُبقي المهام الطويلة التشغيل في الذاكرة. تدير أداة process تلك الجلسات الخلفية.

أداة exec

المعاملات الأساسية:

  • command (مطلوب)
  • yieldMs (الافتراضي 10000): النقل التلقائي إلى الخلفية بعد هذا التأخير
  • background (قيمة منطقية): النقل إلى الخلفية فورًا
  • timeout (بالثواني، الافتراضي tools.exec.timeoutSec): إنهاء العملية بعد انتهاء هذه المهلة؛ اضبط timeout: 0 فقط لتعطيل مهلة عملية exec لذلك الاستدعاء
  • elevated (قيمة منطقية): التشغيل خارج صندوق العزل إذا كان الوضع المرتفع مفعّلًا/مسموحًا به (gateway افتراضيًا، أو node عندما يكون هدف exec هو node)
  • هل تحتاج إلى TTY حقيقي؟ اضبط pty: true.
  • workdir، env

السلوك:

  • تُرجع عمليات التشغيل في المقدمة الخرج مباشرة.
  • عند النقل إلى الخلفية (صراحةً أو بسبب المهلة)، تُرجع الأداة status: "running" + sessionId وذيلًا قصيرًا.
  • ترث عمليات التشغيل في الخلفية وyieldMs القيمة tools.exec.timeoutSec ما لم يقدّم الاستدعاء timeout صريحًا.
  • يُحفظ الخرج في الذاكرة حتى يتم استطلاع الجلسة أو مسحها.
  • إذا كانت أداة process غير مسموح بها، يعمل exec تزامنيًا ويتجاهل yieldMs/background.
  • تتلقى أوامر exec المُنشأة OPENCLAW_SHELL=exec لقواعد الصدفة/الملف الشخصي الواعية بالسياق.
  • للعمل الطويل التشغيل الذي يبدأ الآن، ابدأه مرة واحدة واعتمد على إيقاظ الاكتمال التلقائي عندما يكون مفعّلًا ويُصدر الأمر خرجًا أو يفشل.
  • إذا كان إيقاظ الاكتمال التلقائي غير متاح، أو كنت تحتاج إلى تأكيد النجاح الهادئ لأمر خرج بنجاح دون خرج، فاستخدم process لتأكيد الاكتمال.
  • لا تحاكِ التذكيرات أو المتابعات المؤجلة بحلقات sleep أو الاستطلاع المتكرر؛ استخدم cron للعمل المستقبلي.

ربط العمليات الفرعية

عند إنشاء عمليات فرعية طويلة التشغيل خارج أدوات exec/process (على سبيل المثال، إعادة تشغيل CLI أو مساعدات Gateway)، أرفق مساعد جسر العمليات الفرعية حتى تُمرَّر إشارات الإنهاء وتُفصل المستمعات عند الخروج/الخطأ. يتجنب هذا العمليات اليتيمة على systemd ويحافظ على اتساق سلوك إيقاف التشغيل عبر المنصات.

تجاوزات البيئة:

  • PI_BASH_YIELD_MS: زمن الانتظار الافتراضي (مللي ثانية)
  • PI_BASH_MAX_OUTPUT_CHARS: حد الخرج داخل الذاكرة (أحرف)
  • OPENCLAW_BASH_PENDING_MAX_OUTPUT_CHARS: حد stdout/stderr المعلّق لكل تدفق (أحرف)
  • PI_BASH_JOB_TTL_MS: TTL للجلسات المنتهية (مللي ثانية، محدود بين 1 دقيقة و3 ساعات)

الإعداد (المفضّل):

  • tools.exec.backgroundMs (الافتراضي 10000)
  • tools.exec.timeoutSec (الافتراضي 1800)
  • tools.exec.cleanupMs (الافتراضي 1800000)
  • tools.exec.notifyOnExit (الافتراضي true): يضع حدث نظام في الصف + يطلب Heartbeat عندما يخرج exec في الخلفية.
  • tools.exec.notifyOnExitEmptySuccess (الافتراضي false): عند ضبطه على true، يضع أيضًا أحداث اكتمال لعمليات التشغيل الخلفية الناجحة التي لم تنتج أي خرج.

أداة process

الإجراءات:

  • list: الجلسات الجارية + المنتهية
  • poll: استنزاف الخرج الجديد لجلسة (ويُبلغ أيضًا عن حالة الخروج)
  • log: قراءة الخرج المجمّع (يدعم offset + limit)
  • write: إرسال stdin (data، وeof اختياري)
  • send-keys: إرسال رموز مفاتيح صريحة أو بايتات إلى جلسة مدعومة بـ PTY
  • submit: إرسال Enter / إرجاع العربة إلى جلسة مدعومة بـ PTY
  • paste: إرسال نص حرفي، مع إمكانية تغليفه بوضع اللصق المحدد بين أقواس
  • kill: إنهاء جلسة خلفية
  • clear: إزالة جلسة منتهية من الذاكرة
  • remove: إنهاءها إذا كانت قيد التشغيل، وإلا مسحها إذا كانت منتهية

ملاحظات:

  • الجلسات المنقولة إلى الخلفية فقط هي التي تُدرج/تُحفظ في الذاكرة.
  • تُفقد الجلسات عند إعادة تشغيل العملية (لا يوجد حفظ على القرص).
  • لا تُحفظ سجلات الجلسات في سجل المحادثة إلا إذا شغّلت process poll/log وسُجّلت نتيجة الأداة.
  • نطاق process لكل وكيل؛ فهي لا ترى إلا الجلسات التي بدأها ذلك الوكيل.
  • استخدم poll / log للحالة أو السجلات أو تأكيد النجاح الهادئ أو تأكيد الاكتمال عندما يكون إيقاظ الاكتمال التلقائي غير متاح.
  • استخدم write / send-keys / submit / paste / kill عندما تحتاج إلى إدخال أو تدخل.
  • يتضمن process list قيمة name مشتقة (فعل الأمر + الهدف) للفحص السريع.
  • يستخدم process log قيمتَي offset/limit المعتمدتين على الأسطر.
  • عند حذف كل من offset وlimit، يُرجع آخر 200 سطر ويتضمن تلميحًا للتصفح بين الصفحات.
  • عند تقديم offset وحذف limit، يُرجع من offset إلى النهاية (من دون حد 200).
  • الاستطلاع مخصص للحالة عند الطلب، وليس لجدولة حلقات الانتظار. إذا كان يجب أن يحدث العمل لاحقًا، فاستخدم cron بدلًا من ذلك.

أمثلة

تشغيل مهمة طويلة واستطلاعها لاحقًا:

{ "tool": "exec", "command": "sleep 5 && echo done", "yieldMs": 1000 }
{ "tool": "process", "action": "poll", "sessionId": "<id>" }

البدء فورًا في الخلفية:

{ "tool": "exec", "command": "npm run build", "background": true }

إرسال stdin:

{ "tool": "process", "action": "write", "sessionId": "<id>", "data": "y\n" }

إرسال مفاتيح PTY:

{ "tool": "process", "action": "send-keys", "sessionId": "<id>", "keys": ["C-c"] }

إرسال السطر الحالي:

{ "tool": "process", "action": "submit", "sessionId": "<id>" }

لصق نص حرفي:

{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }

ذات صلة