Merged
Conversation
Update devcontainer image and CI matrix to include latest Elixir 1.19 / OTP 28, replacing the 1.16 / OTP 27 row. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add push_data/3, push_surface/2, broadcast/3, broadcast_all/2 to A2UI.Server for broadcasting updates to connected clients from external processes (timers, PubSub, GenServer casts). - A2UI.Supervisor: OTP Supervisor (Registry + Bandit, rest_for_one) - A2UI.SurfaceProvider: optional handle_info/2 callback - A2UI.Socket: Registry registration, handle_info delegation - Demo server: timer-based uptime push example - 95 tests Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Research gap analysis of ex_a2ui (v0.8) vs A2UI spec (v0.9). Roadmap updated with migration plan through v0.6.0. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate encoder/decoder to A2UI spec v0.9 wire format. This is a breaking change to the JSON output and decoder return types. Wire format: messages renamed (updateComponents, updateDataModel, createSurface, action), all messages versioned and array-wrapped, component properties at top level, literal values plain (no wrapper), action uses event envelope with metadata. Types: added :audio_player, renamed :multiple_choice → :choice_picker (18 standard types). Surface gained catalog_id field. 100 tests. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
surfaceUpdate→updateComponents,dataModelUpdate→updateDataModel,beginRendering→createSurface,userAction→action(with event envelope)"version": "v0.9"and are wrapped in JSON arrays:audio_playertype, renamed:multiple_choice→:choice_picker(18 standard types)encode_surface/1now returns singleString.t()(JSON array) instead of[String.t()]{:ok, [{:action, action, metadata}]}with extracted envelope metadataBreaking Changes
Encoder.surface_update/1Encoder.update_components/1Encoder.data_model_update/2Encoder.update_data_model/2Encoder.begin_rendering/2,3Encoder.create_surface/1encode_surface/1→[String.t()]encode_surface/1→String.t(){:ok, {:user_action, action}}{:ok, [{:action, action, metadata}]}{"literalString": "hi"}"hi"{"component": {"Text": {...}}}{"component": "Text", ...}:multiple_choice:choice_pickerTest plan
mix cipasses (format + compile + 100 tests)mix run demo_server.exs— verify debug renderer at localhost:4000🤖 Generated with Claude Code