Chat stream
A character as the status line of a conversation.
See it
A transcript row driven from facts: the row publishes what it knows through facts, the turn's end is an explicit hold with a time to live, and a click on the character pokes it. Below it, a group row cycles through its members.
surface defaults to chat on an ActivityMark, which is why the fourth step shows composing: the same facts read on an avatar surface stay idle, because twenty avatars flicking between two faces every few hundred milliseconds is noise rather than information.
When to use it
The line under the last message that says what the agent is doing right now. The character replaces "Thinking…" and a spinner: searching does not look like writing, and the verb comes from the same table as the animation, so the words and the face cannot disagree.
Components
ActivityMark— one agent, one row: the character and the verb.activityMode="facts"reads the shared registry instead of a tool name.GroupActivityMark— several agents taking turns in one slot, so a group does not become a wall of characters.ActivityTicker— the verb, swapped rather than rewritten, so the row keeps its height.MarkStageProvider— one engine per distinct appearance, and the home of the command registry.useMarkCommands—holdFacts,holdStateandpoke, so the roster and the transcript talk about the same agent.HudPlate— when a turn has a known length (the third of five tool calls), the figure beside the character, where it can be read and announced.
How the states move
spawning is played by useSpawnEntrance the first time an agent appears in a session and never again — a row that scrolls out and back did not arrive twice. The engine settles it to idle after STATE_SETTLE_TO.spawning.afterMs (2 s), so the host does not keep a timer.
celebrate and alerting are events, not conditions: protocol ids 33 and 34 are one-shot. Hold them with a ttlMs so a row cannot stay celebrating after the reply has landed.
What each state looks like
| State | Eyes | Mouth | Effect | Id | HUD | |
|---|---|---|---|---|---|---|
thinkingThinking | dotLook → dotUp → dotLook | flat | dots | 30 | context | |
searchingSearching | dotLeft → dotRight → dotUp → dot | dot | — | 40 | — | |
workingWorking | dotDown → dot → dotDown | none | arc | 1632 | gauge | |
composingComposing | dotDown → dot | cat | — | 39 | — | |
celebrateCelebrating | star → archWide → wink → arch | grin | sparkle | 2533 | kpi | |
alertingAlerting | dotWide → dot | o | bang | 34 | — |
Two of these hand their body to a belt: thinking to the three travelling beads of dots, alerting to the bang glyph. The rest animate as a whole body, and composing also pulses its mouth in line-face mode.
Next
- ActivityMark — what a tool call looks like
- ActivityTicker — a line of rolling verbs
- AgentStateProvider — arbitrating sessions into one face