Menyu paneli holati logikasi
Nimalar ko‘rsatiladi
- Joriy agent ish holatini menyu paneli ikonkasida va menyuning birinchi holat qatorida ko‘rsatamiz.
- Ish faol bo‘lganda sog‘liq holati yashiriladi; barcha sessiyalar bo‘sh turganda u qaytadi.
- Menyudagi “Nodes” bloki faqat qurilmalarni (
node.listorqali juftlangan tugunlar) ko‘rsatadi, klient/presence yozuvlarini emas. - Provider foydalanish snapshotlari mavjud bo‘lganda Context ostida “Usage” bo‘limi paydo bo‘ladi.
Holat modeli
- Sessiyalar: hodisalar payload ichida
runId(har bir ishga tushirish uchun) vasessionKeybilan keladi. “Asosiy” sessiya kalitimain; agar u bo‘lmasa, eng yaqinda yangilangan sessiyaga qaytamiz. - Ustuvorlik: main har doim yutadi. Agar main faol bo‘lsa, uning holati darhol ko‘rsatiladi. Agar main bo‘sh turgan bo‘lsa, eng yaqinda faol bo‘lgan main bo‘lmagan sessiya ko‘rsatiladi. Faoliyat o‘rtasida almashib ketmaymiz; faqat joriy sessiya bo‘sh holatga o‘tganda yoki main faol bo‘lganda almashtiramiz.
- Faoliyat turlari:
job: yuqori darajadagi buyruq bajarilishi (state: started|streaming|done|error).tool:phase: start|resultbilantoolNamevameta/args.
IconState enumeratsiyasi (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(debug override)
ActivityKind → glif
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- default → 🛠️
Vizual moslashtirish
idle: oddiy jonzot.workingMain: glifli belgi, to‘liq rang, oyoqlarning “working” animatsiyasi.workingOther: glifli belgi, xiralashtirilgan rang, yugurishsiz.overridden: faoliyatdan qat’i nazar tanlangan glif/rangdan foydalanadi.
Holat qatori matni (menyu)
- Ish faol bo‘lganda:
<Session role> · <activity label>- Misollar:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Misollar:
- Bo‘sh turganda: sog‘liq xulosasiga qaytadi.
Hodisalarni qabul qilish
- Source: control‑channel
agentevents (ControlChannel.handleAgentEvent). - Parsed fields:
stream: "job"withdata.statefor start/stop.stream: "tool"withdata.phase,name, optionalmeta/args.
- Labels:
exec: first line ofargs.command.read/write: shortened path.edit: path plus inferred change kind frommeta/diff counts.- fallback: tool name.
Debug override
- Settings ▸ Debug ▸ “Icon override” picker:
System (auto)(default)Working: main(per tool kind)Working: other(per tool kind)Idle
- Stored via
@AppStorage("iconOverride"); mapped toIconState.overridden.
Testing checklist
- Trigger main session job: verify icon switches immediately and status row shows main label.
- Trigger non‑main session job while main idle: icon/status shows non‑main; stays stable until it finishes.
- Start main while other active: icon flips to main instantly.
- Rapid tool bursts: ensure badge does not flicker (TTL grace on tool results).
- Health row reappears once all sessions idle.