Commit Graph

964 Commits

Author SHA1 Message Date
Jordan Ritter 8711326b5f fix(showcase/a2ui): tighten Zod schemas
- PrimaryButton.action: z.any() -> z.unknown() (forces caller narrowing)
- Row.justify/align + Column.align: z.string() -> z.enum() matching the
  renderer's CSS map
- DataTable rows accept numeric cells (z.union([string, number]))
- DataTable column-key refine documented in description (host
  CatalogComponentDefinition requires ZodObject, blocks .refine)
2026-06-15 09:35:45 -07:00
Jordan Ritter 0964823f3c fix(showcase/sales-context): honest duplication notice + extract TODO
Replace the misleading 'single source of truth' claim with an explicit
DUPLICATION NOTICE describing the per-integration parity convention and
a TODO(OSS-136) for the future shared-module extraction. Both copies
remain byte-identical.
2026-06-15 09:35:44 -07:00
Jordan Ritter df48df3587 fix(showcase/google-adk): align aimock fixture + suggestions comment
- Correct suggestions.ts file-path reference (was pointing at LP a2ui_dynamic.py)
- Tighten userMessage matchers to full pill prompts
- Strip unschema'd weight/variant fields from Metric/Card/Chart/Text payloads
2026-06-15 09:35:44 -07:00
Jordan Ritter e57ea6b864 fix(showcase/langgraph-python): align agent + aimock with ADK parity
- Replace fake gpt-5.4 with env-overridable real model (default gpt-4o)
- Register generate_a2ui tool matching SYSTEM_PROMPT + ADK structure
- Stub tool raises RuntimeError if middleware bypassed (fail-loud)
- Reorder LP fixture entries: inner render_a2ui before outer generate_a2ui
  to match ADK first-match-wins ordering
- Tighten userMessage matchers to full pill prompts (no substring hijack)
- Drop dead _design_a2ui_surface mirrors; strip unschema'd weight/variant fields
- Honest SYSTEM_PROMPT comment cross-referencing ADK _INSTRUCTION
2026-06-15 09:35:43 -07:00
Jordan Ritter cb9fbe4c55 feat(showcase/built-in-agent): D6 BIA component port — tool-rendering + headless-complete + LGP-canonical naming (#5427)
## Summary

BIA D6 component port (#4 from PR #5413 followup list). Companion to PR
#5407 (claude-sdk-python), PR #5413 (initial BIA D6), PR #5421 (BIA D6
small follow-ups). Brings BIA closer to LGP gold-standard parity.

### What's in

- **tool-rendering**: 5 LGP-mirrored companion components
(`weather-card`, `flight-list-card`, `stock-card`, `d20-card`,
`custom-catchall-renderer`) + extracted `tool-renderers.tsx` wiring.
**D6 GREEN.**
- **headless-complete**: 2 new components (`stock-card`, `chart-card`) +
`get_revenue_chart` server tool + LGP-aligned 4 pill suggestions +
`data-message-role` on bubble cascade + `get_weather` tool name fix in
tool-renderers. Turns 1 (weather) + 2 (stock) GREEN.
- **roll_dice → roll_d20 rename** across BIA backend + reasoning-chain
references (LGP canonical naming).
- **aimock fixtures**: BIA-namespaced `tool-rendering.json` updated +
`tool-rendering-reasoning-chain.json` realigned to the rename.
- **PARITY_NOTES**: documents the server-tool reprompt loop
architectural gap blocking turns 3+4 of headless-complete.

### Known issue (documented in PARITY_NOTES.md, out-of-PR-scope)

headless-complete turns 3 (highlight_note) and 4 (revenue_chart) RED due
to BIA's TanStack multi-turn server-tool reprompt cycle + aimock
userMessage-keyed fixtures looping until timeout. Three remediation
options identified — all require changes outside this PR's scope (BIA
agent architecture / aimock matcher precedence / fixture matcher
gating).

### Test plan

- [x] Local `--direct` D6 on tool-rendering: GREEN (2.8s)
- [x] Local `--direct` D6 on headless-complete: turns 1+2 GREEN, turns
3+4 RED (documented)
- [x] CI green on PR
2026-06-14 20:15:30 -07:00
Maxim 954e3b613d feat(showcase): align card internals and add severity icons to StatusBadge
Override the basic catalog's Text (its built-in 8px margin misaligned
card rows), keep badges content-sized instead of stretched by flex
parents, and prefix each badge with a hardcoded lucide icon per variant
(error/warning/success/info). Renderer-only — payloads and fixtures are
unaffected.
2026-06-13 00:16:54 +02:00
Maxim 1e0d200f53 feat(showcase): dashboard-grade surfaces on every declarative-gen-ui pill
Hero loses its surrounding card (bare KPI strip over the chart cards,
pinned to all six months); team performance pairs the rep table with a
quota-attainment bar chart; top account pairs the fact card with a
product-line pie (new dataset entry); at-risk becomes a risk panel — KPI
strip (ARR at risk / accounts / biggest exposure) over three side-by-side
severity cards with reason + next action. Fixtures re-captured from live
responses; D5 probe drops declarative-card from the hero set; e2e asserts
the accompanying charts and the risk panel; QA docs updated.
2026-06-13 00:16:53 +02:00
Maxim 06c819d0fb feat(showcase): match declarative-gen-ui renderers to beautiful-chat's sales dashboard
Ports beautiful-chat's exact visual language into the catalog renderers:
DashboardCard chrome (12px radius, 20px padding, soft shadow) for Card and
chart wrappers, its Metric typography with colored trend deltas, a recharts
donut (innerRadius 40, paddingAngle 2, tooltip, no legend) replacing the
custom SVG donut, and uniform blue bars on a dashed grid. E2E pie
fingerprints move from circle/legend assertions to recharts sectors; the
hero surface-count guard allows the two ResponsiveContainers (pie + bar)
one composed dashboard now produces.
2026-06-13 00:16:53 +02:00
Maxim 667114cfa4 test(showcase): assert pill clicks dispatched in declarative-gen-ui e2e
Click a pill, then require the user-message bubble before asserting on
the surface; retry the click if it was swallowed. On slow dev-server
hydration the first click can land before the chat send pipeline is
wired, which previously burned the full surface-assertion budget and
masked the real failure point.
2026-06-13 00:14:49 +02:00
Maxim 4de75ff900 feat(showcase): rework declarative-gen-ui demo into a sales-analyst dashboard (OSS-136)
The demo now plays an embedded sales analyst for a fictional company:
suggestion pills are natural business questions (chart-type steering moved
from user prompts into the system prompt), the hero pill composes a full
dashboard (KPI metrics + pie + bar in one surface) modelled on
beautiful-chat's sales dashboard, and the catalog gains DataTable,
gap-aware Row/Column, Metric trendValue, and the beautiful-chat palette.
Dataset + composition rules ship as frontend agent context
(sales-context.ts) so they reach both the primary agent and the secondary
A2UI planner in LGP and ADK alike. E2E specs and QA docs updated to the
new pill set.
2026-06-13 00:14:47 +02:00
Jordan Ritter 8b6052ac7e fix(showcase/scripts): ratchet aimock-fixtures ceilings + close BIA headless-complete reprompt-loop known-issue
* duplicate ceiling 290→291: tool-rendering.json's tightened 'current
  price of AAPL' matchers now share two match keys with the existing
  tool-rendering-custom-catchall.json entries in the same BIA context,
  runtime-disambiguated by feature route.
* shadow ceiling 134→132 (ratchet down): the bare 'AAPL' vs 'current
  price of AAPL' shadow pair on the tool-rendering.json side is gone.
* PARITY_NOTES: replaces the 'headless-complete turns 3+4 server-tool
  reprompt loop' known-issue section with a resolved-via-sequenceIndex
  description; the architectural reprompt loop now converges via the
  sequenceIndex-gated emitter + narration-fallback pattern in
  gen-ui-headless-complete.json.
2026-06-12 14:50:47 -07:00
github-actions[bot] 43fed818f1 style: auto-fix formatting 2026-06-12 19:23:14 +00:00
Jordan Ritter 0ddf1c029b docs(showcase/built-in-agent): PARITY_NOTES known-issue for headless-complete server-tool reprompt loop 2026-06-12 12:22:13 -07:00
Jordan Ritter 81e64bba3a fix(showcase/built-in-agent): align headless-complete bubbles with D6 conversation-runner cascade (data-message-role + get_weather wiring) 2026-06-12 12:13:12 -07:00
Jordan Ritter 0e3f7e3fa6 feat(showcase/built-in-agent): port headless-complete stock-card + chart-card + get_revenue_chart server tool + LGP-aligned suggestions 2026-06-12 12:13:07 -07:00
Jordan Ritter 9f4fd4c189 fix(showcase/built-in-agent): rename roll_dice → roll_d20 to match LGP canonical naming 2026-06-12 12:12:57 -07:00
Jordan Ritter 0009aff9cd feat(showcase/built-in-agent): port 5 LGP tool-rendering companion components (weather, flight, stock, d20, custom-catchall) + tool-renderers wiring 2026-06-12 12:12:11 -07:00
Mark Fogle 53801f8e04 test(showcase): make sales-dashboard e2e reproduce real-model catalogId omission
The injected/streamed a2ui fixtures all included catalogId, so aimock
replay never exercised the basic-catalog fallback that broke production
(real models omit catalogId per the tool-usage guide). Strip catalogId
from the langgraph-python sales-dashboard secondary-call fixtures and
hard-assert "Catalog not found" is absent outside the charts-rendered
soft branch, so the spec fails without a route defaultCatalogId.

Also repoint the on-demand e2e workflow at the d4/d5-recorded/d6/shared
fixture dirs — it still referenced feature-parity.json, deleted in the
1e66a5f8d fixture reorg, so every /test-aimock run died at aimock start.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 18:47:16 +00:00
Mark Fogle fb3d64ef83 fix(showcase): pin page-registered A2UI catalog as defaultCatalogId fleet-wide
The injected render_a2ui tool guide instructs models to omit catalogId
("the catalog id is set by the host"), and backend-owned generate_a2ui
tools see real models omit or late-stream it. Without defaultCatalogId
the a2ui middleware falls back to the spec basic catalog, which no
showcase page registers — surfaces fail with "Catalog not found:
https://a2ui.org/specification/v0_9/basic_catalog.json" (reported on
beautiful-chat / langgraph-python).

Pin each route to the catalog its page registers: beautiful-chat ->
copilotkit://app-dashboard-catalog, declarative-gen-ui ->
declarative-gen-ui-catalog. Routes with no a2ui block never attach the
middleware and are left untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 18:32:14 +00:00
Jordan Ritter bf37f3808d fix(showcase/built-in-agent): emit STATE_DELTA with op:add (not replace) so first /steps patch creates the path 2026-06-12 10:24:54 -07:00
Jordan Ritter c963268198 docs(showcase/built-in-agent): remove sub-agents TODO — diagnose confirms code correct, prior staging RED was image cache 2026-06-12 10:24:29 -07:00
Jordan Ritter 5b0908ab76 docs(showcase/built-in-agent): fix PARITY_NOTES NSF terminology + add sub-agents TODO 2026-06-12 10:24:16 -07:00
Jordan Ritter dd9270fe60 fix(showcase): per-integration adjacencies — @ts-expect-error swaps + agno comment + built-in-agent headless-simple UUID fallback + error banner across agno/crewai-crews/langroid/mastra/pydantic-ai/strands mcp-apps routes 2026-06-12 08:00:05 -07:00
Jordan Ritter e89abefb0f fix(showcase/llamaindex): consolidate content-red fixes — gen-ui agent + beautiful-chat agent updates, mcp-apps + copilotkit route alias coherence, demo-files assets 2026-06-12 07:59:36 -07:00
Jordan Ritter e306e25e42 fix(showcase/claude-sdk-typescript): consolidate content-red fixes — per-content-block array refactor for text/thinking/tool_use replay order, per-block randomUUID, reasoning route + alias coherence 2026-06-12 07:59:36 -07:00
Jordan Ritter 3f601daaea fix(showcase/ag2): consolidate content-red fixes — manifest NSF reasoning canon, ASGI middleware for per-request user-message ContextVar, async OpenAI client, tool serialization, manifest demos cleanup (R9-A2) 2026-06-12 07:59:36 -07:00
Jordan Ritter df1b2d572d fix(showcase/spring-ai): consolidate content-red fixes — manifest NSF reasoning canon, Jackson @Primary mapper + RunErrorEvent wire-shape, error-banner pattern, Java tool JSON hardening, .ag-ui-sha pin + CI workflow 2026-06-12 07:59:35 -07:00
Jordan Ritter 02fcf43d6d docs(showcase): built-in-agent PARITY_NOTES + feature-registry threadid-frontend-tool-roundtrip + known issues
Documentation companion to the BIA D6 readiness work:

- PARITY_NOTES.md: tracks built-in-agent feature parity vs LGP +
  a 'Known Issues' section documenting 3 D6 demos that remain red
  due to downstream renderer/state gaps in @copilotkit/react-core
  (a2ui renderer host doesn't mount Card; STATE_DELTA → useAgent
  state-subscription gap; declarative-gen-ui renderer host shares
  the same class). All three require fixes outside this PR's scope.
- feature-registry.json: adds threadid-frontend-tool-roundtrip
  feature entry covering the new gen-ui-agent STATE_DELTA wiring.
2026-06-12 05:02:39 -07:00
Jordan Ritter 9abe8a183f fix(showcase/built-in-agent): wire set_steps tool for gen-ui-agent STATE_DELTA stream
Adds the set_steps tool definition to state-tools and wires it through
the tanstack factory so the gen-ui-agent demo emits STATE_DELTA events
on its agent-plan stream the same way the LGP integration does.
2026-06-12 05:02:32 -07:00
Jordan Ritter 99aafd0283 feat(showcase/built-in-agent): extract subagents DelegationCard into LGP-mirror components
Extracts the inline subagents page DelegationCard into three reusable
components that mirror the LGP integration layout, enabling D6 testid
coverage:

- subagent-activity-card.tsx: per-subagent activity panel
- delegation-log.tsx: cumulative delegation event log
- supervisor-activity-banner.tsx: supervisor-level status banner

The subagents page now composes these components instead of inlining
the markup, with data-testid hooks for D6 selectors.
2026-06-12 05:02:20 -07:00
Jordan Ritter b6750b7423 fix(showcase/built-in-agent): D6 testid backfill across 13 demos
Backfills data-testid attributes to enable D6 cross-integration test
coverage for the built-in-agent integration. Covers:

- declarative-gen-ui renderers (5 testids)
- headless-complete demo components (6 testids: assistant-bubble,
  user-bubble, weather-card, highlight-note, input-bar)
- headless-simple page (3 testids)
- gen-ui-agent page (3 testids including agent-step)
- a2ui-fixed-schema definitions + renderers (chat-slots, auth flow)
- new sign-in-card component for auth demo
- gen-ui-interrupt cancel testid on time-picker-card
- shared not-supported-banner component for hitl +
  shared-state-streaming NSF demos
2026-06-12 05:02:13 -07:00
Jordan Ritter dad8ff0a71 chore(showcase/claude-sdk-python): document LGP parity for headless-message testids
Adds inline comments next to the data-testid="headless-message-{user,assistant}"
markers in assistant-bubble.tsx, user-bubble.tsx, and headless-simple/page.tsx
explaining that the testids intentionally repeat once per message — mirroring
the canonical LGP implementation — and that role discrimination for the D6
conversation-runner is via data-message-role, not unique testids.
2026-06-12 03:25:32 -07:00
Jordan Ritter f9bb881555 fix(showcase/claude-sdk-python): D6 probe alignment — testid backfill + demo bugfixes + V2 import for gen-ui-interrupt
Backfills the data-testid markers the D6 probes assert against across the
auth, headless-simple, headless-complete, a2ui-fixed-schema,
declarative-gen-ui, and gen-ui-interrupt demos; aligns the python
a2ui_fixed agent + a2ui definitions/renderers with the canonical LGP
shapes; and switches the gen-ui-interrupt CopilotKit provider import to
@copilotkit/react-core/v2 so the demo mounts under the V2 runtime that
the D6 probe drives.
2026-06-12 03:25:18 -07:00
Jordan Ritter 28055f0688 feat(showcase/claude-sdk-python): add headless-revenue-chart for D6 probe
Adds the chart-card renderer and wires it into the headless-complete
tool-renderers map so the D6 probe for the headless-revenue-chart feature
can mount and assert against a real chart component.
2026-06-12 03:24:43 -07:00
Jordan Ritter 8f72c2840a fix(showcase/claude-sdk-python): hitl demo bugfixes — useInterrupt hook + V2 CopilotKit import
Replaces useLangGraphInterrupt with useInterrupt (LangGraph-specific hook
not exported from the V2 React core) and switches the CopilotKit provider
import to @copilotkit/react-core/v2 so the demo mounts under the V2
runtime that the D6 probe drives.
2026-06-12 03:24:22 -07:00
Jordan Ritter 928ece2f6c fix(showcase): add D6 NSF entries + feature alignment across 14 integration manifests
Annotates 14 integration manifests with d6_not_supported_features entries
and aligns d6_supported_features with what each backend actually implements,
so the D6 fleet probe only enumerates demos that the backend can serve.
2026-06-12 03:24:16 -07:00
Jordan Ritter d6cb5371e5 fix(showcase): align integration requirements to fleet pins
Align showcase integration requirements.txt files (strands,
langgraph-fastapi, langgraph-python, pydantic-ai, google-adk,
crewai-crews) to the fleet pin standard, including an accurate
typing_extensions comment in crewai-crews and a trailing newline in
langgraph-python.
2026-06-10 15:02:30 -07:00
Jordan Ritter e8d47f6481 fix(mastra): exact-pin floating beta dist-tags
Replace floating "beta" dist-tags with exact versions for @ag-ui/mastra,
@mastra/{client-js,core,libsql,memory}, and mastra in both the examples
and showcase mastra packages. Showcase mastra also raises its zod floor
^3.24.0 -> ^3.25.0. The examples mastra package additionally carries the
fleet-wide @ag-ui/client 0.0.55 bump and single-tree overrides here, since
its manifest mixes both changes.
2026-06-10 15:02:19 -07:00
Jordan Ritter c4a5f9d57c fix(showcase): @ag-ui 0.0.55 currency, reasoning ports, google-adk demos (#5348)
## Summary

Combined landing of three browser-verified showcase work waves (37
commits, per-integration grouping preserved), plus a full multi-round
code review with all mandatory fixes folded in.

**Wave 1 — @ag-ui currency (9/9 integrations).** Bump `@ag-ui/*`
frontend deps to exact `0.0.55` for: llamaindex, agno,
claude-sdk-python, pydantic-ai, strands, claude-sdk-typescript,
ms-agent-python, ms-agent-dotnet, google-adk. Exact pins land across 13
`package.json` files.

**Wave 2 — reasoning emission ports (4/4, ref #76).** Port
reasoning-message emission to ag2, crewai-crews, langroid, and spring-ai
(each also bumped to `@ag-ui` 0.0.55). Adds per-integration
`reasoning_agent` (Python) / `ReasoningController` (spring-ai Java) and
wires the copilotkit route.

**Wave 3 — google-adk demo parity (3/4).** Port `hitl`,
`threadid-frontend-tool-roundtrip`, and `gen-ui-interrupt` demos to
google-adk for parity with the gold reference, plus d6/aimock fixtures.
The `interrupt-headless` demo is intentionally kept `not_supported`
(needs aimock `customEvents` support + an ADK interrupt route — tracked
as a known upstream gap).

## Code review

A 5-round unbiased multi-agent CR loop ran against the combined diff and
converged at zero mandatory findings; the bucket-(c) promotion audit
came back clean. Key fixes folded into the branch:

- **Client error-leak hardening** in the crewai, langroid, and spring-ai
reasoning routes — internal exception details no longer leak to the
client, with `errorId` correlation between client response and server
logs (also applied to google-adk).
- **Protocol-correct reasoning error paths** — on failure the emitters
now close any open frames, emit a generic `RUN_ERROR`, and never emit
`RUN_FINISHED` after `RUN_ERROR`; verified against `@ag-ui/client`
`verifyEvents` semantics, with red-green tests.
- **`x-aimock-context` propagation** across spring-ai's async hop, so
fixture replay stays correct through the thread boundary.
- **Bounded reasoning executor** (no unbounded thread growth) and
**parse-failure observability** (failures surface in logs instead of
being swallowed).
- **Full multi-turn history threading** in the reasoning agents — prior
turns are now forwarded to the LLM, with single-turn byte-equality
preserved so existing aimock fixtures stay valid; covered by tests.
- **Phantom deps declared** — `@copilotkit/shared`/`@ag-ui` deps that
were imported but undeclared in claude-sdk-python and
ms-agent-dotnet/python are now in their `package.json`.
- **`@copilotkit/core` `"latest"` overrides pinned** to `1.59.4`.
- **Reasoning parity token-identity test** across the 3 ported Python
integrations (ag2/crewai-crews/langroid) so their reasoning streams
can't silently drift.
- **Ratchets tightened/updated**: shadow-collision ceiling ratcheted
down 151 → 123 (actual count), duplicate-fixture ceiling 288 → 290 (new
google-adk fixtures reuse standard prebuilt-probe pills,
runtime-disambiguated by demo route), and the `validate-pins` baseline
drops 57 → 48 (currency bumps retire 9 exact-pin FAIL lines).

The final commit is the `style: auto-fix formatting` bot commit
(formatting on the new Python test files).

## Test plan

- [x] Per-integration browser verification (each touched integration's
demos exercised end-to-end) with aimock fixtures added/updated.
- [x] crewai pytest — 113/113 pass.
- [x] `showcase/scripts` vitest — 1780/1780 pass.
- [x] `validate-parity` MUST checks — 19/19 pass, 0 fail.
- [x] `validate-pins` ratchet — exits 0 against the updated baseline
(FAIL-set hash matched).
- [x] D6 `gen-ui-custom` cells verified live (google-adk + agno).
- [x] CI fully green — per-integration Depot Docker `build-check`,
Python unit tests (3.10 + 3.12), commitlint, format, oxlint, Validate
Showcase, production-pinning lint.

## Follow-ups

Consolidated follow-up ledger (bucket c/d items):
https://www.notion.so/copilotkit/37b3aa38185281e5b871d0b907aaef71
2026-06-10 07:28:35 -07:00
Jordan Ritter 2dbecf5f93 test(showcase): reasoning error-path, history, and parity coverage + forwarded-props agent stub 2026-06-10 07:11:25 -07:00
Jordan Ritter 8c31efcfa7 docs(showcase): accurate reasoning/demo comments and docstrings 2026-06-10 07:11:25 -07:00
Jordan Ritter bb3dc3e48f fix(showcase): empty-run diagnostics and content-coercion hardening in reasoning agents 2026-06-10 07:11:25 -07:00
Jordan Ritter 687c749779 fix(showcase): thread full conversation history through reasoning agents 2026-06-10 07:11:25 -07:00
Jordan Ritter c98dcf28d5 fix(showcase): spring-ai robustness — aimock header hop, bounded executor, parse-fail logging, threadId fallback 2026-06-10 07:11:25 -07:00
Jordan Ritter e46913d557 fix(showcase): protocol-correct reasoning error paths (frame close, generic RUN_ERROR, no RUN_FINISHED after RUN_ERROR) 2026-06-10 07:07:26 -07:00
Jordan Ritter 82cfa4ccd6 fix(showcase): guard reasoning user-input extraction against non-string content
_extract_user_input in the ag2, crewai-crews, and langroid reasoning agents
documented a str return but passed AG-UI message content straight through.
Multimodal content can be a list of parts, which would flow unmodified into
the single caller in each file (_run_reasoning_agent ->
messages=[{"role": "user", "content": user_input}]) sent to the OpenAI
chat-completions API. Coerce: str passes through, a list joins its text
parts (dict or attr form), anything else falls back to str().

Callers (one per file):
- ag2/src/agents/reasoning_agent.py:104 -> chat message at :119
- crewai-crews/src/agents/reasoning_agent.py:108 -> chat message at :123
- langroid/src/agents/reasoning_agent.py:103 -> chat message at :118
2026-06-10 07:07:11 -07:00
Jordan Ritter 84f7299024 fix(showcase): harden copilotkit route error responses (no message/stack leak, errorId correlation) 2026-06-10 07:07:03 -07:00
Jordan Ritter f60b68b925 chore(showcase): keep google-adk interrupt-headless unsupported (needs aimock customEvents + ADK interrupt route)
(cherry picked from commit aac16af8ee32172e6886a83bf66931c54091f180)
2026-06-10 07:06:55 -07:00
Jordan Ritter 0015075b51 feat(showcase): port gen-ui-interrupt demo to google-adk (Strategy-B parity)
(cherry picked from commit 6cf8fb2f3f7008be82fc2dd012456907b2572265)
2026-06-10 07:06:55 -07:00
Jordan Ritter 4dbd520c2d feat(showcase): port threadid-frontend-tool-roundtrip demo to google-adk (parity)
(cherry picked from commit 269cce835e9e92743b565ffd6ace91f73419c6dc)
2026-06-10 07:06:55 -07:00