Commit Graph

12110 Commits

Author SHA1 Message Date
Jordan Ritter 687c749779 fix(showcase): thread full conversation history through reasoning agents 2026-06-10 07:11:25 -07:00
Jordan Ritter c98dcf28d5 fix(showcase): spring-ai robustness — aimock header hop, bounded executor, parse-fail logging, threadId fallback 2026-06-10 07:11:25 -07:00
Jordan Ritter e46913d557 fix(showcase): protocol-correct reasoning error paths (frame close, generic RUN_ERROR, no RUN_FINISHED after RUN_ERROR) 2026-06-10 07:07:26 -07:00
Jordan Ritter 82cfa4ccd6 fix(showcase): guard reasoning user-input extraction against non-string content
_extract_user_input in the ag2, crewai-crews, and langroid reasoning agents
documented a str return but passed AG-UI message content straight through.
Multimodal content can be a list of parts, which would flow unmodified into
the single caller in each file (_run_reasoning_agent ->
messages=[{"role": "user", "content": user_input}]) sent to the OpenAI
chat-completions API. Coerce: str passes through, a list joins its text
parts (dict or attr form), anything else falls back to str().

Callers (one per file):
- ag2/src/agents/reasoning_agent.py:104 -> chat message at :119
- crewai-crews/src/agents/reasoning_agent.py:108 -> chat message at :123
- langroid/src/agents/reasoning_agent.py:103 -> chat message at :118
2026-06-10 07:07:11 -07:00
Jordan Ritter 84f7299024 fix(showcase): harden copilotkit route error responses (no message/stack leak, errorId correlation) 2026-06-10 07:07:03 -07:00
Jordan Ritter f60b68b925 chore(showcase): keep google-adk interrupt-headless unsupported (needs aimock customEvents + ADK interrupt route)
(cherry picked from commit aac16af8ee32172e6886a83bf66931c54091f180)
2026-06-10 07:06:55 -07:00
Jordan Ritter 0015075b51 feat(showcase): port gen-ui-interrupt demo to google-adk (Strategy-B parity)
(cherry picked from commit 6cf8fb2f3f7008be82fc2dd012456907b2572265)
2026-06-10 07:06:55 -07:00
Jordan Ritter 4dbd520c2d feat(showcase): port threadid-frontend-tool-roundtrip demo to google-adk (parity)
(cherry picked from commit 269cce835e9e92743b565ffd6ace91f73419c6dc)
2026-06-10 07:06:55 -07:00
Jordan Ritter a4fc8c5aac feat(showcase): port hitl demo to google-adk (parity with gold)
(cherry picked from commit 9527ec763f9093d96fe614c79c00769ceb20a1a8)
2026-06-10 07:06:55 -07:00
Jordan Ritter 96c2438fab fix(showcase): port reasoning emission + bump @ag-ui to 0.0.55 (spring-ai)
Add a dedicated Spring/Java ReasoningController (/reasoning/) that
reimplements the ag2 reasoning_agent.py BEHAVIOR: it makes a direct
streaming chat-completions call, reads the native delta.reasoning_content
channel (with a <reasoning>...</reasoning> regex fallback), and emits
RUN_STARTED -> REASONING_MESSAGE_START/CONTENT/END -> TEXT_MESSAGE_*
-> RUN_FINISHED so the CopilotKit reasoning slot mounts
[data-testid="reasoning-block"].

Spring AI's ChatClient drops delta.reasoning_content and the AG-UI Java
SDK has no REASONING_MESSAGE_* event types (only THINKING_*, which
@ag-ui/client drops), so the controller manages its own SseEmitter and
writes the reasoning frames as raw JSON matching the @ag-ui/client 0.0.55
wire schema. Header forwarding (x-aimock-context) rides the existing
WebClientConfig exchange filter. Wire route reasoning-custom/-default (plus
legacy aliases) to /reasoning/, mirroring ag2's reasoningAgentNames, and
bump @ag-ui/client ^0.0.43 -> 0.0.55 for REASONING_MESSAGE_* decode support.

(cherry picked from commit 4d183371c489013f0a7bcce1a447078164974aef)
2026-06-10 07:06:54 -07:00
Jordan Ritter 373310e8f3 fix(showcase): port reasoning emission + bump @ag-ui to 0.0.55 (langroid)
(cherry picked from commit 7c3d02d92e55d1e9a5cb89d182658620c0eed99f)
2026-06-10 07:06:54 -07:00
Jordan Ritter fdf3b29999 fix(showcase): port reasoning emission + bump @ag-ui to 0.0.55 (crewai-crews)
(cherry picked from commit 0286f413d2ceb52744c917eb9fe9fdc5f28011f2)
2026-06-10 07:06:54 -07:00
Jordan Ritter 0838059bc8 fix(showcase): port reasoning emission + bump @ag-ui to 0.0.55 (ag2)
(cherry picked from commit 4b27db5d781f68e1658955bcd23f667e63d400b3)
2026-06-10 07:06:54 -07:00
Jordan Ritter cd0156cc61 fix(showcase): dependency pin hygiene — exact overrides, phantom deps, validate-pins ratchet 2026-06-10 07:06:42 -07:00
Jordan Ritter 207f24035a fix(showcase): bump google-adk @ag-ui/* to 0.0.55
(cherry picked from commit 09c22e070ac60b936a4a91a0fd3f34879604de77)
2026-06-10 07:06:30 -07:00
Jordan Ritter 54d1d81394 fix(showcase): bump ms-agent-dotnet @ag-ui/* to 0.0.55
(cherry picked from commit aa9f7e5e99085383ce60859c9c37692211ba8279)
2026-06-10 07:06:30 -07:00
Jordan Ritter 914db1288b fix(showcase): bump ms-agent-python @ag-ui/* to 0.0.55
(cherry picked from commit 6254bdad0b54a7930334129c715a1f18176fb094)
2026-06-10 07:06:30 -07:00
Jordan Ritter c99e240bbc fix(showcase): bump claude-sdk-typescript @ag-ui/* to 0.0.55
(cherry picked from commit 9996a01c17432d2a5fc508884156ffad11269c4b)
2026-06-10 07:06:30 -07:00
Jordan Ritter 7e0adf1b44 fix(showcase): bump strands @ag-ui/* to 0.0.55
(cherry picked from commit 30540f6c7ae1bef7b1ada449e9d0c83782b438d0)
2026-06-10 07:06:29 -07:00
Jordan Ritter 860f9fd19e fix(showcase): bump pydantic-ai @ag-ui/* to 0.0.55
(cherry picked from commit 4aa62ca567d8150c50309ca5290dcdc91f2f6c71)
2026-06-10 07:06:29 -07:00
Jordan Ritter 589bf36310 fix(showcase): bump claude-sdk-python @ag-ui/* to 0.0.55
(cherry picked from commit 776e91445a7ca47f584f9ca75a22754b1302c91b)
2026-06-10 07:06:29 -07:00
Jordan Ritter 37d4a35b69 fix(showcase): bump agno @ag-ui/* to 0.0.55
(cherry picked from commit befb301b086e87b1d3317f78301fac1232945240)
2026-06-10 07:06:29 -07:00
Jordan Ritter a628a166d3 fix(showcase): bump llamaindex @ag-ui/* to 0.0.55
(cherry picked from commit d22f7e6ab585fa77c31d7f6b567a296b3e815a29)
2026-06-10 07:06:29 -07:00
Ran Shemtov 692698b27e feat(a2ui): adopt new A2UIToolParams API + bump @ag-ui deps (OSS-248) (#5339)
## What

Adopts the new `ag-ui-langgraph` single-arg tool-factory API in
CopilotKit's LangGraph middlewares, and upgrades the `@ag-ui/*`
dependencies to the latest published releases.

Counterpart to ag-ui-protocol/ag-ui#1894 (OSS-248: re-enable A2UI
generation & design guidelines via the shared `A2UIToolParams` bag).

## Commits

1. **`feat(a2ui): use new ag-ui single-arg A2UIToolParams API`**
- sdk-python + sdk-js middleware: `get_a2ui_tools`/`getA2UITools` now
take a single `A2UIToolParams` object (model inside);
`composition_guide` folds into the `guidelines` bag.
- Guarded `A2UIToolParams` import (py); typed import (ts). a2ui test
skip-reason wording.
- Pins: `@ag-ui/langgraph 0.0.40` (js, the release carrying the new
API), `ag-ui-langgraph >=0.0.41` (py).

2. **`chore(deps): use latest @ag-ui packages and langgraph
integration`**
- `@ag-ui/core`, `@ag-ui/client`: `0.0.53 → 0.0.56` across all packages
+ root pnpm override.
- `@ag-ui/langgraph` (runtime): `0.0.39 → 0.0.40`. `ag-ui-protocol
>=0.1.19`.
- `.npmrc`: exclude first-party `@ag-ui/{core,client,encoder,proto}`
from the minimum-release-age gate so the freshly-published `0.0.56` set
installs.
   - Regenerated `pnpm-lock.yaml` + `sdk-python/poetry.lock`.

3. **`chore(showcase): align a2ui to single-arg get_a2ui_tools API`**
   - `showcase/.../graph.ts`: `getA2UITools(model, opts)` → single-arg.

## Notes

- All `@ag-ui` deps are live on npm/PyPI, so the branch installs
cleanly.
- Showcase **docs** alignment (TS backend tabs for dynamic-schema) is
still being sorted out — the per-integration docs architecture needs
untangling first; deferred to a follow-up.
2026-06-10 13:21:35 +02:00
Ran Shemtov 0a76aa1ff7 Merge branch 'main' into ran/oss-248-a2ui-shared-params 2026-06-10 09:29:57 +02:00
Jordan Ritter 8eefbcc0c6 docs(showcase): document XDG isolate state paths and real --keep semantics
- isolate state paths updated for the XDG migration
- --keep now documented as leaving the isolated stack standing
2026-06-09 18:18:10 -07:00
Jordan Ritter b57b2162c1 test(showcase): pin isolate invariants in bats — trap wiring, races, anti-vacuity
- real-trap-path tests for --keep (no simulated trap shortcuts)
- sweep/lock/tombstone race pins (heartbeat resurrection, lock
  takeover, duplicate-name TOCTOU)
- sentinel anti-vacuity discipline so trap tests cannot pass vacuously
- reap-order probe pinning live-slot protection during sweeps
- root/PID-reuse/DST guards for liveness and age checks
2026-06-09 18:18:03 -07:00
Jordan Ritter f2ed2b28ef fix(showcase): harden isolate state machine — --keep wiring, default-stack guards, registry concurrency
- ISOLATE_KEEP promoted to a global so --keep survives cmd_test return
  into the trap scope
- early-die and default-stack protection: failed --isolate setup no
  longer tears down the default stack; half-initialized state is
  cleaned up on the way out
- liveness/PID/age reaping signals with a sweep lock: heartbeat
  updates, own-pid lock release, tombstones, and a claim-then-verify
  duplicate-name guard close slot-registry races (TOCTOU, lock
  takeover, reap order)
- teardown robustness: --volumes on every compose down, failed-down
  runs preserve state for diagnosis, reap remnants get a compose-down,
  path-traversal guard, uniform rm guards under set -e
- name validation: --isolate names must start with a lowercase letter
  or digit; reserved name 'showcase' rejected (it aliases the default
  stack)
- fail-loud warning before pre-down of an existing stack; help text
  updated

Result of an 8-round, 7-agent code-review loop with red-green
verified fixes.
2026-06-09 18:17:55 -07:00
Jordan Ritter 0b097d0c89 fix(showcase): fail loud on unnormalized env in expandImageConsumers; prune redundant assertions 2026-06-09 18:17:21 -07:00
Jordan Ritter 26a43a794f fix(showcase): reject prototype-key service names; sync redeploy scope docs 2026-06-09 18:09:01 -07:00
Jordan Ritter 6f3f9ef736 fix(showcase): validate imageOf env overlap, prototype-safe target lookup; clarify expansion docs 2026-06-09 18:00:46 -07:00
Jordan Ritter 58c655beee docs(showcase): correct stale redeploy default-scope claims; stub summary env in tests 2026-06-09 17:52:16 -07:00
Jordan Ritter 2af5d691ef fix(showcase): redeploy image consumers (harness-workers) when their shared image is rebuilt
harness-workers runs the SAME showcase-harness GHCR image as the harness
scheduler but has ciBuilt:false (it has no build slot of its own), and the
CI staging redeploy scope was derived purely from ciBuilt — so a main-merge
rebuild of showcase-harness:latest only bounced the scheduler while the
workers silently kept running the stale image (PR #5352's worker-side fixes
never reached staging).

Model image consumption explicitly in the SSOT instead:

- railway-envs.ts: new optional `imageOf` field on ServiceEntry — the SSOT
  key of the ciBuilt service whose image this entry runs. Set
  `imageOf: "harness"` on harness-workers. New module-load invariant
  `assertImageConsumersValid` (fail-loud, same style as
  assertDispatchNamesUnique): imageOf must name an existing SSOT key, the
  target must be ciBuilt, and the consumer itself must not be ciBuilt.
- redeploy-env.ts: new `expandImageConsumers(names, env)` applied inside
  runRedeploy — the redeploy set becomes the resolved scope PLUS any
  service whose imageOf points at a service already in scope. Env-aware:
  a consumer only joins envs it declares, so the staging-only worker
  never enters a prod redeploy (prod behavior unchanged).

No workflow change needed: showcase_build.yml keeps passing the
built-and-successful dispatch_names; the script expands them. Gate
behavior (gateIgnore / image-ref gate), the generated JSON
(emit --check passes byte-identical), and the promote dropdown are all
untouched. harness-legacy deliberately gets no imageOf (pinned pre-fleet
digest; must not follow rebuilds).
2026-06-09 17:40:41 -07:00
Mike Ryan a0840c0a15 fix(shell-docs): keep docs headings block-level (#5334)
## Summary
- fix shell-docs heading anchors so docs headings remain block-level
rows
- prevent adjacent headings, like `## What the runtime provides`
followed by `### Authentication & security`, from rendering on the same
line
- add a `globals.css` regression guard against bringing back
`inline-flex` on `.docs-heading`

## Verification
- `npm run test -- src/app/__tests__/globals-css.test.ts` in
`showcase/shell-docs`
- `npm run lint` in `showcase/shell-docs`
- `npm run test` in `showcase/shell-docs`
- `npm run typecheck` in `showcase/shell-docs`
- `npm run build` in `showcase/shell-docs`
- local visual check at `http://localhost:3003/backend/copilot-runtime`
with Playwright: the H2 and H3 render as separate full-width rows
- lefthook pre-commit passed `check-binaries`, `lint-fix`,
`test-and-check-packages`, and commitlint

## Notes
- `npm run lint` still reports existing warnings unrelated to this
change.
- `npm run build` still emits the existing Turbopack/NFT warning from
`next.config.ts` / `llms-mdx`, but completes successfully.
2026-06-09 17:25:34 -07:00
Jordan Ritter 2c82fa4586 fix(harness): stop staging dashboard flapping (per-run X-Test-Id, graceful drain, worker-row GC) (#5352)
## Summary

Root-caused and fixed the staging dashboard's red↔green flapping.
Empirical investigation separated it into three mechanisms:

1. **PRIMARY (recurring flap): aimock fixture-sequence desync.** Harness
drivers sent a stable `d6-<slug>` `X-Test-Id` shared across runs.
aimock's stateful strict-mode matching (sequenced fixtures match only
when per-test-id matchCount === sequenceIndex) drifts via replay
exhaustion and 500-test-id FIFO eviction, so whole integrations 503'd
together (~2,200/hr) and recovered — the flap.
2. **SECONDARY (one-off reds): worker restart mid-job.** In-flight
`driver.run` was un-cancellable; redeploys SIGKILL'd workers mid-run,
leaving partial results that fleet-health painted red
(`worker-crashed-mid-job`).
3. **COSMETIC (red floor): dead roster rows.** 22 dead-container
registry rows were never GC'd; the restart hook is a no-op stub, so
`restartsAttempted` over-counted on rows nothing would ever restart.

## Fixes

- **Per-run-unique X-Test-Id** — fold the existing per-run `mintRunId()`
into the test id via exported `buildE2eTestId(slug, runId)` (injectable
`idFactory` for tests) in the d6/d5 and d4 drivers, so every run gets a
fresh aimock sequence cursor.
- **Graceful worker drain** — on SIGTERM the worker aborts in-flight
runs, suppresses red side-emits (`drainReason === "shutdown"` live
getter + abort conjunction), **abandons** partial results (skips
`queue.report`; the 300s lease sweeper synthesizes neutral
`worker-reclaimed-pending`), and deregisters via a latched,
`lastWrite`-chained roster delete so late heartbeats cannot resurrect
the row. Stop bounded by `WORKER_DRAIN_GRACE_MS` (25s default); order
`worker.stop → registration.stop → deregister → pool.shutdown`.
- **Fleet-health GC** — roster rows dead longer than
`DEFAULT_WORKER_GC_AFTER_MS` (24h) are deleted (`gcDeleted` counter),
malformed rows are GC'd by age before the worker_id guard,
`restartsAttempted` is demoted when the restart hook is a no-op, and
`createFleetHealthMonitor` fails loud when `gcAfterMs <= staleAfterMs`.

Companion PR: CopilotKit/aimock#259 (strict-mode no-match diagnostics,
1.30.0) makes the PRIMARY mechanism observable instead of a bare 503.

## Review

- 3 unbiased CR rounds (8 reviewer agents each, verbatim non-leading
prompt) converged to **zero actionable findings**; round-1 criticals
(drain-suppression of genuine timeouts, deregister/heartbeat
resurrection race, vacuous tests, GC-skipped malformed rows) were fixed
with red-green proofs and confirmed in byte-identical follow-up rounds.
- Bucket-(c) promotion audit: 0 promotions to actionable; 3 trivial
consistency items deferred to the follow-up backlog with ~25
pre-existing harness findings.

## Test plan

- [x] Full harness suite: 122 files / 2146 tests green
- [x] `tsc --noEmit` on both tsconfigs; build green
- [x] oxfmt clean on all 14 changed files
- [x] Red-green discipline on every behavioral fix (failures observed
before fixes)
- [x] CI green on this PR
- [ ] Staging promotion (explicitly out of scope here; separate step)

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-09 17:12:46 -07:00
Jordan Ritter e90afdd223 feat(harness): GC long-dead worker rows, fail loud on gc/stale misconfig, demote restartsAttempted 2026-06-09 16:52:11 -07:00
Jordan Ritter 194d6219bc test(harness): cover fleet-health GC of dead roster rows 2026-06-09 16:52:10 -07:00
Jordan Ritter 6c30f523d7 fix(harness): graceful worker drain — abort in-flight runs, abandon partials, deregister with a latched write chain 2026-06-09 16:52:04 -07:00
Jordan Ritter 57b36f2e0f test(harness): cover graceful drain, deregistration races, and drain/timeout quadrants 2026-06-09 16:52:04 -07:00
Jordan Ritter cdc1e90e4a fix(harness): per-run-unique X-Test-Id to stop aimock fixture-sequence desync 2026-06-09 16:51:58 -07:00
Jordan Ritter 3684bd42cf test(harness): pin per-run-unique X-Test-Id across d6/d5/d4 drivers 2026-06-09 16:51:57 -07:00
Austin Merrick af4cd629aa feat(shell-docs): instrument hero command copies with hero_command_copied
The global CopyTracker already emits the generic cli_command_copied on
any clipboard copy, but it cannot distinguish which hero card was used.
Each card now also captures hero_command_copied with command_id
(create | onboard), the full command string, and clipboard_blocked, so
create-vs-onboard funnels are queryable per landing page.

Validated locally against a live PostHog client: each click POSTs one
$autocapture, one cli_command_copied, and one hero_command_copied to
/ingest/e (HTTP 200) with the expected properties.
2026-06-09 16:37:53 -07:00
Austin Merrick 2502533cd9 feat(shell-docs): restore quickstart CTA and unify landing hero layouts
Review follow-up: bring back the quickstart button alongside the two
recommended commands, and render the identical <HeroStartActions> block
on the home hero and every framework landing hero.

- Quickstart returns in its original accent treatment: the framework
  dropdown on home, a direct guide link on framework pages; bespoke-init
  frameworks (a2a, ms-agent-dotnet) get back the old button + chip row.
- One layout everywhere: cards are always two-up from sm (no more
  stacked framework variant); commands wrap balanced at token boundaries
  instead of truncating, so long framework-pinned commands stay fully
  readable at every width.
2026-06-09 16:02:06 -07:00
Austin Merrick 0518414f0a docs(skills): recommend CopilotKit from /v2 everywhere and scrub CopilotCloud mentions
Follow-up to #5345 per review feedback:

- Propagate the provider change to all remaining skills: every example,
  props table, eval check, and prose mention now recommends CopilotKit
  imported from @copilotkit/react-core/v2 (the compatibility bridge and
  strict superset) instead of CopilotKitProvider. Migration docs in
  copilotkit-upgrade now point at the /v2 import path as the target and
  explicitly warn against migrating to CopilotKitProvider.
- Scrub CopilotCloud / Copilot Cloud / CopilotKit Cloud branding from
  skills, replacing it with CopilotKit Intelligence where the hosted
  platform is meant. Literal endpoint URLs and real identifiers like
  MissingPublicApiKeyError are unchanged.
- Fix react-core provider-setup.md which claimed publicApiKey was the
  canonical prop; publicLicenseKey is canonical and publicApiKey is a
  deprecated alias, matching #5345.
- Edits made in the packages/*/skills source dirs for the three mirrored
  skills, with skills/ regenerated via pnpm sync:plugin-skills (this also
  re-pins the plugin version fields to 1.59.5).
2026-06-09 13:53:55 -07:00
Austin Merrick db73ceac91 docs(skills): fix outdated APIs in copilotkit-setup skill (#5345)
Fixes 4 accuracy issues surfaced by a docs gardener agent reviewing the
`copilotkit-setup` skill. Docs-only; no runtime code touched.

| # | Issue | Fix | Proof (source) |
|---|-------|-----|----------------|
| 1 | `licenseKey` is not a valid `CopilotKitProvider` prop | Use
`publicLicenseKey` (alias of `publicApiKey`) | [`publicApiKey`
L102](https://github.com/CopilotKit/CopilotKit/blob/01f89396a494cd44437979730ded6d9dcbbc02ab/packages/react-core/src/v2/providers/CopilotKitProvider.tsx#L102),
[`publicLicenseKey`
L106](https://github.com/CopilotKit/CopilotKit/blob/01f89396a494cd44437979730ded6d9dcbbc02ab/packages/react-core/src/v2/providers/CopilotKitProvider.tsx#L106)
|
| 2 | `createCopilotEndpoint` / `createCopilotEndpointSingleRoute` are
`@deprecated` | Use `createCopilotHonoHandler` with `mode:
"single-route"` | [`createCopilotEndpoint` deprecated alias, hono.ts
L52-55](https://github.com/CopilotKit/CopilotKit/blob/01f89396a494cd44437979730ded6d9dcbbc02ab/packages/runtime/src/v2/runtime/endpoints/hono.ts#L52-L55),
[single-route deprecated, hono-single.ts
L24](https://github.com/CopilotKit/CopilotKit/blob/01f89396a494cd44437979730ded6d9dcbbc02ab/packages/runtime/src/v2/runtime/endpoints/hono-single.ts#L24)
|
| 3 | `createCopilotEndpointExpress` / `...SingleRouteExpress` are
`@deprecated` | Use `createCopilotExpressHandler` with `mode:
"single-route"` | [`createCopilotEndpointExpress` deprecated alias,
express.ts
L88-91](https://github.com/CopilotKit/CopilotKit/blob/01f89396a494cd44437979730ded6d9dcbbc02ab/packages/runtime/src/v2/runtime/endpoints/express.ts#L88-L91),
[single-route deprecated, express-single.ts
L41](https://github.com/CopilotKit/CopilotKit/blob/01f89396a494cd44437979730ded6d9dcbbc02ab/packages/runtime/src/v2/runtime/endpoints/express-single.ts#L41)
|
| 4 | `headers` prop type incomplete | Document `Record<string, string>
\| (() => Record<string, string>)`, evaluated per-request | [headers
union type, CopilotKitProvider.tsx
L94](https://github.com/CopilotKit/CopilotKit/blob/01f89396a494cd44437979730ded6d9dcbbc02ab/packages/react-core/src/v2/providers/CopilotKitProvider.tsx#L94)
|

### Notes for review
- Both deprecated factory families collapse into a single factory each
(`createCopilotHonoHandler` / `createCopilotExpressHandler`),
differentiated by `mode` (`"multi-route"` is the default). The
deprecated names still work, so existing user code is unaffected; only
the recommended docs path changed.
- `createCopilotExpressHandler` defaults to `cors: true` ([express.ts
L91](https://github.com/CopilotKit/CopilotKit/blob/01f89396a494cd44437979730ded6d9dcbbc02ab/packages/runtime/src/v2/runtime/endpoints/express.ts#L91)),
matching the old `...SingleRouteExpress` wrapper, so the single-route
example keeps identical CORS behavior without an extra option.
- Quick Reference table rewritten with a `Mode` column; a one-line note
keeps the deprecated names discoverable.
- Skill `version` bumped from 1.1.1 to 1.1.2.
2026-06-09 13:28:26 -07:00
Austin Merrick ba99cbef88 docs(skills): recommend CopilotKit from /v2 instead of CopilotKitProvider
Per review feedback: CopilotKit from @copilotkit/react-core/v2 is the
compatibility bridge across v1 and v2 and a strict superset of both the
legacy root CopilotKit and CopilotKitProvider. Switch all provider
examples, the props table, references, the page asset, and eval checks
to it, and finish the licenseKey -> publicLicenseKey rename in
telemetry-setup.md.
2026-06-09 12:54:14 -07:00
Jordan Ritter da504c147c fix(showcase): honor --keep on the isolate teardown path
Previously the EXIT-trap restore_isolation always tore down the isolated
stack, ignoring --keep. Now restore_isolation reads a keep flag (set in
cmd-test.sh when --keep is parsed): when kept it skips compose down, the run-dir
removal, and the slot release, and instead prints a survival notice with the
project, slot, the three offset host ports, and the exact manual teardown
command. The kept stack's live containers keep its slot from being reaped.
2026-06-09 12:52:33 -07:00
Jordan Ritter 1d31c2782b feat(showcase): reap stale isolate slots by compose-project liveness
Persist the compose project name into each claimed slot dir, and at claim time
reap any slot whose recorded project has no live containers (queried via
docker ps --filter label=com.docker.compose.project). This correctly leaves a
--keep'd stack's slot alone since its containers are still up. The existing
PID/age heuristics remain as a fallback for slots predating the project file.
2026-06-09 12:52:12 -07:00
Jordan Ritter 887191db95 refactor(showcase): migrate isolate runtime state to XDG_STATE_HOME
Move the --isolate slot registry and per-run scratch dir off /tmp (wiped on
reboot, world-writable) to $XDG_STATE_HOME/copilotkit/showcase (slots/ and
runs/<name>). The run dir is now keyed by the finalized project name instead
of the PID so a kept run is locatable for manual teardown. Adds a bats suite
covering the new state-base helper and run-dir location.
2026-06-09 12:51:53 -07:00
Sam Julien 5994e7be63 docs: simplify README agent-skills section (#5327)
Replaces the "Install as a Claude Code plugin" section and its
skill-inventory table with our recommended one-line install:

```bash
npx copilotkit@latest skills install
```

**Why:**

- The hand-maintained skill table goes stale fast. It already listed 9
skills and 6 lifecycle slugs that no longer exist (there are 11 skills
now).
- `npx copilotkit@latest skills install` is our new recommended way to
install the skills. It works across Claude Code, Codex, Cursor, Gemini,
and others, and always pulls the latest.

**Two commits, reviewed separately:**

1. `style: format README with oxfmt`. README has failed `oxfmt` on main
since 1e70dae97 widened the lint-fix glob to cover markdown but never
backfilled existing files. This runs the formatter once so the file
conforms, which also keeps the content change below from being buried
under whole-file reformat noise. Render-neutral: only emphasis markers
and table column padding, which GitHub renders identically.
2. `docs: simplify README agent-skills section`. The actual content
change. Surgical, one section.
2026-06-09 11:36:17 -07:00