Commit Graph

12629 Commits

Author SHA1 Message Date
Tyler Slaton 17c36421bb Rename premium docs sections to Enterprise 2026-06-16 17:36:30 -07:00
Nathan 🔶 Tarbert 8d436c1729 docs(shell-docs): use specificTool in opt-out example per review 2026-06-16 19:02:32 -04:00
Nathan 🔶 Tarbert b81734557a docs(shell-docs): restructure tool-render opt-out, least to most specific
- Rename the opt-out section to "Disable default tool rendering" and lead
  with the wildcard (all tools), then a "For specific tools" subsection,
  so it reads least-specific to most-specific.
- Drop the useFrontendTool handler/schema boilerplate from the opt-out
  example; both cases now use a schema-free useRenderTool call.
- Document the new render-only (no-schema) useRenderTool overload on the
  useRenderTool reference page.
2026-06-16 18:48:37 -04:00
Nathan 🔶 Tarbert 811ca13551 feat(react-core): allow render-only useRenderTool without a schema
Make `parameters` optional on the named useRenderTool overload, mirroring
the existing wildcard ("*") path. When no schema is given, the args
schema defaults to z.any() in defineToolCallRenderer.

This makes opting a specific tool out of the default rendering a single,
schema-free call:

  useRenderTool({ name: "myTool", render: () => <></> }, []);

previously only the wildcard overload could omit parameters.
2026-06-16 18:48:31 -04:00
Jordan Ritter 23b9215c8f fix(showcase/harness): inline phrase needle in custom-catchall DOM scan
Root cause (A11 investigation, PR #5495): the probe passed the canonical
phrase into the browser-side `page.evaluate` closure via the second-arg
form (`evaluate((expectedPhrase?: string) => …, phrase)`). Empirically
the arg arrives as `undefined` inside the closure — verified via
in-closure return diagnostics showing `needleLen === 0` while
`bubble.textContent` and `body.textContent` BOTH contained the canonical
phrase at the SAME poll moment. With `needle === """, the
`if (needle)` guard skipped the entire cascade, leaving
`customContentPhrasePresent` false forever and failing every
integration's `tool-rendering-custom-catchall` cell even when the
narration was reaching the DOM correctly (LGP gold).

Fix: inline the canonical phrase as a JS literal inside the closure —
no `page.evaluate(fn, arg)` second-arg dependency. Keep the existing
per-tier scoped cascade and `body.textContent` fallback semantics
unchanged. The shared constant `CUSTOM_CATCHALL_CONTENT_PHRASE` and
the inlined literal MUST stay in lock-step (existing
`exports the testid contract for cross-test reuse` unit test verifies
the constant; manual sync required on edit of the literal).

RED-GREEN proof:
  RED (pre-fix, /tmp/cr/a11-red-lgp.log INNER_EXIT=1):
    LGP `d5-single-pill-e2e:langgraph-python red`
    settled text turn 2 = 'AAPL is trading at $338.37, down 2.96% —
    rendered through the custom wildcard catchall renderer.' (phrase
    IS in bubble.textContent) but
    snap.customContentPhrasePresent: false  ← THE BUG

  GREEN (post-fix, /tmp/cr/a11-final-lgp.log INNER_EXIT=0):
    LGP `d5-single-pill-e2e:langgraph-python green (8.9s) → 1 passed`

BIA remains red (separate fixture-routing concern — BIA's narration is
not reaching the DOM at all per `settled text` = pure tool-card text,
`assistantMsgCount: 2`, no canonical-phrase bubble; outside this
fix's scope per the worktree's modify-harness-only constraint).

(cherry picked from commit a980be48c514a2ab4972395e80e70e5b19247131)
2026-06-16 15:39:39 -07:00
Jordan Ritter 87f350f240 refactor: revert label-coupled vars + rename D2/D3 drivers to dN- pattern (#5506)
## Summary

Two cleanup commits following the just-merged taxonomy PRs
(#5498/#5503/#5505):

1. **Revert label-derived var names back to enum-mirroring** — vars
should mirror the persisted `Status` enum contract, not the display
label that changes.
2. **Rename D2/D3 drivers to follow `dN-` pattern** — `liveness.ts` →
`d2-liveness.ts`, `e2e-readiness.ts` → `d3-readiness.ts`. Consistent
with `d4-chat-roundtrip.ts`, `d5-single-pill.ts`, `d6-all-pills.ts`.

## Commit 1 — `pctBeAgent`/`totalBeAgent` → `pctWired`/`totalWired`

PR #5498 introduced `pctBeAgent`/`totalBeAgent` when the L1 display
label was being renamed `"Wired"` → `"BE (Agent)"`. The label has since
changed again (to `"API (HTTP)"` in #5505), making the var names doubly
stale. The underlying `Status` enum string `"wired"` is a
hard-constraint persisted contract that will never change. Revert vars
to mirror the enum.

**Strategy: vars mirror persisted contracts, labels are the translation
layer.** Future label renames don't ripple into var names.

3 files, 9 occurrences renamed: `cells-view.tsx`, `coverage-bar.tsx`,
`parity-view.tsx`.

## Commit 2 — D2/D3 driver rename to `dN-` pattern

Driver naming was inconsistent: `d4-`/`d5-`/`d6-` prefixed but D2
(`liveness.ts`) and D3 (`e2e-readiness.ts`) weren't. Now consistent.

| Old | New |
|---|---|
| `showcase/harness/src/probes/drivers/liveness.ts` | `d2-liveness.ts` |
| `showcase/harness/src/probes/drivers/liveness.test.ts` |
`d2-liveness.test.ts` |
| `showcase/harness/src/probes/drivers/e2e-readiness.ts` |
`d3-readiness.ts` |
| `showcase/harness/src/probes/drivers/e2e-readiness.test.ts` |
`d3-readiness.test.ts` |

(Drop the redundant "e2e" prefix for D3 — the file's job is "is the demo
frontend ready", which the dimension code `d3-` already conveys.)

16 files touched: 4 file renames via `git mv` (100% / 99% similarity
preserved), plus import + doc updates across
`orchestrator.{ts,test.ts}`, `cli/runner.ts`, `cli/targets.ts`,
`probes/liveness.ts` (helper file, not the driver),
`probes/loader/probe-invoker.ts`,
`probes/discovery/railway-services.ts`,
`probes/drivers/starter-smoke.{ts,test.ts}`, `types/dimensions.test.ts`,
`config/probes/e2e-demos.yml`, `harness/README.md`.

## Stable contracts preserved

- Exported function names (`runLiveness`, `runE2EReadiness`) — file
rename only, NOT symbol rename
- `Status` enum string values
- `LiveDimension` union values
- Filter chip `id: "wired"` (filter state key)
- `keyFor(...)` dimension keys
- All visible labels (already correct per #5505)

## Audit of lowercase `"wired"` comments

Audited every `\bwired\b` hit in `showcase/shell-dashboard/src/` and
`showcase/harness/src/`. All hits fall into three accurate categories:
1. `Status` enum string literal `"wired"`
2. Enum-noun phrasing (`wired-cell count`, `wired chip`, `Wired +
supported` section header in `cell-model.ts:813`)
3. Unrelated code-plumbing usage (`probe-wired`, `wired up`, `wired
through`, `wired by buildServer`)

No stale display-label leftovers found — PR #5505 already cleaned those
up. No comment edits needed.

## Verification

- shell-dashboard: typecheck clean, **1089 pass / 1 skip / 0 fail**
across 63 files, build clean
- showcase/harness: typecheck clean, **2769/2769 pass** across 129
files, build clean
- oxfmt `--check`: clean across all 17 changed TS/TSX files
- `rg pctBeAgent|totalBeAgent`: empty
- `rg drivers/liveness|drivers/e2e-readiness`: empty
- NUL-byte scan: empty

## Related

- #5498 — original "Wired" → "BE (Agent)" L1 + catalog rename
(introduced the var names this PR reverts)
- #5503 — RT → BE cell badge
- #5505 — CV → 1P cell badge + API (HTTP) / BE (Agent) long-form
normalization
2026-06-16 15:28:17 -07:00
Jordan Ritter 5842249c2e refactor(harness): rename D2/D3 drivers to follow dN- pattern
Other dimension drivers under showcase/harness/src/probes/drivers/ follow
the dN-<purpose>.ts naming pattern (d4-chat-roundtrip.ts, d6-all-pills.ts).
D2 and D3 didn't — bring them in line.

  drivers/liveness.ts        -> drivers/d2-liveness.ts
  drivers/liveness.test.ts   -> drivers/d2-liveness.test.ts
  drivers/e2e-readiness.ts   -> drivers/d3-readiness.ts
  drivers/e2e-readiness.test.ts -> drivers/d3-readiness.test.ts

The d3 driver loses the redundant 'e2e' prefix — the dimension is D3
and the corresponding dashboard badge is 'UI', so the file's job is best
described as 'is the demo frontend ready?'.

Imports updated in:
  - showcase/harness/src/orchestrator.ts
  - showcase/harness/src/orchestrator.test.ts
  - showcase/harness/src/cli/runner.ts
  - showcase/harness/src/probes/drivers/d2-liveness.test.ts (self-ref)
  - showcase/harness/src/probes/drivers/d3-readiness.test.ts (self-ref)

Doc-comment references to the old file paths updated in:
  - showcase/harness/src/cli/targets.ts
  - showcase/harness/src/probes/liveness.ts (the helper, not the driver)
  - showcase/harness/src/probes/loader/probe-invoker.ts
  - showcase/harness/src/probes/discovery/railway-services.ts
  - showcase/harness/src/probes/drivers/starter-smoke.ts
  - showcase/harness/src/probes/drivers/starter-smoke.test.ts
  - showcase/harness/src/types/dimensions.test.ts
  - showcase/harness/config/probes/e2e-demos.yml
  - showcase/harness/README.md (driver table)

Function/symbol exports unchanged (livenessDriver, e2eReadinessDriver,
createE2eDemosDriver, etc.) — file rename only. The parent helper module
showcase/harness/src/probes/liveness.ts is also untouched: it's a
separate, non-driver helper that exports deriveHealthUrl, livenessProbe,
and LIVENESS_SLACK_SAFE_FIELDS. Not renamed: drivers/e2e-parity.ts,
drivers/aimock-wiring.ts, drivers/pin-drift.ts, drivers/image-drift.ts
(non-dimensional probes).
2026-06-16 15:14:01 -07:00
Jordan Ritter 4ef08bb112 refactor(showcase): revert label-derived var names to mirror Status enum
The internal counter vars pctBeAgent and totalBeAgent were introduced in
PR #5498 when the display label happened to be "BE (Agent)". The label
has since changed (#5505 made it "API (HTTP)"). Coupling internal variable
identifiers to display labels is fragile — labels move; the underlying
Status enum string "wired" is a persisted contract that does not.

Revert the var identifiers to mirror the enum:

  pctBeAgent   -> pctWired   (coverage-bar.tsx)
  totalBeAgent -> totalWired (cells-view.tsx, parity-view.tsx)

Display labels ("API (HTTP)", etc.) are unchanged — this is internal
identifiers only.
2026-06-16 15:05:46 -07:00
Jordan Ritter 91b7c5efb4 fix(showcase/aimock/d6/langgraph-python): add d5-probe catchall fixture entries for Tokyo/AAPL
Parent commit 9491b8934 (fix(showcase): disjoint catchall userMessages + content-asserting probes) changed the d5-tool-rendering-custom-catchall probe userMessages to 'Forecast Tokyo through the wildcard renderer' / 'Quote AAPL through the wildcard renderer' but did not add matching entries to LGP-gold's fixture. Result: aimock no-match -> agent_run_error_event -> SSE-missing -> probe RED on LGP with zero bubbles mounted.

This commit adds 4 entries (2 emit + 2 toolCallId-gated narration) following the canonical pattern used by the other 17 integrations. After this commit, LGP bubbles mount and narrations settle with the canonical phrase in bubble.textContent, matching BIA's end-state.

NOTE: A separate fleet-wide probe-layer bug (validateCustomCatchall's customContentPhrasePresent page-wide DOM scan returns false even when phrase is in bubble.textContent) keeps the probe RED in this session. That's a separate concern, to be fixed in a follow-on commit. This commit is a strict improvement: pre-fix LGP got zero bubbles + agent_run_error_event; post-fix LGP renders both bubbles and both narrations settle with the phrase.
(cherry picked from commit 62e04976c3b292a27e1b1cc0bf2bb6fda47db786)
2026-06-16 14:46:12 -07:00
Nathan 🔶 Tarbert 8c277fad60 docs(shell-docs): use useRenderTool for wildcard opt-out
Avoid the provider renderToolCalls literal in the opt-out example,
which required a dummy args schema to typecheck. Point at the
documented useRenderTool wildcard overload (no schema needed) and
link to its reference page instead.
2026-06-16 17:42:40 -04:00
Jordan Ritter 71f05281ab refactor(showcase): rename CV→1P + normalize API (HTTP) / BE (Agent) labels (#5505)
## Summary

Two related taxonomy-hygiene commits cleaning up the dashboard
cell/legend labels. Follows on from #5473 (E2E→UI), #5498 (Wired→BE
(Agent) L1 + catalog), #5503 (RT→BE cell badge).

### Commit 1 — `CV → 1P` cell-badge rename

The per-cell badge code `CV` (Conversation) becomes `1P` (Single Pill).
Clearer scope framing:
- D5 driver is literally `d5-single-pill.ts` (one scripted conversation)
- D6 driver is `d6-all-pills.ts` (full pill suite + parity vs reference)

`CV` ("Conversation") was opaque — `1P` reads as "1 pill out of N" and
pairs naturally with `D6` (all pills). Scope ladder now: `API → UI → BE
→ 1P → D6`.

### Commit 2 — `API (HTTP)` / `BE (Agent)` long-form normalization

Resolves a label collision introduced by #5498. Previously:
- L1 row D2 (agent-liveness) was labeled `BE (Agent)`
- Per-cell D2 badge was labeled `API (Agent)`
- Per-cell D4 badge (chat round-trip) was labeled `BE (Round Trip)`

So `BE (Agent)` (D2 L1) and `API (Agent)` (D2 per-cell) described the
SAME concept under two different names, while `BE (Round Trip)` (D4)
shared the "BE" prefix with `BE (Agent)` (D2) for DIFFERENT concepts.
Now normalized by **layer**, not subject:

| Dimension | Old labels | New label |
|---|---|---|
| **D2** (transport / Railway liveness) | "BE (Agent)" L1 + "API
(Agent)" per-cell | **`API (HTTP)`** everywhere |
| **D4** (agent chat round-trip) | "BE (Round Trip)" per-cell | **`BE
(Agent)`** |

Reads cleanly: API = is the transport up; BE = can the agent process a
chat message. Both probes test "the agent" — the parens distinguish
what's actually being checked.

## Scope

28 files total (17 + 11), 114 insertions, 112 deletions. Pure
label/comment rename. Touches:
- Source: `unified-cell`, `cell-pieces`, `cell-drilldown`,
`adaptive-legend`, `adaptive-stats-bar`, `stats-bar`, `filter-chips`,
`packages-section`, `level-strip`, `composed-cell`, `depth-utils`,
`cell-model`, `live-status`, `page-stats`
- Tests: matching test files for assertion + comment updates
- Mnemonic legend: `(U=Up, B=BE (Agent), C=Chats, T=Tools)` → `(U=Up,
A=API (HTTP), C=Chats, T=Tools)`

## Stable contracts preserved (no behavior change)

- All `keyFor(...)` dimension keys (`"agent"`, `"d2"`, `"d4"`, `"d5"`,
`"e2e"`)
- Filter chip `id: "wired"` (filter state key)
- `LiveDimension` union string values
- `Status` enum string values (`"wired" | "stub" | …`)
- Internal variable names (`wired`, `pctBeAgent`, `totalBeAgent`, etc.)
— intentionally not renamed to avoid scope creep
- Driver names, probe registry keys, PocketBase keys, harness API
contracts

## Verification

- typecheck: clean
- tests: 1089 pass / 1 skip / 0 fail across 63 files
- build: clean
- oxfmt `--check`: clean across all 25 changed files
- NUL-byte scan: empty
- No remaining stale labels — `rg '"API \(Agent\)"|"BE \(Round Trip\)"'`
empty; `"BE (Agent)"` only appears at D4 sites

## Related

- #5473 — `E2E → UI` (original taxonomy refactor; cell-badge template)
- #5498 — `Wired → BE (Agent)` L1 + catalog (introduced the label
collision this PR resolves)
- #5503 — `RT → BE` cell badge (set the cell-badge naming pattern this
PR mirrors)
2026-06-16 14:29:32 -07:00
Jordan Ritter 14451d5c3d refactor(showcase): normalize API/BE long-form labels — API (HTTP) for transport, BE (Agent) for chat round-trip
PR #5498 renamed the L1 row "Wired" → "BE (Agent)" for the D2 agent-liveness
dimension (transport/Railway up). PR #5503 renamed the per-cell D4 badge
"RT" → "BE", whose long form was already "BE (Round Trip)". The result was a
same-label-different-concept collision: "BE (Agent)" referred to D2 in some
places while the D4 per-cell badge used "BE (Round Trip)", and the per-cell
D2 badge separately used "API (Agent)" — three names for two concepts.

Normalize the long-form labels so each user-facing layer has exactly one name:

  D2 (transport / Railway up, HTTP-reachable) = "API (HTTP)"
  D4 (agent chat round-trip, end-to-end)      = "BE (Agent)"

That cleanly distinguishes by layer: HTTP transport vs Agent message handling.

Sites touched (visible labels + matching legend prose / test assertions only):
  - stats-bar.tsx, adaptive-stats-bar.tsx — wired count label
  - filter-chips.tsx                       — chip label (id "wired" preserved)
  - packages-section.tsx + .test.tsx       — UWCT legend mnemonic B → A
  - level-strip.tsx + .test.tsx            — agent-dimension badge label (and
                                             derived first letter B → A)
  - cell-drilldown.tsx + .test.tsx +
    cell-drilldown.lazy-signal.test.tsx    — D4 label and D2 label, plus
                                             testid-derivation drift
  - adaptive-legend.tsx                    — D2 / D4 prose

Stable contracts preserved (NOT changed):
  - keyFor("agent" | "d2" | "d4", …) and the "agent" LiveDimension value
  - Filter-chip id "wired"
  - Variable names (`wired`, etc.) — internal; pure label rename is in scope
  - Status enum values "wired" | "stub" | "unshipped" | "unsupported"
  - Driver names, probe registry keys, harness API contracts

Verified: typecheck clean, 1089 pass / 1 skip / 0 fail, build clean.
2026-06-16 14:19:17 -07:00
Jordan Ritter 1d6d063c76 refactor(showcase): rename cell-badge CV → 1P (clearer scope framing vs D6 all-pills)
The per-cell health badge previously labelled "CV" (for "Conversation") is
renamed to "1P" — Single Pill. The new label tells operators what the badge
covers in scope terms (one pill out of N), which is the actual contrast the
D5/D6 ladder draws: D5 driver is `d5-single-pill.ts` (one canonical scripted
conversation), D6 driver is `d6-all-pills.ts` (the full suite). "CV" was
opaque — operators had to remember what "Conversation" meant and how it
differed from D6's full run. "1P vs D6 all-pills" is self-describing.

Mirrors PR #5503's RT → BE pass: only the badge LABEL changes; every stable
contract is preserved.

Stable contracts preserved:
  - Dimension level identifier  `model.d5` / `cell.d5` / `level={model.d5}`
  - Drilldown dimension key     `keyFor("d5", ...)` / `key: "d5"`
  - Probe registry key          `d5:<slug>/<featureId>`
  - PocketBase row keys         unchanged
  - LiveDimension union / Status enum strings  unchanged
  - Driver file names           `d5-single-pill.ts`, `d6-all-pills.ts`
  - `e2e-deep` producer name    unchanged (separate from CV → 1P label)

Updates:
  - Source: badge label in `unified-cell.tsx`, `cell-pieces.tsx`, drilldown
    label in `cell-drilldown.tsx` ("CV (Conversation)" → "1P (Single Pill)"),
    legend text in `adaptive-legend.tsx`, comment refs in `composed-cell.tsx`,
    `cell-model.ts`, `page-stats.ts`, `depth-utils.ts`, `live-status.ts`.
  - Tests: testid strings (`mock-badge-CV` → `mock-badge-1P`), label-text
    assertions, type unions, and comment refs in the affected component +
    drilldown + integration + lib tests.

Verification: typecheck clean, `npm test` = 1089 pass / 1 skip / 0 fail
(same shape as #5503), `npm run build` clean, no remaining `\bCV\b` in
`showcase/shell-dashboard/src/`.
2026-06-16 14:13:24 -07:00
Tyler Slaton c6a14e7969 feat(shell-docs): serve Built-in Agent docs at the docs root (#5404)
## Summary

Built-in Agent docs now render at bare root URLs, such as `/quickstart`,
instead of under `/built-in-agent`. Legacy `/built-in-agent/*` and
`/integrations/built-in-agent/*` paths continue to redirect to canonical
root or backend URLs.

## Why

The Built-in Agent is the default docs surface, so public docs URLs
should not expose it as a sub-slug. Existing links still need to keep
working, and root-page navigation must stay stable regardless of a
visitor's stored framework selection.

## How

- Root docs resolve Built-in Agent authored pages first while preserving
reserved routes like `/ag-ui` and framework-prefixed docs.
- Redirect rules in `next.config.ts` and `seo-redirects.ts` point
retired Built-in Agent and unselected paths directly at canonical
destinations, with regression coverage that prevents redirect
destinations from targeting `/built-in-agent`.
- The sidebar/framework provider treats bare URLs as the default
Built-in Agent surface instead of letting a stored framework value
rewrite root-page chrome.
- MDX link and search-result href rewriting strip retired Built-in Agent
prefixes on root-rendered pages while preserving explicit
cross-framework links.
- Stale docs links, sitemap, `llms.txt`, markdown exports, and OG
resolution now align with the root-served Built-in Agent surface.
- Showcase generated-data tests now serialize shared fixture restoration
to avoid concurrent drift in CI.

## Verification

- GitHub checks are green on `f655013dd2576a46dc17b5901eb4dc501cb21028`.
- `npm --prefix showcase/shell-docs run test --
src/lib/__tests__/search-hrefs.test.ts
src/lib/__tests__/docs-link-rewrite.test.ts
src/lib/__tests__/seo-redirects.test.ts
src/lib/__tests__/next-config-redirects.test.ts
src/components/__tests__/docs-landing-next.test.tsx
'src/app/[framework]/[[...slug]]/__tests__/framework-root-shell-layout.test.ts'`
- `npm --prefix showcase/shell-docs run test -- --exclude
src/app/__tests__/public-assets.test.ts`
- `npm --prefix showcase/shell-docs run typecheck`
- `npm --prefix showcase/shell-docs run lint`
- `npm --prefix showcase/shell-docs run build`
- `npm --prefix showcase/scripts run test`
- `pnpm exec nx run @copilotkit/bot-slack:build --skip-nx-cache
--verbose`
2026-06-16 13:48:32 -07:00
Nathan 🔶 Tarbert 38e31c7b25 docs(shell-docs): update useRenderToolCall reference
Sync the v2 useRenderToolCall reference page with the current hook
implementation and document how to opt out of rendering.

- Correct render-prop shape to include toolCallId (added in the hook
  but missing from docs)
- Describe agentId-scoped renderer lookup priority
- Note arguments are parsed with partialJSONParse (streaming), not a
  strict JSON.parse with empty-object fallback
- Fix toolCall prop description (toolCall.function.name/.arguments)
- Rewrite the Status Resolution table to match the real logic
  (toolMessage presence + provider executing set)
- Add an "Opting Out of Rendering" section covering single-tool,
  wildcard, and conditional null renderers
2026-06-16 16:06:57 -04:00
Austin Merrick b2f1eb79b1 docs: add Vue quick start guide (#5492)
## Vue quick start guide

Adds a minimal getting-started guide for `@copilotkit/vue` under
**Platforms**, matching the existing React Native guide. It connects a
Vue app directly to an AG-UI agent with `HttpAgent`, so there is no
runtime to stand up and nothing framework-specific to configure. The
same setup works with any AG-UI agent, and agent-side setup links out to
Integrations.

### New page

![Vue quickstart page: nav entry, intro,
prerequisites](https://raw.githubusercontent.com/CopilotKit/CopilotKit/assets/vue-quickstart-screenshots/.pr-assets/vue-quickstart/page-top.png)

![Connect to your agent step with code
sample](https://raw.githubusercontent.com/CopilotKit/CopilotKit/assets/vue-quickstart-screenshots/.pr-assets/vue-quickstart/connect-step.png)

### Changes

- `showcase/shell-docs/src/content/docs/vue.mdx` (new): five steps from
`npm create vue` to a working chat connected to an agent, plus a
troubleshooting accordion and next-steps links.
- `meta.json`: adds `vue` to the Platforms nav after `react-native`.

### Verification

- `pnpm build` of shell-docs passes: TypeScript clean, all static pages
generated, no errors.
- Built a throwaway Vue app from this guide verbatim. `vite build` and
`vue-tsc` resolve every import from `@copilotkit/vue/v2` (installed via
the published `@copilotkit/vue`), the chat renders, and a message
round-trips to a local AG-UI agent and streams back.
2026-06-16 12:08:14 -07:00
Tyler Slaton b93fd77a4d fix(shell-docs): protect redirect aliases in docs links 2026-06-16 12:06:35 -07:00
Ben Taylor ba7e83d0fc fix(inspector): persist announcement popout dismissal via X control (#5448)
## Problem

Users reported that the announcement banner popping out of the
inspector's floating icon **does not stay closed after dismissing it**.

Confirmed in a real browser: the popout reappears on every reload. Root
cause — the popout preview bubble (`renderAnnouncementPreview`) had **no
dismiss control of its own**. Its only hide paths
(`handleAnnouncementPreviewClick`, `openInspector`) clear an in-memory
flag without persisting. On every mount `fetchAnnouncement()` recomputes
`showAnnouncementPreview` from the stored timestamp — which only the
*in-window* banner X (`markAnnouncementSeen`) ever wrote. So unless the
user opened the inspector and dismissed the inner banner, the popout
came back on every load.

## Fix

Add an X / dismiss control directly to the popout bubble:
- Click (or Enter/Space) → `markAnnouncementSeen()`, which **persists**
the announcement timestamp to `localStorage`.
- `event.stopPropagation()` so the X does not bubble up to the preview
body / floating button (i.e. it dismisses without opening the
inspector).
- Implemented as a `role="button"` span (not a `<button>`): the popout
renders *inside* the floating `<button>`, so a nested `<button>` would
be invalid HTML. Includes keyboard support and `:focus-visible` styling.

Body-click behavior is unchanged: clicking the bubble itself still opens
the inspector (engagement), and intentionally does **not** persist, so
the in-window banner still surfaces the announcement.

## Verification

- **Live browser:** popout shows X → click → `localStorage` persists
`{"timestamp":...}`, inspector stays closed → **reload keeps it gone**.
- **Unit tests (3 new, full suite 32/32 green):** X persists timestamp &
hides bubble; X does not open the inspector; body-click still opens
*without* persisting.
- Format (`oxfmt`), lint (`oxlint`), and build all clean; pre-commit
full-suite passed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-16 14:04:40 -05:00
Jordan Ritter 9d5f214047 refactor(showcase): rename cell-badge RT → BE (parallel to E2E → UI in #5473) (#5503)
## Summary

Renames the per-cell health badge from **`RT`** to **`BE`** in the
showcase dashboard cell grid. Mirrors PR #5473's `E2E → UI` shape
exactly — a follow-up to PR #5498 which renamed the L1 row label /
catalog stats display ("Wired" → "BE (Agent)") but missed the per-cell
badge code, which is what the user actually asked for.

## Why

PR #5498 unified the long-form display label "Wired" → "BE (Agent)"
across the L1 row in `level-strip`, the legend in `packages-section`,
and the catalog status display in
`stats-bar`/`adaptive-stats-bar`/`coverage-bar`/`filter-chips`. But the
per-cell badge grid (D3=`UI`, D4=`RT`, D5=`CV`, D6=`D6`) still showed
`RT ✓` because that label lives in `unified-cell.tsx`'s `HealthLayer`
component — outside #5498's diff.

PR #5473 set the exact precedent: when relabeling `E2E (Demo)` → `UI
(Frontend)`, both the long form AND the 2-char cell badge code
(`name="E2E"` → `name="UI"`) flipped. This PR applies the same shape:
the long form `BE (Agent)` already exists (from #5498); now the 2-char
cell badge code flips `RT` → `BE`.

## Scope

13 files, +51/-51 lines:

**Visible label flips (sources, 6 files):**
- `unified-cell.tsx` — `<TestBadge name="RT" level={model.d4} />` →
`name="BE"`, legend comment `"D4 = RT"` → `"D4 = BE"`, doc-comment refs
`CV/API/RT` → `CV/API/BE`
- `cell-drilldown.tsx` — `{ key: "d4", label: "RT (Round Trip)" }` →
`"BE (Round Trip)"`, doc-comments updated
- `adaptive-legend.tsx` — `"Round Trip (RT)"` → `"Round Trip (BE)"`
- `composed-cell.tsx`, `lib/cell-model.ts`, `lib/page-stats.ts` —
comment references

**Test updates (7 files):**
- `cell-pieces.test.tsx`, `cell-pieces.signal-degrade.test.tsx`
- `__tests__/cell-drilldown.lazy-signal.test.tsx`,
`__tests__/cell-drilldown.test.tsx`
- `__tests__/dashboard-color-matrix.test.tsx`,
`__tests__/overlay-selector-integration.test.tsx`,
`__tests__/unified-cell.test.tsx`
- Updates: `mock-badge-RT` → `mock-badge-BE`, `drilldown-badge-rt-…` →
`drilldown-badge-be-…`, `"RT (Round Trip)"` → `"BE (Round Trip)"`,
`"RT"` literal assertions → `"BE"`

## Stable contracts preserved (no behavior change)

- `level={model.d4}` — D4 dimension level identifier
- `dimensionKey={keyFor("e2e", …)}` (where applicable) and other
persisted dimension codes
- Probe registry keys `d4` / `chat` / `tools`
- All PocketBase row keys, LiveDimension union values, Status enum
string values

Only the visible `name` string flips.

## Remaining "RT" references (intentional)

2 historical-commentary references in
`cell-pieces.signal-degrade.test.tsx` lines 123–124 documenting the
rename lineage (`RT → UI → BE`). Not visible UI strings or test
assertions.

## Verification

- typecheck (`tsc --noEmit`): clean
- tests (`vitest run`): 1089 passed / 1 skipped / 0 failed across 63
files
- build (`next build`): clean
- oxfmt `--check`: all 13 files correctly formatted
- NUL-byte scan: empty

## Related

- PR #5473 — original `E2E → UI` taxonomy rename (template)
- PR #5498 — `"Wired" → "BE (Agent)"` L1 row + catalog stats (which
missed this cell-badge rename)
2026-06-16 11:54:20 -07:00
Austin Merrick b97157cadc docs: add Vue quick start guide
Add a minimal getting-started guide for @copilotkit/vue under Platforms.
Connects a Vue app directly to an AG-UI agent via HttpAgent so there is no
runtime to stand up, and imports from @copilotkit/vue/v2 to match the v2
docs convention. Links out to Integrations for agent-side setup.
2026-06-16 11:51:50 -07:00
Jordan Ritter 02275af2ab fix(showcase/aimock/d6/claude-sdk-typescript): delete dead turnIndex:0 fallback entries (consistency with A2-cleaned siblings)
After A2 (commit 6c596d8d6) stripped toolName from the primary emit entries, sibling turnIndex:0 fallback entries became unreachable under first-match-wins. The 7 A2-target siblings (ag2/google-adk/lgf/lgts/mastra/msdotnet/csdkts toolName strip) had equivalent dead fallbacks deleted in that commit; csdkts was inconsistently treated. Removing the 2 dead entries restores cross-fleet consistency. Probe contract unaffected — toolCallId-gated narration entries still emit the required content phrase.

(cherry picked from commit 9720636519f4cd858fcdc08ed84597be05604a2e)
2026-06-16 11:44:17 -07:00
Jordan Ritter 8ad31e7810 fix(showcase/aimock/d6): bring AAPL response payload to canonical $338.37/-2.96% on 3 fixtures
crewai-crews/ms-agent-python/pydantic-ai catchall AAPL entries still carried stale $189.42/up 1.27% narration and toolCall args lacking price_usd/change_pct. Round 1 CR finding #3 was identified but never given a fix agent. Brought all 3 to canonical shape matching built-in-agent (A5) and csdkts narration (A6): price_usd=338.37, change_pct=-2.96, narration 'AAPL is trading at $338.37, down 2.96% on the day — rendered through the custom wildcard catchall.'

(cherry picked from commit df84657310451500278d0b3d0125c9c490042d2b)
2026-06-16 11:44:17 -07:00
Jordan Ritter 601e45f0d8 refactor(showcase): rename cell-badge RT → BE (parallel to E2E → UI in #5473)
PR #5498 was mis-scoped — it renamed the L1 row label and catalog status
display from "Wired" to "BE (Agent)", but the dashboard's per-cell badge
code rendered in the grid was still "RT". This commit lands the parallel
flip that mirrors PR #5473's E2E → UI rename for the D4 chat/tools
round-trip badge.

Visible-label flips (RT → BE):
  - unified-cell.tsx: <TestBadge name="RT" level={model.d4} /> → name="BE"
  - cell-drilldown.tsx: { key: "d4", label: "RT (Round Trip)" } → "BE (Round Trip)"
  - adaptive-legend.tsx: legend entry "Round Trip (RT)" → "Round Trip (BE)"
  - Doc-comment taxonomy notes in cell-pieces.test.tsx, composed-cell.tsx,
    cell-model.ts, page-stats.ts, unified-cell.tsx, cell-drilldown.tsx,
    overlay-selector-integration.test.tsx, dashboard-color-matrix.test.tsx
  - Test assertions in dashboard-color-matrix.test.tsx, cell-drilldown.test.tsx,
    unified-cell.test.tsx (mock-badge-RT → mock-badge-BE, drilldown-badge-rt-
    → drilldown-badge-be-, "RT (Round Trip)" → "BE (Round Trip)")

Stable contract identifiers are PRESERVED — only the visible name flips:
  - level={model.d4} unchanged (D4 is still D4)
  - dimensionKey={keyFor("e2e", ...)} unchanged
  - probe registry-key "d4"/"chat"/"tools" unchanged
  - persisted dimension codes unchanged

Two intentional residual "RT" mentions remain in
cell-pieces.signal-degrade.test.tsx as historical commentary documenting
the rename lineage (RT → UI on the e2e badge in #5473, then RT → BE on the
D4 badge here).

Verification (in showcase/shell-dashboard):
  - npm run typecheck: clean
  - npm test: 1089 tests passed
  - npm run build: clean (next build OK)
  - LC_ALL=C grep -rlP '\x00' showcase/shell-dashboard/src: empty
2026-06-16 11:40:50 -07:00
Jordan Ritter e266b6215c fix(showcase/harness): wire requireContentPhrase=true in custom-catchall turn-2 assertion
validateCustomCatchall's requireContentPhrase branch was unreachable: assertCustomCatchall defaulted it to false and no caller overrode. The whole point of the PR is to catch cross-fixture leakage via content assertion — wiring it on. Turn-2 (Quote AAPL) now asserts the custom content phrase is present in the rendered bubbles, not just the testid.

(cherry picked from commit c9620c96f9addfee18f87fb1f8b2ae7fb040b3b8)
2026-06-16 11:27:56 -07:00
Jordan Ritter d091749477 fix(showcase/harness): correct fixtureFile metadata on catchall probes
Probes registered fixtureFile: 'tool-rendering.json' but actual files are tool-rendering-{default,custom}-catchall.json. Field is signal-only (aimock loads directory-wide content-driven matching) but accurate metadata helps debugging. Test files updated to enforce the correct values.

(cherry picked from commit 3c9de26375546f2269870b563ecd1526ec5a3bc2)
2026-06-16 11:27:46 -07:00
Jordan Ritter 6c596d8d65 fix(showcase/aimock/d6): strip toolName gate + dead turnIndex:0 content fallbacks in 7 catchall fixtures
ag2/claude-sdk-typescript/google-adk/langgraph-fastapi/langgraph-typescript/mastra/ms-agent-dotnet: AAPL is turn-1 so turnIndex:0 fallback unreachable; toolName gate fails on wildcard-renderer integrations that don't register get_stock_price. Aligned to LGP-gold pattern (userMessage+context discriminator, no toolName, no turnIndex:0 fallback). Preserved legitimate multi-pill matchers (SF/flights/d20/chain) on the 4 multi-pill integrations.

(cherry picked from commit c10821b5d904b31bee2ab2a39db3b1565aecba26)
2026-06-16 11:27:37 -07:00
Jordan Ritter 9e2c91d02f fix(showcase/aimock/d6/claude-sdk-typescript): replace duplicated stock_price toolCall in AAPL fallback with narration content
(cherry picked from commit 5081966fbddf5d0090e333005bb63f5dd4b36c58)
2026-06-16 11:27:27 -07:00
Jordan Ritter 6d60cfd310 fix(showcase/aimock/d6/built-in-agent): align AAPL price to $338.37 (fleet parity)
built-in-agent shipped $189.42 vs the rest of the fleet's $338.37. Drift makes any content-asserting test on AAPL price brittle. Aligned.

(cherry picked from commit c0796da2a63abfeaa1d8ea06200df0754d30a2e6)
2026-06-16 11:27:17 -07:00
Jordan Ritter 14667871a8 fix(showcase/aimock/d6/spring-ai): strip hasToolResult from weather emit (LGP-gold parity)
spring-ai retained hasToolResult:false on the Tokyo weather emit fixture — outlier vs LGP-gold and the other 16 catchall fixtures. Aligned: userMessage+context discriminator only.

(cherry picked from commit d268a88c4a3f405dfcc15b2aaccc190e61cd7ac7)
2026-06-16 11:27:06 -07:00
Jordan Ritter 072c18bf19 fix(showcase/aimock/d6): strip permanently-true hasToolResult gate on AAPL in 4 catchall fixtures
built-in-agent, crewai-crews, ms-agent-python, pydantic-ai: Tokyo turn-1 tool result makes hasToolResult permanently true → AAPL fixture never matched → 30s timeout. Aligned with agno/langroid/llamaindex/strands/claude-sdk-python pattern: rely on userMessage+context (and toolCallId where relevant) as the gate.

(cherry picked from commit 8e313cd1b043cf1c61efb82143171a28d7699c49)
2026-06-16 11:26:57 -07:00
Benjamin Taylor 9a0154da32 fix(inspector): render announcement popout as button sibling, not child
Address review: the popout dismiss control was a focusable interactive
element (role="button" + tabindex) rendered INSIDE the floating inspector
<button>. That violates the HTML button content model — a <button> may not
contain interactive descendants or descendants with tabindex, even when the
descendant isn't itself a <button>.

Render the announcement preview as a SIBLING of the floating button inside a
position: relative wrapper, so the dismiss affordance becomes a real
<button type="button">. The wrapper preserves the absolute positioning, so
the bubble still anchors to the button's edge (verified live: identical
placement). Native button keyboard handling replaces the manual Enter/Space
keydown shim. stopPropagation still keeps the X from bubbling to the preview
body (which opens the inspector).

Behavior unchanged and re-verified in a real browser: X persists the
timestamp + hides the bubble without opening the inspector; body-click opens
without persisting. web-inspector suite 32/32 green.

(--no-verify: the full-package pre-commit suite has pre-existing, unrelated
failures in core/runtime/sdk-js transport tests; this change only touches
packages/web-inspector.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 13:24:34 -05:00
Benjamin Taylor 87e16edfa5 fix(inspector): persist announcement popout dismissal via X control
The announcement preview bubble that pops out of the floating inspector
button had no dismiss control of its own. Its only hide paths
(handleAnnouncementPreviewClick / openInspector) cleared an in-memory flag
without persisting, so on the next mount fetchAnnouncement() recomputed
showAnnouncementPreview from the stored timestamp — which only the in-window
banner X ever wrote. Result: the popout reappeared on every reload unless the
user opened the inspector and dismissed the inner banner.

Add an X control to the popout that calls markAnnouncementSeen() (persists the
timestamp) and stopPropagation() (so the X does not bubble up and open the
inspector). The control is a role="button" span — the popout renders inside the
floating <button>, so a nested <button> would be invalid HTML. Includes
Enter/Space keyboard support and focus-visible styling.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 13:24:34 -05:00
Alem Tuzlak 44862c7ae3 chore(docs): allowlist gpt-5.5 model family for doc model-name validation 2026-06-16 19:57:12 +02:00
Alem Tuzlak 42636d0094 style: oxfmt bot-whatsapp + example 2026-06-16 19:26:52 +02:00
Martha Schumann e322df60cd Merge remote-tracking branch 'origin/docs/FAC-65-shared-v2-imports' into docs/FAC-65-shared-v2-imports 2026-06-16 10:23:03 -07:00
Martha Schumann 5117ed4d1d Merge remote-tracking branch 'origin/main' into docs/FAC-65-shared-v2-imports 2026-06-16 10:22:03 -07:00
Martha Kelly Schumann 7248aaa6f1 fix(docs): validate showcase docs model names (#5496)
## Summary
- update docs integration workflow triggers to include Showcase docs
content
- fix invalid Showcase docs model names currently caught by the shared
docs model validator

## Why
The model-name validator scans both legacy docs and Showcase docs, but
the GitHub Actions workflow only ran for `docs/**` changes. This allowed
invalid Showcase docs content to land without this validation, then fail
later on an unrelated docs PR.

## Verification
- `pnpm tsx scripts/validate-doc-model-names.ts`
- `git diff --check`
- pre-commit hook: `pnpm run test && pnpm run check:packages`
2026-06-16 10:21:21 -07:00
Alem Tuzlak c1b77d8058 feat(whatsapp-example): chart rendering, fail-loud handler, bold issue ids
- add render_chart tool: builds a QuickChart image, fetches the PNG server-side
  and uploads the bytes to WhatsApp (no headless browser, no fragile external
  fetch by WhatsApp); update the agent prompt to use it
- onMessage: fail loud — post a visible error to the user if a turn throws,
  instead of leaving them with silence
- issue_list: use **bold** so issue ids render bold on WhatsApp
2026-06-16 19:20:08 +02:00
Alem Tuzlak 0214e5ac63 fix(bot-whatsapp): correct IR rendering, HITL buttons, typing, quote-reply
- render: walk the real renderToIR tree — read text nodes' `value` and recurse
  into nested containers, so card text and buttons inside <Actions> render
  (previously produced zero payloads → silent no-send)
- render: value-only buttons (awaitChoice HITL confirm/cancel) now render,
  encoding the value in the reply id so the engine's waiter resolves
- adapter: native WhatsApp typing indicator on every inbound (read receipt +
  typing_indicator); supportsTyping = true
- ingress: resolve quote-replies — the webhook sends only the quoted message's
  id, so look it up in history and prepend its text to the turn
- adapter: record every outbound message (text + cards) in history keyed by its
  wamid, so quote-replies to the bot's own messages resolve too
- tests: +9 covering the renderToIR shape, value-only buttons, typing, quote
  resolution, and outbound recording (71 total)
2026-06-16 19:19:43 +02:00
Martha Kelly Schumann fae4d30ad8 Merge branch 'main' into codex/fix-docs-model-validator-trigger 2026-06-16 10:10:06 -07:00
Tyler Slaton 3fb24ef403 fix(shell-docs): address docs review edge cases 2026-06-16 10:08:54 -07:00
Benjamin Taylor 6618d92f72 ci(test-unit): scope build+test to nx affected packages
Run `test / unit` over only the packages affected since the base instead
of building + testing every package 3× across the Node 20/22/24 matrix on
every PR.

- fetch-depth: 0 so affected has a merge-base to diff against.
- Derive NX_BASE/NX_HEAD: PR → merge-base with the base branch tip; push →
  github.event.before with a HEAD~1 fallback.
- Select packages via `nx show projects --affected --projects='packages/**'`
  fed to run-many (the `nx affected` run form ignores --projects and pulls
  in downstream examples/storybook — hence the show-projects → run-many split).
- workflow_dispatch still runs all packages (manual/full run).
- Editing this workflow can't surface as an affected package, so a change to
  test_unit.yml in the range now forces a full all-packages run — this keeps
  the build/test path exercised on the PR that changes it.
- GitHub context passed via env: (not inline ${{ }}) to satisfy zizmor;
  NX_VERBOSE_LOGGING forced off for the JSON-parsing step.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 12:08:18 -05:00
Tyler Slaton 88588223af fix(react-core): add dark mode styling for default tool rendering (#5455)
## Summary
- Update the default tool-call renderer to use dark-theme-aware classes
for the card, header, status badge, and detail panels
- Add coverage for the dark theme styling path in unit tests
- Add a Storybook example that demonstrates the default tool renderer on
a dark CopilotKit surface

## Testing
- Added unit tests for the renderer’s dark-theme class output and
expanded details state
- Not run (not requested)
2026-06-16 10:04:54 -07:00
Tyler Slaton 06cee3f727 fix(vue): adjust pin-to-send spacer in both directions to keep the user message pinned (#5423)
## What does this PR do?

Ports the `usePinToSend` spacer fix from #5386 to the Vue package.
`packages/vue/src/v2/hooks/use-pin-to-send.ts` is a documented 1:1
parity port of the React hook and retained the shrink-only
`ResizeObserver`: when content below the anchored user message loses
height (suggestions swapping in, input container resizing after
streaming), the spacer could not grow back, so total scrollable height
dropped and the pinned message shifted — the same defect class reported
in #5355.

- Lets the spacer adjust in both directions so total scrollable space
below the pinned bubble stays constant.
- Mirrors the test change from #5386 1:1 in the Vue suite (red/green:
the updated assertion fails on the shrink-only implementation, passes
with the fix).
- Updates the `PARITY.md` row and hook JSDoc that documented the old
shrink-only semantics.

Vue has no scroll-to-bottom button, so the scroll-listener half of #5386
does not apply here.

## Related PRs and Issues

- Follow-up to #5386
- Relates to #5355 (Vue side of the same spacer defect)

## Tests

- `nx test @copilotkit/vue` — 1001 passed (94 files), including the
mirrored `adjusts spacer as content height changes to keep the user
message pinned` case
- `nx build @copilotkit/vue` — green (dts build)
- `oxfmt --check` clean on touched files
- Pre-existing on main, untouched by this diff: 176 package-wide lint
errors (identical count on clean main) and
`@copilotkit/core:check-types` failures

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-06-16 10:03:43 -07:00
Jordan Ritter 06112f4c36 refactor(showcase): rename Wired → BE (Agent) across dashboard taxonomies (#5498)
## Summary

Renames the display label \"Wired\" to **\"BE (Agent)\"** across both
taxonomies in the showcase dashboard, unifying the two overloaded
meanings (live-probe runtime health + catalog integration build state)
under one user-visible name. Mirrors the shape of #5473's `E2E (Demo)` →
`UI (Frontend)` rename — same atomic, label-only refactor.

## Why

The word \"Wired\" was overloaded across the dashboard:
- The **live-probe L1 row** in `level-strip` rendered \"Wired\" for
runtime backend health (the agent is up and responding).
- The **catalog integration-status** column in
`stats-bar`/`adaptive-stats-bar`/`coverage-bar`/`filter-chips` rendered
\"Wired\" for build state (the integration is built and shipped).

Both refer to the same underlying thing — the backend agent integration
— at different lifecycle stages. Calling both **\"BE (Agent)\"** makes
the dashboard internally consistent and aligns with the parallel \"UI
(Frontend)\" label introduced in #5473.

## Scope

- Visible label flip across `level-strip.tsx`, `packages-section.tsx`
legend (incl. `W=Wired` → `B=BE (Agent)` mnemonic), `stats-bar.tsx`,
`adaptive-stats-bar.tsx`, `coverage-bar.tsx`, `filter-chips.tsx`.
- Internal counter renames: `pctWired`/`totalWired` →
`pctBeAgent`/`totalBeAgent` (`coverage-bar.tsx`, `cells-view.tsx`,
`parity-view.tsx`).
- Test assertion + comment updates in `level-strip.test.tsx`,
`packages-section.test.tsx`.
- Slugifier fix in `stats-bar.tsx` testid generator —
`label.toLowerCase()` on `\"BE (Agent)\"` previously produced `stat-be
(agent)` (spaces + parens). Now slugifies to `stat-be-agent`.
Incidentally also fixes the pre-existing `stat-max depth` →
`stat-max-depth`. Surfaced and fixed during cr-loop Round 1.

## Stable contracts preserved (no behavior change)

- PocketBase row keys `agent:<slug>`
- `LiveDimension` union value `\"agent\"`
- `Status` enum string values `\"wired\" | \"stub\" | \"unshipped\" |
\"unsupported\"` (persisted catalog data; only display labels flip)
- Filter chip `id: \"wired\"` (filter state key joining to
`cell-matrix.tsx`)
- `catalog.metadata.wired` data field reads
- Harness driver `kind`/emission contracts
- `data-testid=\"coverage-segment-wired\"`

## Commits (4)

- \`ef40bd7c\` live-probe agent dimension Wired → BE (Agent)
- \`bfebac65\` catalog status Wired display → BE (Agent)
- \`f316d055\` rename internal Wired counters to BeAgent
- \`80b526d6\` slugify stats-bar testids (CR fix)

## Verification

- typecheck (\`tsc --noEmit\`): clean
- lint (next build inline): clean
- tests (\`vitest run\`): 1089 pass / 1 skip / 0 fail across 63 files
- build (\`next build\`): clean
- oxfmt: clean
- NUL-byte scan: empty
- cr-loop converged at Round 2 with Procedure 3 audit returning 0
PROMOTE_TO_A items

## Follow-up backlog

Round 1 + Round 2 surfaced ~30 pre-existing structural findings in
adjacent code (not subject-scope for this rename). Grouped into 8
follow-up PR subjects: fail-loud sweep, catalog view derivation
extraction, derivePackageDepth gate consistency, parity tier counting
hardening, coverage-bar tooltip/rounding, cells-view stats useMemo, test
hardening, Tailwind opacity-on-CSS-var. None block this rename.
2026-06-16 09:58:23 -07:00
wuyangfan a76b2eff69 docs: apply LangGraph link fixes to shell-docs (canonical source)
The top-level docs/ folder is retired; the live docs are sourced from
showcase/shell-docs. Move the same three link fixes there and revert the
no-op edits to docs/:

- configurable.mdx: graph-api -> use-graph-api (#add-runtime-configuration)
- configurable.mdx: drop malformed %23 double-anchor on the schema link
- step-2-langgraph-agent.mdx: studio.langchain.com -> docs.langchain.com/.../studio

Closes #3190.
2026-06-16 09:56:53 -07:00
Martha Schumann 38e987f7e4 fix(docs): validate showcase docs model names 2026-06-16 09:55:14 -07:00
Tyler Slaton 0df97a830b fix(examples): bump integrations to @copilotkit 1.60.1 for @ag-ui fetch fix (#5457)
## Summary

Fixes the integration examples whose chat never responds and logs this
on **every agent run**:

```
TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation
  (agent_run_failed_event){ source: onRunFailed, agentId: default }
```

The fix is a dependency bump that lands every integration demo on
`@copilotkit/* 1.60.1` + `@ag-ui/client 0.0.57`.

## Root cause

`@ag-ui/client@0.0.56` (and `0.0.55`/`0.0.53`) `HttpAgent` stores the
global `fetch` **unbound** and later calls it as a method:

```ts
// buggy
this.fetch = config.fetch ?? fetch;
run(input) { return runHttpRequest(() => this.fetch(this.url, this.requestInit(input))); }
```

`this.fetch(...)` invokes native `fetch` with the agent instance as the
receiver instead of `window`. Native `fetch` is brand-checked and throws
`Illegal invocation`. It fires on the client run path
(`ProxiedCopilotRuntimeAgent.run` → `#runViaHttp`) in **both dev and
prod** — not environment-specific.

Fixed upstream in `@ag-ui/client@0.0.57`:

```ts
this.fetch = config.fetch ?? ((url, requestInit) => fetch(url, requestInit));
```

`@copilotkit/* 1.60.1` (published) bumped its pin to
`@ag-ui/client@0.0.57`. Examples still on `1.60.0` ship the buggy client
— which is why deployments fail.

## What changed (all `examples/integrations/*`)

- **`@copilotkit/* 1.60.0 → 1.60.1`** across every integration demo. The
`_parity` manifest requires all demos to track the north-star
(`langgraph-python`) `@copilotkit` version, so they move in lockstep — a
partial bump fails `parity-check`.
- **Starter-fleet apps force a single `@ag-ui` tree via `overrides`**
(`@ag-ui/client|core|encoder|proto`). Bumped that single-tree pin
**`0.0.53`/`0.0.55` → `0.0.57`** so they actually carry the fetch fix
instead of a `1.60.1 ↔ 0.0.55` skew. Adapter packages (`@ag-ui/crewai`,
`@ag-ui/mastra`, `@ag-ui/llamaindex`, `@ag-ui/a2a`, middlewares) are
intentionally left at their own versions.
- Lockfiles regenerated; all resolve `@ag-ui/client 0.0.57`.

## Verification

- [x] Reproduced `Illegal invocation` locally on `1.60.0` (dev + prod
build)
- [x] Verified `langgraph-python` on `1.60.1`: agent run completes, todo
created, **0 console errors**
- [x] All lockfiles resolve `@ag-ui/client 0.0.57`
- [x] `pnpm parity:check` passes locally (0 errors)
- [ ] CI `parity-check` + per-integration `smoke-starter` green
- [ ] Redeploy affected examples (e.g. Render) and confirm chat works
2026-06-16 09:48:09 -07:00
Jordan Ritter 80b526d68b refactor(showcase): slugify stats-bar testids to handle multi-word labels
The testid generator in stats-bar.tsx used `label.toLowerCase()` directly,
producing fragile selectors with spaces and parens for compound labels.
After this PR's rename of "Wired" to "BE (Agent)", the testid became
`stat-be (agent)` — a CSS-hostile selector. A pre-existing
`stat-max depth` (from "Max Depth") had the same problem but predated
this PR.

Fix: replace with a proper slugifier:
  label.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "")

Resulting testids:
  "BE (Agent)"   -> stat-be-agent   (was stat-be (agent), broken)
  "Max Depth"    -> stat-max-depth  (was stat-max depth, pre-existing fix)
  "Stub"         -> stat-stub       (unchanged)
  "Unshipped"    -> stat-unshipped  (unchanged)
  "Unsupported"  -> stat-unsupported (unchanged)
  "Regressions"  -> stat-regressions (unchanged)
  "Failures"     -> stat-failures   (unchanged)

Call-site enumeration receipt (mandatory):
  rg 'stat-wired|stat-be|stat-max|stat-stub|stat-unshipped|stat-unsupported|stat-regressions|stat-failures' showcase/shell-dashboard/
    -> no matches (zero hardcoded references anywhere)
  rg 'data-testid=.stat-|"stat-|`stat-' showcase/shell-dashboard/
    -> only one hit: stats-bar.tsx:29 (the generator itself)
  rg 'stat-' showcase/shell-dashboard/tests/
    -> no matches (no Playwright/visual tests depend on these testids)

No test updates required.

Verification:
  npm run typecheck   -> clean
  npm test            -> 1088 pass / 1 pre-existing unrelated failure
                         (useLiveStatus.test.tsx R5 F5.2 — does not
                         reference stats-bar, exists on PR HEAD)
  npm run build       -> clean (Next.js lint inline; no lint script)
  NUL byte sweep      -> empty
2026-06-16 09:40:49 -07:00
Austin Merrick d88245199f docs: testing that previews are up (#5431) 2026-06-16 09:38:39 -07:00