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: إرسال رموز مفاتيح صريحة أو بايتات إلى جلسة مدعومة بـ PTYsubmit: إرسال Enter / إرجاع العربة إلى جلسة مدعومة بـ PTYpaste: إرسال نص حرفي، مع إمكانية تغليفه بوضع اللصق المحدد بين أقواس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" }