Agent-First UI v0.2.0: One Space, Many Views
v0.2.0 reworks the protocol from a single surface a tool draws into a shared live space that each participant sees as their own projection. Owners are self-generated ids, capabilities and facts project per-participant, whispers reach one viewer, and a separate advisory view-hint layer suggests layout without ever running code.
Agent-First UI v0.1.0 split an interface into two halves: a tool describes what it has as plain data, and a host you trust renders it. Nothing the tool sends can run on your machine, because the surface is JSON with nothing in it to execute. That split holds. v0.2.0 changes what sits on the tool’s side of it.
The v0.1.0 model was one surface a tool draws for one viewer. But the live things worth operating — an incident, a deploy, a shared workspace — usually have several parties on them at once: you, your agents, a teammate, a couple of tools. v0.2.0 makes that the shape of the protocol.
A space, not a screen
A producer no longer publishes a screen. It publishes facts and capabilities into a shared live space, and each participant sees their own projection of it.
Projection is the core idea. What you see is scoped to what you’re allowed to see — a read-scope that is the dual of ownership. Two agents and a human can be in the same space and each get a different, correct view: the same underlying facts, projected through each participant’s audience. The producer doesn’t assemble one tree and broadcast it; it states what is true, and the space projects that per participant. Capabilities project the same way — a control that exists for you may simply not be in another participant’s projection.
This also removed a whole category from the spec. There is no relay or transport model anymore — the space is defined by what each participant can see and do, not by how bytes move between them. That’s a layer below, and out of scope on purpose.
Owners are ids you generate
For several parties to share a space safely, each needs a stable identity that no one else can claim. v0.2.0 makes an owner a self-generated opaque id. A participant joins with an id; if that id is already present, the join is rejected. A section’s key is its owner id — identity isn’t a field you look up, it’s the address itself.
The old display_name is now an advisory name fact: a label a host may show, never something load-bearing. Authenticity — proving an id is who it claims, keys, signing — is deliberately pushed up to a higher layer. The protocol gives you stable, collision-rejecting ids and a clean place for a trust layer to sit on top, without baking one in.
Whispers
Because the space projects per participant, it can also carry something aimed at exactly one of them. A whisper is a projection scoped to a single viewer — a prompt, a hint, a private status that reaches one participant and no one else. It falls out of the projection model naturally: a whisper is just an audience of one.
View hints, kept honest
Producers often do know something about how their surface should read — what matters most, what groups together, what genre of thing this is. v0.2.0 gives that a home without letting it become code.
View hints are a separate, advisory layer with its own spec and JSON schema. A producer can suggest salience, layout grouping, and a surface genre profile; a host is free to use them, adapt them, or ignore them entirely. They are never the wire format and never load-bearing — a conforming host renders a correct interface from the protocol alone, with hints as suggestions on top. Keeping them in a distinct document (and behind a distinct schema) is what stops “hint” from quietly turning into “layout engine the tool ships to you.”
An afui-customize skill ships alongside, for authoring those hint profiles.
SDK and spec
The Rust SDK was restructured to match. Hosts merge into a single host crate, composition moves into the SDK, and there are new request, profile, projection, and unit-profile helpers — with validation narrowed to protocol structure and composed section names made separator-safe. The SDK now builds its documents on Agent-First Data builders.
The specification was split to match the model: a normative protocol.md for the space, projections, ownership, and events, and a separate view-hint.md for the advisory layer — each with its own JSON schema, and refreshed conformance fixtures built around a worked operator console.
cargo add agent-first-ui
The interface is still yours — the host renders, redacts, and gates. What v0.2.0 adds is that a space can be shared: many participants, each with their own honest view of the same true thing, and no one reaching past the data into anyone else’s.