التجارب
خطة PTY والإشراف على العمليات
1. المشكلة والهدف
نحتاج إلى دورة حياة موثوقة واحدة لتنفيذ أوامر طويلة الأمد عبر:
- عمليات
execالأمامية - عمليات
execالخلفية - إجراءات المتابعة لـ
process(poll,log,send-keys,paste,submit,kill,remove) - العمليات الفرعية لعداء وكيل سطر الأوامر (CLI)
الهدف ليس فقط دعم PTY. الهدف هو ملكية متوقعة، وإلغاء، وانتهاء مهلة، وتنظيف دون استخدام استدلالات مطابقة عمليات غير آمنة.
2. النطاق والحدود
- احتفظ بالتنفيذ داخليًا في
src/process/supervisor. - لا تنشئ حزمة جديدة لهذا.
- احتفظ بتوافق السلوك الحالي حيثما كان ذلك عمليًا.
- لا توسع النطاق لتشمل إعادة تشغيل الطرفية أو استمرارية جلسات نمط tmux.
3. المنفذ في هذا الفرع
خط الأساس للمشرف موجود بالفعل
- وحدة المشرف موجودة تحت
src/process/supervisor/*. - وقت تشغيل Exec وعداء CLI يتم توجيههما بالفعل عبر إنشاء وانتظار المشرف.
- إنهاء السجل (Registry finalization) هو عملية لا رجعة فيها (idempotent).
ما تم إكماله في هذه المرحلة
- عقد أمر PTY صريح
SpawnInputأصبح الآن اتحادًا مميزًا (discriminated union) فيsrc/process/supervisor/types.ts.- عمليات PTY تتطلب
ptyCommandبدلاً من إعادة استخدامargvالعام. - المشرف لم يعد يعيد بناء سلاسل أوامر PTY من وصلات argv في
src/process/supervisor/supervisor.ts. - وقت تشغيل Exec يمرر الآن
ptyCommandمباشرة فيsrc/agents/bash-tools.exec-runtime.ts.
- فصل الأنواع في طبقة العملية
- أنواع المشرف لم تعد تستورد
SessionStdinمن الوكلاء (agents). - عقد stdin المحلي للعملية موجود في
src/process/supervisor/types.ts(ManagedRunStdin). - المحولات (Adapters) تعتمد الآن فقط على أنواع مستوى العملية:
src/process/supervisor/adapters/child.tssrc/process/supervisor/adapters/pty.ts
- تحسين ملكية دورة حياة أداة العملية
src/agents/bash-tools.process.tsيطلب الآن الإلغاء عبر المشرف أولاً.process kill/removeتستخدم الآن إنهاء شجرة العمليات كخيار احتياطي عندما يفشل البحث عن المشرف.removeتحتفظ بسلوك الإزالة الحتمي من خلال إسقاط إدخالات الجلسة قيد التشغيل فور طلب الإنهاء.
- مصدر واحد للقيم الافتراضية لمراقب النظام (watchdog)
- تمت إضافة القيم الافتراضية المشتركة في
src/agents/cli-watchdog-defaults.ts. src/agents/cli-backends.tsتستهلك القيم الافتراضية المشتركة.src/agents/cli-runner/reliability.tsتستهلك نفس القيم الافتراضية المشتركة.
- تنظيف المساعدين الميتين
- تمت إزالة مسار المساعد غير المستخدم
killSessionمنsrc/agents/bash-tools.shared.ts.
- إضافة اختبارات المسار المباشر للمشرف
- تمت إضافة
src/agents/bash-tools.process.supervisor.test.tsلتغطية توجيه kill و remove عبر إلغاء المشرف.
- إصلاحات فجوات الموثوقية المكتملة
src/agents/bash-tools.process.tsيستخدم الآن إنهاء عملية على مستوى نظام التشغيل الحقيقي كخيار احتياطي عندما يفشل البحث عن المشرف.src/process/supervisor/adapters/child.tsيستخدم الآن دلالات إنهاء شجرة العمليات لمسارات القتل الافتراضية للإلغاء/انتهاء المهلة.- تمت إضافة أداة شجرة العمليات المشتركة في
src/process/kill-tree.ts.
- إضافة تغطية لحالات حافة عقد PTY
- تمت إضافة
src/process/supervisor/supervisor.pty-command.test.tsلإعادة توجيه أمر PTY حرفيًا ورفض الأمر الفارغ. - تمت إضافة
src/process/supervisor/adapters/child.test.tsلسلوك قتل شجرة العمليات في إلغاء محول الطفل (child adapter).
4. الفجوات والقرارات المتبقية
حالة الموثوقية
تم إغلاق فجوتي الموثوقية المطلوبتين لهذه المرحلة الآن:
process kill/removeلديها الآن خيار إنهاء حقيقي على مستوى نظام التشغيل كخيار احتياطي عندما يفشل البحث عن المشرف.- إلغاء/انتهاء مهلة الطفل يستخدم الآن دلالات قتل شجرة العمليات للمسار الافتراضي للقتل.
- تمت إضافة اختبارات انحدار لكلا السلوكين.
المتانة والمصالحة عند بدء التشغيل
تم تعريف سلوك إعادة التشغيل الآن صراحةً على أنه دورة حياة في الذاكرة فقط.
reconcileOrphans()تبقى بدون تأثير (no-op) فيsrc/process/supervisor/supervisor.tsعن قصد.- لا يتم استعادة العمليات النشطة بعد إعادة تشغيل العملية.
- هذا الحد مقصود في مرحلة التنفيذ هذه لتجنب مخاطر الاستمرارية الجزئية.
متابعات قابلية الصيانة
runExecProcessفيsrc/agents/bash-tools.exec-runtime.tsلا تزال تتعامل مع مسؤوليات متعددة ويمكن تقسيمها إلى مساعدين مركزين في متابعة لاحقة.
5. خطة التنفيذ
مرحلة التنفيذ للعناصر المطلوبة من الموثوقية والعقد اكتملت. تم إكمال:
- خيار إنهاء حقيقي احتياطي لـ
process kill/remove - إلغاء شجرة العمليات للمسار الافتراضي لقتل محول الطفل
- اختبارات انحدار للقتل الاحتياطي ومسار قتل محول الطفل
- اختبارات حالات حافة أمر PTY تحت
ptyCommandالصريح - حد إعادة التشغيل الصريح في الذاكرة مع
reconcileOrphans()بدون تأثير عن قصد
متابعة اختيارية:
- تقسيم
runExecProcessإلى مساعدين مركزين دون انحراف في السلوك
6. خريطة الملفات
مشرف العمليات
src/process/supervisor/types.tsتم تحديثه بإدخال إنشاء مميز وعقد stdin محلي للعملية.src/process/supervisor/supervisor.tsتم تحديثه لاستخدامptyCommandصريح.src/process/supervisor/adapters/child.tsوsrc/process/supervisor/adapters/pty.tsتم فصلهما عن أنواع الوكلاء (agents).src/process/supervisor/registry.tsإنهاء لا رجعة فيه (idempotent finalize) لم يتغير وتم الاحتفاظ به.
تكامل Exec والعملية
src/agents/bash-tools.exec-runtime.tsتم تحديثه لتمرير أمر PTY صراحة والاحتفاظ بالمسار الاحتياطي.src/agents/bash-tools.process.tsتم تحديثه للإلغاء عبر المشرف مع إنهاء شجرة العمليات الحقيقي كخيار احتياطي.src/agents/bash-tools.shared.tsتمت إزالة مسار المساعد المباشر للقتل.
موثوقية سطر الأوامر (CLI)
src/agents/cli-watchdog-defaults.tsتمت إضافته كخط أساس مشترك.src/agents/cli-backends.tsوsrc/agents/cli-runner/reliability.tsتستهلكان الآن نفس القيم الافتراضية.
7. تشغيل التحقق في هذه المرحلة
اختبارات الوحدة:
pnpm vitest src/process/supervisor/registry.test.tspnpm vitest src/process/supervisor/supervisor.test.tspnpm vitest src/process/supervisor/supervisor.pty-command.test.tspnpm vitest src/process/supervisor/adapters/child.test.tspnpm vitest src/agents/cli-backends.test.tspnpm vitest src/agents/bash-tools.exec.pty-cleanup.test.tspnpm vitest src/agents/bash-tools.process.poll-timeout.test.tspnpm vitest src/agents/bash-tools.process.supervisor.test.tspnpm vitest src/process/exec.test.ts
أهداف الاختبار الشامل (E2E):
pnpm vitest src/agents/cli-runner.test.tspnpm vitest run src/agents/bash-tools.exec.pty-fallback.test.ts src/agents/bash-tools.exec.background-abort.test.ts src/agents/bash-tools.process.send-keys.test.ts
ملاحظة فحص الأنواع:
- استخدم
pnpm build(وpnpm checkللبوابة الكاملة للتدقيق/المستندات) في هذا المستودع. الملاحظات القديمة التي تذكرpnpm tsgoأصبحت قديمة.
8. الضمانات التشغيلية المحفوظة
- سلوك تعزيز بيئة Exec لم يتغير.
- تدفق الموافقة والقائمة المسموح بها لم يتغير.
- تعقيم الإخراج وحدود الإخراج لم تتغير.
- محول PTY لا يزال يضمن تسوية الانتظار على القتل القسري والتخلص من المستمعين.
9. تعريف الإكمال
- المشرف هو مالك دورة الحياة للعمليات المدارة.
- إنشاء PTY يستخدم عقد أمر صريح دون إعادة بناء argv.
- طبقة العملية ليس لديها اعتماد نوعي على طبقة الوكيل لعقود stdin الخاصة بالمشرف.
- القيم الافتراضية لمراقب النظام (watchdog) هي من مصدر واحد.
- الاختبارات المستهدفة للوحدة والشاملة (e2e) تبقى ناجحة.
- حد متانة إعادة التشغيل موثق صراحة أو منفذ بالكامل.
10. الملخص
الفرع لديه الآن شكل إشراف متماسك وأكثر أمانًا:
- عقد PTY صريح
- طبقات عملية أنظف
- مسار إلغاء مدفوع بالمشرف لعمليات العملية
- إنهاء حقيقي احتياطي عندما يفشل البحث عن المشرف
- إلغاء شجرة العمليات لمسارات القتل الافتراضية لتشغيل الطفل
- قيم افتراضية موحدة لمراقب النظام
- حد إعادة تشغيل صريح في الذاكرة (لا مصالحة للعمليات اليتيمة عبر إعادة التشغيل في هذه المرحلة)