@yourgpt/copilot-sdk 2.1.8 → 2.1.9-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ISOMZAYN.js → chunk-RBULQ6EJ.js} +207 -62
- package/dist/chunk-RBULQ6EJ.js.map +1 -0
- package/dist/chunk-RPR5GMWF.js +52 -0
- package/dist/chunk-RPR5GMWF.js.map +1 -0
- package/dist/{chunk-IDAQU3FP.cjs → chunk-TD7NF6OE.cjs} +207 -62
- package/dist/chunk-TD7NF6OE.cjs.map +1 -0
- package/dist/{chunk-JFVTY757.cjs → chunk-WYFJZNFT.cjs} +16 -16
- package/dist/{chunk-JFVTY757.cjs.map → chunk-WYFJZNFT.cjs.map} +1 -1
- package/dist/{chunk-H3LX6FTP.js → chunk-XVKKLLKW.js} +3 -3
- package/dist/{chunk-H3LX6FTP.js.map → chunk-XVKKLLKW.js.map} +1 -1
- package/dist/chunk-YBLAHX2Z.cjs +55 -0
- package/dist/chunk-YBLAHX2Z.cjs.map +1 -0
- package/dist/experimental/index.cjs +416 -536
- package/dist/experimental/index.cjs.map +1 -1
- package/dist/experimental/index.d.cts +189 -853
- package/dist/experimental/index.d.ts +189 -853
- package/dist/experimental/index.js +415 -530
- package/dist/experimental/index.js.map +1 -1
- package/dist/react/index.cjs +62 -62
- package/dist/react/index.d.cts +18 -0
- package/dist/react/index.d.ts +18 -0
- package/dist/react/index.js +2 -2
- package/dist/ui/index.cjs +521 -263
- package/dist/ui/index.cjs.map +1 -1
- package/dist/ui/index.js +352 -94
- package/dist/ui/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/chunk-5EGBIQYS.cjs +0 -292
- package/dist/chunk-5EGBIQYS.cjs.map +0 -1
- package/dist/chunk-IDAQU3FP.cjs.map +0 -1
- package/dist/chunk-ISOMZAYN.js.map +0 -1
- package/dist/chunk-TXQ37MAO.js +0 -287
- package/dist/chunk-TXQ37MAO.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/experimental/generativeUITool.ts","../../src/experimental/renderers/HtmlRenderer.tsx","../../src/experimental/renderers/TableRenderer.tsx","../../src/experimental/renderers/StatRenderer.tsx","../../src/experimental/renderers/CardRenderer.tsx","../../src/experimental/types.ts","../../src/experimental/useGenerativeUI.tsx"],"names":["jsxs","cn","jsx","React","z","React2","useTool","DotsLoader"],"mappings":"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","file":"index.cjs","sourcesContent":["// Flat JSON schema — GenerativeUIPayloadSchema is used only in the client handler for validation — same structure as RENDER_UI_SCHEMA in useGenerativeUI.\n// Flat object schemas with a discriminator field work reliably across all LLMs.\nexport const RENDER_UI_PARAMETERS = {\n type: \"object\" as const,\n properties: {\n type: {\n type: \"string\" as const,\n enum: [\"html\", \"chart\", \"table\", \"stat\", \"card\"],\n description: \"UI component type to render\",\n },\n html: {\n type: \"string\" as const,\n description: \"Raw HTML with Tailwind classes (type=html)\",\n },\n height: { type: \"string\" as const },\n chartType: {\n type: \"string\" as const,\n enum: [\"bar\", \"line\", \"pie\", \"area\", \"scatter\"],\n description: \"Chart variant (type=chart)\",\n },\n labels: {\n type: \"array\" as const,\n items: { type: \"string\" as const },\n description: \"X-axis category labels (type=chart)\",\n },\n datasets: {\n type: \"array\" as const,\n items: {\n type: \"object\" as const,\n properties: {\n label: { type: \"string\" as const },\n data: { type: \"array\" as const, items: { type: \"number\" as const } },\n },\n required: [\"label\", \"data\"],\n },\n description: \"Data series (type=chart)\",\n },\n xLabel: { type: \"string\" as const },\n yLabel: { type: \"string\" as const },\n columns: {\n type: \"array\" as const,\n items: {\n type: \"object\" as const,\n properties: {\n key: { type: \"string\" as const },\n label: { type: \"string\" as const },\n align: { type: \"string\" as const },\n },\n required: [\"key\", \"label\"],\n },\n description:\n \"Column definitions — key matches row property names (type=table)\",\n },\n rows: {\n type: \"array\" as const,\n items: { type: \"object\" as const },\n description: \"Array of row objects keyed by column.key (type=table)\",\n },\n caption: { type: \"string\" as const },\n stats: {\n type: \"array\" as const,\n items: {\n type: \"object\" as const,\n properties: {\n label: { type: \"string\" as const },\n value: { type: \"string\" as const },\n change: { type: \"string\" as const },\n changeDirection: {\n type: \"string\" as const,\n enum: [\"positive\", \"negative\", \"neutral\"],\n },\n description: { type: \"string\" as const },\n },\n required: [\"label\", \"value\"],\n },\n description: \"KPI stats array (type=stat)\",\n },\n title: {\n type: \"string\" as const,\n description: \"Title shown above the component\",\n },\n subtitle: { type: \"string\" as const },\n body: { type: \"string\" as const },\n fields: {\n type: \"array\" as const,\n items: {\n type: \"object\" as const,\n properties: {\n label: { type: \"string\" as const },\n value: { type: \"string\" as const },\n badge: { type: \"boolean\" as const },\n },\n required: [\"label\", \"value\"],\n },\n description: \"Key-value fields (type=card)\",\n },\n cta: {\n type: \"object\" as const,\n properties: {\n label: { type: \"string\" as const },\n url: { type: \"string\" as const },\n },\n required: [\"label\", \"url\"],\n description: \"Call-to-action link (type=card)\",\n },\n },\n required: [\"type\"],\n};\n\nexport interface GenerativeUIToolConfig {\n /**\n * Override the default LLM description.\n * The default instructs the model when to use each UI type.\n */\n description?: string;\n}\n\n/**\n * Returns a tool definition compatible with `streamText` for use in your backend route.\n *\n * Pass the returned object as a value in the `tools` map of `streamText`.\n * The key you use becomes the tool name — use the same name in `useGenerativeUI({ name })` on the frontend.\n *\n * @example\n * ```ts\n * import { streamText } from \"@yourgpt/llm-sdk\";\n * import { generativeUITool } from \"@yourgpt/copilot-sdk/experimental\";\n *\n * const result = await streamText({\n * model: openai(\"gpt-4o\"),\n * messages,\n * tools: {\n * render_ui: generativeUITool(),\n * // ...your other tools\n * },\n * });\n * ```\n */\nexport function generativeUITool(config: GenerativeUIToolConfig = {}) {\n return {\n description:\n config.description ??\n `Render a rich visual UI component directly in the chat. Use this tool whenever the user's request is best answered with a visual instead of text.\n\nChoose the type based on what fits best:\n- \"table\": structured rows of data (comparisons, lists, records)\n- \"stat\": KPI metrics, numbers with labels, dashboards with change deltas\n- \"card\": entity summaries — profiles, products, results, structured key-value info\n- \"chart\": graphs and visualizations — bar, line, pie, area, scatter — pass raw data only, not markup\n- \"html\": anything that requires custom layout, rich formatting, or doesn't fit the above types — use Tailwind CSS classes freely\n\nAlways prefer a structured type (table, stat, card) over html when the data fits.\nOnly use html as a last resort for truly freeform content.`,\n parameters: RENDER_UI_PARAMETERS,\n };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../ui/lib/utils\";\nimport type { HtmlPayload } from \"../types\";\n\ninterface HtmlRendererProps {\n payload: HtmlPayload;\n className?: string;\n}\n\n/**\n * Strip only external script src= tags (e.g. duplicate CDN loads the AI might add).\n * Inline <script> blocks are kept — they're needed for Chart.js initialization\n * and are safe inside the sandboxed iframe.\n * Inline event handlers (onclick=, onerror=) are stripped as defense-in-depth.\n */\nfunction sanitizeHtml(html: string): string {\n return html\n .replace(/<script\\b[^>]*\\bsrc=[\"'][^\"']*[\"'][^>]*><\\/script>/gi, \"\")\n .replace(/\\s*on\\w+=\"[^\"]*\"/gi, \"\")\n .replace(/\\s*on\\w+='[^']*'/gi, \"\");\n}\n\n/**\n * Renders AI-generated HTML inside an isolated iframe.\n * Tailwind CSS is loaded via CDN — iframes provide a full document context\n * so the Tailwind Play CDN can scan and style classes correctly.\n */\nexport function HtmlRenderer({ payload, className }: HtmlRendererProps) {\n const clean = sanitizeHtml(payload.html);\n\n const srcdoc = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <script src=\"https://cdn.tailwindcss.com\"><\\/script>\n <script src=\"https://cdn.jsdelivr.net/npm/chart.js\"><\\/script>\n <style>\n body { margin: 0; padding: 4px; font-family: ui-sans-serif, system-ui, sans-serif; }\n * { box-sizing: border-box; }\n </style>\n</head>\n<body>${clean}</body>\n</html>`;\n\n return (\n <div\n className={cn(\"csdk-genui-html\", className)}\n style={{ width: \"min(700px, calc(100vw - 320px))\", minWidth: \"320px\" }}\n >\n {payload.title && (\n <p className=\"mb-1.5 text-xs font-medium text-muted-foreground\">\n {payload.title}\n </p>\n )}\n <iframe\n srcDoc={srcdoc}\n sandbox=\"allow-scripts\"\n style={{\n height: payload.height ?? \"520px\",\n minHeight: \"120px\",\n width: \"100%\",\n }}\n className=\"rounded-md border border-border bg-white\"\n title={payload.title ?? \"Rendered HTML\"}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../ui/lib/utils\";\nimport type { TablePayload } from \"../types\";\n\ninterface TableRendererProps {\n payload: TablePayload;\n className?: string;\n}\n\nexport function TableRenderer({ payload, className }: TableRendererProps) {\n const { columns, rows, caption } = payload;\n\n return (\n <div\n className={cn(\n \"csdk-genui-table w-full overflow-x-auto rounded-md border border-border\",\n className,\n )}\n >\n <table className=\"w-full min-w-full text-sm\">\n {caption && (\n <caption className=\"px-3 pt-2 pb-1 text-left text-xs text-muted-foreground\">\n {caption}\n </caption>\n )}\n <thead>\n <tr className=\"border-b border-border bg-muted/40\">\n {columns.map((col) => (\n <th\n key={col.key}\n className={cn(\n \"whitespace-nowrap px-3 py-2 font-medium text-foreground\",\n col.align === \"right\" && \"text-right\",\n col.align === \"center\" && \"text-center\",\n (!col.align || col.align === \"left\") && \"text-left\",\n )}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td\n colSpan={columns.length}\n className=\"px-3 py-4 text-center text-sm text-muted-foreground\"\n >\n No data\n </td>\n </tr>\n ) : (\n rows.map((row, i) => (\n <tr\n key={i}\n className={cn(\n \"border-b border-border last:border-0\",\n i % 2 === 1 && \"bg-muted/20\",\n )}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={cn(\n \"px-3 py-2 text-foreground/90\",\n col.align === \"right\" && \"text-right tabular-nums\",\n col.align === \"center\" && \"text-center\",\n (!col.align || col.align === \"left\") && \"text-left\",\n )}\n >\n {row[col.key] === null || row[col.key] === undefined\n ? \"—\"\n : String(row[col.key])}\n </td>\n ))}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../ui/lib/utils\";\nimport type { StatPayload } from \"../types\";\n\ninterface StatRendererProps {\n payload: StatPayload;\n className?: string;\n}\n\nexport function StatRenderer({ payload, className }: StatRendererProps) {\n const { stats, title } = payload;\n\n return (\n <div className={cn(\"csdk-genui-stat\", className)}>\n {title && (\n <p className=\"mb-2 text-sm font-semibold text-foreground\">{title}</p>\n )}\n <div\n className={cn(\n \"grid gap-2\",\n stats.length === 1 && \"grid-cols-1\",\n stats.length === 2 && \"grid-cols-2\",\n stats.length >= 3 && \"grid-cols-2 sm:grid-cols-3\",\n )}\n >\n {stats.map((stat, i) => (\n <div\n key={i}\n className=\"flex flex-col gap-0.5 rounded-lg border border-border bg-card p-3\"\n >\n <span className=\"truncate text-xs text-muted-foreground\">\n {stat.label}\n </span>\n <span className=\"text-xl font-bold tabular-nums leading-tight text-foreground\">\n {stat.value}\n </span>\n {stat.change && (\n <span\n className={cn(\n \"text-xs font-medium\",\n stat.changeDirection === \"positive\" &&\n \"text-green-600 dark:text-green-400\",\n stat.changeDirection === \"negative\" &&\n \"text-red-500 dark:text-red-400\",\n (!stat.changeDirection ||\n stat.changeDirection === \"neutral\") &&\n \"text-muted-foreground\",\n )}\n >\n {stat.change}\n </span>\n )}\n {stat.description && (\n <span className=\"text-xs leading-snug text-muted-foreground\">\n {stat.description}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../ui/lib/utils\";\nimport type { CardPayload } from \"../types\";\n\ninterface CardRendererProps {\n payload: CardPayload;\n className?: string;\n}\n\nexport function CardRenderer({ payload, className }: CardRendererProps) {\n const { title, subtitle, fields, body, cta } = payload;\n\n return (\n <div\n className={cn(\n \"csdk-genui-card flex flex-col gap-3 rounded-lg border border-border bg-card p-4\",\n className,\n )}\n >\n {/* Header */}\n <div>\n <p className=\"text-sm font-semibold leading-snug text-foreground\">\n {title}\n </p>\n {subtitle && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{subtitle}</p>\n )}\n </div>\n\n {/* Key-value fields */}\n {fields && fields.length > 0 && (\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1.5\">\n {fields.map((field, i) => (\n <React.Fragment key={i}>\n <dt className=\"self-center whitespace-nowrap text-xs text-muted-foreground\">\n {field.label}\n </dt>\n <dd className=\"text-xs text-foreground\">\n {field.badge ? (\n <span className=\"inline-flex items-center rounded-full border border-border bg-muted px-2 py-0.5 font-medium text-foreground\">\n {String(field.value)}\n </span>\n ) : (\n String(field.value)\n )}\n </dd>\n </React.Fragment>\n ))}\n </dl>\n )}\n\n {/* Body */}\n {body && (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">{body}</p>\n )}\n\n {/* CTA */}\n {cta && (\n <a\n href={cta.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-flex items-center gap-1 text-xs font-medium text-primary underline-offset-2 hover:underline\"\n >\n {cta.label} ↗\n </a>\n )}\n </div>\n );\n}\n","import { z } from \"zod\";\nimport type React from \"react\";\n\n// ─── Payload Schemas ──────────────────────────────────────────────────────────\n\nexport const HtmlPayloadSchema = z\n .object({\n type: z.literal(\"html\"),\n html: z\n .string()\n .describe(\n \"Raw HTML string rendered in an isolated Shadow DOM with Tailwind CSS\",\n ),\n title: z\n .string()\n .optional()\n .describe(\"Optional label shown above the component\"),\n height: z\n .string()\n .optional()\n .describe(\"CSS height value e.g. '300px'. Defaults to auto.\"),\n })\n .passthrough();\n\nexport const ChartPayloadSchema = z\n .object({\n type: z.literal(\"chart\"),\n chartType: z\n .enum([\"bar\", \"line\", \"pie\", \"area\", \"scatter\"])\n .describe(\"Chart visualization type\"),\n title: z.string().optional(),\n labels: z.array(z.string()).describe(\"X-axis labels or category names\"),\n datasets: z\n .array(\n z.object({\n label: z.string(),\n data: z.array(z.number()),\n color: z\n .string()\n .optional()\n .describe(\"Hex or CSS color for this series\"),\n }),\n )\n .describe(\"One or more data series\"),\n xLabel: z.string().optional().describe(\"X-axis label\"),\n yLabel: z.string().optional().describe(\"Y-axis label\"),\n })\n .passthrough();\n\nexport const TablePayloadSchema = z\n .object({\n type: z.literal(\"table\"),\n title: z.string().optional(),\n columns: z\n .array(\n z\n .object({\n key: z.string(),\n label: z.string(),\n align: z.enum([\"left\", \"right\", \"center\"]).optional(),\n })\n .passthrough(),\n )\n .describe(\"Column definitions — order controls render order\"),\n rows: z\n .array(z.record(z.string(), z.unknown()))\n .describe(\"Row data keyed by column.key\"),\n caption: z.string().optional(),\n })\n .passthrough();\n\nexport const StatPayloadSchema = z\n .object({\n type: z.literal(\"stat\"),\n title: z.string().optional(),\n stats: z.array(\n z\n .object({\n label: z.string(),\n value: z.union([z.string(), z.number()]),\n change: z.string().optional().describe(\"e.g. '+12%' or '-3.4%'\"),\n changeDirection: z\n .enum([\"positive\", \"negative\", \"neutral\"])\n .optional(),\n description: z.string().optional().describe(\"Sub-text below value\"),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n\nexport const CardPayloadSchema = z\n .object({\n type: z.literal(\"card\"),\n title: z.string(),\n subtitle: z.string().optional(),\n body: z.string().optional(),\n fields: z\n .array(\n z.object({\n label: z.string(),\n value: z.union([z.string(), z.number(), z.boolean()]),\n badge: z\n .boolean()\n .optional()\n .describe(\"Render value as a badge pill\"),\n }),\n )\n .optional(),\n cta: z\n .object({\n label: z.string().optional(),\n text: z.string().optional(), // LLMs sometimes use \"text\" instead of \"label\"\n url: z.string().describe(\"URL for the call-to-action link\"),\n })\n .transform((c) => ({ ...c, label: c.label ?? c.text ?? \"\" }))\n .optional(),\n })\n .passthrough();\n\n/** Full discriminated union of all generative UI payload types */\nexport const GenerativeUIPayloadSchema = z.discriminatedUnion(\"type\", [\n HtmlPayloadSchema,\n ChartPayloadSchema,\n TablePayloadSchema,\n StatPayloadSchema,\n CardPayloadSchema,\n]);\n\n// ─── TypeScript Types ──────────────────────────────────────────────────────────\n\nexport type HtmlPayload = z.infer<typeof HtmlPayloadSchema>;\nexport type ChartPayload = z.infer<typeof ChartPayloadSchema>;\nexport type TablePayload = z.infer<typeof TablePayloadSchema>;\nexport type StatPayload = z.infer<typeof StatPayloadSchema>;\nexport type CardPayload = z.infer<typeof CardPayloadSchema>;\nexport type GenerativeUIPayload = z.infer<typeof GenerativeUIPayloadSchema>;\n\n/** Props passed to user-supplied chart renderer */\nexport interface ChartRendererProps {\n payload: ChartPayload;\n}\n\n/** Config for useGenerativeUI hook */\nexport interface UseGenerativeUIConfig {\n /**\n * Tool name — must match the key used in generativeUITool() on the server.\n * @default \"render_ui\"\n */\n name?: string;\n /**\n * Renderer for chart payloads. The SDK does not bundle a chart library.\n * Pass your own Recharts / Chart.js / Victory component here.\n * If omitted, chart results show a JSON data fallback.\n *\n * @example\n * ```tsx\n * chartRenderer={({ payload }) => (\n * <BarChart data={payload.datasets} xLabels={payload.labels} />\n * )}\n * ```\n */\n chartRenderer?: React.ComponentType<ChartRendererProps>;\n /**\n * Override any built-in renderer per type.\n * Useful when you want custom styling while keeping the SDK's schema validation.\n */\n overrideRenderers?: Partial<{\n html: React.ComponentType<{ payload: HtmlPayload }>;\n chart: React.ComponentType<ChartRendererProps>;\n table: React.ComponentType<{ payload: TablePayload }>;\n stat: React.ComponentType<{ payload: StatPayload }>;\n card: React.ComponentType<{ payload: CardPayload }>;\n }>;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useTool } from \"../react/hooks/useTool\";\nimport type { ToolRenderProps } from \"../core/types/tools\";\nimport { DotsLoader } from \"../ui/components/ui/loader\";\nimport { HtmlRenderer } from \"./renderers/HtmlRenderer\";\nimport { TableRenderer } from \"./renderers/TableRenderer\";\nimport { StatRenderer } from \"./renderers/StatRenderer\";\nimport { CardRenderer } from \"./renderers/CardRenderer\";\nimport { GenerativeUIPayloadSchema } from \"./types\";\nimport type {\n GenerativeUIPayload,\n ChartPayload,\n UseGenerativeUIConfig,\n} from \"./types\";\n\n/**\n * Flat JSON schema for the render_ui tool.\n * Using a flat object with a discriminator `type` field works reliably across all LLMs.\n * The Zod schema (GenerativeUIPayloadSchema) is still used for server-side validation.\n */\nconst RENDER_UI_SCHEMA = {\n type: \"object\" as const,\n properties: {\n type: {\n type: \"string\" as const,\n enum: [\"html\", \"chart\", \"table\", \"stat\", \"card\"],\n description: \"The UI component type to render\",\n },\n // html\n html: {\n type: \"string\" as const,\n description: \"Raw HTML with Tailwind classes (type=html only)\",\n },\n height: {\n type: \"string\" as const,\n description: \"Optional CSS height (type=html only)\",\n },\n // chart\n chartType: {\n type: \"string\" as const,\n enum: [\"bar\", \"line\", \"pie\", \"area\", \"scatter\"],\n description: \"Chart variant (type=chart only)\",\n },\n labels: {\n type: \"array\" as const,\n items: { type: \"string\" as const },\n description: \"X-axis labels (type=chart only)\",\n },\n datasets: {\n type: \"array\" as const,\n items: {\n type: \"object\" as const,\n properties: {\n label: { type: \"string\" as const },\n data: { type: \"array\" as const, items: { type: \"number\" as const } },\n },\n required: [\"label\", \"data\"],\n },\n description: \"Data series array (type=chart only)\",\n },\n xLabel: { type: \"string\" as const },\n yLabel: { type: \"string\" as const },\n // table\n columns: {\n type: \"array\" as const,\n items: {\n type: \"object\" as const,\n properties: {\n key: { type: \"string\" as const },\n label: { type: \"string\" as const },\n align: { type: \"string\" as const, enum: [\"left\", \"right\", \"center\"] },\n },\n required: [\"key\", \"label\"],\n },\n description:\n \"Column definitions — key matches row property names (type=table only)\",\n },\n rows: {\n type: \"array\" as const,\n items: { type: \"object\" as const },\n description: \"Row objects keyed by column.key values (type=table only)\",\n },\n caption: { type: \"string\" as const },\n // stat\n stats: {\n type: \"array\" as const,\n items: {\n type: \"object\" as const,\n properties: {\n label: { type: \"string\" as const },\n value: { type: \"string\" as const },\n change: { type: \"string\" as const },\n changeDirection: {\n type: \"string\" as const,\n enum: [\"positive\", \"negative\", \"neutral\"],\n },\n description: { type: \"string\" as const },\n },\n required: [\"label\", \"value\"],\n },\n description: \"KPI stats array (type=stat only)\",\n },\n // card\n title: { type: \"string\" as const, description: \"Card or table title\" },\n subtitle: { type: \"string\" as const },\n body: { type: \"string\" as const },\n fields: {\n type: \"array\" as const,\n items: {\n type: \"object\" as const,\n properties: {\n label: { type: \"string\" as const },\n value: { type: \"string\" as const },\n badge: { type: \"boolean\" as const },\n },\n required: [\"label\", \"value\"],\n },\n description: \"Key-value fields (type=card only)\",\n },\n cta: {\n type: \"object\" as const,\n properties: {\n label: { type: \"string\" as const },\n url: { type: \"string\" as const },\n },\n required: [\"label\", \"url\"],\n description: \"Call-to-action link (type=card only)\",\n },\n },\n required: [\"type\"],\n};\n\n/**\n * Register the generative UI tool and attach built-in renderers for all payload types.\n *\n * Must be called inside a `CopilotProvider`. The `name` must match\n * the key used for `generativeUITool()` in your backend `streamText` tools map.\n *\n * @example\n * ```tsx\n * import { useGenerativeUI } from \"@yourgpt/copilot-sdk/experimental\";\n *\n * function App() {\n * useGenerativeUI({\n * chartRenderer: ({ payload }) => (\n * <BarChart labels={payload.labels} datasets={payload.datasets} />\n * ),\n * });\n * return <CopilotChat />;\n * }\n * ```\n *\n * @experimental This API may change without a semver major bump.\n */\nexport function useGenerativeUI(config: UseGenerativeUIConfig = {}): void {\n const toolName = config.name ?? \"render_ui\";\n\n // Keep config in a ref so the render function always has the latest without\n // triggering useTool re-registration on every render\n const configRef = React.useRef(config);\n configRef.current = config;\n\n useTool<GenerativeUIPayload>({\n name: toolName,\n description:\n \"Renders a rich UI component inline in the chat. Handled automatically by the SDK.\",\n inputSchema: RENDER_UI_SCHEMA,\n hidden: false,\n aiResponseMode: \"none\",\n aiContext: (_, args) => {\n const type = (args as GenerativeUIPayload)?.type ?? \"ui\";\n return `[Rendered ${type} component to user]`;\n },\n handler: async (params) => {\n // Some LLMs wrap the payload in a `data` key — unwrap if needed\n const raw =\n params && typeof params === \"object\" && \"data\" in params\n ? (params as Record<string, unknown>).data\n : params;\n const parsed = GenerativeUIPayloadSchema.safeParse(raw);\n if (!parsed.success) {\n return {\n success: false,\n error: `Invalid generative UI payload: ${parsed.error.message}`,\n };\n }\n return {\n success: true,\n data: parsed.data,\n _aiContext: `[Rendered ${parsed.data.type} component to user]`,\n _aiResponseMode: \"none\" as const,\n };\n },\n render: (props: ToolRenderProps<GenerativeUIPayload>) => (\n <GenerativeUIRenderer props={props} configRef={configRef} />\n ),\n });\n}\n\n// ─── Internal renderer ────────────────────────────────────────────────────────\n\ninterface InternalRendererProps {\n props: ToolRenderProps<GenerativeUIPayload>;\n configRef: React.MutableRefObject<UseGenerativeUIConfig>;\n}\n\nfunction GenerativeUIRenderer({\n props: renderProps,\n configRef,\n}: InternalRendererProps) {\n const { status, result, error } = renderProps;\n const config = configRef.current;\n\n // Loading\n if (status === \"pending\" || status === \"executing\") {\n return (\n <div className=\"flex items-center gap-2 py-1.5 text-sm text-muted-foreground\">\n <DotsLoader size=\"sm\" />\n <span>Preparing response…</span>\n </div>\n );\n }\n\n // Error\n if (status === \"error\") {\n return (\n <div className=\"rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-sm text-destructive\">\n {error ?? \"Failed to render UI component.\"}\n </div>\n );\n }\n\n // Completed — parse payload from result.data\n if (status !== \"completed\") return null;\n\n const rawPayload = result?.data as GenerativeUIPayload | undefined;\n const parsed = GenerativeUIPayloadSchema.safeParse(rawPayload);\n\n if (!parsed.success) {\n return (\n <div className=\"overflow-auto rounded-md border border-border bg-muted/30 px-3 py-2\">\n <pre className=\"whitespace-pre-wrap text-xs text-muted-foreground\">\n {JSON.stringify(rawPayload, null, 2)}\n </pre>\n </div>\n );\n }\n\n const payload = parsed.data;\n\n switch (payload.type) {\n case \"html\": {\n const Override = config.overrideRenderers?.html;\n return Override ? (\n <Override payload={payload} />\n ) : (\n <HtmlRenderer payload={payload} />\n );\n }\n\n case \"chart\": {\n const ChartComp = config.overrideRenderers?.chart ?? config.chartRenderer;\n return ChartComp ? (\n <ChartComp payload={payload} />\n ) : (\n <ChartFallback payload={payload} />\n );\n }\n\n case \"table\": {\n const Override = config.overrideRenderers?.table;\n return Override ? (\n <Override payload={payload} />\n ) : (\n <TableRenderer payload={payload} />\n );\n }\n\n case \"stat\": {\n const Override = config.overrideRenderers?.stat;\n return Override ? (\n <Override payload={payload} />\n ) : (\n <StatRenderer payload={payload} />\n );\n }\n\n case \"card\": {\n const Override = config.overrideRenderers?.card;\n return Override ? (\n <Override payload={payload} />\n ) : (\n <CardRenderer payload={payload} />\n );\n }\n\n default:\n return null;\n }\n}\n\n/** Shown when no chartRenderer is provided */\nfunction ChartFallback({ payload }: { payload: ChartPayload }) {\n return (\n <div className=\"rounded-md border border-border bg-muted/20 p-3\">\n {payload.title && (\n <p className=\"mb-1.5 text-sm font-medium text-foreground\">\n {payload.title}\n </p>\n )}\n <p className=\"mb-2 text-xs text-muted-foreground\">\n Chart type:{\" \"}\n <code className=\"rounded bg-muted px-1 py-0.5 font-mono text-xs\">\n {payload.chartType}\n </code>\n . Pass a <code className=\"font-mono\">chartRenderer</code> prop to{\" \"}\n <code className=\"font-mono\">useGenerativeUI()</code> to render this.\n </p>\n <pre className=\"max-h-40 overflow-auto whitespace-pre-wrap text-xs text-muted-foreground font-mono\">\n {JSON.stringify(\n { labels: payload.labels, datasets: payload.datasets },\n null,\n 2,\n )}\n </pre>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/experimental/renderers/GenUIFrame.tsx","../../src/experimental/useGenerativeUI.tsx","../../src/experimental/generativeUIPrompt.ts","../../src/experimental/generativeUITool.ts","../../src/experimental/types.ts","../../src/experimental/renderers/HtmlRenderer.tsx"],"names":["React","jsx","useCopilot","React2","jsxs","Markdown","z","cn"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\nlet _frameIdCounter = 0;\n\nexport interface GenUIFrameProps {\n /** HTML content to render inside the iframe */\n html: string;\n /** Whether the content is still streaming (defers scripts, strips last incomplete line) */\n streaming?: boolean;\n /** CSS class applied to the iframe */\n className?: string;\n /** Max width of the iframe (default: none) */\n maxWidth?: string;\n /** Theme CSS variables to inject into the iframe (e.g. from getComputedStyle(document.documentElement)) */\n themeVars?: Record<string, string>;\n /** Callback when a copilot.sendMessage() is called from inside the iframe */\n onSendMessage?: (message: string) => void;\n /** Callback when a copilot.action() is called from inside the iframe */\n onAction?: (name: string, data: unknown) => unknown | Promise<unknown>;\n}\n\n/**\n * Sandboxed iframe renderer for AI-generated HTML.\n *\n * Features:\n * - Static shell loaded once (Tailwind CSS + Chart.js CDN)\n * - Content pushed via postMessage (no iframe reloads on update)\n * - Auto-height via ResizeObserver\n * - Unique frame ID prevents cross-iframe interference\n * - Scripts deferred during streaming, executed on completion\n * - Theme vars injected via postMessage (not baked into srcDoc)\n * - `window.copilot` bridge for iframe → parent communication\n *\n * @experimental\n */\nexport function GenUIFrame({\n html,\n streaming = false,\n className,\n maxWidth,\n themeVars,\n onSendMessage,\n onAction,\n}: GenUIFrameProps) {\n const iframeRef = React.useRef<HTMLIFrameElement>(null);\n const readyRef = React.useRef(false);\n const themeVarsRef = React.useRef(themeVars);\n const [height, setHeight] = React.useState(0);\n const frameId = React.useRef(`genui_${++_frameIdCounter}`);\n\n // Keep ref in sync so onLoad always sees latest themeVars\n React.useEffect(() => {\n themeVarsRef.current = themeVars;\n });\n\n // During streaming: strip last incomplete line + remove scripts\n const displayHtml = React.useMemo(() => {\n if (!streaming) return html;\n const lines = html.split(\"\\n\");\n if (lines.length > 1) lines.pop();\n return lines.join(\"\\n\").replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\");\n }, [html, streaming]);\n\n // Static shell — never changes, no themeVars baked in\n const shell = React.useMemo(() => {\n const id = frameId.current;\n return `<!DOCTYPE html>\n<html><head>\n<meta charset=\"utf-8\"/>\n<script src=\"https://cdn.tailwindcss.com\"><\\/script>\n<script src=\"https://cdn.jsdelivr.net/npm/chart.js\"><\\/script>\n<style>\n html,body{margin:0;padding:0;font-family:ui-sans-serif,system-ui,sans-serif;overflow:hidden;background:var(--background,transparent)!important}\n *{box-sizing:border-box}\n #root{padding:0}\n canvas{background:transparent!important}\n</style>\n<script>\nvar FRAME_ID='${id}';\nvar _callId=0,_pending={};\n\n// ── Auto-height reporting ──\nfunction reportHeight(){\n var h=document.getElementById('root').scrollHeight;\n if(h>0) window.parent.postMessage({action:'resize',id:FRAME_ID,height:h},'*');\n}\n\n// ── Copilot bridge API (available to AI-generated HTML) ──\nwindow.copilot={\n sendMessage:function(msg){\n window.parent.postMessage({action:'copilot:sendMessage',id:FRAME_ID,message:msg},'*');\n },\n action:function(name,data){\n var cid=++_callId;\n window.parent.postMessage({action:'copilot:action',id:FRAME_ID,name:name,data:data,callId:cid},'*');\n return new Promise(function(resolve){_pending[cid]=resolve});\n }\n};\n\n// ── Message handler ──\nwindow.addEventListener('message',function(e){\n if(!e.data||e.data.id!==FRAME_ID)return;\n if(e.data.action==='theme'){\n var css=':root{';\n var vars=e.data.vars||{};\n for(var k in vars){if(vars.hasOwnProperty(k))css+=k+':'+vars[k]+';'}\n css+='}';\n var el=document.getElementById('theme-vars');\n if(!el){el=document.createElement('style');el.id='theme-vars';document.head.appendChild(el);}\n el.textContent=css;\n // Resolve CSS vars via a temporary element so oklch/hsl/etc are computed by the browser\n var probe=document.createElement('div');\n probe.style.position='absolute';probe.style.visibility='hidden';\n document.body.appendChild(probe);\n // Normalize any CSS color (oklch, hsl, etc.) to rgb() via canvas so Chart.js can always use it\n var normCanvas=document.createElement('canvas');\n normCanvas.width=1;normCanvas.height=1;\n var normCtx=normCanvas.getContext('2d');\n function resolveColor(varName){\n probe.style.color='var('+varName+')';\n var computed=getComputedStyle(probe).color||'';\n if(!computed)return'';\n // Pass through canvas to guarantee rgb() output regardless of input color space\n normCtx.fillStyle=computed;\n var hex=normCtx.fillStyle;\n if(hex&&hex.startsWith('#')&&hex.length===7){\n var r=parseInt(hex.slice(1,3),16),g=parseInt(hex.slice(3,5),16),b=parseInt(hex.slice(5,7),16);\n return'rgb('+r+','+g+','+b+')';\n }\n return hex||computed;\n }\n var chartColors=[\n resolveColor('--chart-1')||'rgb(224,85,34)',\n resolveColor('--chart-2')||'rgb(34,170,197)',\n resolveColor('--chart-3')||'rgb(80,120,180)',\n resolveColor('--chart-4')||'rgb(200,170,34)',\n resolveColor('--chart-5')||'rgb(170,80,200)',\n ];\n var fg=resolveColor('--foreground')||'#888';\n var border=resolveColor('--border')||'rgba(128,128,128,0.2)';\n document.body.removeChild(probe);\n if(window.Chart){\n Chart.defaults.color=fg;\n Chart.defaults.borderColor=border;\n if(Chart.defaults.plugins&&Chart.defaults.plugins.legend)\n Chart.defaults.plugins.legend.labels.color=fg;\n // Set chart color palette so AI-generated charts using var(--chart-N) get real colors\n Chart.defaults.datasets=Chart.defaults.datasets||{};\n var ds=Chart.defaults.datasets;\n // line/radar: semi-transparent fill using first chart color\n ['line','radar'].forEach(function(t){\n ds[t]=ds[t]||{};\n ds[t].backgroundColor=chartColors[0].replace(')',', 0.5)').replace('rgb(','rgba(');\n });\n // pie/doughnut: solid resolved palette so canvas segments get real colors\n ['pie','doughnut'].forEach(function(t){\n ds[t]=ds[t]||{};\n ds[t].backgroundColor=chartColors;\n ds[t].borderColor=chartColors;\n });\n }\n // Expose resolved colors so AI scripts can use window._chartColors[n] directly\n window._chartColors=chartColors;\n // Semi-transparent versions: rgb(r,g,b) → rgba(r,g,b,0.5) — for bar/line backgrounds only\n window._chartColorsA=chartColors.map(function(c){return c.replace('rgb(','rgba(').replace(')',',0.5)');});\n // Store ALL resolved vars for full script replacement in hydrate\n window._themeVars=vars;\n }\n if(e.data.action==='hydrate'){\n var rawHtml=e.data.html;\n // Replace ALL var(--*) with resolved rgb values so Chart.js canvas can use them\n rawHtml=rawHtml.replace(/var\\(--[\\w-]+\\)/g,function(ref){\n var name=ref.slice(4,-1);\n return (window._themeVars&&window._themeVars[name])||ref;\n });\n document.getElementById('root').innerHTML=rawHtml;\n if(!e.data.streaming){\n document.querySelectorAll('#root script').forEach(function(s){\n var n=document.createElement('script');n.text=s.text;s.parentNode.replaceChild(n,s);\n });\n }\n // Poll at 30ms, 150ms, 400ms, 800ms to catch async renders (e.g. Chart.js)\n [30,150,400,800].forEach(function(ms){setTimeout(reportHeight,ms)});\n }\n if(e.data.action==='copilot:actionResult'&&_pending[e.data.callId]){\n _pending[e.data.callId](e.data.result);\n delete _pending[e.data.callId];\n }\n});\n\nnew ResizeObserver(function(){reportHeight()}).observe(document.getElementById('root'));\n<\\/script>\n</head><body><div id=\"root\"></div></body></html>`;\n }, []);\n\n // Listen for messages from THIS iframe only\n React.useEffect(() => {\n const id = frameId.current;\n const handleMessage = (e: MessageEvent) => {\n if (!e.data || e.data.id !== id) return;\n\n // Auto-height\n if (e.data.action === \"resize\" && typeof e.data.height === \"number\") {\n setHeight(e.data.height);\n }\n\n // Bridge: sendMessage\n if (e.data.action === \"copilot:sendMessage\" && onSendMessage) {\n onSendMessage(e.data.message);\n }\n\n // Bridge: custom action\n if (e.data.action === \"copilot:action\" && onAction) {\n const result = onAction(e.data.name, e.data.data);\n // Send result back to iframe (supports sync and async handlers)\n Promise.resolve(result).then((res) => {\n iframeRef.current?.contentWindow?.postMessage(\n {\n action: \"copilot:actionResult\",\n id,\n callId: e.data.callId,\n result: res,\n },\n \"*\",\n );\n });\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [onSendMessage, onAction]);\n\n // Helper: send theme vars to iframe\n const sendTheme = React.useCallback(\n (vars: Record<string, string> | undefined) => {\n if (!vars || !iframeRef.current?.contentWindow) return;\n iframeRef.current.contentWindow.postMessage(\n { action: \"theme\", id: frameId.current, vars },\n \"*\",\n );\n },\n [],\n );\n\n // Push content on iframe load + send theme\n React.useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n const id = frameId.current;\n const onLoad = () => {\n readyRef.current = true;\n // Send theme first so vars are available when HTML is injected\n const vars = themeVarsRef.current;\n if (vars && Object.keys(vars).length > 0) {\n iframe.contentWindow?.postMessage({ action: \"theme\", id, vars }, \"*\");\n }\n iframe.contentWindow?.postMessage(\n { action: \"hydrate\", id, html: displayHtml, streaming },\n \"*\",\n );\n };\n iframe.addEventListener(\"load\", onLoad);\n return () => iframe.removeEventListener(\"load\", onLoad);\n }, []);\n\n // Push content updates via postMessage\n React.useEffect(() => {\n if (!displayHtml || !readyRef.current) return;\n iframeRef.current?.contentWindow?.postMessage(\n { action: \"hydrate\", id: frameId.current, html: displayHtml, streaming },\n \"*\",\n );\n }, [displayHtml, streaming]);\n\n // Push theme updates (when themeVars prop changes)\n React.useEffect(() => {\n if (!readyRef.current) return;\n sendTheme(themeVars);\n }, [themeVars, sendTheme]);\n\n return (\n <iframe\n ref={iframeRef}\n srcDoc={shell}\n sandbox=\"allow-scripts allow-same-origin\"\n style={{\n height: height > 0 ? `${height}px` : \"40px\",\n width: \"100%\",\n maxWidth: maxWidth ?? \"100%\",\n transition: \"height 0.15s ease\",\n border: \"none\",\n display: \"block\",\n }}\n className={className ?? \"bg-transparent overflow-hidden\"}\n title=\"Rendered HTML\"\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useCopilot } from \"../react/provider/CopilotProvider\";\nimport { GenUIFrame } from \"./renderers/GenUIFrame\";\nimport { Markdown } from \"../ui/components/ui/markdown\";\nimport type { UseGenerativeUIConfig, GenUIMessage } from \"./types\";\n\n/**\n * Hook that enables generative UI rendering in CopilotChat.\n *\n * Detects `<GENUI>...</GENUI>` blocks in assistant messages and\n * renders them as interactive HTML in sandboxed iframes with\n * Tailwind CSS and Chart.js.\n *\n * Returns a `wrapMessage` function to pass to `<CopilotChat>`.\n *\n * @example\n * ```tsx\n * import { useGenerativeUI } from \"@yourgpt/copilot-sdk/experimental\";\n *\n * function App() {\n * const { wrapMessage } = useGenerativeUI();\n * return <CopilotChat wrapMessage={wrapMessage} />;\n * }\n * ```\n *\n * @example With actions (interactive iframe → parent communication)\n * ```tsx\n * const { wrapMessage } = useGenerativeUI({\n * actions: {\n * addToCart: (data) => cartStore.add(data.itemId),\n * navigate: (data) => router.push(data.url),\n * },\n * });\n * ```\n *\n * @experimental This API may change without a semver major bump.\n */\nexport function useGenerativeUI(config: UseGenerativeUIConfig = {}) {\n const { messages, isLoading, sendMessage } = useCopilot();\n const configRef = React.useRef(config);\n configRef.current = config;\n\n // Parse messages for <GENUI> blocks\n const genuiMessages: GenUIMessage[] = React.useMemo(() => {\n return messages.map((msg) => {\n if (msg.role !== \"assistant\" || !msg.content)\n return msg as unknown as GenUIMessage;\n\n const content = msg.content;\n const match = content.match(/<GENUI>([\\s\\S]*?)(<\\/GENUI>|$)/);\n\n if (!match) return msg as unknown as GenUIMessage;\n\n const htmlContent = match[1];\n const isComplete = content.includes(\"</GENUI>\");\n const textBefore = content.slice(0, match.index).trim();\n const textAfter = isComplete\n ? content.slice(match.index! + match[0].length).trim()\n : \"\";\n\n return {\n ...msg,\n _genui: {\n html: htmlContent,\n streaming: !isComplete,\n textBefore,\n textAfter,\n },\n } as unknown as GenUIMessage;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [messages, isLoading]);\n\n // Stable action handler ref\n const handleAction = React.useCallback((name: string, data: unknown) => {\n const handler = configRef.current.actions?.[name];\n if (handler) return handler(data);\n return undefined;\n }, []);\n\n // Stable sendMessage handler\n const handleSendMessage = React.useCallback(\n (msg: string) => {\n sendMessage(msg);\n },\n [sendMessage],\n );\n\n // wrapMessage function for CopilotChat\n const wrapMessage = React.useCallback(\n (\n content: React.ReactNode,\n message: { id: string; role: string },\n ): React.ReactNode => {\n const processed = genuiMessages.find((m) => m.id === message.id);\n const genui = (\n processed as GenUIMessage & { _genui?: GenUIMessage[\"_genui\"] }\n )?._genui;\n\n if (!genui) return content; // No GENUI block — keep default rendering\n\n const { html, streaming, textBefore, textAfter } = genui;\n\n // `content` is the full DefaultMessage (avatar + message bubble).\n // We replace the message-content text with GenUI, keeping the avatar\n // by using CSS to swap what's visible inside the existing layout.\n return (\n <div className=\"csdk-genui-wrap [&_.csdk-message-content>*]:!hidden\">\n {content}\n {/* Inject GenUI inside the message-content area via adjacent positioning */}\n <style>{`.csdk-genui-wrap .csdk-message-content { padding: 0 !important; }\n.csdk-genui-wrap .csdk-message-content > * { display: none !important; }\n.csdk-genui-injected { margin-top: -4px; padding-left: 36px; }`}</style>\n <div className=\"csdk-genui-injected space-y-2\">\n {textBefore && (\n <div className=\"text-sm text-foreground\">\n <Markdown>{textBefore}</Markdown>\n </div>\n )}\n <GenUIFrame\n html={html}\n streaming={streaming}\n maxWidth={configRef.current.maxWidth}\n onSendMessage={handleSendMessage}\n onAction={handleAction}\n />\n {textAfter && (\n <div className=\"text-sm text-foreground\">\n <Markdown>{textAfter}</Markdown>\n </div>\n )}\n {streaming && (\n <p className=\"text-xs text-muted-foreground animate-pulse\">\n Rendering…\n </p>\n )}\n </div>\n </div>\n );\n },\n [genuiMessages, handleSendMessage, handleAction],\n );\n\n return { wrapMessage };\n}\n","/**\n * Options for generating the generative UI system prompt.\n */\nexport interface GenerativeUIPromptOptions {\n /**\n * Custom actions available inside the iframe via `copilot.action(name, data)`.\n * Keys are action names, values are descriptions for the AI.\n *\n * @example\n * ```ts\n * generativeUISystemPrompt({\n * actions: {\n * addToCart: \"Add an item to the shopping cart. Params: { itemId: string, qty: number }\",\n * navigate: \"Navigate to a URL. Params: { url: string }\",\n * }\n * })\n * ```\n */\n actions?: Record<string, string>;\n\n /**\n * Additional design guidelines appended to the prompt.\n */\n designGuidelines?: string;\n}\n\n/**\n * Returns a system prompt string that instructs the LLM to generate\n * rich HTML UI wrapped in `<GENUI>` tags.\n *\n * The generated HTML renders in a sandboxed iframe with Tailwind CSS\n * and Chart.js pre-loaded.\n *\n * @example\n * ```ts\n * import { generativeUISystemPrompt } from \"@yourgpt/copilot-sdk/experimental\";\n *\n * const runtime = createRuntime({\n * systemPrompt: `You are a helpful assistant. ${generativeUISystemPrompt()}`,\n * });\n * ```\n *\n * @experimental\n */\nexport function generativeUISystemPrompt(\n options?: GenerativeUIPromptOptions,\n): string {\n const actionsSection = options?.actions\n ? `\nINTERACTIVE ACTIONS — available inside onclick handlers:\n- copilot.sendMessage(text): Send a message in the chat as the user\n${Object.entries(options.actions)\n .map(([name, desc]) => `- copilot.action('${name}', data): ${desc}`)\n .join(\"\\n\")}\n\nExample:\n<button onclick=\"copilot.action('addToCart', {itemId: '123'})\">Add to Cart</button>\n<button onclick=\"copilot.sendMessage('Tell me more about this')\">Ask AI</button>\n`\n : \"\";\n\n const customGuidelines = options?.designGuidelines\n ? `\\n${options.designGuidelines}`\n : \"\";\n\n return `You are an intelligent SaaS dashboard copilot. You help users understand their data, answer questions, and provide insights through conversation.\n\nRESPONSE STYLE:\n- Be conversational and helpful — most responses should be plain text with markdown formatting\n- Use bullet points, bold text, and clear structure for readability\n- Keep responses concise and actionable\n\nVISUAL COMPONENTS — use only when it genuinely helps:\n- Dashboards, KPI summaries, metric overviews → visual\n- Data tables, comparisons, rankings → visual\n- Charts, trends, distributions → visual\n- Simple answers, explanations, suggestions → plain text (no visual)\n- Greetings, follow-up questions → plain text\n\nWhen rendering visual components, wrap HTML in <GENUI> tags:\n\n<GENUI>\nyour html here using Tailwind CSS classes\n</GENUI>\n\nYou can mix text and visual — add context before or after the <GENUI> block.\n\nVISUAL RULES:\n1. Wrap HTML in <GENUI> and </GENUI> tags — no markdown code blocks\n2. Use ONLY Tailwind CSS utility classes — no custom CSS or <style> tags\n3. For charts: ALWAYS wrap canvas in a fixed-height div: <div style=\"height:200px\"><canvas id=\"c\"></canvas></div><script>new Chart(document.getElementById('c'), {options:{responsive:true,maintainAspectRatio:false}})</script>\n4. Left-align content — never use mx-auto or centered max-w containers\n5. Keep it compact — you're inside a chat widget (~500-600px wide)\n\nDESIGN SYSTEM (shadcn/ui):\n- Cards: rounded-xl border border-gray-200 bg-white shadow-sm p-4\n- Headings: text-gray-900 font-semibold text-sm\n- Labels: text-xs text-gray-500 font-medium uppercase tracking-wider\n- Body: text-sm text-gray-700\n- Stats: text-2xl font-bold text-gray-900, label text-xs text-gray-500\n- Badges: px-2 py-0.5 rounded-full text-xs font-medium (bg-emerald-50 text-emerald-700 for positive, bg-red-50 text-red-500 for negative)\n- Tables: text-sm w-full, th border-b py-2 text-xs text-gray-500 uppercase, td py-2\n- Grid: grid grid-cols-2 gap-3\n- Charts: max 200px height, colors #4f46e5 #10b981 #f59e0b #ef4444 #8b5cf6${customGuidelines}\n${actionsSection}`;\n}\n","export const RENDER_UI_PARAMETERS = {\n type: \"object\" as const,\n properties: {\n html: {\n type: \"string\" as const,\n description:\n \"Raw HTML string with Tailwind CSS classes. Chart.js is available for charts via <canvas> + inline <script>.\",\n },\n title: {\n type: \"string\" as const,\n description: \"Optional title shown above the rendered component\",\n },\n height: {\n type: \"string\" as const,\n description:\n \"CSS height for the iframe, e.g. '400px'. Defaults to '520px'.\",\n },\n },\n required: [\"html\"],\n};\n\nexport interface GenerativeUIToolConfig {\n /**\n * Override the default LLM description.\n */\n description?: string;\n}\n\n/**\n * Returns a tool definition compatible with `streamText` for use in your backend route.\n *\n * Pass the returned object as a value in the `tools` map of `streamText`.\n * The key you use becomes the tool name — use the same name in `useGenerativeUI({ name })` on the frontend.\n *\n * @example\n * ```ts\n * import { streamText } from \"@yourgpt/llm-sdk\";\n * import { generativeUITool } from \"@yourgpt/copilot-sdk/experimental\";\n *\n * const result = await streamText({\n * model: openai(\"gpt-4o\"),\n * messages,\n * tools: {\n * render_ui: generativeUITool(),\n * // ...your other tools\n * },\n * });\n * ```\n */\nexport function generativeUITool(config: GenerativeUIToolConfig = {}) {\n return {\n description:\n config.description ??\n `Render a rich visual UI component directly in the chat using HTML with Tailwind CSS and Chart.js.\n\nUse this tool whenever the user's request is best answered with a visual instead of plain text.\n\nThe HTML is rendered in an iframe with two libraries pre-loaded:\n1. Tailwind CSS (Play CDN) — use any utility class\n2. Chart.js — create charts with <canvas> + new Chart(...)\n\nDesign in a clean, modern style:\n- Cards: bg-white rounded-xl border border-gray-200 shadow-sm p-6\n- Headings: text-gray-900 font-semibold text-lg\n- Muted: text-gray-500 text-sm\n- Badges: bg-blue-50 text-blue-700 px-2.5 py-0.5 rounded-full text-xs font-medium\n- Grid: grid grid-cols-3 gap-4\n- Tables, stats, cards, charts — build them all with HTML + Tailwind + Chart.js.\n\nSet the \"height\" field to fit the content — e.g. \"600px\" for dashboards, \"320px\" for a small card.`,\n parameters: RENDER_UI_PARAMETERS,\n };\n}\n","import { z } from \"zod\";\n\n// ─── GenUI Payload (for HtmlRenderer — tool-based approach) ──────────────────\n\nexport const HtmlPayloadSchema = z\n .object({\n type: z.literal(\"html\"),\n html: z\n .string()\n .describe(\n \"Raw HTML string rendered in an isolated iframe with Tailwind CSS and Chart.js\",\n ),\n title: z\n .string()\n .optional()\n .describe(\"Optional label shown above the component\"),\n height: z\n .string()\n .optional()\n .describe(\"CSS height value e.g. '300px'. Defaults to auto.\"),\n })\n .passthrough();\n\nexport const GenerativeUIPayloadSchema = HtmlPayloadSchema;\n\nexport type HtmlPayload = z.infer<typeof HtmlPayloadSchema>;\nexport type GenerativeUIPayload = HtmlPayload;\n\n// ─── GenUI Config (for useGenerativeUI hook — text-streaming approach) ───────\n\n/**\n * Action handler called when the AI-generated iframe triggers\n * `copilot.action(name, data)` via the bridge API.\n */\nexport type GenUIActionHandler = (data: unknown) => unknown | Promise<unknown>;\n\n/**\n * Config for the `useGenerativeUI` hook.\n */\nexport interface UseGenerativeUIConfig {\n /**\n * Custom actions available inside the iframe.\n * The AI can call these via `copilot.action('name', data)` in onclick handlers.\n *\n * @example\n * ```tsx\n * useGenerativeUI({\n * actions: {\n * addToCart: (data) => cartStore.add(data.itemId),\n * navigate: (data) => router.push(data.url),\n * },\n * })\n * ```\n */\n actions?: Record<string, GenUIActionHandler>;\n\n /**\n * Max width of the iframe (CSS value).\n * @default undefined (takes full available width)\n */\n maxWidth?: string;\n}\n\n/**\n * A processed message that may contain a `<GENUI>` block.\n */\nexport interface GenUIMessage {\n id: string;\n role: string;\n content: string | null;\n _genui?: {\n html: string;\n streaming: boolean;\n textBefore: string;\n textAfter: string;\n };\n [key: string]: unknown;\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../ui/lib/utils\";\nimport type { HtmlPayload } from \"../types\";\n\ninterface HtmlRendererProps {\n payload: HtmlPayload;\n className?: string;\n /** When true, defers script execution and strips the last incomplete line */\n streaming?: boolean;\n}\n\n/**\n * Strip external script src= tags (duplicate CDN loads the AI might add).\n * Inline event handlers are stripped as defense-in-depth.\n */\nfunction sanitizeHtml(html: string): string {\n return html\n .replace(/<script\\b[^>]*\\bsrc=[\"'][^\"']*[\"'][^>]*><\\/script>/gi, \"\")\n .replace(/\\s*on\\w+=\"[^\"]*\"/gi, \"\")\n .replace(/\\s*on\\w+='[^']*'/gi, \"\");\n}\n\n/**\n * During streaming, strip the last incomplete line and remove\n * inline <script> blocks (deferred until streaming completes).\n */\nfunction prepareStreamingHtml(html: string): string {\n const lines = html.split(\"\\n\");\n if (lines.length > 1) lines.pop();\n let result = lines.join(\"\\n\");\n result = result.replace(/<script\\b[^>]*>[\\s\\S]*?<\\/script>/gi, \"\");\n return result;\n}\n\n/**\n * Renders AI-generated HTML inside an isolated iframe.\n * Uses srcdoc for simplicity and reliability.\n */\nexport function HtmlRenderer({\n payload,\n className,\n streaming = false,\n}: HtmlRendererProps) {\n const rawHtml = payload.html ?? \"\";\n const clean = sanitizeHtml(rawHtml);\n const displayHtml = streaming ? prepareStreamingHtml(clean) : clean;\n\n const srcdoc = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <script src=\"https://cdn.tailwindcss.com\"><\\/script>\n <script src=\"https://cdn.jsdelivr.net/npm/chart.js\"><\\/script>\n <style>\n body { margin: 0; padding: 4px; font-family: ui-sans-serif, system-ui, sans-serif; }\n * { box-sizing: border-box; }\n </style>\n</head>\n<body>${displayHtml}</body>\n</html>`;\n\n return (\n <div\n className={cn(\"csdk-genui-html\", className)}\n style={{ width: \"min(700px, calc(100vw - 320px))\", minWidth: \"320px\" }}\n >\n {payload.title && (\n <p className=\"mb-1.5 text-xs font-medium text-muted-foreground\">\n {payload.title}\n </p>\n )}\n <iframe\n srcDoc={srcdoc}\n sandbox=\"allow-scripts\"\n style={{\n height: payload.height ?? \"520px\",\n minHeight: \"120px\",\n width: \"100%\",\n }}\n className=\"rounded-md border border-border bg-white\"\n title={payload.title ?? \"Rendered HTML\"}\n />\n </div>\n );\n}\n"]}
|