Commit Graph

12110 Commits

Author SHA1 Message Date
Jordan Ritter 1dc3a71bd2 chore: sync plugin-skills version to 1.58.0 2026-05-26 11:31:04 -07:00
github-actions[bot] 0805d2ee1b style: auto-fix formatting 2026-05-26 18:28:24 +00:00
Jordan Ritter a9c41ce8ff chore: minor CI and lint config nudges for D6
Add timeout-minutes to plugin-skills-check workflow, update oxfmt
config, and add lefthook entries for fixture validation.
2026-05-26 11:26:45 -07:00
Jordan Ritter 781ed8b045 chore(showcase): D6 scripts, fixture tests, and docs
Add fixture analysis/split/merge scripts for the D6 restructure,
update aimock fixture collision detection tests for the new directory
layout, update GOTCHAS.md and QA-COVERAGE.md with D6 notes, and
add --d6 flag support to the showcase test CLI.
2026-05-26 11:26:37 -07:00
Jordan Ritter 5badfb82d6 feat(showcase-dashboard): D6-ceiling chip color algorithm + aggregate key
Update depth-utils to treat D6 as an integration-scoped aggregate
(d6:<slug> not d6:<slug>/<featureId>), raise maxPossible from 5 to 6
when D5 mapping exists, and adjust chipColor derivation so D5-green
without D6 yields amber instead of green. Update composed-cell memo
comparator and cell-drilldown dimensions. Comprehensive test updates
across cell-model, depth-utils, compute-tally-detail, unified-cell,
and status-tab.
2026-05-26 11:26:19 -07:00
Jordan Ritter fc8ce6e388 feat(showcase): wire aimock dir mounts + LANGGRAPH_HTTP env in docker-compose
Replace single-file volume mounts with directory mounts (shared/, d4/,
d6/) so new fixture files are picked up without editing compose files.
Remove --proxy-only flag to catch fixture gaps instead of silently
falling through to real API. Add LANGGRAPH_HTTP env var from main.
2026-05-26 11:26:06 -07:00
Jordan Ritter 39d062d8e7 feat(showcase): add X-AIMock-Context header to Playwright configs across 18 integrations
Each integration's playwright.config.ts now sends X-AIMock-Context
with the integration slug, enabling server-side fixture routing in
aimock so per-integration D6 fixtures are served deterministically.
2026-05-26 11:25:57 -07:00
Jordan Ritter 7ac3e59a5c feat(showcase-harness): D6 all-pills probe driver + per-integration scoping
Add d6-all-pills driver that exercises every pill on every integration
behind aimock context routing. Rename e2e-chat-tools/e2e-deep to
d4-chat-roundtrip/d5-single-pill to match depth convention. Wire
D5 representative map, D6 scoping helpers, dimension types, and
the orchestrator config for the new probe IDs.
2026-05-26 11:25:47 -07:00
Jordan Ritter 072de6523a feat(showcase-dashboard): D6 rollup counter in AdaptiveStatsBar (#5021)
## Summary
Adds a D6 overlay section to the dashboard, showing green/gray/red
counts across all wired cells based on parity-vs-reference probe
results. Pairs with #5018 (CellModel D6 field) and #5020 (D6 drilldown
dimension).

## Files
- **overlay-types.ts**: add `"d6"` to the `Overlay` union and
`ALL_OVERLAYS` array
- **adaptive-stats-bar.tsx**: new `D6Section` component + `D6Stats`
interface + `d6Stats` prop
- **overlay-toggle-bar.tsx**: add D6 to `ALL_OVERLAYS` and
`OVERLAY_LABELS` for the toggle pill
- **page.tsx**: compute D6 stats via `resolveCell` and pass to
`AdaptiveStatsBar`
- **overlay-toggle-bar.test.tsx**: update pill count assertion (5 -> 6)
- **overlay-selector-integration.test.tsx**: add `"d6"` to the
all-overlays test case

## Test plan
- [x] 44 existing overlay tests pass (overlay-toggle-bar,
overlay-selector-integration, useOverlays)
- [ ] Dashboard shows D6 toggle pill; toggling it shows "X green / Y
gray / Z red" tally
2026-05-26 11:25:35 -07:00
Jordan Ritter 1e66a5f8d2 feat(showcase-aimock): per-framework D4/D6 fixture reorg into d4/d6/shared dirs
Move monolithic d5-all.json + feature-parity.json + smoke.json into
per-integration directories under d4/<slug>/, d6/<slug>/, and shared/.
Every fixture file is now context-scoped to enable server-side aimock
routing via match.context. Migrated 12 HITL fixtures from main's
d5-all.json additions into shared/_migrated-from-d5-all-hitl.json
for follow-up distribution into per-integration files.
2026-05-26 11:25:30 -07:00
Jordan Ritter 0eec6318e8 feat(showcase-dashboard): D6 rollup counter in AdaptiveStatsBar 2026-05-26 11:24:59 -07:00
Sam Julien 0f3454ea2e fix(shell-docs): fix broken prebuilt-components and HITL code examples (#5014)
## Summary

- **6 prebuilt-components pages** were missing their
`PrebuiltComponents` import, causing the `inlineSnippets()` regex to
skip them and the `framework` prop to be dropped (iframe URLs defaulted
to `langgraph` instead of the correct integration)
- **8 HITL pages** had copy-pasted code examples using the deprecated v1
`parameters: [{ name, type }]` array format instead of `parameters:
z.object({...})` Zod schemas
- Added a `checkComponentImports()` validation to `verify-shell-docs.ts`
to catch missing snippet imports going forward

### Affected pages

**Prebuilt-components** (missing import): agno, aws-strands,
crewai-flows, llamaindex, microsoft-agent-framework, pydantic-ai

**HITL code examples** (deprecated params format): adk, ag2, agent-spec,
agno, llamaindex, mastra, microsoft-agent-framework, pydantic-ai

## Test plan

- [ ] Serve shell-docs locally (`cd showcase/shell-docs && npx next
dev`) and verify prebuilt-components pages render with correct iframe
content
- [ ] Verify HITL pages show `parameters: z.object({...})` in code
blocks
- [ ] Run `npx tsx showcase/scripts/verify-shell-docs.ts --skip-build`
and confirm no component-import warnings

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-05-26 11:20:35 -07:00
Jordan Ritter a04896db04 feat(showcase-dashboard): expose D6 dimension in cell drilldown panel (#5020)
## Summary
Adds D6 (Parity / Reference) to the cell-drilldown DIMENSIONS array so
clicking any cell chip shows D6 status alongside d5/e2e/d2/health/smoke.
CellModel already has the d6 field (#5018); this is the one-line missing
piece to surface it.

## Test plan
- [ ] Click a cell chip -> drilldown panel shows D6 row
2026-05-26 11:20:04 -07:00
Jordan Ritter 9236b82338 feat(showcase-dashboard): expose D6 dimension in cell drilldown panel 2026-05-26 11:19:22 -07:00
Jordan Ritter a0c90781a7 feat(showcase-dashboard): render D6 chips on cells (#5018)
## Summary

Extends the showcase dashboard's active cell rendering path with D6
support so D6 chips can display on every cell. Today D6 was only
referenced in the chips-explainer legend; CellModel capped at
ceilingDepth: 0 | 3 | 4 | 5 with no D6 in UnifiedCell.

## What this PR changes

- `cell-model.ts`: adds `d6: TestLevel | null` field, `resolveD6()`,
extends `achievedDepth`/`ceilingDepth` to `| 6`, D6-ceiling algorithm
for chip color
- `unified-cell.tsx`: renders the D6 chip
- `feature-grid.tsx`: small wiring to surface the new field
- `live-status.ts`: delta from the branch (Dimension/BadgeRender
extensions)

## State after merge

Every cell renders a D6 chip. Until `d6:<slug>/<featureId>` PB rows flow
(follow-up PR for the D6 probe driver + per-framework fixtures), every
D6 chip is gray ("no data — probe pending"). This is the accurate state.

## Why this is safe to ship now

No data layer changes. No probe driver changes. Zero functional risk to
existing cells (they keep their D5-ceiling chip colors). Pure additive
rendering plumbing.

## Follow-up

The d6-all-pills probe driver + d4/d6/shared per-framework fixture reorg
lands in a separate PR (rebased from `feat-d6-everything-works`). That's
what starts populating real D6 state.
2026-05-26 11:13:24 -07:00
Jordan Ritter 5f2bdd9e53 feat(showcase-dashboard): render D6 chips on cells
Extends the active rendering path with D6 support so dashboard cells
can display D6 ("parity vs reference") state. cell-model.ts gains
ceilingDepth | 6 + d6 TestLevel field + resolveD6() + D6-ceiling
chip-color algorithm. unified-cell.tsx + feature-grid.tsx render the
new D6 chip. live-status.ts gets the small Dimension/BadgeRender delta
the branch needed.

Until d6:<slug>/<featureId> PB rows start flowing (separate PR for the
D6 probe driver + per-framework fixtures), every cell renders D6 gray
("no data -- probe pending"). This is the accurate state -- visibility
without functional risk.

Cherry-picked from feat-d6-everything-works (the per-framework fixtures
branch). The remainder of that branch -- d6-all-pills driver, fixture
reorg, harness config -- lands in a follow-up PR now that the ag-ui
header-forwarding prerequisites (#4984, #4951, #5015, #5016) are in.
2026-05-26 11:12:41 -07:00
Martha Kelly Schumann 2907270a9b Merge branch 'main' into fix/showcase-docs-rendering 2026-05-26 10:45:59 -07:00
Markus Ecker 67d3453177 chore(angular): relicense package as MIT (#5017)
## Summary
- Switches `packages/angular` from a proprietary "Commercial" license to
MIT, aligning it with the rest of the CopilotKit packages.
- Updates `packages/angular/LICENSE` to the MIT text (Copyright (c)
Tawkit Inc.) and sets `"license": "MIT"` in
`packages/angular/package.json`.

## Test plan
- [ ] CI passes
2026-05-26 19:42:41 +02:00
Markus Ecker 62cbe6f97e chore(angular): relicense package as MIT 2026-05-26 19:37:56 +02:00
Martha Schumann d2934c149d Merge remote-tracking branch 'origin/main' into fix/showcase-docs-rendering 2026-05-26 10:36:52 -07:00
Jordan Ritter c6fa00cfb3 chore(showcase): bump @ag-ui/langgraph to 0.0.33 in langgraph-typescript overrides (#5016)
## Summary

Bumps two showcase-level `@ag-ui/langgraph` override pins from `0.0.32`
to `0.0.33`:
- `showcase/integrations/langgraph-typescript/package.json`
- `showcase/integrations/langgraph-typescript/src/agent/package.json`

Regenerates both `package-lock.json` files.

## Why this is needed (after R3b already shipped)

R3b (#5015) bumped `packages/runtime` and `packages/sdk-js` to consume
`@ag-ui/langgraph@0.0.33`. But the langgraph-typescript showcase
integration pins `@ag-ui/langgraph` directly in its own `package.json`
files via `overrides`, which overrides whatever the runtime transitively
pulls. Without this PR, the LGT Docker image bakes 0.0.32 and the D6 LGT
probe stays RED.

This is the final ag-ui-side bump needed to complete the LGT
header-forwarding chain end-to-end.

## What's in @ag-ui/langgraph 0.0.33

(Same as documented in #5015.) Per-request `onRequest` hook,
prepareStream configurable+context partition fix for langgraph-api 0.7+,
mergeConfigs context_schema allowlist.

## Test plan

- [ ] CI green
- [ ] After merge, `showcase_build.yml` auto-fires (path filter
`showcase/**` matches)
- [ ] langgraph-typescript Docker image rebuilds + pushes to GHCR
- [ ] Railway redeploys langgraph-typescript service
- [ ] D6 LGT probe flips GREEN
2026-05-26 10:32:09 -07:00
Martha Schumann 75334a1c78 fix(shell-docs): address review feedback on checkComponentImports
Derive snippet component names from SNIPPET_MAP in docs-render.tsx at
runtime instead of maintaining a hardcoded 35-entry set that was already
13 entries behind. Replace name-level handledByInline gate with per-match
inline pattern check to fix a false-negative path. Align function
signature with sibling check functions. Add 3 unit tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-26 10:31:41 -07:00
Jordan Ritter da4246ff9e chore(showcase): bump @ag-ui/langgraph override to 0.0.33 in langgraph-typescript
R3b bumped the monorepo packages but missed two showcase-level override
pins. The langgraph-typescript integration pins @ag-ui/langgraph directly
in both its top-level and src/agent package.json files, bypassing whatever
@copilotkit/runtime transitively resolves.

Without this bump, the showcase LGT Docker image bakes 0.0.32 even though
the monorepo runtime/sdk-js are on 0.0.33 (R3b). This is what's keeping
the D6 LGT probe RED.

Path filter showcase/** matches, so showcase_build.yml fires on merge to
rebuild + Railway-redeploy langgraph-typescript with the real 0.0.33.
2026-05-26 10:31:23 -07:00
Jordan Ritter d9807f9f02 chore: bump @ag-ui/langgraph to 0.0.33 for D6 header forwarding (#5015)
## Summary

Bumps `@ag-ui/langgraph` from `0.0.31` to `0.0.33` in `packages/runtime`
and `packages/sdk-js`. Regenerates the pnpm lockfile.

Companion to R3a (`copilotkit==0.1.91` Python pin bump). Together they
complete the D6 header-forwarding chain for LangGraph integrations.

## What 0.0.33 contains

From
[ag-ui-protocol/ag-ui#1763](https://github.com/ag-ui-protocol/ag-ui/pull/1763):
- Per-request `headers` map + `onRequest` hook on LangGraphClient —
per-request x-* attaches to every outbound call
- prepareStream partitions runtime config into `configurable` +
`context` so langgraph-api 0.7+ no longer returns HTTP 400
- mergeConfigs() extended with `context_schema` allowlist (gated on
schemaKeys?.config)
- Header preservation through clone()

Published via OIDC + provenance from ag-ui's fixed publish-release.yml.

Also adds `@ag-ui/langgraph` to `minimumReleaseAgeExclude` in `.npmrc`
since 0.0.33 was just published.

## Test plan

- [ ] CI green
- [ ] After merge, showcase_build.yml redeploys LangGraph integrations
- [ ] D6 LGP probe flips GREEN (currently RED on the 0.0.31 pin)
- [ ] D6 LGT probe also exercises the new chain
2026-05-26 10:19:09 -07:00
Jordan Ritter 9d3a3a5559 chore: bump @ag-ui/langgraph to 0.0.33 for D6 header forwarding
Picks up per-request header forwarding (onRequest hook + headerFactory)
and the prepareStream configurable+context partition fix from
ag-ui-protocol/ag-ui#1763. Together with copilotkit==0.1.91 on the
Python side (R3a), this unblocks D6 LGP/LGT header propagation.

The mergeConfigs() change in 0.0.33 also fixes the HTTP 400 from
langgraph-api 0.7+ when both configurable and context are present.

Bumped in two files:
- packages/runtime/package.json: 0.0.31 -> 0.0.33
- packages/sdk-js/package.json: 0.0.31 -> 0.0.33

Added @ag-ui/langgraph to minimumReleaseAgeExclude in .npmrc.
pnpm-lock.yaml regenerated.

Showcase auto-redeploys on merge via showcase_build.yml.
2026-05-26 10:16:27 -07:00
Austin Merrick 5a87116f25 fix(shell-docs): remove extra bottom margin from p inside callouts (#5013)
Before:
<img width="781" height="87" alt="Screenshot 2026-05-26 at 9 35 58 AM"
src="https://github.com/user-attachments/assets/547dc74b-04e7-4784-85b4-823f1adaefb4"
/>

After:
<img width="784" height="69" alt="Screenshot 2026-05-26 at 9 39 03 AM"
src="https://github.com/user-attachments/assets/e8cf7948-a2bb-439a-90ef-9b73b40504dc"
/>


## Summary

- `.reference-content p { margin-bottom: 1rem }` in `globals.css` is
**unlayered** CSS, so it always wins over fumadocs-ui's
`prose-no-margin` utility (which lives in `@layer utilities`), causing
visible extra space at the bottom of info callout boxes
- Fix mirrors `prose-no-margin`'s first/last-child intent at `(0,2,1)`
specificity in `globals.css` so the margin resets actually apply

## Test plan

- [x] Open any docs page with a `<Callout>` block (e.g. a quickstart
page)
- [x] Verify no extra bottom padding/margin inside the callout box
- [x] Check both light and dark mode
- [x] Check callouts with and without a `title` prop
2026-05-26 10:04:42 -07:00
Martha Schumann b02a0f6db5 fix(shell-docs): fix broken prebuilt-components and HITL code examples across 6 integrations
6 prebuilt-components pages were missing their PrebuiltComponents import,
causing the inlineSnippets regex to skip them and drop the framework prop
(iframe URLs defaulted to langgraph). 8 HITL pages had copy-pasted code
examples using the deprecated v1 parameters array format instead of Zod
schemas. Added a component-imports validation check to verify-shell-docs.ts
to catch missing snippet imports going forward.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-26 09:59:28 -07:00
Austin Merrick b1947eb147 revert(lefthook): remove NODE_OPTIONS bump (separate PR) 2026-05-26 09:36:13 -07:00
Ben Taylor 9a0d487b6f chore: release monorepo v1.58.0 (#5010)
## Release monorepo v1.58.0

**Scope:** `monorepo` | **Bump:** `minor`

---

### How this release process works

1. **This PR was created automatically** by the "release / create-pr"
workflow.
   It bumped the `monorepo` packages to `1.58.0`
   and generated AI-enhanced release notes.

2. **CI runs on this PR** — the full test suite (unit tests, lint, type
checks, build)
   must pass before merging. This is the review gate.

3. **Review the release notes** in `release-notes.md` in this PR.
If a Notion draft was created, you can edit the release notes there
before merging.

4. **When this PR is merged**, the `release / publish` workflow
automatically:
   - Builds all packages
   - Publishes the `monorepo` packages to npm at version `1.58.0`
   - Creates git tag `monorepo/v1.58.0`
   - Creates a GitHub Release with the final release notes

### Before merging

- [ ] CI is green (tests, lint, types, build)
- [ ] Version bumps look correct
- [ ] Release notes are accurate (edit in Notion if a draft was created)

---

> **Do not merge until CI is fully green.** The full test suite runs
automatically on this PR.
v1.58.0
2026-05-26 11:25:25 -05:00
Jordan Ritter 5a3832d71c chore(showcase): bump copilotkit to 0.1.91 in Python integrations (#5012)
## Summary

Bumps `copilotkit==0.1.90` → `copilotkit==0.1.91` in three showcase
Python integration `requirements.txt` files:

- `showcase/integrations/langgraph-python`
- `showcase/integrations/strands`
- `showcase/integrations/langgraph-fastapi`

Picks up the forwarded-header extraction landed in #4984 and published
as `copilotkit 0.1.91` on PyPI by the release in #5011.

Updates `validate-pins` ratchet hash in
`showcase/scripts/fail-baseline.json` (count stays at 106, FAIL set
shifted because showcase pins now diverge from Dojo on `0.1.91` vs
`0.1.87`).

## Why split from the @ag-ui/langgraph pin bump

The matching `@ag-ui/langgraph` bump (`0.0.31` → `0.0.33` in
`packages/runtime/package.json` and `packages/sdk-js/package.json`)
waits for the ag-ui side: `publish-release.yml` is currently broken
(OIDC `pull_request` vs `push` event mismatch — last 30 runs all
failed). Fix is in flight in a separate session. Once `@ag-ui/langgraph
0.0.33` is live on npm, a follow-up PR will bump those two pins.

This split unblocks D6 LGP today. D6 LGT remains waiting on the ag-ui
side.

## Test plan

- [ ] CI green
- [ ] After merge, showcase_build.yml redeploys langgraph-python +
strands + langgraph-fastapi to Railway
- [ ] Production D6 LGP probe verifies forwarded headers reach the agent
via aimock logs
2026-05-26 09:24:16 -07:00
Austin Merrick d606429fe3 fix(shell-docs): remove extra bottom margin from p inside callouts
.reference-content p { margin-bottom: 1rem } is unlayered CSS and
always beats the layered prose-no-margin utility from fumadocs-ui,
causing visible extra space at the bottom of info callout boxes.
Mirror prose-no-margin's intent at (0,2,1) specificity in globals.css
so the first/last-child margin resets actually apply.

Also bump NODE_OPTIONS in the lefthook test-and-check-packages hook
to 8 GB — @copilotkit/core:build bundles many deps inline with
rolldown and exhausts the default 4 GB V8 heap, causing a native
binding crash on every pre-commit run.
2026-05-26 09:22:47 -07:00
Jordan Ritter 381fb23994 chore(showcase): bump copilotkit to 0.1.91 in Python integrations
Picks up _extract_forwarded_headers_from_config from PR #4984, now
shipped as copilotkit 0.1.91 on PyPI. Three Python integrations move
forward together: langgraph-python, strands, langgraph-fastapi.

Updates validate-pins ratchet hash (count stays 106, FAIL set shifted
because showcase pins now diverge from Dojo on 0.1.91 vs 0.1.87).

Showcase auto-redeploys to Railway on merge via showcase_build.yml
(path filter showcase/**).
2026-05-26 09:21:43 -07:00
Ben Taylor 401e926967 Merge branch 'main' into release/publish/monorepo/v1.58.0 2026-05-26 11:01:19 -05:00
Jordan Ritter 15528f8c17 chore(sdk-python): release v0.1.91 (#5011)
## Summary

Bumps `sdk-python/pyproject.toml` from 0.1.90 → 0.1.91 so the
forwarded-header extraction added in #4984 ships to PyPI consumers.
Showcase Python integrations will pick this up via the follow-up
pin-bump PR.

## What's in 0.1.91

From #4984:
- `_extract_forwarded_headers_from_config()` extracts x-* headers from
LangGraph's RunnableConfig
- Lowercase-at-insertion key normalization for deterministic precedence
- Exception-safe ContextVar clearing on RuntimeError and generic
Exception paths

## Publishing

PyPI publish is manual — runs locally via `poetry publish` after merge.
Once #4996 lands, this will become automated.
2026-05-26 08:59:05 -07:00
Jordan Ritter 5f679863c6 chore(sdk-python): release v0.1.91
Cuts copilotkit 0.1.91 with forwarded-header extraction landed in
#4984 (_extract_forwarded_headers_from_config + lowercase-at-insertion
precedence + exception-safe ContextVar clearing).
2026-05-26 08:58:31 -07:00
Jordan Ritter 27d5e93a8b fix(sdk-python): forwarded-header extraction + showcase pins for D6 (#4984)
## Summary

Wires per-request x-* headers through the CopilotKit Python middleware
so LangGraph-based agents receive the original request's forwarded
headers (D6 "everything works" prerequisite). Four logical pieces:

1. **sdk-python forwarded-header extraction** —
`_extract_forwarded_headers_from_config()` reads x-* headers from
LangGraph's runtime config (both wrapper-dict
`copilotkit_forwarded_headers` and raw x-* keys), applies documented
precedence (context > configurable, wrapper > raw), lowercases keys at
insertion to make precedence deterministic across mixed-case headers,
and always clears the ContextVar on early-exit paths so stale headers
from a prior request cannot leak.

2. **sdk-python tests** — 47 new/modified test cases covering
wrapper-dict and raw extraction, context > configurable precedence,
mixed-case normalization, RuntimeError early-return clearing,
exception-path clearing, None/empty-config fallbacks, sync/async parity.

3. **Showcase Python pins** — pins `copilotkit==0.1.90` across
langgraph-python, strands, and langgraph-fastapi so the version that
runs in showcase matches the version that contains this fix. Bumps
`ag-ui-langgraph[fastapi]>=0.0.35` in langgraph-fastapi because
copilotkit 0.1.90 requires it transitively (the previous `==0.0.34` pin
would cause `pip install` to hard-fail).

4. **Showcase docker-compose** — adds
`LANGGRAPH_HTTP={"configurable_headers":{"include":["x-*"]}}` to the
shared `x-integration-defaults` anchor so langgraph-api includes x-*
headers in the runtime config; without this, langgraph-api 0.7+ strips
x-* headers before the agent ever sees them.

## Companion PR

Depends on the matching ag-ui PR that adds per-request header forwarding
across 5 integration adapters (langgraph, mastra, vercel-ai-sdk,
langchain, claude-agent-sdk). After ag-ui releases, bump the
`@ag-ui/langgraph` pin in `packages/sdk-js/package.json` in a follow-up.

## CR loop

- Round 1: surfaced 12 findings (4 ag-ui clusters + 6 CopilotKit
clusters) across 14 reviewers.
- Round 2 fix: docker-compose LANGGRAPH_HTTP YAML merge bug, sdk-python
wrapper-dict precedence, exception-path ContextVar leak,
RuntimeError-path leak, langgraph-fastapi version conflict.
- Round 2 confirmation: 14 reviewers, surfaced 4 new Bucket (a) findings
on CopilotKit side.
- Round 3 fix: lowercase-at-insertion + always-clear ContextVar on both
early-exit paths + ag-ui-langgraph[fastapi] bump.
- Round 3 confirmation: 7 reviewers, all NO_BUCKET_A_FINDINGS.
- Pre-push-quality: green (ruff, 47+87 pytests, build, docker-compose
config).

## Test plan

- [ ] CI green
- [ ] Showcase D6 LangGraph integration receives x-aimock-context header
end-to-end with x-AIMock-Strict propagation
- [ ] No regressions in other Python integrations (strands,
langgraph-fastapi)
- [ ] Docker compose still boots all integrations with the new shared
LANGGRAPH_HTTP env

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-05-26 08:55:46 -07:00
BenTaylorDev ebc09ea5c0 chore: release monorepo v1.58.0 2026-05-26 15:40:57 +00:00
Ben Taylor 14bb968625 fix(shell-docs): suppress docs-render snippet warnings + fix ComponentExamples render (#4992)
## Summary

Three changes to `src/lib/docs-render.tsx` that together eliminate the
`[docs-render] snippet missing for component X` log noise on prod AND
fix a hard SSR error on `/quickstart` caused by a missing
`ComponentExamples` registration.

## Changes

**1. Suppress warnings for components the MDX imports** (existing scope
of this PR).

`inlineSnippets()` runs after `stripLeadingImports()` removes the MDX's
`import` lines, so the regex can't tell a `<PascalCase />` reference
apart from a real React component imported into the file. Every imported
component triggered a false-positive `snippet missing` warning. The page
still rendered correctly via `docsComponents`; only the log was wrong.

Capture imports before stripping, then short-circuit the warning when
the regex hits one of those names.

**2. Add `ComponentExamples` to `SNIPPET_MAP`** (new).

`copilot-ui.mdx` imports `ComponentExamples` from
`@/snippets/component-examples.mdx` and renders it. When
`copilot-ui.mdx` is recursively inlined into a parent MDX (e.g. via
`<CopilotUI />`), the import line is stripped and the inliner finds no
`SNIPPET_MAP` entry for `ComponentExamples`. The bare JSX survives the
inliner and `next-mdx-remote` throws `Expected component
ComponentExamples to be defined` at SSR. The error is caught in a
partial-render error boundary so the page returns 200, but a chunk of
content is missing from the rendered output.

Add `ComponentExamples: "component-examples.mdx"` to `SNIPPET_MAP` so
the recursive inliner resolves it the same way it resolves `CopilotUI`.
One line, fixes both the SSR error and the cosmetic warning.

(Note: the `gatherImportedComponentNames` shortcut from change 1 doesn't
help here because it captures imports from the OUTER MDX, not from
recursively-inlined snippet bodies. That deeper structural limitation
can be addressed later; the `SNIPPET_MAP` entry resolves the immediate
failure.)

**3. Skip icon-prefix bare references** (new).

Lucide `Square*` icons (`SquareTerminal`, `SquareChartGantt`) and
`react-icons` `Fa*` / `Si*` / `Pi*` families are bare-referenced in many
MDX files — no explicit import, resolved at render time via the
registry's emoji stubs in `docsComponents`. The existing
`endsWith("Icon")` filter doesn't catch these PascalCase +
library-prefix shapes. Add a regex check next to it:
`/^(Fa|Si|Pi|Square)[A-Z]/`.

## Components covered after changes 1-3

The import-aware filter catches every `import { X } from "..."`
reference (current set: AgentCoreCommandTabs, CodePanel, CodeShowcase,
Frame, IframeSwitcher, ImageAndCode, LinkToCopilotCloud,
NewLookAndFeelPreview, StartProviders).

The icon-prefix filter catches `FaArrowUp`, `FaWrench`,
`SquareTerminal`, `SquareChartGantt`, and future icon-library additions
matching the prefix shape.

`ComponentExamples` is registered in `SNIPPET_MAP` so the inliner
resolves it instead of warning.

Remaining bare references that don't match any of the above (e.g.
`CloudCopilotKit`) still warn — these are runtime React components
registered in `docsComponents` but not imported in the MDX. The right
cleanup for those is to add explicit `import { CloudCopilotKit } from
"..."` lines in the MDX, which the import-aware filter then catches
automatically. Out of scope for this PR.

## Adjacent observation (not fixed)

While diagnosing change 2, found that the underlying
`new-look-and-feel.tsx` component file referenced by
`troubleshooting/migrate-to-1.8.2.mdx` doesn't exist on disk. The MDX
registry stubs the name with `<div>{children}</div>`, so the preview
area in that page renders empty. This PR doesn't address the
empty-preview behavior; the snippet-missing log noise is purely
cosmetic.

## Test plan

- [x] Diff is additive only; runtime render path unchanged.
- [ ] Local: build shell-docs, hit `/built-in-agent/quickstart` +
`/crewai-crews/quickstart` + `/built-in-agent/agentic-protocols/mcp` +
`/built-in-agent/shared-state/predictive-state-updates` +
`/built-in-agent/troubleshooting/migrate-to-1.8.2`. Confirm zero
`[docs-render] snippet missing` and zero `Expected component
ComponentExamples to be defined` warnings in the dev server log.
- [ ] Local: confirm the ComponentExamples Tabs block actually renders
on `/crewai-crews/quickstart` (was silently missing pre-fix).
- [ ] Post-deploy: re-check Railway logs for the warning + error class
over a sample of page loads.
2026-05-26 10:34:14 -05:00
Ben Taylor b672090d48 fix(shell-docs): exclude deprecated tutorials from built-in-agent sidebar (#4994)
## Summary

Tutorial entries appeared in the sidebar nav on every Built-in Agent
docs page (e.g. `/built-in-agent/quickstart`) despite the section being
deprecated. Clicks worked because the redirect catalog 301s
`/{fw}/tutorials/:path*` to `/{fw}/quickstart`, but the entries should
not be visible at all.

## Root cause

BIA runs in `docs_mode: "authored"`, which routes through
`buildFrameworkOnlyNav` → `buildNavTree`. That code path keeps section
headers and recurses through `"...folder"` spreads (unlike the
generated-mode path used by langgraph/mastra/google-adk, which strips
section headers via `buildFrameworkOverridesNav`).

BIA's `integrations/built-in-agent/meta.json` declared
`"---Tutorials---"` + `"...tutorials"`, so the spread descended into the
tutorials folder and enumerated its subfolders into the sidebar.

## Fix

Remove the two lines from BIA's parent `meta.json`:

```diff
 "---Premium Features---",
 "...premium",
-"---Tutorials---",
-"...tutorials",
 "---Troubleshooting---",
 "...troubleshooting"
```

Source MDX is preserved.

## Test plan

- [x] JSON validity confirmed via `node -e 'JSON.parse(...)'`.
- [ ] Post-deploy: confirm no `Tutorial:` entries in
`/built-in-agent/quickstart` sidebar HTML.
- [ ] Post-deploy: confirm
`/built-in-agent/tutorials/ai-todo-app/step-2-setup-copilotkit` still
301s to `/built-in-agent/quickstart`.
2026-05-26 10:24:42 -05:00
Austin Merrick 35c523fbb2 feat(skills): replace lifecycle skills with canonical copilotkit-* set (#4972)
## Summary

- Replaces the 6 old auto-generated lifecycle skills in root `skills/`
(`0-to-working-chat`, `debug-and-troubleshoot`, `go-to-production`,
`scale-to-multi-agent`, `spa-without-runtime`, `v1-to-v2-migration`)
with the correct canonical skills from `github.com/CopilotKit/skills` —
the old ones were generated by `@tanstack/intent`, never reviewed,
incorrect
- `skills/runtime`, `skills/react-core`, `skills/a2ui-renderer` remain —
still synced from `packages/*/skills/` as before
- Adds `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`,
and `.mcp.json` (wires the `copilotkit-docs` MCP server)
- Updates `sync-plugin-skills.ts` to exempt `copilotkit-*` slugs from
orphan detection so the sync check does not flag them

## Skills added

| Slug | Purpose |
|------|---------|
| `copilotkit-setup` | Add CopilotKit to a project |
| `copilotkit-develop` | Build AI features with v2 hooks/components |
| `copilotkit-agui` | AG-UI protocol and custom backends |
| `copilotkit-integrations` | Wire LangGraph, CrewAI, Mastra,
PydanticAI, ADK, etc. |
| `copilotkit-debug` | Diagnose runtime/agent/streaming issues |
| `copilotkit-upgrade` | v1 → v2 migration |
| `copilotkit-contribute` | Contribute to the OSS monorepo |
| `copilotkit-self-update` | Refresh installed skills |

## Test plan

- [ ] Install plugin locally: `cc plugins install /path/to/CopilotKit` —
verify 8 skills appear
- [ ] Verify `copilotkit-docs` MCP server auto-configures via
`.mcp.json`
- [ ] Confirm `pnpm run check:plugin-skills` still passes
- [ ] Archive `github.com/CopilotKit/skills` after merge
2026-05-26 08:06:58 -07:00
Maxim 61341acc03 feat(dojo): promote HITL and interrupt-based HITL into Featured section (#4980)
## Summary

- Adds per-integration `EXTRA_FEATURED_BY_INTEGRATION` map to the dojo
shell
- `hitl-in-chat`, `hitl-in-app`, and `gen-ui-interrupt` appear in
Featured **only** for LangGraph Python, LangGraph TypeScript, LangGraph
FastAPI, and Google ADK
- All other integrations see the original 9-item Featured list — zero
behavioral change
- Unsupported demos (e.g. `gen-ui-interrupt` on ADK) are silently
skipped per existing filter logic

Resolves OSS-138

## Test plan

- [x] Built-in Agent: 9 Featured items (original list, no HITL) — no
change from before
- [x] LangGraph Python: 12 Featured items (original 9 + 3 HITL extras)
- [x] Google ADK: 11 Featured items (original 9 + 2 HITL;
`gen-ui-interrupt` correctly skipped as `not_supported`)
- [ ] Review order/placement with Atai before merging

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-05-26 15:22:13 +02:00
Maxim 37a6e35092 fix(dojo): remove langgraph-typescript from HITL featured integrations
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-26 14:22:18 +02:00
Maxim 322704bb91 feat(dojo): scope HITL featured demos to LGP and ADK integrations
Add EXTRA_FEATURED_BY_INTEGRATION map so hitl-in-chat, hitl-in-app, and
gen-ui-interrupt only appear in Featured for langgraph-python,
langgraph-typescript, langgraph-fastapi, and google-adk. All other
integrations see the original 9-item Featured list unchanged.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-26 14:22:18 +02:00
Maxim f48e8bd6d7 feat(dojo): promote HITL and interrupt-based HITL into Featured section
Surface hitl-in-chat, hitl-in-app, and gen-ui-interrupt in the dojo's
hand-curated Featured list so they are visible at the top of the sidebar
for every integration that supports them (LGP, ADK, etc.). Unsupported
demos are silently skipped per the existing filter logic.

Resolves OSS-138

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-05-26 14:22:18 +02:00
Sam Julien d0741b4fba fix(shell-docs): register ComponentExamples snippet + skip icon-prefix warnings
Two follow-on fixes to the same docs-render snippet pipeline.

1. ComponentExamples SSR error. The shared copilot-ui.mdx snippet
   imports ComponentExamples from @/snippets/component-examples.mdx
   and renders it. When copilot-ui.mdx is recursively inlined into a
   parent MDX (e.g. crewai-flows/quickstart.mdx via <CopilotUI />),
   stripLeadingImports removes the import line, then the regex hits
   <ComponentExamples /> with no matching SNIPPET_MAP entry. The
   inliner leaves the bare JSX in the output and at MDX render time
   next-mdx-remote throws "Expected component ComponentExamples to be
   defined". Add the snippet to SNIPPET_MAP so the recursive inliner
   resolves it the same way it resolves CopilotUI.

   The gatherImportedComponentNames shortcut from the same PR only
   captures imports in the OUTER MDX, not in recursively inlined
   snippet bodies — a deeper structural limitation worth fixing later
   but not load-bearing here. The SNIPPET_MAP entry resolves both the
   SSR error AND the false-positive warning in one line.

2. Icon-library bare references logging spurious warnings. Lucide
   Square-prefixed icons (SquareTerminal, SquareChartGantt) and
   react-icons fa / si / pi families appear bare in many MDX files —
   no import, resolved at render time via the registry's emoji stubs.
   The existing endsWith("Icon") filter doesn't catch these. Add a
   PascalCase-prefix check next to it.

Strictly additive; runtime render path unchanged.
2026-05-22 22:08:41 -07:00
Sam Julien d3f164d21d fix(shell-docs): exclude deprecated tutorials from built-in-agent sidebar
The Built-in Agent sidebar still rendered the deprecated tutorials section
("Tutorial: AI Todo App", "Tutorial: AI Textarea" with step pages) even
after PR #4987 added 301 redirects for /{fw}/tutorials/:path* paths.
The redirects fired on click, but the entries should never have appeared.

Root cause: integrations/built-in-agent/meta.json declared a
"---Tutorials---" section header followed by a "...tutorials" spread.
BIA runs in docs_mode "authored" which routes through buildFrameworkOnlyNav;
that path preserves section headers and recurses through spreads. The
spread descended into integrations/built-in-agent/tutorials/ and
enumerated the AI Todo App and AI Textarea subfolders into the sidebar.

Other frameworks were already safe: buildFrameworkOverridesNav (used by
generated-mode frameworks like langgraph, mastra, google-adk) explicitly
strips section nodes from per-framework override nav.

Fix: remove the "---Tutorials---" section header and "...tutorials"
spread from BIA's parent meta.json. Nothing now references the
tutorials folder from BIA's nav, so the spread handler never recurses
into it and the entries disappear. Two-line minimal change.

Tutorial source MDX under content/docs/integrations/built-in-agent/tutorials/
stays in place (PDX-100 owns the rewrite). The redirect catalog in
lib/seo-redirects.ts is untouched.

Refs PDX-205.
2026-05-22 21:25:27 -07:00
Sam Julien d8c730c222 fix(shell-docs): suppress missing-snippet warnings for imported components
inlineSnippets() runs after stripLeadingImports() removes the MDX's
import lines, so its regex scan can't tell whether a `<Component />`
reference is a snippet lookup or a real React component rendered via
the docsComponents registry. Every imported component triggered a
false-positive "[docs-render] snippet missing for component X"
warning.

Capture the set of imported component names BEFORE stripping, then
short-circuit the warning when the regex hits one of those names.
Catches NewLookAndFeelPreview, AgentCoreCommandTabs, CodePanel,
CodeShowcase, Frame, IframeSwitcher, ImageAndCode, LinkToCopilotCloud,
and StartProviders (the full current set imported into snippet MDX
files under src/content/snippets/), plus any future additions
automatically.

The runtime render path is unchanged: the docsComponents registry
in mdx-registry.tsx still resolves these names at render time.
2026-05-22 19:12:46 -07:00
Jordan Ritter ddcde1133e fix(packages): canonicalize docs.copilotkit.ai URLs in user-facing messages (#4991)
## Summary

Replace `docs.copilotkit.ai` URLs in user-facing console messages, JSDoc
comments, and in-product help links that currently 301 through the
legacy redirect catalog. Users clicking these links from console
warnings, IDE hover docs, or the help modal now reach the destination
page in one hop.

## URL changes

| Old | New |
|---|---|
| `/premium#how-do-i-get-access-to-premium-features` |
`/premium/overview#getting-access` |
| `/coagents/quickstart/langgraph` | `/langgraph-python/quickstart` |
| `/coagents/shared-state/predictive-state-updates` |
`/langgraph-python/shared-state/predictive-state-updates` |
| `/reference/v1/hooks/useCopilotChatHeadless_c` |
`/reference/v2/hooks/useCopilotChatHeadless_c` |
| `/coagents/troubleshooting/common-issues` |
`/langgraph-python/troubleshooting/common-issues` |
| `/quickstart#get-a-copilot-cloud-public-api-key` |
`/built-in-agent/quickstart#create-a-free-account` |
| `/premium` | `/premium/overview` |

All 7 updated URLs reverify as direct HTTP 200, no redirect.

## URLs deliberately left as-is (already 200 direct)

`/migration-guides/migrate-attachments` (10 occurrences),
`/migration/render-message`, `/telemetry`. These resolve in one hop
today; no change needed.

## Out of scope (separate follow-up)

`packages/shared/src/utils/errors.ts` defines a `BASE_URL` constant +
concatenated troubleshooting anchors (e.g.
`#i-am-getting-agent-not-found-error`) that no longer match destination
page IDs after the v1 → v2 reference port. Each anchor needs a per-link
mapping decision; tracked separately.

## Files touched

- `packages/react-core/src/components/usage-banner.tsx`
- `packages/react-core/src/hooks/use-coagent-state-render.ts`
- `packages/react-core/src/hooks/use-coagent.ts`
- `packages/react-core/src/hooks/use-copilot-chat.ts`
- `packages/react-ui/src/components/help-modal/modal.tsx`
- `packages/runtime/src/lib/observability.ts`
- `packages/shared/src/utils/console-styling.ts`

No package.json, no package-lock.yaml, no pnpm-lock.yaml changes. Pure
string substitution + an incidental `consistent-type-imports`
reformatting by the repo's lefthook on `observability.ts` (mechanical,
behavior-preserving).

## Test plan

- [x] Per-URL `curl -sSI` reverify against prod: all 7 updated URLs
return `HTTP 200` in one hop.
- [x] Targeted tests pass for affected packages:
`@copilotkit/react-core`, `@copilotkit/react-ui`, `@copilotkit/shared`,
`@copilotkit/runtime`.
- [ ] Reviewer eyeball: confirm replaced URLs read sensibly in their
JSDoc / error-message context.
2026-05-22 16:50:53 -07:00
Jordan Ritter 832508194f fix(shell-docs): post-cutover polish (metadata, OG, 404, pydantic-ai, v1 redirect) (#4990)
## Summary

Three independent regressions surfaced during Phase 6 post-cutover
validation against the live docs.copilotkit.ai. Bundled together since
they all live under `showcase/shell-docs/` and were verified together
end-to-end.

### 1. Soft-404 returning HTTP 200 with not-found UI body

Unknown URLs returned `HTTP 200` with the Next.js "404: This page could
not be found" body. Internal Next 404 markers
(`NEXT_HTTP_ERROR_FALLBACK`, `<meta name="robots" content="noindex">`)
were present in the body but the wire status stayed 200. Google treats
this as low-quality content and demotes the entire site.

Root cause: `<Suspense fallback={null}>` in `app/layout.tsx` committed
the response stream at status 200 before page-level `notFound()` could
flip it.

Fix:
- Removed the layout Suspense wrapper (both PostHogProvider and
FrameworkProvider are `"use client"` with no suspending APIs, so the
boundary was incidental from the original telemetry port).
- Added an explicit `src/app/not-found.tsx` rendering a branded 404
page.
- Marked the three catch-all routes `dynamic = "force-dynamic"` so
unknown slugs always re-evaluate at request time. Reference route stays
SSG (its slugs come from `referenceStaticParams`).

Verified: `/this-clearly-does-not-exist` returns `HTTP 404`. Real pages
return 200.

### 2. Per-page metadata + OG / Twitter cards

All four `generateMetadata` functions returned only
`alternates.canonical`. Every page inherited the layout's generic `<meta
name="description">` and emitted zero `og:*` / `twitter:*` tags. Every
social share unfurled bare.

Fix: routes now build full `Metadata` via a shared
`src/lib/seo-metadata.ts` helper that reads MDX frontmatter for title
and description and emits openGraph + Twitter card with absolute URLs.

Bonus fix in `app/og/[...slug]/route.tsx`: the OG image route fetched
Inter TTFs from `fonts.gstatic.com` on every request. Any failure
(Railway egress, font URL drift) tripped the catch block, which 307'd to
a 25-byte broken CDN fallback. Dropped the runtime font fetch (Satori's
default sans-serif renders cleanly), broadened slug resolution to also
try `integrations/<folder>/<slug>` paths, and replaced the
broken-fallback redirect with a real 500 + log.

Verified locally: full og/twitter meta set on every page;
`/og/built-in-agent/quickstart/og.png` and
`/og/langgraph-python/quickstart/og.png` both return 1200x630 PNGs with
branded backgrounds.

### 3. Pydantic-ai shared-state pages 500

`/pydantic-ai/shared-state/in-app-agent-read` and
`/pydantic-ai/shared-state/in-app-agent-write` returned deterministic
HTTP 500. Same paths on all other frameworks returned 200. A full
sitemap crawl (2451 URLs) found these as the only 5xx on the entire
site.

Root cause: both MDX files at
`src/content/docs/integrations/pydantic-ai/shared-state/in-app-agent-{read,write}.mdx`
were truncated/malformed during the v1→v2 content port — `read.mdx`
ended mid-Python-fence with unclosed `<Step>` / `<Steps>`; `write.mdx`
had a Python code fence containing JS/TSX. Pure MDX parse failure during
SSR.

Fix: restored both files from the canonical legacy source under
`docs/content/docs/integrations/pydantic-ai/shared-state/`, stripped
leading `import` blocks per the convention used by other pydantic-ai
pages (components resolve via `docsComponents` in
`src/lib/mdx-registry.tsx`).

Verified locally: both URLs go 500 → 200.

### 4. `/reference/v1/:path*` redirect dropped its suffix

Catalog rule P10 redirected `/reference/v1/hooks/useCopilotChat` to a
generic `/reference/v2` index instead of
`/reference/v2/hooks/useCopilotChat`. Users following v1 docs links from
product code messages landed on the wrong page.

Fix: one-line change in `seo-redirects.ts`: destination `/reference/v2`
→ `/reference/v2/:path*`. Audited all other catalog rules with `:path*`
source and bare destination — remaining cases (`concepts/*` collapse,
tutorials deprecation wildcards) are documented intentional
wildcard-to-single-page rules, not drift.

## Test plan

- [x] `npm run typecheck`, `npm run lint`, `npm test` (32 tests pass),
`npm run build` all green in `showcase/shell-docs/`.
- [x] Local prod-mode walkthrough on all four fix surfaces:
- `/built-in-agent/quickstart` → 200 + full og/twitter meta + per-page
description + branded OG PNG.
  - `/langgraph-python/voice` → 200, live demo iframe renders.
- `/built-in-agent/garbage-page-xyz` → 404 (real status, branded 404
page).
  - `/pydantic-ai/shared-state/in-app-agent-read` → 200.
- `/reference/v1/hooks/useCopilotChat` → 301 →
`/reference/v2/hooks/useCopilotChat` → 200.
- [ ] Post-deploy: re-curl a sample of soft-404 URLs against prod and
confirm wire status is `404`, not `200`.
- [ ] Post-deploy: validate a docs URL share in Slack / X to confirm OG
card renders with title + description + image.
2026-05-22 16:50:42 -07:00
Jordan Ritter fd296144a8 fix(shell-docs): region tag + HubSpot hydration + snippet registry (#4988)
Five post-cutover follow-ups bundled together because all surfaced in
the same spot-check pass on `/integration/<page>` routes.

## 1. Tag `page-send-message` region (`4680eb9c1`)

`/langgraph-python/programmatic-control` and
`/google-adk/programmatic-control` rendered a yellow "Missing snippet"
callout because `<Snippet region="page-send-message" />` had no matching
`// @region[page-send-message]` / `// @endregion[page-send-message]`
pair in the resolved `headless-complete` cell. Peer integrations
(mastra, ag2, strands, pydantic-ai, llamaindex, langgraph-fastapi,
crewai-crews, …) already had the tags; only north-star and its ADK
mirror were missing them. The region wraps the connect / send / stop
block in `chat/chat.tsx`.

## 2. Suppress HubSpot-rewritten href hydration mismatch on nav-bar
(`2c0791930`)

HubSpot's analytics tag (loaded from `js-na2.hs-analytics.net`) rewrites
the Intelligence CTA's outbound `href` client-side to append `__hstc` /
`__hssc` / `__hsfp` cross-domain tracking params. Server-rendered HTML
keeps the bare URL, post-hydration DOM has the rewritten URL, React's
hydration diff fires.

Add `suppressHydrationWarning` to the two anchor elements that point at
`INTELLIGENCE_CTA_HREF` (desktop BrandNav `LEFT_LINKS` entry,
MobileTopNav Lightbulb icon).

## 3. Register `UseAgentSnippet` (`f809b9b8b`, expanded by `773631cbd`)

`inlineSnippets()` in `docs-render.tsx` maintains its own `SNIPPET_MAP`
separate from `mdx-registry.tsx`'s `STUB_PARTIAL_MAP`. The two
registries drifted. `UseAgentSnippet` was the most-hit miss, but Railway
logs surfaced 14 more: `InstallSDKSnippet`, `InstallPythonSDK`,
`RunAndConnect` (+ `Snippet` alias), `CopilotUI`, `LandingCodeShowcase`,
the four `CopilotCloudConfigure*` / `SelfHostingCopilotRuntime*` keys,
plus `MigrateTo` / `MigrateToV` / `ToolRenderer` aliases. All added.

## 4. Make `inlineSnippets()` code-fence-aware + add Icon-suffix
heuristic (`773631cbd`)

After the registry fix, the remaining `[docs-render] snippet missing`
log entries split into two false-positive classes:

- **Code-fence false positives.** The regex matched `<Component />`
references inside ` ```tsx ``` ` example blocks — e.g. `<CopilotChat />`
/ `<CopilotSidebar />` shown as runtime usage, `<WeatherCard />` /
`<YourApp />` as placeholders. A new `isInsideCodeFence(content,
offset)` helper tracks fenced blocks (matching any indentation — MDX
inside `<Step>` is routinely 8-space-indented) and inline-code spans.
Replaces the ad-hoc `CopilotChat`-only allowlist from commit 3.
- **JSX-prop runtime components.** `icon={<PaintbrushIcon />}` etc. are
real React components from `mdx-registry.tsx::docsComponents`, not
snippets. Add an `Icon`-suffix heuristic: lucide icons used as JSX props
are silenced.

## 5. Suppress HubSpot hydration mismatch on `<OpsPlatformCTA>` +
`<SignupLink>` (`10b4960a3`)

Same HubSpot rewrite hits every dashboard.operations.copilotkit.ai
outbound link. Add `suppressHydrationWarning` to all four `<a>` tags in
`OpsPlatformCTA` (`info` / `inline` / `tile` / `card` variants) and the
single `<a>` in `SignupLink`. Observed live as a hydration error on
`/<framework>/prebuilt-components`, `/<framework>/headless`, and any
page that embeds an Intelligence-platform CTA.

## Verification

- `grep -n "@region\[page-send-message\]"
showcase/integrations/{langgraph-python,google-adk}/src/app/demos/headless-complete/chat/chat.tsx`:
both files have start (line 38) + end (line 114) markers; `diff` between
them is empty post-change.
- `npx tsx showcase/scripts/bundle-demo-content.ts`: regenerated
`demo-content.json` exposes `regions["page-send-message"]` for both
`langgraph-python::headless-complete` and
`google-adk::headless-complete` (1878 bytes, `chat/chat.tsx` lines
38-112).
- Playwright sweep across `/programmatic-control`,
`/runtime-server-adapter`, `/frontend-tools`,
`/generative-ui/tool-rendering`, `/prebuilt-components`,
`/deploy/agentcore`, `/auth` on `google-adk` and `mastra`: 0 console
errors, 0 warnings, 0 "Missing snippet" callouts in rendered DOM, both
desktop (1440px) and mobile (390px) viewports.

## Test plan

- [ ] Pull, build shell-docs, smoke
`/langgraph-python/programmatic-control` and
`/google-adk/programmatic-control`: yellow "Missing snippet" callout is
gone.
- [ ] Same pages on a mobile viewport: no hydration warning in the
console.
- [ ] `/<framework>/prebuilt-components` and any page with an inline
`<OpsPlatformCTA>`: no hydration warning.
- [ ] Peer integration pages (e.g. `/mastra/programmatic-control`,
`/<framework>/deploy/agentcore`, `/<framework>/frontend-tools`):
snippets still render, no `[docs-render] snippet missing` warnings.
- [ ] Redeploy shell-docs.

## Out of scope

- Underlying prose-vs-code parity gap on the headless-complete cell
(north-star uses `agent.abortRun()` and skips `connectAgent`) is tracked
separately.
- Unifying `docs-render.tsx::SNIPPET_MAP` and
`mdx-registry.tsx::STUB_PARTIAL_MAP` into a single source of truth (so
future entries can't drift) is the right architectural follow-up. Filed
separately.
- Environmental jsdom × vitest interaction blocking
`packages/web-inspector/src/lib/__tests__/telemetry.test.ts` (which
forced `--no-verify` on these commits) is tracked separately.
2026-05-22 16:50:31 -07:00