macOS companion app
แถบเมนู
สิ่งที่แสดง
- เราแสดงสถานะงานปัจจุบันของเอเจนต์ในไอคอนแถบเมนูและในแถวสถานะแรกของเมนู
- สถานะความพร้อมทำงานจะถูกซ่อนไว้ระหว่างที่มีงานกำลังทำงานอยู่ และจะกลับมาเมื่อทุกเซสชันว่าง
- เมนูย่อย "บริบท" ที่ระดับรากมีเซสชันล่าสุด แทนที่จะขยายเซสชันเหล่านั้นโดยตรงในเมนูราก
- บล็อก "โหนด" ในเมนูรากแสดงเฉพาะ อุปกรณ์ (โหนดที่จับคู่ผ่าน
node.list) ไม่ใช่รายการไคลเอนต์/การแสดงตน - ส่วน "การใช้งาน" ที่ระดับรากจะปรากฏใต้บริบทเมื่อมีสแนปช็อตการใช้งานของผู้ให้บริการ ตามด้วยรายละเอียดค่าใช้จ่ายการใช้งานเมื่อมี
โมเดลสถานะ
- เซสชัน: อีเวนต์มาพร้อม
runId(ต่อการรัน) และsessionKeyในเพย์โหลด เซสชัน "หลัก" คือคีย์main; หากไม่มี เราจะย้อนกลับไปใช้เซสชันที่อัปเดตล่าสุด - ลำดับความสำคัญ: เซสชันหลักชนะเสมอ หากเซสชันหลักทำงานอยู่ สถานะของเซสชันนั้นจะแสดงทันที หากเซสชันหลักว่าง จะแสดงเซสชันที่ไม่ใช่เซสชันหลักซึ่งใช้งานล่าสุด เราไม่สลับไปมาระหว่างกิจกรรม แต่จะสลับเฉพาะเมื่อเซสชันปัจจุบันว่างหรือเซสชันหลักเริ่มทำงาน
- ประเภทกิจกรรม:
job: การดำเนินคำสั่งระดับสูง (state: started|streaming|done|error)tool:phase: start|resultพร้อมtoolNameและmeta/args
enum IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(การแทนที่เพื่อดีบัก)
ActivityKind → glyph
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- ค่าเริ่มต้น → 🛠️
การแมปภาพ
idle: ตัวละครปกติworkingMain: ป้ายพร้อม glyph, สีเต็ม, แอนิเมชันขา "กำลังทำงาน"workingOther: ป้ายพร้อม glyph, สีจาง, ไม่มีการวิ่งoverridden: ใช้ glyph/สีที่เลือกโดยไม่ขึ้นกับกิจกรรม
เมนูย่อยบริบท
- เมนูรากแสดงแถว "บริบท" หนึ่งแถวพร้อมจำนวน/สถานะของเซสชัน และเปิดเมนูย่อย
- ส่วนหัวของเมนูย่อยบริบทแสดงจำนวนเซสชันที่ทำงานอยู่ในช่วง 24 ชั่วโมงที่ผ่านมา
- แต่ละแถวเซสชันยังคงมีแถบโทเค็น อายุ ตัวอย่าง การคิด/รายละเอียด รีเซ็ต บีบอัด และการลบ
- ข้อความกำลังโหลด ไม่ได้เชื่อมต่อ และข้อผิดพลาดในการโหลดเซสชันจะปรากฏภายในเมนูย่อยบริบท
- รายละเอียดการใช้งานของผู้ให้บริการและค่าใช้จ่ายการใช้งานยังคงอยู่ระดับรากใต้บริบท เพื่อให้เหลือบดูได้โดยไม่ต้องเปิดเมนูย่อย
ข้อความแถวสถานะ (เมนู)
- ระหว่างที่มีงานกำลังทำงานอยู่:
<Session role> · <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.commandread/write: พาธแบบย่อedit: พาธพร้อมชนิดการเปลี่ยนแปลงที่อนุมานจากจำนวนmeta/diff- สำรอง: ชื่อเครื่องมือ
การแทนที่เพื่อดีบัก
- การตั้งค่า ▸ ดีบัก ▸ ตัวเลือก "แทนที่ไอคอน":
System (auto)(ค่าเริ่มต้น)Working: main(ต่อชนิดเครื่องมือ)Working: other(ต่อชนิดเครื่องมือ)Idle
- จัดเก็บผ่าน
@AppStorage("iconOverride"); แมปเป็นIconState.overridden
รายการตรวจสอบการทดสอบ
- ทริกเกอร์งานเซสชันหลัก: ตรวจสอบว่าไอคอนสลับทันทีและแถวสถานะแสดงป้ายหลัก
- ทริกเกอร์งานเซสชันที่ไม่ใช่เซสชันหลักขณะที่เซสชันหลักว่าง: ไอคอน/สถานะแสดงเซสชันที่ไม่ใช่เซสชันหลัก และคงที่จนกว่างานจะเสร็จ
- เริ่มเซสชันหลักขณะที่เซสชันอื่นทำงานอยู่: ไอคอนสลับไปยังเซสชันหลักทันที
- การเกิดเครื่องมือต่อเนื่องอย่างรวดเร็ว: ตรวจสอบว่าป้ายไม่กะพริบ (ช่วงผ่อนผัน TTL บนผลลัพธ์เครื่องมือ)
- แถวความพร้อมทำงานปรากฏอีกครั้งเมื่อทุกเซสชันว่าง