Commit Graph

2900 Commits

Author SHA1 Message Date
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
Atai Barkai 463a72e6b2 feat(showcase/langgraph-python): port beautiful-chat frontend tree from 4084 canonical
Ports the full 28-file Beautiful Chat cell frontend tree (components, hooks,
A2UI declarative catalog, UI primitives, theme CSS) from the 4084 demos clone
into the unified 4085 showcase layout. Imports rewired to relative paths.
Provider wrappers (CopilotKit + ThemeProvider) moved from the canonical's
root layout.tsx into the cell's own page.tsx since 4085 has no per-cell
layout. runtimeUrl points to a dedicated `/api/copilotkit-beautiful-chat`
endpoint (wiring follow-up).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 12:49:07 -07:00
Jordan Ritter 2087950eea fix(showcase/starters): restore langgraph-{fastapi,typescript} agent subprocess (#4101)
## Summary

After #4099 both `starter-langgraph-fastapi` and
`starter-langgraph-typescript` returned `/api/health` =
`{"status":"degraded","agent":"down"}` on Railway. Three interlocking
regressions in `generate-starters.ts`:

- **Import rewrite was flat, not resolution-aware.** langgraph-fastapi's
`agent.py` lives at `<agentDir>/src/agent.py` and imports `.tools`, but
`tools/` lives at `<agentDir>/tools/` (one level up). Both the flat
`<agentDir>.tools` rewrite and the file-dir-based `<agentDir>.src.tools`
rewrite pointed at nonexistent paths. langgraph_cli crashed with
`ModuleNotFoundError: No module named 'src.agents.src.tools'` before
binding 8123.
- **langgraph-typescript root `package.json` missing agent deps.** The
TS Dockerfile deletes `agent/package.json` to collapse the ESM package
boundary, but there was no mechanism to lift the agent's runtime deps
(`@langchain/openai` et al.) into the root `package.json`. `npx
@langchain/langgraph-cli dev` died with `Cannot find module
'@langchain/openai'`.
- **`AGENT_LOG_PREFIX` was accidentally reverted** to `cmd 2>&1 | sed
…`. After a pipeline `$!` points at `sed`, so `kill -0 $AGENT_PID` /
`wait -n $AGENT_PID` monitor the prefixer, not the agent. `sed` also
line-buffers so crash output can be lost.

Fix all three in the generator and regenerate the two affected starters.
Committed starter entrypoint.sh files across the fleet are already on
`awk &> >(…)` (they were regenerated at some earlier point) — this PR
re-aligns the generator with their committed state, so future regens
stay consistent.

## Verification

- `docker build` + `docker run` on both starters locally:
- fastapi:
`{"status":"ok","integration":"langgraph-fastapi","agent":"ok"}`
- typescript:
`{"status":"ok","integration":"langgraph-typescript","agent":"ok"}`
- `entrypoint` logs show `Agent server started (PID: N)` with N
belonging to the agent, not an awk/sed prefixer.
- `pnpm test` in `showcase/scripts/`: 1075/1075 pass.
- `tsc --noEmit` on the generator: clean.
- No changes to `langgraph-python` output (resolution-aware rewriter is
a superset of the prior subdir-aware behavior when all imports already
resolve).

## Test plan

- [ ] Merge + wait for showcase deploy workflow to redeploy both
services
- [ ] `curl https://starter-langgraph-fastapi.up.railway.app/api/health`
returns `agent: "ok"`
- [ ] `curl
https://starter-langgraph-typescript.up.railway.app/api/health` returns
`agent: "ok"`
- [ ] Smoke-test a chat turn on each starter to confirm the agent
actually responds
2026-04-19 12:41:14 -07:00
Atai Barkai 1c340b5644 docs(showcase/langgraph-python): restore @region markers for docs snippets + port shared-state-streaming frontend
Regions were stripped during the initial port. Restore them verbatim
from the 4084 source so MDX snippet extraction continues to work:

- agentic-chat: provider-setup, configure-suggestions, render-chat
- agentic-chat-reasoning: reasoning-block-render
- frontend-tools: frontend-tool, frontend-tool-registration,
  frontend-tool-handler
- gen-ui-tool-based: bar-chart-renderer, pie-chart-renderer
- chat-customization-css (+ theme.css): theme-css-import, css-variables
- chat-slots: register-welcome-slot, register-disclaimer-slot,
  register-assistant-message-slot (with the named-locals pattern)
- prebuilt-sidebar: sidebar-basic-setup, sidebar-configuration
- prebuilt-popup: popup-basic-setup
- headless-simple: use-agent-simple, headless-hooks, message-list-simple
- interrupt_agent.py: backend-interrupt-tool

Also ports the shared-state-streaming frontend (page.tsx +
document-view.tsx), replacing the TODO stub. Includes the
frontend-use-coagent-state region marker.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 12:34:47 -07:00
Atai Barkai 853966b987 feat(showcase/langgraph-python): port subagents + headless-complete frontends + reset open-gen-ui minimal
- subagents: port 4084 delegation-log.tsx + page.tsx (reads
  agent.state.delegations, renders a live delegation log alongside
  CopilotChat). Drops the TODO stub that previously lived under
  demos/subagents/.
- headless-complete: port the full 4084 frontend — tool-renderers.tsx
  (useRenderTool for get_weather + get_stock_price, useComponent for
  highlight_note, useDefaultRenderTool catch-all), weather-card.tsx,
  stock-card.tsx, highlight-note.tsx, use-rendered-messages.tsx
  (manual render-tool-call / render-activity-message / render-custom-
  messages composition mirroring CopilotChatMessageView), plus chrome
  updates to assistant-bubble.tsx, user-bubble.tsx, message-list.tsx,
  page.tsx. Routed through /api/copilotkit-mcp-apps so the headless
  cell exercises Excalidraw MCP activity rendering too.
- open-gen-ui: reset to 4084's minimal version (plain <CopilotChat />
  against /api/copilotkit-ogui). Drops sandbox-functions.ts + suggestions.ts
  which belonged to open-gen-ui-advanced.

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