macOS companion app
Pasek menu
Co jest wyświetlane
- Pokazujemy bieżący stan pracy agenta w ikonie paska menu oraz w pierwszym wierszu stanu menu.
- Stan kondycji jest ukryty, gdy praca jest aktywna; wraca, gdy wszystkie sesje są bezczynne.
- Główne podmenu „Kontekst” zawiera ostatnie sesje zamiast rozwijać je bezpośrednio w menu głównym.
- Blok „Nodes” w menu głównym zawiera tylko urządzenia (sparowane węzły przez
node.list), a nie wpisy klienta/obecności. - Główna sekcja „Użycie” pojawia się pod Kontekstem, gdy dostępne są migawki użycia dostawcy, a po niej szczegóły kosztów użycia, gdy są dostępne.
Model stanu
- Sesje: zdarzenia przychodzą z
runId(dla każdego uruchomienia) orazsessionKeyw ładunku. Sesja „główna” 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 pokazywany natychmiast. Jeśli główna jest bezczynna, pokazywana jest ostatnio aktywna sesja inna niż główna. Nie przełączamy się tam i z powrotem w trakcie aktywności; przełączamy się tylko wtedy, gdy bieżąca sesja przejdzie w bezczynność albo główna stanie się aktywna.
- Rodzaje aktywności:
job: wykonywanie polecenia wysokiego poziomu (state: started|streaming|done|error).tool:phase: start|resultztoolNameorazmeta/args.
Wyliczenie IconState (Swift)
idleworkingMain(ActivityKind)workingOther(ActivityKind)overridden(ActivityKind)(nadpisanie debugowania)
ActivityKind → glif
exec→ 💻read→ 📄write→ ✍️edit→ 📝attach→ 📎- domyślnie → 🛠️
Mapowanie wizualne
idle: zwykłe stworzenie.workingMain: odznaka z glifem, pełne zabarwienie, animacja „pracy” nóg.workingOther: odznaka z glifem, stłumione zabarwienie, bez przemykania.overridden: używa wybranego glifu/zabarwienia niezależnie od aktywności.
Podmenu kontekstu
- Menu główne pokazuje jeden wiersz „Kontekst” z liczbą/statusem sesji i otwiera podmenu.
- Nagłówek podmenu Kontekst pokazuje liczbę aktywnych sesji z ostatnich 24 godzin.
- Każdy wiersz sesji zachowuje pasek tokenów, wiek, podgląd, akcje myślenia/trybu szczegółowego, resetowania, kompaktowania i usuwania.
- Komunikaty ładowania, rozłączenia i błędu ładowania sesji pojawiają się w podmenu Kontekst.
- Szczegóły użycia providera i kosztów użycia pozostają na poziomie głównym poniżej Kontekstu, aby nadal były widoczne na pierwszy rzut oka bez otwierania podmenu.
Tekst wiersza statusu (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 jest bezczynnie: wraca do podsumowania stanu.
Pobieranie zdarzeń
- Źródło: zdarzenia control-channel
agent(ControlChannel.handleAgentEvent). - Parsowane pola:
stream: "job"zdata.statedla startu/zatrzymania.stream: "tool"zdata.phase,name, opcjonalnymimeta/args.
- Etykiety:
exec: pierwszy wierszargs.command.read/write: skrócona ścieżka.edit: ścieżka plus wywnioskowany typ zmiany zmeta/liczników diff.- awaryjnie: nazwa narzędzia.
Nadpisanie debugowania
- Ustawienia ▸ Debugowanie ▸ selektor „Nadpisanie ikony”:
System (auto)(domyślnie)Working: main(według typu narzędzia)Working: other(według typu narzędzia)Idle
- Przechowywane przez
@AppStorage("iconOverride"); mapowane naIconState.overridden.
Lista kontrolna testowania
- Uruchom zadanie sesji głównej: sprawdź, czy ikona przełącza się natychmiast, a wiersz statusu pokazuje etykietę główną.
- Uruchom zadanie sesji innej niż główna, gdy główna jest bezczynna: ikona/status pokazuje sesję inną niż główna; pozostaje stabilny do czasu jej zakończenia.
- Uruchom główną sesję, gdy inna jest aktywna: ikona natychmiast przełącza się na główną.
- Szybkie serie narzędzi: upewnij się, że odznaka nie migocze (karencja TTL dla wyników narzędzi).
- Wiersz stanu pojawia się ponownie, gdy wszystkie sesje są bezczynne.