Commit Graph

12110 Commits

Author SHA1 Message Date
Jordan Ritter 3458927f87 fix(showcase): stop image-drift flagging pinned prod red
Under the pinned-prod contract, prod is intentionally digest-pinned behind
:latest. image-drift now renders such prod services green (pinnedExpected)
instead of red; a genuinely missing digest stays red. Staging unchanged.
2026-06-19 03:50:40 -07:00
Jordan Ritter 3b02ee90a5 fix(showcase): provision prod services digest-pinned with go-live pin guard
Prod services are now born pinned to a resolved @sha256 digest (mirroring
the Ruby promote CLI's GHCR resolver) instead of the mutable :latest tag,
fail-loud on resolve failure, and goLive asserts the prod source.image is
digest-pinned. Adds DI-testable assertProdDigestPinned + coverage.
2026-06-19 03:50:40 -07:00
Jordan Ritter 224754742d test(showcase): bump calculator-fixture integration pin to 19 for ms-agent-harness-dotnet (#5570)
## Summary

Fix-forward for the RED `Showcase: Validate` on `main` introduced by
#5569 (MS Agent Harness (.NET) full column).

`showcase/scripts/__tests__/calculator-fixture-routing.test.ts`
hard-pins the count of discovered `_from-feature-parity.json`
integration fixtures. #5569 legitimately added the 19th integration
(`ms-agent-harness-dotnet`) and its calculator fixtures are already
mirrored in
`showcase/aimock/d6/ms-agent-harness-dotnet/_from-feature-parity.json`.
The test's own failure message prescribes the fix: bump the pin.

## Changes

- Bump the discovered-integration pin from 18 → 19 (test name +
`toHaveLength`).
- Update the explanatory comment counts (16/18 → 17/19) to match the new
integration set. The two pill-less integrations (built-in-agent,
claude-sdk-python) are unchanged; `ms-agent-harness-dotnet` carries the
full calculator pill, so it joins the 17 with a real pill.

No source/behavior change — pin reflects reality (the harness fixture
file exists and passes all per-integration routing/ordering assertions).

## Red → Green proof

RED (original pin=18, glob discovers 19):
```
 FAIL  __tests__/calculator-fixture-routing.test.ts > beautiful-chat calculator fixture routing > discovers all 18 integration _from-feature-parity.json files
AssertionError: integration count changed — new integration added? mirror its calculator fixtures from langgraph-python and update this pin: expected [ 'ag2', 'agno', …(17) ] to have a length of 18 but got 19
- 18
+ 19
 Test Files  1 failed (1)
      Tests  1 failed | 57 skipped (58)
```

GREEN (after pin=19, full file):
```
 Test Files  1 passed (1)
      Tests  58 passed (58)
```

(58 = 19 integrations × 3 per-integration tests + the discovery/pin
test.)
2026-06-19 03:06:27 -07:00
Jordan Ritter a3655a44f4 test(showcase): bump calculator-fixture integration pin to 19 for ms-agent-harness-dotnet 2026-06-19 03:05:20 -07:00
Jordan Ritter c681d64af6 feat(showcase): add MS Agent Harness (.NET) full column (#5569)
## Summary
Adds the full **MS Agent Harness (.NET)** showcase column
(`ms-agent-harness-dotnet`) — a 1:1 port of the green framework sibling
`ms-agent-dotnet`, rebuilt on the `AsHarnessAgent` construction surface
(Microsoft.Agents.AI 1.6.1).

- **326 files** (+30k): 243 frontend demo files + shared components/API
routes, 24 backend agent `.cs` on the `AsHarnessAgent` pattern, 38 D6 +
1 D4 aimock fixtures (cribbed from the framework, `match.context`
re-keyed), manifest/csproj registration.
- The column was already registered (slug-map, compose, dashboard,
smoke) on main; this lands the implementation.

## .NET adaptations (the novel surface)
- **Microsoft.Agents.AI 1.6.1 API migration** —
`AgentThread`→`AgentSession`,
`AgentRunResponse(Update)`→`AgentResponse(Update)`,
`RunAsync`→`RunCoreAsync` across the ported agents.
- **aimock-header** aligned to the `IHttpContextAccessor` design so
`x-aimock-context` propagates across the AG-UI SSE-pump boundary
(matches the framework).
- **JsonElement-capable `TypeInfoResolver`** threaded to the
shared-state agents (fixes a startup crash).
- **`crypto.randomUUID` secure-context fallback** in the headless demos
(the container serves over plain HTTP at a non-localhost host; symmetric
with the existing `multimodal` helper).

## LOCAL==STAGING parity fix
- `control-plane-run.ts` now threads each scope's
`not_supported_features` into the synthesized local roster, so the D6
driver reclassifies architecturally/upstream-blocked features as
`skipped-incapable` locally exactly as staging does. **Benefits every
column** (the local control-plane previously dropped NSF). +3 unit tests
(RED→GREEN).

## LGP / framework parity
- Frontend demos, fixtures (`response.content` untouched — only
`match.context` re-keyed), and backend behavior are 1:1 with the
framework sibling. The `hitl` demo was reverted to byte-identical
framework parity.

## D6 status
- Per-demo D6 GREEN verified locally (control-plane): `headless-simple`,
`headless-complete`, `gen-ui-agent`, `shared-state-read`, `multimodal`.
- 3 features inherited as `not_supported`/skipped-incapable
(architecturally/upstream-blocked, same as the framework):
`shared-state-streaming`, `gen-ui-interrupt`, `interrupt-headless`.
- `declarative-gen-ui` verified structurally parity-clean
(byte-identical to the green framework). **CI runs the authoritative
full-column D6.**

## Review
- 7-agent cr-loop converged (0 mandatory findings; Procedure 3 promotion
audit 0-promote). All review findings were either framework-inherited
(fixing breaks 1:1 parity) or pre-existing `control-plane-run.ts`
poll-hardening (tracked as a follow-up — not introduced here).

## Test plan
- [ ] CI: Showcase: Validate green
- [ ] CI: full-column D6 (`ms-agent-harness-dotnet`) green
(authoritative)
- [ ] CI: .NET image build green
2026-06-19 02:54:53 -07:00
Jordan Ritter a755ab6c70 fix(cvdiag): gate DEBUG raw-byte capture to allow-listed slugs + mark raw-byte capture experimental/non-prod (M1 CR R9) 2026-06-19 02:49:51 -07:00
github-actions[bot] 45424333f0 style: auto-fix formatting 2026-06-19 09:32:19 +00:00
Jordan Ritter bc57302742 feat(showcase): thread not_supported_features into local control-plane roster for LOCAL==STAGING NSF skip parity 2026-06-19 02:28:34 -07:00
Jordan Ritter e10df0b489 feat(showcase): add ms-agent-harness-dotnet d6/d4 aimock fixtures 2026-06-19 02:28:33 -07:00
Jordan Ritter 87702c34b3 fix(cvdiag): DEBUG prod-fail-closed via trimmed safe-env allow-list (no fail-open on padded/aliased/unknown prod labels) (M1 CR R8) 2026-06-19 02:28:30 -07:00
Jordan Ritter 49d2ac16ff feat(showcase): port ms-agent-harness-dotnet frontend (demos, shared components, API routes) 2026-06-19 02:28:27 -07:00
Jordan Ritter 6ddc85f7ee feat(showcase): port ms-agent-harness-dotnet backend agents on the AsHarnessAgent construction surface 2026-06-19 02:28:22 -07:00
Jordan Ritter 4c1ed975c7 chore(showcase): register ms-agent-harness-dotnet column (manifest, csproj, slug-map, compose, dashboard, smoke) 2026-06-19 02:28:18 -07:00
Alem Tuzlak 340722f597 Merge remote-tracking branch 'origin/main' into feat/bot-whatsapp
# Conflicts:
#	examples/slack/package.json
#	pnpm-lock.yaml
#	showcase/shell-docs/src/content/docs/meta.json
2026-06-19 11:22:56 +02:00
Jordan Ritter d6915589d7 fix(cvdiag): raw-byte scrubs the entire retained head/tail (budget=segment length) so no sample region is unscanned, any body size (M1 CR R7 raw-byte-segment) 2026-06-19 02:17:49 -07:00
Alem Tuzlak 7fe12d6d3c Merge remote-tracking branch 'origin/main' into feat/bot-telegram-adapter
# Conflicts:
#	examples/slack/README.md
#	examples/slack/package.json
#	pnpm-lock.yaml
2026-06-19 11:04:18 +02:00
Jordan Ritter b0a2689970 fix(cvdiag): raw-byte captures+scrubs the REAL head+tail for >32KB bodies (scan-guard no longer truncates pre-cap) (M1 CR R6 A2)
Approach (A) reorder: decode -> html-strip -> headTailCap -> scrub(head)+scrub(tail).
The prior order scrubbed the FULL decoded body before the cap, so a body >32KB hit
scrubSecrets' bounded-prefix path: it truncated to a ...[unscanned:N] prefix BEFORE
headTailCap, which (1) lost the real tail, (2) never scanned the real tail for secrets,
and (3) zeroed elided_count. Reordering scrubs each retained <=16KB segment AFTER the
cap: input is bounded per-segment (linear regex x bounded length = ReDoS-impossible, no
scan-budget truncation), the captured head AND tail are the REAL ends of the body, and
elided_count comes from headTailCap on the FULL body. The unrelated 2KB metadata-hot-path
scan guard (SCRUB_MAX_SCAN_LEN) is untouched; the now-unneeded RAW_BYTE_SCAN_MAX export
is removed.
2026-06-18 23:48:53 -07:00
Jordan Ritter 6a0bee288e fix(cvdiag): applyByteCap byte-clamps edge_headers so the tier-cap post-condition holds for any header encoding (M1 CR R6 A1) 2026-06-18 23:48:47 -07:00
Jordan Ritter 0fb264f435 fix(cvdiag): raw-byte scrub uses its own scan budget, not the 2KB metadata guard (restores head+tail elision) (emit-hardening C-rawbyte)
The emit-hardening redesign added a 2KB SCRUB_MAX_SCAN_LEN guard inside
scrubSecrets, correct for the DEFAULT-tier metadata hot path (legit values
<=512B). But raw-byte-capture.ts also calls scrubSecrets on the DECODED wire
body, which is legitimately large (<=16KB head + <=16KB tail = up to 32KB).
The 2KB guard truncated the body to ~2KB before headTailCap ran, so for an
>32KB body elided_count became 0 and the head+tail elision never triggered.

Approach: parameterize the scan cap (chosen over the reorder-and-scrub-segments
alternative because it is a minimal, local change that preserves the documented
decode->scrub->html-strip->headtail pipeline order and keeps the metadata
default behavior byte-identical for all existing callers).

- scrub.ts: scrubSecrets gains an optional maxScanLen param defaulting to the
  exported SCRUB_MAX_SCAN_LEN (2KB). Metadata/validateMetadata callers are
  unchanged; the ReDoS guard on the hot path is untouched.
- raw-byte-capture.ts: passes RAW_BYTE_SCAN_MAX (head+tail cap = 32KB) so the
  full retained sample is scanned (no secret in the kept head/tail escapes) and
  headTailCap sees the un-truncated body. The three scrub regexes are linear at
  any bounded length, so the larger bound stays ReDoS-safe.
- scrub.test.ts: asserts the default param still applies the 2KB guard AND an
  explicit larger cap does not truncate, proving both contexts.
2026-06-18 23:33:11 -07:00
Jordan Ritter b296acb926 test(cvdiag): nested-secret sweep across all boundaries + scrub back-compat/re-export verification (emit-hardening C-sweep) 2026-06-18 23:28:06 -07:00
Jordan Ritter fc3feb3069 fix(cvdiag): applyByteCap clamps only metadata+demo, never structurally-invalidates fields (emit-hardening C-bytecap) 2026-06-18 23:17:21 -07:00
Jordan Ritter e1f9715ddc fix(cvdiag): validateMetadata calls scrubDeep directly, drops structuredClone wrapper (emit-hardening C-validate) 2026-06-18 23:13:22 -07:00
Jordan Ritter 5efcaa0763 fix(cvdiag): bound scrub worst-case scan (SCRUB_MAX_SCAN_LEN=2KB) + robust linearity-based ReDoS test (emit-hardening C-scrub-timing) 2026-06-18 22:24:13 -07:00
Jordan Ritter 243327ffaa Revert "test(cvdiag): make scrub ReDoS timing assertions robust (warm-up + 500ms ceiling)"
This reverts commit b2da571cd6.
2026-06-18 22:24:11 -07:00
Jordan Ritter b2da571cd6 test(cvdiag): make scrub ReDoS timing assertions robust (warm-up + 500ms ceiling)
The redesigned scrub regexes are linear, but the previous hard <50ms bound
flaked under JIT warm-up and shared-runner load (observed 77ms on a loaded
machine). Add a timeScrub helper that discards a warm-up call before timing
and assert against a 500ms ReDoS ceiling — wide enough to be jitter-immune,
still ~3x under the legacy ~1.4s catastrophic-backtracking blowup it guards
against.
2026-06-18 22:11:28 -07:00
Jordan Ritter 57bd8fe56f fix(cvdiag): boundEntryFields — sanitize caller slug/demo/parent_span_id/test_id at emit entry (emit-hardening C-entry) 2026-06-18 22:03:17 -07:00
Jordan Ritter 19215ca7dd fix(cvdiag): bound edge-header values at capture (EDGE_HEADER_MAX_LEN=256) (emit-hardening C-edge) 2026-06-18 22:03:14 -07:00
Jordan Ritter e1caabc0fc fix(cvdiag): ReDoS-safe + complete + non-mutating secret-scrub redesign (emit-hardening C-scrub) 2026-06-18 22:03:13 -07:00
Mike Ryan d5b804698d fix(examples): suppress browser-extension hydration warning on <body> across integration demos (#5568)
## What

1. Add `suppressHydrationWarning` to `<body>` across **all 14
integration demo templates**
(`examples/integrations/*/src/app/layout.tsx`).
2. Fix a pre-existing **double-escaped Windows path** bug in the parity
manifest's `packageJsonOverrides`.

## Why (hydration)

**Mike Ryan hit a hydration error on first load of a fresh
`langgraph-python` init — caused by his Grammarly browser extension.**

Grammarly (and similar extensions) inject attributes onto `<body>`
*before* React hydrates:

```
data-new-gr-c-s-check-loaded="9.98.0"
data-gr-ext-installed=""
```

Those attributes are in the client DOM but absent from the server HTML,
so Next.js reports:

> A tree hydrated but some attributes of the server rendered HTML didn't
match the client properties.

It's a **false positive** — the app works, and end users (without dev
extensions) never see it — but it's a red console error on the first
load of our flagship eval/showcase templates, which is a poor first
impression.

## Fix (hydration)

`suppressHydrationWarning` on `<body>` is the React/Next.js-recommended
escape hatch for this. It is **scoped and one level deep**: it only
relaxes the check for `<body>`'s *own* attributes/text — **everything
rendered inside `<body>` (the whole app) is still fully
hydration-checked** — and `<body>`'s only attribute here is a static
`className`, so none of our own markup is masked. An inline comment
documents this so a future maintainer who adds dynamic `<body>`
attributes knows the check is relaxed.

`agent-spec` already had `suppressHydrationWarning` on `<html>`; the
Grammarly attributes land on `<body>`, so it needed the body-level
relaxation too (the `<html>` one is a level up and doesn't cover
`<body>`'s attributes).

## Commits

1. `b1fa482a7` — north-star (`langgraph-python`) + parity instances
(`langgraph-js`, `langgraph-fastapi`, `strands-python`) via `pnpm
parity:sync`.
2. `9f9c415d9` — the non-parity templates (not tracked by
`_parity/manifest.json`): `adk`, `agno`, `crewai-crews`, `crewai-flows`,
`llamaindex`, `mastra`, `ms-agent-framework-dotnet`,
`ms-agent-framework-python`, `pydantic-ai`, `agent-spec`. *(The repo's
`oxfmt` pre-commit hook also collapsed some multiline `<CopilotKit …>`
JSX in these files — standard auto-format on touched files; the only
semantic change is the suppression.)*
3. `7d60e49de` — parity manifest path-escaping fix (see below).

## The manifest bug (commit 3)

While syncing I found the `langgraph-js` and `strands-python`
`packageJsonOverrides` double-escaped the Windows `.bat` fallback,
producing `scripts\\run-agent.bat` (two backslashes) instead of
`scripts\run-agent.bat`:

- `langgraph-js/package.json` had already been synced with the broken
value.
- `strands-python/package.json` was still correct — and `parity:sync`
would have **corrupted** it on the next run (which is what surfaced
this).

Fixed the three overrides and re-ran `parity:sync`, which corrects
`langgraph-js/package.json` and leaves `strands-python`'s correct value
intact.

## Test plan

- [x] `pnpm parity:verify` → 0 errors
- [x] lefthook pre-commit green on all 3 commits (lint + `packages/**`
tests + commitlint)
- [x] All 14 templates confirmed to have body-level
`suppressHydrationWarning`
- [ ] Reviewer with Grammarly installed: run/`init` a template and
confirm no hydration error on first load
2026-06-18 20:02:31 -07:00
Ben Taylor 14dda3d6f9 fix: ignore CopilotKit local state in starters (#5565)
## Summary
- add .copilotkit to newly scaffolded integration .gitignore files
- ensure extracted standalone starters also include .copilotkit in
.gitignore
- add regression coverage for scaffolded and extracted starter outputs

## Tests
- pnpm nx run @copilotkit/showcase-scripts:test --skip-nx-cache --
__tests__/extract-starter.test.ts __tests__/create-integration.test.ts
- pnpm exec oxfmt --check showcase/scripts/extract-starter.ts
showcase/scripts/create-integration/index.ts
showcase/scripts/__tests__/create-integration.test.ts
showcase/scripts/__tests__/extract-starter.test.ts
2026-06-18 21:57:21 -05:00
Jerel Velarde 37466ecff5 docs(cookbook): inline memory-ownership diagram as data-URI (drops broken CDN image dependency) 2026-06-18 18:52:11 -07:00
Maximiliano Korp 7d60e49de0 fix(examples): correct double-escaped Windows agent path in parity overrides
The langgraph-js and strands-python packageJsonOverrides in
_parity/manifest.json double-escaped the Windows .bat fallback, so the
synced value became `scripts\\run-agent.bat` (two backslashes) instead of
the intended `scripts\run-agent.bat`. langgraph-js's package.json had
already been synced with the broken value; strands-python's was still
correct (and parity:sync would have corrupted it on the next run).

Fix the three overrides and re-run parity:sync, which corrects
langgraph-js/package.json and leaves strands-python's correct value intact.
2026-06-18 17:16:01 -07:00
Maximiliano Korp 9f9c415d98 fix(examples): suppress browser-extension hydration warning on <body> (non-parity templates)
Extend the same `<body suppressHydrationWarning>` fix to the integration
templates that are not tracked by examples/integrations/_parity/manifest.json,
so they don't surface a Grammarly-style hydration mismatch on first load:
adk, agno, crewai-crews, crewai-flows, llamaindex, mastra,
ms-agent-framework-dotnet, ms-agent-framework-python, pydantic-ai, agent-spec.

agent-spec already had suppressHydrationWarning on <html>; the Grammarly
attributes land on <body>, so it needs the body-level relaxation too (the
<html> one is one level up and does not cover <body>'s attributes).
2026-06-18 17:12:28 -07:00
Jerel Velarde 1df235d93d Merge branch 'main' into cookbook/oracle-agent-spec-memory 2026-06-19 08:00:07 +08:00
Jordan Ritter 18b83a7b46 fix(generative-ui-playground): valid model id + serverExternalPackages (#5567)
## Summary

Two focused, pre-existing fixes in the `generative-ui-playground`
example. These were surfaced as out-of-subject bucket-(d) findings
during the `@copilotkitnext` → `/v2` migration CR (#5562) and split out
into this follow-up.

### 1. Invalid model id in the opengenui route
`src/app/api/copilotkit-opengenui/[[...slug]]/route.ts:16` set `const
MODEL = "openai/gpt-5.2"` — a nonexistent model id, so every chat turn
errored. Changed to `"openai/gpt-4o"`, the verified-real id used by the
sibling `showcase/shell/src/app/api/copilotkit/[[...slug]]/route.ts`.

### 2. Missing `serverExternalPackages` in next.config.ts
`next.config.ts` lacked `serverExternalPackages`, but the example's API
routes import `@copilotkit/runtime/v2` (a server-only package). Added
`serverExternalPackages: ["@copilotkit/runtime"]` (base package name
covers the `/v2` subpath), mirroring `showcase/shell/next.config.ts`.

## Red → Green evidence

**Model id**
- RED: `route.ts:16` was `const MODEL = "openai/gpt-5.2";`; sibling
`showcase/shell` route uses `model: "openai/gpt-4o"`.
- GREEN: `route.ts:16` is now `const MODEL = "openai/gpt-4o";`.

**serverExternalPackages**
- RED: `grep -n serverExternalPackages next.config.ts` -> no match (exit
1).
- GREEN: `grep -n serverExternalPackages next.config.ts` -> `9:
serverExternalPackages: ["@copilotkit/runtime"],`.

## Build outcome

`next build` is **blocked by SEPARATE pre-existing module-resolution
failures unrelated to these fixes** and NOT addressed here:
- `copilotkit` and `copilotkit-a2ui` routes import
`createCopilotEndpoint` from the bare v1 `@copilotkit/runtime`, which
does not export it.
- The `copilotkit-opengenui` route (and its client-component chain)
imports from `@copilotkitnext/runtime`, which is not a declared
dependency of this package and fails with `Module not found: Can't
resolve '@copilotkitnext/runtime'`.

Because the build fails at module resolution for these pre-existing
imports before compiling the changed lines, a clean end-to-end build
cannot be obtained. Both edits are statically correct: the model id
matches the verified-real sibling, and `serverExternalPackages` mirrors
the working `showcase/shell` config. Fixing the pre-existing
`createCopilotEndpoint` / `@copilotkitnext/runtime` import errors is
explicitly out of scope for this follow-up.
2026-06-18 16:52:46 -07:00
Jordan Ritter 9aac779c51 fix(generative-ui-playground): use valid model id and externalize @copilotkit/runtime
The opengenui route used the nonexistent model id "openai/gpt-5.2", causing
every chat turn to error. Switch to "openai/gpt-4o", the verified-real id used
by the sibling showcase/shell copilotkit route.

The example's API routes import @copilotkit/runtime/v2 (a server-only package),
but next.config.ts lacked serverExternalPackages, so Next.js attempted to bundle
it. Add serverExternalPackages: ["@copilotkit/runtime"] (base package name covers
the /v2 subpath), mirroring showcase/shell/next.config.ts.
2026-06-18 16:48:32 -07:00
Jordan Ritter a8f14d8822 chore: migrate @copilotkitnext usages to @copilotkit/*/v2 (#5562)
## Summary
Migrates all `@copilotkitnext/*` usages onto the v2 entrypoints of the
existing `@copilotkit/*` packages and removes the `@copilotkitnext`
dependency surface from `showcase/shell` and the
`generative-ui-playground` example.

- `@copilotkitnext/react` → `@copilotkit/react-core/v2`
- `@copilotkitnext/agent` & `@copilotkitnext/runtime` →
`@copilotkit/runtime/v2`
- `globals.css` styles import → `@copilotkit/react-core/v2/styles.css`
- `showcase/shell` deps `@copilotkit/{react-core,runtime}` pinned
`latest` → `^1.60.2` (lockfile regenerated → coherent 1.61.0 set)
- dropped `@copilotkitnext/runtime` from `serverExternalPackages`

Result: zero `@copilotkitnext` references in touched source; `next
build` of `showcase/shell` passes (27/27 routes), all `/v2` imports +
styles resolve.

## CR
Reviewed via 7-agent cr-loop, 3 rounds to convergence + Procedure 3
bucket-(c) promotion audit (PROMOTE_TO_A: 0). The R1 mandatory fix was a
missed `.css` migration target (globals.css); the dep-pin hardening
fixed a stale-prerelease lockfile mismatch.

## Follow-up (separate PR)
Pre-existing, out-of-subject issues in the generative-ui-playground
example (tracked separately): invalid model id `openai/gpt-5.2`, and its
own missing `serverExternalPackages`.
2026-06-18 16:47:41 -07:00
Maximiliano Korp b1fa482a77 fix(examples): suppress browser-extension hydration warning on <body>
Browser extensions such as Grammarly inject attributes onto <body>
(data-gr-ext-installed, data-new-gr-c-s-check-loaded) before React
hydrates, which surfaces as a hydration mismatch error on first load of
the generated Next.js app.

Add suppressHydrationWarning to <body> in the langgraph-python north-star
and propagate to the parity instances (langgraph-js, langgraph-fastapi,
strands-python) via parity:sync. This only relaxes the check for <body>'s
own attributes (one level deep); everything rendered inside <body> is
still fully hydration-checked, and <body>'s className is static so none of
our own markup is masked.
2026-06-18 16:43:25 -07:00
Mike Ryan 94bad73e52 fix: sync plugin metadata before release PR creation (#5561)
## Summary
- run the plugin metadata sync after release prep updates package
versions
- ensure release PR creation commits include aligned plugin metadata

## Root cause
The release PR action commits generated version bumps, which triggers
the pre-commit plugin sync check. The workflow updated package versions
before committing but did not update plugin metadata first.

## Validation
- bash scripts/release/verify-release-scope-dropdowns.sh
- pre-commit hook

Note: actionlint was not installed locally.
2026-06-18 16:43:25 -07:00
Mike Ryan 1527cfce7e fix: mark CopilotKit starter state as a directory 2026-06-18 16:42:57 -07:00
Mike Ryan 4c8e121207 fix: ignore CopilotKit local state in starters 2026-06-18 16:42:57 -07:00
Jordan Ritter fc2f6263f9 fix: pin showcase/shell @copilotkit deps to ^1.60.2 for a coherent reproducible v2 set 2026-06-18 16:38:17 -07:00
Jordan Ritter 0f0b763d58 fix: migrate globals.css styles import to @copilotkit/react-core/v2 (missed in @copilotkitnext sweep) 2026-06-18 16:38:05 -07:00
Jordan Ritter 1398fe225c chore: migrate @copilotkitnext usages to @copilotkit/*/v2 entrypoints 2026-06-18 16:37:58 -07:00
Jordan Ritter 72b8b9730e fix(showcase): harden promote P2 race check + refresh ivar-lint allowlist
CR-round hardening that builds on the bug #1/#2 fixes: the P2 in-flight race
guard now reads the running digest from meta.imageDigest (the dead guard
never REFUSEd before) and is skipped on the --digest override path. Refresh
the snapshot ivar-lint allowlist line numbers after the surrounding CR line
drift.
2026-06-18 16:20:50 -07:00
Jordan Ritter 6865c3d1b8 fix(showcase): activate prod pin via serviceInstanceDeployV2 + verify running==pinned
Bug #2: promote used serviceInstanceRedeploy, which replays the EXISTING
deployment and never pulls the newly-pinned digest, so prod could keep
serving stale. Switch to serviceInstanceDeployV2 to spawn a NEW deployment
that pulls the pinned digest, then verify_serving_digest! fail-loud asserts
the new deployment reaches SUCCESS and its meta.imageDigest == the pinned
digest. Update the promote mock-GraphQL fixtures across the spec suite to
return serviceInstanceDeployV2 + meta.imageDigest accordingly.
2026-06-18 16:20:43 -07:00
Jordan Ritter 9708f7ed45 fix(showcase): pin prod to staging's running digest + loud staging-drift warning
Bug #1: resolved_prod_image re-resolved :latest at promote time, so prod
could be pinned to a digest different from what staging is actually serving.
Now resolve via staging_running_digest (latestDeployment meta.imageDigest)
and REFUSE when unavailable. Add detect_staging_drift +
emit_staging_drift_warnings to surface (non-fatally) when :latest has moved
past staging's running digest; aggregate markers across the fleet in
promote-fleet.sh (printf join) and plumb the drift_line through
showcase_promote.yml (both Slack payloads + fallback log + GITHUB_OUTPUT
single-line guard). Skip drift detection on the --digest override path.
2026-06-18 16:20:34 -07:00
Austin Merrick 08a22f1124 docs: add @copilotkit/vue reference documentation (#5526)
Adds a **Vue** section to the reference docs at `/reference/vue`,
alongside the existing React, React Native, and Core references. Until
now there was no Vue reference, so users and agents had no way to
discover the API.

It mirrors the React v2 reference but documents the real
`@copilotkit/vue/v2` API, with Vue idioms throughout (composables return
refs, slots instead of render props, kebab-case props, Vue SFC
examples).

### What's included
- The Vue index page (install, styling, provider setup)
- 14 composables (useAgent, useFrontendTool, useHumanInTheLoop,
useThreads, and the rest)
- 9 components (CopilotKitProvider, CopilotChat, CopilotPopup,
CopilotSidebar, and the chat sub-components)
- Vue registered in the SDK picker and the reference landing page

### Screenshots

Landing page (SDK picker set to Vue, full sidebar):

![Vue reference
landing](https://raw.githubusercontent.com/CopilotKit/CopilotKit/vue-reference-pr-assets/pr-assets/vue-reference/vue-reference-landing.png)

A composable page (useAgent):

![useAgent
reference](https://raw.githubusercontent.com/CopilotKit/CopilotKit/vue-reference-pr-assets/pr-assets/vue-reference/vue-reference-useagent.png)

A component page (CopilotKitProvider):

![CopilotKitProvider
reference](https://raw.githubusercontent.com/CopilotKit/CopilotKit/vue-reference-pr-assets/pr-assets/vue-reference/vue-reference-provider.png)

### How it was verified
- All 24 pages render (HTTP 200) on the local docs server
- Content shows up in `llms.txt` and `llms-full.txt`
- Each page was written from the Vue source, not copied from React, and
spot-checked for accuracy

Guide content and new demos are out of scope.
2026-06-18 16:16:21 -07:00
Austin Merrick 5d035afaea fix(shell-docs): align callout accent colors to brand (#5559)
## What

Docs `<Callout>` accents (the icon + left bar) were rendering in
fumadocs' generic blue/amber/green instead of the CopilotKit palette.
Remap them to brand tokens:

- **info** → brand accent (purple)
- **warning** → the docs `--warning` orange
- **success** → brand mint (new `--success` token)
- **error** → unchanged (already `--destructive`)

Theme-aware across light and dark.

## Before / After

|  | Before | After |
|---|:---:|:---:|
| **Light** | ![before
light](https://raw.githubusercontent.com/CopilotKit/CopilotKit/callout-brand-screenshots/pr-assets/callout-brand/before-light.png)
| ![after
light](https://raw.githubusercontent.com/CopilotKit/CopilotKit/callout-brand-screenshots/pr-assets/callout-brand/after-light.png)
|
| **Dark** | ![before
dark](https://raw.githubusercontent.com/CopilotKit/CopilotKit/callout-brand-screenshots/pr-assets/callout-brand/before-dark.png)
| ![after
dark](https://raw.githubusercontent.com/CopilotKit/CopilotKit/callout-brand-screenshots/pr-assets/callout-brand/after-dark.png)
|

## Note

These must be plain `:root` custom properties, not `@theme` tokens:
Tailwind v4 tree-shakes theme variables that no utility class
references, and the Callout reads `--color-fd-info|warning|success` only
through inline `var()`.
2026-06-18 16:16:15 -07:00
Mike Ryan ab47e6b132 fix(examples): update threads license command (#5564)
## Summary
- Update locked Threads drawer copy in integration examples to use `npx
copilotkit@latest license`
- Keep the command consistent across the example variants that render
the licensed feature panel

## Validation
- Pre-commit hooks ran lint/check package hooks successfully
- Verified integration examples no longer render the stale `copilotkit
license` command
2026-06-18 16:11:41 -07:00