mirror of
https://github.com/CopilotKit/CopilotKit.git
synced 2026-09-14 16:26:20 +08:00
ebad989855
Cross-cutting changes that don't belong with any one demo: manifest + landing-page tags, runtime route adjustments, e2e + QA notes that follow the demo renames, and a few small cleanups. Manifest (manifest.yaml + src/app/page.tsx tag labels): - Naming convention: every demo uses `Thing: Subthing` (Generative UI: Tool Rendering - Default / Custom Default / Specific; Open Generative UI: Default / Advanced; Shared State: Streaming / Read + Write; Reasoning: Default / Custom; Frontend Tools: In-App Actions / Async; Human in the Loop: In-chat / In-App / Interrupt based; Chat Customization: CSS / Slots; Headless UI: Simple / Complete). - Retags: Auth → `platform`; HITL Step Selection + Interrupt-based → `interactivity`; Reasoning Default + Custom → `chat-ui`; Generative UI: Tools → `generative-ui`. - Renames: Readonly State (Agent Context) → Frontend Context Sharing. - HITL slot points at /demos/hitl-in-chat (working useHumanInTheLoop+interrupt path) instead of the previous /demos/hitl that had no backend `interrupt()` calls. - Highlight paths corrected for the rebuilt headless demos (root-level paths replaced with hooks/, chat/, tools/, attachments/ subdirs). - Descriptions rewritten where they had drifted from the implementation (gen-ui-agent: dropped useCoAgentStateRender claim; headless-simple: shadcn primitives, not raw Tailwind; headless-complete: enumerates the actual hooks wired). Runtime / route: - src/app/api/copilotkit/route.ts — 30 agents registered (incl. the reasoning-custom rename from agentic-chat-reasoning). - copilotkit-mcp-apps/route.ts replaced with [[...slug]]/route.ts so v2 subpath POSTs (/v2/agent/run) resolve. - src/app/api/copilotkit-voice/[[...slug]]/route.ts — env var standardized (was `AGENT_URL || LANGGRAPH_DEPLOYMENT_URL`, now matches the rest of the showcase with just LANGGRAPH_DEPLOYMENT_URL); trailing `/` removed from deploymentUrl. Tests / QA: - e2e specs renamed and paths updated for the demo renames. - qa notes for a2ui-fixed-schema (booked-state checklist removed) and byoc-json-render (Wave 4a residue removed). - docs-links.json key renamed for reasoning-custom. Cleanup: - Removed remaining stub agent.py files in demo dirs (real graphs in src/agents/); removed dead beautiful-chat/components/headless-chat.tsx (zero importers); removed [A2UI-DEBUG] / [A2UI-RESPONSE] print statements from beautiful_chat.py; gpt-5.4-mini → gpt-5-mini typo fix in beautiful_chat.py:249 (would have 4xx'd every model call); stripped iframe-restriction LLM-prompt copy bleed from open-gen-ui-advanced suggestion titles. The convention pass that ran across ~28 demos earlier in this branch is already reflected in their per-demo commits — every page.tsx reads as imports + provider + suggestions hook + JSX, with `useConfigureSuggestions` extracted to a sibling suggestions.ts.
81 lines
2.7 KiB
TypeScript
81 lines
2.7 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
|
|
/**
|
|
* E2E spec for BYOC json-render — authored in Wave 4b but NOT yet run
|
|
* against Railway. The Playwright pass is deferred to post-deploy
|
|
* stabilization (see `docs/superpowers/plans/2026-04-23-wave4b-byoc-json-render-demo.md`
|
|
* Task 12 scope note).
|
|
*
|
|
* Structurally mirrors `gen-ui-tool-based.spec.ts` so the agent
|
|
* dashboard's BYOC rows exercise the same surfaces.
|
|
*/
|
|
test.describe("BYOC json-render", () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.goto("/demos/byoc-json-render");
|
|
});
|
|
|
|
test("page loads with chat composer and suggestion pills", async ({
|
|
page,
|
|
}) => {
|
|
// Chat composer
|
|
await expect(
|
|
page.locator('textarea, [placeholder*="message"]').first(),
|
|
).toBeVisible({ timeout: 10000 });
|
|
|
|
// Suggestion pills driven by useConfigureSuggestions. The
|
|
// CopilotChat welcome screen renders titles as buttons/links.
|
|
await expect(page.getByText("Sales dashboard")).toBeVisible({
|
|
timeout: 10000,
|
|
});
|
|
await expect(page.getByText("Revenue by category")).toBeVisible();
|
|
await expect(page.getByText("Expense trend")).toBeVisible();
|
|
});
|
|
|
|
test("sales dashboard request renders a json-render tree", async ({
|
|
page,
|
|
}) => {
|
|
const input = page.locator('textarea, [placeholder*="message"]').first();
|
|
await input.fill(
|
|
"Show me the sales dashboard with metrics and a revenue chart",
|
|
);
|
|
await input.press("Enter");
|
|
|
|
// The JsonRenderAssistantMessage slot wraps renders in this testid.
|
|
await expect(
|
|
page.locator('[data-testid="json-render-root"]').first(),
|
|
).toBeVisible({ timeout: 60000 });
|
|
|
|
// A MetricCard should appear in the rendered tree.
|
|
await expect(
|
|
page.locator('[data-testid="metric-card"]').first(),
|
|
).toBeVisible({ timeout: 60000 });
|
|
|
|
// ...plus at least one chart (either shape).
|
|
await expect(
|
|
page
|
|
.locator('[data-testid="bar-chart"], [data-testid="pie-chart"]')
|
|
.first(),
|
|
).toBeVisible({ timeout: 60000 });
|
|
});
|
|
|
|
test("revenue-by-category request renders a pie chart", async ({ page }) => {
|
|
const input = page.locator('textarea, [placeholder*="message"]').first();
|
|
await input.fill("Break down revenue by category as a pie chart");
|
|
await input.press("Enter");
|
|
|
|
await expect(page.locator('[data-testid="pie-chart"]').first()).toBeVisible(
|
|
{ timeout: 60000 },
|
|
);
|
|
});
|
|
|
|
test("expense-trend request renders a bar chart", async ({ page }) => {
|
|
const input = page.locator('textarea, [placeholder*="message"]').first();
|
|
await input.fill("Show me monthly expenses as a bar chart");
|
|
await input.press("Enter");
|
|
|
|
await expect(page.locator('[data-testid="bar-chart"]').first()).toBeVisible(
|
|
{ timeout: 60000 },
|
|
);
|
|
});
|
|
});
|