22 substantive primary checklists at the qa/agentic-chat.md quality
bar (specific testids, timeouts, expected results) plus 3 short stubs
for testing-kind demos (interrupt-headless, tool-rendering-reasoning-chain,
reasoning-default-render). 25 files total.
Declare open-gen-ui and open-gen-ui-advanced in langgraph-python
manifest (code existed, was never registered). Add both to
constrained-explicit allowlist, fill shell_docs_path for 5 demos,
add hitl-in-app override, drop stale chat-customization-css fallback.
Regenerate registry.json, demo-content.json, constraints.json,
and docs-status.json across shell / shell-dojo / shell-docs.
Bump feature/demo count assertion 30→32 in generate-registry test.
Extend check-binaries.sh whitelist for sister-shell demo-content.
Documents fleet-wide Railway auto-update configuration (all 41 services),
the environmentPatchCommit API for enabling on new services, CI coupling
with explicit redeploy for health-check determinism, and known quirks
around polling frequency and API surface.
Resolves former priority item 5. The Styling sections on the chat, sidebar,
and popup prebuilt-component pages (base + unselected/) each had an inline
tsx code fence that duplicated styling patterns already covered on the
dedicated /custom-look-and-feel/{css,slots,headless-ui} pages. Per Atai's
directive that every code fence in shell-docs should be a showcase-linked
Snippet, not hand-written, removing these fences is the right move here.
Section headers, intro copy, and bullet links to the dedicated styling
pages are preserved — those are legitimate pointers.
⚠️ **Docs sync — MANUAL REVIEW REQUIRED**
This PR was auto-opened because the docs-sync script detected
showcase-local modifications overlapping with upstream changes.
The script attempted a best-effort 3-way merge:
- Where `git merge-file` produced a clean merge, the merged content was
written.
- Where `git merge-file` produced conflict markers, **upstream content
was written as-is** and showcase-local modifications were overridden.
**Manual review required.**
### Review items
```
Files where 3-way merge FAILED — upstream content written as-is, local modifications overridden. Manual review REQUIRED before merging this PR:
- docs/content/docs/(root)/ag-ui-middleware.mdx
- docs/content/docs/(root)/inspector.mdx
- docs/content/docs/integrations/microsoft-agent-framework/auth.mdx
- docs/content/docs/integrations/microsoft-agent-framework/frontend-tools.mdx
- docs/content/docs/integrations/microsoft-agent-framework/generative-ui/state-rendering.mdx
- docs/content/docs/integrations/microsoft-agent-framework/human-in-the-loop.mdx
- docs/content/docs/integrations/microsoft-agent-framework/quickstart.mdx
- docs/content/docs/integrations/microsoft-agent-framework/shared-state/in-app-agent-write.mdx
- docs/snippets/shared/generative-ui/tool-rendering.mdx
- docs/snippets/shared/troubleshooting/error-debugging.mdx
Files auto-merged via 3-way merge (clean, no conflict markers — still worth a glance):
- docs/content/docs/integrations/microsoft-agent-framework/agent-app-context.mdx
- docs/content/docs/integrations/microsoft-agent-framework/generative-ui/tool-rendering.mdx
- docs/content/docs/integrations/microsoft-agent-framework/shared-state/in-app-agent-read.mdx
- docs/content/docs/integrations/microsoft-agent-framework/shared-state/predictive-state-updates.mdx
```
### Source
- Upstream ref:
[`d3109ab0e`](https://github.com/CopilotKit/CopilotKit/commit/d3109ab0e)
- Workflow run:
https://github.com/CopilotKit/CopilotKit/actions/runs/24851556710
**Review before merging.** Auto-merge is intentionally disabled
for `needs-review` PRs — confirm the upstream-wins sections
preserve any intentional showcase-local divergence you want to
keep, then merge manually.
The Styling section referenced "import the stylesheet once at your app
boundary" but the fenced block was empty, leaving users with nowhere
to copy from.
Previously <main> was both the scroll container AND width-capped
(`flex-1 max-w-4xl px-8 py-10 overflow-y-auto`). The scrollbar
rendered at the capped column's right edge, parking it mid-viewport
with a blank gutter beside it.
Separate the concerns: <main> is now full-width with the scroll, and
an inner <div> caps the content width and owns the padding. Scrollbar
now lands at the viewport edge (or TOC's left edge on pages that
render the right-rail TOC).
Applies to the four docs entry points that shared this pattern:
the root overview, the /<framework> landing + scoped pages, the
/ag-ui route, and the shared DocsPageView used by scoped docs.
The four docs flex containers used `calc(100vh - 52px)` to subtract the
top nav, but BrandNav is 52px flex content + 1px bottom border = 53px.
The 1px undercount made body overflow by exactly 1px and produced a
document-level scrollbar on top of the inner <main>'s own scroll.
The reference route already uses `calc(100vh - 53px)`; this aligns the
other four layouts with that convention.
Adds multimodal-attachments, runtime-server-adapter, and vs-code-extension
pages under a new ---Platform--- section in meta.json. threads.mdx was
already in place and left untouched. fumadocs-ui import lines are stripped
since shell-docs pulls components from its MDX registry instead.
When the runtime registers an agent as default, CopilotKit hooks auto-select
it; passing agentId: "default" (or a stale "assistant" ID that isn't
actually registered) is noise. Applies to built-in-agent/shared-state.mdx
and unselected/shared-state.mdx across shell-docs and upstream.
Goal: fast 'wow that's fast' initial experience for users trying the
built-in agent. Sweeps shell-docs unselected/ and upstream built-in-agent/
so both trees match. Also collapses two mismatched GPT-4o rows in the
model-selection table into a single honest 'GPT-5.4 Mini' row.
LangChain wants to be referred to as LangChain in docs; LangGraph is the
under-the-hood graph framework. Updates prose only — URLs, package names,
code identifiers, and LangGraph Studio/Platform product names are preserved.
Upstream docs/ already reflects this change; this brings shell-docs into
alignment so the next sync does not regress.
three LLM base-URL env vars
The probe compared full normalized URLs, so OPENAI_BASE_URL
values with the /v1 path suffix (set on 28 of 34 services)
never matched the bare-origin AIMOCK_URL config. Only
ANTHROPIC_BASE_URL (4 claude-sdk services, no /v1) matched,
producing wiredCount:4 instead of the correct 34.
Root cause 1: pointsAtAimock used exact-URL comparison via
normalizeUrl. Switch to hostname-based matching via a new
extractHostname helper so /v1 path differences are ignored.
Root cause 2: GOOGLE_GEMINI_BASE_URL was missing from the
candidate env var list. Add it alongside OPENAI_BASE_URL and
ANTHROPIC_BASE_URL in a shared CANDIDATE_ENV_VARS constant.
Also adds showcase-shell-dojo to the EXCLUDE_SERVICES set
(infra service, not an LLM caller) and removes the now-dead
normalizeUrl function (replaced by extractHostname).
## Summary
- Follow-up to PR #4208: Railway's `DeploymentMeta` is a GraphQL
scalar (untyped JSON), not a typed object with sub-fields
- The query `latestDeployment { meta { imageDigest } }` fails with
a GQL validation error; fix: `latestDeployment { meta }` and
extract `imageDigest` from the parsed JSON object at runtime
- Zod schema updated from nested `z.object({imageDigest})` to
`z.record(z.unknown())` to match the scalar type
## Test plan
- [x] All 791 tests pass
- [x] TypeScript typecheck clean
- [x] Build succeeds
- [x] Verified the corrected GQL query returns valid data from
Railway's API (all services return imageDigest)
Railway's `DeploymentMeta` type is a GraphQL scalar (untyped JSON),
not a typed object. Using `meta { imageDigest }` in the query
produces a validation error. Fix: query `meta` without sub-selection
and extract `imageDigest` from the parsed JSON object.
## Summary
Phase 3 of the dashboard honesty pass, implementing all 7 sub-phases
from the [Notion
plan](https://www.notion.so/34b3aa381852812c9e12f34a6caa304a)
(v2.4) in a single PR.
### Sub-phases landed
- **3.0 Pre-flight**: Verified 34 e2e_smoke rows in PB. Producer gap
from PR #4200 is resolved.
- **3.1**: Renamed dashboard e2e subscription to e2e_smoke to match
the ops producer key shape. Updated formatLabel/formatTooltip dim
unions, all test fixtures.
- **3.2**: Added per-integration L1-L4 LevelStrip component
(Up/Wired/Chats/Tools badges). New subscriptions for agent, chat,
tools, e2e_smoke. aggregateConnection refactored to variadic. Tools
n/a gate: integration.demos.some(d => d.id === "tool-rendering").
- **3.3**: Retired HealthDot from per-feature cells (L1 Up badge in
strip replaces it). Dropped smokeRow from per-cell rollup (Decision
#7). Rollup now [healthRow, e2eRow] only. This enables first-ever
green rollups -- smokeRow was always null in production due to a
key-shape mismatch.
- **3.4**: Removed QA column entirely -- LiveBadge QA, CellState.qa,
subscription, legend entry. No producer ever existed.
- **3.5**: Docs four-glyph mapping: ok=checkmark, missing=middle dot,
notfound=cross, error=exclamation. Each DocState value now renders a
distinct glyph and tone.
- **3.6**: Legend rewrite -- dropped QA and Hosted rows, added L1-L4
strip documentation, expanded docs row for four glyphs, rewrote ?
footnote to "probe has not yet ticked since deploy".
- **3.7**: Added PackagesSection below starters grid. Extended
registry.json with packages array from showcase/shared/packages.json.
CI drift test ensures package set matches integration set.
### Behavior changes
- Per-cell rollup can now produce green (previously impossible because
smokeRow was always null due to the integration-scoped vs
feature-scoped key mismatch).
- QA column removed (was always showing ? with no producer).
- HealthDot removed from per-cell badges (replaced by L1 Up in strip).
- E2E badge now reads from e2e_smoke dimension (was reading dead e2e).
## Test plan
- [ ] vitest: 8 test files, 67 tests passing (baseline was 4 files,
52 tests)
- [ ] TypeScript: tsc --noEmit clean
- [ ] New tests: LevelStrip (7 tests), PackagesSection (3 tests),
DocsLink (2 tests), packages-drift CI test (1 test)
- [ ] Updated tests: live-status.test.ts (rollup fixtures updated for
Decision #7), feature-grid.test.tsx (e2e_smoke keys), dashboard.spec.ts
(e2e_smoke + agent/chat/tools fixtures)
- [ ] Verify at showcase.copilotkit.ai post-deploy: L1-L4 strip on
each integration + package row; docs four-glyph visible; no QA column;
green rollup on healthy cells
Railway stores tag-only refs like `ghcr.io/org/name:latest` in
`source.image`, so `parseImageRef().digest` is always null for
tag-deployed services. This caused the image-drift driver to
unconditionally set `currentImage = ""` and flip every service
red on every tick (false positive).
The fix:
- Discovery layer now queries `latestDeployment.meta.imageDigest`
from Railway's GraphQL API and surfaces it as `deployedDigest`
on `RailwayServiceInfo`.
- Driver prefers parsed digest from imageRef (backward compat for
digest-pinned refs), falls back to `deployedDigest`, then to
empty string.
- Three new tests cover the deployedDigest path: match (green),
mismatch (red+stale), and parsed-digest-wins precedence.
## Summary
- Showcase packages serve health/smoke at `/api/health` and `/api/smoke`
(Next.js app router convention), but the smoke probe driver was hitting
bare `/smoke` and `/health` for the package shape, causing 17/17
false-red rows every tick for both `smoke:<pkg>` and `health:<pkg>`.
- Update `deriveUrls` in the smoke probe driver so package-shape
discovery uses `/api/smoke` and `/api/health`, matching what starters
already do for `/api/health`.
- Fix `deriveAgentUrl` to handle `/api/smoke` path prefix correctly.
- Update tests to assert the corrected URL paths.
All 17 packages already had `/api/health` and `/api/smoke` route files;
the issue was purely in the probe driver's URL construction for the
package shape.
## Test plan
- [x] `pnpm --filter @copilotkit/showcase-ops test` passes (788/788)
- [ ] CI green
- [ ] After deploy, PB `smoke:<package>` and `health:<package>` rows
turn green for all 17 packages
Showcase packages serve health and smoke routes under /api/
(Next.js app router convention: src/app/api/health/route.ts
maps to /api/health), but the smoke probe driver was hitting
bare /smoke and /health for the package shape. This produced
17/17 false-red smoke and health rows every tick.
Update deriveUrls to use /api/smoke and /api/health for the
package shape, matching the actual route paths. The starter
shape already used /api/health and is unchanged.
## Summary
- Delete `showcase/aimock/Dockerfile` (wrapper image no longer used)
- Remove aimock from `showcase_deploy` workflow matrix + paths-filter +
dispatch options
- Update `showcase/aimock/README.md` to reflect direct-pull architecture
- Keep fixture JSONs (`smoke.json`, `feature-parity.json`) and
`RAILWAY.md` (actively used)
## Why
Phase 3 of the showcase-aimock wrapper elimination. Railway now pulls
`ghcr.io/copilotkit/aimock:latest` directly with a `startCommand` that
fetches fixtures from GitHub raw URLs. The wrapper Dockerfile, its
`ghcr.io/copilotkit/showcase-aimock` GHCR image, and the workflow
trigger are dead code.
## Test plan
- [ ] CI green
- [ ] showcase-aimock Railway service still healthy (unaffected by this
PR -- no runtime dependency on deleted files)
- [ ] `workflow_dispatch` option list no longer shows aimock
Railway now pulls ghcr.io/copilotkit/aimock:latest directly
via a startCommand that fetches fixtures from GitHub raw URLs.
The wrapper Dockerfile that copied fixtures into the image is
no longer needed.
Also updates README.md to reflect the new architecture:
- References Railway startCommand instead of Dockerfile
- Removes the Dockerfile entry from the fixtures listing
- Updates related workflow descriptions
⚠️ **Docs sync — MANUAL REVIEW REQUIRED**
This PR was auto-opened because the docs-sync script detected
showcase-local modifications overlapping with upstream changes.
The script attempted a best-effort 3-way merge:
- Where `git merge-file` produced a clean merge, the merged content was
written.
- Where `git merge-file` produced conflict markers, **upstream content
was written as-is** and showcase-local modifications were overridden.
**Manual review required.**
### Review items
```
Files where 3-way merge FAILED — upstream content written as-is, local modifications overridden. Manual review REQUIRED before merging this PR:
- docs/snippets/shared/generative-ui/tool-rendering.mdx
Files auto-merged via 3-way merge (clean, no conflict markers — still worth a glance):
- docs/content/docs/integrations/langgraph/generative-ui/state-rendering.mdx
```
### Source
- Upstream ref:
[`189c45fb4`](https://github.com/CopilotKit/CopilotKit/commit/189c45fb4)
- Workflow run:
https://github.com/CopilotKit/CopilotKit/actions/runs/24736203326
**Review before merging.** Auto-merge is intentionally disabled
for `needs-review` PRs — confirm the upstream-wins sections
preserve any intentional showcase-local divergence you want to
keep, then merge manually.
The initial shell-docs content-import left 21 reference pages with missing
import statements: 8 component pages had empty `## Import` code fences, and
13 hook pages had `## Signature` fences whose leading `import { X } from
"@copilotkit/react-core/v2";` line was stripped.
This commit restores the import(s) in the Import and Signature fences only.
Usage examples and other code blocks are intentionally not touched.
- 8 components: fill empty Import fence with named (or default for
CopilotChatView) import + styles.css side-effect import
- 13 hooks: prepend import line(s) at the top of the Signature fence.
- useComponent: 3 imports (z, type ComponentType, useComponent)
- useRenderTool: imports injected into both Wildcard and Named overload fences
- useCopilotChatConfiguration: imports injected into both Provider and
hook ### Signature subblocks
Replace em-dashes in prose across ~37 shell-docs files with appropriate
punctuation (colons, semicolons, commas, parens, periods). Also fixes a
hardcoded "LangGraph Python" reference in quickstart.mdx bridging text,
adds a user-friendly placeholder when no framework is selected on snippet
pages, and makes heading code font size proportional rather than fixed.
- Update registry.json, demo-content.json, status.json, constraints.json,
docs-status.json across shell/shell-docs/shell-dojo
- Add integration="langgraph-python" default to quickstart InlineDemo so
the base unscoped page shows a demo instead of being empty
- Replace FeatureMatrix stub with a real server-rendered table reading from
registry — 17 integrations × 12 curated feature columns, sticky first column,
✓/— cells, integration names link to /{slug} landing pages
- Fix matrix links from /integrations/{slug} (404) to /{slug}
- Remove redundant "Feature comparison" section from index.mdx (FeatureMatrix
was a stub pointing to same destination as IntegrationGrid)
- Add .reference-content .not-prose a rule to suppress underlines on card grids
inside MDX without breaking prose link styling
- Add intro sentence to "Explore by AI backend" section
- Correct 3 mismatched feature IDs in MDX (generative-ui-tool-based ->
gen-ui-tool-based, frontend-tools-sync -> frontend-tools, reasoning ->
agentic-chat-reasoning) so FeatureIntegrations renders integration chips
- Remove stale 'matrix' from RESERVED_ROUTE_SLUGS (no app/matrix/ route exists)
- Replace broken /matrix links in IntegrationGrid and search-modal with /
since the matrix lives in shell-dashboard, not shell-docs