Logika statusu paska menu
Co jest wyświetlane
- W ikonie paska menu i w pierwszym wierszu statusu w menu pokazujemy bieżący stan pracy agenta.
- Status kondycji jest ukrywany podczas aktywnej pracy; wraca, gdy wszystkie sesje są bezczynne.
- Blok „Nodes” w menu pokazuje tylko urządzenia (sparowane nodes przez
node.list), a nie wpisy klienta/obecności. - Sekcja „Usage” pojawia się pod Context, gdy dostępne są migawki użycia providerów.
Model stanu
- Sesje: zdarzenia przychodzą z
runId(per uruchomienie) orazsessionKeyw payloadzie. Sesja „main” to kluczmain; jeśli go nie ma, wracamy do ostatnio zaktualizowanej sesji. - Priorytet: main zawsze wygrywa. Jeśli main jest aktywna, jej stan jest pokazywany natychmiast. Jeśli main jest bezczynna, pokazywana jest ostatnio aktywna sesja nie-main. Nie przełączamy się tam i z powrotem w trakcie aktywności; przełączamy dopiero, gdy bieżąca sesja przejdzie w bezczynność albo main stanie się aktywna.
- Rodzaje aktywności:
job: wykonywanie polecenia wysokiego poziomu (state: started|streaming|done|error).tool:phase: start|resultztoolNameimeta/args.
Enum IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(nadpisanie debug)
ActivityKind → glif
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- domyślnie → 🛠️
Mapowanie wizualne
idle: zwykły stworek.workingMain: odznaka z glifem, pełne tint, animacja „pracujących” nóg.workingOther: odznaka z glifem, przytłumione tint, bez szurania.overridden: używa wybranego glifu/tint niezależnie od aktywności.
Tekst wiersza statusu (menu)
- Gdy praca jest aktywna:
<Rola sesji> · <etykieta aktywności>- Przykłady:
Main · exec: pnpm test,Other · read: apps/macos/Sources/OpenClaw/AppState.swift.
- Przykłady:
- W stanie bezczynności: wraca do podsumowania kondycji.
Przetwarzanie zdarzeń
- Źródło: zdarzenia
agentkanału sterowania (ControlChannel.handleAgentEvent). - Parsowane pola:
stream: "job"zdata.statedla start/stop.stream: "tool"zdata.phase,name, opcjonalnymmeta/args.
- Etykiety:
exec: pierwsza liniaargs.command.read/write: skrócona ścieżka.edit: ścieżka plus wywnioskowany rodzaj zmiany zmeta/liczników diff.- fallback: nazwa narzędzia.
Nadpisanie debug
- Settings ▸ Debug ▸ selektor „Icon override”:
System (auto)(domyślnie)Working: main(per rodzaj narzędzia)Working: other(per rodzaj narzędzia)Idle
- Przechowywane przez
@AppStorage("iconOverride"); mapowane doIconState.overridden.
Lista kontrolna testów
- Wywołaj job sesji main: sprawdź, czy ikona przełącza się natychmiast i czy wiersz statusu pokazuje etykietę main.
- Wywołaj job sesji nie-main, gdy main jest bezczynna: ikona/status pokazuje nie-main; pozostaje stabilne do końca.
- Uruchom main, gdy aktywna jest inna sesja: ikona natychmiast przełącza się na main.
- Szybkie serie narzędzi: upewnij się, że odznaka nie migocze (okres TTL grace przy wynikach narzędzi).
- Wiersz kondycji pojawia się ponownie, gdy wszystkie sesje są bezczynne.