Logika stanu paska menu
Co jest wyświetlane
- Prezentujemy bieżący stan pracy agenta w ikonie paska menu oraz w pierwszym wierszu stanu menu.
- Stan zdrowia jest ukryty podczas aktywnej pracy; wraca, gdy wszystkie sesje są bezczynne.
- Blok „Nodes” w menu wyświetla wyłącznie urządzenia (sparowane węzły przez
node.list), a nie wpisy klienta/obecności. - Sekcja „Usage” pojawia się pod Kontekstem, gdy dostępne są migawki użycia dostawcy.
Model stanu
- Sesje: zdarzenia przychodzą z
runId(na uruchomienie) wraz zsessionKeyw ładunku. „Główna” sesja ma kluczmain; jeśli go brakuje, wracamy do ostatnio zaktualizowanej sesji. - Priorytet: główna zawsze wygrywa. Jeśli główna jest aktywna, jej stan jest wyświetlany natychmiast. Jeśli główna jest bezczynna, wyświetlana jest ostatnio aktywna sesja niegłówna. Nie przełączamy się w trakcie aktywności; zmiana następuje tylko wtedy, gdy bieżąca sesja przechodzi w bezczynność lub gdy główna staje się aktywna.
- Rodzaje aktywności:
job: wysokopoziomowe wykonywanie poleceń (state: started|streaming|done|error).tool:phase: start|resultztoolNameorazmeta/args.
Enum IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(nadpisanie debugowe)
ActivityKind → glif
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- domyślnie → 🛠️
Mapowanie wizualne
idle: normalny stworek.workingMain: odznaka z glifem, pełne zabarwienie, animacja „pracy” nóg.workingOther: odznaka z glifem, stonowane zabarwienie, brak „biegania”.overridden: używa wybranego glifu/zabarwienia niezależnie od aktywności.
Tekst wiersza stanu (menu)
- Gdy praca jest aktywna:
<Session role> · <activity label>- Przykłady:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Przykłady:
- Gdy bezczynne: powrót do podsumowania stanu zdrowia.
Ingest zdarzeń
- Źródło: zdarzenia
agentkanału kontrolnego (ControlChannel.handleAgentEvent). - Parsowane pola:
stream: "job"zdata.statedla start/stop.stream: "tool"zdata.phase,name, opcjonalniemeta/args.
- Etykiety:
exec: pierwsza liniaargs.command.read/write: skrócona ścieżka.edit: ścieżka plus wnioskowany rodzaj zmiany zmeta/liczników diff.- rezerwowo: nazwa narzędzia.
Nadpisanie debugowe
- Ustawienia ▸ Debug ▸ selektor „Icon override”:
System (auto)(domyślne)Working: main(wg rodzaju narzędzia)Working: other(wg rodzaju narzędzia)Idle
- Przechowywane przez
@AppStorage("iconOverride"); mapowane doIconState.overridden.
Lista kontrolna testów
- Uruchom zadanie głównej sesji: sprawdź, czy ikona przełącza się natychmiast i wiersz stanu pokazuje etykietę główną.
- Uruchom zadanie sesji niegłównej, gdy główna jest bezczynna: ikona/stan pokazują niegłówną; pozostaje stabilne do zakończenia.
- Uruchom główną, gdy inna jest aktywna: ikona przełącza się na główną natychmiast.
- Szybkie serie narzędzi: upewnij się, że odznaka nie migocze (okres łaski TTL dla wyników narzędzi).
- Wiersz zdrowia pojawia się ponownie, gdy wszystkie sesje są bezczynne.