Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
f016836
feat(swift-core): gate local functionCall actions on user activation
gspencergoog Nov 2, 2026
0e98b9a
fix(swift-core): gate passive bindings, checks, and event actions on …
gspencergoog Nov 2, 2026
a7e8a8a
test(conformance): add executed-case manifest schema and comparer
gspencergoog Oct 31, 2026
d904d49
test(conformance): return a str from the manifest record schema check
gspencergoog Oct 31, 2026
a317191
test(conformance): pre-compile only globs and check is_dir in load_re…
gspencergoog Nov 2, 2026
a84ef3d
test(conformance): reject unmatched --only globs and omit excluded su…
gspencergoog Nov 2, 2026
b4591ff
test(web_core): record executed conformance cases and enforce strict …
gspencergoog Oct 31, 2026
65ca982
test(dart-core): record executed conformance cases and enforce strict…
gspencergoog Oct 31, 2026
d77696c
test(swift-core): record executed conformance cases and enforce stric…
gspencergoog Oct 31, 2026
0548ed4
test(swift-core): run each conformance case as its own test
gspencergoog Oct 31, 2026
7691b27
test(py-core): record executed conformance cases and enforce strict d…
gspencergoog Oct 31, 2026
2084dd4
test(core): address review feedback and fix Swift conformance test co…
gspencergoog Nov 2, 2026
4e3482a
test(conformance): propagate unknown-key errors through xfail and aud…
gspencergoog Nov 2, 2026
40ab5df
test(core): fix Dart scaling known keys and Swift conformance build
gspencergoog Nov 2, 2026
61b8340
test(swift-core): avoid exclusivity conflict on captured expression e…
gspencergoog Nov 2, 2026
69a25ab
test(swift-core): handle DataError category in ValidatorConformanceTests
gspencergoog Nov 2, 2026
596975f
test(web_core): disable Wireit caching for test:conformance
gspencergoog Nov 2, 2026
c3e39e9
test(swift-core): reconcile validate runner with upstream/main
gspencergoog Nov 2, 2026
3480e57
test(a2ui_a2a,a2ui_adk): strict dispatch and executed-case manifest i…
gspencergoog Nov 2, 2026
113bc1c
test(a2ui_agent-ts): executed-case manifest for the TypeScript agent …
gspencergoog Nov 2, 2026
c110059
test(dart/a2ui_agent): executed-case manifest for the Dart agent harn…
gspencergoog Nov 2, 2026
98a897f
test(conformance): address review findings for agent and extension ha…
gspencergoog Nov 2, 2026
2ae0ebc
test(conformance): strict dispatch and executed-case manifest in rend…
gspencergoog Nov 2, 2026
4d6322a
test(conformance): address review findings in renderer adapter harnesses
gspencergoog Nov 2, 2026
e89d676
test(conformance): fix Swift MainActor isolation and Angular formatting
gspencergoog Nov 2, 2026
edc8042
test(a2ui_agent-ts): include VITEST_WORKER_ID in manifest filename
gspencergoog Nov 2, 2026
28d8a3b
test(a2ui_agent): record executed cases and enforce strict dispatch i…
gspencergoog Nov 2, 2026
b12b6f4
test(a2ui_a2a): validate v1.0 AgentCard params against agent_capabili…
gspencergoog Nov 2, 2026
ef5d4b7
chore: merge upstream/main
gspencergoog Nov 2, 2026
32f7167
test(a2ui_agent): enforce protocol_version, error message, and schema…
gspencergoog Nov 2, 2026
351c7ee
fix(swift-core): default DataContext to passive and keep event payloa…
gspencergoog Nov 2, 2026
a50918d
chore: merge feat/swift-core-user-activation
gspencergoog Nov 2, 2026
dcafe14
feat(swift): add HostedViewDriver and parameterized adapter conforman…
gspencergoog Nov 2, 2026
9e9b210
fix(swift): close hosted window on teardown and check expectedAdapter…
gspencergoog Nov 2, 2026
468a81d
fix(swiftui): use NSAccessibilityProtocol for macOS accessibility ins…
gspencergoog Nov 2, 2026
8d9663d
Merge remote-tracking branch 'upstream/main' into test/adapter-confor…
gspencergoog Nov 2, 2026
9ebd242
test(conformance): add expectOutbound wire envelope assertions across…
gspencergoog Nov 2, 2026
fc3e058
Merge remote-tracking branch 'upstream/main' into test/adapter-confor…
gspencergoog Nov 2, 2026
032ae70
Merge remote-tracking branch 'upstream/main' into test/core-conforman…
gspencergoog Nov 3, 2026
f228a50
fix(conformance): intersect excluded.keys() with corpus.keys() in che…
gspencergoog Nov 3, 2026
4dfaed6
Merge commit 'f228a508d' into test/renderer-conformance-manifests
gspencergoog Nov 3, 2026
44bac91
Merge commit 'f228a508d' into test/python-agent-manifest-and-a2a-guard
gspencergoog Nov 3, 2026
42b28c6
Merge commit 'f228a508d' into feat/swiftui-hosted-view-driver
gspencergoog Nov 3, 2026
44190af
Merge commit 'f228a508d' into test/adapter-conformance-expect-outbound
gspencergoog Nov 3, 2026
a86c96f
style: format files with fix_format.sh
gspencergoog Nov 3, 2026
1ccf163
Merge remote-tracking branch 'upstream/main' into test/core-conforman…
gspencergoog Nov 3, 2026
1c9ee16
Merge commit '1ccf163b0e8d9a3a981889f1ec45c462591096cc' into test/pyt…
gspencergoog Nov 3, 2026
30b96af
Merge commit '1ccf163b0e8d9a3a981889f1ec45c462591096cc' into test/ren…
gspencergoog Nov 3, 2026
7ab14fd
Merge commit '1ccf163b0e8d9a3a981889f1ec45c462591096cc' into feat/swi…
gspencergoog Nov 3, 2026
8aa9714
Merge commit '1ccf163b0e8d9a3a981889f1ec45c462591096cc' into test/ada…
gspencergoog Nov 3, 2026
29f1ec4
Merge remote-tracking branch 'upstream/main' into test/renderer-confo…
gspencergoog Nov 3, 2026
e99dc50
Merge branch 'test/renderer-conformance-manifests' into feat/swiftui-…
gspencergoog Nov 3, 2026
4629812
Merge branch 'feat/swiftui-hosted-view-driver' into test/adapter-conf…
gspencergoog Nov 3, 2026
de1276f
test(conformance): address review feedback on core manifest harnesses
gspencergoog Nov 3, 2026
1d5ff16
fix(conformance): mark assertProcessErrorCategory with try and drop u…
gspencergoog Nov 3, 2026
1383166
Merge branch 'test/core-conformance-manifests' into test/renderer-con…
gspencergoog Nov 3, 2026
7f9a4e3
Merge branch 'test/renderer-conformance-manifests' into feat/swiftui-…
gspencergoog Nov 3, 2026
f4277b2
Merge branch 'feat/swiftui-hosted-view-driver' into test/adapter-conf…
gspencergoog Nov 3, 2026
915982a
test(conformance): golden-transcript scenario format and newsletter seed
gspencergoog Nov 3, 2026
ff3439c
test(conformance): renderer-visible outcome of a transcript and compa…
gspencergoog Nov 3, 2026
4cd51c7
style(conformance): format E2E scenario files with prettier and pyink
gspencergoog Nov 3, 2026
a5a2e13
Merge branch 'test/python-agent-manifest-and-a2a-guard' into test/e2e…
gspencergoog Nov 3, 2026
060852b
test(a2ui_agent): run the e2e scenarios' agent half in Python
gspencergoog Nov 3, 2026
a656c71
test(a2ui_agent-ts): run the e2e scenarios' agent half in TypeScript
gspencergoog Nov 3, 2026
7de5c17
test(dart/a2ui_agent): run the e2e scenarios' agent half in Dart
gspencergoog Nov 3, 2026
7fed215
test(a2ui_flutter): run the e2e scenarios' renderer half
gspencergoog Nov 3, 2026
9f3eb61
test(swiftui): replay e2e scenarios in hosted views
gspencergoog Nov 3, 2026
2e41ee5
style(conformance): apply license headers to E2E outcome scripts
gspencergoog Nov 3, 2026
4948413
fix(conformance): resolve mypy type annotations in compare_e2e_outcome
gspencergoog Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/workflows/flutter_packages_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,46 @@ jobs:
run: dart run tool/generate_express_parser.dart --check
- name: Run tests
working-directory: ${{ matrix.package.path }}
env:
A2UI_CONFORMANCE_MANIFEST_DIR: ${{ (matrix.package.path == 'dart/a2ui_core' || matrix.package.path == 'dart/a2ui_flutter') && format('{0}/a2ui-manifest', runner.temp) || '' }}
A2UI_CONFORMANCE_MANIFEST_DIR: ${{ (matrix.package.path == 'dart/a2ui_core' || matrix.package.path == 'dart/a2ui_agent') && format('{0}/a2ui-manifest', runner.temp) || '' }}
run: |
if [ -d "test" ]; then
flutter test --test-randomize-ordering-seed=random
else
echo "No 'test' directory found in ${{ matrix.package.path }}, skipping tests."
fi
- name: Set up Python for conformance manifest check
if: matrix.package.path == 'dart/a2ui_core'
uses: ./.github/actions/setup-python
- name: Check executed conformance cases
if: matrix.package.path == 'dart/a2ui_core'
run: |
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--harness dart-core \
--corpus core \
--exclude "core/message_processor_scaling.yaml=performance: runs with -P performance"
- name: Set up Python for adapter conformance manifest check
if: matrix.package.path == 'dart/a2ui_flutter'
uses: ./.github/actions/setup-python
- name: Check executed adapter conformance cases
if: matrix.package.path == 'dart/a2ui_flutter'
run: |
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--harness flutter \
--corpus adapter
- name: Set up Python for agent conformance manifest check
if: matrix.package.path == 'dart/a2ui_agent'
uses: ./.github/actions/setup-python
- name: Check executed agent conformance cases
if: matrix.package.path == 'dart/a2ui_agent'
run: |
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--corpus agent \
--harness dart-agent

# The e2e_test packages are excluded from the matrix above because their
# tests call a live Gemini model, which needs credentials and quota that are
Expand Down
22 changes: 22 additions & 0 deletions .github/workflows/python_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,29 @@ jobs:
run: |
uv run --all-packages mypy .
- name: Run Unit Tests
env:
A2UI_CONFORMANCE_MANIFEST_DIR: ${{ runner.temp }}/a2ui-manifest
run: uv run pytest
- name: Verify Core Conformance Manifest
run: |
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--harness python-core \
--corpus core
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--corpus extensions \
--only 'extensions/a2a/**' \
--harness python-a2a
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--corpus extensions \
--only 'extensions/adk/**' \
--harness python-adk
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--corpus agent \
--harness python-agent
- name: Set Up Dart
uses: ./.github/actions/setup-dart
- name: Run CLI Python Runtime Tests
Expand Down
17 changes: 17 additions & 0 deletions .github/workflows/swift_build_and_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,24 @@ jobs:
with:
persist-credentials: false
- name: Run tests
env:
A2UI_CONFORMANCE_MANIFEST_DIR: ${{ runner.temp }}/a2ui-manifest
run: swift test --enable-swift-testing
- name: Set up Python
uses: ./.github/actions/setup-python
- name: Check executed conformance cases
run: |
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--harness swift-core \
--corpus core \
--exclude "core/message_processor_scaling.yaml=performance: runs in the test (performance) job with A2UI_RUN_TIMING=1"
- name: Check executed adapter conformance cases
run: |
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--harness swiftui \
--corpus adapter

ios-build:
# `swift test` above builds for macOS only, so `#if os(iOS)` and UIKit code
Expand Down
20 changes: 20 additions & 0 deletions .github/workflows/web_ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,27 @@ jobs:
- name: Build Renderers
run: eval "yarn workspaces foreach -A $RENDERERS_INC -p --topological-dev run build"
- name: Test Renderers
env:
A2UI_CONFORMANCE_MANIFEST_DIR: ${{ runner.temp }}/a2ui-manifest
run: eval "yarn workspaces foreach -A $RENDERERS_INC -p run test"
- uses: ./.github/actions/setup-python
- name: Check web_core executed cases
run: uv run --project conformance python conformance/scripts/check_executed_cases.py --manifest-dir "${{ runner.temp }}/a2ui-manifest" --harness web_core --corpus core
- name: Check adapter executed cases
run: |
for h in lit react angular; do
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--corpus adapter \
--harness "$h"
done
uv run --project conformance python conformance/scripts/check_executed_cases.py \
--manifest-dir "${{ runner.temp }}/a2ui-manifest" \
--corpus adapter \
--harness web_core_universal \
--only core/accessibility.yaml
- name: Check TS agent executed cases
run: uv run --project conformance python conformance/scripts/check_executed_cases.py --manifest-dir "${{ runner.temp }}/a2ui-manifest" --corpus agent --harness ts-agent
- name: Test React 18 Compatibility
run: yarn workspace @a2ui/react run test:react18
- name: Verify NPM Publish Script
Expand Down
26 changes: 26 additions & 0 deletions conformance/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,32 @@ It is the one suite under `agent/` that does not use the case vocabulary below.
- `extensions/a2a/a2a_integration.yaml`: Contains test cases for A2A protocol event and part conversions.
- `extensions/adk/adk_extensions.yaml`: Contains test cases for ADK extensions and RPC handling.

### End-to-end (`e2e/`)

End-to-end conformance scenarios in `e2e/` capture complete multi-turn conversational transcripts and user interactions. Each scenario validates:

- **Agent half**: Inbound chunks for each declared format (`direct_json`, `express`) are streamed and single-shot parsed by the agent SDK's response parser, verifying that they yield the exact expected wire messages (`expectWire`) with adjacent text parts merged.
- **Renderer half**: The `a2ui` messages from each turn are dispatched into framework adapter harnesses (or `MessageProcessor`), which verify the resulting resolved view trees (`expectViewTree`), execute simulated user interactions (`uiOps`), and assert outbound event envelopes (`expectOutbound`) and data model states (`expectDataModel`).

Harnesses running the agent half:

- Python Agent: `python/a2ui_agent`
- TypeScript Agent: `typescript/agents/a2ui_agent`
- Dart Agent: `dart/a2ui_agent`

Harnesses running the renderer half:

- Web Renderers: `@a2ui/lit`, `@a2ui/react`, `@a2ui/angular`
- Flutter Renderer: `dart/a2ui_flutter`
- SwiftUI Renderer: `swift/swiftui`

#### Adding an e2e scenario

1. Author a new scenario YAML file in `conformance/e2e/<scenario_name>.yaml`.
2. Specify `action: e2e_scenario`, `protocolVersion` (e.g. `"1.0"`), `catalogPaths`, `formats` (e.g. `[direct_json, express]`), and multi-turn exchanges with `modelChunks`, `expectWire`, `expectViewTree`, and optional `uiOps`, `expectDataModel`, and `expectOutbound`.
3. Verify the scenario using `pytest conformance/tests/test_e2e_scenarios.py`.
4. When targeting v0.9.1 compatibility, generate or duplicate the v0.9.1 scenario copies using the conformance generator scripts.

All static test data and simplified schemas are located in the `test_data/` directory.

`conformance_schema.json` at the root is the JSON schema that validates the structure of YAML test files across all domains.
Expand Down
Loading
Loading