Commit Graph

15424 Commits

Author SHA1 Message Date
Jerel John Velarde 60a64c6e10 Merge remote-tracking branch 'origin/pr-6637' into codex/cloudplot-showcase-migration 2026-08-27 06:42:45 -07:00
Jerel John Velarde af055d8fde fix(showcases): build CloudPlot type dependencies 2026-08-27 06:42:01 -07:00
github-actions[bot] 1390625de9 style: auto-fix formatting 2026-08-27 13:38:55 +00:00
Jerel John Velarde 01009860f3 Merge remote-tracking branch 'origin/main' into codex/cloudplot-showcase-migration
# Conflicts:
#	pnpm-lock.yaml
2026-08-27 06:36:24 -07:00
Jerel John Velarde b9d9d700af fix(showcases): protect CloudPlot production runtime 2026-08-27 06:18:44 -07:00
Jerel John Velarde 4a8a5f2d5b fix(showcases): restore CloudPlot state on ready agents 2026-08-27 06:07:25 -07:00
Jerel John Velarde db4e3544ed fix(showcases): gate CloudPlot agent readiness 2026-08-27 05:56:53 -07:00
Jerel John Velarde 3c4416b8a0 fix(showcases): validate CloudPlot resource tools 2026-08-27 05:56:45 -07:00
Alem Tuzlak e90552eba3 feat: enable Inspector by default in browser frameworks (#6577)
## Summary

- Enable the browser Inspector by default for React v2, Vue, and Angular
development builds.
- Add `enableInspector?: boolean` as the shared opt-out API; `false`
disables it.
- Keep production and SSR hard-disabled, even when `enableInspector` is
`true`.
- Keep React Native unchanged because the Lit Inspector requires a DOM.

## Why

The Inspector already consumes the same CopilotKit core used by each
browser framework, but Vue and Angular required manual setup and React's
behavior was tied to the legacy `showDevConsole` prop. Developers should
get the same debugging entry point in every browser framework without
exposing it in production.

## How

- Centralize visibility in `@copilotkit/shared`: browser + development +
not explicitly disabled.
- Mount the custom element after hydration/rendering and bind the exact
framework core before connection.
- Reuse Angular's existing Inspector/Event Snippets service and track
element ownership for cleanup.
- Keep Vue's wrapper reactive and client-only.
- Remove the dead Inspector anchor configuration and obsolete example
workarounds.
- Leave `showDevConsole` available for legacy error UI, but it no longer
controls the v2 Inspector.

## Verification

Passing:

- Nx tests: React Core (1,534), Vue, Angular (316), Shared, and Web
Inspector.
- Nx typechecks: React Core, Vue, Shared, and Web Inspector.
- Nx builds: React Core, Vue, Shared, and Web Inspector.
- Shell docs: typecheck and production build.
- Pre-commit lint: no errors.

Unrelated current `main` baseline failures:

- Angular typecheck/build: `ChangeDetectionStrategy.Eager` is not
present in the installed Angular version; the failing files are
unchanged by this PR.
- Shell docs tests: three Git LFS image fixtures are pointer files in
this worktree, plus one unrelated Mastra fixture expectation.
2026-08-27 13:24:21 +02:00
Alem Tuzlak 1e9f104eb6 chore(examples): allowlist Vite Vue Inspector build configs 2026-08-27 13:06:19 +02:00
Alem Tuzlak 5afe7cf7ad chore(examples): add Vite Vue Inspector check app 2026-08-27 13:01:37 +02:00
Alem Tuzlak ed28f3a908 fix(angular): export inspector development-mode token from public API 2026-08-27 13:01:01 +02:00
Alem Tuzlak 2dec983ed8 fix(angular): restore web-inspector workspace dependency 2026-08-27 12:15:03 +02:00
Alem Tuzlak 42d3c92fbd chore: merge origin/main into tyler/default-browser-inspector 2026-08-27 12:09:27 +02:00
Alem Tuzlak 0e700fa3b9 docs(react-core): correct Inspector debug-mode skill examples 2026-08-27 12:00:55 +02:00
Jerel John Velarde 15ee0ff315 fix(showcases): surface CloudPlot execution failures 2026-08-27 00:59:11 -07:00
Jerel John Velarde 538116e72c fix(showcases): surface Cloudplot placement failures 2026-08-27 00:42:36 -07:00
Jerel John Velarde 8d505fd9aa fix(showcases): validate Cloudplot recovery boundaries 2026-08-27 00:42:35 -07:00
Jerel John Velarde 80f6509ad6 fix(showcases): preserve Cloudplot state integrity 2026-08-27 00:42:35 -07:00
Jerel John Velarde 1780f5b61e fix(showcases): harden Cloudplot runtime integration 2026-08-27 00:42:13 -07:00
Jerel John Velarde bd5bba512a fix(showcases): remove unused Cloudplot config 2026-08-27 00:41:46 -07:00
github-actions[bot] 2a83296f2c style: auto-fix formatting 2026-08-27 00:41:45 -07:00
Jerel John Velarde f998624e74 fix(showcases): harden Cloudplot hydration 2026-08-27 00:41:45 -07:00
Jerel John Velarde 3cdb132638 chore(showcases): format Cloudplot sources 2026-08-27 00:41:45 -07:00
Jerel John Velarde 7cc11c7969 fix(showcases): lock Cloudplot workspace dependencies 2026-08-27 00:41:44 -07:00
Jerel John Velarde 10ab5e9446 feat(showcases): add Cloudplot demo 2026-08-27 00:40:16 -07:00
Martha Kelly Schumann 68fbe97d87 chore(sdk-python): release 0.1.96 for FAC-124 (#6728)
## Summary

- publish the current Python SDK lifecycle repair as
`copilotkit==0.1.96`
- unblock the LangGraph Python starter from consuming the fixed
intercepted frontend/MCP tool-call bridge
- keep the starter pin unchanged until PyPI serves this exact version

## Why this is separate

FAC-124 requires an ordered delivery sequence. The current lifecycle fix
and its streaming/non-streaming regression tests are already on `main`,
but PyPI still serves `0.1.95` and the starter is pinned to `0.1.94`.
Merging this release gate publishes `0.1.96`; the follow-up PR can then
safely update the starter lock, add the bounded Excalidraw labeling
contract, and add starter-level deterministic coverage.

Refs FAC-124.

## Validation

- `./scripts/release/detect-py-version-changes.sh` →
`should_publish=true` for `0.1.96`
- `poetry check --lock`
- `poetry build` produced the `0.1.96` wheel and sdist
- `poetry run python -m pytest -q
tests/test_intercepted_tool_call_events.py` → 8 passed
- `git diff --check`
python-sdk/v0.1.96
2026-08-26 15:27:12 -07:00
copilotkit-qa-bot[bot] 4c5402a0aa chore(sdk-python): release 0.1.96 2026-08-26 15:12:51 -07:00
Martha Kelly Schumann a09e0d1d14 docs(agno): configure frontend-tool session storage (#6726)
## Summary

- configure the Agno showcase agent with writable SQLite session storage
so paused frontend-tool and HITL runs can resume
- document the database requirement on all four affected Agno routes
without changing shared framework-neutral content
- add runtime-agent, rendered visual docs, LLM-text, dependency, and
framework-isolation regression coverage

## Validation

- Agno Python tests: 33 passed
- Agno persistence regression: passed
- shell-docs persistence tests: 5 passed
- shell-docs typecheck and production build: passed
- Ruff and git diff checks: passed
- Agno 2.7.2 characterization: the configured database passes the
missing-database guard and reaches session lookup

## Probe note

The direct D6 probe was blocked before Agno started by the existing
showcase shared-module staging error at showcase/integrations/ag2/tools.
No Agno service or changed code was reached.

Fixes
[FAC-125](https://linear.app/copilotkit/issue/FAC-125/agno-frontend-tools-fail-without-database-configured).
2026-08-26 15:07:51 -07:00
copilotkit-qa-bot[bot] 17c59fd719 collect Agno persistence regression in CI 2026-08-26 14:56:06 -07:00
copilotkit-qa-bot[bot] 301fa3cc19 Merge remote-tracking branch 'origin/main' into codex/fac-125-agno-db-docs 2026-08-26 14:47:03 -07:00
Martha Kelly Schumann 54567d1d12 fix(docs): send Intelligence CTAs through onboarding (#6727)
## Bug

[Sam
reported](https://copilotkit.slack.com/archives/C0BR0V2P4QJ/p1787777419496249)
two live Docs CTA failures:

- The navbar signup CTA returned users to Docs after authentication.
- Other Intelligence CTAs could send signed-in users to Pricing.

## Fix

- Send every Docs Intelligence signup CTA to the matching environment at
`/sign-in?post_auth_redirect=ready`.
- Remove the Docs `redirect_url` that explicitly caused the return to
Docs.
- Share the URL builder across the navbar and in-page CTAs so their
destinations stay aligned.
- Preserve existing UTM attribution and custom Talk to an Engineer
destinations.

## Validation

- 18 focused tests passed.
- Shell Docs TypeScript check passed.
- Focused lint and formatting checks passed.

No visual changes.
2026-08-26 14:09:53 -07:00
copilotkit-qa-bot[bot] 235ac1cf8f fix(docs): correct Intelligence CTA redirects 2026-08-26 14:01:28 -07:00
copilotkit-qa-bot[bot] 3c314c6d84 rerun CI after automated formatting 2026-08-26 13:48:06 -07:00
github-actions[bot] 53b2bfb520 style: auto-fix formatting 2026-08-26 20:46:46 +00:00
copilotkit-qa-bot[bot] 09f0482152 document Agno frontend-tool session storage 2026-08-26 13:43:11 -07:00
Martha Kelly Schumann e432fd161b fix(ms-agent-python): migrate starter to stable APIs (#6723)
## Summary

- migrate the Microsoft Agent Framework Python starter from retired beta
APIs to the current stable Agent, tool, AG-UI, and OpenAI client
contracts
- preserve both Azure AD (`az login`/`DefaultAzureCredential`) and Azure
API-key authentication
- update all authored Microsoft Agent Python setup examples and
integration guidance
- prevent duplicate frontend/backend HITL tool registration exposed by
the stable runtime
- add stable API, auth-path, configuration-error, and rendered-doc
regression coverage

## Validation

- Python stable API unit tests: 4 passed
- keyless Azure client initialization smoke
- rendered docs regression matrix: 8 passed
- shell docs TypeScript typecheck
- Ruff, Oxfmt, Oxlint, and git diff checks
- Dockerized starter smoke: 4 passed (health, agent, interaction, chat)

Fixes
[FAC-127](https://linear.app/copilotkit/issue/FAC-127/microsoft-agent-python-docs-import-non-existent-agent-frameworkazure).

Supersedes the closed, unmerged earlier attempt in #6099.
2026-08-26 13:25:24 -07:00
copilotkit-qa-bot[bot] 70f15d6ead Merge remote-tracking branch 'origin/main' into codex/fac-127-ms-agent-stable-apis 2026-08-26 12:56:16 -07:00
copilotkit-qa-bot[bot] 0b854047e2 fix(ms-agent-python): preserve Azure AD auth 2026-08-26 12:55:46 -07:00
Martha Kelly Schumann 45faf9f65a docs(google-adk): define state-streaming stop callback (#6611)
## Summary

- document the Google ADK `stop_on_terminal_text` registration required
for state streaming
- keep internal callback commentary out of generated public docs and
link the canonical implementation instead
- cover both visual and LLM documentation output, including regression
checks for leaked internals

## Validation

- `npx vitest run src/lib/__tests__/setup-content.test.ts
src/lib/__tests__/setup-concept.test.ts`
- `npx vitest run src/lib/__tests__/llm-text.test.ts -t "renders the
Google ADK termination setup"`
- `npx oxfmt --check src/lib/__tests__/setup-content.test.ts
src/lib/__tests__/setup-concept.test.ts
src/lib/__tests__/llm-text.test.ts`
- `npx oxlint src/lib/__tests__/setup-content.test.ts
src/lib/__tests__/setup-concept.test.ts
src/lib/__tests__/llm-text.test.ts`
- `npm run typecheck`
- `git diff --check`
2026-08-26 12:48:01 -07:00
copilotkit-qa-bot[bot] 8a01027e7b Merge remote-tracking branch 'origin/main' into codex/fac-72-google-adk-stop-callback 2026-08-26 12:39:51 -07:00
Ben Taylor d02f7e699e docs(react-core): state the blast radius of key-remount and the provisional agent (refs OSS-979) (#6710)
## Why

An Intelligence integration lost a request-to-row correlation map
partway through a user interaction — no error, no warning. It surfaced
as "our response routing is flaky". OSS-979 filed it as
`CopilotKitProvider` remounting its children.

The provider does nothing of the kind. It renders `{children}`
unconditionally at `CopilotKitProvider.tsx:952` — unkeyed, no early
return, and there is no `Suspense` boundary anywhere in `v2`. Nothing in
the SDK silently re-points the active thread either; every mutation path
(`setActiveThreadId`, `startNewThread`, the drawer row click, the
inspector override) is caller-driven.

The remount was app-side, and it was app-side because this skill told it
to be:

- `references/threads.md:98` teaches `useThreads()` → select →
`<CopilotChat key={activeId}>`, and that recipe is only reachable once
Intelligence is wired.
- `references/switching-agents.md:123` teaches "`key={activeAgent}`
forces remount so thread state doesn't leak" without saying what else
that discards.
- `examples/showcases/reskinnable-demo/src/app/[skin]/layout.tsx:223`
models `<SubagentActivityProvider key={threadId}>` above `{children}`,
commented "Remounting is deliberate".

Follow all three and you key a layout-level provider on a thread id that
changes asynchronously after mount. Everything below it dies
mid-interaction.

Two properties made it invisible:

- Durable threads exist only in Intelligence mode, so with a plain SSE
runtime `useThreads` returns nothing, the selected thread never changes,
and the remount never fires. It appears the moment Intelligence is
wired.
- Whether state survives depends on whether the user acted before the
thread list resolved.

## What changed

Docs only — no library change. Both traps now carry their blast radius,
in the four places an agent actually reads:

| File | Change |
|---|---|
| `SKILL.md` | Two invariants in the load-once section, so they land
before any reference is opened |
| `references/threads.md` | New HIGH entry on keying above app state;
note that `activeId` in the switcher recipe settles asynchronously |
| `references/switching-agents.md` | Existing HIGH entry now states the
blast radius and cross-links the threads trap |
| `references/switching-agents-recipes.md` | Key rule amended — keep it
on `<CopilotChat>`, nowhere higher |
| `references/agent-access.md` | The second route to the same symptom:
`useAgent` swaps a provisional stand-in for the real agent when `/info`
resolves, so an effect keyed on `agent` re-runs once, mid-interaction.
Adds an `isReady` pattern and a HIGH entry |

`isReady` appeared in **zero** shipped skills before this — it was
documented only in `showcase/shell-docs/.../useAgent.mdx` and in JSDoc.
Same shape as OSS-888, where the root cause was the shipped skill rather
than the library.

Also corrects a factual error: the skill claimed `useAgent` returns `{
agent }` only. It returns `{ agent, isReady }`.

The 10-file diff is 5 source files under `packages/react-core/skills/`
plus their 5 mirrors under `skills/`, regenerated with `pnpm
sync:plugin-skills`.

## Verification

- `pnpm check:plugin-skills` — mirror in sync
- `pnpm exec vitest run scripts/__tests__/sync-plugin-skills.test.ts` —
12 passed
- `oxfmt --check` — clean over both skill trees
- Full pre-commit suite green, including `test-and-check-packages`
(`test`, `publint`, `attw` across 2 projects and 20 dependent tasks)

## Not in scope

Whether the run's app keyed on `threadId` or on `agent` is not
settleable from the repo — its source is not in any checkout, and there
is no `2026-08-25` strands run report under
`tools/one-prompt-development/evaluation/runs` on any branch. Both
variants produce the reported symptom and this covers both, so a
first-hand repro is a separate task. The `reskinnable-demo` layout is
left as-is deliberately: it is a legitimate use of the pattern, and it
is now the worked example the guidance warns about.

Scoping detail in the OSS-979 comment.

refs OSS-979

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-08-26 14:38:23 -05:00
Maxim 9a103a0348 chore(examples): put the AgentCore example on uv projects (#6672)
## What

Converts `examples/integrations/agentcore` from unlocked
`requirements.txt` files to uv projects (`pyproject.toml` + `uv.lock`),
matching every other Python integration example in this repo.

## Why

The example already used uv as an *installer* — the agent images are
built from `ghcr.io/astral-sh/uv` and ran `uv pip install -r
requirements.txt` — but nothing was locked, so each image build
re-resolved transitive dependencies against whatever PyPI had that day.

That had already drifted into a hard break. `langgraph==1.0.10rc1`
resolved alongside a `langgraph-prebuilt` that reads `ExecutionInfo` off
`langgraph.runtime`, which 1.0.x does not export, so the LangGraph agent
raised `ImportError` at container start.

## The migration

- Both agents get a `pyproject.toml` + `uv.lock`; the Dockerfiles
install with `uv sync --locked` and run out of `/app/.venv`.
- LangGraph agent moves to `langgraph==1.1.6` / `langchain==1.2.15`, the
pair used by `examples/integrations/langgraph-python`, which resolves
the import failure. `langchain` was previously `>=0.3.0` while the code
uses the 1.x `create_agent` API.
- Four packages that shipped code imports directly were declared nowhere
and survived only as transitives: `boto3` (both agents, via
`agents/utils/ssm.py`), `PyJWT` (langgraph, via `agents/utils/auth.py`),
`langchain-core` (langgraph, via `tools/todos.py`), `botocore` (root,
via `scripts/utils.py`). All now declared; no resolved version changed.
- `aws-opentelemetry-distro` moves from a loose second `uv pip install`
into the locked set.
- The example root gets a project for the `scripts/` helpers. Their
`requirements.txt` listed the dependencies but nothing installed it, so
`uv run scripts/test-agent.py` — the command that script's own docstring
gives — failed on a missing `requests`.
- Deploy and local-dev scripts call `uv run` instead of bare `python3`;
preflight checks for `uv` rather than `python3`.

## Terraform

The docker-mode image hash read `patterns/<pattern>/requirements.txt`,
`patterns/utils`, a root-level `gateway/` and `tools/`, and a root
`pyproject.toml` — none of which exist here. `filesha256` on a missing
file is a plan-time error. Repointed at `agents/<pattern>` and
`agents/utils`, now hashing `pyproject.toml` and `uv.lock`.

The hash then had to exclude the virtualenv the migration creates:
`fileset(pattern_dir, "**/*.py")` saw 3114 files instead of 5, and the
computed hash differed depending on whether a developer had ever run the
agent locally — feeding `replace_triggered_by` and forcing a runtime
replacement. Measured: `5f9a98ef…` with a venv present vs `bacab1e1…`
without, on identical committed sources. The fix filters `.venv/` and
`venv/` and produces the clean-checkout digest in both cases.

## Review

Five review rounds plus a promotion audit, and nine defects this
migration introduced were found and fixed before merge. Each fix was
verified by running the thing, not by reading it:

- The image hash sweeping the local virtualenv (above).
- The undeclared direct dependencies (above).
- `scripts/test-agent.py` piped the child's output and never drained it,
deadlocking the agent, while the startup-timeout branch blocked forever
on a read — the only channel carrying uv's lockfile-drift error.
- `--local` treated any listener on port 8080 as the agent, so a foreign
process produced "Agent started successfully" while the real child died.
Adopting a running process is now explicit opt-in.
- The documented invocation contract had drifted across the two READMEs
and both scripts' usage text; a single reconciliation pass now owns all
of them, and every documented command was executed to confirm it works.
- The Terraform README named the CloudFormation deploy script, which
cannot read a Terraform deployment.
- Two `.env.example` entries parsed as their own trailing comment text
under Docker Compose.
- The build context shipped 898 MB of local-only artifacts (measured);
now 11 kB.
- Assorted comment and message inaccuracies, including a container env
block whose comment attributed a runtime-critical variable to uv.

## Repository hygiene

Two fixes the pre-merge gates surfaced rather than the review rounds:

- `oxfmt` on the example README and `tofu fmt` on the Terraform locals
file. The README break was introduced by this branch; the Terraform one
predates it but sits in a file this branch edits.
- The Terraform ignore rules were anchored to the top level, so the
provider cache `terraform init` writes beside every *nested* module was
fully stageable — a measured 834 MB one `git add -A` from being
committed. Switched to unanchored patterns, matching what this branch
already did for the virtualenv layout. Verified with `git check-ignore`
that the nested cache and lock file are now covered, tfstate and tfvars
still are, and no tracked file is caught by the wider patterns.

## Not addressed

Roughly 90 further findings are real but pre-existing and belong to four
follow-up subjects, listed in full in the review ledger:

- **Terraform module repair** — `terraform validate` fails on five
undeclared resources, so this module cannot plan at all. Zip mode
references an entry point and a packager directory that do not exist.
- **test-agent AG-UI correctness** — the request body fails
`RunAgentInput.model_validate` on both agents, and the response decoder
parses a pre-AG-UI format, so failures print nothing and exit 0.
- **README accuracy** — a `docs/` directory that does not exist, a wrong
Node floor, a teardown block whose second command never runs.
- **Deploy-script hardening** —
`infra-terraform/scripts/deploy-frontend.py` requires a Terraform output
nothing declares, so it exits 1 every run; the README now says so rather
than presenting it as a working path.

## Verification

Both images built for `linux/arm64` and the agent module imported inside
each, after every fix cycle. `uv lock --check` clean on all three
projects. Every documented command executed from its documented
directory. The virtualenv hash filter, the build-context reduction, the
pipe deadlock, the port-adoption fix and the env-file parsing were each
verified by measurement with before/after output. No repo CI job builds
or lints this example, so these local runs are the only coverage that
exists.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-08-26 21:36:43 +02:00
Ben Taylor 9e488f7a51 test(examples): gate the starters' Intelligence wiring block on one shape (closes OSS-982) (#6716)
**Merge order: #6711#6718 → this PR.**

#6718 rewrites `identifyUser` in the same 22 blocks and is a sibling of
this branch, not stacked on it, so the two overlap on the same lines.
Landing the gate last means it ratchets on the finished shape and avoids
a conflict. If this PR goes first instead, #6718 goes red until it moves
all 22 sites together — which is the gate working, but noisier.

Stacked on #6711 — merge that first. This branch descends from it, so
the diff below carries its commit too; GitHub drops those once #6711
lands.

Basing this PR on `main` rather than on #6711's branch is deliberate: 17
of 35 workflows filter `pull_request: branches: [main]`, including the
one this PR extends, so a PR based on the 981 branch would not run the
check it adds.

## Problem

The marked block that wires managed Intelligence is the region a hosted
reader copies verbatim, and nothing checked it. Both gaps are
deliberate, not accidental:

- `examples/integrations/_parity/manifest.json` lists
`src/app/api/copilotkit/**` under `allowedDivergence` for every instance
it tracks. What parity does hold byte-identical is the demo frontend: 54
verbatim paths of example canvas, todo columns and charts.
- No `examples/integrations/*/docker-compose.test.yml` sets
`COPILOTKIT_LICENSE_TOKEN`. The wiring is a ternary on that variable, so
all 13 smoke-tested starters take the else arm. The `intelligence:` arm
has never executed in CI, in any starter.

The cost was already visible. The block's code was byte-identical in 21
of 22 starters, but its warning comment had drifted into five variants
and the two `ms-agent-framework-*` starters shipped the `demo-user` stub
with no warning at all. Comment drift is harmless by itself; it is the
tracer showing nothing held the region still, and it is how the
localhost default of #6711 survived in all 22 copies at once.

## Change

`scripts/validate-intelligence-wiring-block.ts` greps the opening
marker, compares every site against the north-star starter, and fails on
the first line that differs. Two normalisations keep it usable:

- The block is dedented, because `agentcore` nests it two levels deeper
— its runtime is a Lambda handler, not a Next.js route.
- The else arm's runner name is masked, because `agentcore` runs
`AgentCoreRunner` in front of a Bedrock AgentCore session where an
in-process runner has nothing to run. `EXPECTED_RUNNER` holds that one
exception, so a runner swapped in by accident still fails.

Everything else, comment text included, must match to the byte. Then the
warning is unified at all 22 sites on the fullest existing wording,
which also says the id must exist in Intelligence or thread operations
can fail.

It compares against the north star rather than a literal kept in the
script, so improving the block means editing `langgraph-python` and
running the other 21 to match.

## What it does and does not guarantee

It is a shape gate, not a content gate: 22 identically wrong copies
still pass. What it guarantees is that a fix reaches all of them or
none. The check passes on day one — 21 of 22 already matched on code —
so it is a ratchet, not a migration.

## Verification

Mutating a real starter three ways, each caught:

| Mutation | Reported as |
| --- | --- |
| Dropped one comment line | `line 15 differs from the north star`, exit
1 |
| \`InMemoryAgentRunner\` → \`SomeOtherRunner\` | `else arm uses
SomeOtherRunner; expected InMemoryAgentRunner` |
| Reintroduced \`?? \"http://localhost:4201\"\` | `line 6 differs`, both
sides shown |

The third matters: the #6711 regression is now caught at a second site,
independent of the env-name validator.

Commands run, all exit 0:

- `pnpm exec vitest run
scripts/__tests__/validate-intelligence-wiring-block.test.ts
scripts/__tests__/validate-intelligence-env-names.test.ts` — 30 passed
- `pnpm check:intelligence-wiring-block` — `All 22 Intelligence wiring
sites match langgraph-python.`
- `pnpm check:intelligence-env-names` — unaffected, still canonical
- `pnpm parity:verify`
- `oxfmt --check`, `oxlint`, and `tsc --noEmit --strict` on the new pair

Two tests guard the gate against going vacuous: one asserts at least 22
marker files are discovered, so an empty violation list cannot pass on
an empty file list.

Not run locally: the lefthook pre-commit suite, which fails
environmentally in a worktree without per-package installs (`sh: vite:
command not found`). This diff touches no package source.

## Not covered

Enrolling the `intelligence:` arm in the smoke path. It needs a license
token in CI secrets and an endpoint reachable from the compose network —
a different size of job, tracked separately.
2026-08-26 14:36:24 -05:00
copilotkit-qa-bot[bot] b0908711ab Merge remote-tracking branch 'origin/main' into codex/fac-72-google-adk-stop-callback 2026-08-26 12:30:08 -07:00
copilotkit-qa-bot[bot] 2ba50f1476 docs(google-adk): keep callback setup concise 2026-08-26 12:29:46 -07:00
Maxim 888a70e169 Merge branch 'main' into chore/agentcore-uv 2026-08-26 21:28:39 +02:00
Ben Taylor 4b73ce3c83 fix(examples): stop overriding the managed Intelligence URL defaults (closes OSS-981) (#6711)
## What does this PR do?

`CopilotKitIntelligence` is built to be correct when the caller says
nothing: omitting `apiUrl`/`wsUrl` resolves to
`https://api.intelligence.copilotkit.ai` and
`wss://realtime.intelligence.copilotkit.ai`, and its docstring says so
outright — *"leaving both unset is always correct against it."*

Every starter's runtime route defeated that default:

```ts
apiUrl: process.env.INTELLIGENCE_API_URL ?? "http://localhost:4201",
wsUrl:
  process.env.INTELLIGENCE_GATEWAY_WS_URL ?? "ws://localhost:4401",
```

With the variables unset — the correct configuration for a managed user
— the `??` supplies localhost and the runtime aims at a local stack that
is not running. This is the artifact `copilotkit init` clones, so it is
the first thing a new managed user runs.

The starter's own `.env.example` already warns about exactly this
failure, two files away:

> `INTELLIGENCE_API_URL` and `INTELLIGENCE_GATEWAY_WS_URL` point at a
self-hosted or local Intelligence deployment only — leave them unset
when using managed Intelligence, or the channel host and runtime will
try to reach a local stack that usually is not running.

So the documentation was right and the code contradicted it.
`channel-host.mts`, in the same directories, already had the correct
shape.

### The fix

**22 runtime wiring sites** (20 route handlers, `adk-angular/server.ts`,
and the AgentCore Lambda) now use the conditional spread these starters
already use in `channel-host.mts`, so a self-hosted override still works
and the managed default applies when absent:

```ts
...(process.env.INTELLIGENCE_API_URL
  ? { apiUrl: process.env.INTELLIGENCE_API_URL }
  : {}),
```

No hosted URL is written into the examples — the library already owns
them, so this is a deletion.

**3 `.env.example` files** (`agent-spec`, `llamaindex`, `mcp-apps`) set
the same values *uncommented*. Two do it directly beneath a comment
telling the reader to leave them unset, and an `.env.example` is copied
to `.env`, so these were the remaining route to a localhost value once
the code default was gone. Commented out to match the other nineteen
starters; `agent-spec` had no explanation at all and gets the standard
one.

**A guard**, added to the existing
`scripts/validate-intelligence-env-names.ts` rather than a new script —
it already polices the canonical Intelligence key name and the two dead
hosts, and its workflow is deliberately unfiltered so it sees every
README, example and skill. Two rules: `managedUrlFallback` (a `??`/`||`
default on either variable) and `managedUrlEnvFileAssignment` (an
uncommented env-example assignment). The rule is the *pattern*, not the
literal, so a staging host substituted for localhost fails the same way.

Five files legitimately want a local target and are allowlisted with
their reasons: the `playwright.config.ts` and `.env.example` of the
banking and reskinnable-demo showcases (own vendored compose ports
7050/7053 and 7250/7253, own seeded org keys) and
`agentcore/docker/.env.example` (the documented local development
stack). Resolving those to the managed hosts would aim an offline test
suite at production.

`scripts/__tests__` has no general runner, so the workflow runs this
test file explicitly, following the `plugin-skills-check.yml` precedent
— otherwise a rule that silently stopped matching would leave the check
passing on an empty result.

## Related PRs and Issues

- Closes OSS-981.
- Supersedes the canceled ENT-922, whose blocker ("do not invent hosted
URLs; rewrite once the managed env contract is final") no longer
applies: the contract shipped as `MANAGED_INTELLIGENCE_API_URL` /
`MANAGED_INTELLIGENCE_WS_URL`, and the fix removes a fallback rather
than adding a URL.
- ENT-949 shipped a warning for this class of mistake, but
`warnOnPartialHostOverride` only fires on a *partial* override — both
values defaulting to localhost together is not partial, so nothing
warned.

## Verification

- `pnpm exec vitest run
scripts/__tests__/validate-intelligence-env-names.test.ts` — 13 passed.
Written first: the rules were red before they existed, then reported
**48 violations across 24 files** for the code rule and **10 across 5**
for the env-file rule; the fixes took both to green.
- `pnpm check:intelligence-env-names` — exit 0.
- `oxfmt --check` and `oxlint` over all 25 touched files — clean.
- The spread typechecks under `strict` + `exactOptionalPropertyTypes`,
the setting that would reject `apiUrl: string | undefined`.
- The marked wiring block stays byte-identical across 21 of 22 starters
(`agentcore` differs only in its runner), and no `localhost` remains
inside any marked block.
- Not run locally: the 13 starter Next builds. `test_smoke-starter.yml`
typechecks the route handlers in CI on this PR.

### Out of scope

`agentcore/docker/docker-compose.yml` keeps its
`${INTELLIGENCE_API_URL:-http://localhost:4201}`: it is compose
substitution in the documented local-dev stack, not shipped runtime
code. Separately that default cannot work anyway — inside the bridge
container `localhost` is the container's own loopback — but that is a
different bug.

## 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)
2026-08-26 14:28:28 -05:00
Maxim f8e13e675c Remove the banking showcase in favor of reskinnable-demo (#6683)
## What

Sunsets `examples/showcases/banking`. It is superseded by
`examples/showcases/reskinnable-demo`, which ships the same banking
experience as one of its runtime-swappable skins (alongside airline) on
top of a shared shell. Keeping both means maintaining two copies of the
same demo.

160 files deleted, plus the five places that pointed at the app:

| File | Change |
| --- | --- |
| `pnpm-workspace.yaml` | Drops the workspace entry. Also fixes the
adjacent NOTE, which attributed the canary AG-UI pin to "banking's
agent" when it is reskinnable-demo's own Python deep agent that needs
it. |
| `pnpm-lock.yaml` | Regenerated (−919/+12). The 12 additions are
peer-suffix re-keying caused by removing the importer — banking pinned a
different `eslint`/`vitest` peer combination. No dependency version
changes. |
| `examples/README.md` | The banking row becomes a reskinnable-demo row,
so the successor is listed and the showcase count is unchanged. |
| `showcase/shell-docs/src/content/docs/faq.mdx` | The "Banking
Assistant" link retargets to reskinnable-demo instead of 404ing. |
| `.github/config-allowlist.txt` | Drops the deleted `next.config.mjs`.
|

Note that banking was a real pnpm workspace member using `workspace:*`
deps, unlike reskinnable-demo, which sits deliberately outside the
workspace with its own lockfile. That is why the root lockfile has to be
regenerated here.

## Deliberately not changed

- `scripts/migrate-demos.sh` and `scripts/archive-demo-repos.sh` still
name `examples/showcases/banking`. Those are the already-executed
one-shot manifests for the repo consolidation; the path is a historical
record in them, not a live reference.
- `reskinnable-demo`'s `.env.example` and `docker-compose.yml` still
explain their +200 port offset in terms of banking's stack. The offset
stays real, and "was cloned from banking" stays true.
- The `banking` mentions in `test_reskinnable-demo.yml` refer to
reskinnable-demo's **banking skin**, not this app.

## Verification

- `.github/scripts/check-config-allowlist.sh` passes.
- A full `pnpm install` agrees with the regenerated lockfile (no further
diff).
- The lockfile-only regen and the full install produce identical output.

The `test-and-check-packages` pre-commit hook fires on any
`pnpm-lock.yaml` change, so it ran `test,publint,attw` across all 25
packages. Four suites failed locally — `sqlite-runner`, `web-inspector`,
`vue`, `react-core` — in a worktree installed with `--ignore-scripts`,
which skips `better-sqlite3`'s native build. This change touches no
package source, so CI is the gate on those; please confirm they are
green here before merging.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-08-26 21:27:16 +02:00
copilotkit-qa-bot[bot] 7d3be75754 Merge remote-tracking branch 'origin/main' into codex/fac-72-google-adk-stop-callback 2026-08-26 12:25:50 -07:00