---
read_when:
    - การปรับแต่งส่วนติดต่อผู้ใช้เมนูของ Mac หรือตรรกะสถานะ
summary: ตรรกะสถานะแถบเมนูและสิ่งที่แสดงให้ผู้ใช้เห็น
title: แถบเมนู
x-i18n:
    generated_at: "2026-05-06T09:22:43Z"
    model: gpt-5.5
    provider: openai
    source_hash: c569ced20b2f6a639d52d373cc8b55a42d7c015a0b234d5154ce67ac03c2eaf6
    source_path: platforms/mac/menu-bar.md
    workflow: 16
---

## สิ่งที่แสดง

- เราแสดงสถานะงานปัจจุบันของเอเจนต์ในไอคอนแถบเมนูและในแถวสถานะแรกของเมนู
- สถานะความพร้อมทำงานจะถูกซ่อนไว้ระหว่างที่มีงานกำลังทำงานอยู่ และจะกลับมาเมื่อทุกเซสชันว่าง
- เมนูย่อย "บริบท" ที่ระดับรากมีเซสชันล่าสุด แทนที่จะขยายเซสชันเหล่านั้นโดยตรงในเมนูราก
- บล็อก "โหนด" ในเมนูรากแสดงเฉพาะ **อุปกรณ์** (โหนดที่จับคู่ผ่าน `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 ชั่วโมงที่ผ่านมา
- แต่ละแถวเซสชันยังคงมีแถบโทเค็น อายุ ตัวอย่าง การคิด/รายละเอียด รีเซ็ต บีบอัด และการลบ
- ข้อความกำลังโหลด ไม่ได้เชื่อมต่อ และข้อผิดพลาดในการโหลดเซสชันจะปรากฏภายในเมนูย่อยบริบท
- รายละเอียดการใช้งานของผู้ให้บริการและค่าใช้จ่ายการใช้งานยังคงอยู่ระดับรากใต้บริบท เพื่อให้เหลือบดูได้โดยไม่ต้องเปิดเมนูย่อย

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

- ระหว่างที่มีงานกำลังทำงานอยู่: `<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.command`
  - `read`/`write`: พาธแบบย่อ
  - `edit`: พาธพร้อมชนิดการเปลี่ยนแปลงที่อนุมานจากจำนวน `meta`/diff
  - สำรอง: ชื่อเครื่องมือ

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

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

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

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

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

- [แอป macOS](/th/platforms/macos)
- [ไอคอนแถบเมนู](/th/platforms/mac/icon)
