## What
Bumps `@copilotkit/license-verifier` from `0.4.2` to `0.5.0`:
- `packages/runtime/package.json`: `~0.4.2` → `~0.5.0`
- `packages/shared/package.json`: `~0.4.2` → `~0.5.0`
- root `package.json` `pnpm.overrides`: `~0.4.2` → `~0.5.0` (this
override was the effective version gate — without bumping it the
lockfile stayed pinned at 0.4.2)
- `pnpm-lock.yaml`: regenerated, now resolves `0.5.0`
- `.npmrc`: added `@copilotkit/license-verifier` to
`minimum-release-age-exclude[]` (same treatment as `@ag-ui/langgraph`)
so the freshly-published 0.5.0 could be locked before clearing the 24h
`minimum-release-age` guard
## Status
0.5.0 is published and the lockfile resolves it cleanly. The earlier
"blocked on publish" state is resolved. Ready to come out of draft
pending CI.
Linear: ENT-938
## Summary
Fixes#5417. The v1 `<CopilotKit>` wrapper's `validateProps` threw
`ConfigurationError: Missing required prop: 'runtimeUrl' or
'publicApiKey' or 'publicLicenseKey'` whenever neither `runtimeUrl` nor
a public key was supplied — without considering self-managed agents.
This rejected the documented self-managed-agent setup, even though the
underlying v2 `CopilotKitProvider` accepts it via its `hasLocalAgents`
gate.
- **Fix:** `validateProps` now mirrors the provider's `hasLocalAgents`
check, so `selfManagedAgents` and `agents__unsafe_dev_only` satisfy the
requirement without a `runtimeUrl` or Cloud key.
- **Test:** new rendering test pins the behavior — still throws when
nothing is configured, no longer throws when local agents are supplied.
- **Docs:** the showcase error-reference "v1 behaves differently"
callout claimed the wrapper throws unconditionally and rejects
`selfManagedAgents` (both now false); corrected, and dropped the "(v2
only)" label on the self-managed example.
## Test plan
- [x] `nx test react-core` — 1284 passing, 0 failing
- [x] New test fails before the fix (red) and passes after (green)
- [x] No new type errors introduced (pre-existing `tsc` noise unchanged
vs `main`)
Bumps the root pnpm.overrides pin (which was the effective version gate,
holding the lockfile at 0.4.2) and the package-level pins to ~0.5.0, and
regenerates the lockfile to resolve 0.5.0.
Adds @copilotkit/license-verifier to minimum-release-age-exclude in
.npmrc so the freshly-published 0.5.0 can be locked before it clears the
24h minimum-release-age guard (same treatment as @ag-ui/langgraph).
ENT-938
## Release angular v0.1.1
**Scope:** `angular` | **Bump:** `patch`
---
### How this release process works
1. **This PR was created automatically** by the "release / create-pr"
workflow.
It bumped the `angular` packages to `0.1.1`
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 `angular` packages to npm at version `0.1.1`
- Creates git tag `angular/v0.1.1`
- 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
- Rename the Angular package from `@copilotkitnext/angular` to
`@copilotkit/angular`.
- Reset the Angular package version to `0.1.0` and update package
entrypoints for the generated `copilotkit-angular` bundle.
- Update release configuration, release notification tests, docs,
lockfile, demo imports, and Storybook references to the new package
name.
## Validation
- `pnpm nx run @copilotkit/angular:build`
- `pnpm nx run @copilotkit/angular:check-types
--excludeTaskDependencies`
- `pnpm nx run @copilotkit/angular:publint`
- `pnpm nx run @copilotkit/angular:attw`
- `bash scripts/release/verify-release-scope-dropdowns.sh`
- `pnpm exec vitest run --config scripts/release/vitest.config.mts`
- Pre-commit package test/check hook completed successfully.
## Notes
- A full dependency type-check attempt surfaced existing
`@copilotkit/core:check-types` errors before Angular ran, so Angular
type-checking was rerun directly with dependency tasks excluded.
Strengthen the license-signal test so it pins that selfManagedAgents
satisfies hasLocalAgents — the Enterprise warning fires while the
separate "Missing required prop" missing-runtime warning does not.
Refs #5417
selfManagedAgents is part of CopilotKit's Enterprise Intelligence
offering. Emit an advisory console.warn (in both development and
production) when it is supplied without a publicLicenseKey/publicApiKey,
so production usage is surfaced. The signal is client-side and not
enforced — rendering still proceeds — and agents__unsafe_dev_only
remains a free local-dev escape hatch.
Refs #5417
The callout claimed the v1 <CopilotKit> wrapper has no dev-only
console.warn branch, but it composes CopilotKitV2Provider, which does
warn in development before the v1 validateProps throw. Drop the
misleading clause and contrast the throw-in-dev behavior instead.
Refs #5417
Re-pins the plugin version to match `packages/runtime/package.json` (the
pin source), and closes the gap that let it drift. `pnpm
check:plugin-skills` is currently **failing on `main`** because of this
drift.
### The drift (before, after)
| Field | Before | After |
|---|---|---|
| `packages/runtime/package.json` (pin source) | 1.60.2 | 1.60.2 |
| `.claude-plugin/plugin.json` | 1.60.0 | **1.60.2** |
| `marketplace.json` > `plugins[0].version` | 1.60.0 | **1.60.2** |
| `marketplace.json` > `metadata.version` | 1.57.3 | **1.60.2** |
### Changes (2 commits)
- **`fix(plugin)`**: re-pin via `pnpm sync:plugin-skills`, and teach
`handleVersionSync` to also manage `marketplace.json metadata.version`
(it was unmanaged, which is why it drifted furthest). +2 unit tests.
- **`ci(plugin-skills)`**: watch `packages/runtime/package.json` in the
lefthook glob and both workflow path filters. A release bump there
matched no trigger before, so the pin rotted silently between releases.
That was the root cause.
### Verify
- `vitest run scripts/__tests__/sync-plugin-skills.test.ts`, 10 passed
- `pnpm check:plugin-skills`, `plugin skill mirror in sync` (was
failing)
Bumps the license-verifier pin in runtime and shared from ~0.4.2 to
~0.5.0. Lockfile regen and CI are blocked until 0.5.0 is published to
npm (latest is currently 0.4.2).
ENT-938
Clear the console.error spy inside the render helper so each assertion
is independent, and split the combined runtimeUrl/publicApiKey case into
two tests so each renders a single provider tree.
Refs #5417
Add empty-map (selfManagedAgents={}) throw case and the pre-existing
runtimeUrl/publicApiKey happy paths so a future gate inversion is
caught, and assert valid configs surface no unexpected console errors
instead of blanket-silencing console.error.
Refs #5417
The self-managed example sits under the "Fix (v2)" heading and uses
<CopilotKitProvider>, so the prior "works on both ... wrapper and v2"
comment read as if the v2 component itself were v1. Attribute the
portability to the selfManagedAgents prop instead of the component.
Refs #5417
Note on the self-managed agents page that selfManagedAgents is part of
the Enterprise Intelligence offering, with a pointer to discuss
licensing for production use.
Refs #5417
Replaces #5510.
## Summary
Adds a compact docs picker that separates the frontend choice from the
agent backend choice. The frontend selector routes React, Vue, React
Native, Slack, and Teams users into the right docs surface while keeping
the existing docs assets and previews.
## Why
The docs sidebar was doing too much in one place. Frontend-specific
users need a clear way to choose their platform without making
React-only pages look like native docs for every frontend.
## How
- Adds frontend-scoped routes and sidebar navigation for Vue, React
Native, Slack, and Teams.
- Keeps shared docs available where they are truly universal, and marks
borrowed React docs as deeper reference material.
- Preserves legacy redirects for `/vue`, `/react-native`, `/slack`, and
`/microsoft-teams`.
- Uses library icons in the frontend picker instead of hand-rolled SVGs.
## Media
Frontend selector:
<img width="720" alt="Docs sidebar frontend selector with React, Vue,
React Native, Slack, and Teams options"
src="https://raw.githubusercontent.com/CopilotKit/CopilotKit/codex/pr-5510-media/pr-media/5510/docs-picker-frontend-options.jpg"
/>
Agent backend selector:
<img width="720" alt="Docs sidebar agent backend selector with
CopilotKit, Langchain DeepAgents, LangGraph, and partner backend
options"
src="https://raw.githubusercontent.com/CopilotKit/CopilotKit/codex/pr-5510-media/pr-media/5510/docs-picker-backend-options.jpg"
/>
Walkthrough:

[MP4
walkthrough](https://raw.githubusercontent.com/CopilotKit/CopilotKit/codex/pr-5510-media/pr-media/5510/docs-picker-walkthrough.mp4)
## Testing
- `npm --prefix showcase/shell-docs test --
'src/app/llms-mdx/[[...slug]]/route.test.ts'
src/lib/__tests__/frontend-options.test.ts
src/lib/__tests__/seo-redirects.test.ts
src/lib/__tests__/docs-link-rewrite.test.ts
src/lib/__tests__/docs-render.test.ts
src/lib/__tests__/next-config-redirects.test.ts
src/components/__tests__/framework-selector.test.tsx
src/lib/__tests__/registry.test.ts`
- `npm --prefix showcase/shell-docs run build`
- `pnpm --dir showcase/shell-docs exec oxlint
'src/app/llms-mdx/[[...slug]]/route.ts'
'src/app/llms-mdx/[[...slug]]/route.test.ts'
src/components/docs-landing-next.tsx src/lib/registry.ts
src/lib/__tests__/registry.test.ts`
- `pnpm --dir showcase/shell-docs exec oxlint
src/components/frontend-logo.tsx src/components/framework-selector.tsx
src/components/icons/framework-icons.tsx src/components/icons/index.ts
src/components/icons/__tests__/framework-icons.test.tsx`
- `git diff --check origin/main..HEAD`
- Static check of changed internal link targets: 7 targets, 0 missing.
- Commit hooks passed for each split commit.
Note: `showcase/shell-docs` is not registered as an Nx project in this
checkout, so there was no Nx target to run for this app.
The error-reference callout claimed the v1 <CopilotKit> wrapper throws
unconditionally and does not accept selfManagedAgents. Both are no
longer true now that the wrapper honors local agents; update the note
and drop the "(v2 only)" label on the self-managed example.
Refs #5417
The v1 <CopilotKit> wrapper's validateProps threw ConfigurationError
whenever neither runtimeUrl nor a public key was supplied, ignoring
self-managed agents. This rejected the documented self-managed-agent
setup even though the underlying v2 CopilotKitProvider accepts it.
Mirror the provider's hasLocalAgents gate so selfManagedAgents and
agents__unsafe_dev_only satisfy the check.
Closes#5417
## Summary
Follow-up to #5543. Adds `--isolate=<N>` CLI form so users don't need to
set `SHOWCASE_ISO_SLOT=<N>` as an env var prefix.
## Before
```
SHOWCASE_ISO_SLOT=9 bin/showcase test agno --d5 --isolate
```
## After (both forms work)
```
bin/showcase test agno --d5 --isolate=9
# OR
SHOWCASE_ISO_SLOT=9 bin/showcase test agno --d5 --isolate
```
## Implementation
~10 lines in `showcase/scripts/cli/cmd-test.sh` arg parser: a new
`--isolate=*` case sets `use_isolate=true` and exports
`SHOWCASE_ISO_SLOT=<N>`. The existing picker (`_claim_isolate_slot` in
`_common.sh`) handles all validation, slot-0 rejection, port-probe,
liveness, etc. — no logic duplication.
Help text in `cmd-test.sh` and the existing `SHOWCASE_ISO_SLOT`
references in `showcase/TESTING.md` now show both forms as equivalent.
## Tests
Four new bats tests in `showcase/scripts/__tests__/isolate.bats`:
- `--isolate=<N> arg form exports SHOWCASE_ISO_SLOT and pins the slot
through the picker` — replays the parser branch, verifies env export +
picker pinning.
- `--isolate=0 arg form drives the picker's reserved-slot rejection` —
proves `--isolate=0` flows through the same `slot 0 is reserved` die as
the env-var form.
- `--isolate=99 arg form drives the picker's out-of-range rejection` —
proves `--isolate=99` flows through the same `exceeds
ISOLATE_MAX_SLOT=45` die as the env-var form.
- `cmd-test.sh --isolate=<N> actually wires the arg through to
SHOWCASE_ISO_SLOT` — drift guard that sources the REAL `cmd-test.sh`,
stubs `apply_isolation`, and snapshots `SHOWCASE_ISO_SLOT` to catch any
future regression of the parser branch.
All 58 bats tests in `isolate.bats` pass locally (54 pre-existing + 4
new).
## Docs
`showcase/TESTING.md` items 8 and 9 updated to show both forms.
Repo-wide grep confirmed TESTING.md is the only doc that references
`SHOWCASE_ISO_SLOT`.
## Test plan
- [x] `bats showcase/scripts/__tests__/isolate.bats` → 58/58 green
- [x] `--isolate=9` → `SHOWCASE_ISO_SLOT` exported, slot 9 claimed
- [x] `--isolate=0` → picker dies "slot 0 is reserved"
- [x] `--isolate=99` → picker dies "exceeds ISOLATE_MAX_SLOT=45"
- [x] `shellcheck showcase/scripts/cli/cmd-test.sh` → no new warnings
(only the pre-existing SC2034 on `CMD_TEST_DESC`, consumed by dispatcher
parallel arrays)
- [x] `oxfmt --check showcase/` → clean
## Summary
- remove duplicated OpsPlatformCTA blocks from A2A, CrewAI Flows, and
LangGraph prebuilt components docs
- add missing production CTA cards to integration quickstarts that only
had the inline signup step
- audit shell-docs CTA usage so each integration quickstart has exactly
one OpsPlatformCTA and no duplicate CTA blocks remain
## Verification
- npm run test (showcase/shell-docs)
- npm run typecheck (showcase/shell-docs)
- npm run lint (showcase/shell-docs; existing warnings only)
- npm run build (showcase/shell-docs; existing Next/Turbopack warning
only)
- duplicate CTA scanner: no duplicate CTA blocks found
- quickstart CTA scanner: every integration quickstart has exactly one
OpsPlatformCTA
Items 8 and 9 now show both the SHOWCASE_ISO_SLOT=<N> env-var form and
the --isolate=<N> CLI sugar as equivalent ways to pin the isolation
slot. The env-var form remains valid — the CLI form is a convenience,
not a replacement.
A repo-wide grep confirmed showcase/TESTING.md is the only doc that
references SHOWCASE_ISO_SLOT, so no other docs need updating.
Adds a sugar form of the --isolate flag that pins the isolation slot
directly from the command line:
bin/showcase test agno --d5 --isolate=9
# equivalent to:
SHOWCASE_ISO_SLOT=9 bin/showcase test agno --d5 --isolate
The arg parser splits --isolate=<N> into setting use_isolate=true plus
exporting SHOWCASE_ISO_SLOT=<N>; the existing picker
(_claim_isolate_slot in _common.sh) handles all validation — positive
integer, slot 0 reserved, 1<=N<=ISOLATE_MAX_SLOT, port probe, liveness.
No validation logic is duplicated.
Tests:
- replays the parser branch and verifies SHOWCASE_ISO_SLOT export +
picker pinning
- drives the picker's reserved-slot (N=0) and out-of-range (N=99)
rejections through the arg form to pin the parser->env->picker wiring
- drift guard: sources the REAL cmd-test.sh, stubs apply_isolation, and
snapshots SHOWCASE_ISO_SLOT to catch any future regression of the
parser branch
Help text and TESTING.md updated in a follow-up commit.
## Summary
- add Codex-facing guidance for where CopilotKit docs are authored
- call out shell-docs, framework docs modes, reference nav, snippets,
AG-UI upstream docs, and retired top-level docs
- clarify shell-docs local work should use the shell-docs npm commands
## Verification
- lefthook pre-commit hooks passed during commit
- commit-msg hook passed
## Summary
- Update the CrewAI Flows quickstart init command to use the
CLI-supported framework flag.
## Verification
- Ran shell-docs predev generation as part of local dev server startup.
- Opened http://localhost:3004/crewai-crews/quickstart and verified the
rendered page snapshot contains: `npx copilotkit@latest init --framework
flows`.
- Commit hook passed: check-binaries, test-and-check-packages,
commitlint.
Closes#3190.
## Summary
- update the configurable guide links to the current LangGraph
use-graph-api documentation
- remove an encoded `%23` fragment from the runtime configuration link
- point the AI travel tutorial Studio setup link directly to the current
LangGraph Studio docs
## Verification
- `npx --yes prettier --check
docs/content/docs/integrations/langgraph/configurable.mdx
docs/content/docs/integrations/langgraph/tutorials/ai-travel-app/step-2-langgraph-agent.mdx`
- `git diff --check`
- checked the updated LangChain/LangGraph URLs with `curl -L -I` and
confirmed HTTP 200
Note: `node scripts/check-broken-links.js` was also attempted from
`docs/`, but this sparse checkout does not include all docs pages and
lacks `fumadocs-mdx`, so it reports pre-existing missing internal pages
unrelated to this docs-only change.
The plugin version pins to packages/runtime/package.json, but neither the
lefthook glob nor the plugin-skills-check workflow path filters watched
that file. A routine release bump to the runtime version therefore matched
no trigger and the pin silently rotted between releases (the root cause of
the version drift). Add packages/runtime/package.json to the lefthook glob
and to both the push and pull_request path filters so a version bump
re-runs check:plugin-skills.
The plugin version pins to packages/runtime/package.json, but plugin.json
(1.60.0) and marketplace.json (plugins[0] 1.60.0, metadata 1.57.3) had
rotted behind the runtime package (1.60.2), so check:plugin-skills was
failing on main.
handleVersionSync previously managed only plugin.json.version and
marketplace plugins[0].version, leaving marketplace metadata.version
unmanaged and free to drift independently. Extend it to track
metadata.version against the runtime version too, and re-run the sync to
bring all three fields to 1.60.2.
## Summary
Adds two optional attribution props — `toolCallId` and `agentId` — to
the `useHumanInTheLoop` render callback (`ReactHumanInTheLoop`), so a UI
can tell **which (sub)agent raised an interrupt** and route/resume it
accordingly. This is the front-end piece needed to render and act on
human-in-the-loop stops that originate from a subagent (the
orchestrator/subagent pattern).
Backward compatible and additive — existing HITL render components are
unaffected. No AG-UI protocol change and no runtime change: `toolCallId`
already flowed to the renderer at runtime (this surfaces it in the
type), and `agentId` is sourced from the tool's own registration.
## What changed
- **`types/human-in-the-loop.ts`** — add `toolCallId: string` and
`agentId?: string` to all three render-prop variants, with JSDoc on the
static-vs-runtime distinction.
- **`hooks/use-human-in-the-loop.tsx`** — thread `agentId: tool.agentId`
into the enhanced props; compare `props.status` against the
`ToolCallStatus` enum (was string literals); replace the unreachable `as
any` fallback with a compile-time exhaustiveness check.
- **tests** — assert `toolCallId`/`agentId` reach the render props
through the real `CopilotChat` pipeline (scoped + unscoped), and that
attribution survives the `InProgress → Executing` transition.
- **docs** — document the two new props on the `useHumanInTheLoop`
reference page.
## Decision needed from reviewers — `agentId` semantics
`agentId` is the tool's **static registration scope** (`tool.agentId`),
which is `undefined` for the default unscoped tool — it is **not** the
runtime subagent that raised the interrupt. `toolCallId` is the
load-bearing addition: correlate it with `onToolExecutionStart`'s agent
id for true runtime attribution. The JSDoc states this explicitly.
Options if we want to avoid any ambiguity:
1. **Keep as-is** (documented static scope) — current state.
2. Rename → `registeredAgentId`.
3. Drop `agentId`, ship `toolCallId`-only.
## Follow-ups (separate PR — not in scope here)
These are pre-existing in the HITL `respond`/registration layer
(untouched by this diff) and are the deeper work for full subagent HITL:
- **Route `respond` by `toolCallId`** — a single `resolvePromiseRef`
can't service concurrent interrupts of the *same* tool
(cross-wire/hang). Key resolvers by `toolCallId`.
- **`respond` failure path** — currently a silent no-op when no resolver
is pending, and the handler promise has no rejection on unmount/abort.
- **Re-registration on dynamic `agentId` change** — `useFrontendTool`'s
registration effect deps omit `agentId`/`render`.
## Verification
- `nx run @copilotkit/react-core:test` — 1281 passing (incl. the new
attribution tests).
- `react-core` typecheck clean for the change; `react-core:build` green.
- Reviewed via a 3-round, 7-agent unbiased CR loop; converged with the
bucket-(c) promotion audit clean.
🤖 Generated with [Claude Code](https://claude.com/claude-code)