ตรรกะสถานะแถบเมนู¶
สิ่งที่แสดง¶
- เราแสดงสถานะการทำงานปัจจุบันของเอเจนต์ในไอคอนแถบเมนูและในแถวสถานะแรกของเมนู
- สถานะสุขภาพจะถูกซ่อนไว้ขณะมีงานทำอยู่; จะกลับมาเมื่อทุกเซสชันว่าง
- บล็อก “Nodes” ในเมนูจะแสดงเฉพาะ อุปกรณ์ เท่านั้น (โหนดที่จับคู่ผ่าน
node.list) ไม่รวมรายการไคลเอนต์/การแสดงตน - ส่วน “Usage” จะปรากฏใต้ Context เมื่อมีสแน็ปช็อตการใช้งานของผู้ให้บริการ
โมเดลสถานะ¶
- เซสชัน: อีเวนต์มาพร้อมกับ
runId(ต่อการรัน) และsessionKeyในเพย์โหลด เซสชัน “หลัก” คือคีย์main; หากไม่มี จะใช้เซสชันที่อัปเดตล่าสุดแทน 19. เซสชัน “main” คือคีย์main; หากไม่มี เราจะย้อนกลับไปใช้เซสชันที่มีการอัปเดตล่าสุด -
- ลำดับความสำคัญ: main ชนะเสมอ 21. หาก main ทำงานอยู่ สถานะของมันจะแสดงทันที ลำดับความสำคัญ: เซสชันหลักชนะเสมอ หากเซสชันหลักกำลังทำงาน จะแสดงสถานะทันที หากเซสชันหลักว่าง จะแสดงเซสชันที่ไม่ใช่หลักซึ่งทำงานล่าสุด เราจะไม่สลับไปมาระหว่างกิจกรรม; จะสลับเฉพาะเมื่อเซสชันปัจจุบันว่างหรือเซสชันหลักเริ่มทำงาน 22. เราจะไม่สลับไปมาระหว่างกิจกรรม; เราจะสลับเฉพาะเมื่อเซสชันปัจจุบันว่างหรือ main เริ่มทำงาน
- ประเภทกิจกรรม:
job: การรันคำสั่งระดับสูง (state: started|streaming|done|error).tool:phase: start|resultพร้อมtoolNameและmeta/args.
Enum IconState (Swift)¶
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(ดีบัก override)
ActivityKind → ไอคอน¶
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- ค่าเริ่มต้น → 🛠️
23. การแมปเชิงภาพ¶
idle: ตัว critter ปกติworkingMain: ป้ายพร้อมไอคอน สีเต็ม แอนิเมชันขา “ทำงาน”workingOther: ป้ายพร้อมไอคอน สีหม่น ไม่มีการวิ่งวุ่นoverridden: ใช้ไอคอน/สีที่เลือกไว้โดยไม่คำนึงถึงกิจกรรม
ข้อความแถวสถานะ (เมนู)¶
- ระหว่างที่มีงานทำ:
<Session role> · <activity label> - ตัวอย่าง:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift. - เมื่อว่าง: จะย้อนกลับไปใช้สรุปสถานะสุขภาพ
การรับอีเวนต์¶
- แหล่งที่มา: อีเวนต์จาก control‑channel
agent(ControlChannel.handleAgentEvent). - ฟิลด์ที่แยกได้:
stream: "job"พร้อมdata.stateสำหรับเริ่ม/หยุดstream: "tool"พร้อมdata.phase,name, และตัวเลือกmeta/args.- ป้ายกำกับ:
exec: บรรทัดแรกของargs.command.read/write: พาธที่ย่อแล้วedit: พาธพร้อมชนิดการเปลี่ยนแปลงที่อนุมานจากmeta/จำนวน diff- ค่า fallback: ชื่อเครื่องมือ
การแทนที่เพื่อการดีบัก¶
- การตั้งค่า ▸ Debug ▸ ตัวเลือก “Icon override”:
System (auto)(ค่าเริ่มต้น)Working: main(ตามชนิดเครื่องมือ)Working: other(ตามชนิดเครื่องมือ)Idle- จัดเก็บผ่าน
@AppStorage("iconOverride"); แม็ปไปยังIconState.overridden.
เช็กลิสต์การทดสอบ¶
- กระตุ้นงานของเซสชันหลัก: ตรวจสอบว่าไอคอนสลับทันทีและแถวสถานะแสดงป้ายของเซสชันหลัก
- กระตุ้นงานของเซสชันที่ไม่ใช่หลักขณะเซสชันหลักว่าง: ไอคอน/สถานะแสดงของที่ไม่ใช่หลัก และคงที่จนกว่าจะเสร็จ
- เริ่มเซสชันหลักขณะมีงานอื่นอยู่: ไอคอนสลับไปที่หลักทันที
- การพุ่งของเครื่องมืออย่างรวดเร็ว: ตรวจสอบว่าป้ายไม่กระพริบ (มีช่วงผ่อนผัน TTL บนผลลัพธ์เครื่องมือ)
- แถวสุขภาพกลับมาแสดงเมื่อทุกเซสชันว่าง