## Summary
Addresses all findings from 7-agent MSAL code review of the starter
crash fix PRs (#3933, #3941, #3943).
**Agent server (claude-sdk-typescript):**
- Remove 6 unnecessary `as any` casts — use TypeScript discriminated
union narrowing on `msg.role`
- Add `ANTHROPIC_API_KEY` validation on startup (exit if missing)
- Add `console.warn` logging to empty catch blocks (tool args + schema
parse failures)
- Sanitize error messages sent to client — no raw `err.message` in SSE
stream
- Fix misleading comment about system/developer role handling
- Set explicit 2MB JSON body limit on Express
- Remove unused `assistantMsgId` variable
**Generation script:**
- Remove dead `_agentDir` parameter from `rewritePythonImports`
- Add warning when `PIN_OVERRIDES` dep not found in framework
dependencies
**Tests (3 new):**
- Context-aware import rewriting for files inside `tools/` directory
- `from agents.X import` relative import rewriting
- `PIN_OVERRIDES` integration test for mastra version pinning
## Test plan
- [x] 254 generate-starters tests pass (3 new)
- [x] Drift check passes
- [x] Pre-commit hooks pass
- Guard TOOL_CALL_ARGS emission with if(toolCallId) check, matching
the existing guard on TOOL_CALL_END
- Wrap catch-block emit() in nested try/catch to handle client
disconnect during error reporting
Generation script:
- Make tools.py rename and langgraph import rewrite recursive via
forEachPyFile helper (was only processing top-level .py files)
- Fix from-src.agents regex to use [\w.]+ for dotted sub-paths,
matching the from-agents regex
- Simplify isInsideToolsDir branch to computed prefix variable
- Safe import-os removal: keep if os is used elsewhere in file
- Fix extractUvicornModule JSDoc example to match actual output
Agent server (claude-sdk-typescript):
- Remove dead ternary branches after API key guard
- Remove unreachable ?? "" fallback
Agent server (claude-sdk-typescript):
- Remove 6 unnecessary as-any casts, use TS discriminated union narrowing
- Add ANTHROPIC_API_KEY validation on startup (exit if missing)
- Add logging to empty catch blocks (tool args + schema parse)
- Sanitize error messages sent to client (no raw err.message in SSE)
- Fix misleading comment about system/developer role handling
- Set explicit 2MB JSON body limit
- Remove unused assistantMsgId variable
Generation script:
- Remove dead _agentDir parameter from rewritePythonImports
- Add warning when PIN_OVERRIDES dep not found in dependencies
Tests:
- Add context-aware import rewriting test (files inside tools/)
- Add from-agents.X relative import rewriting test
- Add PIN_OVERRIDES integration test for mastra version pinning
The src/agent/ directory was never committed to the repo, causing
the drift-check to fail in CI. The starter was generated from a
local-only copy of this directory.
## Summary
- Replace TODO placeholders in all 73 QA checklist files across 17
showcase packages with specific, actionable test steps derived from
reading actual demo page source code
- Each checklist now references real data-testid selectors, hook names
(useFrontendTool, useRenderTool, useLangGraphInterrupt,
useHumanInTheLoop, useAgent, useConfigureSuggestions), expected UI
states, and interaction flows
- Stub demos (shared-state-write, shared-state-streaming, subagents) are
marked as stubs with basic chat verification steps
- Add `showcase/QA-COVERAGE.md` with a comprehensive test coverage
matrix covering manual QA, Vitest unit tests, Playwright E2E (smoke +
interaction), per-package E2E, aimock fixtures, and CI automation for
all 9 demos plus the Sales Dashboard starter hero
## Test plan
- [ ] Verify QA checklist files no longer contain generic "TODO: Add
checks specific to X" placeholders
- [ ] Verify each checklist references the correct demo-specific
features (e.g., agentic-chat mentions background change + weather card,
hitl mentions step selector + accept/reject)
- [ ] Verify QA-COVERAGE.md matrix entries are accurate by
cross-referencing with actual test files
- [ ] Verify framework names in titles are preserved correctly across
all 17 packages
The agent's system prompt didn't mention pieChart/barChart frontend
tools, so gpt-4o-mini would call query_data repeatedly instead of
rendering charts. Updated the system prompt to explicitly instruct
the agent to call query_data once then use pieChart/barChart, and
updated the query_data tool description to reinforce single-call
semantics.
Replace TODO placeholders in all 73 QA checklist files across 17 showcase
packages with specific, actionable test steps derived from reading the
actual demo page source code. Each checklist now references real
data-testid selectors, hook names, expected UI states, and interaction
flows.
Add showcase/QA-COVERAGE.md with a comprehensive matrix showing coverage
across manual QA, Vitest unit tests, Playwright E2E (smoke and interaction),
per-package E2E, aimock fixtures, and CI automation for all 9 demos plus
the Sales Dashboard starter hero.
The langgraph.json in the starter was copied verbatim from the demo package
with path ./src/agents/main.py:graph, but the starter flattens agents into
the agent/ dir so the correct path is ./main.py:graph.
Also wraps A2UI agent imports in try/except so the starter starts cleanly
even if copilotkit's ToolRuntime patch isn't available — these are optional
features that shouldn't prevent the core agent from running.
Fixes the generate-starters.ts script to rewrite langgraph.json graph paths
when copying from packages to starters, preventing this drift in the future.
Remove orphaned demo-wrapper.tsx (1 file) and error-boundary.tsx (17 files)
that still imported from the deleted @copilotkit/showcase-shared.
Regenerate registry.json, demo-content.json, and starter-content.json.
- Remove @copilotkit/showcase-shared webpack alias from all 17 next.config.ts
- Remove @copilotkit/showcase-shared tsconfig paths from all 17 tsconfig.json
- Update all 17 manifest.yaml starter sections to point to showcase/starters/<slug>
with Sales Dashboard name, npx degit clone command, and Railway demo URLs
- Add OPENAI_BASE_URL/OPENAI_API_KEY env passthrough to all 17 playwright configs
for aimock-backed e2e testing
Replace shared-import demo pages across all 17 showcase packages with
the original self-contained implementations from git history. Each demo
is now fully readable in the Code tab with zero @copilotkit/showcase-shared
imports, no demonstrationCatalog, and no shared error boundaries.
9 demos x 17 packages = 153 page.tsx files reverted.
The smoke endpoint sent agentId "agentic-chat" (hyphen) but the
copilotkit route registers "agentic_chat" (underscore). The .NET
backend returns "Agent not found", failing the smoke check.
Same remaining_steps crash as langgraph-python — newer langgraph in
Docker requires remaining_steps in custom state schemas. Remove the
param to use the default schema.
Newer langgraph requires remaining_steps in state_schema. The custom
AgentState (adding todos field) doesn't include it, crashing the agent
at startup. Remove state_schema param — use default state.
The Docker image's langgraph version doesn't support the middleware
kwarg. This caused the agent to crash at startup, failing Railway's
healthcheck and preventing the new image from going live.
shared_frontend uses useAgentContext from @copilotkit/react-core which
may not be in the npm-published version. Docker builds install from npm,
not from the monorepo, so TypeScript fails on the missing export.
ignoreBuildErrors skips TS checking during next build.
shared_frontend imports @hashbrownai/core and @hashbrownai/react but
each package's Dockerfile installs deps from its own package.json.
Without these listed, npm install doesn't fetch them and the webpack
build fails with "Can't resolve '@hashbrownai/react'".
Lockfile was stale after rebase — hashbrown deps not in pnpm-lock.yaml.
Also applies oxfmt formatting and syncs next.config.ts webpack alias
with the simplified form from main.
Each package's 3 GenUI demo pages now include the RendererSelector pill toggle,
allowing users to switch between 4 active rendering strategies (json-render
falls back to tool-based until the Zod 4 isolated bundle is built).
The CI workflow's shared module copy step used trailing slashes on both
source and destination (cp -r src/ dest/src/), which on Linux copies the
*contents* into an already-created dest/src/ — resulting in
shared_frontend/src/src/ instead of shared_frontend/src/. Same issue
for shared_typescript/tools/.
Root cause confirmed via diagnostic instrumentation: index.ts existed at
the wrong depth, leaving the webpack alias target empty.
Fix: mkdir only the parent, cp without trailing slashes so the directory
itself is placed correctly. Also removes the diagnostic debug line from
pydantic-ai Dockerfile.
transpilePackages tries to find the package in node_modules first, which
fails in Docker builds even though tsconfig paths and shared_frontend/src
are correctly set up. Replace with an explicit webpack resolve alias that
points directly to the shared_frontend/src directory.
Each package wraps shared tools in its framework's idiom, demo pages import
from @copilotkit/showcase-shared via tsconfig paths. Comprehensive Playwright
e2e tests adapted per package (130+ test files).
Cross-cutting fixes: debug routes (/ok→/health), dead code removal,
error boundaries, thread safety, langroid adapter, claude-sdk-ts text emission.
The ConversableAgent defaults to human_input_mode="ALWAYS", which
prompts for user feedback after each response. In the showcase this
blocks with "Please give feedback to the sender..." instead of
executing tools.