Skip to content

Releases: agentfirstkit/agent-first-ui

v0.5.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 23 Aug 05:37
  • Replace the raw session channel with a typed runtime — retained latest-value state, one call handle carrying progress, result, error and cancellation, ordered events with a bounded replay window, and managed byte bodies — so a page has one entry point in afui.connect() instead of a private SSE route, sequence field and reconnect flag per Provider
  • Add a page kernel a Provider concatenates ahead of its own runtime: session-root derivation, correlated request/reply, reconnect-aware streams that distinguish open from resumed, status line, in-flight disabling, debounced save, hash survival, unload guard and visibility-gated polling
  • Add afui.place and afui.frame so a record opened over a list is a place a person leaves with the back gesture or Escape, and a framed page feeds one title and status up to the card head instead of stacking a second header under it
  • Add UiSurface, UiPageBuilder declaration checks, UiDecisionRuntime and UiPagePolicy so a decide page's markup contract, its generated runtime and its Content-Security-Policy are composed from one closed set of switches rather than hand-written per Provider
  • Add page_routes, page_asset_routes and UiBlobPolicy so a page's stylesheet, an override's assets and any bytes a session hands a browser go through one caller-supplied media allowlist and size bound, with link-refusing reads and a 404 for every refusal
  • Unify managed and upstream delivery: UiDeliveryPlan::mode() and facts() return the resolved delivery and its five fields once, Outcome::ending() gives completed/closed/expired one spelling, and link is refused while the plan is built rather than when delivery starts
  • Split the delivery word list into a featureless mode tier below session and add UiDeliveryOffer, so the --mode flag a command declares and the plan it resolves come from one value and a build without a window still declares the same flags
  • Publish the link URL as link_url on the one event whose job is handing it to a person, instead of a redacted link_url_secret each Provider had to reveal for itself
  • Add UiMount::external_access and UiCredentialLease so a long-lived listener issues, renews and revokes access to the same UI through AFUI's own dispatch — Host and Origin checks, reserved prefix and __afui/end included — instead of reimplementing credential routing
  • Replace Error::kind()'s &'static str with the closed UiErrorKind and move every recovery action out of Display into Error::hint(), so a consumer matches exhaustively and a safe-mode hint is never offered for a built-in page an override could not have broken
  • Add a test-support feature carrying AFUI's own trust fingerprint, a stub browser, an attention-policy writer, a registry waiter and a client for the session runtime, so a consumer's tests stop reimplementing them and drifting when AFUI changes
  • Serve the frontend files that the fingerprint covered from one snapshot taken at resolve, and refuse a symlink anywhere under the directory, so a running session serves exactly the bytes trust was decided over
  • Give a session one irreversible outcome slot, so close, expiry and window-close can no longer report that a person walked away from an answer that had just arrived, and a retained completion cannot win after a terminal
  • Answer a lapsed page's own credential with 410 Gone and three sentences saying the address was right and a new URL is one session serve away, while every other caller still gets the byte-identical 404
  • Ship a baseline stylesheet at AFUI's own reserved route, report page contract failures all at once, hand templates the reserved routes as a protected afui global instead of a literal copied into five spores, and leave something openable behind frontend init
  • Upgrade Agent-First Data to 0.34.0 and Agent-First Slug to 0.7.1

v0.4.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 12 Aug 19:10
  • Add an optional bounded full-duplex session channel carrying Provider-defined JSON in both directions, with no envelope, request ids, or retained history
  • Add UiPage and a page feature so turning a frontend's files into a checked page is one assembly rather than one per Provider
  • Collapse window, link and session delivery into one call with an environment default, and offer link only when a Provider declares its expiry
  • Reserve the __afui/ prefix and let any delivery be ended through __afui/end, including a served page that nobody is attending
  • Make the served session list a replaceable frontend whose every card action reports pending, done, or failed

v0.3.1

Choose a tag to compare

@agentfirstkit agentfirstkit released this 07 Aug 09:15
  • Rewrite the README, skill file and source documentation so the library argues its design from the shape of the problem rather than from named consumer programs, which a reader who installs this crate on its own does not have and cannot check
  • Stop the served session page reserving a position for any kind of session: every session is a card in one column in the order the listener reported, each with the same slice of the viewport, and the person folds or drops what they are not using
  • Widen the served page's column on a large screen rather than splitting it into two panes, since a second column would require deciding which sessions belong in it
  • Rename example and fixture identifiers, and the proxy's handoff cookie, to neutral names so nothing in the published crate reads as a registry of real consumers

v0.3.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 07 Aug 08:39
  • Replace the retired view-hint protocol and JSON schemas with a UI session library: a Provider brings an Axum Router and AFUI owns delivery — access credential, expiry, security headers, isolated window, cleanup — returning a typed Completed(T)/Closed/Expired outcome and never touching a domain value
  • Move expiry from the session to the delivery, so a window bounds itself and never expires while a shared URL must name a UiExpiry::After lifetime or a sliding UiExpiry::Idle
  • Separate sessions from ports via UiHost and UiMount, so many sessions share one listener routed by credential and a Provider can nest session routing into an Axum router it already owns
  • Announce every active session to a per-user registry so afui session list answers what is waiting for you across processes, with liveness probed by asking the host rather than checking a pid, and the credential never printed
  • Add afui session serve, a feature-gated page that reverse-proxies every live session on the machine so a phone or another device can reach interfaces bound to loopback
  • Add a frontend override capability with a single strict markup guard shared by all Providers, in a dependency tier that does not require axum
  • Fix the advertised session URL 404ing by stripping the credential before routing, so the trailing-slash URL that makes relative page assets resolve is actually served and the constant-time credential compare runs
  • Open the isolated Chromium window with --app= instead of --new-window, add a CSP nonce so a Provider can serve inline scripts, and stop advertising the bind address so a LAN session no longer publishes 0.0.0.0
  • Flatten the crate from rust/ to the spore root, add the spore's skill, and rewrite the README lead around what the spore does for an agent
  • Improve the served session page on mobile and give an unknown session a proper not-found page
  • Upgrade the agent-first-data dependency to 0.32.0

v0.2.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 14 Jul 08:17
  • Redesign the protocol around a shared live space with per-participant projections: each participant sees their own projection scoped by audience/read-scope (the dual of ownership) instead of one global broadcast tree, and capabilities project per-participant
  • Rework owner identity to self-generated opaque ids with join-time duplicate rejection, make a section's key its owner id, and replace display_name with an advisory name fact while deferring authenticity and signing to a higher layer
  • Add whisper projections scoped to a single viewer and viewer interaction intents with input bindings, and drop the undoable concept
  • Introduce a separate advisory view-hint profile layer with its own spec and JSON schema (salience, layout grouping, surface genre profile) that hosts may use or ignore and that is never the wire format or load-bearing
  • Restructure the Rust SDK: merge hosts into a single host crate, move composition into the SDK, and add request, profile, projection, and unit-profile helpers
  • Narrow validation to protocol structure and make composed section names separator-safe
  • Split and rewrite the specification into a normative protocol.md plus a separate view-hint.md, each with its own JSON schema, and refresh conformance fixtures around a worked operator console
  • Migrate the SDK to build documents on Agent-First Data builders
  • Add an afui-customize skill for authoring view-hint profiles

v0.1.0

Choose a tag to compare

@agentfirstkit agentfirstkit released this 16 Jun 12:30
  • Initial release of the Agent-First UI protocol: producers describe current state and the actions available on it as plain data, and a user-owned trusted host renderer draws the interface and reports user intent back — no producer-supplied UI code runs
  • Provide the canonical, serde-serializable Rust type definitions for the protocol (state surfaces, actions, intents) so any producer or host renderer interoperates against one shared schema