Commit Graph

4085 Commits

Author SHA1 Message Date
Sam Julien 7701495710 ci(docs-sync): exclude shell-docs deliberate-deletion paths from upstream sync
The docs-sync workflow propagates upstream docs/content/docs/** changes
into showcase/shell-docs/src/content/docs/**. When shell-docs has
deliberately deleted/restructured pages, the existing PATH_EXCLUSIONS
mechanism prevents re-introduction.

PR #4771 surgical review surfaced 5 deliberate-deletion paths missing
from the exclusion list:

- (root)/index.mdx + (root)/quickstart.mdx — collapsed into a single
  shell-docs '/' route in commit 8adbebd30 ('merge docs landing +
  /quickstart picker').
- (root)/prebuilt-components.mdx — top-level single-file version is
  duplicative of the prebuilt-components/ directory + index.
- integrations/{langgraph,microsoft-agent-framework}/index.mdx —
  framework landing files collapsed into the canonical /<fw>/ route in
  commit d1cd9f06a ('collapse framework landing into shell').

Adding these to PATH_EXCLUSIONS so future docs-sync runs don't re-flag
them as upstream-wins conflicts.
2026-05-13 09:35:23 -07:00
Sam Julien 8e1d969ec3 revert(shell-docs): drop architectural reverts from auto-sync; keep content updates
Surgical pass on the bot's docs-sync (ad4ea35c2). Applied on top of the
bot's commit as a corrective revert so the original push history is
preserved.

Drops (9 files entirely):
- docs/index.mdx, docs/quickstart.mdx, docs/prebuilt-components.mdx
  (deliberately deleted/shimmed in 8adbebd30 'merge docs landing + /quickstart picker')
- docs/integrations/langgraph/index.mdx, docs/integrations/microsoft-agent-framework/index.mdx
  (deleted in d1cd9f06a 'collapse framework landing into shell')
- docs/reference/v2/{index,components/CopilotChat,components/CopilotKit,hooks/useCopilotKit,hooks/useThreads}.mdx
  (canonical reference path is src/content/reference/, not docs/reference/v2/)

Partial reverts (selective hunks in otherwise-taken files):
- @copilotkit/react-core/v2 → @copilotkit/react-core regression backed out
  across integration quickstarts + observability snippet (v2 hooks/components
  require /v2 subpath)
- 'Enterprise Intelligence Platform' → 'CopilotKit Intelligence Platform'
  brand regression backed out in shared/premium/self-hosting.mdx
- Several -69 / -95 line content destructions backed out in shared-state.mdx,
  generative-ui/a2ui.mdx, threads.mdx
- Duplicate Free-course callouts backed out in state-rendering.mdx,
  display-only.mdx
- Path rewrites to non-existent /learn/generative-ui/specs/* backed out in
  snippets/shared/generative-ui-specs-overview.mdx + a2ui.mdx
- <ThreadsEarlyAccess> wrapper restored in threads.mdx +
  snippets/shared/threads/threads.mdx; obsolete /reference/v2/hooks/useThreads
  link reverted to /reference/hooks/useThreads

Takes (31 files of legit content updates, retained as-is from bot):
- OpsPlatformCTA cards on a2a/ag2/built-in-agent/crewai-flows quickstarts +
  langgraph/prebuilt-components
- Free DeepLearning.AI course callouts on mcp-apps, open-generative-ui,
  tool-rendering
- Integration quickstart fixes: missing imports, port, npm install react-ui,
  styles.css /v2 path, LangChain→LangGraph naming, LangGraphAgent subpath
- /premium/threads → /threads URL fix in copilot-runtime + backend/ag-ui
  snippets
- hook-explorer v2-column fix; deepagents/shared-state v2-path fix
- Structured tables + chart-version note in self-hosting snippet
- Net-new docs/react-native.mdx (needs meta.json wiring follow-up)
2026-05-13 09:28:34 -07:00
Sam Julien 040392416f fix(showcase/google-adk): add missing voice-runtime + transcription-service-guard region markers
The /voice MDX page references two snippet regions on the google-adk
voice demo (voice-runtime, transcription-service-guard) that resolved to
yellow "Missing snippet" boxes in the Phase 4 audit because the markers
were never added to the demo source and the voice route was missing from
the manifest's highlight list.

- Wrap GuardedOpenAITranscriptionService and the V2 CopilotRuntime setup
  in src/app/api/copilotkit-voice/[[...slug]]/route.ts with the matching
  @region markers, mirroring claude-sdk-python / langgraph-python.
- Replace the stale voice highlight list in manifest.yaml so the voice
  route file and sample-audio-button.tsx are bundled and scanned for
  regions, matching the other integration manifests.

Pre-cutover fix to clear the last two yellow boxes on /google-adk/voice.
Bundler regeneration confirms google-adk::voice now exposes 4 regions
(voice-page, sample-audio-button, voice-runtime, transcription-service-guard).
2026-05-13 09:18:08 -07:00
Ben Taylor db9815d015 fix(shell-docs): route /unselected/* to /built-in-agent/* not / (#4788)
## Summary

Phase 4 validation surfaced 13 broken redirects under the
`/unselected/*` tree. They were dropping users (and SEO equity from
indexed legacy URLs) at the framework-agnostic root pages (e.g.
`/prebuilt-components`) instead of the BIA-scoped equivalents (e.g.
`/built-in-agent/prebuilt-components`).

## Root cause

`next.config.ts` `redirects()` runs at the Next.js routing layer,
**before** middleware. So any rule it matches preempts the
`seo-redirects.ts` catalog. The existing `/unselected/*` catch-all in
`next.config.ts` stripped the prefix (`/unselected/foo` → `/foo`),
regardless of what the seo-redirects catalog specified for BIA-scoped
destinations.

## Changes

`showcase/shell-docs/next.config.ts`:

- `/unselected` (root): destination `/built-in-agent` (was `/`)
- `/unselected/:path*` catch-all: destination `/built-in-agent/:path*`
(was `/:path*`)
- Added 14 explicit slug-rename entries above the catch-all, mirroring
`SUBPATH_RENAMES` in `seo-redirects.ts` (S1–S15, minus S13 which is
handled implicitly):
  - `agentic-chat-ui` → `prebuilt-components`
  - `use-agent-hook` → `programmatic-control`
  - `frontend-actions` → `frontend-tools`
  - `vibe-coding-mcp` → `coding-agents`
- `generative-ui/{agentic,render-only}` →
`generative-ui/your-components/display-only`
- `generative-ui/{backend-tools,tool-based}` →
`generative-ui/tool-rendering`
  - `generative-ui/frontend-tools` → `frontend-tools`
-
`custom-look-and-feel/{bring-your-own-components,customize-built-in-ui-components,markdown-rendering}`
→ `custom-look-and-feel/slots`
  - `guide` → `guides`
  - `mcp` → `coding-agents`

The pre-existing per-path entries for
`/unselected/{quickstart,server-tools,mcp-servers,...}` are unchanged —
they already routed correctly to `/built-in-agent/*`. Same for the
`unselected/ag-ui` → `/backend/ag-ui` and `unselected/copilot-runtime` →
`/backend/copilot-runtime` special cases.

## What's NOT changed (intentionally)

- `/unselected/agent-app-context` → `/` kept as-is. The comment in
next.config notes "agent-app-context was concept-per-framework only; no
canonical root home." Genuine product call, not a redirect bug.
- `/copilot-suggestions` → `/` and other non-`/unselected/*`
catalog/next.config conflicts left alone. Those reflect deliberate
product decisions ("orphaned broken stub") that the catalog hasn't
caught up with — separate cleanup.

## Test plan

- [ ] Build succeeds
- [ ] After deploy, re-run Phase 4 redirect catalog probe —
`unselected/*` failures should drop from 13 to 0
- [ ] Manual spot-check: `curl -sIL
https://docs.showcase.copilotkit.ai/unselected/agentic-chat-ui` → final
URL `/built-in-agent/prebuilt-components`, status 200
- [ ] Manual spot-check: `curl -sIL
https://docs.showcase.copilotkit.ai/unselected/some-random-path` →
`/built-in-agent/some-random-path` (catch-all path)
2026-05-13 10:47:10 -05:00
Alem Tuzlak 9df97ee23b fix(showcase): refresh validate-pins ratchet hash after ADK demo set shift
The previous commit fixed the universal ADK loop + agent renames + A2UI
shape, which changed the pin-status of ~half of the google-adk demos in
the validate-pins matrix. Total FAIL count is unchanged at 95 (no
regression elsewhere), but the SET of failing tuples drifted, which the
ratchet correctly caught.

Updates validatePinsFailHash to the new sorted-failing-set SHA from the
CI run (62e06e1e...0b04d5e0). No baseline count change — `_comment`
explicitly forbids raising the count without sign-off.
2026-05-13 17:19:28 +02:00
Alem Tuzlak 9fa1e2e0fa test(showcase/google-adk): regression coverage for loop, A2UI v0.9, agent IDs
Pins the three classes of bug from the parent commit at the unit level so
the next refactor fails CI instead of crashing in the browser.

- test_stop_on_terminal_text.py (8 tests): truth table for the universal
  loop terminator — terminate on final text-only model response, never
  terminate on mixed text+function_call or partial streams, log-and-degrade
  when ADK's private _invocation_context is missing.

- test_a2ui_v09_shape.py (17 tests): pins build_a2ui_operations_from_tool_call
  to the v0.9 nested shape (createSurface / updateComponents /
  updateDataModel with version: "v0.9" and path+value, NOT flat type+data),
  the sanitize step that drops empty / missing-id / missing-component
  entries, the has_root_component validator, and the unstringify path that
  parses Gemini's stringified-JSON data fields back to real arrays.

- test_agent_id_alignment.py (4 tests): harvests every demo page.tsx for
  agent / agentId props and asserts each ID is exposed by at least one
  route.ts agents map (the main /api/copilotkit agentNames list or a
  dedicated route's agents: {...} block). Pins the dashed form for
  hitl-in-chat / frontend-tools-async / prebuilt-popup so the next rename
  drift breaks the test, not the chat. Cross-checks that the main route's
  agentNames is a subset of registry.AGENT_REGISTRY.

- test_after_model_modifier.py: removed two tests that asserted the old
  SalesPipelineAgent name-gate. The gate was lifted out when the loop
  terminator became universal; equivalent behavior coverage now lives in
  test_stop_on_terminal_text.py.

29 new tests + 23 retained from the existing suite, all passing.
2026-05-13 17:14:13 +02:00
Alem Tuzlak 4670d25a78 fix(showcase/google-adk): break Gemini tool loop, align agent IDs, A2UI v0.9 shape
Brings the Google ADK showcase back to parity with the langgraph-python
north-star across the 14 issues catalogued in PR #4792's TL;DR. Four
independent classes of bug fixed; all 36 demos now route, terminate, and
render correctly against real Gemini.

1. Universal Gemini infinite tool loop
   ADK's LlmAgent does not naturally terminate after a tool result with
   Gemini 2.5-flash — every backend or frontend tool fired forever. Lifted
   the (orphaned) `simple_after_model_modifier` from agents/main.py into
   shared_chat.stop_on_terminal_text without the SalesPipelineAgent
   name-gate; wired it as `after_model_callback=` into every registered
   LlmAgent (22 dedicated agents plus the build_simple_chat_agent /
   build_thinking_chat_agent factories). simple_after_model_modifier is
   kept as a thin alias so the existing test file keeps resolving.

2. Stale @ag-ui/client trapped on deprecated event names
   ag_ui_adk v0.6.1 emits the canonical REASONING_* events but the
   integration's package.json pinned `@ag-ui/client: ^0.0.43` which under
   npm's pre-1.0 caret rule resolves to strictly 0.0.43 — a version that
   only knows the deprecated THINKING_* names. Every Gemini response
   tripped the runtime's Zod discriminator. Bumped to ^0.0.53 and
   regenerated the lockfile.

3. Frontend agent IDs out of sync with backend mounts
   page.tsx for hitl-in-chat / frontend-tools-async / prebuilt-popup
   declared underscored agent IDs that didn't appear in the runtime's
   agent map, so useAgent threw "Agent not found after runtime sync"
   and the React tree crashed. Renamed to the dashed form that matches
   the registry. MCP Apps had the same class of bug at the route level —
   copilotkit-mcp-apps/route.ts pointed HttpAgent at /mcp_apps but the
   FastAPI mount is /mcp-apps; fixed to dash.

4. A2UI ops in deprecated v0.8 flat shape
   tools/generate_a2ui.py:build_a2ui_operations_from_tool_call,
   tools/search_flights.py, and agents/a2ui_fixed_agent.py emitted
   `{type: "create_surface", surfaceId, ...}` (flat). The
   @ag-ui/a2ui-middleware matcher only walks the v0.9 nested keys
   (`{createSurface: {surfaceId, ...}}`), so every op was grouped under
   the fallback "default" surface and the renderer threw
   `Catalog not found: default` or
   `Component 'undefined' is missing an 'id'`. Rewrote to v0.9 nested
   shape with `version: "v0.9"` and `updateDataModel` using `path` +
   `value` (matching copilotkit.a2ui Python helper).

   Three follow-on fixes in agents/main.py and beautiful_chat_agent.py
   that surfaced once the structural fix landed:
   - _AGENT_NAME_TO_CATALOG_ID table + _resolve_pinned_catalog_id helper:
     Gemini hallucinated catalog IDs because the schema for catalogId
     was unconstrained; the north-star hardcodes CUSTOM_CATALOG_ID per
     agent file, mirrored here with a name to id table so one shared
     generate_a2ui dispatches per demo.
   - Tightened parametersJsonSchema for components.items to require
     id + component AND explicitly declare the optional text / label /
     value / children / child / data props. Gemini's structured-output
     path drops fields not in the schema even with default
     additionalProperties: true, which produced [{}, {}, {}].
   - Hard-requirements prompt prefix with a concrete PieChart example
     ported from langgraph-python's _GENERATE_A2UI_PROMPT_HEADER, plus
     _sanitize_a2ui_components / _has_root_component validators and
     _unstringify_json_fields to round-trip Gemini's quirk of emitting
     "data": "[{...}]" as a JSON string instead of an actual array.

Windows note: the integration's tools/ symlink does not materialize on
Windows worktrees (git stores it as mode 100644). The local copies under
showcase/integrations/google-adk/tools/ are kept byte-identical to the
canonical sources under showcase/shared/python/tools/. On Linux/macOS
where the symlink works, only the shared/ copy is authoritative.
2026-05-13 17:11:16 +02:00
Tyler Slaton 546f5f31ee Merge branch 'main' into tyler/distracted-mahavira-f58182 2026-05-12 22:05:14 -07:00
Tyler Slaton 2f7df90a02 fix(showcase/google-adk): unbreak shell build + ratchet validate-pins to 95
CI surfaced two issues with PR #4792:

1. shell/shell-dojo/shell-docs build-check: the bundler walks the
   manifest's `highlight:` list when bundling demo source for the
   shell's Code tab. Three paths were stale after the parity blitz
   restructured the demos:
   - chat-slots: custom-welcome-screen.tsx → slot-wrappers.tsx (LP's
     current highlight; the old file was replaced when chat-slots was
     ported to LP's Slot Atlas pattern)
   - headless-complete: message-list.tsx → chat/chat.tsx (file moved
     into the chat/ subdir during the LP-verbatim port)
   - declarative-hashbrown: copilotkit-byoc-hashbrown/route.ts →
     copilotkit-declarative-hashbrown/route.ts (route dir was renamed
     when the slug went byoc → declarative)

2. Validate Showcase: validate-pins is a drift ratchet — pin failure
   count can only decrease. Pinning google-adk's frontend +
   ag-ui-adk dropped the count from 98 → 95. Update baseline so the
   improvement locks in.

Verified locally with a script that walks every demo's `highlight:`
list and checks each path resolves on disk.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 21:50:35 -07:00
github-actions[bot] 204f2fc7ec style: auto-fix formatting 2026-05-13 04:43:51 +00:00
Tyler Slaton 8966ef4f91 chore(showcase/google-adk/declarative-{hashbrown,json-render}): sed internal URL refs to declarative-*
QA3's sed pass missed making it into the consolidated commit. Landing
now so the e2e specs target the demo's current URL after the
byoc→declarative rename.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 21:41:06 -07:00
Tyler Slaton e6e50165e4 fix(showcase/google-adk/declarative-{hashbrown,json-render}): pull LP-verbatim page + suggestions
QA3's `byoc-hashbrown/page.tsx` (which got renamed into the
declarative-hashbrown dir during the orchestrator pass) imported a
`useHashBrownMessageRenderer` hook that doesn't exist in any
`hashbrown-renderer.tsx` — neither LP's nor the one we already had —
which broke the Next.js prerender step with `(0 , d.useHashBrownMessageRenderer) is not a function`.
The QA agent had drafted a custom page.tsx that diverged from LP's
canonical version. Per north-star rule, replaced both page.tsx +
suggestions.ts with LP-verbatim for both demos.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 18:02:29 -07:00
Tyler Slaton ef1ca9808c feat(showcase/google-adk): QA-blitz parity ports — agent prompts, tool surface, e2e specs
Result of 10 parallel QA agents auditing all 30 active demos against
langgraph-python (north-star). Each agent ported drift back to LP-verbatim
across three axes:

1. Agent layer
   - tool_rendering_common.py: rebuilt to LP's surface — get_weather,
     search_flights(origin, destination), get_stock_price, roll_d20,
     roll_dice. Removed the ADK-only query_data.
   - tool_rendering_*_agent.py (4 variants): ported LP's travel/concierge
     prompt; reasoning-chain variant got LP's chain-two-tools prompt.
   - beautiful_chat_agent.py: ported LP's per-tool system prompt; added
     manage_sales_todos / get_sales_todos / generate_a2ui; dropped the
     redundant schedule_meeting (frontend HITL handles it).
   - open_gen_ui_agents.py: ported LP's full SYSTEM_PROMPT for both
     variants, including the Websandbox.connection.remote.* contract
     for the advanced sandbox demo (was `window.sandbox.*`, which the
     LP frontend's Websandbox bridge silently no-ops).
   - byoc_agents.py: fused LP's hashbrown + json-render prompts so the
     single ADK byoc_agent emits both wire shapes. Aliases exported for
     a future per-route split.
   - declarative_gen_ui_agent.py: ported LP's a2ui_dynamic SYSTEM_PROMPT.
   - a2ui_fixed_agent.py: picked up LP's #4734 regression guard
     ("exactly ONCE", "do NOT call again").
   - agent_config_agent.py: rewrote to read useAgentContext (was
     state["config"]); reconciled schema to LP's 3-field camelCase
     {tone, expertise, responseLength} with LP's value enums.
   - subagents_agent.py: dropped the "running" placeholder; returns
     plain str so the LP-verbatim frontend's `result?.trim()` works.
   - hitl_in_app_agent.py / hitl_in_chat_book_call_agent.py: prompts +
     tool-result shape ({approved, reason}) aligned to LP.
   - AGUIToolset() added wherever it was missing on the bespoke agents
     (multimodal, mcp_apps, a2ui_fixed) so frontend-registered tools
     reach the model.

2. Dedicated runtime routes
   - copilotkit-multimodal/route.ts (new) — mirrors LP shape with
     ADK's HttpAgent + AGENT_URL pattern.
   - copilotkit-agent-config/route.ts (new) — same pattern.
   - copilotkit-mcp-apps/route.ts — refreshed.

3. Frontend ports (ADK frontend brought to LP-verbatim where it had
   drifted from the parity blitz state)
   - tool-rendering family (4 demos): full re-port — WeatherCard,
     FlightListCard, StockCard, D20Card, ReasoningBlock, CatchallRenderer,
     suggestions, and the page wiring with all useRenderTool /
     useDefaultRenderTool / reasoningMessage registrations.
   - a2ui-fixed-schema, mcp-apps, multimodal: full frontend re-ports
     with their _components/ Tailwind primitives.
   - frontend-tools, frontend-tools-async, agent-config: ported LP's
     component structure (separate Background, NotesCard with query_notes,
     config-context-relay).
   - shared-state-read, shared-state-read-write, readonly-state-agent-context:
     ported LP's demo-layout + _components + suggestions. recipe-card.tsx
     pulled directly from LP (one QA agent had adapted to Unicode glyphs
     thinking ADK lacked lucide-react — it doesn't, after the parity blitz).
   - shared-state-streaming, subagents, hitl-in-app: ported LP's
     DocumentView / supervisor-activity / TicketsPanel structure.
     hitl-in-app/page.tsx pulled directly from LP to keep the hyphenated
     agent slug aligned with the renamed registry key.
   - auth, hitl-in-chat: ported LP's SignInCard-first auth UX and the
     time-picker Tailwind port.
   - prebuilt-popup: pulled LP's main-content + suggestions split.

4. Test fixtures
   - 30 tests/e2e/<slug>.spec.ts ported from LP, several overwriting
     stale stubs (shared-state-streaming, subagents, auth, hitl-in-chat,
     shared-state-read, agent-config).
   - 30 qa/<slug>.md ported from LP with ADK env-var and registry
     references substituted (GOOGLE_API_KEY, AGENT_URL, registry.py).
   - QA3's byoc-hashbrown / byoc-json-render specs renamed to
     declarative-hashbrown / declarative-json-render with internal
     URL references substituted (the orchestrator pass had already
     renamed the demo dirs + manifest entries).

Frontend changes from QA agents were filtered: kept where they ported
LP-verbatim into ADK, replaced with direct LP pulls where the agent
had made ADK-specific adaptations (one Unicode-glyph case, one
stale-registry-slug case).

Not touched per blitz rules: shared_chat.py, registry.py, manifest.yaml,
src/app/api/copilotkit/route.ts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:58:06 -07:00
github-actions[bot] df905840a3 style: auto-fix formatting 2026-05-13 00:47:46 +00:00
Sam Julien 65eeebb6f0 fix(shell-docs): route /unselected/* to /built-in-agent/* not /
The next.config redirects() block runs at Next.js routing time (before
middleware), so it preempts the seo-redirects.ts catalog rules. The
existing catch-all dropped users at the framework-agnostic root tree
(/agentic-chat-ui, /frontend-tools, etc.) instead of the BIA-scoped
equivalent (/built-in-agent/...), diffusing SEO equity from legacy
/unselected/ URLs.

Changes:
- /unselected (root): destination /built-in-agent (was /)
- /unselected/:path* catch-all: destination /built-in-agent/:path* (was /:path*)
- Add 14 explicit slug-rename entries above the catch-all, mirroring
  SUBPATH_RENAMES in seo-redirects.ts (S1-S15 minus S13).

Verified against Phase 4 redirect probe — closes 13 of 22 unselected/
failures.
2026-05-12 17:46:12 -07:00
Tyler Slaton ac36b01aed feat(showcase/google-adk/open-gen-ui+beautiful-chat): port agent prompts, tool surface, and e2e specs
- open_gen_ui_agents.py: port LP's minimal + advanced system prompts
  verbatim. Advanced prompt now tells Gemini to call
  `Websandbox.connection.remote.<fn>` (matching the LP frontend's
  websandbox bridge — the prior `window.sandbox.*` prompt produced UIs
  that silently no-op'd) and includes the full sandbox-iframe restriction
  set (no `<form>`, no `type="submit"`, addEventListener / keydown only),
  CDN script guidance, and the return-shape contract.
- beautiful_chat_agent.py: add `manage_sales_todos`, `get_sales_todos`,
  and `generate_a2ui` (mirrors `agents/main.py.generate_a2ui` — forced
  Gemini tool call, full `_A2uiError` shape) so the Task Manager and
  Sales Dashboard pills exercise their backend tools end-to-end. Drop
  `schedule_meeting` — the frontend handles meeting scheduling via the
  `scheduleTime` `useFrontendTool` HITL renderer.
- Copy LP's `tests/e2e/{open-gen-ui,open-gen-ui-advanced,beautiful-chat}.spec.ts`
  and `qa/{open-gen-ui,open-gen-ui-advanced,beautiful-chat}.md` fixtures
  into the ADK integration, retitled for Google ADK and adjusted for
  ADK env-var names (`GOOGLE_API_KEY`, `AGENT_URL`).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 17:33:54 -07:00
Tyler Slaton 79599de615 revert(showcase/google-adk): remove _clean_schema_for_genai monkeypatch
The schema-strip patch was an incorrect diagnosis. Subsequent end-to-end
testing through the real ADKAgent → Gemini path (curl test below)
confirms nested `required` works fine without any schema stripping:

  $ curl -X POST /gen-ui-tool-based \
      -d '{"tools":[{... "data": {"items": {"required":["label","value"]}}}]}'
  data: {"type":"TOOL_CALL_START","toolCallName":"render_bar_chart"}
  data: {"type":"TOOL_CALL_ARGS","delta":"{\"title\":\"Quarterly Sales\",...}"}
  data: {"type":"TOOL_CALL_END",...}

The original silent-failure observation was a bisection artifact: when
the silent failure first cleared, I credited the monkeypatch — but the
same rebuild had also refreshed `/app/agents/gen_ui_tool_based_agent.py`
with the `AGUIToolset()` addition (Dockerfile COPYs src/agents/ into /app/agents/,
which PYTHONPATH=/app loads ahead of the volume-mounted /app/src/agents/).
The AGUIToolset propagation was the only real fix; the schema-strip was
masking nothing.

Stripping `required` would have dropped semantic information Gemini does
use to constrain tool arg generation, so removing the patch also avoids a
subtle behavior degradation.

The 17-file AGUIToolset propagation from 112e53d9a stays in place — that
is the actual fix for the "demo appears frozen" symptom.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 16:58:38 -07:00
Jordan Ritter f06cca0cb1 feat: add X-AIMock-Strict header propagation across SDKs and integrations (#4773)
## Summary

Per-request `X-AIMock-Strict` header propagation through the full
CopilotKit stack — from Playwright browser contexts through AG-UI to
outgoing LLM API calls. Enables the same aimock instance to serve both
strict fixture-only probes and live demo traffic simultaneously.

- **Harness**: All probe browser contexts send `X-AIMock-Strict: true`
via `extraHTTPHeaders` (9 sites across 5 driver files)
- **Python SDK**: `ContextVar` + `httpx` event hook — incoming
`x-aimock-*` headers forwarded to outgoing LLM calls automatically via
FastAPI integration (covers 12/17 showcase integrations)
- **TypeScript SDK**: `AsyncLocalStorage` + per-call headers merged into
`wrapModelCall` middleware (covers 3 more, 15/17 total)
- **.NET integration**: `AsyncLocal` + ASP.NET middleware +
`PipelinePolicy` stopgap — all 12 agent factories wired through
`CreateOpenAIClientOptions()`. TODO markers for migration to
copilotkit-sdk-dotnet when Microsoft delivers it.
- **Java/Spring integration**: `InheritableThreadLocal` +
`HandlerInterceptor` + `ClientHttpRequestInterceptor` + WebClient
`ExchangeFilterFunction` — covers both RestClient and WebClient paths

## Test plan

- [x] Python SDK: 14 new tests (ContextVar isolation, httpx hook
injection, key lowercasing, warning on bad client), 116 total pass
- [x] TypeScript SDK: 8 new tests (AsyncLocalStorage isolation, header
filtering, concurrent requests), 92 total pass
- [x] Harness: 1590 tests pass (1 pre-existing failure unrelated)
- [x] CR converged: 2 rounds × 14 agents, 6 bucket(a) findings fixed, 0
remaining
2026-05-12 16:54:21 -07:00
Jordan Ritter 18c8acb90d ci(shell-docs): pipe client-side analytics keys through Docker build (#4786)
## Summary

Client-side telemetry on `docs.showcase.copilotkit.ai` was silent. The
shell-docs Dockerfile and `showcase_build.yml` workflow never plumbed
the `NEXT_PUBLIC_*` analytics keys through to `next build`, so the
client JS chunks shipped with empty strings (verified by grepping the
live bundle: `let l = i(95704).env.NEXT_PUBLIC_POSTHOG_KEY` — a runtime
lookup with no inlined value).

Railway runtime env doesn't reach the Docker build phase, so server-side
reads (middleware `POSTHOG_KEY`, server-component canonical URLs) worked
but client-side reads (posthog-js init, RB2B, Scarf, Reo, GA) silently
no-op'd in the browser.

## Changes

- **`showcase/shell-docs/Dockerfile`** — declare `ARG` + `ENV` for
`NEXT_PUBLIC_POSTHOG_KEY`, `NEXT_PUBLIC_RB2B_ID`,
`NEXT_PUBLIC_SCARF_PIXEL_ID`, `NEXT_PUBLIC_REO_KEY`,
`NEXT_PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID` in the builder stage so they
reach `next build`.
- **`.github/workflows/showcase_build.yml`** — add
`build_args_analytics: "yes"` flag to the shell-docs matrix entry;
extend the `Prepare build args` step to emit the five `NEXT_PUBLIC_*`
`--build-arg`s when the flag is set, sourcing values from repo secrets.

Mirrors the existing shell-dashboard pattern (`build_args_pb_url` /
`build_args_shell_url` / `build_args_ops_url`).

## Secrets

Existing repo secret reused: `POSTHOG_PROJECT_KEY`.

New repo secrets required (configured separately in repo settings before
this lands):
- `RB2B_ID`
- `SCARF_PIXEL_ID`
- `REO_PROJECT_KEY`
- `GOOGLE_ANALYTICS_TRACKING_ID`

## Out of scope (intentionally)

- `NEXT_PUBLIC_BASE_URL` is already correctly working via Railway
runtime env (canonical links render with `https://docs.copilotkit.ai`) —
left alone.
- Server-side `POSTHOG_KEY` (no `NEXT_PUBLIC_` prefix) stays on Railway
runtime env; middleware reads it at Edge Runtime.

## Test plan

- [ ] Next build of shell-docs succeeds with new ARGs in scope
- [ ] After deploy, search the live bundle on
`docs.showcase.copilotkit.ai` for the literal `phc_` prefix — must be
present (not `process.env.NEXT_PUBLIC_POSTHOG_KEY` runtime lookup)
- [ ] PostHog Live Events shows `$pageview` (client) and `$autocapture`
arriving from staging
- [ ] RB2B / Scarf / Reo / GA dashboards show events from staging
- [ ] Server-side `seo_redirect` + `docs_pageview` continue firing (no
regression)
2026-05-12 16:43:30 -07:00
Tyler Slaton 112e53d9ae fix(showcase/google-adk): wire AGUIToolset + strip nested-required so gen-UI demos render
Two compounding root causes were silently breaking every generative-UI demo
that depended on frontend-registered tools (useFrontendTool, useComponent,
useHumanInTheLoop):

1) Missing AGUIToolset() in bespoke agents
   The ag_ui_adk middleware injects the frontend's tool registrations by
   *replacing* AGUIToolset instances in the agent's `tools` list with a
   ClientProxyToolset that wraps `input.tools`. If no AGUIToolset is
   present, the frontend tools are dropped silently and the model never
   sees render_bar_chart / render_pie_chart / etc. Bespoke agents (the ones
   built directly with LlmAgent(...) instead of via build_simple_chat_agent
   in shared_chat.py) all had `tools=[]` or `tools=[backend_only]`.
   Appended AGUIToolset() to every bespoke agent.

2) Nested `required` in tool parameter schemas
   Gemini's function-calling API silently rejects function declarations
   whose parameter schema contains a `required` field below the top-level
   object — e.g. on the items.properties of an array, or on a nested
   property's own properties. The Zod-generated schema for render_bar_chart
   has exactly that shape (items.properties with required: [label, value]).
   The model emits no TOOL_CALL_* events, no TEXT_MESSAGE_*, just RUN_STARTED
   → STATE_SNAPSHOT → RUN_FINISHED. ag_ui_adk's _clean_schema_for_genai
   doesn't strip nested required.

   agent_server.py now monkey-patches _clean_schema_for_genai at startup so
   nested `required` is stripped before tool definitions reach the model.
   Top-level required is preserved (Gemini accepts it there). The patch is
   defensive and per-process — no upstream dependency change needed.

Verification: curl test against /gen-ui-tool-based with the LP-shaped tool
schema now emits TOOL_CALL_START + TOOL_CALL_ARGS containing the chart
payload. Browser test renders the bar chart in the chat with Q1/Q2/Q3/Q4
data. Sanity-checked gen-ui-agent (set_steps state-streaming) — fully
working, live "All 3 steps complete" card rendered.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 14:20:53 -07:00
Sam Julien f4e3ee6951 fix(shell-docs): correct REB2B var name (was RB2B_ID, code reads REB2B_KEY)
The previous commit used `NEXT_PUBLIC_RB2B_ID` based on a stale entry
in the cutover plan doc, but `app/layout.tsx:86` reads
`NEXT_PUBLIC_REB2B_KEY`. Without this fix the build-arg would be
piped under the wrong name and the REB2B Script tag would still not
render.
2026-05-12 14:19:02 -07:00
Sam Julien 6eba49c26b ci(shell-docs): pipe client-side analytics keys through Docker build
Client-side telemetry on docs.showcase.copilotkit.ai was silent: the
shell-docs Dockerfile and Showcase Build & Push workflow never plumbed
NEXT_PUBLIC_POSTHOG_KEY / RB2B_ID / SCARF_PIXEL_ID / REO_KEY /
GOOGLE_ANALYTICS_TRACKING_ID through to `next build`. Railway runtime
env doesn't reach the Docker build phase, so the client JS chunks
shipped with empty strings — posthog-js.init etc. silently no-op'd in
the browser.

Mirrors the shell-dashboard pattern: matrix flag triggers the args
block; values come from repo secrets (POSTHOG_PROJECT_KEY already
existed; RB2B_ID, SCARF_PIXEL_ID, REO_PROJECT_KEY,
GOOGLE_ANALYTICS_TRACKING_ID added separately in repo settings).

Server-side telemetry (middleware seo_redirect, docs_pageview) was
unaffected — it reads POSTHOG_KEY at Edge Runtime, which Railway
runtime env satisfies.
2026-05-12 14:09:19 -07:00
Tyler Slaton 5eac8ef7b1 feat(showcase/google-adk): pin CPK packages, retire interrupt demos as not_supported
Two requested changes in one pass:

1. Pin CopilotKit package versions
   - All @copilotkit/* in package.json: "next" → "1.57.1"
     (a2ui-renderer, react-core, runtime, shared, voice)
   - ag-ui-adk in requirements.txt: unpinned → "==0.6.1"
   Verified in the running container: pip shows ag_ui_adk 0.6.1,
   package.json shows the five CPK packages at 1.57.1.

2. Retire interrupt demos (Strategy B was the only available adaptation
   and the user asked for them to show as X in the dashboard):
   - Delete src/app/demos/gen-ui-interrupt/ and interrupt-headless/
   - Delete src/agents/interrupt_agent.py (no other consumers)
   - Drop the registry.py + route.ts entries
   - Move both feature ids from features: into not_supported_features:
     so the dashboard renders them as an explicit grey X (intentional
     opt-out) rather than red ? (unshipped). Drop the corresponding
     demos: entries.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:44:14 -07:00
Tyler Slaton 51c8e0524e fix(showcase/google-adk): port LP body rules so <CopilotSidebar /> pushes content
ADK's globals.css had `html, body { width: 100%; overflow: hidden }` as a
combined rule, which gave <body> a fixed full-viewport width. The CopilotKit
v2 <CopilotSidebar /> docks itself by setting `margin-inline-end` on <body>,
which only shrinks the layout when body's width is free to recompute — a
fixed `width: 100%` defeats the mechanism, so the sidebar ends up overlapping
the page content instead of pushing it.

LP's globals.css splits the rule and intentionally omits `width: 100%` on
<body> (the comment in their CSS explains the exact reason). Port the same
split. Also adds the LP `body[data-scroll-locked]` neutralizer to prevent
Radix overlays from injecting a phantom `padding-right` that would shrink
the page on every dropdown open.

Verified in browser: /demos/prebuilt-sidebar now pushes the "Sidebar demo"
content into the left ~70% of the viewport while the chat takes the right
~30%, matching showcase.copilotkit.ai/integrations/langgraph-python/prebuilt-sidebar.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:39:10 -07:00
Tyler Slaton e714f58a7b feat(showcase/google-adk): add missing shadcn ui primitives (input, select, spinner)
The shared-state-read demo (and others) port from LP imports these
shadcn primitives, but the orchestrator pass missed copying them from
LP's src/components/ui/. Webpack build failed with "Can't resolve
@/components/ui/{input,select,spinner}". Copied verbatim from LP. deps
(lucide-react, radix-ui) already in package.json.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:23:22 -07:00
Sam Julien 80e4adafd7 fix(shell-docs): add missing @types/react-dom devDependency (#4785)
## Summary

PR #4691 introduced `import { createPortal } from "react-dom"` in
`src/components/search-trigger.tsx` but did not add `@types/react-dom`
to `showcase/shell-docs/package.json`'s devDependencies. The Railway
production build fails:

```
./src/components/search-trigger.tsx:4:30
Type error: Could not find a declaration file for module 'react-dom'.
  '/app/shell-docs/node_modules/react-dom/index.js' implicitly has an 'any' type.
```

Local dev was unaffected because the type was being satisfied via
hoisting from a root `node_modules`. The Docker builder installs each
package's deps in isolation, so the type resolution failed.

## Fix

Add `@types/react-dom: ^19.0.0` to shell-docs devDependencies (matches
the existing `@types/react: ^19.0.0` constraint and resolves to the same
major version as the runtime `react-dom: ^19.0.0`).

## Test plan

- [ ] Railway production build succeeds
- [ ] `npx tsc --noEmit` from `showcase/shell-docs/` returns no
`react-dom` errors
- [ ] No regression in local dev
2026-05-12 13:19:25 -07:00
Tyler Slaton 7c3b80e695 feat(showcase/google-adk): reconcile registry, route, manifest for parity blitz
Orchestrator pass after 37 parallel slot ports of google-adk demos to
match langgraph-python (north-star). Slot commits ported each demo's
frontend verbatim; this commit reconciles the cross-cutting wiring that
slot agents were forbidden from touching:

- registry.py: rename agent keys to match LP frontend agent= props
  (10+ underscore→hyphen renames for demos using the main copilotkit
  route; demos with dedicated routes keep their underscored backend
  keys since the dedicated route handles frontend→backend translation).
- route.ts: agentNames array updated to match registry.
- manifest.yaml: features list now matches the demos that actually
  exist; renamed agentic-chat-reasoning→reasoning-custom,
  reasoning-default-render→reasoning-default,
  byoc-hashbrown→declarative-hashbrown,
  byoc-json-render→declarative-json-render; added shared-state-read
  (was a working demo dir but not declared); moved shared-state-streaming
  out of not_supported_features (it works on Gemini Studio via chunk-
  level fallback); retired the standalone hitl demo and the duplicate
  hitl-in-chat-booking entry.
- src/app/demos/hitl/ and src/app/demos/shared-state-write/: deleted
  (orphaned dirs not in LP's surface).
- src/app/page.tsx: integration dev landing — drop deleted demos.
- src/app/demos/prebuilt-sidebar/page.tsx: revert slot 01's
  hyphen→underscore swap; LP's verbatim hyphenated agent= is the
  source of truth (registry was renamed to match).
- shared-state-read agent: registry entry swapped from
  shared_state_read_agent (had a set_recipe tool, turning it into
  read+write) to _simple_chat (matches LP's neutral default agent —
  read-only contract).

Known follow-ups (deferred — tracked separately):
- Tool-rendering family backend: ADK currently exposes
  get_weather + search_flights(flights list) + query_data; LP
  exposes get_weather + search_flights(origin, destination) +
  get_stock_price + roll_d20. The 4 tool-rendering demos render
  correctly for weather but the LP suggestion pills referencing
  stocks and d20 rolls will not produce backend tool calls.
- Subagents agent: emits running/completed/failed; LP frontend
  expects completed-only. Mid-flight rows render as raw badge text.
- Agent-config agent: reads state["config"] but LP frontend now
  publishes via useAgentContext; agent will receive nothing.
- Beautiful-chat agent: missing manage_todos + generate_a2ui tools
  that the LP frontend exercises.
- Open-gen-ui-advanced agent prompt: tells Gemini to call
  window.sandbox.* but the LP frontend wires Websandbox.connection.
  remote.* — generated UIs will reference a nonexistent API.
- gen-ui-interrupt and interrupt-headless: confirmed BLOCKED.
  Gemini/ADK has no interrupt() primitive; the existing ADK Strategy
  B (useFrontendTool with async Promise) is the only available
  adaptation and cannot match LP's useInterrupt 1:1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:19:01 -07:00
Sam Julien 6209f1c209 fix(shell-docs): add missing @types/react-dom devDependency
PR #4691 introduced createPortal from react-dom in search-trigger.tsx
but the shell-docs package was missing @types/react-dom, breaking the
Railway production build with:

  Type error: Could not find a declaration file for module 'react-dom'

Hoisting masks this in local dev, but the Docker builder installs
each package's deps in isolation.
2026-05-12 13:15:43 -07:00
Tyler Slaton 92a48b82df feat(showcase/google-adk/declarative-json-render): rename from byoc-json-render and port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:12:53 -07:00
Tyler Slaton 532198b14c feat(showcase/google-adk/declarative-hashbrown): rename from byoc-hashbrown and port frontend from langgraph-python
Renames the ADK byoc-hashbrown demo to declarative-hashbrown to match the
LP naming, and ports the LP declarative-hashbrown frontend (page + chat +
hashbrown renderer + charts + suggestions + types + metric card) verbatim.

Also renames the dedicated API route from copilotkit-byoc-hashbrown to
copilotkit-declarative-hashbrown, keeping the existing HttpAgent + AGENT_URL
pattern (URL now points at /declarative-hashbrown on the Python backend).

The runtime-side agent ID remains "declarative-hashbrown-demo" (matching
LP); the backend registry / agentNames rename (byoc_hashbrown -> declarative-
hashbrown), the manifest slug rename, and main route.ts agentNames update
are out of scope per the task and are reported separately.
2026-05-12 13:12:52 -07:00
Tyler Slaton e86ecdef66 feat(showcase/google-adk/reasoning-default): rename from reasoning-default-render and port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:12:52 -07:00
Tyler Slaton 99429e6355 feat(showcase/google-adk/reasoning-custom): rename from agentic-chat-reasoning and port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:12:51 -07:00
Tyler Slaton c0a0216a70 feat(showcase/google-adk/hitl-in-app): port frontend from langgraph-python
Copies the hitl-in-app demo verbatim from langgraph-python (north-star):
page.tsx, approval-dialog.tsx, suggestions.ts, tickets-panel.tsx. Updates
the ADK agent instruction to match the LP support-operations prompt and
the {approved, reason} tool-return shape.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:12:51 -07:00
Tyler Slaton 34f53d402a feat(showcase/google-adk/hitl-in-chat): port frontend from langgraph-python
Copy page.tsx and time-picker-card.tsx verbatim from the langgraph-python
north-star demo. Delete README.md (not present upstream). Frontend now uses
agent="hitl-in-chat" / agentId="hitl-in-chat" exactly as LP — registry and
route.ts currently key on "hitl_in_chat", which will need a follow-up
rename to wire end-to-end.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:08:01 -07:00
Tyler Slaton 9d8870a018 feat(showcase/google-adk/open-gen-ui-advanced): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:08:01 -07:00
Tyler Slaton 3c9a6f3eb0 feat(showcase/google-adk/open-gen-ui): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:08:01 -07:00
Tyler Slaton d5f360ebc1 feat(showcase/google-adk/a2ui-fixed-schema): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:08:00 -07:00
Tyler Slaton 6fc8e4859a feat(showcase/google-adk/declarative-gen-ui): port frontend from langgraph-python
Replace the inline-styled brand-palette version with a 1:1 verbatim copy of
the langgraph-python north-star demo: ShadCN-flavoured Card/Badge/Button
primitives under _components/, neutral zinc chart palette, and the
chat.tsx + suggestions.ts split out of page.tsx.

The ADK agent already emits the same a2ui_operations container shape
(via build_a2ui_operations_from_tool_call in agents/main.py) so no
backend changes are needed; the frontend swap is sufficient.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:08:00 -07:00
Tyler Slaton 8ffc94ed6e feat(showcase/google-adk/gen-ui-agent): port frontend from langgraph-python
Copy LP gen-ui-agent demo verbatim: page.tsx now uses InlineAgentStateCard
in messageView.children (subscribing to live state via useAgent v2 +
UseAgentUpdate.OnStateChanged), plus the supporting
InlineAgentStateCard.tsx, message-list-with-state.tsx, suggestions.ts, and
README.md.

Update the ADK gen_ui_agent to emit the same Step shape the LP frontend
reads — {id, title, status} with the three-state lifecycle pending ->
in_progress -> completed, driven by a six-call sequence so the card
animates through every step. Without this, the card would render empty
titles and never show the in_progress marker.

Delete the orphan agent.py stub from the demo dir — the real backend
agent lives in src/agents/gen_ui_agent.py and is wired through the
shared registry.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:08:00 -07:00
Tyler Slaton 070dcd74e0 feat(showcase/google-adk/gen-ui-tool-based): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:02:57 -07:00
Tyler Slaton 43535219bb feat(showcase/google-adk/tool-rendering-custom-catchall): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:02:56 -07:00
Tyler Slaton 184507fa3b feat(showcase/google-adk/tool-rendering): port frontend from langgraph-python
Verbatim copy of the langgraph-python tool-rendering demo frontend to
google-adk: page.tsx + weather-card + flight-list-card + stock-card +
d20-card + custom-catchall-renderer + suggestions + README. Also adds
the _shared/parse-json-result helper required by page.tsx. Removes the
stale agent.py stub and render-flight-tool.snippet.tsx that don't exist
in the LP north-star.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:02:56 -07:00
Tyler Slaton c9b8158049 feat(showcase/google-adk/mcp-apps): port frontend from langgraph-python
Mirror the north-star (langgraph-python) mcp-apps demo verbatim: split the
single-file page.tsx into page.tsx + chat.tsx + suggestions.ts, and switch
the agent identifier from "mcp_apps" to "mcp-apps" to match LP exactly.
Update copilotkit-mcp-apps/route.ts to register the HttpAgent under the
"mcp-apps" key so the LP-verbatim frontend resolves. Delete the demo-local
README.md (no LP equivalent).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:02:55 -07:00
Tyler Slaton 6479439e39 feat(showcase/google-adk/tool-rendering-reasoning-chain): port frontend from langgraph-python
Copy LP's tool-rendering-reasoning-chain frontend verbatim: page.tsx with
useRenderTool registrations for get_weather + search_flights and a
useDefaultRenderTool catchall, plus ReasoningBlock, WeatherCard,
FlightListCard, and CustomCatchallRenderer components. Keeps the LP
agent/agentId values ("tool-rendering-reasoning-chain") as required by
the parity north-star.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:00:16 -07:00
Tyler Slaton f4820a7bc7 feat(showcase/google-adk/tool-rendering-default-catchall): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 13:00:08 -07:00
Tyler Slaton 6782f65d4b feat(showcase/google-adk/multimodal): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 12:57:24 -07:00
Tyler Slaton f6dabeb22f feat(showcase/google-adk/subagents): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 12:57:24 -07:00
Tyler Slaton 5aa55d5a21 feat(showcase/google-adk/shared-state-streaming): port frontend from langgraph-python
Bring shared-state-streaming demo frontend to 1:1 parity with the
langgraph-python north-star: split page.tsx into demo-layout.tsx +
suggestions.ts modules, swap CopilotChat-in-aside for
CopilotSidebar+DemoLayout, and adopt LP's DocumentView styling +
testids (document-view, document-live-badge, document-char-count,
document-content).

The ADK agent (shared_state_streaming_agent.py) is already wired with
streaming_function_call_arguments=True on the ADKAgent middleware and
PredictStateMapping(stream_tool_call=True), so per-token (or chunk-level
fallback on Gemini Studio) state-delta streaming into state["document"]
works end-to-end. The 2026-05-07 not_supported_features bucket was
conservative — the wiring is complete and the LIVE badge / growing
document UX functions even on the chunk-level fallback path.

README adjusted from LangGraph's StateStreamingMiddleware to ADK's
PredictStateMapping + streaming_function_call_arguments wording.

Manifest change needed (not in this commit): remove
shared-state-streaming from not_supported_features and add to features.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 12:57:24 -07:00
Tyler Slaton 9da794112b feat(showcase/google-adk/shared-state-read): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 12:57:23 -07:00
Tyler Slaton 6b5832c31a feat(showcase/google-adk/shared-state-read-write): port frontend from langgraph-python
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 12:57:23 -07:00