Bump the canonical CopilotKit pin across all showcase integrations + shell
to 1.61.2 (canonical-pins.json, every package.json + package-lock.json),
which carries CopilotKit#5611: passing a catalog to the provider
(`<CopilotKit a2ui={{ catalog }}>`) now auto-enables A2UI and defaults tool
injection on, so the runtime no longer needs an explicit `a2ui` config.
Demonstrate the feature on the A2UI dynamic (declarative-gen-ui) demos by
removing the now-redundant runtime `a2ui` block (`injectA2UITool: true` +
`defaultCatalogId`) from:
- langgraph-python, langgraph-fastapi, langgraph-typescript
- strands, strands-typescript
- google-adk
The forwarded catalog supplies its own catalogId (sdk-js A2UI middleware
auto-derives `defaultCatalogId` from it), so the previous "Catalog not found"
fallback no longer applies.
Verified: validate-pins drift ratchet unchanged (38 / same hash);
langgraph-python D6 `gen-ui-declarative` green end-to-end (no Catalog-not-found).
Bump every @copilotkit/* dependency across the showcase integrations and
the shell from 1.60.2 (and stray "latest" override pins) to an exact
1.61.1 pin, and move the canonical pin source of truth to match.
Regenerate each standalone npm package-lock.json with the same
--legacy-peer-deps flag the Dockerfiles use for "npm ci".
- showcase/integrations/*/package.json + package-lock.json
- showcase/integrations/langgraph-typescript/src/agent/*
- showcase/shell/package.json + package-lock.json
- showcase/scripts/showcase-canonical-pins.json: canonical 1.60.2 to 1.61.1
aimock stays on its own version line (1.26.1). The Python copilotkit SDK
was already 0.1.94 across every requirements.txt, so no change there.
validate-pins ratchet is unchanged (FAIL=38, identical hash);
validate-parity, validate-fixture-tool-surface, and the showcase/scripts
vitest suite (2102 tests) all pass.
Aligns dependency versions across all 19 showcase integrations to current
released minor versions for the 1.60.2 release cycle.
Package families:
- @copilotkit/{a2ui-renderer, react-core, react-ui, runtime, shared, sdk-js, voice}
1.59.4 -> 1.60.2 (18 integrations already staged; ms-agent-harness-dotnet
catches up from 1.57.2)
- @ag-ui/{client, core, encoder} 0.0.55 -> 0.0.57
- @ag-ui/mastra 0.2.1-beta.2 -> 0.2.4 (stable on 0.x; 1.0.x major held back)
Includes the previously-missed ms-agent-harness-dotnet integration in the
@copilotkit/* bump, plus the @copilotkit/web-inspector override pin.
Lockfile-only reconciliation via npm install --package-lock-only
--legacy-peer-deps (cmdk@0.2.1 pre-existing react^18 peer-dep is unaffected).
Bump canonicalCopilotKitVersion 1.59.2 -> 1.59.4 and pin every
integration's @copilotkit/* to 1.59.4 (locks regenerated). Keeps the
whole showcase on one version instead of letting the langgraph A2UI
demos deviate. Existing per-slug overrides (built-in-agent pkg.pr.new,
ms-agent-harness-dotnet 1.57.2) unchanged.
Lockfiles committed in 8ba692c42 were generated inside the monorepo
while pnpm's hoisted node_modules tree was present. npm-arborist
resolved transitive deps against pnpm's symlinks and wrote ~40
`../../../node_modules/.pnpm/...` paths into each lockfile's
`packages` map.
npm 10 can parse the JSON, but its arborist bombs out walking the
tree at those pnpm-relative entries with the misleading error:
npm error code EUSAGE
npm error The `npm ci` command can only install with an
npm error existing package-lock.json or npm-shrinkwrap.json
npm error with lockfileVersion >= 1.
`npm install --dry-run` surfaces the real cause:
Cannot read properties of undefined (reading 'extraneous')
A fresh lockfile generated in an isolated container works.
- broken: 1259 packages, 43 with `../../../node_modules/.pnpm/...`
- fresh: 1321 packages, all `node_modules/...` paths
This commit regenerates every integration's lockfile inside an
isolated `node:22-slim` container via `npm install
--package-lock-only --legacy-peer-deps` and verifies with `npm ci`.
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.
Recent feature commits added new dependencies to integration package.json
files (@copilotkit/voice, @hashbrownai/{core,react}, @json-render/{core,react})
and bumped Next.js from 15.4.10 to 15.5.15, but never regenerated the
corresponding package-lock.json. The Showcase Build & Deploy workflow runs
`npm ci --legacy-peer-deps` which strictly enforces lock sync, so every
deploy attempt has been failing at the install step. No new images have been
pushed to GHCR, so Railway services have stayed on stale code and any cell
added since each fw's last successful deploy iframes 404.
Regenerated all 18 lockfiles via `npm install --legacy-peer-deps
--package-lock-only --ignore-scripts` per integration. Verified each with
`npm ci --dry-run --legacy-peer-deps` — all clean.
Refs PDX-90.
The showcase framework directories better reflect their role as
integration examples rather than distributable packages.
Renames showcase/packages/ -> showcase/integrations/ and updates
the test docker-compose file reference accordingly.