Commit Graph

6858 Commits

Author SHA1 Message Date
Benjamin Taylor 3b5a17d275 docs: remove stale LangGraph and CrewAI persistence/threads pages
These pages documented framework-native checkpointer-based threading that
predates and conflicts with CopilotKit's own threads functionality. Drop
the persistence folders under both integrations, remove "persistence"
from the CrewAI sidebar, and strip the now-dangling bullet from the
LangGraph agent-native-app tutorial.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 16:33:14 -05:00
Max Korp e16a64eba7 fix(langgraph-threads): restore A2UI tool docstrings dropped in compaction rewrite (#4216)
## Summary

The Apr 21 commit
[\`25f6f1541\`](https://github.com/CopilotKit/CopilotKit/commit/25f6f1541)
(\"refactor(runtime): Support durable compaction of threads\") re-added
\`a2ui_dynamic_schema.py\` and \`a2ui_fixed_schema.py\` to the
\`langgraph-python-threads\` example (they had been deleted in the
earlier \"fix(examples): Pin version number and simplify example\"
commit). The re-add stripped two docstrings whose content was
load-bearing for the sub-LLM, not cosmetic:

- **\`render_a2ui\`** — its Args block said *\"The root component must
have id 'root'\"*. Without it, the secondary LLM emits a valid flat
component list with no entry point. The A2UI renderer always starts at
\`id=\"root\"\`
([\`A2uiSurface.tsx:152\`](packages/a2ui-renderer/src/react-renderer/a2ui-react/A2uiSurface.tsx)),
falls through to its shimmer placeholder, and the *Sales Dashboard (A2UI
Dynamic)* demo renders as an empty ~30px white square with 13 unused
components queued on the surface.
- **\`search_flights\`** — its Args block spelled out airline logo URLs,
date format, and status-icon colors, keeping flight cards visually
consistent across runs.

## What this PR does

Copies both files verbatim from
\`examples/integrations/langgraph-python/agent/src/\` (the non-threads
example, which is the known-good template). After this PR, \`diff -r\`
between the two examples' \`agent/src/\` dirs is clean.

Verified end-to-end locally against a demo scaffolded from this
template: \"Sales Dashboard (A2UI Dynamic)\" now renders the full
dashboard (title, three metric cards, pie + bar charts) instead of the
shimmer placeholder.

## Notes

- The restore brings back \`[A2UI-DEBUG]\` print statements and the
fuller module headers. If the \`-threads\` version was meant to be
terser than the non-threads version, happy to strip those in a follow-up
— but verbatim parity seemed like the safer default since the two
templates are otherwise meant to match.
- A separate, complementary fix would be to make the \`id: \"root\"\`
requirement explicit in \`A2UI_DEFAULT_GENERATION_GUIDELINES\`
(\`packages/shared/src/a2ui-prompts.ts\` +
\`sdk-python/copilotkit/a2ui.py\`), so the invariant doesn't depend on
per-demo tool docstrings. Not in scope here.

## Test plan

- [x] Run the template locally, click *Sales Dashboard (A2UI Dynamic)*,
confirm the dashboard renders.
- [ ] Sanity-check *Search Flights (A2UI Fixed Schema)* in CI or locally
— should continue to work (this file's behavior is unchanged; only
docstring content differs).
- [ ] Reviewer to decide whether to keep or strip debug prints.
2026-04-23 13:41:41 -07:00
devops-bot[bot] 0ce10b6c3d Update preview URLs in registry 2026-04-23 20:27:40 +00:00
Max Korp bec1fd0811 fix(a2ui): document id="root" entry-point requirement in generation guidelines
The A2UI React renderer (packages/a2ui-renderer/src/react-renderer/a2ui-react/A2uiSurface.tsx:152)
always begins rendering at the component with id="root":

    export const A2uiSurface: React.FC<{...}> = ({ surface }) => {
      // The root component always has ID 'root' and base path '/'
      return <DeferredChild surface={surface} id="root" basePath="/" />;
    };

If no component has that ID, DeferredChild falls through to its loading-
shimmer placeholder, so the surface silently renders as an empty ~30px
rectangle regardless of how many other components are on the surface.

The generation guidelines shipped to the sub-LLM (in @copilotkit/shared
and copilotkit sdk-python) never stated this requirement. Fixed-schema
demos hard-code a component with id="root" in their JSON and work; dynamic
demos relied on the LLM guessing, which it sometimes did and sometimes
didn't. The failure mode is particularly nasty: no error, no warning,
just a loading spinner that never resolves.

Adds the requirement to COMPONENT ID RULES in both the TS and Python
guideline strings. Both strings are injected into the sub-LLM's context
by A2UICatalogContext (packages/react-core) and
copilotkit.a2ui.a2ui_prompt() respectively, so every A2UI-enabled app
picks it up automatically — no per-demo change needed.

Stacked on #4216, which restores the same instruction to the
langgraph-python-threads demo's tool docstring (belt-and-braces until
consumers update their shared package version).
2026-04-23 13:21:07 -07:00
Max Korp be835b013b fix(langgraph-threads): restore A2UI tool docstrings dropped in compaction rewrite
The Apr 21 "refactor(runtime): Support durable compaction of threads" commit
re-added a2ui_dynamic_schema.py and a2ui_fixed_schema.py to the
langgraph-python-threads example in a stripped form. Most of the simplification
was cleanup, but two docstrings carried load-bearing instructions for the
sub-LLM and those got lost:

- render_a2ui's Args block said the root component must have id "root".
  Without it, the LLM emits a valid flat component list with no entry point;
  the A2UI renderer (A2uiSurface.tsx:152) hard-codes id="root" and falls
  through to a shimmer placeholder — the "Sales Dashboard (A2UI Dynamic)"
  demo renders as an empty white square.
- search_flights' docstring spelled out airline logo URLs, date format,
  and status-icon colors, producing consistently-styled flight cards.

This restores both files verbatim from the non-threads example, which is
the known-good template. All differences in the agent/src dir are now
removed. Debug prints and headers come back with the restore; happy to
trim them in a follow-up if the intent was to keep the -threads version
terser.
2026-04-23 13:21:07 -07:00
Jordan Ritter e1556641ba fix: unblock verify-image-refs for aimock + ops drift (#4223)
## Summary

The `verify-image-refs` job has been failing on every main push,
blocking all showcase deploys. Two services drifted from expected state:

- **showcase-aimock** — wrapper elimination (PR #128) changed the
canonical image from `ghcr.io/copilotkit/showcase-aimock:latest` to
`ghcr.io/copilotkit/aimock:latest`. The verify script's regex required a
`showcase-` prefix and enforced `image ===
ghcr.io/copilotkit/{serviceName}:latest`, both of which reject the new
direct-pull image name.
- **showcase-ops** — Railway was pinned to
`ghcr.io/copilotkit/showcase-ops:3add284` (a commit SHA tag) instead of
`:latest`.

## Changes

**Workflow code** (`showcase/scripts/verify-railway-image-refs.ts`):
- Relaxed `IMAGE_SHAPE` regex from `showcase-[a-z0-9-]+` to `[a-z0-9-]+`
to accept non-showcase-prefixed images
- Added `IMAGE_OVERRIDES` map so `showcase-aimock` expects
`ghcr.io/copilotkit/aimock:latest` instead of the default convention

**Railway config** (out-of-band mutation, not in diff):
- Updated `showcase-ops` source.image from `:3add284` to `:latest` via
`serviceInstanceUpdate`

## Verification

Ran `verify-railway-image-refs.ts` locally after both changes — all 41
services pass.

## Test plan

- [ ] CI `verify-image-refs` job passes on this PR
- [ ] Merge to main, confirm next showcase deploy completes without
verify-image-refs gate failure
2026-04-23 13:10:53 -07:00
Martha Kelly Schumann 2b60a8f24d ci(format): scope auto-format to files changed in the PR (#4219)
## Why

`github-actions[bot]` runs `oxfmt --write .` on every PR and pushes a
`style: auto-fix formatting` commit. When `main` advances, the formatter
re-formats files your PR never touched and adds them to your diff.

## Fix

Pass only `git diff --name-only <base>...HEAD` to oxfmt instead of the
whole tree. Push-to-`main` still checks the full repo.
2026-04-23 13:05:05 -07:00
github-actions[bot] 52f7d5979a style: auto-fix formatting 2026-04-23 20:03:32 +00:00
Jordan Ritter 1626490bdb fix: poll for non-empty textContent after assistant message appears (#4222)
## Summary

- Fix race condition in e2e-smoke driver where `runLevel` reads
  `textContent` immediately after `waitForSelector` succeeds, but
  CopilotKit renders the assistant-message container before tokens
  stream in (starts as `""`). Slower integrations like ms-agent-dotnet
  intermittently return empty text, producing false-red "empty
  assistant response" alerts.
- Replace single `textContent` read with a polling loop that retries
  every 500ms until non-empty or `textPollTimeoutMs` expires.
- Add `textPollTimeoutMs` to `E2eSmokeDriverDeps` for test control.

## Test plan

- [x] New test: "polls for non-empty textContent when initial read
  is empty (streaming race)" -- simulates delayed streaming by
  returning empty on first two calls, then real text on third.
  Asserts driver waits and eventually reads text (green), and that
  `textContentCalls > 1`.
- [x] Existing "red when empty" test updated with short
  `textPollTimeoutMs: 50` so poll loop exits quickly.
- [x] All 795 showcase-ops tests green.
- [x] Typecheck + build clean.
2026-04-23 13:02:52 -07:00
Jordan Ritter 53ef2772a4 fix: unblock verify-image-refs for aimock wrapper elimination and ops tag drift
Two Railway services drifted from the verify-image-refs expectations:

- showcase-aimock: wrapper elimination (PR #128) changed the canonical
  image from ghcr.io/copilotkit/showcase-aimock:latest to
  ghcr.io/copilotkit/aimock:latest. Add an IMAGE_OVERRIDES map and
  relax the regex to accept non-showcase-prefixed image names.

- showcase-ops: Railway was pinned to :3add284 instead of :latest.
  Updated Railway config via serviceInstanceUpdate mutation.
2026-04-23 13:01:47 -07:00
Claude 5f1acd9044 ci(format): unconditionally fetch full history and diff against current base
Two bugs in the earlier version, both surfaced once main advanced and
was merged into the branch:

- `fetch-depth: ${{ ... && 0 || 1 }}` evaluated to `1` on PRs because
  the short-circuit treats `0` as falsy, so the base SHA was missing
  locally and `git diff` exited 128.
- Diffing against the PR's stored `base.sha` includes every file main
  touched since the PR opened once main is merged into the branch, which
  defeats the whole point of this change. Diff against the current tip
  of the base branch instead.
2026-04-23 20:01:11 +00:00
github-actions[bot] 95558c363c style: auto-fix formatting 2026-04-23 19:57:19 +00:00
Claude 8e12410201 ci(format): note upstream source of oxfmt extension list 2026-04-23 19:56:09 +00:00
Jordan Ritter 2f1a2acf26 fix: poll for non-empty textContent after assistant message appears
CopilotKit renders the assistant-message container before tokens
stream in, starting with empty textContent. Slower integrations
like ms-agent-dotnet (extra network hop) intermittently return
empty text, causing false-red "empty assistant response" alerts.

Replace the single textContent read with a polling loop that
retries until non-empty or until textPollTimeoutMs expires. Add
test that simulates delayed streaming by returning empty on
the first two textContent calls then returning real text.
2026-04-23 12:55:25 -07:00
Martha Kelly Schumann ac58aae1e4 Merge branch 'main' into claude/scope-autoformat-pr-files-LUdBq 2026-04-23 12:55:06 -07:00
Jordan Ritter da2d83bd56 feat(showcase): complete langgraph-python column (wave 1) (#4209)
## Summary

Wave 1 of the `langgraph-python` column completeness effort on
https://dashboard.showcase.copilotkit.ai. Every non-descoped cell should
go green on docs-og, docs-shell, QA, E2E (after first probe tick), and
Smoke once this deploys.

- **Manifest:** Wire `open-gen-ui` and `open-gen-ui-advanced` (code
existed, not declared) via `/api/copilotkit-ogui` runtime; add to
`constrained-explicit` allowlist; regenerate registry + demo-content
across 3 shells.
- **Docs sweep:** Fill `shell_docs_path` for 5 demos, add `hitl-in-app`
override, drop stale `chat-customization-css` fallback.
- **QA authoring:** 22 substantive checklists + 3 testing-kind stubs (25
files) at the `qa/agentic-chat.md` quality bar.
- **E2E authoring:** 23 per-package Playwright specs (~75 tests)
authored against Railway with structural selectors.
- **Aimock:** 9 new fixtures + new `aimock-fixture-coverage.test.ts`
enforcing per-spec coverage.
- **Ops probes (NEW):** Two new drivers — `qa` (reads `qa/*.md` file
presence) and `e2e-demos` (goto + 5-selector fallback chain). Both
scoped to langgraph-python for Wave 1; cadences 30 min / 6 h
respectively. 3 new DIMENSIONS (`qa`, `e2e_demos`, `e2e`). 24 new driver
tests.
- **Hook fix:** Extend `check-binaries.sh` whitelist to cover
`shell-dojo` + `shell-docs` demo-content.json (sister shells; generator
writes to all three).

Probe dry-runs against production: **qa 32/32 green**, **e2e-demos 32/32
green**.

## ⚠️ Known pre-existing drift

`animated_preview_url` resets to `null` across **every** integration
(~159 URL-to-null lines in `shell/registry.json` alone). Cause:
`capture-previews.ts` writes URLs post-generation; manifests hold null;
regeneration wipes them. Orthogonal to this PR — happens on any manifest
edit. Fix: re-run `capture-previews.ts` as a follow-up (requires ffmpeg
+ gh release upload perms).

## Discovered bugs (W8)

See
[`dev-docs/langgraph-python-column-wave1-bugs.md`](../blob/worktree-calm-waddling-conway/dev-docs/langgraph-python-column-wave1-bugs.md)
— 17 entries, 7 fully descoped cells + 2 partial on the "column
complete" declaration (real Railway backend issues: reasoning_agent
stall, request_user_approval not firing, useInterrupt not firing,
open-gen-ui iframe mount timeouts, etc.), 8 follow-ups without cell
impact.

## Out of scope

Waves 2-4 (`voice`, `multimodal`, `auth`, `agent-config`,
`byoc-hashbrown`, `byoc-json-render`) get separate brainstorms.

## Test plan

- [ ] `nx run showcase-ops:test` passes locally (815 pass + 1
pre-existing Windows path-sep failure — unchanged)
- [ ] `nx run showcase-scripts:test` passes (registry + constraints
validation)
- [ ] Railway deploys `showcase-langgraph-python` + `showcase-ops`
cleanly
- [ ] First `e2e-demos` probe tick (6 h cadence) emits
`e2e:langgraph-python/<feature>` rows
- [ ] First `qa` probe tick (30 min) emits
`qa:langgraph-python/<feature>` rows
- [ ] Dashboard walk: every non-descoped langgraph-python cell green →
screenshot attached
- [ ] W8 bug tickets filed / assigned per
`dev-docs/langgraph-python-column-wave1-bugs.md`
2026-04-23 12:51:53 -07:00
Alem Tuzlak ceb0e114ef docs: document langgraph-python wave 1 discovered bugs
17 entries across docs, backend-agent, probe plumbing, frontend/CSS,
and test infra. 7 fully descoped cells + 2 partial on the column
complete declaration. 8 follow-ups without cell impact. Each entry
includes symptom, evidence, suspected cause, owner, and next step.
2026-04-23 12:46:26 -07:00
Alem Tuzlak 577ca1b199 feat(showcase-ops): add qa and e2e-demos probe drivers
Two new probe drivers scoped to langgraph-python for Wave 1:

- qa driver (30 min cadence): emits qa:<slug>/<feature> rows per
  manifest demo with matching qa/<id>.md file presence.
- e2e-demos driver (6 hour cadence): emits e2e:<slug>/<feature>
  rows per declared demo via headless-chromium goto + 5-selector
  fallback chain. Skips routeless informational cells.

3 new DIMENSIONS (qa, e2e_demos, e2e). Both drivers registered in
orchestrator. 24 new tests, full showcase-ops suite passes.
2026-04-23 12:46:22 -07:00
Alem Tuzlak 8fb68293f6 feat(showcase): add aimock fixtures and coverage enforcement
9 new userMessage->toolCall/content fixtures in feature-parity.json
for langgraph-python demos. New aimock-fixture-coverage.test.ts
enforces per-spec fixture presence — every E2E spec prompt must
have a matching aimock fixture or be explicitly skipped.

Tighten pie-chart fixture match to avoid beautiful-chat collision:
match specific gen-ui-tool-based prompt text instead of generic
substring that also hits beautiful-chat suggestion pills.
2026-04-23 12:46:15 -07:00
Alem Tuzlak 0c30ad68e5 feat(showcase): author langgraph-python E2E Playwright specs
20 primary per-package Playwright specs plus 3 testing-kind stubs
(~75 test blocks). Selectors discipline: testids, role-based,
verbatim text; never LLM-text assertions. Enter-key submit replaced
with copilot-send-button testid (Enter flakes on Railway slow paths).
All non-skipped tests green 3x against Railway.
2026-04-23 12:46:07 -07:00
Alem Tuzlak d8ce477603 feat(showcase): author langgraph-python QA checklists
22 substantive primary checklists at the qa/agentic-chat.md quality
bar (specific testids, timeouts, expected results) plus 3 short stubs
for testing-kind demos (interrupt-headless, tool-rendering-reasoning-chain,
reasoning-default-render). 25 files total.
2026-04-23 12:46:03 -07:00
Alem Tuzlak 6dff6200e8 feat(showcase): wire open-gen-ui demos, update manifest and constraints
Declare open-gen-ui and open-gen-ui-advanced in langgraph-python
manifest (code existed, was never registered). Add both to
constrained-explicit allowlist, fill shell_docs_path for 5 demos,
add hitl-in-app override, drop stale chat-customization-css fallback.

Regenerate registry.json, demo-content.json, constraints.json,
and docs-status.json across shell / shell-dojo / shell-docs.
Bump feature/demo count assertion 30→32 in generate-registry test.
Extend check-binaries.sh whitelist for sister-shell demo-content.
2026-04-23 12:45:36 -07:00
devops-bot[bot] 667ecac916 Update preview URLs in registry 2026-04-23 19:25:31 +00:00
Jordan Ritter 95649b8535 docs(showcase): add RAILWAY.md — auto-updates + new-service checklist (#4217)
Operator reference for Railway service operations. Documents:
- Fleet-wide auto-updates (all 41 services, type=minor, any time)
- New-service checklist (enable auto-updates + add to ALL_SERVICES + add
to probes)
- environmentPatchCommit API for programmatic auto-update config
- Known quirks (polling frequency, API surface, CI coupling)
2026-04-23 12:12:56 -07:00
github-actions[bot] 3b887da707 style: auto-fix formatting 2026-04-23 18:59:34 +00:00
Jordan Ritter 8386c9b195 docs(showcase): add RAILWAY.md — auto-updates, new-service checklist, known quirks
Documents fleet-wide Railway auto-update configuration (all 41 services),
the environmentPatchCommit API for enabling on new services, CI coupling
with explicit redeploy for health-check determinism, and known quirks
around polling frequency and API surface.
2026-04-23 11:58:06 -07:00
Claude e81381d723 ci(format): scope auto-format to files changed in the PR
The static / quality "format" job ran oxfmt across the whole tree on
every PR. When main advanced with stale files, unrelated PRs picked up
those re-formats and ended up with a noisy `style: auto-fix formatting`
commit.

Now the job collects `git diff --name-only base...HEAD` for oxfmt-
supported extensions and passes only those paths to oxfmt. Push events
on main continue to check the whole repo so the baseline is still
enforced.
2026-04-23 18:42:06 +00:00
Sam Julien e2779bdfa1 docs-sync(needs-review): sync from main (d3109ab0e) [NEEDS REVIEW] (#4213)
⚠️ **Docs sync — MANUAL REVIEW REQUIRED**

This PR was auto-opened because the docs-sync script detected
showcase-local modifications overlapping with upstream changes.

The script attempted a best-effort 3-way merge:

- Where `git merge-file` produced a clean merge, the merged content was
written.
- Where `git merge-file` produced conflict markers, **upstream content
was written as-is** and showcase-local modifications were overridden.
**Manual review required.**

### Review items

```
Files where 3-way merge FAILED — upstream content written as-is, local modifications overridden. Manual review REQUIRED before merging this PR:
  - docs/content/docs/(root)/ag-ui-middleware.mdx
  - docs/content/docs/(root)/inspector.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/auth.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/frontend-tools.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/generative-ui/state-rendering.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/human-in-the-loop.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/quickstart.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/shared-state/in-app-agent-write.mdx
  - docs/snippets/shared/generative-ui/tool-rendering.mdx
  - docs/snippets/shared/troubleshooting/error-debugging.mdx

Files auto-merged via 3-way merge (clean, no conflict markers — still worth a glance):
  - docs/content/docs/integrations/microsoft-agent-framework/agent-app-context.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/generative-ui/tool-rendering.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/shared-state/in-app-agent-read.mdx
  - docs/content/docs/integrations/microsoft-agent-framework/shared-state/predictive-state-updates.mdx
```

### Source

- Upstream ref:
[`d3109ab0e`](https://github.com/CopilotKit/CopilotKit/commit/d3109ab0e)
- Workflow run:
https://github.com/CopilotKit/CopilotKit/actions/runs/24851556710

**Review before merging.** Auto-merge is intentionally disabled
for `needs-review` PRs — confirm the upstream-wins sections
preserve any intentional showcase-local divergence you want to
keep, then merge manually.
2026-04-23 11:33:44 -07:00
devops-bot[bot] da78e0f874 Update preview URLs in registry 2026-04-23 18:33:23 +00:00
copilotkit-devops-bot[bot] 3b0f20d3fd chore: docs sync from main — needs review (2026-04-23) 2026-04-23 18:21:01 +00:00
Sam Julien d3109ab0e8 docs(shell-docs): content pass — LangChain rename, gpt-5.4-mini, agentId cleanup, platform page ports (#4212)
## Summary

Content-pass follow-up on shell-docs, picking up the open Next
Priorities from the Shell Docs planning doc. All changes are docs-only
(MDX + `meta.json`) plus two small UI fixes for the docs container
chrome:

- `docs(shell-docs): revert LangGraph agent to LangChain agent in prose`
— 4 files. LangChain's branding ask: "LangChain" in prose, LangGraph
only for graph-framework references. URLs, package names, CLI/product
names (`langgraph.json`, `LangGraph CLI`) preserved. Upstream was
already aligned; this closes the gap on shell-docs.
- `chore(docs): switch built-in agent model to openai:gpt-5.4-mini` — 13
files across `showcase/shell-docs/src/content/docs/unselected/` and
`docs/content/docs/integrations/built-in-agent/`. Goal: fast first-run
experience. `model-selection.mdx` table collapsed two mismatched GPT-4o
rows into one honest `GPT-5.4 Mini` row.
- `chore(docs): drop unnecessary agentId specs in built-in agent
examples` — 3 files. Drops `agentId: "default"` from
`built-in-agent/shared-state.mdx` (shell-docs + upstream) and stale
`agentId: "assistant"` from `unselected/shared-state.mdx`. Runtime
auto-selects `default`; explicit prop is noise.
- `feat(shell-docs): port platform pages from upstream` — 3 new MDX +
`meta.json`. Adds `multimodal-attachments`, `runtime-server-adapter`,
`vs-code-extension` under a new `---Platform---` section in `meta.json`.
`threads.mdx` was already ported. Fumadocs imports stripped (shell-docs
registers components via its own MDX registry).
- `docs: port ag-ui-middleware content upstream from shell-docs` — 1
file. Replaces the 10-line upstream stub with the 70-line authored
shell-docs version so docs-sync stops threatening to overwrite it.
- `fix(shell-docs): account for BrandNav border in docs container
height`
- `fix(shell-docs): move docs scrollbar to viewport edge`
- `fix(shell-docs): fill empty stylesheet import fence on reference
index` — surfaced during the snippet-linking audit; the Styling section
on `/reference` said "import the stylesheet once at your app boundary"
with an empty code fence.
2026-04-23 11:19:41 -07:00
github-actions[bot] f35ede00c6 style: auto-fix formatting 2026-04-23 17:33:01 +00:00
Sam Julien 97c112df55 fix(shell-docs): fill empty stylesheet import fence on reference index
The Styling section referenced "import the stylesheet once at your app
boundary" but the fenced block was empty, leaving users with nowhere
to copy from.
2026-04-23 10:30:52 -07:00
Sam Julien 779bb10236 fix(shell-docs): move docs scrollbar to viewport edge
Previously <main> was both the scroll container AND width-capped
(`flex-1 max-w-4xl px-8 py-10 overflow-y-auto`). The scrollbar
rendered at the capped column's right edge, parking it mid-viewport
with a blank gutter beside it.

Separate the concerns: <main> is now full-width with the scroll, and
an inner <div> caps the content width and owns the padding. Scrollbar
now lands at the viewport edge (or TOC's left edge on pages that
render the right-rail TOC).

Applies to the four docs entry points that shared this pattern:
the root overview, the /<framework> landing + scoped pages, the
/ag-ui route, and the shared DocsPageView used by scoped docs.
2026-04-23 10:30:52 -07:00
Sam Julien 8fc126066b fix(shell-docs): account for BrandNav border in docs container height
The four docs flex containers used `calc(100vh - 52px)` to subtract the
top nav, but BrandNav is 52px flex content + 1px bottom border = 53px.
The 1px undercount made body overflow by exactly 1px and produced a
document-level scrollbar on top of the inner <main>'s own scroll.

The reference route already uses `calc(100vh - 53px)`; this aligns the
other four layouts with that convention.
2026-04-23 10:30:52 -07:00
Sam Julien 0b39b994fe docs: port ag-ui-middleware content upstream from shell-docs
The shell-docs copy of ag-ui-middleware.mdx had been authored with full
content while the upstream file remained a 10-line TODO stub. Port the
70-line authored version up so the docs-sync pipeline stops threatening
to overwrite it.
2026-04-23 10:30:52 -07:00
Sam Julien cab83d3c21 feat(shell-docs): port platform pages from upstream
Adds multimodal-attachments, runtime-server-adapter, and vs-code-extension
pages under a new ---Platform--- section in meta.json. threads.mdx was
already in place and left untouched. fumadocs-ui import lines are stripped
since shell-docs pulls components from its MDX registry instead.
2026-04-23 10:30:52 -07:00
Sam Julien 386accd457 chore(docs): drop unnecessary agentId specs in built-in agent examples
When the runtime registers an agent as default, CopilotKit hooks auto-select
it; passing agentId: "default" (or a stale "assistant" ID that isn't
actually registered) is noise. Applies to built-in-agent/shared-state.mdx
and unselected/shared-state.mdx across shell-docs and upstream.
2026-04-23 10:30:52 -07:00
Sam Julien 2783d1aa11 chore(docs): switch built-in agent model to openai:gpt-5.4-mini
Goal: fast 'wow that's fast' initial experience for users trying the
built-in agent. Sweeps shell-docs unselected/ and upstream built-in-agent/
so both trees match. Also collapses two mismatched GPT-4o rows in the
model-selection table into a single honest 'GPT-5.4 Mini' row.
2026-04-23 10:30:52 -07:00
Sam Julien c1a861d0dd docs(shell-docs): revert LangGraph agent to LangChain agent in prose
LangChain wants to be referred to as LangChain in docs; LangGraph is the
under-the-hood graph framework. Updates prose only — URLs, package names,
code identifiers, and LangGraph Studio/Platform product names are preserved.
Upstream docs/ already reflects this change; this brings shell-docs into
alignment so the next sync does not regress.
2026-04-23 10:30:52 -07:00
Jordan Ritter 5f38b13ea6 fix: aimock-wiring probe checks all LLM base-URL env vars via hostname match (#4211)
## Summary

The aimock-wiring probe reported only 4/35 services as wired
because of two bugs in the `pointsAtAimock` function:

1. **Path mismatch**: The probe compared full normalized URLs.
   Most services set `OPENAI_BASE_URL=<aimock>/v1` (OpenAI SDK
   convention) while `AIMOCK_URL` is the bare origin (no `/v1`).
   The `/v1` suffix caused every comparison to fail. Only
   `ANTHROPIC_BASE_URL` (used by 4 claude-sdk services, no
   `/v1`) matched.

2. **Missing env var**: `GOOGLE_GEMINI_BASE_URL` was not in
   the candidate list, so google-adk services were invisible.

### Changes

- Switch `pointsAtAimock` from exact-URL comparison to
  hostname-based matching via a new `extractHostname` helper
- Add `GOOGLE_GEMINI_BASE_URL` to `CANDIDATE_ENV_VARS`
- Add `showcase-shell-dojo` to `EXCLUDE_SERVICES` (infra,
  not an LLM caller)
- Remove dead `normalizeUrl` function (replaced by
  `extractHostname`)
- Add 3 regression tests covering `/v1` path tolerance,
  `GOOGLE_GEMINI_BASE_URL` wiring, and sealed handling

## Test plan

- [x] 3 new tests written red-first, now green
- [x] All 794 existing tests pass
- [x] TypeScript typecheck clean
- [x] oxlint clean (0 warnings, 0 errors)
- [x] Verified Railway env vars on all 34 non-excluded
  services confirm the fix will produce wiredCount:34
2026-04-23 10:05:05 -07:00
Jordan Ritter 1ab7cde5c1 fix: aimock-wiring probe matches by hostname and checks all
three LLM base-URL env vars

The probe compared full normalized URLs, so OPENAI_BASE_URL
values with the /v1 path suffix (set on 28 of 34 services)
never matched the bare-origin AIMOCK_URL config. Only
ANTHROPIC_BASE_URL (4 claude-sdk services, no /v1) matched,
producing wiredCount:4 instead of the correct 34.

Root cause 1: pointsAtAimock used exact-URL comparison via
normalizeUrl. Switch to hostname-based matching via a new
extractHostname helper so /v1 path differences are ignored.

Root cause 2: GOOGLE_GEMINI_BASE_URL was missing from the
candidate env var list. Add it alongside OPENAI_BASE_URL and
ANTHROPIC_BASE_URL in a shared CANDIDATE_ENV_VARS constant.

Also adds showcase-shell-dojo to the EXCLUDE_SERVICES set
(infra service, not an LLM caller) and removes the now-dead
normalizeUrl function (replaced by extractHostname).
2026-04-23 10:04:10 -07:00
devops-bot[bot] 3683106851 Update preview URLs in registry 2026-04-23 16:51:11 +00:00
Jordan Ritter 3add284158 fix: treat Railway DeploymentMeta as scalar in discovery GQL query (#4210)
## Summary

- Follow-up to PR #4208: Railway's `DeploymentMeta` is a GraphQL
  scalar (untyped JSON), not a typed object with sub-fields
- The query `latestDeployment { meta { imageDigest } }` fails with
  a GQL validation error; fix: `latestDeployment { meta }` and
  extract `imageDigest` from the parsed JSON object at runtime
- Zod schema updated from nested `z.object({imageDigest})` to
  `z.record(z.unknown())` to match the scalar type

## Test plan

- [x] All 791 tests pass
- [x] TypeScript typecheck clean
- [x] Build succeeds
- [x] Verified the corrected GQL query returns valid data from
  Railway's API (all services return imageDigest)
2026-04-23 09:38:37 -07:00
Jordan Ritter 20923da010 fix: treat Railway DeploymentMeta as scalar in GQL query
Railway's `DeploymentMeta` type is a GraphQL scalar (untyped JSON),
not a typed object. Using `meta { imageDigest }` in the query
produces a validation error. Fix: query `meta` without sub-selection
and extract `imageDigest` from the parsed JSON object.
2026-04-23 09:36:46 -07:00
Jordan Ritter 8404cdbe25 feat(shell-dashboard): Phase 3 dashboard honesty pass (#4207)
## Summary

Phase 3 of the dashboard honesty pass, implementing all 7 sub-phases
from the [Notion
plan](https://www.notion.so/34b3aa381852812c9e12f34a6caa304a)
(v2.4) in a single PR.

### Sub-phases landed

- **3.0 Pre-flight**: Verified 34 e2e_smoke rows in PB. Producer gap
  from PR #4200 is resolved.
- **3.1**: Renamed dashboard e2e subscription to e2e_smoke to match
  the ops producer key shape. Updated formatLabel/formatTooltip dim
  unions, all test fixtures.
- **3.2**: Added per-integration L1-L4 LevelStrip component
  (Up/Wired/Chats/Tools badges). New subscriptions for agent, chat,
  tools, e2e_smoke. aggregateConnection refactored to variadic. Tools
  n/a gate: integration.demos.some(d => d.id === "tool-rendering").
- **3.3**: Retired HealthDot from per-feature cells (L1 Up badge in
  strip replaces it). Dropped smokeRow from per-cell rollup (Decision
  #7). Rollup now [healthRow, e2eRow] only. This enables first-ever
  green rollups -- smokeRow was always null in production due to a
  key-shape mismatch.
- **3.4**: Removed QA column entirely -- LiveBadge QA, CellState.qa,
  subscription, legend entry. No producer ever existed.
- **3.5**: Docs four-glyph mapping: ok=checkmark, missing=middle dot,
  notfound=cross, error=exclamation. Each DocState value now renders a
  distinct glyph and tone.
- **3.6**: Legend rewrite -- dropped QA and Hosted rows, added L1-L4
  strip documentation, expanded docs row for four glyphs, rewrote ?
  footnote to "probe has not yet ticked since deploy".
- **3.7**: Added PackagesSection below starters grid. Extended
  registry.json with packages array from showcase/shared/packages.json.
  CI drift test ensures package set matches integration set.

### Behavior changes

- Per-cell rollup can now produce green (previously impossible because
  smokeRow was always null due to the integration-scoped vs
  feature-scoped key mismatch).
- QA column removed (was always showing ? with no producer).
- HealthDot removed from per-cell badges (replaced by L1 Up in strip).
- E2E badge now reads from e2e_smoke dimension (was reading dead e2e).

## Test plan

- [ ] vitest: 8 test files, 67 tests passing (baseline was 4 files,
  52 tests)
- [ ] TypeScript: tsc --noEmit clean
- [ ] New tests: LevelStrip (7 tests), PackagesSection (3 tests),
  DocsLink (2 tests), packages-drift CI test (1 test)
- [ ] Updated tests: live-status.test.ts (rollup fixtures updated for
Decision #7), feature-grid.test.tsx (e2e_smoke keys), dashboard.spec.ts
  (e2e_smoke + agent/chat/tools fixtures)
- [ ] Verify at showcase.copilotkit.ai post-deploy: L1-L4 strip on
  each integration + package row; docs four-glyph visible; no QA column;
  green rollup on healthy cells
2026-04-23 09:29:15 -07:00
Jordan Ritter 435792b86b fix: image-drift probe uses Railway deployment digest instead of parsing tag-only imageRef (#4208)
## Summary

- Fixed false-red bug in the image-drift probe driver where every
  tag-deployed Railway service was unconditionally marked as drifted
- Root cause: Railway stores tag-only refs (`ghcr.io/org/name:latest`)
  in `source.image`, so `parseImageRef().digest` is always null
- Discovery layer now queries `latestDeployment.meta.imageDigest` from
  Railway GraphQL and surfaces it as `deployedDigest` on
  `RailwayServiceInfo`
- Driver uses `deployedDigest` as fallback when the imageRef has no
  embedded digest

## Test plan

- [x] New test: tag-only imageRef + matching deployedDigest returns
green
- [x] New test: tag-only imageRef + mismatched deployedDigest returns
  red with isStale=true
- [x] New test: digest-pinned imageRef takes priority over
deployedDigest
- [x] All 791 existing tests pass
- [x] TypeScript typecheck clean
- [x] Build succeeds
2026-04-23 09:26:57 -07:00
github-actions[bot] b9736d53af style: auto-fix formatting 2026-04-23 16:20:31 +00:00
Jordan Ritter be13f3c601 fix: use Railway deployment digest instead of parsing tag-only imageRef
Railway stores tag-only refs like `ghcr.io/org/name:latest` in
`source.image`, so `parseImageRef().digest` is always null for
tag-deployed services. This caused the image-drift driver to
unconditionally set `currentImage = ""` and flip every service
red on every tick (false positive).

The fix:
- Discovery layer now queries `latestDeployment.meta.imageDigest`
  from Railway's GraphQL API and surfaces it as `deployedDigest`
  on `RailwayServiceInfo`.
- Driver prefers parsed digest from imageRef (backward compat for
  digest-pinned refs), falls back to `deployedDigest`, then to
  empty string.
- Three new tests cover the deployedDigest path: match (green),
  mismatch (red+stale), and parsed-digest-wins precedence.
2026-04-23 09:18:39 -07:00
github-actions[bot] e94aa1d4e1 style: auto-fix formatting 2026-04-23 16:16:22 +00:00