The live stream sends each event's key-values as a JMAP map ({"0": …}),
not an array. The live page cast it straight to an array, so Explain
threw on every live event, and the timeline never showed an event's
details. Live events now go through the same normalizing as stored
traces, moved to features/tracing/normalize.ts.
Also adds the modification notice to four upstream files this branch
changed.
An Explain button sits beside four kinds of thing that are hard to read:
a queued message's failed recipients (in a small card above the queue
form), the Classify verdict on Actions, each Logs row and trace event
(stored and live), and each settings field. It opens a panel with the
local model's short reading, labeled as the model's and not as fact,
with copy, cancel and a clear message when the model is busy, paused
or over the hourly limit.
The button appears only when the session's aiExplain flag says the
server can answer: a superuser, a configured chat model, and
explanations switched on. The Local AI page gains an Explanations card
for that switch, the model to use, the hourly count per administrator
and the longest wait.
Needs a server with inbuxa:Explanation/set (sysAiExplain); on older
servers the flag is absent and nothing changes.