macOS companion app

แถบเมนู

สิ่งที่แสดง

  • เราแสดงสถานะงานปัจจุบันของเอเจนต์ในไอคอนแถบเมนูและในแถวสถานะแรกของเมนู
  • สถานะความพร้อมทำงานจะถูกซ่อนไว้ระหว่างที่มีงานกำลังทำงานอยู่ และจะกลับมาเมื่อทุกเซสชันว่าง
  • เมนูย่อย "บริบท" ที่ระดับรากมีเซสชันล่าสุด แทนที่จะขยายเซสชันเหล่านั้นโดยตรงในเมนูราก
  • บล็อก "โหนด" ในเมนูรากแสดงเฉพาะ อุปกรณ์ (โหนดที่จับคู่ผ่าน node.list) ไม่ใช่รายการไคลเอนต์/การแสดงตน
  • ส่วน "การใช้งาน" ที่ระดับรากจะปรากฏใต้บริบทเมื่อมีสแนปช็อตการใช้งานของผู้ให้บริการ ตามด้วยรายละเอียดค่าใช้จ่ายการใช้งานเมื่อมี

โมเดลสถานะ

  • เซสชัน: อีเวนต์มาพร้อม runId (ต่อการรัน) และ sessionKey ในเพย์โหลด เซสชัน "หลัก" คือคีย์ main; หากไม่มี เราจะย้อนกลับไปใช้เซสชันที่อัปเดตล่าสุด
  • ลำดับความสำคัญ: เซสชันหลักชนะเสมอ หากเซสชันหลักทำงานอยู่ สถานะของเซสชันนั้นจะแสดงทันที หากเซสชันหลักว่าง จะแสดงเซสชันที่ไม่ใช่เซสชันหลักซึ่งใช้งานล่าสุด เราไม่สลับไปมาระหว่างกิจกรรม แต่จะสลับเฉพาะเมื่อเซสชันปัจจุบันว่างหรือเซสชันหลักเริ่มทำงาน
  • ประเภทกิจกรรม:
    • job: การดำเนินคำสั่งระดับสูง (state: started|streaming|done|error)
    • tool: phase: start|result พร้อม toolName และ meta/args

enum IconState (Swift)

  • idle
  • workingMain(ActivityKind)
  • workingOther(ActivityKind)
  • overridden(ActivityKind) (การแทนที่เพื่อดีบัก)

ActivityKind → glyph

  • exec → 💻
  • read → 📄
  • write → ✍️
  • edit → 📝
  • attach → 📎
  • ค่าเริ่มต้น → 🛠️

การแมปภาพ

  • idle: ตัวละครปกติ
  • workingMain: ป้ายพร้อม glyph, สีเต็ม, แอนิเมชันขา "กำลังทำงาน"
  • workingOther: ป้ายพร้อม glyph, สีจาง, ไม่มีการวิ่ง
  • overridden: ใช้ glyph/สีที่เลือกโดยไม่ขึ้นกับกิจกรรม

เมนูย่อยบริบท

  • เมนูรากแสดงแถว "บริบท" หนึ่งแถวพร้อมจำนวน/สถานะของเซสชัน และเปิดเมนูย่อย
  • ส่วนหัวของเมนูย่อยบริบทแสดงจำนวนเซสชันที่ทำงานอยู่ในช่วง 24 ชั่วโมงที่ผ่านมา
  • แต่ละแถวเซสชันยังคงมีแถบโทเค็น อายุ ตัวอย่าง การคิด/รายละเอียด รีเซ็ต บีบอัด และการลบ
  • ข้อความกำลังโหลด ไม่ได้เชื่อมต่อ และข้อผิดพลาดในการโหลดเซสชันจะปรากฏภายในเมนูย่อยบริบท
  • รายละเอียดการใช้งานของผู้ให้บริการและค่าใช้จ่ายการใช้งานยังคงอยู่ระดับรากใต้บริบท เพื่อให้เหลือบดูได้โดยไม่ต้องเปิดเมนูย่อย

ข้อความแถวสถานะ (เมนู)

  • ระหว่างที่มีงานกำลังทำงานอยู่: &lt;Session role&gt; · <activity label>
    • ตัวอย่าง: Main · exec: pnpm test, Other · read: apps/macos/Sources/OpenClaw/AppState.swift
  • เมื่อว่าง: ย้อนกลับไปใช้สรุปความพร้อมทำงาน

การรับอีเวนต์เข้า

  • แหล่งที่มา: อีเวนต์ agent ของช่องควบคุม (ControlChannel.handleAgentEvent)
  • ฟิลด์ที่แยกวิเคราะห์:
    • stream: "job" พร้อม data.state สำหรับเริ่ม/หยุด
    • stream: "tool" พร้อม data.phase, name, meta/args ที่ไม่บังคับ
  • ป้าย:
    • exec: บรรทัดแรกของ args.command
    • read/write: พาธแบบย่อ
    • edit: พาธพร้อมชนิดการเปลี่ยนแปลงที่อนุมานจากจำนวน meta/diff
    • สำรอง: ชื่อเครื่องมือ

การแทนที่เพื่อดีบัก

  • การตั้งค่า ▸ ดีบัก ▸ ตัวเลือก "แทนที่ไอคอน":
    • System (auto) (ค่าเริ่มต้น)
    • Working: main (ต่อชนิดเครื่องมือ)
    • Working: other (ต่อชนิดเครื่องมือ)
    • Idle
  • จัดเก็บผ่าน @AppStorage("iconOverride"); แมปเป็น IconState.overridden

รายการตรวจสอบการทดสอบ

  • ทริกเกอร์งานเซสชันหลัก: ตรวจสอบว่าไอคอนสลับทันทีและแถวสถานะแสดงป้ายหลัก
  • ทริกเกอร์งานเซสชันที่ไม่ใช่เซสชันหลักขณะที่เซสชันหลักว่าง: ไอคอน/สถานะแสดงเซสชันที่ไม่ใช่เซสชันหลัก และคงที่จนกว่างานจะเสร็จ
  • เริ่มเซสชันหลักขณะที่เซสชันอื่นทำงานอยู่: ไอคอนสลับไปยังเซสชันหลักทันที
  • การเกิดเครื่องมือต่อเนื่องอย่างรวดเร็ว: ตรวจสอบว่าป้ายไม่กะพริบ (ช่วงผ่อนผัน TTL บนผลลัพธ์เครื่องมือ)
  • แถวความพร้อมทำงานปรากฏอีกครั้งเมื่อทุกเซสชันว่าง

ที่เกี่ยวข้อง