---
read_when:
    - تعديل واجهة قائمة mac أو منطق الحالة
summary: منطق حالة شريط القوائم وما الذي يظهر للمستخدمين
title: شريط القوائم
x-i18n:
    generated_at: "2026-04-05T12:50:12Z"
    model: gpt-5.4
    provider: openai
    source_hash: 8eb73c0e671a76aae4ebb653c65147610bf3e6d3c9c0943d150e292e7761d16d
    source_path: platforms/mac/menu-bar.md
    workflow: 15
---

# منطق حالة شريط القوائم

## ما الذي يظهر

- نعرض حالة عمل الوكيل الحالية في أيقونة شريط القوائم وفي أول صف حالة داخل القائمة.
- تُخفى حالة السلامة أثناء نشاط العمل؛ وتعود عندما تصبح كل الجلسات في وضع الخمول.
- تسرد كتلة “Nodes” في القائمة **الأجهزة** فقط (العقد المقترنة عبر `node.list`)، وليس إدخالات العميل/Presence.
- يظهر قسم “Usage” تحت Context عندما تكون لقطات استخدام الموفّر متاحة.

## نموذج الحالة

- الجلسات: تصل الأحداث مع `runId` (لكل تشغيل) بالإضافة إلى `sessionKey` داخل الحمولة. الجلسة “الرئيسية” هي المفتاح `main`؛ وإذا لم تكن موجودة، نرجع إلى أحدث جلسة تم تحديثها.
- الأولوية: تفوز الجلسة الرئيسية دائمًا. إذا كانت الجلسة الرئيسية نشطة، فستُعرض حالتها فورًا. وإذا كانت الجلسة الرئيسية خاملة، فستُعرض أحدث جلسة غير رئيسية كانت نشطة. ولا نقوم بالتبديل ذهابًا وإيابًا أثناء النشاط؛ بل نبدّل فقط عندما تصبح الجلسة الحالية خاملة أو عندما تصبح الجلسة الرئيسية نشطة.
- أنواع النشاط:
  - `job`: تنفيذ أوامر عالية المستوى (`state: started|streaming|done|error`).
  - `tool`: ‏`phase: start|result` مع `toolName` و`meta/args`.

## تعداد IconState ‏(Swift)

- `idle`
- `workingMain(ActivityKind)`
- `workingOther(ActivityKind)`
- `overridden(ActivityKind)` ‏(تجاوز للتصحيح)

### ActivityKind → الرمز

- `exec` ← 💻
- `read` ← 📄
- `write` ← ✍️
- `edit` ← 📝
- `attach` ← 📎
- الافتراضي ← 🛠️

### الربط البصري

- `idle`: الكائن المعتاد.
- `workingMain`: شارة مع رمز، وتلوين كامل، وتحريك "العمل" للساق.
- `workingOther`: شارة مع رمز، وتلوين خافت، ومن دون حركة.
- `overridden`: يستخدم الرمز/التلوين المختار بغض النظر عن النشاط.

## نص صف الحالة (القائمة)

- أثناء نشاط العمل: `<Session role> · <activity label>`
  - أمثلة: `Main · exec: pnpm test`, `Other · read: apps/macos/Sources/OpenClaw/AppState.swift`.
- عند الخمول: يعود إلى ملخص السلامة.

## استيعاب الأحداث

- المصدر: أحداث `agent` في control-channel ‏(`ControlChannel.handleAgentEvent`).
- الحقول المحللة:
  - `stream: "job"` مع `data.state` للبداية/التوقف.
  - `stream: "tool"` مع `data.phase`, `name`, و`meta`/`args` الاختيارية.
- التسميات:
  - `exec`: السطر الأول من `args.command`.
  - `read`/`write`: مسار مختصر.
  - `edit`: المسار بالإضافة إلى نوع التغيير المستنتج من `meta`/عدد الفروقات.
  - الرجوع الافتراضي: اسم الأداة.

## تجاوز التصحيح

- Settings ▸ Debug ▸ محدد “Icon override”:
  - `System (auto)` (الافتراضي)
  - `Working: main` (لكل نوع أداة)
  - `Working: other` (لكل نوع أداة)
  - `Idle`
- يتم تخزينه عبر `@AppStorage("iconOverride")`؛ ويُربط إلى `IconState.overridden`.

## قائمة التحقق للاختبار

- شغّل job في الجلسة الرئيسية: تحقق من أن الأيقونة تتبدل فورًا وأن صف الحالة يعرض تسمية الجلسة الرئيسية.
- شغّل job في جلسة غير رئيسية بينما الجلسة الرئيسية خاملة: تعرض الأيقونة/الحالة الجلسة غير الرئيسية؛ وتبقى مستقرة حتى تنتهي.
- ابدأ الجلسة الرئيسية بينما الأخرى نشطة: تنقلب الأيقونة إلى الجلسة الرئيسية فورًا.
- دفعات أدوات سريعة: تأكد من أن الشارة لا تومض (مهلة سماح TTL على نتائج الأدوات).
- يظهر صف السلامة مرة أخرى بمجرد خمول جميع الجلسات.
