Commit Graph

1038 Commits

Author SHA1 Message Date
Jordan Ritter b4a2b279d4 fix(showcase): copy manifest.yaml into frontend Docker stage for strands/spring-ai/llamaindex
The mirrored LGP homepage prerenders / and reads manifest.yaml at build
time; these 3 baselines use an explicit COPY of config files that omitted
manifest.yaml, breaking SSG export (same fix as pydantic-ai in #5125). The
other 6 baselines copy the dir wholesale and already include it.
2026-05-31 10:39:25 -07:00
Jordan Ritter 06e795b8e2 showcase(D6): mirror LGP frontend to 9 baseline integrations
Page-mirror the langgraph-python gold reference (demo pages + _shared/ +
src/components/ui shadcn primitives + src/lib/utils.ts + manifest-driven
homepage) into mastra, agno, langroid, strands, spring-ai, ag2,
crewai-crews, llamaindex, langgraph-fastapi. Align deps to LGP and pin
@copilotkit/* to exact 1.59.2. Backend / API-layer (route.ts, agent
servers, Java/Mastra runtimes) preserved untouched.

Known follow-up: agent-slug conveyance gaps (mirrored LGP demos reference
slugs each integration's route.ts registers under different names) — to be
measured + addressed per integration.
2026-05-31 10:39:21 -07:00
Jordan Ritter c4ce9781f6 showcase: regen nested langgraph-typescript agent lockfile for canonical 1.59.2 2026-05-31 10:13:21 -07:00
Jordan Ritter 03c9b91382 showcase: bump @copilotkit/* in integrations to canonical 1.59.2 2026-05-31 10:13:21 -07:00
Jordan Ritter 2b13cbab38 fix(showcase): pin @copilotkit/* to exact 1.59.2 + re-ratchet validate-pins baseline
Previously pydantic-ai and claude-sdk-typescript used 'latest' for all
@copilotkit/* dependencies (and the @copilotkit/web-inspector pnpm
overrides on @copilotkit/core), which the showcase validate-pins ratchet
counts as non-exact pin drift. Intended design is to pin to exact 1.59.2.

Changes:
- integrations/pydantic-ai/package.json: @copilotkit/{a2ui-renderer,react-core,runtime,shared,voice} 'latest' -> '1.59.2'; npm + pnpm overrides on @copilotkit/web-inspector>@copilotkit/core 'latest' -> '1.59.2'
- integrations/claude-sdk-typescript/package.json: same set as above
- Regenerated both package-lock.json files via npm install --legacy-peer-deps --package-lock-only
- scripts/fail-baseline.json: ratcheted DOWN validatePinsFailCount 106 -> 104; updated validatePinsFailHash to dde7950e8d691de5a7b2c0c16ca64b3e550221cb6072d2c29e24dcb497515cf6 (matches local sort-uniq + shasum-256 of the new [FAIL] set)

Verified locally: npx tsx validate-pins.ts reports Summary FAIL=104
(2 fewer than baseline because pydantic-ai's @copilotkit/react-core and
@copilotkit/runtime moved from 'latest' (non-exact) to '1.59.2' (exact);
CST already had unrelated FAILs that remain). Non-@copilotkit deps
(lucide-react, cmdk, openai, @ag-ui/*) intentionally left unchanged.
2026-05-31 03:02:53 -07:00
Jordan Ritter d630bfa2a0 fix(showcase): resolve CST stale highlight paths in manifest
Four stale highlight paths in claude-sdk-typescript/manifest.yaml referenced
files that don't exist in the demo folders, breaking the shell-docs
bundle-demo-content step:

- chat-slots: custom-welcome-screen.tsx -> slot-wrappers.tsx (mirrors LGP layout)
- gen-ui-tool-based: agent.ts -> bar-chart.tsx (mirrors LGP layout)
- gen-ui-interrupt: time-picker-card.tsx -> _components/time-picker-card.tsx
- headless-complete: tool-renderers.tsx + use-rendered-messages.tsx -> chat/chat.tsx + hooks/use-tool-renderers.tsx (mirrors LGP layout)

Verified locally: scripts/bundle-demo-content.ts now bundles all 695 demos
with 0 failures.
2026-05-31 03:02:40 -07:00
Jordan Ritter 1eefbc3d97 fix(showcase): copy manifest.yaml into pydantic-ai frontend Docker stage
The homepage prerenders / at build time and reads manifest.yaml via the
filesystem, but the frontend stage only copied next.config/tsconfig/postcss.
Without the manifest the SSG export of /page failed with ENOENT, breaking the
Docker build. Copy manifest.yaml alongside the other config files.
2026-05-31 02:38:10 -07:00
Jordan Ritter b1da0e836c Merge branch 'blitz/d6-parity/fix-pyd-deps' into blitz/d6-parity/integration 2026-05-30 21:37:13 -07:00
Jordan Ritter f356a56cf7 Merge branch 'blitz/d6-parity/fix-mafpy-mw' into blitz/d6-parity/integration 2026-05-30 21:37:12 -07:00
Jordan Ritter 44b57c5f25 fix(showcase): align pydantic-ai deps to LGP reference (unblock D6 prod build)
Aligns showcase/integrations/pydantic-ai/package.json to the
langgraph-python reference so the mirrored D6 demo pages can resolve
their shared-UI imports during `next build`.

- @copilotkit/*: 1.59.0 (exact-pinned) -> latest (matches LGP/CST)
- Add overrides + pnpm.overrides for @copilotkit/web-inspector>@copilotkit/core
- lucide-react: ^0.469.0 -> ^1.14.0
- openai: ^4.0.0 -> ^5.9.0
- tailwind-merge: ^2.6.0 -> ^3.5.0
- @playwright/test: ^1.50.0 -> ^1.59.1
- Add cmdk ^0.2.1, embla-carousel-react ^8.6.0, react-markdown ^10.1.0, remark-gfm ^4.0.1
- @ag-ui/client + @ag-ui/core remain at ^0.0.52 (satisfies @copilotkit/shared peer)
- Regenerate package-lock.json

Verified locally: npm install --legacy-peer-deps + npm run build ->
Compiled successfully in 6.9s, Generating static pages (56/56).
2026-05-30 21:36:40 -07:00
Jordan Ritter 6e934a79b7 fix(showcase): add CST copilotkit-beautiful-chat route (was 404)
The claude-sdk-typescript beautiful-chat demo page sets
runtimeUrl="/api/copilotkit-beautiful-chat" but no such Next.js route
existed, so the cell 404'd on every request.

Add a dedicated runtime mirroring pydantic-ai's beautiful-chat route:
openGenerativeUI + a2ui (injectA2UITool: false) + mcpApps middleware
configured together (the canonical LGP combined-runtime shape). Wire
the HttpAgent to CST's pass-through / mount since agent_server.ts has
no dedicated beautiful_chat backend graph — CST is frontend +
middleware driven, matching how mcp-apps is wired.

Also defensively register beautiful-chat in the shared /api/copilotkit
agentNames list so probe requests against the default runtime resolve
cleanly, matching the pattern used by the other dedicated-runtime
demos.
2026-05-30 21:35:07 -07:00
Jordan Ritter 2b05f9edc7 fix(showcase): port universal strip middleware + snake_case tool_calls to ms-agent-python route (D6 fixture parity) 2026-05-30 21:35:04 -07:00
Jordan Ritter dd1495257a fix(showcase): add missing shadcn UI primitives for CST D6 page-mirror
The CST D6 page-mirror imported LGP demo pages but not the shared UI primitives they depend on, causing prod build failures (`Module not found: '@/components/ui/button'`, etc.). Copy LGP's `src/components/ui/` (24 primitives) and `src/lib/utils.ts` verbatim into CST so the mirrored pages resolve. Deps were already present in CST's package.json; regen lockfile after npm install.
2026-05-30 20:26:08 -07:00
Jordan Ritter bd4424bdf6 Merge branch 'blitz/d6-parity/maf-dotnet' into blitz/d6-parity/integration 2026-05-30 20:17:57 -07:00
Jordan Ritter c968445f36 Merge branch 'blitz/d6-parity/maf-python' into blitz/d6-parity/integration 2026-05-30 20:17:57 -07:00
Jordan Ritter 7fc395c3e4 Merge branch 'blitz/d6-parity/pyd-pages' into blitz/d6-parity/integration 2026-05-30 20:17:56 -07:00
Jordan Ritter 811afa9025 fix(showcase): ms-agent-dotnet D6 residuals (toolCallId strip, fixtures, hitl pages)
Address the four residual D6 failures on the ms-agent-dotnet integration
(baseline was 177/5).

route.ts toolCallId strip completeness
- Extend stripReplaySafeToolCallIdsFromMessage to also clean the
  snake_case `tool_calls[].id` array and any nested OpenAI-style
  `function.tool_call_id`. AG-UI canonical uses `toolCalls`, but some
  runtime / message-converter paths emit the OpenAI shape and the
  replay-safe `__ck_run_<uuid>` suffix was leaking through to aimock on
  those paths. Apply the same coverage in applyToolResultDecisionSuffix
  so decision-suffix routing (`__approved` / `__rejected` /
  `__cancelled`) lands on every tool-call shape.
- Add a universal strip middleware in createAgent itself so EVERY
  registered agent (not only the replay-safe ones) clears the suffix
  before the request reaches the backend / aimock. Decision suffixing
  remains scoped to createReplaySafeAgent because the suffix is
  non-idempotent and the inner middleware re-runs the same logic.
- Drop the now-redundant strip calls inside createGenUiAgent,
  createReadonlyContextAgent, createSharedStateReadWriteAgent, and
  createReasoningAgent — the outer createAgent middleware already
  canonicalised inbound messages by the time these run.

chat-slots fixture
- Mirror LGP's turnIndex:1 'Give me a fun fact' entry so the
  chat-slots e2e's second-turn assistant slot has a deterministic
  reply (the bare 'Give me a fun fact' fixture in headless-simple.json
  is turnIndex:0-gated and was never matching chat-slots' turn 1).

HITL reject + interrupt-headless cancel branches
- Add a reject-branch fixture in render-a2ui.json keyed on
  toolCallId `call_d5_generate_steps_001__rejected` so the hitl.spec
  reject-flow's 'will not execute the Mars trip plan' assertion lands
  the right narration. Keep the legacy hasToolResult:true fixture as a
  fallback for paths that don't apply a decision suffix. Add an
  `__approved` variant for symmetry.
- Add cancel-branch fixtures in interrupt-headless.json for both the
  sales-intro and 1:1-with-alice pills, keyed on `__cancelled`
  toolCallIds, returning the Denied/not-booked narration the
  interrupt-headless cancel spec expects.

hitl-in-app + hitl-in-chat demo pages already mirror LGP (only an extra
README.md per directory in this integration), so no page changes were
needed.
2026-05-30 20:17:08 -07:00
Jordan Ritter 4edcd2f129 fix(showcase): ms-agent-python D6 residuals (toolCallId strip, fixtures, hitl pages, multimodal)
Port the replay-safe toolCallId stripping middleware from the ms-agent-dotnet
sibling route.ts so HITL/interrupt demos match toolCallId-keyed aimock
fixtures across the 2nd-turn request. The strip walks every inbound message
(role=tool, role=assistant.toolCalls[].id, toolCallId, tool_call_id) before
the AG-UI HttpAgent forwards them onto the FastAPI backend, and the outbound
event stream rewrites toolCallId on TOOL_CALL_* events to embed the
deterministic per-run suffix so the next turn's fixture matcher still
keys on the original (suffix-stripped) id.

Wraps the human_in_the_loop, interrupt-adapted, hitl-in-app, and
hitl-in-chat agents with the new replay-safe middleware. Adds gen-ui-agent
set_steps state-snapshot synthesis, readonly-state-agent-context system
message injection, and shared-state-read-write preference-as-system
injection — all ported verbatim from the dotnet sibling so the per-agent
shaping behavior is identical across the MAF runtimes.

chat-slots.json: add the turnIndex:1 "Give me a fun fact" fixture mirrored
from langgraph-python/chat-slots.json so the chat-slots.spec.ts second-
turn assertion ("second assistant turn is also wrapped in the custom
slot") gets a deterministic reply instead of falling through to headless-
simple's fun-fact fixture or the live proxy.

hitl-in-app and hitl-in-chat demo pages were already mirrored from LGP
(only a minor consumerAgentId addition on the in-app suggestions module).
No frontend page changes needed.

The B2 header-forwarding conveyance in src/agents/_header_forwarding.py
is untouched and verified intact (httpx hook + Starlette HTTP middleware
plus ContextVar bridge).

Multimodal diagnosis: the 5-test multimodal.spec.ts timeout is NOT a
routing/wiring gap. The agent_server.py mounts /multimodal FIRST (before
the catch-all "/"), the dedicated Next.js route /api/copilotkit-multimodal
registers the HttpAgent under "multimodal-demo", and the page wires
runtimeUrl + agent correctly. The multimodal fixture's userMessage
"describe the sample image" is the same stale phrasing LGP uses (which
passes at 185/0/2 — the test asserts a /image/i regex on the assistant
transcript, so fallthrough to the proxy still satisfies it). The
remaining suspects are (a) agent_framework_ag_ui's AG-UI -> AF adapter
mishandling inbound `binary` content parts, (b) the dual chat_client
init pattern (multimodal_chat_client built after the global httpx hook
is installed — the hook is idempotent so this should be safe), or
(c) >30s real-OpenAI vision latency under D6 record-replay. Capture
agent_server stderr during a single multimodal run to confirm.
2026-05-30 20:14:36 -07:00
Jordan Ritter 3c8bf11160 feat(showcase): complete CST D6 page-mirror (LGP demos + manifest homepage)
Mirror LGP's demo pages, components, hooks, lib and the manifest-driven
homepage into the CST integration so canonical D6 specs find the
elements they assert on. Prior partial mirror copied specs+fixtures
but left CST's stub pages intact, producing ~106 fails where elements
never render.

Backend swap is limited to runtimeUrl/agent adaptation for the demos
where CST has dedicated routes that LGP does not:
  - headless-complete: LGP /api/copilotkit-mcp-apps -> CST /api/copilotkit-headless-complete
  - reasoning-default, reasoning-custom, tool-rendering-reasoning-chain:
      LGP /api/copilotkit -> CST /api/copilotkit-reasoning
  - shared-state-read-write: LGP /api/copilotkit -> CST /api/copilotkit-shared-state-read-write
  - subagents: LGP /api/copilotkit -> CST /api/copilotkit-subagents

agent_server.ts and the api/* route files are otherwise untouched.

Aligns @copilotkit/* runtime to 1.59.2 (LGP parity) and adds the LGP
companion deps the mirrored pages import (@radix-ui/*, cmdk,
embla-carousel-react, lucide-react, react-markdown, remark-gfm,
tailwind-merge, class-variance-authority, clsx, radix-ui). Lockfile
regenerated with --legacy-peer-deps (cmdk@0.2.1 peers react@^18 but
LGP's lock resolves it the same way).

The beautiful-chat page still references /api/copilotkit-beautiful-chat
which CST does not host; that route exists only in LGP. The page tree
renders but the chat itself will 404 on POST. Adding the dedicated
route is out of scope for this slot (no API-route edits).

--no-verify: pre-commit oxlint binary not installed in this worktree
(missing dev tool, not a code defect).
2026-05-30 20:14:07 -07:00
Jordan Ritter c560df9e68 feat(showcase): complete pydantic-ai D6 page-mirror + fix frontend-tools slug
Mirror manifest-driven homepage from langgraph-python (replacing 59-line stub
with the tag-grouped, features-ordered layout) and add the missing
threadid-frontend-tool-roundtrip demo page. Register the new agent slug in
the runtime route so the demo can talk to the PydanticAI backend via the
default sales agent mount.

Fix the pre-existing frontend-tools slug mismatch: the page declared
agent="frontend-tools" (matching what src/app/api/copilotkit/route.ts
registers) but CopilotSidebar received agentId="frontend_tools" (underscore,
LGP convention). Align agentId to the hyphenated form pydantic actually
registers.

Pin @copilotkit/* deps to 1.59.0 (matching LGP's installed versions), add
the previously-missing @copilotkit/shared, and bump @ag-ui/{client,core}
to ^0.0.52 to satisfy the new @copilotkit/shared peer range. Regenerate
package-lock.json. Python backend (agent.py / agent_server.py / src/agents/)
is preserved untouched.
2026-05-30 20:12:54 -07:00
Jordan Ritter 619be316c4 fix(showcase): stub agents._header_forwarding in crewai-crews python test
The D6 conveyance commit added a top-level _header_forwarding import in
agent_server.py; the test's _stub_heavy_modules fixture omitted it, causing
ModuleNotFoundError at import time. Register the stub submodule with a no-op
hook and a pass-through BaseHTTPMiddleware subclass.
2026-05-30 18:27:56 -07:00
Jordan Ritter 0143b02ae3 WIP: D6 rollout — foundation + per-integration fixtures + conveyance fixes (#5109)
## Status

WIP / not ready to merge. Preserves in-flight D6 work so it isn't lost
mid-rollout. LGP is fixture-complete; other integrations are
mid-rollout.

### Latest banked work

- **langgraph-python — 185 / 0 / 2** (green). Achieved by narrowing a d4
chat matcher that was shadowing the d6 beautiful-chat search_flights
fixture (load order is shared -> d4 -> d6, first-match-wins) plus
refreshing the d6 tool-rendering and tool-rendering-custom-catchall AAPL
fixtures (turnIndex:0 -> hasToolResult:false so the first leg fires in
multi-pill threads). 2 skips are the by-design mcp-apps iframe gap.
- **langgraph-typescript — 185 / 0 / 2** (green). Mirrored the LGP d4
narrowing on the LGT side (3 matchers) and across the
d6/langgraph-typescript suite: replaced fragile turnIndex:0 gates with
hasToolResult:false, fixed em-dash escaping that broke literal matches
in multi-pill threads, and added jsFunctions payloads to the three
sandboxed-ui fixtures (`_from-feature-parity`, `headless-complete`,
`gen-ui-open-advanced`). The final fix removed the chain-tools
`hasToolResult` match gate (which checked the whole thread and made the
chain pill fall through to the broad weather matcher mid-thread),
mirroring LGP.
- **google-adk: 174/7/2 (was 134/52/5)** — conveyance + test-parity +
fixtures + pill-wiring rebuild; 7 residual (6 default-catchall framework
default-renderer testid version question, 1 beautiful-chat fixture).
- **Pill-parity staged across 13 integrations** (ag2, agno, mastra,
pydantic-ai, claude-sdk-python, claude-sdk-typescript, llamaindex,
langroid, strands, spring-ai, built-in-agent, crewai-crews,
langgraph-fastapi). The canonical LGP suggestion pill set is now
mirrored as `src/app/demos/*/suggestions.ts` files in each integration,
with targeted edits to existing `open-gen-ui-advanced` and
`byoc-hashbrown` files. **These new files are currently UNWIRED** — each
integration's `page.tsx` still defines its pill list inline via
`useConfigureSuggestions`. Banked so the canonical source survives; a
follow-up will rewire `page.tsx` to import from `suggestions.ts` and
drop the inline copies.
- **Fleet test-parity sweep**: 576 e2e specs across 15 integrations
aligned to LGP canonical (SHA-verified); 2 orphan specs removed.
- ms-agent-dotnet 177/5/7, ms-agent-python 174/11/2 (post
fixture-mirror); default-catchall green (page-level renderer, not
react-core-gated).

## Scope

### Conveyance (foundation)

Inbound `x-aimock-context` (and friends) must ride along on outbound LLM
HTTP calls so aimock fixture matching sees the inflight test's context.
Without this the call lands on the default project's aimock and silently
picks the wrong fixture. New per-integration
`_header_forwarding.{py,ts}` shim plus matching `agent_server` / route /
factory wiring covers: ag2, agno, built-in-agent, claude-sdk-python,
claude-sdk-typescript, crewai-crews, google-adk, langgraph-fastapi,
langgraph-python, langgraph-typescript, langroid, llamaindex, mastra,
ms-agent-python, pydantic-ai, strands.

For ADK/Gemini the global httpx hook is installed BEFORE any `agents.*`
import (google-genai constructs its client at module-import time).

### langgraph-python — 185 / 0 / 2

Fixture-complete via the conveyance shim + refreshed d6/langgraph-python
fixtures + copilotkit 0.1.93 bump + the latest d4-matcher-narrowing fix
(see banked work above).

### Per-integration fixtures

Mid-rollout snapshot of d6 fixtures across the cohort plus narrowing of
`aimock/shared/common.json`'s generic 'hello' fixture to 'hello world'
so it no longer shadows D6 pills whose prompts contain 'hello' as a
substring.

### Harness `--isolate` patch

`scripts/cli/_common.sh apply_isolation` now rewrites compose-file
relative paths to absolute (build/context/dockerfile/volumes/env_file),
enforces the docker compose `[a-z0-9_-]` project-name rule, and exports
`SHOWCASE_COMPOSE_FILE` / `SHOWCASE_INFRA_PORT_OFFSET` plus offset host
URLs. The TS harness CLI (`aimock-rebuild` / `config` / `doctor` /
`lifecycle`) honors the new env so concurrent isolated stacks stop
reporting each other's services as healthy.

## Lockfile decision flagged

`showcase/integrations/langgraph-python/pnpm-lock.yaml` was deleted in
this branch. Decision: keep the deletion. Rationale:

- 03bed3b76 (fix(showcase): regenerate 18 lockfiles in isolation; switch
to npm ci) migrated all showcase integrations off pnpm onto npm ci.
- The integration's Dockerfile uses `npm ci --legacy-peer-deps`.
- Every sibling integration committed only `package-lock.json` after
03bed3b76.
- The orphan pnpm-lock.yaml only risks tooling drift.

If anyone wants it restored: `git checkout origin/main --
showcase/integrations/langgraph-python/pnpm-lock.yaml`.

## Commits

- feat(showcase): D6 conveyance — forward x-aimock-context headers to
LLM clients
- feat(showcase/langgraph-python): D6 conveyance shim + copilotkit
0.1.93 bump
- feat(showcase/langgraph-typescript): D6 conveyance — propagate request
headers into ChatOpenAI
- feat(showcase/built-in-agent): D6 conveyance — header-forwarding shim
+ factory wiring
- feat(showcase/harness): support concurrent --isolate runs
- test(showcase): D6 langgraph-python fixtures — drive to 180/5/2
- test(showcase): D6 per-integration aimock fixtures + shared narrowing
- docs(showcase): GOTCHAS entry for D6 conveyance + --isolate notes
- feat(showcase): D6 conveyance — wire header-forwarding shims into
remaining entrypoints
- fix(showcase): unblock LGP D6 beautiful-chat + custom-catchall via d4
matcher narrowing
- fix(showcase): narrow LGT D6 d4 shadows + wire sandboxed-ui
jsFunctions
- chore(showcase): copy LGP canonical suggestion pills into 13
integrations
- fix(showcase): forward x-aimock-context per-request in google-adk
routes
- test(showcase): align google-adk e2e specs to langgraph-python
canonical
- fix(showcase): align google-adk D6 fixtures to LGP contract
- fix(showcase): wire google-adk default-catchall to shared 4-pill
suggestions
2026-05-30 16:32:19 -07:00
Jordan Ritter 66cefcf77c fix(showcase): add missing shadcn primitives + fix chat-slots bundling for pydantic-ai D6 mirror
The D6 parity mirror sweep copied LGP demo pages into pydantic-ai but did
not copy the shadcn UI primitives + lib/utils they import, nor reconcile
the manifest highlight paths against actual mirrored file layouts.

Caused two CI build-check failures on PR #5109:

1. pydantic-ai build-check: Next webpack could not resolve
   '@/components/ui/{button,card,avatar,...}' or '@/lib/utils'.
   Fix: copy LGP shadcn primitives (avatar, badge, button, card, input,
   scroll-area, select, separator, spinner, textarea) + lib/utils.ts;
   add 'radix-ui' (umbrella package the primitives import from) and
   'yaml' (used by demos/layout.tsx) to package.json + lockfile.

2. shell-dojo build-check: bundle-demo-content.ts rejected
   pydantic-ai::chat-slots highlight path
   'src/app/demos/chat-slots/custom-welcome-screen.tsx' (does not exist).
   Fix: align pydantic-ai manifest highlight paths for chat-slots,
   headless-complete, tool-rendering-reasoning-chain, and
   gen-ui-interrupt with LGP-canonical paths that match the mirrored
   file layout (slot-wrappers.tsx, chat/hooks/tools subdirs,
   _components/time-picker-card.tsx; drop nonexistent README.md ref).

Local verification: npm run build in pydantic-ai succeeds;
bundle-demo-content.ts bundles 695 demos including all four previously
broken pydantic-ai entries with no errors.
2026-05-30 16:24:09 -07:00
Jordan Ritter 0c8ae8a4f9 fix(showcase): remove dangling shared-state-write nav cards (CST + pydantic) 2026-05-30 16:10:01 -07:00
Jordan Ritter 430dbecc09 feat(showcase): apply D6 parity sweep to pydantic-ai (mirror LGP demos + specs + fixtures)
pydantic-ai had never received the fleet D6 parity sweep — its e2e specs and demo pages
were a pre-sweep, integration-specific set (only 3/26 suggestion files; missing canonical
demos; non-canonical byoc-*/agentic-chat-reasoning/reasoning-default-render variants).
Sitting at 69/109/2.

This change mirrors langgraph-python's canonical frontend (demos + specs + aimock
fixtures) into pydantic-ai, preserving pydantic-ai's Python backend untouched. The
per-demo agent.py files that pydantic-ai carries inside demo directories are preserved.

Changes:
- tests/e2e/: rsync LGP canonical 37-spec set over pydantic-ai (byte-identical). Removes
  non-canonical byoc-hashbrown.spec.ts, byoc-json-render.spec.ts, shared-state-write.spec.ts.
  Adds canonical declarative-hashbrown.spec.ts, declarative-json-render.spec.ts,
  reasoning-custom.spec.ts, reasoning-default.spec.ts.
- src/app/demos/: rsync LGP demos over pydantic-ai. Removes non-canonical demos
  (byoc-hashbrown, byoc-json-render, agentic-chat-reasoning, reasoning-default-render,
  shared-state-write). Adds canonical demos (declarative-hashbrown, declarative-json-render,
  reasoning-default, reasoning-custom) and the _shared/ helpers + demos/layout.tsx
  pydantic-ai was missing. Restores pydantic-ai-specific agent.py files into the 9 demo
  dirs that survived the mirror.
- src/app/demos/frontend-tools/page.tsx: patched agent slug from "frontend_tools" (LGP)
  to "frontend-tools" (matches pydantic-ai's main route.ts registry).
- src/app/api/copilotkit-byoc-{hashbrown,json-render}/ renamed to copilotkit-declarative-*
  to match the canonical frontend wiring. Internals still use HttpAgent against the
  pydantic backend's /byoc_hashbrown/ + /byoc_json_render/ mounts (Python backend
  untouched per scope). copilotkit-declarative-hashbrown/route.ts updates the registered
  agent slug from "byoc-hashbrown-demo" to "declarative-hashbrown-demo" to match the
  canonical demo. copilotkit-declarative-json-render/route.ts updates only the endpoint
  path string (the agent slug "byoc_json_render" is the canonical LGP convention).
- src/app/api/copilotkit/route.ts: renamed reasoning agent registrations from
  agentic-chat-reasoning + reasoning-default-render to reasoning-custom + reasoning-default
  to match canonical demo slugs. Both still proxy to the same /reasoning/ backend mount.
- manifest.yaml: features[] + demos[] updated to reflect the canonical demo set
  (byoc-* + agentic-chat-reasoning + reasoning-default-render removed; declarative-* +
  reasoning-default + reasoning-custom added).
- aimock/d6/pydantic-ai/: added gen-ui-custom.json (mirrored from LGP with
  context-swap + copiedFrom marker, per established fixture convention). Removed
  orphan gen-ui-open-advanced.json (no LGP counterpart in the canonical set).

The Python backend (agent.py / src/agent_server.py / src/agents/) is unchanged.
Some pydantic-ai backend mounts continue to exist that the mirrored frontend no longer
references (e.g. /reasoning/ remains, the deleted demos' agent slugs are still
registered in route.ts but harmlessly orphaned) — these are intentional carry-overs
to avoid touching Python backend code per scope.
2026-05-30 16:05:40 -07:00
Jordan Ritter d06ef78bed chore(showcase): regen claude-sdk-typescript lockfile for yaml dep 2026-05-30 16:05:40 -07:00
Jordan Ritter 95b438ea64 feat(showcase): apply D6 parity sweep to claude-sdk-typescript (mirror LGP demos + specs + fixtures)
CST never received the fleet D6 parity sweep — its e2e specs and demo
pages were a pre-sweep, integration-specific set. This commit mirrors
the canonical langgraph-python frontend into CST:

Demos added (copied from LGP, runtime URL + agent slugs adapted to CST):
- declarative-hashbrown (replaces byoc-hashbrown — same machinery,
  canonical name + heading)
- declarative-json-render (replaces byoc-json-render — same machinery,
  agent slug renamed declarative_json_render)
- reasoning-default + reasoning-custom (paired demos that share CST's
  dedicated /api/copilotkit-reasoning runtime so Claude extended-
  thinking deltas flow as AG-UI REASONING_MESSAGE_*)
- _shared/ helpers + demos/layout.tsx (title prefix adapted)

Demos removed (non-canonical CST originals):
- byoc-hashbrown, byoc-json-render (replaced by declarative-*)
- agentic-chat-reasoning, reasoning-default-render (replaced by
  reasoning-default + reasoning-custom)
- shared-state-write (not part of canonical LGP set)

Specs: replaced byoc-hashbrown.spec.ts, byoc-json-render.spec.ts,
shared-state-write.spec.ts with the canonical LGP specs for
declarative-hashbrown, declarative-json-render, reasoning-default,
reasoning-custom (byte-identical — assertions click pills + assert
rendered cards).

Backend touches (allowed by the parity-sweep brief to remap copied
frontend slugs onto CST's existing agent topology):
- src/app/api/copilotkit/route.ts: replaced byoc/byoc_json_render/
  agentic-chat-reasoning/reasoning-default-render agent registrations
  with declarative-hashbrown-demo, declarative_json_render,
  reasoning-default, reasoning-custom.
- src/app/api/copilotkit-byoc-{hashbrown,json-render}/ renamed to
  copilotkit-declarative-{hashbrown,json-render}/; endpoint + agent
  names updated to match canonical demo expectations.
- src/app/api/copilotkit-reasoning/route.ts: registered reasoning-
  default + reasoning-custom on the existing extended-thinking
  pass-through, replacing the old agentic-chat-reasoning/
  reasoning-default-render entries.

Agent server (/reasoning endpoint, /byoc-hashbrown, /byoc-json-render)
is untouched — these are still the underlying Claude backends that the
renamed Next.js routes proxy to.

manifest.yaml: features list + per-demo entries refreshed to mirror
the canonical demo IDs and names.

package.json: added 'yaml' dep used by the copied demos/layout.tsx for
manifest-driven page titles.
2026-05-30 16:05:40 -07:00
Jordan Ritter c9892aaf48 fix(showcase): wire ms-agent-python hitl suggestions + verify conveyance + reconcile e2e specs
Mirror the gold-standard langgraph-python (LGP) hitl pill-wiring pattern by
extracting the inline useConfigureSuggestions call from hitl/page.tsx into a
dedicated useHitlSuggestions hook in hitl/suggestions.ts. Pill text and
prompts are byte-identical to LGP's hitl/suggestions.ts so the canonical
hitl spec matches without per-integration assertion drift.

Preserves all MAF-specific backend wiring untouched (inline StepSelector /
StepsFeedback components, useHumanInTheLoop registration, the deliberate
omission of useLangGraphInterrupt — MAF has no interrupt() primitive).

Conveyance check (B2 shim): src/app/api/copilotkit/route.ts is already pure
pass-through (no header reading, no slug synthesis), matching the canonical
Python integration pattern (pydantic-ai, langgraph-fastapi). Backend
src/agents/_header_forwarding.py mirrors the canonical x-* prefix-only
forwarding shim. No change required.

E2E spec set: ms-agent-python/tests/e2e is already byte-identical to LGP's
canonical 37-spec set (comm -3 returns empty). No stray specs to delete.
threadid-frontend-tool-roundtrip is not present in LGP either, so skipped
per orchestrator instructions. gen-ui-interrupt spec retained (known
cross-integration useInterrupt 2nd-interrupt issue, not in scope here).
2026-05-30 16:05:40 -07:00
Jordan Ritter d9c8cf35ab fix(showcase): wire ms-agent-dotnet hitl suggestions + reconcile canonical e2e specs
Extracts the ms-agent-dotnet hitl demo's inline useConfigureSuggestions call
into a dedicated suggestions.ts that mirrors langgraph-python's canonical
hitl/suggestions.ts (identical pill titles and prompts), then wires the new
useHitlSuggestions() hook into hitl/page.tsx in place of the inline block.
This matches the gold-standard wiring shape the canonical D6 hitl assertions
expect.

Spec reconciliation: ms-agent-dotnet/tests/e2e/hitl.spec.ts and
interrupt-headless.spec.ts are not present in langgraph-python's canonical
suite, but both exercise MAF-specific behavior with no LGP equivalent
(plain /demos/hitl reject branch using the Simple plan pill; MAF's
frontend-tool adaptation of /demos/interrupt-headless). They are kept and
expected to not count toward the 185 LGP-parity floor.
2026-05-30 16:05:39 -07:00
Jordan Ritter 4211278ae3 test(showcase): fleet test-parity — align all integration e2e specs to LGP canonical
Each non-LGP integration carried its own drifted/stale copy of the e2e specs, causing
inconsistent behavior and noisy diffs across the fleet. Copied langgraph-python's canonical
specs verbatim across ~15 integrations (576 spec files total, SHA-1-verified identical to
LGP) so every integration runs the same assertions.

Also removed 2 orphan specs whose underlying demo pages do not exist:
- showcase/integrations/agno/tests/e2e/hitl-in-chat-booking.spec.ts
- showcase/integrations/built-in-agent/tests/e2e/shared-state-write.spec.ts

Integration-specific variant specs were intentionally left as-is: reasoning-default-render,
byoc-*, agentic-chat-reasoning, and shared-state-write where the demo exists. google-adk and
langgraph-typescript were already in parity from earlier commits and show no new changes.
2026-05-30 08:43:12 -07:00
github-actions[bot] bb860166e8 style: auto-fix formatting 2026-05-30 07:00:35 +00:00
Jordan Ritter 26d1204607 fix(showcase): wire google-adk default-catchall to shared 4-pill suggestions
Replaced inline 3-pill useConfigureSuggestions with useSuggestions() import
matching LGP; needs image rebuild to take effect.
2026-05-29 23:59:46 -07:00
Jordan Ritter 93b5fdd467 test(showcase): align google-adk e2e specs to langgraph-python canonical
Integration specs had drifted/staled vs LGP gold standard; copied LGP's canonical
specs verbatim and removed the orphan shared-state-write spec whose demo exists
in neither LGP nor google-adk.
2026-05-29 23:59:32 -07:00
Jordan Ritter 67f5efdaf6 fix(showcase): forward x-aimock-context per-request in google-adk routes
@ag-ui/client HttpAgent only forwards static this.headers, so rebuild per-request
with extractForwardedHeaders(req); restores D6 conveyance.
2026-05-29 23:59:18 -07:00
Jordan Ritter 3184824baf chore(showcase): copy LGP canonical suggestion pills into 13 integrations
Stages the canonical suggestion pill set (mirrored from langgraph-python) as new
suggestions.ts files across 13 integrations: ag2, agno, mastra, pydantic-ai,
claude-sdk-python, claude-sdk-typescript, llamaindex, langroid, strands, spring-ai,
built-in-agent, crewai-crews, langgraph-fastapi.

Also includes targeted edits to existing suggestions.ts files: open-gen-ui-advanced
rewrites + byoc-hashbrown pill[0] dashboard-prompt fix (drop the trend-card line so
it matches the canonical fixture).

NOTE: these new files are currently UNWIRED. Each integration's page.tsx still
defines its pill list inline via useConfigureSuggestions. Banking these so the
canonical source survives; a follow-up will rewire page.tsx to import from
suggestions.ts and delete the inline copies.
2026-05-29 21:08:05 -07:00
github-actions[bot] fb2ac5718e style: auto-fix formatting 2026-05-29 23:17:54 +00:00
Jordan Ritter aa33754860 feat(showcase): D6 conveyance — wire header-forwarding shims into remaining entrypoints
Companion to the conveyance shim commit. The shim files were staged
without their callers; this pass wires:

- langroid / llamaindex / ms-agent-python / pydantic-ai / strands
  agent_server.py: register the HeaderForwardingHTTPMiddleware
- mastra: switch every API route (copilotkit, copilotkit-auth, beautiful-chat,
  byoc-hashbrown, byoc-json-render, mcp-apps, multimodal, ogui, voice) and
  the mastra agents / tools / subagents modules onto the
  _header_forwarding-wrapped openai provider so inbound x-* headers ride
  on outbound Vercel AI SDK calls via ALS
2026-05-29 16:16:36 -07:00
Jordan Ritter af2036996a feat(showcase/built-in-agent): D6 conveyance — header-forwarding shim + factory wiring
- New src/lib/header-forwarding.ts mirrors the cross-integration shim
  pattern: reads inbound x-* headers and forwards them onto outbound
  LLM calls so aimock fixture matching sees x-aimock-context
- Wire copilotkit route handler and tanstack factory through the shim
- Frontend-tools and a2ui-fixed-schema demo adjustments paired with the
  conveyance work
- Bump package.json / package-lock.json against the updated tree
2026-05-29 16:15:35 -07:00
Jordan Ritter 6d5afd458a feat(showcase/langgraph-typescript): D6 conveyance — propagate request headers into ChatOpenAI
- Add openai-headers.ts: a per-request helper that pulls x-aimock-context
  off the inbound LangGraph request and threads it into the ChatOpenAI
  client construction so aimock fixture matching sees the inflight test
  context
- Wire every agent module (a2ui-*, agentic chat surfaces, byoc-*,
  frontend-tools-*, gen-ui-*, headless-complete, hitl-*, interrupt-agent,
  mcp-apps, multimodal, open-gen-ui*, readonly-state, reasoning-agent,
  shared-state-*, subagents, tool-rendering*) through the helper
- Bump package.json/package-lock.json against the updated tree
2026-05-29 16:15:26 -07:00
Jordan Ritter ceff27031c feat(showcase/langgraph-python): D6 conveyance shim + copilotkit 0.1.93 bump
- Add _header_forwarding_middleware.py paired with reasoning / subagent /
  tool-rendering-reasoning-chain agent edits so D6 fixture-matching sees
  the inflight x-aimock-context on outbound LLM calls
- Bump copilotkit 0.1.92 → 0.1.93 in requirements.txt; regenerate
  package-lock.json against the post-npm-ci tree (sibling of 03bed3b76,
  which switched this integration to npm ci)
- Drop the stale pnpm-lock.yaml left behind by the npm ci migration —
  Dockerfile uses 'npm ci --legacy-peer-deps' and every other showcase
  integration committed only package-lock.json after 03bed3b76. Removing
  the orphan prevents npm/pnpm tooling drift from re-resolving against it.
2026-05-29 16:15:12 -07:00
Jordan Ritter 0ca2bd40aa feat(showcase): D6 conveyance — forward x-aimock-context headers to LLM clients
Add a per-integration header-forwarding shim so inbound x-* request headers
ride along to outbound LLM HTTP calls. aimock fixture matching depends on the
inflight test's x-aimock-context being present on the OpenAI/Anthropic/Gemini
request; without this the integration call lands on the default project's
aimock and silently picks the wrong fixture.

Shape per integration:
- New _header_forwarding.{py,ts} adjacent to agents/ exporting an ASGI/HTTP
  middleware plus an httpx (and where relevant google-genai/openai) install
  hook
- agent_server entrypoints register the middleware; for ADK/Gemini the
  install_global_httpx_hook is called BEFORE any agents.* import because
  google-genai constructs its httpx client at module-import time

Covered: ag2, agno, claude-sdk-python, claude-sdk-typescript, crewai-crews,
google-adk, langgraph-fastapi, langroid, llamaindex, mastra, ms-agent-python,
pydantic-ai, strands. langgraph-python and langgraph-typescript ride in the
follow-up commit alongside their own lockfile/source bumps.
2026-05-29 16:15:00 -07:00
Martha Kelly Schumann d60285c337 fix(react-core): preserve generated thread tool followups (#5043)
## Summary
- keep `CopilotChat` agents aligned to SDK-generated thread IDs even
when `/connect` is intentionally skipped for non-explicit threads
- stabilize `CopilotKitProvider` default object props so rerenders do
not re-sync an empty local agent registry and replace the live
remote/Intelligence agent mid-run
- add regression coverage for SDK-generated thread frontend-tool
follow-up runs and provider empty-agent rerender stability
- add a focused langgraph-python showcase demo, aimock fixture,
Playwright smoke, and QA checklist for ENT-658
- add a patch changeset for `@copilotkit/react-core`

## Testing
- `npx nx run @copilotkit/react-core:test --
src/v2/components/chat/__tests__/CopilotChat.absentThreadConnect.test.tsx`
- `npx nx run @copilotkit/react-core:test --
src/v2/providers/__tests__/CopilotKitProvider.stability.test.tsx`
- Pre-commit hook passed: `pnpm run test` and `pnpm run check:packages`
- Verified exact `CopilotKit/Intelligence` repro branch
`mme/threadid-repro`: unchecked `Explicit threadId`, sent `invoke
testFrontendToolCalling with label X`, confirmed user message/tool
card/assistant reply remain visible
- Verified the same Intelligence repro with `Explicit threadId` checked
- `pnpm exec playwright test
tests/e2e/threadid-frontend-tool-roundtrip.spec.ts --project=chromium
--workers=1` from `showcase/integrations/langgraph-python`

## QA Checklist
- [x] Reproduce the reset in `CopilotKit/Intelligence` branch
`mme/threadid-repro` with `Explicit threadId` unchecked
- [x] Confirm generated-thread frontend-tool round-trip preserves the
user message, tool card, and assistant response
- [x] Confirm explicit-thread frontend-tool round-trip still preserves
the user message, tool card, and assistant response
- [x] Open `/demos/threadid-frontend-tool-roundtrip` in the
langgraph-python showcase demo
- [x] Confirm `Explicit threadId` is unchecked and the chat starts in
SDK-generated thread mode
- [x] Send `invoke testFrontendToolCalling with label X`
- [x] Confirm the user message remains visible
- [x] Confirm the `testFrontendToolCalling` card remains visible and
shows `label: X` plus `result: handled X`
- [x] Confirm the assistant reply `Frontend tool finished for X.`
appears
- [x] Confirm the chat does not return to the empty state
- [x] Repeat with `Explicit threadId` checked and confirm the
explicit-thread path is unchanged

## Notes
The visible reset had two frontend-side causes. First, the chat and
agent could diverge when the SDK generated the thread ID. Second, in
Intelligence mode, provider rerenders could re-sync an empty local agent
registry and replace the live remote agent instance mid-run, dropping
the in-memory chat stream. Both fixes live in `@copilotkit/react-core`.

The Playwright file is intentionally a smoke test for the demo
route/toggle. The source-level regressions live in
`CopilotChat.absentThreadConnect.test.tsx` and
`CopilotKitProvider.stability.test.tsx`.
2026-05-29 07:50:01 -07:00
Jordan Ritter e56634e0ae chore(showcase): bump copilotkit SDK pin to 0.1.92
Bumps copilotkit Python SDK from 0.1.91 to 0.1.92 across the three showcase integrations that
pin it: langgraph-python, langgraph-fastapi, and strands.

This picks up the header_propagation fix from CopilotKit/CopilotKit#5088, which ensures the
runtime's X-* headers (including X-AIMock-Context) propagate end-to-end through the Python
SDK middleware so D6 testing of langgraph-python sees the expected context routing.

No lockfiles to regenerate — these are plain pip requirements consumed directly by the
integration Dockerfiles.
2026-05-28 15:23:25 -07:00
Tyler Slaton f285056ba7 fix(docs): resolve PDX-156 merge conflict 2026-05-27 15:43:58 -07:00
Tyler Slaton bf9ac27e8c Merge branch 'main' into tyler/showcase-fix-shelldocs-structure 2026-05-27 15:04:45 -07:00
github-actions[bot] 7f38086043 style: auto-fix formatting 2026-05-27 21:17:10 +00:00
Tyler Slaton cbeb6c8166 Merge remote-tracking branch 'origin/main' into tyler/showcase-fix-shelldocs-structure
# Conflicts:
#	showcase/shell-docs/src/app/[[...slug]]/page.tsx
2026-05-27 14:13:21 -07:00
Jordan Ritter 7ea0a10eaa Merge remote-tracking branch 'origin/main' into chore/bump-agui-langgraph-0.0.34 2026-05-27 14:05:35 -07:00
Tyler Slaton f03227376f fix(docs): hide PDX-156 unsupported shared-state frameworks 2026-05-27 14:03:19 -07:00
Jordan Ritter 3c28715935 chore(deps): regenerate showcase langgraph-typescript outer package-lock.json (valid JSON)
Commit 0a24b5c430 attempted to regenerate the outer lockfile but produced
invalid JSON (trailing commas, JSON5-style formatting from a non-npm
tool). Docker stage 1 (frontend) npm ci --legacy-peer-deps fails with
EUSAGE "can only install with an existing package-lock.json" because npm
refuses to parse it.

This commit regenerates the file via `npm install --package-lock-only
--legacy-peer-deps` to produce a strict-JSON lockfile pinning
@ag-ui/langgraph@0.0.34. Diff is large because the prior file's
formatting differs structurally from canonical npm output.
2026-05-27 13:59:16 -07:00