Commit Graph

3254 Commits

Author SHA1 Message Date
Alem Tuzlak b51bd014b3 test(showcase/langgraph-python): QA checklist + E2E spec for agent-config demo 2026-04-23 22:28:58 +02:00
devops-bot[bot] 0ce10b6c3d Update preview URLs in registry 2026-04-23 20:27:40 +00:00
Alem Tuzlak 170b8b2a16 fix(showcase/langgraph-python): re-apply voice demo wiring after merge from main
Merge with main (-X theirs) dropped the voice entries from the hand-edited
manifest + docs-links files because the generated registry / demo-content
bundles on main diverged from my local copies. Restore the voice demo
entries (manifest features + demos, docs-links, regenerated shell bundles)
on top of main's state.
2026-04-23 22:25:45 +02:00
Alem Tuzlak f79c8e0990 feat(showcase): wire agent-config demo into langgraph-python manifest 2026-04-23 22:19:14 +02:00
Alem Tuzlak f13532c44b feat(showcase): byoc-hashbrown demo for langgraph-python
Wave 4a. Port the starter's hashbrown renderer into a dedicated
single-mode langgraph-python demo at /demos/byoc-hashbrown so the
byoc-hashbrown row goes green on the dashboard.

- @hashbrownai/core + @hashbrownai/react + recharts deps added.
- Dedicated /api/copilotkit-byoc-hashbrown route with byoc_hashbrown
  graph (ChatOpenAI + CopilotKitMiddleware) and a catalog-aware
  system prompt coaching the LLM to emit a <ui>...</ui> envelope.
- Ported MetricCard + bar-chart + pie-chart + chart-config from
  showcase/starters/template/frontend with data-testid hooks on
  chart roots for E2E coverage.
- Ported hashbrown renderer with local RenderMessageProps /
  AssistantMessage types so @copilotkit/react-ui and @ag-ui/core
  do not become direct deps of this package.
- Updated hashbrown schema calls to @0.5.0-beta.4 surface:
  enumeration for SalesStage; description-first streaming.array +
  object; dropped the non-existent .optional() chain.
- v2 CopilotChat uses messageView.assistantMessage slot and
  useConfigureSuggestions for 3 canned prompts (sales dashboard /
  revenue by category / expense trend).
- QA checklist + Playwright E2E authored (not run pre-deploy).
- Manifest / constraints / docs-links updated and derived registry +
  demo-content + docs-status bundles regenerated.
- Extend scripts/hooks/check-binaries.sh whitelist to include the
  shell-docs and shell-dojo demo-content bundles so the pre-commit
  hook does not reject the regenerated 1.5 MB files it produced.
2026-04-23 22:17:18 +02:00
Alem Tuzlak 1d32b0f057 feat(showcase/langgraph-python): multimodal attachments demo (Wave 2b)
Wire CopilotChat AttachmentsConfig (image + PDF, inline base64) into a
dedicated /demos/multimodal cell backed by a vision-capable LangGraph
agent (gpt-4o). Scoped to its own runtime route so the vision cost
stays on this demo.

- Dedicated /api/copilotkit-multimodal route registering the new
  multimodal graph under the multimodal-demo slug
- src/agents/multimodal_agent.py with an AgentMiddleware that flattens
  PDF content parts to text server-side via pypdf
- Try with sample image / PDF buttons that drive CopilotChats own
  hidden file input via DataTransfer + change event, so the sample and
  paperclip paths exercise the same useAttachments pipeline
- public/demo-files/ placeholder — sample.png / sample.pdf binaries
  are produced by the user at the end of the Wave 2b rollout
- Manifest + registry + constraints + docs-links wired; normalized
  multi-modal -> multimodal in constraints to match the feature
  registry id
- QA checklist + Playwright E2E spec (not run yet — pending deploy)
- aimock fixtures for sample prompts so CI runs are deterministic
- Extend the check-binaries hook allowlist to cover the shell-docs and
  shell-dojo demo-content.json mirrors (same size as shell/src/data,
  already allowed) so regenerated derived data can be committed
2026-04-23 22:15:14 +02:00
Alem Tuzlak 5699f28045 Merge remote-tracking branch 'origin/main' into feat/wave2a-voice-demo 2026-04-23 22:15:06 +02:00
Alem Tuzlak 8027595ac6 feat(showcase/langgraph-python): byoc-json-render demo (Wave 4b)
Integrates @json-render/{core,react} as an alternative BYOC generative-UI
rendering technology in langgraph-python, paired with Wave 4a's hashbrown
demo. Both demos share the same sales-dashboard catalog (MetricCard +
BarChart + PieChart) so the dashboard rows are directly comparable.

- Adds @json-render/{core,react} @ 0.18.0 pinned.
- New /demos/byoc-json-render page using CopilotChat's messageView.assistantMessage
  slot to bridge CopilotKit output into @json-render/react Renderer.
- New /api/copilotkit-byoc-json-render route + byoc_json_render graph in
  langgraph.json.
- Zod-validated catalog reusing @json-render/react/schema's prebuilt spec shape.
- System prompt with 3 worked examples inlined so the agent emits valid
  { root, elements } JSON deterministically.
- QA checklist + Playwright spec authored (E2E run deferred to post-deploy
  stabilization).
- Adds shell-docs/shell-dojo demo-content.json to the check-binaries.sh
  allowlist (same 1MB-allowed rationale as shell/demo-content.json).
2026-04-23 22:13:11 +02:00
Alem Tuzlak 92688699f9 feat(showcase/langgraph-python): auth demo with onRequest gate (Wave 3a)
Framework-native request authentication demo for the langgraph-python
showcase. Demonstrates both the unauthenticated (401) failure path and
the authenticated success path via a shared bearer token.

- New /demos/auth page with sticky AuthBanner + in-memory React auth state
- Dedicated /api/copilotkit-auth runtime route using createCopilotRuntimeHandler
  from @copilotkit/runtime/v2 with an onRequest hook validating
  Authorization: Bearer demo-token-123
- Shared DEMO_TOKEN constant imported by both client and server to prevent drift
- <CopilotKit headers={...}> injects Authorization reactively when authenticated
- Page-level error surface captures 401s via onError and renders a stable
  data-testid=auth-demo-error for QA + E2E assertions
- QA checklist + Playwright E2E spec authored (E2E run deferred to post-deploy)
- Manifest, feature list, docs-links, constraints, and derived registry /
  demo-content / constraints / docs-status data regenerated
- Allowlist shell-docs / shell-dojo demo-content.json in the binary-size
  pre-commit hook (mirrors the Wave 2a voice commit; they are bundled
  fixtures already over 1 MB on main)
2026-04-23 22:11:19 +02: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
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
Alem Tuzlak 0923a6bdf6 feat(showcase/langgraph-python): voice demo (Wave 2a)
Wire @copilotkit/voice into a langgraph-python /demos/voice route via a
dedicated runtime (/api/copilotkit-voice) that mounts
TranscriptionServiceOpenAI. The mic button auto-appears in the CopilotChat
composer because the runtime advertises audioFileTranscriptionEnabled=true.

- Per-demo runtime route /api/copilotkit-voice with transcriptionService
- Demo page at /demos/voice with <CopilotChat /> + Play-sample button
- SampleAudioButton fetches /demo-audio/sample.wav and POSTs the
  single-route transcribe envelope to the runtime URL, then writes the
  transcribed text into the chat textarea via the native setter +
  synthetic input event so React state stays in sync
- Manifest, registry, constraints, docs-links wired; shell bundles regenerated
- QA checklist (qa/voice.md) + Playwright E2E spec (tests/e2e/voice.spec.ts)
- public/demo-audio/ placeholder committed; sample.wav to be added by user
- Allowlist shell-docs / shell-dojo demo-content.json in the binary-size
  pre-commit hook (they are bundled fixtures, already over 1 MB on main)
2026-04-23 22:00:47 +02:00
github-actions[bot] 95558c363c style: auto-fix formatting 2026-04-23 19:57:19 +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
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
Alem Tuzlak 8d027e3a97 feat(showcase/langgraph-python): AgentConfig types + agent_config_agent with unit tests 2026-04-23 21:44:36 +02:00
devops-bot[bot] 667ecac916 Update preview URLs in registry 2026-04-23 19:25:31 +00:00
Sam Julien 157cdae574 docs(shell-docs): wording pass — replace 'showcase cell' references with generic phrasing 2026-04-23 12:12:32 -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
Sam Julien 7efe08ae8c fix(shell-docs): strip hand-written code fences from Styling sections on prebuilt-components pages
Resolves former priority item 5. The Styling sections on the chat, sidebar,
and popup prebuilt-component pages (base + unselected/) each had an inline
tsx code fence that duplicated styling patterns already covered on the
dedicated /custom-look-and-feel/{css,slots,headless-ui} pages. Per Atai's
directive that every code fence in shell-docs should be a showcase-linked
Snippet, not hand-written, removing these fences is the right move here.

Section headers, intro copy, and bullet links to the dedicated styling
pages are preserved — those are legitimate pointers.
2026-04-23 11:53:32 -07: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
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 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 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
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
Jordan Ritter 9bce821779 feat(shell-dashboard): Phase 3 dashboard honesty pass
Phase 3.0: Pre-flight verified — 34 e2e_smoke rows in PB (producer
gap from PR #4200 resolved).

Phase 3.1: Rename dashboard e2e subscription to e2e_smoke to match
ops producer key. Update formatLabel/formatTooltip dim unions.

Phase 3.2: Add per-integration L1-L4 LevelStrip with Up/Wired/Chats/
Tools badges. New subscriptions for agent, chat, tools, e2e_smoke.
Widen aggregateConnection to variadic. Tools n/a gate uses
integration.demos.some(d => d.id === "tool-rendering").

Phase 3.3: Retire HealthDot from per-feature cells (L1 Up badge in
strip replaces it). Drop smokeRow from per-cell rollup (Decision #7).
Rollup now uses [healthRow, e2eRow] only. First-ever green rollups
enabled (smokeRow was always null in production).

Phase 3.4: Remove QA column — drop LiveBadge QA, CellState.qa,
subscription, legend entry. No producer ever existed.

Phase 3.5: Docs four-glyph mapping: ok->checkmark, missing->middle
dot, notfound->cross, error->exclamation. Each DocState has a
distinct glyph and tone.

Phase 3.6: Legend rewrite — drop QA/Hosted, add L1-L4 strip docs,
expand docs row for four glyphs, rewrite ? footnote.

Phase 3.7: Add PackagesSection below starters grid. Extends
registry.json with packages array from shared/packages.json. CI
drift test ensures package set matches integration set.
2026-04-23 09:14:05 -07:00
Jordan Ritter b02adc4758 fix: align package-shape probe URLs with actual Next.js API routes (#4205)
## Summary

- Showcase packages serve health/smoke at `/api/health` and `/api/smoke`
(Next.js app router convention), but the smoke probe driver was hitting
  bare `/smoke` and `/health` for the package shape, causing 17/17
  false-red rows every tick for both `smoke:<pkg>` and `health:<pkg>`.
- Update `deriveUrls` in the smoke probe driver so package-shape
  discovery uses `/api/smoke` and `/api/health`, matching what starters
  already do for `/api/health`.
- Fix `deriveAgentUrl` to handle `/api/smoke` path prefix correctly.
- Update tests to assert the corrected URL paths.

All 17 packages already had `/api/health` and `/api/smoke` route files;
the issue was purely in the probe driver's URL construction for the
package shape.

## Test plan

- [x] `pnpm --filter @copilotkit/showcase-ops test` passes (788/788)
- [ ] CI green
- [ ] After deploy, PB `smoke:<package>` and `health:<package>` rows
      turn green for all 17 packages
2026-04-23 09:11:40 -07:00
Jordan Ritter 83fb7a1a9c fix: align package-shape probe URLs with actual Next.js API routes
Showcase packages serve health and smoke routes under /api/
(Next.js app router convention: src/app/api/health/route.ts
maps to /api/health), but the smoke probe driver was hitting
bare /smoke and /health for the package shape. This produced
17/17 false-red smoke and health rows every tick.

Update deriveUrls to use /api/smoke and /api/health for the
package shape, matching the actual route paths. The starter
shape already used /api/health and is unchanged.
2026-04-23 09:04:47 -07:00
Jordan Ritter 167e6096d6 chore(showcase-aimock): remove wrapper Dockerfile and workflow matrix entry (Phase 3) (#4203)
## Summary
- Delete `showcase/aimock/Dockerfile` (wrapper image no longer used)
- Remove aimock from `showcase_deploy` workflow matrix + paths-filter +
dispatch options
- Update `showcase/aimock/README.md` to reflect direct-pull architecture
- Keep fixture JSONs (`smoke.json`, `feature-parity.json`) and
`RAILWAY.md` (actively used)

## Why
Phase 3 of the showcase-aimock wrapper elimination. Railway now pulls
`ghcr.io/copilotkit/aimock:latest` directly with a `startCommand` that
fetches fixtures from GitHub raw URLs. The wrapper Dockerfile, its
`ghcr.io/copilotkit/showcase-aimock` GHCR image, and the workflow
trigger are dead code.

## Test plan
- [ ] CI green
- [ ] showcase-aimock Railway service still healthy (unaffected by this
      PR -- no runtime dependency on deleted files)
- [ ] `workflow_dispatch` option list no longer shows aimock
2026-04-23 09:02:51 -07:00