Commit Graph

3254 Commits

Author SHA1 Message Date
Atai Barkai 9a737b6c8d fix(showcase/langgraph-python): open-gen-ui-advanced sandbox-function bridge round-trip
The sandboxed iframe runs with `sandbox="allow-scripts"` only, so a
`<form>` with `<button type="submit">` had its submit blocked by the
browser BEFORE the onsubmit handler could call `e.preventDefault()` —
which meant `Websandbox.connection.remote.evaluateExpression(...)`
never fired. The agent also read `res.result` while the host handler
returns `{ ok, value }`.

Tightened the system prompt and per-suggestion prompts to explicitly
forbid `<form>` / `type="submit"` and to steer the LLM toward the
handler's exact return shape (`res.value` / `res.error`). Validated
end-to-end via Playwright: both `evaluateExpression` and `notifyHost`
now round-trip with visible results in the sandbox UI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:53:45 -07:00
Atai Barkai d8e9092e99 feat(showcase/langgraph-python): declarative-gen-ui — advertise PieChart + BarChart in a2ui_dynamic system prompt
The PieChart + BarChart renderers were added in 8be81821e as part of the
brand-polish pass, but the a2ui_dynamic agent's system prompt was still
only mentioning dashboards/status/KPIs. Expand the prompt to enumerate
the registered catalog (Card, StatusBadge, Metric, InfoRow, PrimaryButton,
PieChart, BarChart) and name when each chart fits — so the LLM reliably
reaches for PieChart on part-of-whole breakdowns and BarChart on
cross-category comparisons.

Validated on port 4100 with Playwright: "Show a pie chart of sales by
region" renders a brand-coloured donut with legend + percentages, and
"Render a bar chart of quarterly revenue" renders a polished Recharts bar
chart with tooltip. No "Unknown component" errors.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:50:54 -07:00
Atai Barkai a425ffc273 chore(showcase): regenerate registry after gen-ui-agent reorder 2026-04-19 20:50:18 -07:00
Atai Barkai 01b8d17578 refactor(showcase): move gen-ui-agent to bottom of Operational Generative UI
Reorders gen-ui-agent (Agentic Generative UI / In-Chat State Rendering)
to appear AFTER Reasoning (Default Render) in the Operational
Generative UI category, per user preference.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:50:11 -07:00
Atai Barkai 8be81821e2 refactor(showcase/langgraph-python): polish custom cell components to CopilotKit brand
Apply the verified CopilotKit brand palette (lilac #BEC2FF, mint #85ECCE,
near-black #010507, neutral greys) across every custom-defined component in
the langgraph-python cells. Replaces ad-hoc indigo/purple/amber/slate
Tailwind classes with brand tokens, softens corners (rounded-xl/2xl),
switches shadow-lg to shadow-sm, and normalises pill/label styling to
10-11px uppercase tracking-wider.

Preserves all component props, data-testid attributes, and @region markers.
Beautiful-chat (reference) is untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:38:36 -07:00
Atai Barkai bed8081340 chore(showcase): regenerate bundles after HITL row rename
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:32:53 -07:00
Atai Barkai 0cb9cd13ba refactor(showcase): rename In-Chat HITL rows to name the hook API
gen-ui-interrupt and hitl-in-chat both render an interactive time-picker
inline in the chat, but via different API layers:

- gen-ui-interrupt -> useInterrupt (low-level primitive)
- hitl-in-chat -> useHumanInTheLoop (ergonomic wrapper)

Rename to make the dashboard row label reflect the API distinction.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:32:23 -07:00
Atai Barkai 52b9b2012a docs(showcase/shell): custom-look-and-feel — CSS first, Slots (Subcomponents), align unselected tree
- Reorder meta.json so CSS is the first sub-page (easiest rung of the
  customization ladder), then Slots, Headless UI, Reasoning Messages.
- Retitle slots.mdx frontmatter to "Slots (Subcomponents)" so the sidebar
  nav reads the user-facing term people actually search for.
- css.mdx: demonstrate the new file+lines Snippet by pulling the
  user/assistant bubble block straight from the cell's theme.css.
- headless-ui.mdx: expand from a bare IntegrationGrid stub into a full
  page with minimal + complete examples, the three core hooks, and
  Snippet pulls from both headless-simple and headless-complete cells.
- Mirror the css/slots changes into unselected/custom-look-and-feel/ so
  the framework-agnostic tree stays in step (add css.mdx, reorder
  meta.json, retitle slots nav).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:30:53 -07:00
Atai Barkai 384a803935 docs(showcase/shell): prebuilt-components — customization spectrum + per-component sub-pages
- Rewrite overview to present the 4-level customization ladder (drop-in →
  CSS → slots → headless), with a 2x2 card grid linking out to each rung.
- Add a new chat.mdx sub-page for CopilotChat with intro, InlineDemo,
  the CopilotChat GIF, provider-setup snippet, and the standard code
  example from docs.copilotkit.ai.
- Reorder meta.json to chat → sidebar → popup.
- Add gif embeds to sidebar.mdx and popup.mdx (matching docs.copilotkit.ai).
- Point stale /prebuilt-components cross-links at the new
  /prebuilt-components/chat page.
- Align unselected/prebuilt-components.mdx with the ladder framing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:30:38 -07:00
Atai Barkai e01168e5ef feat(showcase/shell): add Snippet file+lines support for arbitrary-file inclusion
<Snippet> now supports a second lookup mode alongside the existing
region="..." marker: file="..." lines="A-B" pulls a line range (or
the whole file when lines is omitted) from any file in the cell's
bundled files[]. Region lookup wins when both are passed, preserving
all existing call sites.

Parses dash ("10-20"), en-dash, and single-line ("12") ranges.
Surfaces the same graceful WarningBox on missing files / bad ranges
as the region path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 20:30:24 -07:00
Atai Barkai 63a0c19de7 refactor(showcase/langgraph-python): gen-ui-agent as deep agent with explicit state + tool
Rewrites the gen-ui-agent demo as a minimal deepagents-powered agent that
defines its own `GenUiAgentState` schema (extending langchain's AgentState)
and exposes a custom `set_steps` tool. The tool returns Command(update=...)
to mutate the typed `steps: list[Step]` field, and a one-line middleware
registers the extended schema with deepagents. A last-wins reducer on
`steps` tolerates concurrent tool calls.

No StateGraph, no copilotkit_emit_state, no TodoListMiddleware - the pattern
mirrors how real applications extend deepagents with domain state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 17:02:21 -07:00
Atai Barkai a1ed347faa Merge remote-tracking branch 'origin/main' into atai/2026-04-18/feature-port-no-docker-restructure
# Conflicts:
#	showcase/scripts/__tests__/bundle-demo-content.test.ts
#	showcase/scripts/lib/manifest.ts
#	showcase/scripts/validate-parity.ts
2026-04-19 16:40:48 -07:00
Atai Barkai d32e780696 refactor(showcase/langgraph-python): rewrite reasoning agents as minimal deep agents
Replace the synthetic _ReasoningEmitterModel + hand-rolled StateGraph
scaffolding in reasoning_agent.py and tool_rendering_reasoning_chain_agent.py
with minimal create_deep_agent graphs (mirrors gen_ui_agent). Drops ~340
lines of custom graph wrappers / synthetic reasoning emitters while
keeping the four mock tools (get_weather, search_flights, get_stock_price,
roll_dice) intact for the tool-rendering-reasoning-chain cell.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:31:47 -07:00
Atai Barkai 4bc956346f fix(showcase): null out hallucinated docs-links entries (wrong framework, wrong shell path)
Prior 4085 port blindly copied 4084 docs-links.json patterns, producing many
entries that pointed at wrong-framework docs (e.g. crewai-crews → crewai-flows),
nonexistent shell paths (e.g. /claude-sdk-typescript/... prefix doubled into
/claude-sdk-typescript/claude-sdk-typescript/...), or the wrong field name
(mastra used `shell_docs_url` with absolute http://localhost:3000 URLs).

Audit against live docs.copilotkit.ai and the 4085 shell at :4010 surfaced:
- 9 og_docs_url 404s (8 on claude-sdk-typescript under a nonexistent
  /claude-sdk-typescript/* slug, 1 on /ag2/multi-agent/subagents)
- 24 shell_docs_path 404s (8 claude-sdk-typescript, 6 pydantic-ai, 4 strands,
  4 mastra, 2 langgraph-python)
- crewai-crews pointing entirely at /crewai-flows/... (different product)

Fix: point each entry at a real docs.copilotkit.ai page scoped to the correct
framework OR null it out; normalize shell_docs_path to leading-slash form
that composes with the DocsRow `${shellUrl}/${slug}/unselected${path}` scheme;
null google-adk shell paths (no google-adk-scoped shell docs exist, better to
show ✗ than mislead). Regenerated registry + docs-status bundles.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:11:52 -07:00
Atai Barkai dfaae83bcf refactor(showcase/langgraph-python): promote gen-ui-agent to primary via useCoAgentStateRender
- Backend: rewrite `gen_ui_agent.py` as a custom StateGraph that plans a
  3-5 step list via an LLM, then walks through pending->running->completed
  transitions for each step, publishing updates via copilotkit_emit_state.
  The planner LLM call uses copilotkit_customize_config(emit_messages=False)
  so its raw JSON plan never leaks into the chat transcript.
- Frontend: replace the v2 messageView.children + useAgent subscription
  with v1 useCoAgentStateRender from @copilotkit/react-core. The v1
  CopilotKit provider wraps v2 internally, so v2 CopilotChat still works
  inside it. The render prop receives {state, nodeName, status} and
  inlines an InlineAgentStateCard reading the agent's `steps` list.
- InlineAgentStateCard: refactor from a generic key/value dump to a
  proper stepwise tracker with per-step marker (pending number, running
  spinner, completed check) and completion headline.
- Registry: drop `kind: testing` from gen-ui-agent in feature-registry
  and polish its description to highlight the canonical pattern; also
  tighten the manifest.yaml demo description for the same reason.
- Regenerated showcase bundles (registry.json, demo-content.json,
  constraints.json) via `pnpm --filter @copilotkit/showcase-scripts run
  generate-registry && bundle-content`.

Validation (Playwright against localhost:4100/demos/gen-ui-agent):
- Initial: clean welcome screen + three suggestion pills.
- Mid-run: "Step 2 of 5" with first step checkmarked, second spinning,
  rest numbered -- planner JSON no longer leaking as raw text.
- Final: "All 5 steps complete" card + 1-2 sentence LLM summary.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:06:00 -07:00
Atai Barkai a84eaaadc9 fix(showcase/langgraph-python): a2ui-fixed-schema book button updates after click (per beautiful-chat)
Override the basic catalog's stateless Button with an ActionButton that
tracks a local `done` state, so clicking "Book flight" visually
transitions to a disabled "✓ Booked" confirmation. Mirrors the
beautiful-chat ActionButton pattern in
src/app/demos/beautiful-chat/declarative-generative-ui/renderers.tsx.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:04:08 -07:00
Atai Barkai 1935abd120 feat(showcase/langgraph-python): add Frontend Tools (Async) cell demonstrating async useFrontendTool handler
Introduces the "Frontend Tools (Async)" showcase cell — the async sibling
to the in-app-actions "Frontend Tools" cell. Demonstrates the canonical
async useFrontendTool pattern where the handler awaits a real client-side
async operation and RETURNS A RESULT the agent uses.

Concept: a simulated client-side "notes database" query. The frontend
registers a `query_notes` tool whose async handler sleeps 500ms (emulating
IndexedDB / localStorage / local-cache latency) then filters an in-browser
notes array by keyword and returns matching notes. The agent awaits the
result and summarizes matches for the user.

Files:
- src/agents/frontend_tools_async.py — helpful-assistant graph with no
  backend tools; system prompt instructs the model to call `query_notes`
  for note searches (schema is injected at runtime from the frontend via
  CopilotKitMiddleware)
- src/app/demos/frontend-tools-async/page.tsx — CopilotKit provider +
  CopilotChat, `useFrontendTool({ handler: async (...) => { await sleep;
  return matches; } })` + per-tool render hook that shows a branded
  NotesCard, `useConfigureSuggestions` with three prompts
- src/app/demos/frontend-tools-async/notes-card.tsx — emerald/teal
  gradient card listing matched notes with tag chips
- langgraph.json — register `frontend_tools_async` graph
- manifest.yaml — features list + demos entry
- feature-registry.json — expanded description + docs URLs point to the
  canonical /frontend-tools docs (shared with the sibling cell)
- constraints.yaml — added to all three generative_ui profiles
- docs-links.json — langgraph-python override pointing at /frontend-tools

Validated end-to-end: agent successfully calls `query_notes` with keywords
extracted from natural-language prompts, awaits the async handler, and
summarizes the returned notes for the user.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 16:00:02 -07:00
Atai Barkai 5596c0f08f chore(showcase): delete Frontend Tools (Sync) cell (tool-rendering-frontend-tools)
Removes the `tool-rendering-frontend-tools` cell which was rendering as
"Frontend Tools (Sync)" on the dashboard. Also removes the orphaned
`frontend-tools-sync` feature-registry entry (no package referenced it).
A replacement "Frontend Tools (Async)" cell lands in a follow-up commit.

- Delete demo: src/app/demos/tool-rendering-frontend-tools/ (page + weather-card)
- Delete agent: src/agents/tool_rendering_frontend_tools.py
- Remove from: feature-registry, constraints.yaml (all three generative_ui
  profiles), manifest.yaml (features + demos), langgraph.json (graph),
  docs-links.json

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:59:37 -07:00
Atai Barkai 2c10faef6b refactor(showcase): rename hitl-in-app to "(Frontend Tools + async HITL)"
Clarify the positioning of the In-App Human in the Loop cell. The old
label was ambiguous with the in-chat variant; the new label surfaces
the core technical story at-a-glance: this is the async useFrontendTool
pattern where the approval UI pops up OUTSIDE the chat surface.

Also register the cell in the langgraph-python manifest (features list
+ demos entry pointing to the new files).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:58:33 -07:00
Atai Barkai 41fe1eb2e6 feat(showcase/langgraph-python): add hitl-in-app cell — async frontend-tool HITL with in-app popup
Introduces the "In-App Human in the Loop" cell, demonstrating the
canonical async useFrontendTool HITL pattern where the approval UI
lives OUTSIDE the chat surface.

Flow:
- Agent calls `request_user_approval` (frontend-registered)
- The async handler returns a Promise and stashes its `resolve` in
  component state
- An app-level modal dialog (portal'd to <body>, grid-sibling of
  CopilotChat — NOT inside the chat bubble tree) opens with the
  agent's message + optional context
- User clicks Approve / Reject (with optional note) → completion
  callback fires `resolve({ approved, reason })`
- Handler returns the value to the agent, which continues based on
  approval outcome

Files:
- src/agents/hitl_in_app.py — support-ops agent with tools=[] and a
  system prompt that requires calling `request_user_approval` before
  any customer-affecting action
- src/app/demos/hitl-in-app/page.tsx — layout (support-inbox panel +
  CopilotChat + app-level modal), frontend-tool registration,
  resolve-capture pattern, suggestions
- src/app/demos/hitl-in-app/approval-dialog.tsx — modal (createPortal
  to document.body) with Approve/Reject + optional reason textarea
- langgraph.json — register `hitl_in_app` graph

Starter mirror auto-generated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:56:21 -07:00
Atai Barkai 3653ff81fa feat(showcase/shell-internal): add per-column Red/Green status tally to Feature Matrix headers
Adds a compact ✓N · ✗M tally directly under each integration's name + language
sublabel in the Feature Matrix dashboard header. The tally aggregates the same
binary signals each cell already renders (docs-og, docs-shell, E2E, Smoke,
health) using DocsRow / CellStatus's resolution rules — including per-column
docs-links overrides — so the totals stay consistent with what's visible in
the body. QA age and ?/unknown/stale signals are intentionally skipped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:55:06 -07:00
Atai Barkai 8034be2c1f fix(showcase/langgraph-python): wire declarative-gen-ui + a2ui-fixed-schema using beautiful-chat pattern
Port the working beautiful-chat A2UI topology to the standalone A2UI cells.
Both previously mounted on the main /api/copilotkit with `injectA2UITool: true`,
which left the dynamic cell blank (no rendered surface) and crashed the
fixed-schema cell with React error #31 on unresolved `{ path }` bindings.

- Split each cell onto its own runtime endpoint
  (/api/copilotkit-declarative-gen-ui, /api/copilotkit-a2ui-fixed-schema),
  each with `a2ui.injectA2UITool: false`, mirroring beautiful-chat and the
  canonical examples/integrations/langgraph-python reference
- Rewrite src/agents/a2ui_dynamic.py to own an explicit `generate_a2ui`
  tool that binds `render_a2ui` via a secondary LLM (beautiful-chat pattern)
- Fix a2ui-fixed-schema catalog definitions to use a `DynString` union
  (string | { path: string }) so the GenericBinder resolves path bindings
  before handing props to renderers
- Drop the scoped `a2ui: { injectA2UITool: true, agents: [...] }` block
  from the main /api/copilotkit route since both cells now own their own
  runtimes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:54:06 -07:00
Atai Barkai 3d16f0e85b refactor(showcase): rename open-gen-ui-advanced to emphasize frontend function calling
The advanced variant's distinguishing feature is that the agent-authored,
sandboxed UI can invoke frontend-registered sandbox functions via
Websandbox.connection.remote.<name>(args). The old label "(Advanced)"
did not convey this. Rename to "Open-Ended Gen UI (Advanced: with
frontend function calling)" in both the feature registry and the
langgraph-python manifest, and update descriptions to match. The id
stays `open-gen-ui-advanced` so URLs remain stable.

Regenerate derived bundles (registry.json, demo-content.json,
docs-status.json).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:47:46 -07:00
Atai Barkai a04d8b04a4 fix(showcase/langgraph-python): wire open-gen-ui + advanced using beautiful-chat pattern
Replace the hardcoded copilotkit_manually_emit_tool_call stubs with
proper LLM-driven agents (create_agent + CopilotKitMiddleware) matching
the beautiful-chat reference. The runtime's openGenerativeUI flag
auto-registers generateSandboxedUi as a frontend tool; the middleware
merges it into the agent's tool list, so the LLM can generate real,
user-specific sandboxed UIs instead of emitting a canned "Hello!" card.

For the advanced cell, strengthen the sandbox-function bridge: swap the
trivial notifyHost for an evaluateExpression function that the UI
visibly round-trips via Websandbox.connection.remote, and update the
suggestion prompts to explicitly exercise the bridge.

Also wire starter suggestions on the minimal cell so users have a
one-click entry point.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:47:18 -07:00
Atai Barkai 8cef57aacb fix(showcase/langgraph-python): wire useFrontendTool render for final tool state
The `tool-rendering-frontend-tools` cell rendered its WeatherCard stuck at
the `--° F` / `--%` / `-- mph` placeholders even after the tool completed
and the chat text showed the real values. `useFrontendTool`'s render
callback receives `result` as a JSON-stringified string (core's run-handler
`JSON.stringify`s any non-string handler return before delivery), but the
render was just type-casting the string to an object — so every
`parsed.temperature` / `parsed.humidity` / `parsed.wind_speed` read was
`undefined` and each field fell through to the `??"--"` placeholder.

Parse `result` via a `parseJsonResult` helper (mirroring the primary
`tool-rendering` cell) so `status === "complete"` actually populates the
card with the handler's real values.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:45:24 -07:00
Atai Barkai 7cb19385b6 chore(showcase): delete declarative-gen-ui-hardcoded testing cell
The "Declarative Generative UI (A2UI — Custom Catalog)" single-file
prototype variant was a testing-only companion to the canonical
declarative-gen-ui 3-file BYOC pattern. Drop it everywhere:

- Delete src/app/demos/declarative-gen-ui-hardcoded/ cell directory
- Delete src/agents/a2ui_dynamic_hardcoded.py
- Remove from langgraph-python manifest.yaml (features + demos) and
  langgraph.json graphs
- Remove from docs-links.json, route.ts (agent entry + a2ui agents
  list), shared/feature-registry.json, shared/constraints.yaml
- Drop the Callout promoting it from a2ui/dynamic-schema.mdx
- Bump expected langgraph-python count 32 → 31 in generate-registry
  test; regenerate all bundles

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:33:43 -07:00
Atai Barkai 1b9b7ab0e6 chore(showcase): remove redundant prebuilt-chat row
Pre-Built: Chat was redundant with Pre-Built: CopilotChat — both rows
referred to the same CopilotChat surface with slightly different
framing. Drop prebuilt-chat everywhere:

- Delete src/app/demos/prebuilt-chat/ cell directory
- Remove from langgraph-python manifest.yaml features + demos
- Remove from shared/feature-registry.json features + chat-ui allowlist
- Remove from shared/constraints.yaml constrained-explicit
- Remove from src/app/api/copilotkit/route.ts neutral-fallthrough list
- Update expected counts in bundle-demo-content + generate-registry
  tests (langgraph now exposes 32 features, down from 33)
- Fix stale src/agents/main.py test expectation to
  src/agents/agentic_chat.py (main.py was split into a neutral assistant
  by an earlier Phase-1 fix commit)
- Regenerate shell/src/data/{registry,constraints,demo-content,
  docs-status}.json

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:22:51 -07:00
Atai Barkai 8f51a4ecf1 chore(showcase): regenerate demo-content bundle after highlight slim
Regenerated via `pnpm --filter @copilotkit/showcase-scripts run bundle-content`
after trimming the `highlight:` lists on langgraph-python cells so the
"show all files" toggle in the code viewer exposes materially more files
than the default "core" view.

Spot-check (core / all):
  beautiful-chat               9 / 31
  headless-complete            5 / 13
  tool-rendering               5 / 7
  tool-rendering-reasoning-chain  5 / 7
  chat-slots                   4 / 6
  gen-ui-tool-based            4 / 5
  open-gen-ui-advanced         4 / 5

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:14:28 -07:00
Atai Barkai f9b09cb225 chore(showcase/langgraph-python): slim manifest highlight lists to true pedagogical core
Previously the `highlight:` list on many cells had been expanded to include
nearly every file in the demo folder — which made the code viewer's
"show all files" toggle meaningless because the default "core" view already
contained everything.

Reduce each large cell's highlight list to the pedagogically-core files
(page.tsx, main backend agent .py, the cell-specific runtime route, plus
1-2 signature named components) while leaving the rest of the demo folder
to show up in the "show all" view:

- beautiful-chat: 32/33 -> 9/31 (dropped ui/* primitives, theme css,
  lib/utils, hooks/index, use-theme, secondary canvas/layout pieces,
  todo-column/list, charts/config, meeting-time-picker, headless-chat,
  tool-rendering, declarative-generative-ui, + db.csv and schema json)
- headless-complete: 13/13 -> 5/13 (dropped per-role bubbles, cards,
  input-bar, typing-indicator, tool-renderers, highlight-note, weather/
  stock cards — they stay bundled as they sit in the demo folder)
- tool-rendering: 6/7 -> 5/7 (dropped custom-catchall-renderer)
- tool-rendering-reasoning-chain: 7/7 -> 5/7 (dropped reasoning-block and
  custom-catchall-renderer)
- chat-slots: 6/6 -> 4/6 (dropped custom-assistant-message and
  custom-disclaimer)
- gen-ui-tool-based: 5/5 -> 4/5 (dropped pie-chart)
- open-gen-ui-advanced: 5/5 -> 4/5 (dropped suggestions.ts)

Cells where every file is genuinely core (declarative-gen-ui 6/6,
a2ui-fixed-schema 8/8, shared-state-read-write 5/5, subagents 4/4) and
small cells (3-4 files) are untouched — task brief called these out as
acceptable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:14:16 -07:00
Atai Barkai 614927a809 chore(showcase): regenerate demo-content bundle after highlight expansion
Re-runs `pnpm --filter @copilotkit/showcase-scripts run bundle-content`
to repopulate `showcase/shell/src/data/demo-content.json` with the
expanded `highlight:` file lists from the previous commit. Affects only
`langgraph-python::*` entries; all other framework demos are unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:52:17 -07:00
Atai Barkai a951d9030c chore(showcase/langgraph-python): expand manifest highlight lists to include all relevant cell files
The langgraph-python manifest's `highlight:` lists were skimpy — most cells
listed only `page.tsx` even when the cell pulled in supporting components,
hooks, A2UI catalog files, dedicated runtime routes, or split per-cell agent
graphs. The code-viewer's left file tree at
`/integrations/langgraph-python/<cell>/code` therefore showed users a single
file when the actual relevant code lived across 5–30 files.

This commit walks every cell in the manifest and rebuilds each `highlight:`
list to cover:

- All `.tsx`/`.ts` files in `src/app/demos/<cell>/**` (recursively)
- The actual backend agent `.py` file (e.g. `agentic_chat.py`,
  `hitl_in_chat_agent.py`, `tool_rendering_frontend_tools.py`,
  `headless_complete.py`) — many cells were pointing at `main.py` even
  though they have their own dedicated graph
- The runtime `route.ts` the cell registers against
  (`copilotkit`, `copilotkit-ogui`, `copilotkit-mcp-apps`, or
  `copilotkit-beautiful-chat`)
- A2UI/data assets where applicable (`a2ui_schemas/*.json`,
  `beautiful_chat_data/*`)

The flagship `beautiful-chat` cell now surfaces all 32 supporting files
(components/example-canvas/*, components/example-layout/*,
components/generative-ui/*, components/ui/*, hooks/*, lib/*,
declarative-generative-ui/*, etc.) plus the backend agent + dedicated
runtime route.

No source code is touched — only the manifest's `highlight:` references.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:51:56 -07:00
Atai Barkai 39740ac135 fix(showcase/shell): kill per-line gray rectangles in code viewer
The oneLight SyntaxHighlighter theme sets a near-white background on
both <pre> and the inner <code>. customStyle overrides the <pre>, but
the <code> child keeps its own background — and since <code> renders
inline, that bg hugs each line of text and shows as a pale per-line
rectangle against the dark page chrome, making untouched code look
like it's text-selected. Unset the <code> background so the chosen
<pre> background reads as a flat block.

Same fix 4084 already landed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:50:04 -07:00
Atai Barkai 9733146552 fix(showcase/shell): redirect /<framework>/unselected/<path> → /<framework>/<path>
A framework-scoped URL asserting "unselected" in its path is
incoherent — you can't be both on langgraph-python AND in the
no-framework state. Collapse the redundant segment: if the framework
catch-all receives a slug that starts with unselected/, permanent-
redirect to the same path without that prefix (the framework-scoped
version serves the same content, just with Snippets resolved against
the selected framework's cells).

/docs/unselected/<path> remains a valid framework-agnostic URL.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:32:28 -07:00
Atai Barkai 6751bce773 refactor(showcase/shell): rename docs/built-in-agent → docs/unselected
The /built-in-agent/<page> URL prefix in 4085's docs was a holdover from
an early misnomer in the original 4084 work. 4084 has since renamed the
content directory to unselected/ to reflect what the route actually is:
the no-framework / "no agentic backend selected" docs view. "Built-in
Agent" is reserved for an upcoming integration COLUMN in the showcase
matrix and shouldn't share a name with this docs route.

- Rename content/docs/built-in-agent/ → content/docs/unselected/
- Update docs-render.tsx subpath fallback (built-in-agent/ → unselected/)
- Update seo-redirects.ts wildcards
- Update internal MDX link references in learn/, backend/, faq.mdx,
  meta.json, snippets/shared/

The integrations/built-in-agent/ legacy directory is preserved
unchanged (it's a separate concept).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:29:42 -07:00
Atai Barkai 66c917b592 docs(showcase/shell): merge 4084 code examples into prebuilt-components
The built-in-agent tree exists only in 4085, but 4084's top-level
prebuilt-components.mdx had richer content (per-variant code examples
for CopilotChat/Sidebar/Popup with labels, customization block with
slot props, Setup section). Merge those into the 4085 page while
keeping its modern Snippet-based provider-setup + suggestions pulls
from the live cell.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:16:33 -07:00
Atai Barkai d40907e050 chore(showcase): regenerate demo-content bundle after region additions
Bundler picks up the new region markers plus the extended manifest
highlights — each of the 7 affected docs pages (subagents,
shared-state-streaming, open-generative-ui, mcp-apps, a2ui dynamic and
built-in) now resolves its <Snippet> tags to a real region.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:15:54 -07:00
Atai Barkai bbf0b4888a feat(showcase/langgraph-python): add region markers for docs snippets
Wraps unified-runtime config blocks with @region[runtime-inject-tool],
@region[minimal-runtime-flag], and @region[advanced-runtime-config] so
the A2UI dynamic-schema, open-generative-ui, and built-in a2ui docs pages
resolve their <Snippet> tags.

Also extends manifest highlights for subagents, shared-state-streaming,
declarative-gen-ui, mcp-apps, open-gen-ui, and open-gen-ui-advanced so
the bundler scans the agent + route.ts files holding these regions.
Subagents and shared-state-streaming highlights previously pointed at
src/agents/main.py even though the graph lives in dedicated files,
hiding the subagent-setup, supervisor-delegation-tools, and
state-streaming-middleware regions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:14:25 -07:00
Atai Barkai 6a01eadcb3 chore(showcase/shell-internal): wire probe-docs into predev+build
Matches 4084's script topology so docs-status.json and the demo-content
bundle refresh automatically on every dev start and build. Previously
required manual invocation of the scripts after the docs-links pipeline
port.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:11:27 -07:00
Atai Barkai feb0882cf8 chore(showcase): regenerate registry + docs-status bundles
Regenerates shell/src/data/registry.json and shell/src/data/docs-status.json
after the docs-links pipeline port so the shell-internal dashboard picks up
per-column docs overrides and live probe state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:10:19 -07:00
Atai Barkai dc9811b1b7 feat(showcase/scripts): port probe-docs.ts for live docs-status checks
Ports probe-docs.ts from 4084. For each entry in shared/feature-registry.json
it HEADs the feature's og_docs_url and checks whether a matching .mdx exists
under shell/src/content/docs/<shell_docs_url>, then writes the results to
shell/src/data/docs-status.json. shell-internal's DocsRow falls back to this
probed state for (integration, feature) cells that don't have a per-column
docs-links.json override. Exposes the script as `probe-docs` in
showcase/scripts/package.json.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:10:06 -07:00
Atai Barkai 0df1d23cf4 feat(showcase/scripts): port loadDocsLinks() into generate-registry
Ports the loadDocsLinks() helper from 4084 into generate-registry.ts. After
schema validation, each integration gets a docs_links field merged in from its
sibling packages/<slug>/docs-links.json (best-effort: missing file or stale
shell_docs_url shape is tolerated). The shell-internal DocsRow reads this via
integration.docs_links.features[<id>] to prefer curated per-column overrides
over the per-feature defaults.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:09:55 -07:00
Atai Barkai aa93004208 chore(showcase): port docs-links.json files from 4084 (per-column overrides)
Ports 16 per-package docs-links.json files (one per integration column) from
4084. These provide per-(integration, feature) curated docs overrides that the
shell-internal DocsRow component reads via `integration.docs_links.features[id]`
to render ✓ instead of ✗ in the docs-og/docs-shell badge columns. Consumed by
the loadDocsLinks() helper in generate-registry.ts which merges them into the
shell's registry.json bundle.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:09:15 -07:00
Atai Barkai 72e3170969 chore(showcase/shell-internal): sync DocsRow + Integration.docs_links with 4084
Ports 4084's per-column docs link overrides into shell-internal:
- DocsRow now reads integration.docs_links.features[id] with fallback to
  feature.og_docs_url; shell URLs are built from shell_docs_path via
  ${shellUrl}/${slug}/unselected${path}.
- Integration interface gets optional docs_links map (sourced from
  packages/<slug>/docs-links.json once the 4085 registry bundler wires
  it up; falls through gracefully until then).
- a:hover underline restored in globals.css to match 4084.

No runtime behavior change in 4085 yet since docs_links is absent from
the registry bundle; once the bundler pipeline catches up, per-column
overrides will light up the docs-og/docs-shell links automatically.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:03:02 -07:00
Atai Barkai f8ceb9ac4f chore(showcase): regenerate data bundles after registry sync
Rerun generate-registry + bundle-content so shell/src/data/*.json reflects
the prebuilt-chat feature addition and the langgraph-python manifest
copy-alignment.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:02:52 -07:00
Atai Barkai 6e8a58604b chore(showcase/langgraph-python): sync manifest.yaml with 4084 demo+feature lists
Align demo-row display names, descriptions, and tag sets with 4084 so the
shell surfaces matching copy across the two workspaces. Preserves 4085-
specific divergences (single-container src/agents + src/app/demos highlight
paths, per-demo routes, cli-start command field, prebuilt-chat row).
2026-04-19 14:02:33 -07:00
Atai Barkai ff6dd2eed5 chore(showcase): sync feature-registry + constraints with 4084
- Add prebuilt-chat feature to the registry and constrained-explicit
  allowlist so the 4085 manifest's intentional prebuilt-chat wiring
  validates cleanly (4084 omits it; 4085 committed the cell earlier)
- Bump expected langgraph-python feature count in generate-registry
  test from 32 to 33 to reflect the new row

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 14:01:48 -07:00
Atai Barkai 111e077620 fix(showcase/langgraph-python): beautiful-chat runtime protocol + default agent alias
Two small wiring fixes discovered during smoke testing:

1. Drop `useSingleEndpoint={false}` from the `<CopilotKit>` provider.
   The canonical reference sets this to opt into the v2 multi-endpoint
   protocol (GET /info + POST /agent/{name}/connect) which requires a
   Hono-based endpoint via `createCopilotEndpoint`. 4085 uses
   `copilotRuntimeNextJSAppRouterEndpoint` (single POST), matching every
   other cell in this package. Without this change the client 404s on
   /agent/beautiful-chat/connect.

2. Alias the `default` agent to the same graph in the route's agents map.
   `ExampleCanvas` and `HeadlessChat` call `useAgent()` with no args, which
   resolves to agentId "default". Previously this threw "Agent 'default'
   not found after runtime sync". Aliasing matches the canonical's
   `agents: { default: defaultAgent }` shape.

Smoke-tested: Pie Chart pill click now renders a real styled doughnut chart
from query_data + controlled generative UI; zero console / page errors.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 13:15:29 -07:00
Atai Barkai a66d8d2d0c fix(showcase/langgraph-python): beautiful-chat missing deps + showcase.json path
- Add `@radix-ui/react-checkbox` and `@radix-ui/react-separator` to
  package.json (ported frontend's ui/checkbox.tsx + ui/separator.tsx import
  these; the showcase package didn't pin them yet).
- Place `showcase.json` inside the cell directory (where it semantically
  belongs — the canonical had it at the project root alongside `src/hooks/`
  at depth 2, so `../../showcase.json` resolved to the root; in 4085 the
  hooks live two levels deeper, so we colocate the tiny config with the
  cell and adjust the import path to `../showcase.json`).

Without these, `next build` errors with "Module not found: Can't resolve
'@radix-ui/react-checkbox'" and "Can't resolve '../../showcase.json'".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 13:05:10 -07:00
Jordan Ritter 55b1445f9d chore(showcase/starters): regenerate to pick up #4101 tool-import + entrypoint fixes
PR #4101 updated both the resolution-aware import rewriter and the
entrypoint `$!` -> agent PID fix, but the regeneration in the merged
commit didn't include all affected files. `origin/main` at 2087950ee
still contained:

- langgraph-fastapi + langgraph-python: `src/agents/tools/*.py` importing
  `from src.agents.types`, `from src.agents.get_weather`, etc. — the
  old flat-rewrite output, which crashes with
  `ModuleNotFoundError: No module named 'src.agents.types'` at agent
  import time. langgraph-fastapi on Railway was failing its health probe
  with `agent: down` for this reason.
- All 15 generated entrypoint.sh files still had the old
  `2>&1 | sed 's/^/[agent] /' &` pattern, meaning `$!` pointed at `sed`
  instead of the agent subprocess. Every `kill -0 $AGENT_PID` /
  `wait -n` check was monitoring the wrong process, and Python crash
  output was also line-buffered inside the pipe so tracebacks never hit
  the container log.

Re-running `pnpm -C showcase/scripts generate-starters` with #4101's
resolution-aware rewriter produces the correct `src.agents.tools.*`
imports for both langgraph starters and the intended
`&> >(awk '{print "[agent] " $0; fflush()}')` process-substitution form
for every entrypoint.sh. No generator changes — purely regenerated
output catching up to the script that's already on main.
2026-04-19 12:59:49 -07:00
Atai Barkai 9f15e66b2a feat(showcase/langgraph-python): add beautiful-chat backend graph + data + wiring
Inlines the canonical starter's agent/main.py + agent/src/{todos,query,
a2ui_fixed_schema,a2ui_dynamic_schema}.py into a single `beautiful_chat.py`
graph (same shape as the 4084 clone), registers it in langgraph.json, and
colocates its data files (db.csv + flight schema JSON) under
`beautiful_chat_data/` so the shared `a2ui_schemas/` dir stays owned by
a2ui_fixed.py.

Adds a dedicated `/api/copilotkit-beautiful-chat` runtime endpoint that
mirrors the canonical's combined config (openGenerativeUI: true,
a2ui.injectA2UITool: false, mcpApps) — scoped to this one cell so the other
cells on `/api/copilotkit` keep their isolated per-demo `useFrontendTool` /
`useComponent` registrations. Removes `beautiful-chat` from the main route's
neutral-assistant fallthrough list now that it has a dedicated graph.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 12:49:28 -07:00