You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Hey! I've kicked off an automated agent in my local workspace to explore this and prepare a draft PR/fix. I'll review whatever it comes up with before submitting it for team review.
I audited the repository at c69ed0dc5 to find every internal and external consumer of @a2ui/react's v0.8 code before making any edits.
Audit of v0.8 dependencies
Shared v0.9 and v1.0 runtime in typescript/renderers/react/src/ (no v0.8 dependencies).
None of the shared runtime files (src/index.ts, src/v0_9/index.ts, A2uiSurface.tsx, adapter.tsx, node-view.tsx, host_registry.ts, markdown-context.tsx, markdown_hosts.tsx, react_component_implementation.ts, use_sync_external_store.ts, web_component_node.tsx, and src/catalog/*) import anything from src/v0_8/, src/styles/, or src/types.ts. All shared and ./v0_9 code paths can stay completely untouched.
Legacy secondary entry point @a2ui/react/styles and orphan src/types.ts. src/styles/index.ts is export * from '../v0_8/styles/index', which injects Light DOM CSS rules (.a2ui-surface .a2ui-*) replicating Lit v0.8 styles for the v0.8 React components. Nothing in v0.9 or v1.0 uses it because the shared basic catalogs render Shadow DOM Custom Elements from @a2ui/web_core. Likewise, src/types.ts is export * from './v0_8/types' and has zero importers anywhere in the repository.
Package-only dependencies used exclusively by src/v0_8/.
In typescript/renderers/react/package.json, clsx (imported only in src/v0_8/lib/utils.ts) and markdown-it + @types/markdown-it (imported only in src/v0_8/components/content/Text.tsx) are used only by v0.8. @a2ui/markdown-it is also listed in @a2ui/react's dependencies, even though @a2ui/react never imports it (a2ui_explorer and samples/client/react/shell declare their own @a2ui/markdown-it dependencies).
Visual parity workspace (typescript/renderers/react/visual-parity, @a2ui/visual-parity).
This standalone workspace (visual-parity/package.json) is a manual Playwright pixel-diff suite comparing @a2ui/react/v0_8 + @a2ui/react/styles against @a2ui/lit's v0.8 components (visual-parity/react/src/main.tsx, FixturePage.tsx). It is not run in CI (build and test are no-ops).
React Explorer (typescript/renderers/react/a2ui_explorer, @a2ui/react-explorer).
Already uses @a2ui/react and @a2ui/react/v0_9 exclusively (supporting v0.9 and v1.0). Its only v0.8 references are unused bundler aliases for @a2ui/react/v0_8 and @a2ui/react/styles in karma.conf.cjs and vite.config.ts.
Sample apps (samples/).
samples/client/react/shell (@a2ui/react-shell, tested in ci-samples): Already migrated to @a2ui/react/v0_9 and @a2ui/web_core/v0_9! Its only v0.8 references are dead code left behind from that migration: an unimported 436-line src/theme/default-theme.ts and an unused theme?: Theme property in src/configs/types.ts.
Composer tool (tools/composer, widget-builder, built and tested in ci-tools).
This is the only runtime consumer of @a2ui/react/v0_8 outside typescript/renderers/react:
tools/composer/src/lib/a2ui.tsx imports A2UIViewer from @a2ui/react/v0_8. When specVersion === '0.9' it renders V09Viewer (which uses @a2ui/react/v0_9); when specVersion === '0.8' (or omitted) it renders BaseA2UIViewer from @a2ui/react/v0_8 with viewerTheme.
Composer already has v0.9 counterparts for its gallery (V09_GALLERY_WIDGETS), component docs (COMPONENTS_DATA_V09), CopilotKit prompt (a2ui-prompt-v09.ts), and default version (DEFAULT_VERSION = '0.9' in spec-version-context.tsx). However, it still exposes a v0.8 / v0.9 toggle in version-selector.tsx, and /theater plays 4 curated v0.8 scenario JSON streams through useA2UISurface into <A2UIViewer />.
Decisions to confirm before implementation
How should we handle tools/composer?
Option 1A (recommended, minimal scope in tools/composer) keeps changes confined to its adapter boundary (tools/composer/src/lib/a2ui.tsx). Replace the @a2ui/react/v0_8BaseA2UIViewer import with a small v0.8-to-v0.9 component normalizer ({id, component: {Type: props}} to v0.9 component shape, converting explicitList/template, literalString/literalNumber/literalBoolean, usageHint to variant, and MultipleChoice to ChoicePicker) and render all widgets and /theater surfaces through V09Viewer (@a2ui/react/v0_9), deleting unused viewerTheme.ts. This keeps the PR focused on @a2ui/react without unrelated UI churn in tools/composer.
Option 1B removes v0.8 mode across tools/composer (either here or in a stacked prerequisite PR): narrow SpecVersion to '0.9', remove VersionSelector, a2ui-prompt-v08.ts, COMPONENTS_DATA, V08_GALLERY_WIDGETS in sync-gallery.mjs, viewerTheme.ts, and transpileToV0_8, and convert the 4 /theater scenario JSONs (or useA2UISurface) to v0.9.
Option 2B deletes samples/client/react/shell outright in this PR (and updates root package.json, samples/README.md, and samples/agent/node/restaurant_finder/README.md).
Confirm deleting ./styles (@a2ui/react/styles) and visual-parity/ alongside ./v0_8?
Both exist solely for the v0.8 Light DOM components. Removing ./styles lets us delete src/styles/, scripts/postbuild.mjs, and the second tsup build target.
Exact planned changes (assuming Options 1A, 2A, and 3)
Delete v0.8 source, styles, visual-parity suite, and v0.8 tests in typescript/renderers/react/:
Delete typescript/renderers/react/visual-parity/ (38 files) and update yarn.lock.
Update @a2ui/react package, build, lint, and test configs (leaving all shared src/*.ts(x) and src/v0_9/index.ts files untouched):
typescript/renderers/react/package.json: Remove "./v0_8" and "./styles" from exports; remove clsx, markdown-it, and @a2ui/markdown-it from dependencies and @types/markdown-it from devDependencies; change wireit.build.command from "tsup && node scripts/postbuild.mjs" to "tsup" and remove "../markdown-it:build" from wireit.build.dependencies.
typescript/renderers/react/eslint.config.mjs: Remove src/v0_8/** and visual-parity/** patterns (keeping eslint.boundary.mjs untouched so scripts/adapter_boundary_allowlist.test.mjs continues to pass).
typescript/renderers/react/scripts/test-react17.sh: Remove @a2ui/react/v0_8, @a2ui/react/styles, and V08Harness checks while keeping ESM/CJS resolution, SSR renderToString, and client DOM + reactive update checks against @a2ui/react and @a2ui/react/v0_9.
Clean up external consumers (samples/client/react/shell and tools/composer):
Delete samples/client/react/shell/src/theme/default-theme.ts and remove Theme from samples/client/react/shell/src/configs/types.ts.
Update tools/composer/src/lib/a2ui.tsx (and delete tools/composer/src/lib/viewerTheme.ts) per Option 1A or 1B above so tools/composer no longer imports @a2ui/react/v0_8.
Estimated effort: Medium (mostly deletions, with careful attention to tools/composer, React 17/18 matrix scripts, and yarn.lock / syncpack consistency).
Key risks:
Modifying package.json and yarn.lock triggers ci-renderers, ci-tools, ci-samples, and ci-other in .github/workflows/web_ci.yml, plus yarn lint:deps (syncpack list-mismatches).
A2UI_TEST_DIST=1 in test-react17.sh runs unit tests against dist/ exports; vitest.config.ts aliases must stay matched to dist/index.js and dist/v0_9/index.js.
Local verification commands before opening the PR:
Opened #4142 to delete tools/composer and remove all remaining external workspace dependents of @a2ui/react/v0_8 and @a2ui/react/styles (samples/client/react/shell and typescript/renderers/react/a2ui_explorer), keeping @a2ui/react internal v0.8 exports intact until after the next release.
Activity
jacobsimionato commentedon Nov 10, 2026
Hey! I've kicked off an automated agent in my local workspace to explore this and prepare a draft PR/fix. I'll review whatever it comes up with before submitting it for team review.
jacobsimionato commentedon Nov 10, 2026
🤖 Autonomous Agent Implementation Plan
I audited the repository at
c69ed0dc5to find every internal and external consumer of@a2ui/react's v0.8 code before making any edits.Audit of v0.8 dependencies
Shared v0.9 and v1.0 runtime in
typescript/renderers/react/src/(no v0.8 dependencies).None of the shared runtime files (
src/index.ts,src/v0_9/index.ts,A2uiSurface.tsx,adapter.tsx,node-view.tsx,host_registry.ts,markdown-context.tsx,markdown_hosts.tsx,react_component_implementation.ts,use_sync_external_store.ts,web_component_node.tsx, andsrc/catalog/*) import anything fromsrc/v0_8/,src/styles/, orsrc/types.ts. All shared and./v0_9code paths can stay completely untouched.Legacy secondary entry point
@a2ui/react/stylesand orphansrc/types.ts.src/styles/index.tsisexport * from '../v0_8/styles/index', which injects Light DOM CSS rules (.a2ui-surface .a2ui-*) replicating Lit v0.8 styles for the v0.8 React components. Nothing in v0.9 or v1.0 uses it because the shared basic catalogs render Shadow DOM Custom Elements from@a2ui/web_core. Likewise,src/types.tsisexport * from './v0_8/types'and has zero importers anywhere in the repository.Package-only dependencies used exclusively by
src/v0_8/.In
typescript/renderers/react/package.json,clsx(imported only insrc/v0_8/lib/utils.ts) andmarkdown-it+@types/markdown-it(imported only insrc/v0_8/components/content/Text.tsx) are used only by v0.8.@a2ui/markdown-itis also listed in@a2ui/react'sdependencies, even though@a2ui/reactnever imports it (a2ui_explorerandsamples/client/react/shelldeclare their own@a2ui/markdown-itdependencies).Visual parity workspace (
typescript/renderers/react/visual-parity,@a2ui/visual-parity).This standalone workspace (
visual-parity/package.json) is a manual Playwright pixel-diff suite comparing@a2ui/react/v0_8+@a2ui/react/stylesagainst@a2ui/lit's v0.8 components (visual-parity/react/src/main.tsx,FixturePage.tsx). It is not run in CI (buildandtestare no-ops).React Explorer (
typescript/renderers/react/a2ui_explorer,@a2ui/react-explorer).Already uses
@a2ui/reactand@a2ui/react/v0_9exclusively (supporting v0.9 and v1.0). Its only v0.8 references are unused bundler aliases for@a2ui/react/v0_8and@a2ui/react/stylesinkarma.conf.cjsandvite.config.ts.Sample apps (
samples/).samples/client/react/shell(@a2ui/react-shell, tested inci-samples): Already migrated to@a2ui/react/v0_9and@a2ui/web_core/v0_9! Its only v0.8 references are dead code left behind from that migration: an unimported 436-linesrc/theme/default-theme.tsand an unusedtheme?: Themeproperty insrc/configs/types.ts.samples/community/macros/client: Already uses@a2ui/react/v0_9only (no v0.8 imports).samples/imports@a2ui/react.Composer tool (
tools/composer,widget-builder, built and tested inci-tools).This is the only runtime consumer of
@a2ui/react/v0_8outsidetypescript/renderers/react:tools/composer/src/lib/a2ui.tsximportsA2UIViewerfrom@a2ui/react/v0_8. WhenspecVersion === '0.9'it rendersV09Viewer(which uses@a2ui/react/v0_9); whenspecVersion === '0.8'(or omitted) it rendersBaseA2UIViewerfrom@a2ui/react/v0_8withviewerTheme.V09_GALLERY_WIDGETS), component docs (COMPONENTS_DATA_V09), CopilotKit prompt (a2ui-prompt-v09.ts), and default version (DEFAULT_VERSION = '0.9'inspec-version-context.tsx). However, it still exposes av0.8/v0.9toggle inversion-selector.tsx, and/theaterplays 4 curated v0.8 scenario JSON streams throughuseA2UISurfaceinto<A2UIViewer />.Decisions to confirm before implementation
How should we handle
tools/composer?tools/composer) keeps changes confined to its adapter boundary (tools/composer/src/lib/a2ui.tsx). Replace the@a2ui/react/v0_8BaseA2UIViewerimport with a small v0.8-to-v0.9 component normalizer ({id, component: {Type: props}}to v0.9 component shape, convertingexplicitList/template,literalString/literalNumber/literalBoolean,usageHinttovariant, andMultipleChoicetoChoicePicker) and render all widgets and/theatersurfaces throughV09Viewer(@a2ui/react/v0_9), deleting unusedviewerTheme.ts. This keeps the PR focused on@a2ui/reactwithout unrelated UI churn intools/composer.tools/composer(either here or in a stacked prerequisite PR): narrowSpecVersionto'0.9', removeVersionSelector,a2ui-prompt-v08.ts,COMPONENTS_DATA,V08_GALLERY_WIDGETSinsync-gallery.mjs,viewerTheme.ts, andtranspileToV0_8, and convert the 4/theaterscenario JSONs (oruseA2UISurface) to v0.9.How should we handle
samples/client/react/shell?samples/client/react/shell/src/theme/default-theme.tsand removesimport type {Theme} from '@a2ui/react/v0_8'plustheme?: Themefromsamples/client/react/shell/src/configs/types.ts. The sample already runs on@a2ui/react/v0_9, and broader legacy sample retirement is tracked separately in Delete legacy example apps from the mono repo #3988.samples/client/react/shelloutright in this PR (and updates rootpackage.json,samples/README.md, andsamples/agent/node/restaurant_finder/README.md).Confirm deleting
./styles(@a2ui/react/styles) andvisual-parity/alongside./v0_8?Both exist solely for the v0.8 Light DOM components. Removing
./styleslets us deletesrc/styles/,scripts/postbuild.mjs, and the secondtsupbuild target.Exact planned changes (assuming Options 1A, 2A, and 3)
Delete v0.8 source, styles, visual-parity suite, and v0.8 tests in
typescript/renderers/react/:typescript/renderers/react/src/v0_8/(38 files).typescript/renderers/react/src/styles/(index.ts,index.d.ts),typescript/renderers/react/src/types.ts, andtypescript/renderers/react/scripts/postbuild.mjs.typescript/renderers/react/tests/v0_8/(30 files).typescript/renderers/react/visual-parity/(38 files) and updateyarn.lock.Update
@a2ui/reactpackage, build, lint, and test configs (leaving all sharedsrc/*.ts(x)andsrc/v0_9/index.tsfiles untouched):typescript/renderers/react/package.json: Remove"./v0_8"and"./styles"fromexports; removeclsx,markdown-it, and@a2ui/markdown-itfromdependenciesand@types/markdown-itfromdevDependencies; changewireit.build.commandfrom"tsup && node scripts/postbuild.mjs"to"tsup"and remove"../markdown-it:build"fromwireit.build.dependencies.typescript/renderers/react/tsup.config.ts: Remove'v0_8/index'fromentry, remove'markdown-it'fromexternal, and delete the secondstylesconfig entry.typescript/renderers/react/tsconfig.jsonandvitest.config.ts: Remove@a2ui/react/v0_8,@a2ui/react/styles,dist/v0_8,dist/styles, and@(src/v0_8) path aliases.typescript/renderers/react/eslint.config.mjs: Removesrc/v0_8/**andvisual-parity/**patterns (keepingeslint.boundary.mjsuntouched soscripts/adapter_boundary_allowlist.test.mjscontinues to pass).typescript/renderers/react/tests/setup.ts: RemoveinitializeDefaultCatalog()setup.typescript/renderers/react/tests/package_exports.test.ts: Remove thedist/v0_8/index.jsimport and v0.8 isolation test while keeping the root/v0_9export identity test.typescript/renderers/react/scripts/test-react17.sh: Remove@a2ui/react/v0_8,@a2ui/react/styles, andV08Harnesschecks while keeping ESM/CJS resolution, SSRrenderToString, and client DOM + reactive update checks against@a2ui/reactand@a2ui/react/v0_9.typescript/renderers/react/a2ui_explorer/karma.conf.cjsandvite.config.ts: Remove the stale@a2ui/react/v0_8and@a2ui/react/stylesaliases.Clean up external consumers (
samples/client/react/shellandtools/composer):samples/client/react/shell/src/theme/default-theme.tsand removeThemefromsamples/client/react/shell/src/configs/types.ts.tools/composer/src/lib/a2ui.tsx(and deletetools/composer/src/lib/viewerTheme.ts) per Option 1A or 1B above sotools/composerno longer imports@a2ui/react/v0_8.Update documentation and changelog:
typescript/renderers/react/CHANGELOG.md: Record breaking removal of@a2ui/react/v0_8and@a2ui/react/stylesunder## Unreleased.typescript/renderers/react/README.md: Remove the@a2ui/react/v0_8note, the## Legacy Support (v0.8)section (L342-L391), the outdated v0.8TestWrappersnippet (L441-L457), and## Visual Parity Testing(L459-L501).docs/site/src/content/docs/concepts/sdks.mdx,docs/public/guides/client-setup.md, anddocs/public/reference/renderers.md: Update@a2ui/react's supported protocol versions tov0.9.1, v1.0and note that deprecated v0.8 renderer support applies only to Lit and Angular (until [FEATURE]: Delete the Lit v0.8 framework adapter #2952 lands).Complexity, risks, and verification strategy
tools/composer, React 17/18 matrix scripts, andyarn.lock/syncpackconsistency).package.jsonandyarn.locktriggersci-renderers,ci-tools,ci-samples, andci-otherin.github/workflows/web_ci.yml, plusyarn lint:deps(syncpack list-mismatches).A2UI_TEST_DIST=1intest-react17.shruns unit tests againstdist/exports;vitest.config.tsaliases must stay matched todist/index.jsanddist/v0_9/index.js.yarn install && yarn lint:depsyarn workspace @a2ui/react build && yarn workspace @a2ui/react test && yarn workspace @a2ui/react lint && yarn workspace @a2ui/react typecheckyarn workspace @a2ui/react run test:react17 && yarn workspace @a2ui/react run test:react18yarn workspace @a2ui/react-shell build && yarn workspace @a2ui/react-shell lint && yarn workspace @a2ui/react-shell testyarn workspace widget-builder build && yarn workspace widget-builder lint && yarn workspace widget-builder testnode --test scripts/adapter_boundary_allowlist.test.mjs typescript/scripts/publish_npm.test.mjs typescript/scripts/upload_manifest.test.mjsyarn format:check:allI have paused execution so that @jacobsimionato can review this plan. Please re-add the
coding-agent-readytag with any notes when ready.🤖 Agent-generated
jacobsimionato commentedon Nov 10, 2026
Opened #4142 to delete
tools/composerand remove all remaining external workspace dependents of@a2ui/react/v0_8and@a2ui/react/styles(samples/client/react/shellandtypescript/renderers/react/a2ui_explorer), keeping@a2ui/reactinternal v0.8 exports intact until after the next release.