fix: close AG-UI audit gaps F1–F4 + F6 (composer clear, light scheme, graceful stop, json-render values, markdown tracking)#663
Merged
Merged
Conversation
… gap is the error banner Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…page chrome (F2) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ngModel does not write a programmatic clear back to the view under zoneless + OnPush, so sent text stayed in the composer. Bind [value]/(input) directly and drop FormsModule. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… (review) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
abortRun() makes the AG-UI client report onRunFailed('BodyStreamBuffer
was aborted'), which rendered a red error banner for a user-initiated
stop. Track abort intent and settle the store as idle instead.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Re-parsed markdown produces new child objects every stream delta; identity tracking re-created the DOM subtree per chunk (NG0956). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The json-render schema prompt (examples/*/python/src/schemas/json_render.py)
documents state-bound props as { statePath: "/path" } with spec.state as
the initial value model, but @json-render/core only resolves $state/
$bindState expressions — the raw object fell through to the a2ui catalog
components and interpolated as the literal string "[object Object]"
(KPI Text values, Slider labels, TextField values, Overview metrics).
chat-generative-ui now (a) normalizes { statePath: p } props to the
engine-native { $bindState: p } plus a _bindings map (mirroring what
surfaceToSpec does for A2UI path refs, so user input writes back), and
(b) seeds spec.state into the provided store — the chat composition's
shared store starts empty and render-spec only self-seeds when no store
input is given. User-modified paths are never clobbered on spec re-emits.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ing (review) Passing the conversation-wide internal store into every generative-ui surface made same-key dashboards collide across messages (regenerate, multi-dashboard, thread switch). Match a2ui isolation: only an explicit consumer store is shared; otherwise render-spec self-seeds per instance. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mposition isolation (review) The store-isolation fix means backend-state sync reaches json-render surfaces only via an explicit consumer store; the two cockpit dashboard capabilities want exactly those shared live semantics, so they now opt in. Adds a composition-level test pinning the isolation binding. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chat-input no longer uses ngModel (F1); dependency-checks lint flagged the stale peer. Consumer-visible: @threadplane/chat no longer requires @angular/forms. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The AG-UI client surfaces a user abort through the event stream as RUN_ERROR in addition to onRunFailed; the event path bypassed the graceful-stop guard, so the error banner still appeared in live smoke. Introduces an abortSettled flag alongside abortRequested: the first delivery (event or onRunFailed) settles the store as idle and sets abortSettled; any subsequent delivery for the same abort is swallowed by settleIfAborted() without re-touching the store. Both flags are reset together at the top of submit() so the next run starts clean and genuine failures after a previous stop are never suppressed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ls logged Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… defensively (review) stop -> regenerate -> stop left the store wedged in streaming because regenerate never reset the abort flags and the duplicate-delivery guard returned without settling. Also documents the json-render store-isolation change in the chat CHANGELOG and fixes the README peer table. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-Authored-By: Claude Fable 5 <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.
Phase 3 of the AG-UI demo toolbar campaign — closes the in-scope gaps from the Phase 2 capability audit (
docs/superpowers/specs/2026-06-11-ag-ui-capability-findings.md, plan indocs/superpowers/plans/2026-06-11-ag-ui-gap-closure-p3.md). Each fix landed TDD-first with two-stage review, and the whole branch was re-verified in a live Chrome smoke against a real OpenAI backend.Fixes
@threadplane/chat):chat-inputnow binds[value]/(input)directly; NgModel never wrote the programmatic clear back to the view under zoneless + OnPush (reproduced on the production canonical demo). FormsModule dropped;@angular/formspeer dependency removed (CHANGELOG'd).name="messageText"preserved for cockpit selectors. New unit +pressSequentiallye2e regressions.data-color-schemeand index.html gained the canonical pre-bootstrap script; e2e-pinned.@threadplane/ag-ui): user aborts settle as graceful cancellation on both delivery paths —onRunFailedand the synthesizedRUN_ERRORevent (the second path was caught only by the live smoke). Also fixes a stop→regenerate→stop sequence that wedged the loading state (flags now reset inregenerate()too).[object Object]values (shared, also reproduced on prod): the schema documents{statePath}bindings but only the A2UI path translated them;chat-generative-uinow normalizes them to the$bindStatedialect +_bindingsand seeds spec state. Consumer-visible semantics change (CHANGELOG'd): json-render surfaces are store-isolated per instance — pass an explicit[store]for backend-state-driven or shared dashboards (both cockpit dashboard capabilities now do;chat-tool-viewskeeps the previous shared-store behavior). Composition-level test pins the isolation.@threadplane/chat): markdown children/table rows track by$index(re-parsed nodes are new objects every delta). Residual warnings during json-render spec assembly are logged as follow-up in the findings doc.Verification
nx run-many -t lint,test,build -p chat,ag-ui,rendergreen (chat 845+, ag-ui 30 incl. new wedge/abort tests)nx build examples-ag-ui-angular+ full ag-ui e2e green (18 specs incl. 2 new regressions); cockpit json-render e2e green (restored STATE_SNAPSHOT KPI assertion)Follow-ups (logged in the findings doc): F5 subagent card over AG-UI (Phase 4 design), residual NG0956 in spec assembly, a2ui icon catalog support.
🤖 Generated with Claude Code