autoui-react 0.0.3-alpha

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/reducer.ts","../src/core/action-router.ts","../src/AutoUI.tsx","../src/core/state.ts","../src/schema/ui.ts","../src/core/system-events.ts","../src/env.ts","../src/core/planner.ts","../src/adapters/shadcn.tsx","../src/core/renderer.tsx","../src/core/bindings.ts","../src/core/events.ts","../src/adapters/schema/drizzle.ts","../src/adapters/schema/index.ts","../src/examples/basic-usage.ts","../src/examples/ai-sdk-example.ts"],"names":["path","parent","ActionType","plannerInput","useState","useCallback","useEffect","SystemEventType","jsx","renderNode","jsxs","findNodeById","generateText","openai"],"mappings":"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","sourcesContent":["import { UIAction, UIState, UISpecNode } from '../schema/ui';\n\n/**\n * Deep clones a UI node tree\n * @param node - Node to clone\n * @returns Cloned node\n */\nfunction cloneNode(node: UISpecNode): UISpecNode {\n return {\n ...node,\n props: node.props ? { ...node.props } : undefined,\n bindings: node.bindings ? { ...node.bindings } : undefined,\n events: node.events ? { ...node.events } : undefined,\n children: node.children?.map(child => cloneNode(child)),\n };\n}\n\n/**\n * Find a specific node in the UI tree by ID\n * @param tree - UI tree to search\n * @param nodeId - ID of the node to find\n * @returns The found node or undefined\n */\nexport function findNodeById(\n tree: UISpecNode | undefined, \n nodeId: string\n): UISpecNode | undefined {\n if (!tree) return undefined;\n if (tree.id === nodeId) return tree;\n \n if (tree.children) {\n for (const child of tree.children) {\n const found = findNodeById(child, nodeId);\n if (found) return found;\n }\n }\n \n return undefined;\n}\n\n/**\n * Updates a specific node in the UI tree\n * @param tree - Original UI tree\n * @param nodeId - ID of the node to update\n * @param updater - Function that returns the updated node\n * @returns Updated UI tree\n */\nexport function updateNodeById(\n tree: UISpecNode,\n nodeId: string,\n updater: (node: UISpecNode) => UISpecNode\n): UISpecNode {\n // Clone the tree to avoid mutations\n const result = cloneNode(tree);\n \n // Find the parent path to the node\n function findPath(\n node: UISpecNode,\n id: string,\n currentPath: UISpecNode[] = []\n ): UISpecNode[] | null {\n const newPath = [...currentPath, node];\n \n if (node.id === id) {\n return newPath;\n }\n \n if (node.children) {\n for (const child of node.children) {\n const path = findPath(child, id, newPath);\n if (path) return path;\n }\n }\n \n return null;\n }\n \n const path = findPath(result, nodeId);\n if (!path) return result; // Node not found, return original\n \n // The last item in the path is the node to update\n const nodeToUpdate = path[path.length - 1];\n const updatedNode = updater(nodeToUpdate);\n \n // If this is the root node, return the updated node\n if (path.length === 1) {\n return updatedNode;\n }\n \n // Otherwise, update the parent's children\n const parent = path[path.length - 2];\n const updatedParent = {\n ...parent,\n children: parent.children?.map(child => \n child.id === nodeId ? updatedNode : child\n ),\n };\n \n // If the parent is root, return it\n if (path.length === 2) {\n return updatedParent;\n }\n \n // Otherwise, recursively update up the tree\n return updateNodeById(\n result,\n parent.id,\n () => updatedParent\n );\n}\n\n/**\n * Replace a specific node in the UI tree\n * @param tree - Original UI tree\n * @param nodeId - ID of the node to replace\n * @param newNode - New node to insert\n * @returns Updated UI tree\n */\nexport function replaceNodeById(\n tree: UISpecNode,\n nodeId: string,\n newNode: UISpecNode\n): UISpecNode {\n return updateNodeById(tree, nodeId, () => newNode);\n}\n\n/**\n * Add a child node to a specific parent node\n * @param tree - Original UI tree\n * @param parentId - ID of the parent node\n * @param newChild - Child node to add\n * @param index - Optional index to insert at (default: append)\n * @returns Updated UI tree\n */\nexport function addChildNode(\n tree: UISpecNode,\n parentId: string,\n newChild: UISpecNode,\n index?: number\n): UISpecNode {\n return updateNodeById(tree, parentId, (node) => {\n const children = node.children ? [...node.children] : [];\n \n if (index !== undefined && index >= 0 && index <= children.length) {\n children.splice(index, 0, newChild);\n } else {\n children.push(newChild);\n }\n \n return {\n ...node,\n children,\n };\n });\n}\n\n/**\n * Remove a node from the UI tree\n * @param tree - Original UI tree\n * @param nodeId - ID of the node to remove\n * @returns Updated UI tree\n */\nexport function removeNodeById(\n tree: UISpecNode,\n nodeId: string\n): UISpecNode {\n // Find the parent of the node\n function findParent(\n node: UISpecNode,\n id: string\n ): UISpecNode | null {\n if (node.children) {\n if (node.children.some(child => child.id === id)) {\n return node;\n }\n \n for (const child of node.children) {\n const parent = findParent(child, id);\n if (parent) return parent;\n }\n }\n \n return null;\n }\n \n // Clone the tree to avoid mutations\n const result = cloneNode(tree);\n \n // If trying to remove the root, return empty tree\n if (result.id === nodeId) {\n throw new Error('Cannot remove root node');\n }\n \n const parent = findParent(result, nodeId);\n if (!parent) return result; // Node not found, return original\n \n // Update the parent by filtering out the node\n return updateNodeById(result, parent.id, (node) => ({\n ...node,\n children: node.children?.filter(child => child.id !== nodeId),\n }));\n}\n\n/**\n * Pure reducer function for the UI state engine\n * @param state - Current state\n * @param action - Action to apply\n * @returns New state\n */\nexport function uiReducer(state: UIState, action: UIAction): UIState {\n switch (action.type) {\n case 'UI_EVENT': {\n // Add the event to history and set loading state\n return {\n ...state,\n loading: true,\n history: [...state.history, action.event],\n };\n }\n\n case 'AI_RESPONSE': {\n // Replace the layout with the new node and set loading to false\n return {\n ...state,\n layout: action.node,\n loading: false,\n error: undefined,\n };\n }\n \n case 'PARTIAL_UPDATE': {\n if (!state.layout) {\n return {\n ...state,\n layout: action.node,\n loading: false,\n error: undefined,\n };\n }\n \n // Find the node to update\n if (action.nodeId === 'root' || action.nodeId === state.layout.id) {\n // Root node replacement\n return {\n ...state,\n layout: action.node,\n loading: false,\n error: undefined,\n };\n }\n \n // Replace a specific node in the tree\n return {\n ...state,\n layout: replaceNodeById(state.layout, action.nodeId, action.node),\n loading: false,\n error: undefined,\n };\n }\n \n case 'ADD_NODE': {\n if (!state.layout) {\n return state;\n }\n \n // Add a child node to a specific parent\n return {\n ...state,\n layout: addChildNode(\n state.layout, \n action.parentId, \n action.node, \n action.index\n ),\n loading: false,\n error: undefined,\n };\n }\n \n case 'REMOVE_NODE': {\n if (!state.layout) {\n return state;\n }\n \n // Remove a node from the tree\n return {\n ...state,\n layout: removeNodeById(state.layout, action.nodeId),\n loading: false,\n error: undefined,\n };\n }\n\n case 'LOADING': {\n // Update loading state\n return {\n ...state,\n loading: action.isLoading,\n };\n }\n\n case 'ERROR': {\n // Set error and loading to false\n return {\n ...state,\n error: action.message,\n loading: false,\n };\n }\n\n default:\n return state;\n }\n}\n\n/**\n * Initial state for the UI state engine\n */\nexport const initialState: UIState = {\n loading: true,\n history: [],\n};","import { UIEvent, UISpecNode, PlannerInput } from '../schema/ui';\nimport { DataContext } from './bindings';\nimport { findNodeById } from './reducer';\nimport { \n createSystemEvent, \n systemEvents, \n SystemEventType \n} from './system-events';\n\n/**\n * Action types supported by the router\n */\nexport enum ActionType {\n FULL_REFRESH = 'FULL_REFRESH', // Generate a completely new UI\n UPDATE_NODE = 'UPDATE_NODE', // Update a specific node\n ADD_DROPDOWN = 'ADD_DROPDOWN', // Add a dropdown to a specific node\n SHOW_DETAIL = 'SHOW_DETAIL', // Show a detail view\n HIDE_DETAIL = 'HIDE_DETAIL', // Hide a detail view\n TOGGLE_STATE = 'TOGGLE_STATE', // Toggle a boolean state (expanded, selected, etc.)\n UPDATE_FORM = 'UPDATE_FORM', // Update a form based on selections\n NAVIGATE = 'NAVIGATE', // Navigate to a different view\n}\n\n/**\n * Routing configuration for an action\n */\nexport interface ActionRouteConfig {\n actionType: ActionType;\n targetNodeId: string;\n promptTemplate: string;\n contextKeys?: string[]; // Additional data context keys to include\n}\n\n/**\n * Interface for route resolution\n */\nexport interface RouteResolution {\n actionType: ActionType;\n targetNodeId: string;\n plannerInput: PlannerInput;\n prompt: string;\n}\n\n/**\n * Action router class - handles determining what part of the UI to update\n */\nexport class ActionRouter {\n private routes: Record<string, ActionRouteConfig[]> = {};\n \n /**\n * Register a new action route\n * @param eventType - UI event type to route\n * @param config - Route configuration\n */\n public registerRoute(eventType: string, config: ActionRouteConfig): void {\n if (!this.routes[eventType]) {\n this.routes[eventType] = [];\n }\n \n this.routes[eventType].push(config);\n }\n \n /**\n * Find the appropriate route for an event\n * @param event - UI event\n * @param layout - Current UI layout\n * @param dataContext - Current data context\n * @returns Route resolution or null if no match\n */\n public resolveRoute(\n event: UIEvent,\n schema: Record<string, unknown>,\n layout: UISpecNode | undefined,\n dataContext: DataContext,\n goal: string,\n userContext?: Record<string, unknown>,\n ): RouteResolution | null {\n // Get all routes for this event type\n const routes = this.routes[event.type] || [];\n \n if (routes.length === 0) {\n // Default to full refresh if no routes defined\n return {\n actionType: ActionType.FULL_REFRESH,\n targetNodeId: layout?.id || 'root',\n plannerInput: {\n schema,\n goal,\n history: [event],\n userContext,\n },\n prompt: `Generate a new UI for the goal: \"${goal}\". The user just triggered: ${event.type} on node ${event.nodeId}`\n };\n }\n \n // Try to find source node\n const sourceNode = layout ? findNodeById(layout, event.nodeId) : undefined;\n \n // Get the node configuration if available\n const nodeConfig = sourceNode?.events?.[event.type];\n \n // Try to find a matching route based on node configuration\n let matchingRoute: ActionRouteConfig | undefined;\n \n if (nodeConfig) {\n matchingRoute = routes.find(route => \n route.actionType.toString() === nodeConfig.action\n );\n }\n \n // If no match via node configuration, use the first route\n if (!matchingRoute) {\n matchingRoute = routes[0];\n }\n \n // Resolve target node ID\n const targetNodeId = nodeConfig?.target || matchingRoute.targetNodeId || event.nodeId;\n \n // Build additional context\n const additionalContext: Record<string, unknown> = {};\n \n if (matchingRoute.contextKeys) {\n matchingRoute.contextKeys.forEach(key => {\n additionalContext[key] = dataContext[key];\n });\n }\n \n // Add source node info\n if (sourceNode) {\n additionalContext.sourceNode = sourceNode;\n }\n \n // Add target node info if available\n if (layout) {\n const targetNode = findNodeById(layout, targetNodeId);\n if (targetNode) {\n additionalContext.targetNode = targetNode;\n }\n }\n \n // Add event payload\n if (event.payload) {\n additionalContext.eventPayload = event.payload;\n }\n \n // Merge context with any payload from node config\n if (nodeConfig?.payload) {\n Object.entries(nodeConfig.payload).forEach(([key, value]) => {\n additionalContext[key] = value;\n });\n }\n \n // Build planner input\n const plannerInput: PlannerInput = {\n schema,\n goal,\n history: [event],\n userContext: {\n ...userContext,\n ...additionalContext,\n }\n };\n \n // Process prompt template\n const prompt = this.processTemplate(\n matchingRoute.promptTemplate, \n {\n goal,\n eventType: event.type,\n nodeId: event.nodeId,\n targetNodeId,\n actionType: matchingRoute.actionType,\n ...additionalContext,\n }\n );\n \n return {\n actionType: matchingRoute.actionType,\n targetNodeId,\n plannerInput,\n prompt,\n };\n }\n \n /**\n * Process a prompt template with variables\n * @param template - Template string with ${var} placeholders\n * @param values - Values to substitute\n * @returns Processed string\n */\n private processTemplate(\n template: string, \n values: Record<string, unknown>\n ): string {\n return template.replace(/\\${(\\w+)}/g, (_, key) => {\n return values[key] !== undefined \n ? String(values[key]) \n : `\\${${key}}`;\n });\n }\n}\n\n// Create a default router with common routes\nexport function createDefaultRouter(): ActionRouter {\n const router = new ActionRouter();\n \n // Default full refresh route\n router.registerRoute('CLICK', {\n actionType: ActionType.FULL_REFRESH,\n targetNodeId: 'root',\n promptTemplate: 'Generate a new UI for the goal: \"${goal}\". The user just clicked on node ${nodeId}'\n });\n \n // Show detail route\n router.registerRoute('CLICK', {\n actionType: ActionType.SHOW_DETAIL,\n targetNodeId: '${targetNodeId}',\n promptTemplate: 'Update the UI to show details for the selected item. Current node: ${nodeId}, Target node: ${targetNodeId}',\n contextKeys: ['selected']\n });\n \n // Navigate route\n router.registerRoute('CLICK', {\n actionType: ActionType.NAVIGATE,\n targetNodeId: 'root',\n promptTemplate: 'Navigate to a new view based on the user clicking ${nodeId}. Current goal: ${goal}'\n });\n \n // Dropdown route\n router.registerRoute('CLICK', {\n actionType: ActionType.ADD_DROPDOWN,\n targetNodeId: '${targetNodeId}',\n promptTemplate: 'Add a dropdown menu to node ${targetNodeId} with options relevant to the clicked element ${nodeId}'\n });\n \n // Toggle state route\n router.registerRoute('CLICK', {\n actionType: ActionType.TOGGLE_STATE,\n targetNodeId: '${nodeId}',\n promptTemplate: 'Toggle the state of node ${nodeId} (e.g., expanded/collapsed, selected/unselected)'\n });\n \n // Form update route\n router.registerRoute('CHANGE', {\n actionType: ActionType.UPDATE_FORM,\n targetNodeId: '${targetNodeId}',\n promptTemplate: 'Update the form based on the user changing the value of ${nodeId}'\n });\n \n return router;\n}","import React, { useState, useCallback, useMemo, useRef, useEffect } from 'react';\nimport { UIEvent, UISpecNode, UIEventType } from './schema/ui';\nimport { useUIStateEngine } from './core/state';\nimport { renderNode, renderShimmer } from './core/renderer';\nimport { resolveBindings, DataContext, executeAction } from './core/bindings';\nimport { EventManager, EventHook } from './core/events';\nimport { SystemEventType, SystemEventHook, systemEvents } from './core/system-events';\nimport { SchemaAdapter } from './adapters/schema';\nimport './styles/autoui.css';\n\n// Interface for DrizzleAdapterOptions\ninterface DrizzleAdapterOptions {\n schema: Record<string, unknown>;\n // Add other options as needed\n}\n\nexport interface AutoUIProps {\n // Schema definition (one of these is required)\n schema: \n | Record<string, unknown> // Direct schema object\n | { type: 'drizzle'; options: DrizzleAdapterOptions } // Drizzle adapter\n | { type: 'custom'; adapter: SchemaAdapter }; // Custom adapter\n \n // Required\n goal: string;\n \n // Optional configurations\n componentAdapter?: 'shadcn';\n userContext?: Record<string, unknown>;\n onEvent?: (evt: UIEvent) => void;\n \n // UI Event hooks\n eventHooks?: {\n all?: EventHook[];\n [key: string]: EventHook[] | undefined;\n };\n \n // System Event hooks\n systemEventHooks?: {\n [key: string]: SystemEventHook[] | undefined;\n };\n \n // Enable partial UI updates (instead of regenerating entire UI on each interaction)\n enablePartialUpdates?: boolean;\n \n // Define custom UI update patterns\n updatePatterns?: {\n // Allow target components to show dropdowns\n enableDropdowns?: boolean;\n // Allow for showing/hiding detail views\n enableDetailViews?: boolean;\n // Allow for expanding/collapsing sections\n enableExpandCollapse?: boolean;\n // Allow for multi-step form navigation\n enableFormNavigation?: boolean;\n };\n \n // Integration configuration\n integration?: {\n // Whether to generate a standalone UI or a component for integration\n mode?: 'standalone' | 'component';\n // CSS class names to apply to the root element\n className?: string;\n // Inline styles to apply to the root element\n style?: React.CSSProperties;\n // ID of the root element\n id?: string;\n };\n \n // Scope of the generation - what kind of UI element to generate\n scope?: {\n // Type of component to generate\n type?: 'form' | 'list' | 'detail' | 'dashboard' | 'full-page' | 'card';\n // Specific focus for the generation\n focus?: string;\n };\n \n // Debug mode - shows system events in console\n debugMode?: boolean;\n \n mockMode?: boolean;\n \n // Database configuration\n databaseConfig?: Record<string, unknown>;\n \n // Planning configuration\n planningConfig?: {\n // Future planning depth (for v0.2)\n prefetchDepth?: number;\n // Custom temperature for the LLM (0.0 - 1.0)\n temperature?: number;\n // Whether to use streaming (otherwise wait for complete response)\n streaming?: boolean;\n };\n}\n\n/**\n * AutoUI - Main component for generating goal-oriented UIs\n * \n * @example\n * ```tsx\n * import { AutoUI } from 'autoui-react';\n * import { emailsTable, usersTable } from './schema';\n * \n * function MyApp() {\n * return (\n * <AutoUI \n * schema={{ emails: emailsTable, users: usersTable }}\n * goal=\"Create an inbox view with email list and detail view\"\n * />\n * );\n * }\n * ```\n */\nexport const AutoUI: React.FC<AutoUIProps> = ({\n schema,\n goal,\n componentAdapter = 'shadcn',\n userContext,\n onEvent,\n eventHooks,\n systemEventHooks,\n debugMode = false,\n mockMode = true,\n databaseConfig,\n planningConfig,\n integration = {},\n scope = {},\n enablePartialUpdates = false,\n}) => {\n // Initialize schema adapter if provided\n const [schemaAdapterInstance, setSchemaAdapterInstance] = useState<SchemaAdapter | null>(null);\n const [dataContext, setDataContext] = useState<DataContext>({});\n \n // Use direct schema as the effective schema\n const effectiveSchema = schema as Record<string, unknown>;\n const scopedGoal = goal;\n // Pass undefined for the router - it will use the default in the useUIStateEngine function\n \n // Register system event hooks\n useEffect(() => {\n const unregisters: Array<() => void> = [];\n \n // Register system event hooks\n if (systemEventHooks) {\n Object.entries(systemEventHooks).forEach(([eventType, hooks]) => {\n if (!hooks) return;\n \n (hooks as SystemEventHook[]).forEach(hook => {\n const unregister = systemEvents.on(eventType as SystemEventType, hook);\n unregisters.push(unregister);\n });\n });\n }\n \n // Debug mode - log all system events to console\n if (debugMode) {\n const debugHook: SystemEventHook = (event) => {\n console.debug(`[AutoUI Debug] System Event:`, event);\n };\n \n // Register for all system event types\n Object.values(SystemEventType).forEach(eventType => {\n const unregister = systemEvents.on(eventType, debugHook);\n unregisters.push(unregister);\n });\n }\n \n return () => {\n unregisters.forEach(unregister => unregister());\n };\n }, [systemEventHooks, debugMode]);\n \n // Initialize data context based on schema\n useEffect(() => {\n const initializeDataContext = async () => {\n let initialData: DataContext = {};\n \n if (schemaAdapterInstance) {\n // Use schema adapter to initialize data context\n initialData = await schemaAdapterInstance.initializeDataContext();\n } else if (effectiveSchema) {\n // Initialize with direct schema object\n Object.entries(effectiveSchema).forEach(([key, tableSchema]) => {\n // Add schema information\n initialData[key] = {\n schema: tableSchema,\n // For development, add sample data if available\n data: (tableSchema as any)?.sampleData || [],\n selected: null,\n };\n });\n }\n \n // Add user context if provided\n if (userContext) {\n initialData.user = userContext;\n }\n \n setDataContext(initialData);\n };\n \n initializeDataContext();\n }, [effectiveSchema, schemaAdapterInstance, userContext]);\n \n // Initialize the UI state engine with scoped goal\n const { state, handleEvent } = useUIStateEngine({\n schema: effectiveSchema,\n goal: scopedGoal,\n userContext,\n mockMode,\n planningConfig,\n router: undefined,\n dataContext,\n enablePartialUpdates,\n });\n \n // Create event manager\n const eventManagerRef = useRef(new EventManager());\n \n // Register event hooks\n useEffect(() => {\n if (!eventHooks) return;\n \n const unregisters: Array<() => void> = [];\n \n // Register global hooks\n if (eventHooks.all) {\n const unregister = eventManagerRef.current.register('all', async (ctx) => {\n for (const hook of eventHooks.all || []) {\n await hook(ctx);\n if (ctx.isPropagationStopped()) break;\n }\n });\n unregisters.push(unregister);\n }\n \n // Register type-specific hooks\n Object.entries(eventHooks).forEach(([type, hooks]) => {\n if (type === 'all' || !hooks) return;\n \n const unregister = eventManagerRef.current.register([type as UIEventType], async (ctx) => {\n for (const hook of hooks as EventHook[]) {\n await hook(ctx);\n if (ctx.isPropagationStopped()) break;\n }\n });\n unregisters.push(unregister);\n });\n \n // Cleanup on unmount or when hooks change\n return () => {\n unregisters.forEach(unregister => unregister());\n };\n }, [eventHooks]);\n \n // Process events and update data context\n const processEvent = useCallback(async (event: UIEvent) => {\n // Process through event hooks\n const shouldProceed = await eventManagerRef.current.processEvent(event);\n \n // Call the external event handler if provided\n if (onEvent) {\n onEvent(event);\n }\n \n if (!shouldProceed) {\n console.info('Event processing was prevented by hooks', event);\n return;\n }\n \n // Find the event configuration in the layout tree\n const findNodeById = (node: UISpecNode | undefined, id: string): UISpecNode | undefined => {\n if (!node) return undefined;\n if (node.id === id) return node;\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, id);\n if (found) return found;\n }\n }\n return undefined;\n };\n \n const sourceNode = findNodeById(state.layout, event.nodeId);\n if (!sourceNode) {\n console.warn(`Node not found for event: ${event.nodeId}`);\n handleEvent(event);\n return;\n }\n \n // Get the event configuration\n const eventConfig = sourceNode.events?.[event.type];\n if (!eventConfig) {\n console.warn(`No event config found for ${event.type} on node ${event.nodeId}`);\n handleEvent(event);\n return;\n }\n \n // Execute the action and update data context\n const newContext = executeAction(\n eventConfig.action,\n eventConfig.target,\n {\n ...eventConfig.payload,\n ...event.payload,\n },\n dataContext,\n state.layout\n );\n \n // Update the data context\n setDataContext(newContext);\n \n // Forward the event to the UI state engine\n handleEvent(event);\n }, [dataContext, handleEvent, onEvent, state.layout]);\n \n // Resolve bindings for the layout using the current data context\n const [resolvedLayout, setResolvedLayout] = useState<UISpecNode | undefined>(undefined);\n // Add state for rendered node\n const [renderedNode, setRenderedNode] = useState<React.ReactElement | null>(null);\n \n // Update the resolved layout whenever state.layout or dataContext changes\n useEffect(() => {\n if (state.layout) {\n resolveBindings(state.layout, dataContext)\n .then(resolved => setResolvedLayout(resolved))\n .catch(err => console.error('Error resolving bindings:', err));\n } else {\n setResolvedLayout(undefined);\n }\n }, [state.layout, dataContext]);\n \n // Handle async rendering of the node\n useEffect(() => {\n if (resolvedLayout) {\n // Render the node and update state when Promise resolves\n renderNode(resolvedLayout, componentAdapter as \"shadcn\")\n .then(rendered => setRenderedNode(rendered))\n .catch(err => console.error('Error rendering node:', err));\n } else {\n setRenderedNode(null);\n }\n }, [resolvedLayout, componentAdapter]);\n \n // Render UI\n return (\n <div \n className={`autoui-root ${integration.className || ''}`}\n id={integration.id}\n data-mode={integration.mode}\n data-scope={scope?.type || 'full'}\n >\n {state.loading || !resolvedLayout ? (\n // Render shimmer loading state\n <div className=\"autoui-loading\">\n {state.layout ? (\n renderShimmer(state.layout, componentAdapter as \"shadcn\")\n ) : (\n <div className=\"autoui-shimmer-container\">\n <div className=\"autoui-shimmer-header\" />\n <div className=\"autoui-shimmer-content\" />\n </div>\n )}\n </div>\n ) : (\n // Render the resolved layout\n <div className=\"autoui-content\">\n {renderedNode}\n </div>\n )}\n \n {state.error && (\n <div className=\"autoui-error\">\n <p className=\"autoui-error-title\">Error generating UI</p>\n <p className=\"autoui-error-message\">{state.error}</p>\n </div>\n )}\n </div>\n );\n};","import { useReducer, useCallback, useEffect, useState } from 'react';\n// Mock useChat hook for development\nconst useChat = (config: any) => ({\n append: async (message: any) => {},\n data: { content: '{}' },\n isLoading: false,\n error: null as Error | null,\n stop: () => {},\n});\n\nimport { \n UIState, \n UIEvent, \n UISpecNode, \n uiSpecNode, \n PlannerInput \n} from '../schema/ui';\nimport { uiReducer, initialState } from './reducer';\nimport { buildPrompt, mockPlanner } from './planner';\nimport { systemEvents, createSystemEvent, SystemEventType } from './system-events';\nimport { ActionRouter, ActionType, createDefaultRouter } from './action-router';\n\ninterface UseUIStateEngineOptions {\n schema: Record<string, unknown>;\n goal: string;\n userContext?: Record<string, unknown> | undefined;\n mockMode?: boolean | undefined;\n planningConfig?: {\n prefetchDepth?: number | undefined;\n temperature?: number | undefined;\n streaming?: boolean | undefined;\n } | undefined;\n router?: ActionRouter | undefined;\n dataContext?: Record<string, unknown> | undefined;\n enablePartialUpdates?: boolean | undefined;\n}\n\n/**\n * Custom hook for the UI state engine\n * @param options - Configuration options\n * @returns State and dispatcher\n */\nexport function useUIStateEngine({\n schema,\n goal,\n userContext,\n mockMode = false,\n planningConfig = {},\n router = createDefaultRouter(),\n dataContext = {},\n enablePartialUpdates = false,\n}: UseUIStateEngineOptions) {\n const [state, dispatch] = useReducer(uiReducer, initialState);\n const { append, data, isLoading, error, stop } = useChat(null);\n\n // Function to handle UI events with routing\n const handleEvent = useCallback((event: UIEvent) => {\n // Dispatch the UI event\n dispatch({ type: 'UI_EVENT', event });\n \n // Stop any ongoing chat streams\n stop();\n \n // Use the router to determine how to handle this event\n if (enablePartialUpdates) {\n const route = router.resolveRoute(\n event, \n schema, \n state.layout, \n dataContext, \n goal, \n userContext\n );\n \n if (route) {\n console.log('Resolved route:', route);\n \n // Emit routing event\n systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_START, { \n plannerInput: route.plannerInput \n })\n );\n \n if (mockMode) {\n // Use mock planner with routing info\n const node = mockPlanner(route.plannerInput, route.targetNodeId, route.prompt);\n // Dispatch based on action type\n switch (route.actionType) {\n case ActionType.FULL_REFRESH:\n dispatch({ type: 'AI_RESPONSE', node });\n break;\n \n case ActionType.UPDATE_NODE:\n case ActionType.SHOW_DETAIL:\n case ActionType.HIDE_DETAIL:\n case ActionType.TOGGLE_STATE:\n case ActionType.ADD_DROPDOWN:\n case ActionType.UPDATE_FORM:\n case ActionType.NAVIGATE:\n dispatch({ \n type: 'PARTIAL_UPDATE', \n nodeId: route.targetNodeId, \n node \n });\n break;\n }\n } else {\n // Send prompt to LLM\n const prompt = route.prompt;\n \n systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_PROMPT_CREATED, { prompt })\n );\n \n append({\n content: prompt,\n role: 'user',\n });\n \n // The response will be handled in the useEffect below\n // We'll need to store the current route info for when the response comes back\n sessionStorage.setItem('currentRoute', JSON.stringify({\n actionType: route.actionType,\n targetNodeId: route.targetNodeId\n }));\n }\n \n return;\n }\n }\n \n // Fallback to full refresh if no route or partial updates disabled\n const input: PlannerInput = {\n schema,\n goal,\n history: [...state.history, event],\n userContext,\n };\n \n if (mockMode) {\n // Use mock planner for faster development\n const node = mockPlanner(input);\n dispatch({ type: 'AI_RESPONSE', node });\n } else {\n // Send prompt to LLM\n const prompt = buildPrompt(input);\n append({\n content: prompt,\n role: 'user',\n });\n }\n }, [append, goal, schema, state.history, state.layout, stop, userContext, router, mockMode, dataContext, enablePartialUpdates]);\n\n // Effect to process LLM responses\n useEffect(() => {\n if (isLoading) {\n dispatch({ type: 'LOADING', isLoading: true });\n } else if (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n dispatch({ type: 'ERROR', message: errorMessage });\n \n // Emit error event\n systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_ERROR, { \n error: error instanceof Error ? error : new Error(String(error))\n })\n );\n } else if (data.content) {\n try {\n // Emit response chunk event\n systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_RESPONSE_CHUNK, { \n chunk: data.content,\n isComplete: true\n })\n );\n \n // Extract JSON from the response (handling potential markdown code blocks)\n const jsonMatch = data.content.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/) || [null, data.content];\n const jsonStr = jsonMatch[1].trim();\n \n const parsedJson = JSON.parse(jsonStr);\n // Validate the response using Zod\n const validatedNode = uiSpecNode.parse(parsedJson);\n \n // Check for stored route info\n const routeInfoStr = sessionStorage.getItem('currentRoute');\n if (routeInfoStr && enablePartialUpdates) {\n try {\n const routeInfo = JSON.parse(routeInfoStr);\n \n // Handle response based on action type\n switch (routeInfo.actionType) {\n case ActionType.FULL_REFRESH:\n dispatch({ type: 'AI_RESPONSE', node: validatedNode });\n break;\n \n case ActionType.UPDATE_NODE:\n case ActionType.SHOW_DETAIL:\n case ActionType.HIDE_DETAIL:\n case ActionType.TOGGLE_STATE:\n case ActionType.ADD_DROPDOWN:\n case ActionType.UPDATE_FORM:\n case ActionType.NAVIGATE:\n dispatch({ \n type: 'PARTIAL_UPDATE', \n nodeId: routeInfo.targetNodeId, \n node: validatedNode \n });\n break;\n \n default:\n dispatch({ type: 'AI_RESPONSE', node: validatedNode });\n }\n \n // Clear stored route info\n sessionStorage.removeItem('currentRoute');\n } catch (e) {\n // Fallback to full response if route info is invalid\n console.error('Error parsing route info:', e);\n dispatch({ type: 'AI_RESPONSE', node: validatedNode });\n }\n } else {\n // Default handling - full response\n dispatch({ type: 'AI_RESPONSE', node: validatedNode });\n }\n \n // Emit planning complete event\n systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_COMPLETE, { \n layout: validatedNode,\n executionTimeMs: 0 // Not available here\n })\n );\n } catch (parseError) {\n console.error('Failed to parse LLM response:', parseError);\n dispatch({ \n type: 'ERROR', \n message: 'Failed to parse LLM response' \n });\n \n // Emit error event\n systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_ERROR, { \n error: parseError instanceof Error ? parseError : new Error('Parse error')\n })\n );\n }\n }\n }, [data.content, error, isLoading, enablePartialUpdates]);\n\n // Initial query on mount\n useEffect(() => {\n const input: PlannerInput = {\n schema,\n goal,\n history: [],\n userContext,\n };\n \n if (mockMode) {\n // Use mock planner for faster development\n const node = mockPlanner(input);\n dispatch({ type: 'AI_RESPONSE', node });\n } else {\n // Send prompt to LLM\n const prompt = buildPrompt(input);\n append({\n content: prompt,\n role: 'user',\n });\n }\n }, [append, goal, schema, userContext, mockMode]);\n\n return {\n state,\n dispatch,\n handleEvent,\n };\n}","import { z } from 'zod';\n\n/**\n * Event types that can be triggered by UI elements\n */\nexport const uiEventType = z.enum([\n 'CLICK',\n 'CHANGE',\n 'SUBMIT',\n 'MOUSEOVER',\n 'MOUSEOUT',\n 'FOCUS',\n 'BLUR',\n]);\n\nexport type UIEventType = z.infer<typeof uiEventType>;\n\n/**\n * Event payload schema\n */\nexport const uiEvent = z.object({\n type: uiEventType,\n nodeId: z.string(),\n timestamp: z.number().optional(),\n payload: z.record(z.any()).optional(),\n});\n\nexport type UIEvent = z.infer<typeof uiEvent>;\n\n/**\n * AI response types\n */\nexport const aiResponseType = z.enum([\n 'AI_RESPONSE',\n 'ERROR',\n]);\n\nexport type AIResponseType = z.infer<typeof aiResponseType>;\n\n/**\n * Core UI specification node\n * Represents a single element in the UI tree\n */\nexport const uiSpecNode = z.lazy(() => z.object({\n id: z.string(),\n type: z.string(), // e.g., \"ListView\", \"Button\", \"TextField\"\n props: z.record(z.any()).optional(),\n bindings: z.record(z.any()).optional(), // Data bindings\n events: z.record(z.string(), z.object({\n action: z.string(),\n target: z.string().optional(),\n payload: z.record(z.any()).optional(),\n })).optional(),\n children: z.array(uiSpecNode).optional(),\n})) as z.ZodType<UISpecNode>;\n\nexport type UISpecNode = {\n id: string;\n type: string;\n props?: Record<string, any> | undefined;\n bindings?: Record<string, any> | undefined;\n events?: Record<string, {\n action: string;\n target?: string | undefined;\n payload?: Record<string, any> | undefined;\n }> | undefined;\n children?: UISpecNode[] | undefined;\n};\n\n/**\n * Actions that can be dispatched to the reducer\n */\nexport const uiAction = z.discriminatedUnion('type', [\n z.object({\n type: z.literal('UI_EVENT'),\n event: uiEvent,\n }),\n z.object({\n type: z.literal('AI_RESPONSE'),\n node: uiSpecNode,\n }),\n z.object({\n type: z.literal('PARTIAL_UPDATE'),\n nodeId: z.string(),\n node: uiSpecNode,\n }),\n z.object({\n type: z.literal('ADD_NODE'),\n parentId: z.string(),\n node: uiSpecNode,\n index: z.number().optional(),\n }),\n z.object({\n type: z.literal('REMOVE_NODE'),\n nodeId: z.string(),\n }),\n z.object({\n type: z.literal('ERROR'),\n message: z.string(),\n }),\n z.object({\n type: z.literal('LOADING'),\n isLoading: z.boolean(),\n }),\n]);\n\nexport type UIAction = z.infer<typeof uiAction>;\n\n/**\n * Application state for the UI engine\n */\nexport const uiState = z.object({\n layout: uiSpecNode.optional(),\n loading: z.boolean(),\n history: z.array(uiEvent),\n error: z.string().optional(),\n});\n\nexport type UIState = z.infer<typeof uiState>;\n\n/**\n * Input for the AI planner\n */\nexport const plannerInput = z.object({\n schema: z.record(z.unknown()),\n goal: z.string(),\n history: z.array(uiEvent).optional(),\n userContext: z.record(z.unknown()).optional(),\n});\n\nexport type PlannerInput = z.infer<typeof plannerInput>;","import { UISpecNode, PlannerInput } from \"../schema/ui\";\n\n/**\n * System event types that represent the internal AutoUI lifecycle\n */\nexport enum SystemEventType {\n // Planning events\n PLAN_START = 'PLAN_START', // Before AI planning begins\n PLAN_PROMPT_CREATED = 'PLAN_PROMPT_CREATED', // After prompt is built\n PLAN_RESPONSE_CHUNK = 'PLAN_RESPONSE_CHUNK', // For each AI response chunk\n PLAN_COMPLETE = 'PLAN_COMPLETE', // After planning is complete\n PLAN_ERROR = 'PLAN_ERROR', // Planning error occurred\n \n // Binding events\n BINDING_RESOLUTION_START = 'BINDING_RESOLUTION_START', // Before bindings are resolved\n BINDING_RESOLUTION_COMPLETE = 'BINDING_RESOLUTION_COMPLETE', // After bindings are resolved\n \n // Data events\n DATA_FETCH_START = 'DATA_FETCH_START', // Before data is fetched\n DATA_FETCH_COMPLETE = 'DATA_FETCH_COMPLETE', // After data is fetched\n \n // Rendering events\n RENDER_START = 'RENDER_START', // Before layout is rendered\n RENDER_COMPLETE = 'RENDER_COMPLETE', // After layout is rendered\n \n // Prefetch events (for future use)\n PREFETCH_START = 'PREFETCH_START', // Before prefetching begins\n PREFETCH_COMPLETE = 'PREFETCH_COMPLETE', // After prefetching completes\n}\n\n/**\n * Base system event interface\n */\nexport interface SystemEvent {\n type: SystemEventType;\n timestamp: number;\n}\n\n/**\n * Planning events\n */\nexport interface PlanStartEvent extends SystemEvent {\n type: SystemEventType.PLAN_START;\n plannerInput: PlannerInput;\n}\n\nexport interface PlanPromptCreatedEvent extends SystemEvent {\n type: SystemEventType.PLAN_PROMPT_CREATED;\n prompt: string;\n}\n\nexport interface PlanResponseChunkEvent extends SystemEvent {\n type: SystemEventType.PLAN_RESPONSE_CHUNK;\n chunk: string;\n isComplete: boolean;\n}\n\nexport interface PlanCompleteEvent extends SystemEvent {\n type: SystemEventType.PLAN_COMPLETE;\n layout: UISpecNode;\n executionTimeMs: number;\n}\n\nexport interface PlanErrorEvent extends SystemEvent {\n type: SystemEventType.PLAN_ERROR;\n error: Error;\n}\n\n/**\n * Binding events\n */\nexport interface BindingResolutionStartEvent extends SystemEvent {\n type: SystemEventType.BINDING_RESOLUTION_START;\n layout: UISpecNode;\n}\n\nexport interface BindingResolutionCompleteEvent extends SystemEvent {\n type: SystemEventType.BINDING_RESOLUTION_COMPLETE;\n originalLayout: UISpecNode;\n resolvedLayout: UISpecNode;\n}\n\n/**\n * Data events\n */\nexport interface DataFetchStartEvent extends SystemEvent {\n type: SystemEventType.DATA_FETCH_START;\n tableName: string;\n query: unknown;\n}\n\nexport interface DataFetchCompleteEvent extends SystemEvent {\n type: SystemEventType.DATA_FETCH_COMPLETE;\n tableName: string;\n results: unknown[];\n executionTimeMs: number;\n}\n\n/**\n * Rendering events\n */\nexport interface RenderStartEvent extends SystemEvent {\n type: SystemEventType.RENDER_START;\n layout: UISpecNode;\n}\n\nexport interface RenderCompleteEvent extends SystemEvent {\n type: SystemEventType.RENDER_COMPLETE;\n layout: UISpecNode;\n renderTimeMs: number;\n}\n\n/**\n * Prefetch events\n */\nexport interface PrefetchStartEvent extends SystemEvent {\n type: SystemEventType.PREFETCH_START;\n depth: number;\n}\n\nexport interface PrefetchCompleteEvent extends SystemEvent {\n type: SystemEventType.PREFETCH_COMPLETE;\n prefetchedLayouts: Record<string, UISpecNode>;\n}\n\n/**\n * Union type of all system events\n */\nexport type AnySystemEvent =\n | PlanStartEvent\n | PlanPromptCreatedEvent\n | PlanResponseChunkEvent\n | PlanCompleteEvent\n | PlanErrorEvent\n | BindingResolutionStartEvent\n | BindingResolutionCompleteEvent\n | DataFetchStartEvent\n | DataFetchCompleteEvent\n | RenderStartEvent\n | RenderCompleteEvent\n | PrefetchStartEvent\n | PrefetchCompleteEvent;\n\n/**\n * System event hook type\n */\nexport type SystemEventHook<T extends SystemEvent = AnySystemEvent> = (\n event: T\n) => void | Promise<void>;\n\n/**\n * System event manager\n */\nexport class SystemEventManager {\n private listeners: Partial<Record<SystemEventType, SystemEventHook[]>> = {};\n \n /**\n * Register a listener for a specific system event type\n * \n * @param eventType - The system event type to listen for\n * @param listener - The listener function\n * @returns Function to unregister the listener\n */\n public on<T extends SystemEventType>(\n eventType: T,\n listener: SystemEventHook<Extract<AnySystemEvent, { type: T }>>\n ): () => void {\n if (!this.listeners[eventType]) {\n this.listeners[eventType] = [];\n }\n \n this.listeners[eventType]?.push(listener as SystemEventHook);\n \n return () => {\n if (this.listeners[eventType]) {\n this.listeners[eventType] = this.listeners[eventType]?.filter(\n l => l !== listener\n );\n }\n };\n }\n \n /**\n * Emit a system event to all registered listeners\n * \n * @param event - The system event to emit\n */\n public async emit<T extends AnySystemEvent>(event: T): Promise<void> {\n const listeners = this.listeners[event.type] || [];\n \n for (const listener of listeners) {\n await listener(event);\n }\n }\n}\n\n// Create a singleton instance for global access\nexport const systemEvents = new SystemEventManager();\n\n/**\n * Helper to create a typed system event\n * \n * @param type - The system event type\n * @param data - Additional event data\n * @returns A system event object\n */\nexport function createSystemEvent<T extends SystemEventType>(\n type: T,\n data: Omit<Extract<AnySystemEvent, { type: T }>, 'type' | 'timestamp'>\n): Extract<AnySystemEvent, { type: T }> {\n return {\n type,\n timestamp: Date.now(),\n ...data,\n } as Extract<AnySystemEvent, { type: T }>;\n}","// Environment configuration\n\n// For development/testing, provide fallback values\nexport const env = {\n MOCK_PLANNER: import.meta.env?.VITE_MOCK_PLANNER || '1',\n NODE_ENV: import.meta.env?.MODE || 'development',\n // Add other environment variables as needed\n}; ","import { useChat } from '@ai-sdk/react';\nimport { PlannerInput, UISpecNode, uiSpecNode } from '../schema/ui';\nimport { \n createSystemEvent, \n systemEvents, \n SystemEventType \n} from './system-events';\nimport { env } from '../env';\n\n// Define types for the chat response\ninterface ChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\ninterface ChatResponse {\n messages: ChatMessage[];\n append: (message: { content: string; role: string }) => Promise<void>;\n}\n\n/**\n * Builds the prompt for the LLM planner\n * @param input - Planner input including schema, goal, and history\n * @param targetNodeId - Optional target node ID for partial updates\n * @param customPrompt - Optional custom prompt\n * @returns Formatted prompt string\n */\nexport function buildPrompt(input: PlannerInput, targetNodeId?: string, customPrompt?: string): string {\n const { schema, goal, history, userContext } = input;\n \n // Extract schema information without actual data rows\n const schemaInfo = Object.entries(schema)\n .map(([tableName, tableSchema]) => {\n return `Table: ${tableName}\\nSchema: ${JSON.stringify(tableSchema)}`;\n })\n .join('\\n\\n');\n \n // Format recent events for context\n const recentEvents = history?.slice(-5).map(event => \n `Event: ${event.type} on node ${event.nodeId}${\n event.payload ? ` with payload ${JSON.stringify(event.payload)}` : ''\n }`\n ).join('\\n') || 'No recent events';\n \n // Build user context section if provided\n const userContextSection = userContext \n ? `\\n\\nUser Context:\\n${JSON.stringify(userContext)}`\n : '';\n \n // Assemble the full prompt\n return `\nYou are an expert UI generator. \nCreate a user interface that achieves the following goal: \"${goal}\"\n\nAvailable data schema:\n${schemaInfo}\n\nRecent user interactions:\n${recentEvents}${userContextSection}\n\nGenerate a complete UI specification in JSON format that matches the following TypeScript type:\ntype UISpecNode = {\n id: string;\n type: string;\n props?: Record<string, any>;\n bindings?: Record<string, any>;\n events?: Record<string, { action: string; target?: string; payload?: Record<string, any>; }>;\n children?: UISpecNode[];\n};\n\nUI Guidance:\n1. Create a focused interface that directly addresses the goal\n2. Use appropriate UI patterns (lists, forms, details, etc.)\n3. Include navigation between related views when needed\n4. Keep the interface simple and intuitive\n5. Bind to schema data where appropriate\n6. Provide event handlers for user interactions\n\nRespond ONLY with the JSON UI specification and no other text.\n `;\n}\n\n/**\n * Mock planner for development and testing\n * @param input - Planner input\n * @param targetNodeId - Optional target node ID for partial updates\n * @param customPrompt - Optional custom prompt\n * @returns Promise resolving to a UISpecNode\n */\nexport function mockPlanner(\n input: PlannerInput, \n targetNodeId?: string,\n customPrompt?: string\n): UISpecNode {\n // Create a simple mock node example\n const mockNode: UISpecNode = {\n id: targetNodeId || 'root',\n type: 'Container',\n props: { title: 'Mock UI' },\n children: [\n {\n id: 'text-1',\n type: 'Text',\n props: { text: 'This is a mock UI for testing' }\n }\n ]\n };\n \n return mockNode;\n}\n\n/**\n * Calls the LLM planner to generate a UI specification\n * @param input - Planner input\n * @returns Promise resolving to a UISpecNode\n */\nexport async function callPlannerLLM(\n input: PlannerInput,\n chatHook = useChat\n): Promise<UISpecNode> {\n // Emit planning start event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_START, { plannerInput: input })\n );\n \n // Use mock planner if environment variable is set\n if (env.MOCK_PLANNER === '1') {\n return mockPlanner(input);\n }\n \n const startTime = Date.now();\n const prompt = buildPrompt(input);\n \n // Emit prompt created event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_PROMPT_CREATED, { prompt })\n );\n \n try {\n const { append, messages } = chatHook({\n api: '/api/ai',\n headers: {\n 'Content-Type': 'application/json',\n },\n onFinish: async (message) => {\n // Emit final chunk event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_RESPONSE_CHUNK, { \n chunk: message.content,\n isComplete: true\n })\n );\n }\n }) as ChatResponse;\n \n // Send the prompt to the LLM\n await append({\n content: prompt,\n role: 'user',\n });\n\n if (!messages || messages.length === 0) {\n throw new Error('No response from LLM');\n }\n \n // Parse the LLM response\n const responseText = messages[messages.length - 1]?.content;\n \n if (!responseText) {\n throw new Error('Empty response from LLM');\n }\n \n // Extract JSON from the response (handling potential markdown code blocks)\n const jsonMatch = responseText.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/) || [null, responseText];\n const jsonStr = jsonMatch[1].trim();\n \n try {\n const parsedJson = JSON.parse(jsonStr);\n // Validate the response using Zod\n const validatedNode = uiSpecNode.parse(parsedJson);\n \n // Emit planning complete event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_COMPLETE, { \n layout: validatedNode,\n executionTimeMs: Date.now() - startTime\n })\n );\n \n return validatedNode;\n } catch (parseError) {\n console.error('Failed to parse LLM response as JSON:', parseError);\n \n // Emit error event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_ERROR, { \n error: new Error('Invalid JSON response from LLM')\n })\n );\n \n throw new Error('Invalid JSON response from LLM');\n }\n } catch (error) {\n console.error('Error calling LLM planner:', error);\n \n // Emit error event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_ERROR, { \n error: error instanceof Error ? error : new Error(String(error))\n })\n );\n \n throw error;\n }\n}","import React from 'react';\nimport { UISpecNode } from '../schema/ui';\n\n// This would typically import components from your shadcn UI library\n// For this example, we'll create placeholder components\n\n// Shimmer components\nexport const ShimmerBlock: React.FC = () => (\n <div className=\"w-full h-8 bg-gray-200 animate-pulse rounded\" />\n);\n\nexport const ShimmerTable: React.FC<{ rows?: number }> = ({ rows = 3 }) => (\n <div className=\"w-full space-y-2\">\n <div className=\"w-full h-10 bg-gray-200 animate-pulse rounded\" />\n {Array.from({ length: rows }).map((_, i) => (\n <div key={i} className=\"w-full h-12 bg-gray-200 animate-pulse rounded\" />\n ))}\n </div>\n);\n\nexport const ShimmerCard: React.FC = () => (\n <div className=\"w-full p-4 space-y-4 border rounded-lg\">\n <div className=\"w-3/4 h-6 bg-gray-200 animate-pulse rounded\" />\n <div className=\"space-y-2\">\n <div className=\"w-full h-4 bg-gray-200 animate-pulse rounded\" />\n <div className=\"w-full h-4 bg-gray-200 animate-pulse rounded\" />\n <div className=\"w-5/6 h-4 bg-gray-200 animate-pulse rounded\" />\n </div>\n </div>\n);\n\n// Mock ShadCN components for demonstration\nconst Container: React.FC<{ style?: React.CSSProperties; className?: string; children?: React.ReactNode }> = (props) => (\n <div className={`w-full ${props.className || ''}`} style={props.style}>\n {props.children}\n </div>\n);\n\nconst Header: React.FC<{ title: string }> = ({ title }) => (\n <header className=\"py-4 px-6 border-b mb-4\">\n <h1 className=\"text-xl font-semibold\">{title}</h1>\n </header>\n);\n\nconst Button: React.FC<{ \n onClick?: () => void; \n children: React.ReactNode;\n variant?: 'default' | 'outline' | 'destructive';\n}> = ({ onClick, children, variant = 'default' }) => (\n <button \n className={`px-4 py-2 rounded font-medium ${\n variant === 'default' ? 'bg-blue-600 text-white' : \n variant === 'outline' ? 'border border-gray-300 text-gray-700' :\n 'bg-red-600 text-white'\n }`}\n onClick={onClick}\n >\n {children}\n </button>\n);\n\nconst Table: React.FC<{\n items?: any[];\n fields?: { key: string; label: string }[];\n onSelect?: (item: any) => void;\n selectable?: boolean;\n}> = ({ items = [], fields = [], onSelect, selectable }) => (\n <div className=\"w-full border rounded-lg overflow-hidden\">\n <table className=\"w-full\">\n <thead className=\"bg-gray-50\">\n <tr>\n {fields.map((field) => (\n <th key={field.key} className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n {field.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {items.map((item, index) => (\n <tr \n key={index}\n onClick={() => selectable && onSelect && onSelect(item)}\n className={selectable ? 'cursor-pointer hover:bg-gray-50' : ''}\n >\n {fields.map((field) => (\n <td key={field.key} className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-500\">\n {item[field.key]}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n);\n\nconst Detail: React.FC<{\n data?: any;\n fields?: { key: string; label: string; type?: string }[];\n title?: string;\n visible?: boolean;\n onBack?: () => void;\n}> = ({ data, fields = [], title, visible = true, onBack }) => {\n if (!visible) return null;\n \n return (\n <div className=\"w-full border rounded-lg p-6 space-y-4\">\n <div className=\"flex justify-between items-center\">\n {title && <h2 className=\"text-lg font-medium\">{title}</h2>}\n {onBack && (\n <Button variant=\"outline\" onClick={onBack}>\n Back\n </Button>\n )}\n </div>\n \n <div className=\"space-y-4\">\n {fields.map((field) => {\n if (field.type === 'heading') {\n return (\n <h3 key={field.key} className=\"text-xl font-semibold\">\n {data?.[field.key]}\n </h3>\n );\n }\n \n if (field.type === 'content') {\n return (\n <div key={field.key} className=\"text-sm text-gray-700\">\n {data?.[field.key]}\n </div>\n );\n }\n \n return (\n <div key={field.key} className=\"flex flex-col\">\n {field.label && (\n <span className=\"text-xs text-gray-500\">{field.label}</span>\n )}\n <span className=\"text-sm\">{data?.[field.key]}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\n// Mock implementation - in a real application, this would dispatch events to your state engine\nconst createEventHandler = (node: UISpecNode, eventName: string) => {\n const eventConfig = node.events?.[eventName];\n if (!eventConfig) return undefined;\n \n return () => {\n console.log(`Event triggered: ${eventName} on node ${node.id}`, {\n action: eventConfig.action,\n target: eventConfig.target,\n payload: eventConfig.payload,\n });\n // In real implementation: dispatch({ type: 'UI_EVENT', event: { ... } })\n };\n};\n\n// Adapter function to map node types to shadcn components\nexport const adapterMap: Record<string, (node: UISpecNode) => React.ReactElement> = {\n Container: (node) => (\n <Container style={node.props?.style} className={node.props?.className}>\n {node.children?.map((child) => renderNode(child))}\n </Container>\n ),\n \n Header: (node) => (\n <Header title={node.props?.title || 'Untitled'} />\n ),\n \n Button: (node) => (\n <Button \n variant={node.props?.variant} \n onClick={createEventHandler(node, 'onClick')}\n >\n {node.props?.label || 'Button'}\n </Button>\n ),\n \n ListView: (node) => (\n <Table \n items={node.bindings?.items || []}\n fields={node.bindings?.fields || []}\n selectable={node.props?.selectable}\n onSelect={createEventHandler(node, 'onSelect')}\n />\n ),\n \n Detail: (node) => (\n <Detail \n data={node.bindings?.data}\n fields={node.bindings?.fields || []}\n title={node.props?.title}\n visible={node.props?.visible !== false}\n onBack={createEventHandler(node, 'onBack')}\n />\n ),\n};\n\n// Helper to render a node using the adapter map\nexport function renderNode(node: UISpecNode): React.ReactElement {\n const Component = adapterMap[node.type];\n \n if (Component) {\n return Component(node);\n }\n \n // Fallback for unsupported node types\n return (\n <div className=\"p-2 border border-red-300 rounded\">\n <p className=\"text-sm text-red-500\">Unsupported component: {node.type}</p>\n {node.children?.map((child) => renderNode(child))}\n </div>\n );\n}","import React from 'react';\nimport { UISpecNode } from '../schema/ui';\nimport { renderNode as renderShadcnNode, ShimmerBlock, ShimmerTable, ShimmerCard } from '../adapters/shadcn';\nimport { createSystemEvent, systemEvents, SystemEventType } from './system-events';\n\n/**\n * Renders a UI node using the appropriate adapter\n * @param node - UI specification node\n * @param adapter - Component adapter (default: \"shadcn\")\n * @returns React element\n */\nexport async function renderNode(\n node: UISpecNode,\n adapter: 'shadcn' = 'shadcn'\n): Promise<React.ReactElement> {\n const startTime = Date.now();\n \n // Emit render start event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.RENDER_START, { layout: node })\n );\n \n // Select the right adapter based on the adapter parameter\n let result: React.ReactElement;\n \n switch (adapter) {\n case 'shadcn':\n result = renderShadcnNode(node);\n break;\n default:\n console.warn(`Unsupported adapter: ${adapter}, falling back to shadcn`);\n result = renderShadcnNode(node);\n }\n \n // Emit render complete event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.RENDER_COMPLETE, { \n layout: node,\n renderTimeMs: Date.now() - startTime\n })\n );\n \n return result;\n}\n\n/**\n * Generates a shimmer placeholder for a UI node\n * @param node - UI specification node\n * @param adapter - Component adapter (default: \"shadcn\")\n * @returns React element\n */\nexport function renderShimmer(\n node?: UISpecNode,\n adapter: 'shadcn' = 'shadcn'\n): React.ReactElement {\n // If no node, render a default shimmer\n if (!node) {\n return <ShimmerBlock />;\n }\n\n // Generate appropriate shimmer based on node type\n switch (node.type) {\n case 'ListView':\n return <ShimmerTable rows={3} />;\n case 'Detail':\n return <ShimmerCard />;\n case 'Container':\n return (\n <div className=\"space-y-4\">\n {node.children?.map((child, index) => (\n <div key={index}>{renderShimmer(child, adapter)}</div>\n ))}\n </div>\n );\n default:\n return <ShimmerBlock />;\n }\n}","import { UISpecNode } from \"../schema/ui\";\nimport { createSystemEvent, systemEvents, SystemEventType } from \"./system-events\";\n\n/**\n * Interface for the runtime data context\n */\nexport interface DataContext {\n [key: string]: unknown;\n}\n\n/**\n * Get a value from the data context by path\n * Supports dot notation for nested properties\n * \n * @param context - The data context object\n * @param path - The path to the value (e.g., \"emails.data\")\n * @returns The value at the path, or undefined if not found\n */\nexport function getValueByPath(context: DataContext, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = context;\n \n for (const part of parts) {\n if (current === null || current === undefined) {\n return undefined;\n }\n \n if (typeof current !== 'object') {\n return undefined;\n }\n \n current = (current as Record<string, unknown>)[part];\n }\n \n return current;\n}\n\n/**\n * Set a value in the data context by path\n * Creates intermediate objects if they don't exist\n * \n * @param context - The data context object\n * @param path - The path to set (e.g., \"emails.selected\")\n * @param value - The value to set\n * @returns Updated data context\n */\nexport function setValueByPath(\n context: DataContext,\n path: string,\n value: unknown\n): DataContext {\n // Create a shallow copy to avoid mutating the original\n const result = { ...context };\n const parts = path.split('.');\n \n let current: any = result;\n \n // Navigate to the parent object of the property we want to set\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n \n // Create the object if it doesn't exist\n if (!(part in current) || current[part] === null || current[part] === undefined) {\n current[part] = {};\n }\n \n // Move to the next level\n current = current[part];\n \n // Ensure the current level is an object\n if (typeof current !== 'object') {\n current = {};\n }\n }\n \n // Set the value at the final property\n const lastPart = parts[parts.length - 1];\n current[lastPart] = value;\n \n return result;\n}\n\n/**\n * Process a binding value from a UI node\n * \n * @param binding - The binding value (string path or direct value)\n * @param context - The data context object\n * @returns The resolved value\n */\nexport function processBinding(binding: unknown, context: DataContext): unknown {\n // If binding is a string, treat it as a path to a value in the context\n if (typeof binding === 'string') {\n return getValueByPath(context, binding);\n }\n \n // If binding is an array, process each item recursively\n if (Array.isArray(binding)) {\n return binding.map(item => processBinding(item, context));\n }\n \n // If binding is an object, process each property recursively\n if (binding !== null && typeof binding === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(binding)) {\n result[key] = processBinding(value, context);\n }\n return result;\n }\n \n // Otherwise, return the binding as-is\n return binding;\n}\n\n/**\n * Create a deep clone of a node with all bindings resolved\n * \n * @param node - The UI specification node\n * @param context - The data context object\n * @returns A new node with bindings resolved to concrete values\n */\nexport async function resolveBindings(node: UISpecNode, context: DataContext): Promise<UISpecNode> {\n // Emit binding resolution start event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.BINDING_RESOLUTION_START, { layout: node })\n );\n \n // Clone the node to avoid mutating the original\n const result: UISpecNode = {\n ...node,\n props: node.props ? { ...node.props } : undefined,\n events: node.events ? { ...node.events } : undefined,\n };\n \n // Resolve bindings to concrete values\n if (node.bindings) {\n // Process each binding in the node\n for (const [key, binding] of Object.entries(node.bindings)) {\n const value = processBinding(binding, context);\n \n // Add the resolved value to props if not undefined\n if (value !== undefined) {\n if (!result.props) {\n result.props = {};\n }\n result.props[key] = value;\n }\n }\n }\n \n // Process children recursively\n if (node.children) {\n result.children = await Promise.all(node.children.map(child => resolveBindings(child, context)));\n }\n \n // Emit binding resolution complete event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.BINDING_RESOLUTION_COMPLETE, { \n originalLayout: node,\n resolvedLayout: result\n })\n );\n \n return result;\n}\n\n/**\n * Execute an action based on event configuration\n * \n * @param action - The action type (e.g., \"VIEW_DETAIL\")\n * @param targetId - The target node ID\n * @param payload - Optional payload for the action\n * @param context - The data context\n * @param layoutTree - The current UI layout tree\n * @returns Updated data context\n */\nexport function executeAction(\n action: string,\n targetId?: string,\n payload?: Record<string, unknown>,\n context: DataContext = {},\n layoutTree?: UISpecNode\n): DataContext {\n // Clone the context to avoid mutations\n let newContext = { ...context };\n \n switch (action) {\n case 'VIEW_DETAIL': {\n // Set the selected item in the context\n if (payload?.item) {\n newContext = setValueByPath(newContext, 'selected', payload.item);\n }\n \n // Update visibility of the target node if provided\n if (targetId && layoutTree) {\n // For now, we don't modify the layout tree directly\n // This would be handled by the reducer in a real implementation\n }\n break;\n }\n \n case 'HIDE_DETAIL': {\n // Clear the selected item\n newContext = setValueByPath(newContext, 'selected', null);\n \n // Update visibility of the target node if provided\n if (targetId && layoutTree) {\n // For now, we don't modify the layout tree directly\n // This would be handled by the reducer in a real implementation\n }\n break;\n }\n \n case 'SET_VALUE': {\n // Set a value in the context\n if (payload?.path && 'value' in payload) {\n const path = String(payload.path);\n newContext = setValueByPath(newContext, path, payload.value);\n }\n break;\n }\n \n // Add more actions as needed\n \n default:\n console.warn(`Unknown action: ${action}`);\n }\n \n return newContext;\n}","import { UIEvent, UIEventType } from \"../schema/ui\";\n\nexport interface EventHookOptions {\n preventDefault?: boolean;\n stopPropagation?: boolean;\n}\n\nexport interface EventHookContext {\n originalEvent: UIEvent;\n preventDefault: () => void;\n stopPropagation: () => void;\n isDefaultPrevented: () => boolean;\n isPropagationStopped: () => boolean;\n}\n\nexport type EventHook = (context: EventHookContext) => void | Promise<void>;\n\nexport interface EventHooksMap {\n // Global hooks for all events\n all?: EventHook[];\n \n // Specific event type hooks\n [key: string]: EventHook[] | undefined;\n}\n\n/**\n * Event manager to handle registration and execution of event hooks\n */\nexport class EventManager {\n private hooks: EventHooksMap = {};\n \n /**\n * Register a hook for specific event types\n * \n * @param eventTypes - Event types to register for, or 'all' for all events\n * @param hook - Hook function to execute\n * @returns Unregister function\n */\n public register(eventTypes: UIEventType[] | 'all', hook: EventHook): () => void {\n if (eventTypes === 'all') {\n if (!this.hooks.all) {\n this.hooks.all = [];\n }\n this.hooks.all.push(hook);\n \n return () => {\n if (this.hooks.all) {\n this.hooks.all = this.hooks.all.filter(h => h !== hook);\n }\n };\n }\n \n eventTypes.forEach(type => {\n if (!this.hooks[type]) {\n this.hooks[type] = [];\n }\n this.hooks[type]?.push(hook);\n });\n \n return () => {\n eventTypes.forEach(type => {\n if (this.hooks[type]) {\n this.hooks[type] = this.hooks[type]?.filter(h => h !== hook);\n }\n });\n };\n }\n \n /**\n * Process an event through all registered hooks\n * \n * @param event - The UI event to process\n * @returns Whether the default action should proceed\n */\n public async processEvent(event: UIEvent): Promise<boolean> {\n let defaultPrevented = false;\n let propagationStopped = false;\n \n const context: EventHookContext = {\n originalEvent: event,\n preventDefault: () => { defaultPrevented = true; },\n stopPropagation: () => { propagationStopped = true; },\n isDefaultPrevented: () => defaultPrevented,\n isPropagationStopped: () => propagationStopped,\n };\n \n // Run global hooks first\n if (this.hooks.all) {\n for (const hook of this.hooks.all) {\n await hook(context);\n if (propagationStopped) break;\n }\n }\n \n // If propagation not stopped and we have specific hooks for this event type\n if (!propagationStopped && this.hooks[event.type]) {\n for (const hook of this.hooks[event.type] || []) {\n await hook(context);\n if (propagationStopped) break;\n }\n }\n \n return !defaultPrevented;\n }\n}\n\n/**\n * Create a hook to intercept specific events\n * \n * @example\n * ```tsx\n * const unregister = useEventHook(['CLICK'], (ctx) => {\n * if (ctx.originalEvent.nodeId === 'deleteButton') {\n * // Show confirmation dialog\n * const confirmed = window.confirm('Are you sure?');\n * if (!confirmed) {\n * ctx.preventDefault();\n * }\n * }\n * });\n * ```\n */\nexport function createEventHook(\n eventTypes: UIEventType[] | 'all',\n hook: EventHook,\n options?: EventHookOptions\n): EventHook {\n return async (context) => {\n await hook(context);\n \n if (options?.preventDefault) {\n context.preventDefault();\n }\n \n if (options?.stopPropagation) {\n context.stopPropagation();\n }\n };\n}","import { DataContext } from '../../core/bindings';\n\n/**\n * Drizzle schema adapter types\n */\n\n// Simplified representation of Drizzle schema\nexport interface DrizzleColumn {\n name: string;\n dataType: string;\n notNull?: boolean;\n defaultValue?: unknown;\n primaryKey?: boolean;\n unique?: boolean;\n references?: {\n table: string;\n column: string;\n };\n}\n\nexport interface DrizzleTable {\n name: string;\n schema: string;\n columns: Record<string, DrizzleColumn>;\n}\n\nexport interface DrizzleSchema {\n [tableName: string]: DrizzleTable;\n}\n\n// Database client interface\nexport interface DrizzleClientConfig {\n connectionString?: string | undefined;\n client?: unknown | undefined; // The actual Drizzle client instance\n queryFn?: ((tableName: string, query: any) => Promise<unknown[]>) | undefined;\n}\n\n// Main adapter interface\nexport interface DrizzleAdapterOptions {\n schema: DrizzleSchema;\n client?: DrizzleClientConfig | undefined;\n useMockData?: boolean | undefined;\n mockData?: Record<string, unknown[]> | undefined;\n}\n\n/**\n * Adapter for Drizzle ORM schemas\n * Handles converting Drizzle schema to AutoUI schema format\n * and optionally connects to a database\n */\nexport class DrizzleAdapter {\n private schema: DrizzleSchema;\n private client: DrizzleClientConfig | undefined;\n private useMockData: boolean;\n private mockData: Record<string, unknown[]>;\n \n constructor(options: DrizzleAdapterOptions) {\n this.schema = options.schema;\n this.client = options.client;\n this.useMockData = options.useMockData ?? !options.client;\n this.mockData = options.mockData ?? {};\n }\n \n /**\n * Convert Drizzle schema to AutoUI schema format\n */\n public getSchema(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n \n Object.entries(this.schema).forEach(([tableName, table]) => {\n result[tableName] = {\n tableName: table.name,\n schema: table.schema,\n columns: this.convertColumns(table.columns),\n // Include mock data if available and mock mode is enabled\n ...(this.useMockData && this.mockData[tableName] \n ? { sampleData: this.mockData[tableName] } \n : {})\n };\n });\n \n return result;\n }\n \n /**\n * Convert Drizzle columns to AutoUI column format\n */\n private convertColumns(columns: Record<string, DrizzleColumn>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n \n Object.entries(columns).forEach(([columnName, column]) => {\n result[columnName] = {\n type: this.mapDataType(column.dataType),\n notNull: column.notNull,\n defaultValue: column.defaultValue,\n primaryKey: column.primaryKey,\n unique: column.unique,\n references: column.references,\n };\n });\n \n return result;\n }\n \n /**\n * Map Drizzle data types to standard types\n */\n private mapDataType(drizzleType: string): string {\n const typeMap: Record<string, string> = {\n 'serial': 'integer',\n 'integer': 'integer',\n 'int': 'integer',\n 'bigint': 'integer',\n 'text': 'string',\n 'varchar': 'string',\n 'char': 'string',\n 'boolean': 'boolean',\n 'bool': 'boolean',\n 'timestamp': 'datetime',\n 'timestamptz': 'datetime',\n 'date': 'date',\n 'time': 'time',\n 'json': 'object',\n 'jsonb': 'object',\n 'real': 'number',\n 'float': 'number',\n 'double': 'number',\n 'numeric': 'number',\n 'decimal': 'number',\n };\n \n return typeMap[drizzleType.toLowerCase()] || 'string';\n }\n \n /**\n * Execute a query against the database\n */\n public async query(tableName: string, query: any): Promise<unknown[]> {\n if (this.useMockData) {\n return this.mockData[tableName] || [];\n }\n \n if (!this.client) {\n throw new Error('No database client provided and mock mode is disabled');\n }\n \n if (this.client.queryFn) {\n return this.client.queryFn(tableName, query);\n }\n \n throw new Error('No query function provided in client config');\n }\n \n /**\n * Initialize the data context with schema information and optional mock data\n */\n public async initializeDataContext(): Promise<DataContext> {\n const context: DataContext = {};\n \n for (const [tableName, table] of Object.entries(this.schema)) {\n context[tableName] = {\n schema: table,\n data: this.useMockData ? (this.mockData[tableName] || []) : [],\n selected: null,\n };\n }\n \n return context;\n }\n}","import { DataContext } from '../../core/bindings';\nimport { DrizzleAdapter, DrizzleAdapterOptions } from './drizzle';\n\n/**\n * Generic schema adapter interface\n */\nexport interface SchemaAdapter {\n getSchema(): Record<string, unknown>;\n query(tableName: string, query: any): Promise<unknown[]>;\n initializeDataContext(): Promise<DataContext>;\n}\n\n/**\n * Schema adapter options union type\n */\nexport type SchemaAdapterOptions = \n | { type: 'drizzle'; options: DrizzleAdapterOptions }\n | { type: 'custom'; adapter: SchemaAdapter };\n\n/**\n * Factory function to create the appropriate schema adapter\n */\nexport function createSchemaAdapter(options: SchemaAdapterOptions): SchemaAdapter {\n switch (options.type) {\n case 'drizzle':\n return new DrizzleAdapter(options.options);\n case 'custom':\n return options.adapter;\n default:\n throw new Error(`Unsupported schema adapter type: ${(options as any).type}`);\n }\n}\n\nexport {\n DrizzleAdapter,\n type DrizzleAdapterOptions,\n};","// Basic usage of the AI SDK\nimport { generateText } from 'ai';\nimport { openai } from '@ai-sdk/openai';\n\n/**\n * Example function to generate text using the AI SDK\n * \n * Note: You need to set OPENAI_API_KEY environment variable\n * or use another supported provider\n */\nexport async function generateComponent(schema: any) {\n try {\n // Basic text generation\n const { text } = await generateText({\n model: openai('gpt-4'),\n prompt: `Generate a React component based on this data schema: ${JSON.stringify(schema)}`,\n });\n \n return text;\n } catch (error) {\n console.error('Error generating component:', error);\n throw error;\n }\n}\n\n/**\n * Usage example:\n * \n * ```ts\n * import { generateComponent } from './basic-usage';\n * \n * const schema = {\n * type: 'object',\n * properties: {\n * name: { type: 'string' },\n * age: { type: 'number' },\n * email: { type: 'string', format: 'email' }\n * },\n * required: ['name', 'email']\n * };\n * \n * // Call the function\n * const component = await generateComponent(schema);\n * console.log(component);\n * ```\n */ ","// Example of using the AI SDK\nimport { generateText } from 'ai';\nimport { openai } from '@ai-sdk/openai';\n\n// Example function to demonstrate AI SDK usage\nexport async function generateUIDescription(schema: any) {\n // Make sure to set OPENAI_API_KEY in your environment or .env file\n const { text } = await generateText({\n model: openai('gpt-4'),\n prompt: `Generate a React component description based on this data schema: ${JSON.stringify(schema)}. \n Include what fields should be displayed and what user interactions might be needed.`,\n });\n\n return text;\n}\n\n// Example function to demonstrate structured output with AI SDK\nexport async function generateUIComponent(schema: any) {\n // This would be implemented with the structured output capabilities\n // of AI SDK in a real implementation\n const { text } = await generateText({\n model: openai('gpt-4'),\n prompt: `Generate a basic React component based on this data schema: ${JSON.stringify(schema)}.`,\n });\n\n return text;\n} "]}