Mount /gen-ui-tool-based and /hitl-in-chat endpoints in agent_server.py,
register the corresponding agents in the Next.js runtime route, and add
the three new feature ids (gen-ui-tool-based, hitl-in-chat,
hitl-in-chat-booking) plus their demo entries to manifest.yaml.
Port the in-chat HITL pattern (useHumanInTheLoop) from langgraph-python.
The book_call tool is defined entirely on the frontend; the MS Agent
Framework agent has tools=[] and just calls it by name. The booking-flow
alias reuses the same backend agent and shares the time-picker component.
Replace haiku stub with bar/pie chart variant ported from langgraph-python.
Frontend registers render_bar_chart and render_pie_chart via useComponent;
the MS Agent Framework agent has tools=[] and routes the user's chart
intent to whichever frontend tool fits.
- cli-start: informational manifest entry with the framework init command
- hitl-in-chat: in-chat HITL via the high-level useHumanInTheLoop hook
with a time-picker card; backend graph is tools=[] +
CopilotKitMiddleware
- hitl-in-chat-booking: alias mapped to the same demo route + backend
graph as hitl-in-chat, registered as a separate agent slot so the
feature card resolves to the same booking surface
Wires the new hitl_in_chat graph into langgraph.json and registers both
agent slots in src/app/api/copilotkit/route.ts.
## Summary
- Removes the `!hasHealth` gate on DocsLayer, so toggling the Docs
overlay always shows/hides docs content in cells regardless of whether
Health is also active.
## Test plan
- Toggle Docs on/off with Health also active — docs should
appear/disappear independently.
## Summary
- Fixes the ref-depth (parity) column's sticky left offset from `260px`
to `160px` to match the reduced FEATURE column min-width. The stale
offset caused the parity column to float disconnected from the feature
column when scrolling horizontally.
## Test plan
- Enable Parity Review preset, scroll right — REF DEPTH column should
stay pinned flush against the FEATURE column.
## Summary
- Adds `pb-12` to the scroll container so the fixed-position legend bar
at the bottom doesn't obscure the last rows of the feature matrix table.
## Test plan
- Scroll to the bottom of the matrix — last row should be fully visible
above the legend bar.
Command demos (npx copilotkit init) have no E2E/D5/D6 probes, so
health badges were perpetual gray noise. Skip HealthLayer when the
demo declares a command instead of a route.
Restructure page to viewport-filling flex layout so table column
headers stick below the overlay toggle bar on scroll. Halve cell
padding, reduce column min-width, center UWCT/health badges and
links. Remove duplicate CellStatus from CommandCell (ComposedCell
HealthLayer handles it). Split stats bar out of sticky container
so it scrolls away naturally.
Depth system was capped at D4 — D5/D6 PocketBase rows existed but
the chip never advanced past D4. Extends deriveDepth() through D6
with proper short-circuit gating, adds isD5Green() for multi-key
CATALOG_TO_D5_KEY resolution, and colors D5/D6 chips emerald to
distinguish from D3/D4 blue.
## Summary
All 18 showcase integrations are aimock-backed — zero LLM cost per probe
tick. Tightened schedules to catch regressions faster:
| Probe | Before | After | What it does |
|-------|--------|-------|-------------|
| smoke | every 15 min | every 5 min | L1/L2 HTTP health checks |
| e2e-smoke | every 30 min | every 15 min | L3/L4 Playwright chat
round-trip |
| e2e-deep (D5) | hourly | every 15 min | Multi-turn conversation probes
|
| e2e-demos (D4) | every 6 hours | hourly | Per-demo structural coverage
|
Cron offsets preserved to avoid Chromium EAGAIN across concurrent
browser pools.
## Test plan
- [ ] Harness picks up new schedules after deploy
- [ ] No OOM or Chromium contention under tighter cadence
- [ ] Dashboard shows more frequent probe updates
With aimock backing all 18 integrations, there is zero LLM cost per
probe tick. Tightened schedules to catch regressions faster:
smoke: */15 → */5 min (L1/L2 HTTP health)
e2e-smoke: */30 → */15 min (L3/L4 Playwright chat round-trip)
e2e-deep: hourly → */15 min (D5 multi-turn conversations)
e2e-demos: 6-hourly → hourly (per-demo structural coverage)
Offsets preserved to avoid Chromium contention across probes.
## Summary
- **D5 dashboard chip fix**: `resolveCell()` looked up D5 PocketBase
rows by catalog feature ID (e.g. `d5:slug/hitl-in-chat`) but the harness
writes them keyed by D5 feature type (e.g. `d5:slug/hitl-text-input`).
Added `CATALOG_TO_D5_KEY` mapping so the dashboard resolves the correct
PB row for each cell — this is why D5 chips showed gray "?" instead of
green/red.
- **CLI deep-input fix**: `buildDeepInputs()` passed manifest registry
IDs as `features` but the D5 driver only maps through
`demosToFeatureTypes()` when they arrive as `demos`. Changed to pass
`demos` so `showcase test <slug> --d5` exercises all D5 feature types,
not just the ~5 whose registry ID happens to match a D5 feature type.
- **7 new CLI debugging commands**: `build`, `ports`, `recreate`,
`fixtures validate`, `doctor`, `aimock-rebuild`, `diff-logs` — all
referenced by DEBUGGING.md but previously unimplemented.
## Test plan
- [ ] Dashboard shows D5 chips (green/red) after next harness tick
- [ ] `showcase test langgraph-python --d5` runs all 11 D5 feature types
locally
- [ ] New CLI commands execute without errors
Implements the 7 commands referenced by DEBUGGING.md:
build, ports, recreate, fixtures validate, doctor,
aimock-rebuild, diff-logs
Also adds .last-test-ts timestamp write to the test command
so diff-logs --since last-test works.
Dashboard: resolveCell() looked up D5 rows by catalog feature ID
(e.g. d5:slug/hitl-in-chat) but the harness writes them keyed by D5
feature type (e.g. d5:slug/hitl-text-input). Added CATALOG_TO_D5_KEY
mapping so the dashboard resolves the correct PB row for each cell.
CLI: buildDeepInputs() passed manifest registry IDs as `features` but
the D5 driver only maps them through demosToFeatureTypes() when they
arrive as `demos`. Changed to pass `demos` so the driver's mapping
from registry IDs to D5 feature types activates correctly.
## Summary
- Guard `preferences-card.tsx` against undefined `value.interests`
across all 17 integrations — crash prevented D5 shared-state probes from
completing
- Add missing D5 demo entries (`shared-state-read-write`, `hitl-in-app`,
`hitl-in-chat`, etc.) and feature IDs to manifests across 14
integrations — D5 probes couldn't discover features without these
entries
- Bump `@copilotkit/aimock` to v1.16.1 (turnIndex/sequenceIndex support
required for D5 fixture matching)
- Update snapshot test assertions for langgraph-python (38→40
features/demos) and crewai-crews (30→32 wired)
- Fix `docker-compose.local.yml`: mount D5 fixture volumes, add `--host
0.0.0.0`, replace curl healthcheck with Node fetch
- Delete redundant `scripts/dev-local.sh` (superseded by `bin/showcase`
CLI)
## Why
D5 probes were failing across all integrations due to three root causes:
(1) preferences-card crash on undefined interests, (2) missing manifest
entries preventing D5 probe discovery, and (3) aimock pinned at v1.10.0
missing turnIndex support. Local D5 verified GREEN on langgraph-python
(all 11 feature types pass).
## Test plan
- [ ] CI Validate Showcase passes (snapshot counts updated)
- [ ] CI build passes (aimock version bump)
- [ ] Local D5 probes pass for langgraph-python
- Mount D5/smoke/feature-parity fixtures into aimock via volumes
- Add --host 0.0.0.0 so other containers can reach aimock
- Switch healthcheck from curl to node fetch (aimock image has no curl)
- Delete dev-local.sh (redundant with bin/showcase CLI)
## Summary
Two small shell-docs nav polish changes that bring the showcase docs
visually closer to the upstream/canonical docs.
- **Free Developer Access CTA** — adds a cloud-icon link to
`cloud.copilotkit.ai` in the BrandNav, persistent across both the
CopilotKit and AG-UI tabs. Renders with label + external-arrow on
desktop (icon-only below 1100px) and as a row in the mobile slide-out
menu. Mirrors the upstream docs nav pattern.
- **Framework logos** — replaces the placeholder `/logos/<slug>.svg`
two-letter-initial gray boxes (LG, Ma, Py, Cl, Sp, etc.) with inline SVG
branded marks for the framework picker (sidebar pill + dropdown rows)
and the docs landing integration grid. Marks use `currentColor` so they
inherit theme text color and tint with hover/active states. Sourced from
upstream `docs/components/ui/icons/*` for the integrations that ship
there, and from simpleicons for `claude-sdk-*` (Anthropic mark) and
`spring-ai`. `built-in-agent` keeps its existing full-color CopilotKit
kite. `langroid` keeps its `La` initial placeholder until they ship a
brand mark.
No registry, manifest, or content changes — purely component-layer.
## Test plan
- [ ] Load `/` and verify the CopilotKit kite renders for Built-in Agent
and the framework picker shows real marks for langgraph, mastra,
pydantic-ai, crewai, agno, ag2, llamaindex, strands, google-adk,
ms-agent-*, claude-sdk-*, and spring-ai.
- [ ] Confirm `langroid` still falls back to the `La` placeholder.
- [ ] Verify the "Free Developer Access" link appears in the desktop top
nav and opens `cloud.copilotkit.ai` in a new tab.
- [ ] Resize below ~1100px: label hides, cloud icon stays.
- [ ] Mobile slide-out menu: confirm the cloud row appears with icon +
label + external arrow.
- [ ] Toggle dark/light: framework marks tint with the surrounding text
color (no hardcoded brand fill).
Needed for turnIndex/sequenceIndex fixture matching in D5 multi-turn
conversations. Updated in both packages/runtime (devDep) and
showcase/scripts (dep).
Add demo entries for hitl, hitl-in-app, hitl-in-chat, tool-rendering,
shared-state-read-write, and gen-ui-tool-based across 14 integrations.
Ensure every demo ID also appears in the features list so the showcase
matrix and D5 probes discover them correctly.
STATE_SNAPSHOT can deliver a Preferences object with interests undefined,
crashing .includes(), .filter(), and spread at 4 sites per file. Add
(value.interests ?? []) guards across all 17 integrations.
## Summary
- **Fix Mastra `createTool` execute signature** in 4 tools
(`subagents.ts` × 3, `shared-state-read-write.ts` × 1): the first param
is raw validated input (`inputData`), not a destructured `{ context }`
wrapper. The old code silently passed `undefined` as the task/notes to
sub-agents.
- **Add 3 nested sub-agent fixtures** for the D5 mcp-subagents demo:
research, writing, and critique sub-agents each make independent LLM
calls that need their own fixture entries. Production masked this via
`--proxy-only` fallthrough to real OpenAI; local aimock correctly 404s
on unmatched requests.
- **Rebuild `d5-all.json`** bundled fixture file (24 → 27 fixtures).
## Test plan
- [ ] `bin/showcase test mastra --d5 --verbose` — all 3 probes green
(tool-rendering, subagents, agentic-chat)
- [ ] Verify fixture JSON is valid: `jq .
showcase/harness/fixtures/d5/mcp-subagents.json > /dev/null`
- [ ] Verify d5-all.json fixture count: `jq '.fixtures | length'
showcase/aimock/d5-all.json` → 27
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Add 3 fixtures for the independent LLM calls made by each sub-agent
tool (research_agent, writing_agent, critique_agent) so the demo works
without --proxy-only mode. Interleave them with supervisor fixtures for
readability. Rebuild d5-all.json bundle.
The first parameter of Mastra ToolAction.execute is the raw
Zod-validated input, not a destructured wrapper. Changed all 4
tools from ({ context }, executionContext) to (inputData,
executionContext) and updated field accesses accordingly.