Skip to content

feat(a2ui)!: migrate to A2UI v0.9.1 stable wire format - #817

Merged
blove merged 15 commits into
mainfrom
blove/a2ui-v09-phase1
Aug 17, 2026
Merged

feat(a2ui)!: migrate to A2UI v0.9.1 stable wire format#817
blove merged 15 commits into
mainfrom
blove/a2ui-v09-phase1

Conversation

@blove

@blove blove commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Summary

Migrates every A2UI touchpoint from the legacy wire shape (beginRendering/surfaceUpdate/dataModelUpdate, type-keyed component wrappers, literalString wrappers, children.explicitList) — now classified upstream as the deprecated v0.8-legacy lineage — to the A2UI v0.9.1 stable release. Clean cutover, no legacy acceptance. Phase 1 of 4; design in docs/superpowers/specs/2026-08-17-a2ui-v09-stable-migration-design.md, plan in docs/superpowers/plans/2026-08-17-a2ui-v09-phase1-cutover.md.

  • @threadplane/a2ui: v0.9 envelopes (createSurface/updateComponents/updateDataModel/deleteSurface, each with version: "v0.9"), flat components, bare-literal + {path} + typed {call} dynamic values, event/functionCall actions, checks types, client→agent action/error/capabilities messages, A2UI_MIME_TYPE/A2UI_BASIC_CATALOG_ID constants. Parser skips unknown envelope keys (v1.0 forward-compat). deleteByPointer implements the v0.9 array-delete rule. Types verified against the official machine-readable schemas (server_to_client.json, basic-catalog.json, common_types.json).
  • @threadplane/chat: surface store re-gated on createSurface + root component (progressive rendering per spec) with incremental component merge and path/value/delete data-model semantics; surface-to-spec consumes flat components; partial-args bridge synthesizes a missing createSurface (replacing beginRendering synthesis); all 18 catalog components re-propped to spec enums; MultipleChoiceChoicePicker (variant/displayStyle/filterable); action messages are v0.9-shaped with plain-object context; theme flows from createSurface.theme.
  • Python emitters: both example apps' schema prompt (a2ui_v09.py), envelope tool/normalizer, and graph ordering (createSurface-first + synthesis); cockpit aviation graphs' structured-output specs + prompts; deployments/ag-ui-dev copy byte-identical.
  • Fixtures/docs: all 6 e2e fixtures regenerated (cockpit ones round-trip-validated against the new pydantic models); 13+ website MDX pages, READMEs, cockpit prompt docs, api-docs regenerated.

Follow-up phases (separate PRs): client-side functions, validation checks, sendDataModel round-trip.

Verification

  • libs/a2ui 59 unit tests; libs/chat 1126 unit tests; both libs build + lint clean; native-ESM import check of the built a2ui dist passes
  • Python: examples/chat 56 passed, examples/ag-ui 23 passed; cockpit graphs 10-part envelope smoke passed in both venvs
  • E2E (aimock): examples-chat a2ui + contact-form ✅, examples-ag-ui twins ✅, cockpit-chat-a2ui ✅, cockpit-ag-ui-a2ui ✅
  • Prod builds: examples-chat, examples-ag-ui, website ✅
  • nx affected -t lint test build: green except two pre-existing worktree-environment failures in untouched projects (cockpit-telemetry:lint posthog-js specifier vs local install; cockpit:build Turbopack workspace-root inference) — zero diff vs main in both projects
  • Live Chrome smoke (real gpt-5-mini, langgraph dev): prompted the canonical demo's A2UI mode; the sub-LLM emitted v0.9 envelopes, the contact-form surface rendered progressively, and clicking Send produced the spec client action on the wire: {"version":"v0.9","action":{"name":"send_contact_form","surfaceId":"contact-form-surface","sourceComponentId":"sendButton","timestamp":"…","context":{…},"label":"Send"}} (verified via thread state), with the agent responding to it.

🤖 Generated with Claude Code

blove and others added 14 commits August 17, 2026 07:46
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… API

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ath/value data model

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…actions

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… action context, envelope sniffers

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… enums

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…elope tool, ordering

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…generated

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…g props

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated approval: this PR received an intelligent (AI) code review. See the review comments on this PR.

…sarial input

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
threadplane Ready Ready Preview Aug 17, 2026 4:24pm

Request Review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant