تخطَّ إلى المحتوى

مرجع أمر `/tree`

يفتح /tree متصفح شجرة الجلسة التفاعلي. يتيح لك الانتقال إلى أي إدخال في ملف الجلسة الحالي والمتابعة من تلك النقطة.

هذه عملية انتقال داخلي إلى ورقة في الملف، وليست تصدير جلسة جديدة.

  • يبني شجرة من إدخالات الجلسة الحالية (SessionManager.getTree())
  • يفتح TreeSelectorComponent مع التنقل بلوحة المفاتيح والفلاتر والبحث
  • عند الاختيار، يستدعي AgentSession.navigateTree(targetId, { summarize, customInstructions })
  • يعيد بناء المحادثة المرئية من مسار الورقة الجديدة
  • يملأ مسبقاً نص المحرر اختيارياً عند اختيار رسالة مستخدم/مخصصة

التنفيذ الأساسي:

  • src/modes/controllers/input-controller.ts (/tree، تشغيل اختصارات لوحة المفاتيح، سلوك الضغط المزدوج على Escape)
  • src/modes/controllers/selector-controller.ts (تشغيل واجهة الشجرة + تدفق مطالبة الملخص)
  • src/modes/components/tree-selector.ts (التنقل، الفلاتر، البحث، التسميات، العرض)
  • src/session/agent-session.ts (تبديل الورقة في navigateTree + الملخص الاختياري)
  • src/session/session-manager.ts (getTree، branch، branchWithSummary، resetLeaf، استمرارية التسمية)

أي من الطرق التالية يفتح نفس المحدد:

  • /tree
  • إجراء اختصار لوحة المفاتيح المُكوَّن tree
  • الضغط المزدوج على Escape عند محرر فارغ عندما يكون doubleEscapeAction = "tree" (الافتراضي)
  • /branch عندما يكون doubleEscapeAction = "tree" (يوجه إلى محدد الشجرة بدلاً من منتقي الفروع للمستخدم فقط)

نموذج واجهة مستخدم الشجرة

Section titled “نموذج واجهة مستخدم الشجرة”

يتم عرض الشجرة من مؤشرات العناصر الأم لإدخالات الجلسة (id / parentId).

  • يتم ترتيب العناصر الأبناء تصاعدياً حسب الطابع الزمني (الأقدم أولاً، الأحدث في الأسفل)
  • يُشار إلى الفرع النشط (المسار من الجذر إلى الورقة الحالية) بنقطة
  • تُعرض التسميات (إن وُجدت) بالشكل [label] قبل نص العقدة
  • إذا وُجدت جذور متعددة (سلاسل أصل مقطوعة/معطلة)، تُعرض تحت جذر تفرع افتراضي
مثال على عرض الشجرة (المسار النشط مُشار إليه بـ•):
├─ user: "Start task"
│ └─ assistant: "Plan"
│ ├─ • user: "Try approach A"
│ │ └─ • assistant: "A result"
│ │ └─ • [milestone] user: "Continue A"
│ └─ user: "Try approach B"
│ └─ assistant: "B result"

يُعيد المحدد التمركز حول الاختيار الحالي ويُظهر ما يصل إلى:

  • max(5, floor(terminalHeight / 2)) صفاً

اختصارات لوحة المفاتيح داخل محدد الشجرة

Section titled “اختصارات لوحة المفاتيح داخل محدد الشجرة”
  • Up / Down: تحريك الاختيار (مع التفاف)
  • Left / Right: الصفحة السابقة / التالية
  • Enter: اختيار العقدة
  • Esc: مسح البحث إذا كان نشطاً؛ وإلا إغلاق المحدد
  • Ctrl+C: إغلاق المحدد
  • Type: إلحاق محرف بعبارة البحث
  • Backspace: حذف محرف بحث
  • Shift+L: تعديل/مسح تسمية الإدخال المحدد
  • Ctrl+O: تدوير الفلتر للأمام
  • Shift+Ctrl+O: تدوير الفلتر للخلف
  • Alt+D/T/U/L/A: الانتقال مباشرة إلى وضع فلتر محدد

أوضاع الفلتر (TreeList):

  1. default
  2. no-tools
  3. user-only
  4. labeled-only
  5. all

يُظهر معظم العقد التحاورية، لكنه يُخفي أنواع إدخالات المحاسبة:

  • label
  • custom
  • model_change
  • thinking_level_change

مثل default، بالإضافة إلى إخفاء رسائل toolResult.

إدخالات message التي دورها user فقط.

الإدخالات التي تحل حالياً إلى تسمية فقط.

كل شيء في شجرة الجلسة، بما في ذلك إدخالات المحاسبة/المخصصة.

سلوك عقدة المساعد للأدوات فقط

Section titled “سلوك عقدة المساعد للأدوات فقط”

تُخفى رسائل المساعد التي تحتوي على استدعاءات أدوات فقط (بلا نص) افتراضياً في جميع طرق العرض المُصفّاة إلا في حالتين:

  • الرسالة بها خطأ/أُجهضت (stopReason ليس stop/toolUse)، أو
  • هي الورقة الحالية (تبقى مرئية دائماً)
  • تُقسَّم عبارة الاستعلام بالمسافات
  • المطابقة غير حساسة لحالة الأحرف
  • يجب أن تتطابق جميع الرموز (دلالات AND)
  • يشمل النص القابل للبحث التسمية والدور والمحتوى المحدد بالنوع (نص الرسالة، نص ملخص الفرع، النوع المخصص، مقتطفات أوامر الأدوات، إلخ.)

يحسب navigateTree سلوك الورقة الجديدة من نوع الإدخال المحدد:

  • تصبح الورقة الجديدة هي parentId الإدخال المحدد
  • إذا كان الأصل null (رسالة مستخدم جذرية)، تُعاد تهيئة الورقة إلى الجذر (resetLeaf())
  • يُنسخ نص الرسالة المحددة إلى المحرر للتعديل/إعادة الإرسال
  • نفس قاعدة الورقة كرسائل المستخدم (parentId)
  • يُستخرج محتوى النص ويُنسخ إلى المحرر

اختيار عقدة غير مستخدم (مساعد/أداة/ملخص/ضغط/محاسبة مخصصة/إلخ.)

Section titled “اختيار عقدة غير مستخدم (مساعد/أداة/ملخص/ضغط/محاسبة مخصصة/إلخ.)”
  • تصبح الورقة الجديدة هي معرف العقدة المحددة
  • لا يُملأ المحرر مسبقاً
  • لا إجراء؛ يُغلق المحدد مع “موجود بالفعل في هذه النقطة”
قرار الاختيار (مبسط):
selected node
├─ is current leaf? ── yes ──> close selector (no-op)
├─ is user/custom_message? ── yes ──> leaf := parentId (or resetLeaf for root)
│ + prefill editor text
└─ otherwise ──> leaf := selected node id
+ no editor prefill

تدفق الملخص عند التبديل

Section titled “تدفق الملخص عند التبديل”

يتحكم في مطالبة الملخص الإعداد branchSummary.enabled (الافتراضي: false).

عند التفعيل، بعد اختيار عقدة تسأل الواجهة:

  • No summary
  • Summarize
  • Summarize with custom prompt

تفاصيل التدفق:

  • الضغط على Escape في مطالبة الملخص يعيد فتح محدد الشجرة
  • إلغاء المطالبة المخصصة يعود إلى حلقة اختيار الملخص
  • أثناء إنشاء الملخص، تُظهر الواجهة مؤشر تحميل وتربط Esc بـ abortBranchSummary()
  • إذا أُجهض إنشاء الملخص، يُعاد فتح محدد الشجرة ولا يُطبق أي انتقال

دواخل navigateTree:

  • يجمع إدخالات الفرع المهجور من الورقة القديمة إلى السلف المشترك
  • يُصدر session_before_tree (يمكن للإضافات الإلغاء أو حقن الملخص)
  • يستخدم جهاز التلخيص الافتراضي فقط إذا طُلب وكان ضرورياً
  • يطبق الانتقال بـ:
    • branchWithSummary(...) عند وجود ملخص
    • branch(newLeafId) للانتقال غير الجذري بدون ملخص
    • resetLeaf() للانتقال الجذري بدون ملخص
  • يستبدل محادثة الوكيل بسياق جلسة معاد بناؤه
  • يُصدر session_tree

ملاحظة: إذا طلب المستخدم ملخصاً ولكن لا يوجد شيء للتلخيص، يستمر التنقل دون إنشاء إدخال ملخص.

تستدعي تعديلات التسمية في واجهة الشجرة appendLabelChange(targetId, label).

  • تسمية غير فارغة تضبط/تحدث التسمية المحلولة
  • تسمية فارغة تمسحها
  • تُخزَّن التسميات كإدخالات label للإلحاق فقط
  • تعرض عقد الشجرة حالة التسمية المحلولة، وليس سجل إدخالات التسمية الخام

/tree مقابل العمليات المجاورة

Section titled “/tree مقابل العمليات المجاورة”
العمليةالنطاقالنتيجة
/treeملف الجلسة الحاليينقل الورقة إلى النقطة المحددة (نفس الملف)
/branchعادةً ملف الجلسة الحالي -> ملف جلسة جديدافتراضياً يتفرع من رسالة مستخدم محددة إلى ملف جلسة جديد؛ إذا كان doubleEscapeAction = "tree"، يفتح /branch واجهة تنقل الشجرة بدلاً من ذلك
/forkجلسة الجلسة الحالية بالكامليكرر الجلسة إلى ملف جلسة جديد محفوظ
/resumeقائمة الجلساتيتبدل إلى ملف جلسة آخر

التمييز الرئيسي: /tree هو أداة تنقل/إعادة تموضع داخل ملف جلسة واحد. كل من /branch و/fork و/resume تغير سياق ملف الجلسة.

إعادة التشغيل من مطالبة مستخدم سابقة دون فقدان الفرع الحالي

Section titled “إعادة التشغيل من مطالبة مستخدم سابقة دون فقدان الفرع الحالي”
  1. /tree
  2. البحث عن رسالة مستخدم سابقة واختيارها
  3. اختيار No summary (أو التلخيص إذا لزم)
  4. تعديل النص المملوء مسبقاً في المحرر
  5. الإرسال

الأثر: ينمو فرع جديد من النقطة المحددة داخل نفس ملف الجلسة.

مغادرة الفرع الحالي مع علامة تمييز سياقية

Section titled “مغادرة الفرع الحالي مع علامة تمييز سياقية”
  1. تفعيل branchSummary.enabled
  2. /tree واختيار العقدة المستهدفة
  3. اختيار Summarize (أو مطالبة مخصصة)

الأثر: يُلحق إدخال branch_summary عند الموضع المستهدف قبل المتابعة.

فحص إدخالات المحاسبة المخفية

Section titled “فحص إدخالات المحاسبة المخفية”
  1. /tree
  2. الضغط على Alt+A (الكل)
  3. البحث عن model، thinking، custom، أو التسميات

الأثر: فحص الجدول الزمني الداخلي الكامل، وليس فقط العقد التحاورية.

وضع علامات على نقاط التحول للرجوع إليها لاحقاً

Section titled “وضع علامات على نقاط التحول للرجوع إليها لاحقاً”
  1. /tree
  2. الانتقال إلى الإدخال
  3. Shift+L وضبط تسمية
  4. لاحقاً استخدام Alt+L (labeled-only) للانتقال بسرعة

الأثر: تنقل سريع بين معالم الفروع الدائمة.