ข้ามไปยังเนื้อหา

คู่มืออ้างอิงคำสั่ง `/tree`

/tree เปิดตัวนำทาง Session Tree แบบโต้ตอบ ซึ่งช่วยให้คุณข้ามไปยังรายการใดก็ได้ในไฟล์เซสชันปัจจุบันและดำเนินการต่อจากจุดนั้น

นี่คือการย้าย leaf ภายในไฟล์เดียวกัน ไม่ใช่การส่งออกเซสชันใหม่

  • สร้างต้นไม้จากรายการเซสชันปัจจุบัน (SessionManager.getTree())
  • เปิด TreeSelectorComponent พร้อมการนำทางด้วยแป้นพิมพ์ ตัวกรอง และการค้นหา
  • เมื่อเลือก จะเรียก AgentSession.navigateTree(targetId, { summarize, customInstructions })
  • สร้างการแชทที่มองเห็นได้ใหม่จาก leaf path ใหม่
  • เติมข้อความในตัวแก้ไขล่วงหน้าเมื่อเลือกข้อความของผู้ใช้/ข้อความกำหนดเอง (เป็นตัวเลือก)

การนำไปใช้งานหลัก:

  • src/modes/controllers/input-controller.ts (การเชื่อมสาย /tree, keybinding, พฤติกรรม double-escape)
  • src/modes/controllers/selector-controller.ts (การเปิด UI ต้นไม้ + กระบวนการแจ้งสรุป)
  • src/modes/components/tree-selector.ts (การนำทาง, ตัวกรอง, การค้นหา, ป้ายกำกับ, การแสดงผล)
  • src/session/agent-session.ts (การสลับ leaf navigateTree + สรุปเป็นตัวเลือก)
  • src/session/session-manager.ts (getTree, branch, branchWithSummary, resetLeaf, การคงไว้ซึ่งป้ายกำกับ)

สิ่งใดสิ่งหนึ่งต่อไปนี้จะเปิดตัวเลือกเดียวกัน:

  • /tree
  • การกระทำ keybinding ที่กำหนดค่า tree
  • double-escape บนตัวแก้ไขว่างเมื่อ doubleEscapeAction = "tree" (ค่าเริ่มต้น)
  • /branch เมื่อ doubleEscapeAction = "tree" (นำไปยังตัวเลือกต้นไม้แทนตัวเลือกสาขาเฉพาะผู้ใช้)

ต้นไม้จะถูกแสดงผลจากพอยน์เตอร์ parent ของรายการเซสชัน (id / parentId)

  • ลูกจะถูกเรียงลำดับตามเวลาประทับจากน้อยไปมาก (เก่ากว่าก่อน ใหม่กว่าต่ำกว่า)
  • สาขาที่ใช้งานอยู่ (เส้นทางจาก root ถึง leaf ปัจจุบัน) จะถูกทำเครื่องหมายด้วยจุด
  • ป้ายกำกับ (ถ้ามี) จะแสดงเป็น [label] ก่อนข้อความของโหนด
  • หากมี root หลายตัว (parent chain ที่ถูกตัดขาด/เสีย) จะแสดงภายใต้ virtual branching root
ตัวอย่างมุมมองต้นไม้ (เส้นทางที่ใช้งานอยู่ทำเครื่องหมายด้วย •):
├─ 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)) แถว
  • 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 ที่ role เป็น user

เฉพาะรายการที่ปัจจุบันแก้ไขเป็นป้ายกำกับ

ทุกอย่างในต้นไม้เซสชัน รวมถึงรายการจัดเก็บบัญชี/กำหนดเอง

ข้อความ assistant ที่มี เฉพาะการเรียกเครื่องมือ (ไม่มีข้อความ) จะถูกซ่อนโดยค่าเริ่มต้นในมุมมองที่ถูกกรองทั้งหมด เว้นแต่:

  • ข้อความเป็น error/aborted (stopReason ไม่ใช่ stop/toolUse) หรือ
  • เป็น leaf ปัจจุบัน (แสดงให้เห็นอยู่เสมอ)
  • คำค้นหาจะถูกแบ่งโดยเว้นวรรค
  • การจับคู่ไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก
  • token ทั้งหมดต้องตรงกัน (ความหมาย AND)
  • ข้อความที่ค้นหาได้รวมถึงป้ายกำกับ role และเนื้อหาเฉพาะประเภท (ข้อความข้อความ, ข้อความสรุปสาขา, ประเภทกำหนดเอง, ข้อมูลโค้ดคำสั่งเครื่องมือ ฯลฯ)

navigateTree คำนวณพฤติกรรม leaf ใหม่จากประเภทรายการที่เลือก:

  • leaf ใหม่จะกลายเป็น parentId ของรายการที่เลือก
  • หาก parent เป็น null (ข้อความผู้ใช้ root) leaf จะรีเซ็ตเป็น root (resetLeaf())
  • ข้อความที่เลือกจะถูกคัดลอกไปยังตัวแก้ไขสำหรับการแก้ไข/ส่งใหม่
  • กฎ leaf เดียวกับข้อความผู้ใช้ (parentId)
  • เนื้อหาข้อความจะถูกดึงออกและคัดลอกไปยังตัวแก้ไข

การเลือกโหนดที่ไม่ใช่ผู้ใช้ (assistant/tool/summary/compaction/custom bookkeeping/ฯลฯ)

หัวข้อที่มีชื่อว่า “การเลือกโหนดที่ไม่ใช่ผู้ใช้ (assistant/tool/summary/compaction/custom bookkeeping/ฯลฯ)”
  • leaf ใหม่จะกลายเป็น id ของโหนดที่เลือก
  • ตัวแก้ไขจะไม่ถูกเติมข้อมูลล่วงหน้า
  • ไม่มีการดำเนินการ; ตัวเลือกจะปิดพร้อมข้อความ “Already at this point”
การตัดสินใจเลือก (แบบง่าย):
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

การแจ้งสรุปถูกควบคุมโดย branchSummary.enabled (ค่าเริ่มต้น: false)

เมื่อเปิดใช้งาน หลังจากเลือกโหนด UI จะถาม:

  • No summary
  • Summarize
  • Summarize with custom prompt

รายละเอียดกระบวนการ:

  • Escape ในการแจ้งสรุปจะเปิดตัวเลือกต้นไม้อีกครั้ง
  • การยกเลิกการแจ้งกำหนดเองจะกลับไปที่วงจรการเลือกสรุป
  • ระหว่างการสรุป UI จะแสดง loader และผูก Esc กับ abortBranchSummary()
  • หากการสรุปถูกยกเลิก ตัวเลือกต้นไม้จะเปิดใหม่และไม่มีการย้ายถูกนำไปใช้

ภายใน navigateTree:

  • รวบรวมรายการสาขาที่ถูกละทิ้งจาก leaf เก่าไปยัง common ancestor
  • ส่ง session_before_tree (ส่วนขยายสามารถยกเลิกหรือแทรกสรุปได้)
  • ใช้ตัวสรุปเริ่มต้นเฉพาะเมื่อร้องขอและจำเป็น
  • ใช้การย้ายด้วย:
    • branchWithSummary(...) เมื่อมีสรุปอยู่
    • branch(newLeafId) สำหรับการย้ายที่ไม่ใช่ root โดยไม่มีสรุป
    • resetLeaf() สำหรับการย้าย root โดยไม่มีสรุป
  • แทนที่การสนทนาของ agent ด้วย session context ที่สร้างใหม่
  • ส่ง session_tree

หมายเหตุ: หากผู้ใช้ร้องขอสรุปแต่ไม่มีอะไรให้สรุป การนำทางจะดำเนินต่อโดยไม่สร้างรายการสรุป

การแก้ไขป้ายกำกับใน UI ต้นไม้จะเรียก appendLabelChange(targetId, label)

  • ป้ายกำกับที่ไม่ว่างเปล่าจะตั้งค่า/อัปเดตป้ายกำกับที่แก้ไขแล้ว
  • ป้ายกำกับว่างจะล้างมัน
  • ป้ายกำกับถูกจัดเก็บเป็นรายการ label แบบ append-only
  • โหนดต้นไม้จะแสดงสถานะป้ายกำกับที่แก้ไขแล้ว ไม่ใช่ประวัติรายการป้ายกำกับดิบ
การดำเนินการขอบเขตผลลัพธ์
/treeไฟล์เซสชันปัจจุบันย้าย leaf ไปยังจุดที่เลือก (ไฟล์เดียวกัน)
/branchโดยปกติไฟล์เซสชันปัจจุบัน -> ไฟล์เซสชันใหม่โดยค่าเริ่มต้นจะแตกสาขาจากข้อความ user ที่เลือกไปเป็นไฟล์เซสชันใหม่; หาก doubleEscapeAction = "tree" /branch จะเปิด UI การนำทางต้นไม้แทน
/forkเซสชันปัจจุบันทั้งหมดทำสำเนาเซสชันไปเป็นไฟล์เซสชันใหม่ที่คงอยู่
/resumeรายการเซสชันสลับไปยังไฟล์เซสชันอื่น

ความแตกต่างหลัก: /tree เป็นเครื่องมือนำทาง/จัดตำแหน่งใหม่ภายในไฟล์เซสชันเดียว /branch, /fork และ /resume ทั้งหมดเปลี่ยน session-file context

เรียกใช้ใหม่จากการแจ้งผู้ใช้ก่อนหน้าโดยไม่สูญเสียสาขาปัจจุบัน

หัวข้อที่มีชื่อว่า “เรียกใช้ใหม่จากการแจ้งผู้ใช้ก่อนหน้าโดยไม่สูญเสียสาขาปัจจุบัน”
  1. /tree
  2. ค้นหา/เลือกข้อความผู้ใช้ก่อนหน้า
  3. เลือก No summary (หรือสรุปหากจำเป็น)
  4. แก้ไขข้อความที่เติมล่วงหน้าในตัวแก้ไข
  5. ส่ง

ผลลัพธ์: สาขาใหม่เติบโตจากจุดที่เลือกภายในไฟล์เซสชันเดียวกัน

  1. เปิดใช้งาน branchSummary.enabled
  2. /tree และเลือกโหนดเป้าหมาย
  3. เลือก Summarize (หรือการแจ้งกำหนดเอง)

ผลลัพธ์: รายการ branch_summary จะถูกต่อท้ายที่ตำแหน่งเป้าหมายก่อนดำเนินการต่อ

  1. /tree
  2. กด Alt+A (all)
  3. ค้นหา model, thinking, custom หรือป้ายกำกับ

ผลลัพธ์: ตรวจสอบไทม์ไลน์ภายในทั้งหมด ไม่ใช่เฉพาะโหนดการสนทนา

  1. /tree
  2. ย้ายไปยังรายการ
  3. Shift+L และตั้งป้ายกำกับ
  4. ใช้ Alt+L (labeled-only) ในภายหลังเพื่อข้ามอย่างรวดเร็ว

ผลลัพธ์: การนำทางอย่างรวดเร็วในหมู่ branch landmark ที่ยั่งยืน