Two SDK gaps surface in real MCP recall flows that the previous gate
revision still tripped on:
- The bash-issuing assistant message is consistently missing from
`stateManager.messageToRun` even though it is the message the
indicator needs to attach to. The first gate
`if (!messageRunId) return null;` fired before any of the slot
logic ran, so the pill never rendered.
- The threadId key in `messageToRun` can drift out of sync with the
chat configuration's threadId — same lookup, same null, same gate.
Drop the run-id dependency entirely. The indicator only needs
`agent.messages` and `message.role` / `message.toolCalls`, both of
which the runtime populates correctly in every observed flow. The
walk just finds the latest assistant-with-matching-tool-call across
`agent.messages`; tool result messages (`role: "tool"`) and prose-
only assistants are skipped without invalidating the slot.
Cross-run isolation moves to the phase machine: once an indicator
reaches `phase === "hidden"` it stays there. A later run on the
same chat does not resurrect a faded pill; the new run mounts fresh
indicator instances on its own assistant messages.
Net behaviour:
- Through a multi-step tool chain the pill stays put on the bash-
issuing assistant.
- When the run finishes, the existing 500 ms debounce -> 800 ms
check-hold -> 480 ms fade lifecycle plays out unchanged, then
hidden becomes terminal.
- Subsequent runs are independent: their first assistant-with-tool-
call message becomes the new canonical slot.
The pill's gate "the message must be the last message of its run" was
suppressed every time a `role: "tool"` result arrived between
successive assistant-with-tool-call messages. Real MCP recall flows
always interleave tool results between assistant tool-call messages,
so the assistant message holding the matching tool call lost its
"last in run" claim immediately, the indicator returned `null`, and
the pill flashed off. By the time the run finished, the final
prose-only assistant message was the last in the run and the pill
on the bash-bearing assistant stayed suppressed. Net result: the
user saw no pill at all during a real recall.
Change the gate to "the latest assistant-with-matching-tool-call
message in the run". Tool result messages (`role: "tool"`) and
prose-only assistant messages now skip through the walk without
invalidating an earlier matching-assistant's claim on the slot, so
the pill stays continuously through a multi-step tool chain and
transitions to checkmark on `isRunning` falling (debounced 500 ms,
unchanged) as before.
The existing test suite did not cover this case — none of the
walkthrough scenarios emit `role: "tool"` between successive
assistant messages. A regression test that interleaves a tool result
will land alongside this fix.
Search Flights and Sales Dashboard pills both produce visible surfaces
on the langgraph-python beautiful-chat demo. Three independent bugs were
masking each other:
- Flight TypedDict required `id` + `statusIcon`, which the aimock fixture
doesn't supply. langchain rejected the call with `flights.0.id: Field
required` and the agent surfaced the error string as the tool result.
Made the type permissive (only the fields `_build_flight_components`
reads need to be there).
- search_flights now expands flights into literal-children FlightCard
components server-side instead of relying on the structural-children
template form (the binder doesn't reliably expand it for our custom
catalog — sibling demos avoid the form for the same reason).
- Sales Dashboard pill went into a tool-call loop because the
userMessage+toolName fixtures matched both the initial call and the
post-tool turn. Hoisted the toolCallId fixture above them so the
follow-up turn returns content and breaks the loop.
Custom Row/Column reintroduced with `gap` support — the basic catalog's
versions ignore it, leaving cards squished. Children are array-of-strings
only (matches what the agent and fixture emit).
Two new e2e tests cover both pills end-to-end. 3s wait in beforeEach so
the v2 chat provider hydrates before the click dispatches. Full spec:
7/7 green.
Two follow-ups to the parity/cell-matrix fix:
1. The live cell view (`composed-cell.tsx`, `feature-grid.tsx` →
`ref-depth-column.tsx`) had the same regression-vs-ceiling collision —
they passed `regression={isRegression}` to DepthChip and `regression`
short-circuits the chip to red regardless of `maxDepth`. Switched
them to pass `maxDepth={maxPossible}` only, mirroring the matrix fix.
`RefDepthCellProps` also flips `regression?` → `maxDepth?` to stop
propagating the dead prop.
2. `computeMaxPossible` returned 6 whenever a D5 mapping existed, on the
assumption D6 was structurally reachable. There is no per-feature D6
registry, so D6 is a stretch goal in practice and every D5 cell was
rendered amber as "below ceiling". Cap at 5; D6-green cells still
render green because `depthColorClass` treats `depth >= maxDepth`
as at-ceiling. Tests updated accordingly.
`page.tsx` healthStats lost its `isRegression` short-circuit so it now
mirrors the same graduated logic the chips use.
## Summary
- The `langgraph-js` starter agent container has been crashing on
startup with `SyntaxError: The requested module
'@langchain/langgraph/web' does not provide an export named
'STREAM_EVENTS_V3_MODES'`
- Root cause: `@langchain/langgraph-api@1.2.1` (pulled transitively by
`npx @langchain/langgraph-cli`) imports `STREAM_EVENTS_V3_MODES` from
`@langchain/langgraph/web`, which only exists in
`@langchain/langgraph@1.3.0+`. The starter pinned langgraph to `1.2.9`
in both `package.json#overrides` and `agent/package.json#dependencies`,
so the symbol wasn't there at runtime
- Bump `@langchain/langgraph` to `1.3.0` in both pin sites
- Pin `@langchain/langgraph-cli@1.2.1` in the two npx invocations
(`agent/package.json` dev script and `docker/Dockerfile.agent` CMD) so a
future LangChain cross-package drift cannot silently re-break the
starter
This is the same class of failure as PR #4132 in `langgraph-typescript`.
Same starter family, same npx-pulls-latest fragility, different root
mitigation.
## Test plan
- [ ] CI smoke test for `langgraph-js` passes (currently failing on
`main` and on every open PR)
- [ ] `docker compose -f docker-compose.test.yml up` boots the agent
container without the `STREAM_EVENTS_V3_MODES` SyntaxError
- [ ] `npm install && npm run dev` from
`examples/integrations/langgraph-js/` brings up the agent on port 8123
Apply the same @langchain/core 1.1.44 and @langchain/langgraph 1.3.0 bumps
to the showcase copy that the Dojo received in the prior commits, so
validate-pins no longer flags drift between the two. Also pin
langgraph-cli@1.2.1 in the dev scripts here for the same reason as the Dojo.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The previous commit bumped @langchain/langgraph to 1.3.0 but missed the
peer-dep ripple: langgraph 1.3.0 peers @langchain/core ^1.1.44. The agent
pinned core 1.1.41 and the root override pinned 1.0.1, both below the
required range, so npm install in the agent container failed with ERESOLVE.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@langchain/langgraph-api@1.2.1 (pulled transitively by langgraph-cli) imports
STREAM_EVENTS_V3_MODES from @langchain/langgraph/web, which only exists in
1.3.0. The starter's overrides + agent dep were pinning langgraph to 1.2.9,
causing the agent container to crash on startup with a SyntaxError. Bump
the override and the direct pin to 1.3.0, and pin @langchain/langgraph-cli
in the npx invocations so future cross-package drift in the LangChain
ecosystem cannot silently re-break this starter.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary
Three logically-distinct commits landing on the legacy `docs/` site:
1. **Restore the Threads + Intelligence Platform docs** — reverts the
removal in commit `b08da7970`. Brings back the Threads management
surface (`useThreads` hook, multi-conversation tutorial, per-integration
Threads how-tos, the shared snippet) and the Intelligence Platform /
self-hosting pages, with sidebar entries.
2. **Drop the early-access password gate on threads pages** — removes
the `<ThreadsEarlyAccess>` wrapper from the five MDX entry points,
deletes the now-unused component, and unwires the MDX-registry entries
in the home and integrations route handlers. Threads is GA, no
client-side gate needed.
3. **Rebrand to "Enterprise Intelligence Platform"** — collapses the
three legacy phrasings (`CopilotKit platform`, `CopilotKit Intelligence
Platform`, `Intelligence Platform`) into one canonical name across
prose, CTA copy, frontmatter descriptions, and the Learn landing card.
## Scope notes
- URL slugs (`/learn/intelligence-platform`,
`/premium/intelligence-platform`) are intentionally unchanged —
text-only rename.
- The CTA component button label (`Get Intelligence free`) is unchanged.
- Existing typo "an CopilotKit platform" naturally resolves to
grammatically-correct "an Enterprise Intelligence Platform".
- `docs/public/llms-full.txt` is a generated artifact and is left alone
— it'll regenerate on the next build.
- This PR touches `docs/` only. The new `showcase/shell-docs/` site has
its own copy of these phrases that we'll handle separately.
## Test plan
- [ ] `/threads` renders without the password splash
- [ ] `/learn/threads`, `/reference/v2/hooks/useThreads`,
`/learn/tutorials/multi-conversation-chat`, and the per-integration
`/<framework>/threads` pages all render without the gate
- [ ] `/learn/intelligence-platform` and `/premium/self-hosting` pages
render with the new brand name
- [ ] Sidebars on root, learn, reference/v2/hooks, and the 12
integration sections show their restored entries
- [ ] CTA cards on the home page, quickstart, prebuilt-components,
shared-state, and integration overview pages show "Enterprise
Intelligence Platform" copy
- [ ] CTA button still says "Get Intelligence free" and routes to
dashboard with `try_for_free_clicked` PostHog event
## Summary
- Bump `@copilotkit/{a2ui-renderer,react-core,react-ui,runtime}` from
`1.56.5-canary.1777671752` to `1.57.0` in `apps/app/package.json` and
`apps/bff/package.json`
- Bump `ghcr.io/copilotkit/intelligence/composite` from `0.1.0-rc.16` to
`0.1.0` in `docker-compose.yml`
- Align the Dockerfile python pin (`copilotkit==0.1.78`) with
`apps/agent/pyproject.toml` (`copilotkit==0.1.86`)
- Regenerate `package-lock.json` against the new stable npm pins
## Test plan
- [ ] CI's `showcase_validate.yml` passes (or reports an expected
ratchet drop in `validate-pins` baseline that a maintainer can reset)
- [ ] `docker pull ghcr.io/copilotkit/intelligence/composite:0.1.0`
succeeds (verify the literal tag string matches what is published)
- [ ] From `examples/integrations/langgraph-python-threads/`: `npm
install && docker compose up` boots cleanly with the new pins
- [ ] BFF connects to the intelligence composite at `0.1.0` without API
surface drift
🤖 Generated with [Claude Code](https://claude.com/claude-code)
## Summary
The parity-matrix and cell-matrix views were rendering virtually every
D5 cell as red. Root cause is a collision between two definitions of
"regression":
- `depth-utils.ts` redefines `isRegression` as `achieved < maxPossible`
("below structural ceiling"), not "below historical max_depth".
- `computeMaxPossible()` returns **6** whenever a D5 mapping exists, on
the assumption D6 is also reachable. In practice D6 probes are rare
(commit `eda75a512` even said *"D5 mapping means max=5 not 6 (D6 probes
are rare)"* — that cap is no longer in the file).
- `parity-matrix.tsx` and `cell-matrix.tsx` passed
`regression={depth.isRegression}` to `DepthChip` but **never**
`maxDepth`.
- `DepthChip` short-circuits to red when `regression` is true,
regardless of depth.
Net: any wired cell that hit D5 without a green D6 probe →
`isRegression=true` → red.
## Fix
Pass `maxDepth={depth.maxPossible}` and drop `regression` for the
not-at-ceiling case. This re-engages `DepthChip`'s intended graduated
coloring:
- green at ceiling (`achieved >= maxDepth`)
- amber 1–2 below
- red 3+ below
The `isRegression` field is still consumed by `cell-matrix`'s
`filter="regressions"` row filter — that's unchanged.
## Test plan
- [x] `parity-matrix`, `cell-matrix`, `depth-utils`, `depth-chip` unit
tests — 93/93 passing
- [ ] Visual check on dashboard: D5 cells with `maxPossible=6` should
now show amber, not red
- [ ] Cells whose probes only reach D4 should still show green at D4
(already covered by chip's graduated logic)
- [ ] Cells with achieved < maxPossible by 3+ should still show red
The matrix chips were hard-coded red at D5 because parity-matrix and
cell-matrix passed `regression={depth.isRegression}` to DepthChip but
never `maxDepth`. DepthChip short-circuits to red when `regression` is
true, regardless of depth. Since `isRegression` was redefined as
`achieved < maxPossible` and `computeMaxPossible` returns 6 whenever a
D5 mapping exists, every D5 cell without a green D6 probe (the common
case — D6 probes are rare) ended up red.
Pass `maxDepth={depth.maxPossible}` and drop the `regression` prop. This
re-engages the chip's intended graduated coloring: green at ceiling,
amber 1-2 below, red 3+ below. The `isRegression` field is still used
by the cell-matrix `filter="regressions"` row filter — that's unchanged.
Replaces canary @copilotkit/* (1.56.5-canary.1777671752) and the intelligence
composite RC tag (0.1.0-rc.16) with the just-released stable artifacts so users
cloning this starter get a reproducible configuration. Also aligns the
Dockerfile copilotkit Python pin (0.1.78) with apps/agent/pyproject.toml (0.1.86).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
When the PR-changed file collection happens to be all files oxfmt
rejects internally (it does so for tsconfig-style JSONC, certain meta
configs, and other heuristic-filtered shapes — observed locally with
docs/**/meta.json and docs/lib/*.ts), oxfmt exits with "Expected at
least one target file" and fails the check job even though there is
nothing to format. The flag turns that no-op case into a clean exit,
matching the existing carve-out the workflow already documents for
lockfiles.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Threads pages: drop @copilotkit/cli-vnext alias for the canonical
@copilotkit/cli, bump react-core minimum from v1.50 to v1.56, and trim
the redundant "(via Copilot Cloud or self-hosted)" parenthetical from
the Prerequisites bullets.
Self-hosting snippet: restructure the "What is this?" intro into a
labeled "What you bring" / "What the chart deploys" pair (with a
component table for ports), tighten the kubeconfig-check sentence, and
collapse the local-validation Callout into two parallel options (bundled
overlay vs one-shot script). Drop the "If none of these apply, use
Copilot Cloud" line — readers who land on /premium/self-hosting have
already opted in.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The self-hosting pages are heavy on helm install, kubectl apply, and
shell-script invocations — without these in KNOWN_INSTALL_TYPES they
all bucket as "code" and the self-hosting funnel goes blind to install
method. Skips sudo deliberately: it's a wrapper that would swallow the
real installer in the funnel.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Threads, Intelligence Platform explainer, multi-conversation
tutorial, useThreads reference, and the shared threads snippet were
restored at their pre-rollout state, so they carried no OpsPlatformCTA
while peer pages picked one up earlier on this branch. Wires each
restored page to the new try_for_free_clicked event with snake_case
surface identifiers, and fixes the "a Enterprise" → "an Enterprise"
article mismatch the rebrand left in both self-hosting pages.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Renames the platform name across docs prose, CTA copy, frontmatter
descriptions, and the Learn landing card. Three patterns were collapsed
into one canonical form:
- "CopilotKit platform" → "Enterprise Intelligence Platform"
- "CopilotKit Intelligence Platform" → "Enterprise Intelligence Platform"
- "Intelligence Platform" → "Enterprise Intelligence Platform"
URL slugs (/learn/intelligence-platform, /premium/intelligence-platform)
are intentionally unchanged. The CTA component button label
("Get Intelligence free") is also unchanged.
The ThreadsEarlyAccess wrapper hid Threads, the multi-conversation
tutorial, useThreads, and the shared snippet behind a client-side
password splash. Threads is now generally available, so remove the
wrapper from the five MDX entry points, drop the component, and unwire
the MDX registry entries in the home and integrations route handlers.
This restores the Threads management surface (useThreads hook, the
multi-conversation tutorial, per-integration Threads how-tos, the
shared snippet), the Intelligence Platform / self-hosting pages, and
the sidebar entries that were dropped in b08da7970.
This reverts commit b08da79700.
## Release monorepo v1.57.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.57.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.57.0`
- Creates git tag `monorepo/v1.57.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.
## Summary
- Two object literals in
`showcase/shell-dashboard/src/components/parity-matrix.tsx`
(`ParityCategorySection`) were missing the required `maxPossible` field
on `DepthResult`, causing `next build` to fail with TS2322 on every
shell-dashboard production build.
- This blocked rebuilding the deployed showcase shell-dashboard, which
currently ships with `NEXT_PUBLIC_SHELL_URL` unset — every Demo button
on the dashboard renders as
`about:blank#shell-url-missing/integrations/<slug>/<feature>/preview`
instead of the actual preview URL.
- Setting `maxPossible: 0` alongside `achieved: 0` for unwired cells is
the natural fallback (no probe → no ceiling) and matches how `DepthChip`
already renders an unshipped cell.
## Background
The fix is cherry-picked from commit `1db2fbc7b` on the
`fix/dashboard-polish` branch (Jordan Ritter) — that branch also has 8
other commits (D5 depth model rework, ops→harness rename) which together
form a larger polish pass that hasn't been opened as a PR yet. Landing
this 2-line slice standalone unblocks the showcase deploy without
waiting on review of the larger branch.
Once this lands, re-running `gh workflow run showcase_build.yml --ref
main -f service=shell-dashboard` will produce a working production image
with `NEXT_PUBLIC_SHELL_URL=https://showcase.copilotkit.ai` baked in.
## Test plan
- [ ] CI typecheck passes (was previously failing here)
- [ ] CI build of showcase-shell-dashboard image succeeds
- [ ] After merge: trigger \`showcase_build.yml\` for
\`shell-dashboard\` and verify deployed dashboard's Demo links resolve
to \`https://showcase.copilotkit.ai/integrations/...\` instead of the
\`about:blank#shell-url-missing\` sentinel
## Summary
Cleans up shell-docs after PR #4521 reintroduced content earlier PRs
intentionally retired, adds a Deploy section with an inlined AWS
AgentCore guide using a custom command-tabs component, and hardens the
sync script against future regressions of the same shape.
## Changes
### Deploy section + AgentCore page (custom UX)
- New `<AgentCoreCommandTabs />` component — framework-aware command
tabs with hljs highlighting and copy buttons, built on shell-docs's own
`<Tabs>`/`<Tab>` primitives. Upstream's version depends on fumadocs-ui,
which shell-docs doesn't install.
- Replaces main's `<Content />` stub at `/deploy/agentcore` with the
full inlined guide.
- Wires the Deploy section into the root sidebar via `deploy/meta.json`
+ a `---Deploy---` group in `meta.json`.
- Registers the component in `mdx-registry.tsx`.
### Remove duplicates reintroduced by the upstream sync
- Delete
`learn/{index,intelligence-platform,threads,tutorials/multi-conversation-chat}.mdx`.
Canonical homes are at `/premium/intelligence-platform`,
`/premium/threads-explained`, and `/tutorials/multi-conversation-chat`.
`next.config.ts` already redirects `/learn/*` to those destinations.
- Delete root `ag-ui-middleware.mdx`. Canonical home is
`/agentic-protocols/ag-ui-middleware`. `next.config.ts` already
redirects `/ag-ui-middleware`.
### Harden sync script
Add `PATH_EXCLUSIONS` regexes so next sync runs don't bring these paths
back:
- `docs/content/docs/learn/`
- `docs/content/docs/(root)/ag-ui-middleware.mdx`
- Orphan shared-state files:
`langgraph/shared-state/workflow-execution`,
`adk/shared-state/{workflow-execution,state-inputs-outputs}`,
`llamaindex/shared-state/state-inputs-outputs`
- AgentCore upstream sources (root shell, per-framework
`deploy-agentcore.mdx`, shared snippet) — shell-docs owns the canonical
inlined version
### Optional schema migrations Step
Adds an opt-in `(Optional) Enable schema migrations` Step to
`premium/self-hosting.mdx` covering `migrations.enabled: true` in the
Helm values + the verification behavior.
## Test plan
- [ ] `/deploy/agentcore` renders the inlined guide; both
`<AgentCoreCommandTabs />` blocks show framework tabs with highlighted
bash and a working copy button
- [ ] Deploy appears as a sidebar group between Premium and What's New
- [ ] `/learn/threads`, `/learn/intelligence-platform`,
`/learn/tutorials/multi-conversation-chat`, and `/learn` all redirect to
their canonical destinations (no longer 200 with duplicate content)
- [ ] `/ag-ui-middleware` redirects to
`/agentic-protocols/ag-ui-middleware`
- [ ] The optional schema migrations Step renders in
`/premium/self-hosting` between the secrets Step and the
install-the-chart Step
- [ ] Next dry-run of `sync-docs-from-main.ts` does not flag the
newly-excluded paths
## Summary
`PATH_EXCLUSIONS` keeps retired upstream paths out of shell-docs, but it
requires whoever retires a page to also add the regex — and that step
has been missed. PR #4521 brought back `/learn/*` and root
`/ag-ui-middleware.mdx` after earlier PRs intentionally removed them;
nothing in the sync flow caught it.
This PR adds a safety net to `sync-docs-from-main.ts`. Before writing
each upstream file, it checks whether the target shell-docs path exists
in git's deletion history and isn't currently on disk. If so, it
surfaces the file in the auto-PR's `review-items.txt` under a new "Files
re-introduced from shell-docs deletion history" section, and includes
the count in `hasReviewItems` so the PR is flagged needs-review (exit 3)
instead of going through the auto-merge path.
The detector is informational, not blocking — content still syncs as
usual, only the flag is added. The fix loop is: human reviews, decides
intent. If the re-introduction is unwanted, add a `PATH_EXCLUSIONS`
regex and delete the file; the detector picks it up again on the next
sync until the regex is in place.
## Verified locally
`tsx showcase/scripts/sync-docs-from-main.ts --dry-run` exits 3 and
flags 3 real findings against current main:
```
docs/content/docs/(root)/index.mdx
docs/content/docs/integrations/langgraph/index.mdx
docs/content/docs/integrations/microsoft-agent-framework/index.mdx
```
All three were previously deleted in favor of meta.json folder pages —
the detector correctly catches them as candidates for re-introduction
the next time the sync runs.
## Test plan
- [ ] `tsx showcase/scripts/sync-docs-from-main.ts --dry-run` exits 3
against current main
- [ ] Output includes a `Files re-introduced from shell-docs deletion
history` section in `review-items.txt`
- [ ] Files currently on disk are not flagged (only paths that exist in
deletion history but aren't in the working tree)
- [ ] Future docs-sync(needs-review) PRs that bring back retired paths
surface them in the same section
Two object literals in parity-matrix.tsx ParityCategorySection were missing
the required maxPossible field on DepthResult, causing 'next build' to fail
with TS2322 and blocking the shell-dashboard production rebuild. Setting
maxPossible: 0 matches achieved: 0 for unwired cells (no probe → no ceiling),
which is consistent with how DepthChip renders an unshipped cell.
Cherry-picked from 1db2fbc7b on fix/dashboard-polish (Jordan Ritter); landing
standalone so the showcase deploy can rebuild from main without waiting on
the larger dashboard-polish branch.
## What does this PR do?
Makes `/learn` behave like `/reference` in the docs site: when a user is
under `/learn`, the framework picker disappears and the sidebar shows
only learn content.
### Changes
- **Add `learn` to root `meta.json`** — the learn folder was missing
from the root navigation, so `ConditionalSidebar` couldn't find it in
the page tree and was falling through to the default sidebar (with the
framework picker still visible). Adding it to the pages list mirrors how
`reference` is wired up.
- **New `LearnHeader` component** — static header with a book icon and
"Learn" label, styled to match the Reference version selector. Wired in
via `Sidebar`'s existing `headerSlot` prop on `/learn` routes.
- **Rename learn index title to "Overview"** — the landing page that
shows when you click the Learn tab now reads "Overview" in both the page
heading and the sidebar.
- **Drop the redundant `h-6` spacer in `Sidebar`** — every header
component (`IntegrationSelector`, `VersionSelector`, `LearnHeader`)
already has its own `mb-3`. The extra spacer was producing a 24px
phantom gap on `/learn` while collapsing to 0 on `/reference` under flex
shrink, so the two sidebars looked inconsistent.
### Verification
Tested locally on the docs dev server:
| Route | Sidebar header | Sidebar contents | Framework picker |
|-------|---------------|------------------|------------------|
| `/` | Integration selector | Full docs tree | shown |
| `/reference/v2` | API version selector | Reference v2 tree | hidden |
| `/learn` | New "Learn" header | Learn-only tree | hidden |
| `/learn/architecture` | New "Learn" header | Learn-only tree
(Architecture active) | hidden |
Spacing between the header and first sidebar item is now equal across
`/learn` and `/reference`.
## Related PRs and Issues
- N/A
## Checklist
- [x] I have read the [Contribution
Guide](https://github.com/copilotkit/copilotkit/blob/master/CONTRIBUTING.md)
- [x] If the PR changes or adds functionality, I have updated the
relevant documentation
- [x] "Allow edits by maintainers" is checked
🤖 Generated with [Claude Code](https://claude.com/claude-code)
## What does this PR do?
Removes the private-beta access gate on the Threads view in the web
inspector. Threads is now accessible directly without an invite code.
### Removed
- `renderThreadsGate()` — the gradient-backed gate container
- `_renderEarlyAccessCard()` — invite-code card with "Request Early
Access" CTA
- `_renderUnlockingCard()` — the "Welcome to Threads" transition card
- `_submitThreadsCode()` — code validation against `"earlyaccess"` and
cookie write
- `THREADS_REQUEST_URL` constant (Hubspot invite form)
- State: `_threadsUnlocked`, `_threadsUnlocking`, `_threadsGateError`,
`_threadsGateCodeInvalid`, and the two associated timers
- Cookie restore (`cpk_threads_access=1`) on page load
- Gate branch in `renderThreadsView()` — it now renders threads
unconditionally
Net: -401 lines in `packages/web-inspector/src/index.ts`. Existing
`cpk_threads_access` cookies on user browsers become a harmless no-op.
## Related PRs and Issues
- N/A
## Checklist
- [x] I have read the [Contribution
Guide](https://github.com/copilotkit/copilotkit/blob/master/CONTRIBUTING.md)
- [x] If the PR changes or adds functionality, I have updated the
relevant documentation
- [x] "Allow edits by maintainers" is checked
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Add a Learn-only sidebar mode that mirrors how /reference works: when a user
is under /learn, the framework picker is hidden and the sidebar shows only
learn content (What's New, Agentic Protocols, Generative UI, Specs,
Architecture, Tutorials).
- Add `learn` to the root meta.json so the learn folder is discoverable in
the page tree (was missing, which is why ConditionalSidebar previously
fell through to the default sidebar on /learn routes)
- Add a static LearnHeader (book icon + "Learn") visually matching the
Reference version selector, wired in via Sidebar's headerSlot
- Rename the learn index page title to "Overview" so the landing page reads
cleanly under the new header
- Drop the redundant `h-6` spacer in Sidebar — every header component
(IntegrationSelector, VersionSelector, LearnHeader) already supplies its
own `mb-3`, and the spacer was producing a 24px phantom gap on /learn
while collapsing to 0 on /reference under flex shrink
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Summary
- New \`docs/lib/track-command-copy.ts\` helper fires
\`cli_command_copied\` with \`{ command, install_type, location }\`.
\`install_type\` is inferred from the leading token (\`npx\`, \`pnpm\`,
\`pip\`, etc., falling back to \`code\`).
- New \`CopyTracker\` provider monkey-patches
\`navigator.clipboard.writeText\` once at app boot, so every
programmatic copy is tracked without per-component instrumentation.
Covers Fumadocs' built-in code-block copy button, \`CustomCodeBlock\`,
\`CodeShowcase\`, \`FrameworkOverview\`, and any future copy widget.
- Coexists cleanly with Reo's own \`writeText\` monkey-patch — the
wrappers chain rather than collide.
## Labeling
- \`command\` — the copied text (truncated to 240 chars).
- \`install_type\` — inferred from the first token.
- \`location\` — \`window.location.pathname\` (encodes product on docs
URLs like \`/langgraph/\...\`, \`/crewai/\...\`).
## Companion
Mirrors
[CopilotKit/website#feat/cli-copy-tracking](https://github.com/CopilotKit/website/tree/feat/cli-copy-tracking)
so a single PostHog funnel covers both sites.
## Test plan
- [ ] \`pnpm dev\`, copy from a Fumadocs code block,
\`CustomCodeBlock\`, \`CodeShowcase\`, and \`FrameworkOverview\`.
Confirm a \`cli_command_copied\` event lands in PostHog for each with
the right \`install_type\` and \`location\`.
- [ ] Confirm Reo's auto-tracked copy events still appear in Reo (no
regression from the writeText chaining).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Address review feedback on #4643: install_type and location already answer
the funnel questions, so persisting raw clipboard contents adds privacy
surface without analytic value (the global writeText hook fires on every
programmatic copy, not just CLI buttons). Also remove the never-passed
product param.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PATH_EXCLUSIONS is the durable mechanism for keeping retired upstream
paths out of shell-docs, but it requires the person retiring a page to
also add the regex — and that step has been missed (#4521 brought back
/learn/* and root /ag-ui-middleware.mdx after earlier PRs intentionally
removed them).
Add a safety net: before writing each upstream file, check if its target
shell-docs path exists in git's deletion history and isn't currently on
disk. If so, surface it in the auto-PR's review-items.txt under a new
'Files re-introduced from shell-docs deletion history' section and
include reintroduced.length in hasReviewItems so the PR is flagged
needs-review (exit 3) instead of auto-merged.
Doesn't block the write — content is still synced, the detector is
informational. The fix loop is: human reviews, decides intent. If
unwanted, add a PATH_EXCLUSIONS regex and delete the file; next sync
the detector picks it up again until the regex is in place.
Verified locally — current dry-run flags 3 real findings (root/index,
langgraph/index, microsoft-agent-framework/index) that were deleted in
favor of meta.json folder pages.
## Summary
Comprehensive gotchas document extracted from 17 conversation sessions,
memory files, and handoffs. 133 deduplicated entries covering every edge
case discovered during the D5 blitz and ongoing showcase work.
Sections: General, CopilotKit Frontend (V1/V2), Agent Registration,
Aimock & Fixtures, Multimodal, Probe Infrastructure, Python-Specific,
Docker & Build, Framework-Specific (15 frameworks), Local Debugging
Quick Reference.
## Test plan
- Documentation only
What we learned getting 18 integrations to D5 green — and what was
still wrong even when green. Cross-framework patterns (V1/V2, testids,
runtime hoisting, agent naming, multimodal shims, Pydantic models),
per-framework edge cases for all 15 frameworks, aimock fixture gotchas,
and the 6 things that were "green but wrong."
- PostHog: capture_dead_clicks=false to skip dead-clicks-autocapture.js
- Drop duplicate reb2b loader (NEXT_PUBLIC_RB2B_ID); the <Script> in
app/layout.tsx using NEXT_PUBLIC_REB2B_KEY is the canonical one and
matches the website's reb2b key
<!--
Thank you for sending the PR! We appreciate you spending the time to
work on these changes.
Help us understand your motivation by explaining why you decided to make
this change.
**Please PLEASE reach out to us first before starting any significant
work on new or existing features.**
By the time you've gotten here, you're looking at creating a pull
request so hopefully we're not too late.
We love community contributions! That said, we want to make sure we're
all on the same page before you start.
Investing a lot of time and effort just to find out it doesn't align
with the upstream project feels awful, and we don't want that to happen.
It also helps to make sure the work you're planning isn't already in
progress.
As described in our contributing guide, please file an issue first:
https://github.com/ag-ui-protocol/ag-ui/issues
Or, reach out to us on Discord: https://discord.com/invite/6dffbvGU3D
You can learn more about contributing to copilotkit here:
https://github.com/copilotkit/copilotkit/blob/master/CONTRIBUTING.md
Happy contributing!
-->
## What does this PR do?
(Describe the changes introduced in this PR)
## Related PRs and Issues
- (Direct link to related PR or issue, if relevant)
## Checklist
- [ ] I have read the [Contribution
Guide](https://github.com/copilotkit/copilotkit/blob/master/CONTRIBUTING.md)
- [ ] If the PR changes or adds functionality, I have updated the
relevant documentation
- [ ] "Allow edits by maintainers" is checked (lets us help iterate on
your PR directly — faster turnaround for everyone)
The Helm chart supports running schema migrations as a pre-install Job
(disabled by default). Document the opt-in path and the verification
behavior so operators can decide whether to enable it.
The previous sync brought back /learn/*, root /ag-ui-middleware.mdx, the
upstream AgentCore 3-shell + shared snippet, and several orphan
shared-state files that shell-docs deliberately doesn't carry. Add
matching PATH_EXCLUSIONS so future syncs don't reintroduce them.
Not bumping .docs-sync-sha — the previous sync's sha is still accurate
and the new exclusions take effect on the next run.
- PostHog: capture_dead_clicks=false to skip dead-clicks-autocapture.js
- Drop duplicate reb2b loader (NEXT_PUBLIC_RB2B_ID); the <Script>
in app/layout.tsx using NEXT_PUBLIC_REB2B_KEY is the canonical one
and matches the website's reb2b key
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
These were re-introduced by an upstream docs sync. Canonical homes are
already in shell-docs at /premium/intelligence-platform,
/premium/threads-explained, /tutorials/multi-conversation-chat, and
/agentic-protocols/ag-ui-middleware. next.config.ts already redirects
the retired paths to the canonical destinations.
Replaces the upstream-synced <Content /> stub at /deploy/agentcore with
the full inlined guide using the new <AgentCoreCommandTabs /> component
for the auth-mode-aware command examples. Wires the Deploy section into
the root nav.
- New component: agentcore-command-tabs.tsx
- New section meta: deploy/meta.json
- Root meta.json adds Deploy as a top-level group
- mdx-registry.tsx registers the component
CopyTracker monkey-patches navigator.clipboard.writeText once at app
boot to fire PostHog cli_command_copied for every programmatic copy —
covering Fumadocs' built-in code-block button, custom-code-block,
code-showcase, framework-overview, and any future copy widget without
per-component instrumentation. Reo's own writeText patch continues to
function alongside this one.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Threads is no longer behind a private-beta access code — drop the gate UI
(early-access card, unlocking card, code submission, cookie persistence)
and render the threads view unconditionally.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Summary
- Runs `oxfmt --write .` to fix 25 files failing the `check-format` CI
step on main
- All files are in `showcase/` (shell-dashboard, integrations, harness,
debugging docs)
## Test plan
- [x] `pnpm run check-format` passes locally
🤖 Generated with [Claude Code](https://claude.com/claude-code)