Operaterska pozornost — ali ta agent potrebuje mene zdaj?
← kazalo
Kaj je to
Nadzorna hrbtenica Glasspana odgovarja na vprašanje _"v kakšnem stanju je ta
agent?"_. Pozornost je plast nad njo, ki odgovarja na vprašanje, ki si ga
operater dejansko zastavi najprej: _"ali katerikoli agent potrebuje mene
zdaj?"_ Je izpeljan pogled nad avtomatom stanj in terminalom,prikazan v TUI in podprt z robno sproženimi opozorili — ne šesto stanje, ne
nov podsistem.
Odločitve
Pozornost je pogled, ne stanje
AgentState ostaja majhen (Idle, Working, Blocked, Done, Error).
"Potrebuje operaterja" je prost predikat nad njim, ne dodatna različica:
fn needs_attention(pane: &Pane) -> bool {
pane.state == AgentState::Error
|| pane.state == AgentState::Blocked
|| pane.stalled
}
Blocked je vključen, ker dokumentacijski komentar avtomata stanj pravi, da
pomeni "čaka na usmerjanje / odobritev / vnos" — tj. agent je parkiran na
operaterju. En predikat, ki ga uporabljajo pozornostna vrstica, filter in
tipke za skok, zato se definicija spremeni na enem mestu.
stalled je tudi sam izpeljan — podokno je stalled, ko v
DEFAULT_STALL_AFTER (4 ure) ni prispel noben dogodek. Namenoma je redek:
pozornost so večinoma podokna v stanju Error in Blocked; Stalled je stopnjevanje
"nekaj je globoko narobe", ne pogost pojav.
→ crates/colibri-glasspane/src/lib.rs
(AgentState, SupervisedPane::is_stalled_at, DEFAULT_STALL_AFTER)
TUI naredi pozornost nemogoče spregledati
Ko katerokoli podokno v trenutnem pogledu potrebuje pozornost, se običajna
glava zamenja z rdeče obrobljeno pozornostno vrstico, ki navaja zadevna
podokna. Vrstice, ki potrebujejo pozornost, dobijo obrnjeno ozadje; kazalka se
obrne znova, da operater še vedno vidi, katera je izbrana. Dve tipki za skok
(n / N) krožita naprej/nazaj skozi pozornostna podokna z ovijanjem, a
pa preklaplja filter samo za pozornost. Vsi trije delujejo nad že filtriranim
naborom podoken.
Sestavljanje filtrov je IN. Pozornostni filter se sestavlja s filtromseje, zato vrstica odraža samo tisto, kar operater gleda. Junija 2026 je bil
dostavljen hrošč, kjer je bil has_attention izračunan iz _nefiltriranega_
posnetka: napaka v seji s2 je prižgala vrstico med gledanjem seje s1,
lastni filtered_panes() vrstice pa je nato zgodaj vrnil prazen izris —
operater je tako izgubil glavo zaradi praznega rdečega okvirja. Popravljeno z
izračunom pozornosti iz filtered_panes(); pokrito s preskusom upodabljanja
med sejami.
PastNO_COLOR. Seje Hermesa puščajo NO_COLOR=1 v okolja podprocesov
in crossterm to konvencijo upošteva. Brez force_color_output(true) ob zagonu
se colibri-tui, zagnan iz seje Hermesa, upodablja brez barv — rdeča
pozornostna vrstica postane nevidna. Funkcija main() vsili barve ne glede na
starševsko okolje; to je nadzorna plošča TUI, barve so nosilne.
Prihodnja izboljšava: prikaz pozornostne vrstice in glave hkrati (dvojni
pogled) namesto zamenjave ene z drugo, da operater na en pogled vidi število
podoken in pozornostna podokna, brez preklapljanja.
→ crates/colibri-glasspane-tui/src/main.rs
(needs_attention, render_attention_bar, attention_indices)
Zajem terminala je dopolnilni signal
Avtomat stanj je _"kar agent pove"_ (strukturirani dogodki JSONL). Zajem
terminala je _"kar prikazuje zaslon"_ — dejansko besedilo podokna, razvrščeno
po znanih okvarjenih vzorcih. Podokno je lahko Working, medtem ko njegov
zaslon kaže Active: failed (Result: exit-code). Pozornost je pogled nad
TerminalRecorder hrani omejeno zgodovino okvirjev (DEFAULT_HISTORY_CAPACITY
= 256 okvirjev). Identiteta okvirja je SHA-256 očiščenega besedila, zato
se poizvedovanje skoraj statičnega podokna vsako sekundo strne v zgoščen
dnevnik dejanskih prehodov stanja namesto tisočev podvojenih okvirjev.
capture_tmux_pane za zajem pokliče tmux, toda observe() sprejme surovo
besedilo neposredno — logika razpoznavanja in triaže je v celoti preizkusljiva
brez priključenega terminala.
→ crates/colibri-glasspane/src/terminal.rs
(TerminalRecorder, Observation, capture_tmux_pane)
Triaža prepoznav, podatkovno gnana po OS
SignatureSet pregleda očiščeno besedilo terminala in razvrsti zaslon v
failures / warnings / info / healthy (Severity::{Error, Warn, Info, Ok}).
Vzorci se ujemajo kot podnizi brez razlikovanja velikosti črk; prvi zadetek
zabeleži prepoznavo in ni poročan dvakrat. Vsak zadetek nosi človeški
next_action in neobvezni invoke (veščino, ki jo agent lahko zažene za
odpravo) — zadetek ni "nekaj se je zgodilo", ampak "tukaj je, kaj to pomeni
in kaj storiti".
Mehanizem zaznavanja je podatkovno gnan: gostitelj FreeBSD in gostitelj
Linux naložita različne nabore Signature, a si delita isti ujemalnik.
SignatureSet::linux_default prinaša majhen začetni nabor; klicatelji
zgradijo svojega z SignatureSet::new. To je gumb na OS, na katerega se
opira Colibrjevo usmerjanje po zmožnostih.
→ crates/colibri-glasspane/src/signatures.rs
(SignatureSet, Severity, Signature, Detection::alertable)
Opozorila so robno sprožena, ne nivojsko
Prepoznava napake/opozorila se sporoči samo ob okvirju, kjer se prvič
pojavi, ne ob vsakem naslednjem okvirju, ki jo še prikazuje — vrnjeno kot
Observation::Recorded { uuid, new_alerts } samo z novimi sproženimi
zadetki. Ko se stanje počisti in pozneje ponovi, se sproži znova. Nivojsko
sprožena opozorila ob 1s poizvedovanju bi ponovno obveščala vsako sekundo za
čas trajanja zataknjenega podokna; robno sproženje pomeni, da vsako opozorilo
pomeni "to se je pravkar začelo".
→ crates/colibri-glasspane/src/terminal.rs
(TerminalRecorder::observe, Observation::new_alerts)
Kaj je še odprto
- Izhodno potiskanje. Pozornost je prikazana na zaslonu (vrstica,
gledanjem TUI. Potiskanje pozornosti navzven — namizno obvestilo na živi
sliki in sporočilo Telegram — je najpomembnejši nedokončan kos. Žeton je že
pripravljen; prenos (colibri notify proti dogodku glasspane, ki ga sproži
kljuka harnessa) je neodločen.
- Odgovarjanje blokiranemu agentu z nadzorne plošče. API posnetkov je
vtičnice demona) bi operaterju omogočila, da se odzove na Blocked podokno
iz TUI. Spremeni vtičnico iz nadzora v interaktivno upravljanje — lasten
načrtovalski prehod.