autoui-react 0.0.4-alpha → 0.1.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/README.md +6 -52
- package/dist/index.css +0 -10
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +70 -103
- package/dist/index.d.ts +70 -103
- package/dist/index.js +418 -1155
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +412 -1141
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -44
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts","../components/ui/button.tsx","../src/core/reducer.ts","../src/core/action-router.ts","../src/AutoUI.tsx","../src/core/state.ts","../src/core/planner.ts","../src/schema/ui.ts","../src/core/system-events.ts","../src/env.ts","../src/adapters/shadcn.tsx","../src/schema/components.ts","../src/core/renderer.tsx","../src/core/bindings.ts","../src/core/events.ts","../src/core/component-detection.ts","../src/adapters/schema/drizzle.ts","../src/adapters/schema/index.ts","../src/ai-utils.ts","../src/hooks/usePlanner.ts"],"names":["Button","jsx","path","parent","ActionType","plannerInput","useCallback","useEffect","SystemEventType","z","uiEventType","processEvent","renderNode","MAX_CACHE_SIZE","CACHE_TTL","jsxs","findNodeById","useState"],"mappings":"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","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function for conditional class name generation\n * Combines clsx and tailwind-merge for cleaner className assignment\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../src/lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n outline:\n \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n ghost:\n \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","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 } : null,\n bindings: node.bindings ? { ...node.bindings } : null,\n events: node.events ? { ...node.events } : null,\n children: node.children\n ? node.children.map((child) => cloneNode(child))\n : null,\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\n ? parent.children.map((child) =>\n child.id === nodeId ? updatedNode : child\n )\n : null,\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(result, parent.id, () => updatedParent);\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(tree: UISpecNode, nodeId: string): UISpecNode {\n // Find the parent of the node\n function findParent(node: UISpecNode, id: string): 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\n ? node.children.filter((child) => child.id !== nodeId)\n : null,\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: null,\n };\n }\n\n case \"PARTIAL_UPDATE\": {\n if (!state.layout) {\n return {\n ...state,\n layout: action.node,\n loading: false,\n error: null,\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: null,\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: null,\n };\n }\n\n case \"ADD_NODE\": {\n if (!state.layout) {\n // Cannot add to a null layout, perhaps set the new node as root or error\n return {\n ...state,\n error: \"Cannot add node: Layout is empty.\",\n loading: false,\n };\n }\n return {\n ...state,\n layout: addChildNode(\n state.layout,\n action.parentId,\n action.node,\n action.index === null ? undefined : action.index\n ),\n loading: false,\n error: null,\n };\n }\n\n case \"REMOVE_NODE\": {\n if (!state.layout) {\n return {\n ...state,\n error: \"Cannot remove node: Layout is empty.\",\n loading: false,\n };\n }\n try {\n return {\n ...state,\n layout: removeNodeById(state.layout, action.nodeId),\n loading: false,\n error: null,\n };\n } catch (e: unknown) {\n const errorMessage =\n e instanceof Error ? e.message : \"Failed to remove node.\";\n return {\n ...state,\n error: errorMessage,\n loading: false,\n };\n }\n }\n\n case \"ERROR\": {\n return {\n ...state,\n error: action.message,\n loading: false,\n };\n }\n\n case \"LOADING\": {\n return {\n ...state,\n loading: action.isLoading,\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 layout: null,\n loading: false,\n history: [],\n error: null,\n};\n","import { UIEvent, UISpecNode, PlannerInput } from \"../schema/ui\";\nimport { DataContext } from \"./bindings\";\nimport { findNodeById } from \"./reducer\";\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 | null,\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: userContext || null,\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(\n (route) => 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 =\n 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 templateValues = {\n goal,\n eventType: event.type,\n nodeId: event.nodeId,\n targetNodeId,\n actionType: matchingRoute.actionType,\n ...(userContext || {}), // Spread the original userContext (passed to resolveRoute)\n ...additionalContext, // Spread additionalContext afterwards (can override userContext keys)\n };\n const prompt = this.processTemplate(\n matchingRoute.promptTemplate,\n templateValues\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 ? String(values[key]) : `\\${${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:\n '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:\n \"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:\n \"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:\n \"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:\n \"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:\n \"Update the form based on the user changing the value of ${nodeId}\",\n });\n\n return router;\n}\n","import React, { useState, useCallback, useRef, useEffect } from \"react\";\nimport { UIEvent, UISpecNode, UIEventType, DataItem } 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 {\n SystemEventType,\n SystemEventHook,\n systemEvents,\n} from \"./core/system-events\";\nimport { SchemaAdapter } from \"./adapters/schema\";\nimport {\n areShadcnComponentsAvailable,\n getMissingComponentsMessage,\n} from \"./core/component-detection\";\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 planningConfig,\n integration = {},\n scope = {},\n enablePartialUpdates = false,\n}) => {\n // Initialize schema adapter if provided\n const [schemaAdapterInstance] = useState<SchemaAdapter | null>(null);\n const [dataContext, setDataContext] = useState<DataContext>({});\n // Check if required components are available\n const [componentsAvailable, setComponentsAvailable] = useState(true);\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 // Check if required components are available\n useEffect(() => {\n if (componentAdapter === \"shadcn\") {\n setComponentsAvailable(areShadcnComponentsAvailable());\n }\n }, [componentAdapter]);\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(\n eventType as SystemEventType,\n hook\n );\n unregisters.push(unregister);\n });\n });\n }\n\n // Debug mode - log all system events to console EXCEPT FOR RENDER_START\n // to prevent infinite rendering loops\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 EXCEPT RENDER_START and BINDING_RESOLUTION_START\n // which can cause infinite loops when debugging\n Object.values(SystemEventType)\n .filter(\n (eventType) =>\n eventType !== SystemEventType.RENDER_START &&\n eventType !== SystemEventType.BINDING_RESOLUTION_START\n )\n .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:\n (tableSchema as { sampleData?: DataItem[] })?.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(\n \"all\",\n async (ctx) => {\n for (const hook of eventHooks.all || []) {\n await hook(ctx);\n if (ctx.isPropagationStopped()) break;\n }\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(\n [type as UIEventType],\n async (ctx) => {\n for (const hook of hooks as EventHook[]) {\n await hook(ctx);\n if (ctx.isPropagationStopped()) break;\n }\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(\n 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 = (\n node: UISpecNode | undefined | null,\n id: string\n ): 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(\n `No event config found for ${event.type} on node ${event.nodeId}`\n );\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 || \"\", // Provide empty string as fallback if target is null\n {\n ...eventConfig.payload,\n ...event.payload,\n },\n dataContext,\n state.layout || undefined\n );\n\n // Update the data context\n setDataContext(newContext);\n\n // Forward the event to the UI state engine\n handleEvent(event);\n },\n [dataContext, handleEvent, onEvent, state.layout]\n );\n\n // Resolve bindings for the layout using the current data context\n const [resolvedLayout, setResolvedLayout] = useState<UISpecNode | undefined>(\n undefined\n );\n // Add state for rendered node\n const [renderedNode, setRenderedNode] = useState<React.ReactElement | null>(\n null\n );\n\n // Update the resolved layout whenever state.layout or dataContext changes\n // Create a stable function to avoid constantly re-running the effect\n const resolveLayoutBindings = useCallback(async () => {\n if (state.layout) {\n try {\n const resolved = await resolveBindings(state.layout, dataContext);\n setResolvedLayout(resolved);\n } catch (err) {\n console.error(\"Error resolving bindings:\", err);\n }\n } else {\n setResolvedLayout(undefined);\n }\n }, [state.layout, dataContext]);\n\n // Call the stable function in the effect\n useEffect(() => {\n resolveLayoutBindings();\n }, [resolveLayoutBindings]);\n\n // Handle async rendering of the node with a stable reference\n const renderResolvedLayout = useCallback(async () => {\n if (resolvedLayout) {\n try {\n const rendered = await renderNode(\n resolvedLayout,\n componentAdapter as \"shadcn\",\n processEvent\n );\n setRenderedNode(rendered);\n } catch (err) {\n console.error(\"Error rendering node:\", err);\n }\n } else {\n setRenderedNode(null);\n }\n }, [resolvedLayout, componentAdapter, processEvent]);\n\n // Call the stable render function in the effect\n useEffect(() => {\n renderResolvedLayout();\n }, [renderResolvedLayout]);\n\n // If components are not available, show error message\n if (!componentsAvailable) {\n return (\n <div className=\"autoui-error p-4 border border-red-300 bg-red-50 text-red-700 rounded\">\n <p className=\"font-medium\">Component Library Not Found</p>\n <p className=\"text-sm whitespace-pre-line\">\n {getMissingComponentsMessage()}\n </p>\n </div>\n );\n }\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\">{renderedNode}</div>\n )}\n\n {state.error && (\n <div className=\"autoui-error p-4 border border-red-300 bg-red-50 dark:bg-red-900 dark:border-red-700 rounded-md\">\n <p className=\"autoui-error-title text-lg font-semibold text-red-700 dark:text-red-300 mb-2\">\n Error generating UI\n </p>\n <p className=\"autoui-error-message text-sm text-red-600 dark:text-red-300\">\n {state.error}\n </p>\n\n {!mockMode && (\n <div className=\"mt-4 text-sm text-red-600 dark:text-red-300\">\n <p>This could be because:</p>\n <ul className=\"list-disc pl-5 mt-2\">\n <li>Your OpenAI API key is missing or invalid</li>\n <li>The OpenAI service is experiencing issues</li>\n <li>Your API rate limit has been exceeded</li>\n </ul>\n <p className=\"mt-2\">\n Try setting <code>mockMode=true</code> to use sample data\n instead.\n </p>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import { useReducer, useCallback, useEffect } from \"react\";\n// Mock useChat hook for development\n// const useChat = (config: any) => { ... };\n\nimport {\n UIState,\n UIEvent,\n UISpecNode,\n // uiSpecNode, // Will be handled by planner.ts, not directly by state.ts for parsing\n PlannerInput,\n} from \"../schema/ui\";\nimport { uiReducer, initialState } from \"./reducer\";\nimport { buildPrompt, mockPlanner, callPlannerLLM } from \"./planner\"; // Added callPlannerLLM\nimport {\n systemEvents,\n createSystemEvent,\n SystemEventType,\n} from \"./system-events\";\nimport { ActionRouter, ActionType, createDefaultRouter } from \"./action-router\";\n\nexport interface UseUIStateEngineOptions {\n schema: Record<string, unknown>;\n goal: string;\n userContext?: Record<string, unknown> | undefined;\n mockMode?: boolean | undefined;\n planningConfig?:\n | {\n prefetchDepth?: number;\n temperature?: number;\n streaming?: boolean;\n }\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 // Warn if userContext is explicitly null, as it's an edge case we want to discourage.\n // Consumers should use undefined if they mean to omit it.\n if (userContext === null) {\n console.warn(\n \"useUIStateEngine: userContext was explicitly set to null. \" +\n \"This is an allowed but discouraged value. Consider using undefined if you intend to omit the user context.\"\n );\n }\n\n const [state, dispatch] = useReducer(uiReducer, initialState);\n // const { append, data, isLoading, error, stop } = useChat(null); // REMOVE useChat\n\n // Function to handle UI events with routing\n const handleEvent = useCallback(\n async (event: UIEvent) => {\n // Make async\n dispatch({ type: \"UI_EVENT\", event });\n dispatch({ type: \"LOADING\", isLoading: true });\n\n try {\n let resolvedNode: UISpecNode;\n let actionTypeForDispatch: ActionType = ActionType.FULL_REFRESH; // Default\n let targetNodeIdForDispatch: string = \"root\"; // Default\n\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 actionTypeForDispatch = route.actionType;\n targetNodeIdForDispatch = route.targetNodeId;\n\n systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_START, {\n plannerInput: route.plannerInput,\n })\n );\n\n if (mockMode) {\n resolvedNode = mockPlanner(\n route.plannerInput,\n route.targetNodeId,\n route.prompt\n );\n } else {\n // systemEvents.emit for PLAN_PROMPT_CREATED is handled inside callPlannerLLM\n resolvedNode = await callPlannerLLM(route.plannerInput, route);\n }\n } else {\n // Fallback if router.resolveRoute returns null (should not happen with default full refresh)\n const input: PlannerInput = {\n schema,\n goal,\n history: [...state.history, event],\n userContext,\n };\n if (mockMode) {\n resolvedNode = mockPlanner(input);\n } else {\n resolvedNode = await callPlannerLLM(input);\n }\n }\n } else {\n // Fallback to full refresh if partial updates disabled\n const input: PlannerInput = {\n schema,\n goal,\n history: [...state.history, event], // event is already in history from UI_EVENT dispatch\n userContext: userContext,\n };\n\n if (mockMode) {\n resolvedNode = mockPlanner(input);\n } else {\n // buildPrompt is handled inside callPlannerLLM if no route.prompt is provided\n resolvedNode = await callPlannerLLM(input);\n }\n }\n\n // Dispatch based on action type (derived from routing or default)\n switch (actionTypeForDispatch) {\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: targetNodeIdForDispatch,\n node: resolvedNode,\n });\n break;\n case ActionType.FULL_REFRESH:\n default:\n dispatch({ type: \"AI_RESPONSE\", node: resolvedNode });\n break;\n }\n // systemEvents.emit for PLAN_COMPLETE is handled by callPlannerLLM or should be added for mockPlanner path\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n dispatch({ type: \"ERROR\", message: errorMessage });\n systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_ERROR, {\n error: e instanceof Error ? e : new Error(String(e)),\n })\n );\n } finally {\n dispatch({ type: \"LOADING\", isLoading: false });\n }\n },\n [\n // append, // REMOVE\n goal,\n schema,\n state.history, // Keep state.history if input preparation needs it\n state.layout,\n // stop, // REMOVE\n userContext,\n router,\n mockMode,\n dataContext,\n enablePartialUpdates,\n dispatch, // Add dispatch\n ]\n );\n\n // Effect to process LLM responses - REMOVE THIS ENTIRE useEffect\n // useEffect(() => { ... }, [data.content, error, isLoading, enablePartialUpdates]);\n\n // Initial query on mount\n useEffect(() => {\n const initialFetch = async () => {\n /**\n console.log( // <--- ADD THIS LOG\n \"🚀 useUIStateEngine initial load EFFECT TRIGGERED. Goal:\", goal,\n \"MockMode:\", mockMode,\n \"Schema changed:\", schema !== (window as any)._previousSchema, // Crude check\n \"UserContext changed:\", userContext !== (window as any)._previousUserContext // Crude check\n );\n */\n dispatch({ type: \"LOADING\", isLoading: true });\n try {\n const input: PlannerInput = {\n schema,\n goal,\n history: [],\n userContext: userContext,\n };\n let node: UISpecNode;\n if (mockMode) {\n node = mockPlanner(input);\n // TODO: Consider emitting PLAN_COMPLETE for mock path if callPlannerLLM does it internally\n } else {\n // callPlannerLLM will emit PLAN_START, PLAN_PROMPT_CREATED, PLAN_COMPLETE/ERROR\n node = await callPlannerLLM(input);\n }\n dispatch({ type: \"AI_RESPONSE\", node });\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n dispatch({ type: \"ERROR\", message: errorMessage });\n systemEvents.emit(\n // Also emit system event for initial load error\n createSystemEvent(SystemEventType.PLAN_ERROR, {\n error: e instanceof Error ? e : new Error(String(e)),\n })\n );\n } finally {\n dispatch({ type: \"LOADING\", isLoading: false });\n }\n };\n initialFetch();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [goal, schema, userContext, mockMode, dispatch]); // Removed append, kept dispatch\n\n return {\n state,\n dispatch,\n handleEvent,\n };\n}\n","import { createOpenAI } from \"@ai-sdk/openai\";\nimport { generateObject } from \"ai\";\nimport { PlannerInput, UISpecNode, openAIUISpec, UIEvent } from \"../schema/ui\";\nimport {\n createSystemEvent,\n systemEvents,\n SystemEventType,\n} from \"./system-events\";\nimport { env } from \"../env\";\nimport { ActionRouter, RouteResolution } from \"./action-router\";\nimport { DataContext } from \"./bindings\";\n\n// Create a strictly compatible OpenAI provider for structured outputs\nconst strictOpenAI = createOpenAI({\n compatibility: \"strict\", // Required for structured outputs with OpenAI API\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(\n input: PlannerInput,\n customPrompt?: string\n): 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 =\n history\n ?.slice(-5)\n .map(\n (event) =>\n `Event: ${event.type} on node ${event.nodeId}${\n event.payload\n ? ` with payload ${JSON.stringify(event.payload)}`\n : \"\"\n }`\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 // Use custom prompt if provided, otherwise use the default\n if (customPrompt) {\n return customPrompt;\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 node_type: string;\n props?: Record<string, unknown>;\n bindings?: Record<string, unknown>;\n events?: Record<string, { action: string; target: string; payload?: Record<string, unknown>; }>;\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 - make sure to always include both action and target properties\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 if (customPrompt) {\n console.log(\"mockPlanner received customPrompt:\", customPrompt);\n }\n const taskSchema = input.schema.tasks as\n | { sampleData?: unknown[] }\n | undefined;\n const taskData = taskSchema?.sampleData || [\n {\n id: \"1\",\n title: \"Example Task 1\",\n description: \"This is a sample task\",\n status: \"pending\",\n priority: \"medium\",\n },\n {\n id: \"2\",\n title: \"Example Task 2\",\n description: \"Another sample task\",\n status: \"completed\",\n priority: \"high\",\n },\n ];\n\n const mockNode: UISpecNode = {\n id: targetNodeId || \"root\",\n node_type: \"Container\",\n props: {\n className: \"p-4 space-y-6\",\n },\n bindings: null,\n events: null,\n children: [\n {\n id: \"header-1\",\n node_type: \"Header\",\n props: {\n title: \"Task Management Dashboard\",\n className: \"mb-4\",\n },\n bindings: null,\n events: null,\n children: null,\n },\n {\n id: \"main-content\",\n node_type: \"Container\",\n props: {\n className: \"grid grid-cols-1 gap-6 md:grid-cols-3\",\n },\n bindings: null,\n events: null,\n children: [\n {\n id: \"tasks-container\",\n node_type: \"Container\",\n props: {\n className: \"md:col-span-2\",\n },\n bindings: null,\n events: null,\n children: [\n {\n id: \"list-heading\",\n node_type: \"Container\",\n props: {\n className: \"flex justify-between items-center mb-4\",\n },\n bindings: null,\n events: null,\n children: [\n {\n id: \"list-title\",\n node_type: \"Header\",\n props: {\n title: \"Tasks\",\n className: \"border-none p-0 m-0\",\n },\n bindings: null,\n events: null,\n children: null,\n },\n {\n id: \"add-task-button\",\n node_type: \"Button\",\n props: {\n label: \"Add Task\",\n variant: \"default\",\n },\n bindings: null,\n events: {\n onClick: {\n action: \"ADD_TASK\",\n target: \"tasks-container\",\n payload: {},\n },\n },\n children: null,\n },\n ],\n },\n {\n id: \"task-list\",\n node_type: \"ListView\",\n props: {\n selectable: \"true\",\n },\n bindings: {\n items: JSON.stringify(taskData),\n fields: JSON.stringify([\n { key: \"id\", label: \"ID\" },\n { key: \"title\", label: \"Title\" },\n { key: \"status\", label: \"Status\" },\n { key: \"priority\", label: \"Priority\" },\n ]),\n },\n events: {\n onSelect: {\n action: \"SELECT_TASK\",\n target: \"task-detail\",\n payload: {\n source: \"task-list\",\n },\n },\n },\n children: null,\n },\n ],\n },\n {\n id: \"task-detail\",\n node_type: \"Detail\",\n props: {\n title: \"Task Details\",\n visible: \"true\",\n },\n bindings: {\n data: JSON.stringify(taskData[0]),\n fields: JSON.stringify([\n { key: \"title\", label: \"Title\", type: \"heading\" },\n { key: \"description\", label: \"Description\", type: \"content\" },\n { key: \"status\", label: \"Status\" },\n { key: \"priority\", label: \"Priority\" },\n { key: \"dueDate\", label: \"Due Date\" },\n ]),\n },\n events: {\n onBack: {\n action: \"CLOSE_DETAIL\",\n target: \"task-detail\",\n payload: {},\n },\n },\n children: null,\n },\n ],\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 * @param routeResolution - Optional route resolution for partial updates\n * @returns Promise resolving to a UISpecNode\n */\nexport async function callPlannerLLM(\n input: PlannerInput,\n routeResolution?: RouteResolution\n): Promise<UISpecNode> {\n // console.log(\"🚀 callPlannerLLM called with input:\", input);\n // console.log(\"🚀 Environment variables:\", {\n // MOCK_PLANNER: env.MOCK_PLANNER,\n // OPENAI_API_KEY: env.OPENAI_API_KEY ? \"Available\" : \"Not available\",\n // });\n // console.log(\"🔍 Debugging env in planner.ts:\");\n // console.log(\" env.MOCK_PLANNER actual value:\", env.MOCK_PLANNER);\n // console.log(\" env.OPENAI_API_KEY actual value:\", env.OPENAI_API_KEY);\n // console.log(\" Is env.OPENAI_API_KEY truthy?:\", !!env.OPENAI_API_KEY);\n // console.log(\n // \" Condition for mock (env.MOCK_PLANNER === '1'):\",\n // env.MOCK_PLANNER === \"1\"\n // );\n // console.log(\n // \" Condition for mock (!env.OPENAI_API_KEY):\",\n // !env.OPENAI_API_KEY\n // );\n // console.log(\n // \" Combined condition for mock (mock enabled || key missing):\",\n // env.MOCK_PLANNER === \"1\" || !env.OPENAI_API_KEY\n // );\n\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\" || !env.OPENAI_API_KEY) {\n console.warn(\n \"Using mock planner because MOCK_PLANNER is enabled or OPENAI_API_KEY is not available\"\n );\n return mockPlanner(input);\n }\n\n const startTime = Date.now();\n\n // Use route resolution prompt if available, otherwise build a default prompt\n const prompt = routeResolution?.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 // Use AI SDK's generateObject with structured outputs\n const { object: uiSpec } = await generateObject({\n model: strictOpenAI(\"gpt-4o\", { structuredOutputs: true }),\n schema: openAIUISpec,\n messages: [{ role: \"user\", content: prompt }],\n temperature: 0.2,\n maxTokens: 4000,\n });\n\n // Emit planning complete event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.PLAN_COMPLETE, {\n layout: uiSpec,\n executionTimeMs: Date.now() - startTime,\n })\n );\n\n return uiSpec;\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}\n\n/**\n * Process an event and generate an appropriate UI update\n * @param event - UI event that triggered the update\n * @param router - Action router to determine what to update\n * @param schema - Data schema\n * @param layout - Current UI layout\n * @param dataContext - Current data context\n * @param goal - The user's goal\n * @param userContext - Optional user context\n * @returns Promise resolving to a UI spec node\n */\nexport async function processEvent(\n event: UIEvent,\n router: ActionRouter,\n schema: Record<string, unknown>,\n layout: UISpecNode | undefined,\n dataContext: DataContext,\n goal: string,\n userContext?: Record<string, unknown>\n): Promise<UISpecNode> {\n // const startTime = Date.now(); // Commented out as it's currently unused\n\n const routeResolution = await router.resolveRoute(\n event,\n schema,\n layout || null,\n dataContext,\n goal,\n userContext\n );\n\n if (!routeResolution) {\n throw new Error(\n `No route found for event type: ${event.type}, node: ${event.nodeId}`\n );\n }\n\n if (routeResolution.actionType.toString() === \"NoOp\") {\n // Temporarily comment out SystemEvent calls\n // await systemEvents.emit(\n // createSystemEvent(SystemEventType.EVENT_PROCESSING_COMPLETE, {\n // event,\n // action: \"NoOp\",\n // executionTimeMs: Date.now() - startTime, // startTime would be used here\n // })\n // );\n if (!layout) throw new Error(\"Layout is undefined and action is NoOp\");\n return layout;\n }\n\n const plannerInputForLLM: PlannerInput = routeResolution.plannerInput;\n const newLayout = await callPlannerLLM(plannerInputForLLM, routeResolution);\n\n // Temporarily comment out SystemEvent calls\n // await systemEvents.emit(\n // createSystemEvent(SystemEventType.EVENT_PROCESSING_COMPLETE, {\n // event,\n // action: routeResolution.actionType.toString(),\n // targetNodeId: routeResolution.targetNodeId,\n // executionTimeMs: Date.now() - startTime, // startTime would be used here\n // })\n // );\n\n return newLayout;\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().nullable(),\n payload: z.record(z.unknown()).nullable(),\n});\n\nexport type UIEvent = z.infer<typeof uiEvent>;\n\n/**\n * AI response types\n */\nexport const aiResponseType = z.enum([\"AI_RESPONSE\", \"ERROR\"]);\n\nexport type AIResponseType = z.infer<typeof aiResponseType>;\n\n// --- Runtime Specific Types ---\nconst runtimeRecord = z.record(z.any()).nullable();\n\n// --- OpenAI Specific Types (Simplified values, records can be null) ---\nconst openAISimplifiedValue = z.string().nullable(); // Values can only be string or null\n\n// For OpenAI: props/bindings are records of these simplified values, or null.\nconst openAIRecordSimplifiedNullable = z.record(openAISimplifiedValue).nullable();\n\n// For OpenAI: event payloads can be null, or a record of these simplified values.\nconst openAIEventPayloadSimplifiedNullable = z.record(openAISimplifiedValue).nullable(); // Already was nullable, name changed for clarity\n\n// --- Interface for Runtime UISpecNode ---\nexport interface UISpecNodeInterface {\n id: string;\n node_type: string;\n props: Record<string, any> | null;\n bindings: Record<string, any> | null;\n events: Record<\n string,\n {\n action: string;\n target: string;\n payload: Record<string, any> | null;\n }\n > | null;\n children: UISpecNodeInterface[] | null;\n}\n\n// --- OpenAI Schema Definition (All fields required by Zod default, complex fields are nullable) ---\nconst openAIBaseNode = z.object({\n id: z.string(), \n node_type: z.string(), \n props: openAIRecordSimplifiedNullable, // Nullable record\n bindings: openAIRecordSimplifiedNullable, // Nullable record\n events: z\n .record(\n z.string(),\n z.object({\n action: z.string(),\n target: z.string(),\n payload: openAIEventPayloadSimplifiedNullable, \n })\n )\n .nullable(), // Entire events object is nullable\n children: z.null(), // Base children are null. When extended, it will be an array or null.\n});\n\nconst openAINodeL4 = openAIBaseNode;\n\nconst openAINodeL3 = openAIBaseNode.extend({\n children: z.array(openAINodeL4).nullable(), \n});\n\nconst openAINodeL2 = openAIBaseNode.extend({\n children: z.array(openAINodeL3).nullable(),\n});\n\nexport const openAIUISpec = openAIBaseNode.extend({\n children: z.array(openAINodeL2).nullable(),\n});\n\n// --- Runtime Schema Definition ---\nexport const uiSpecNode: z.ZodType<UISpecNodeInterface> = z.object({\n id: z.string(),\n node_type: z.string(),\n props: runtimeRecord, \n bindings: runtimeRecord, \n events: z\n .record(\n z.string(),\n z.object({\n action: z.string(),\n target: z.string(),\n payload: runtimeRecord, \n })\n )\n .nullable(),\n children: z.lazy(() => z.array(uiSpecNode)).nullable(),\n});\n\n// --- Exported Types ---\nexport type UISpecNode = z.infer<typeof uiSpecNode>;\nexport type OpenAIUISpec = z.infer<typeof openAIUISpec>;\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().nullable(),\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.nullable(), \n loading: z.boolean(),\n history: z.array(uiEvent),\n error: z.string().nullable(),\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).nullable(),\n userContext: z.record(z.unknown()).nullable().optional(), \n});\n\nexport type PlannerInput = z.infer<typeof plannerInput>;\n\n// Define a more specific type for data items\nexport type DataItem = Record<string, unknown>;\n","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}\n","// Environment configuration\n\nconst rawApiKeyFromEnv = process.env.VITE_OPENAI_API_KEY;\nconst defaultApiKeyLiteral = \"sk-proj-literal-default-for-debug-in-env-ts\";\n\nexport const env = {\n MOCK_PLANNER: process.env.VITE_MOCK_PLANNER || \"1\", // Simplified MOCK_PLANNER assignment\n NODE_ENV: process.env.VITE_NODE_ENV || \"development\", // Simplified NODE_ENV assignment\n OPENAI_API_KEY:\n rawApiKeyFromEnv === undefined ? defaultApiKeyLiteral : rawApiKeyFromEnv,\n};\n","import React from \"react\";\nimport { UISpecNode, UIEvent, UIEventType } from \"../schema/ui\";\nimport { componentConfig } from \"../schema/components\";\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<{\n style?: React.CSSProperties;\n className?: string;\n children?: React.ReactNode;\n}> = (props) => (\n <div className={`autoui-mock-container ${props.className || \"\"}`}>\n {props.children}\n </div>\n);\n\nconst Header: React.FC<{ title: string; className?: string }> = ({\n title,\n className,\n}) => (\n <header\n className={`py-4 px-6 border-b border-gray-300 mb-4 bg-gray-50 dark:bg-gray-800 ${\n className || \"\"\n }`}\n >\n <h1 className=\"text-xl font-semibold text-gray-800 dark:text-white\">\n {title}\n </h1>\n </header>\n);\n\nconst Button: React.FC<{\n onClick?: (() => void) | undefined;\n children: React.ReactNode;\n variant?: \"default\" | \"outline\" | \"destructive\" | undefined;\n}> = ({ onClick, children, variant = \"default\" }) => (\n <button\n className={`px-4 py-2 rounded-md font-medium transition-colors ${\n variant === \"default\"\n ? \"bg-blue-600 text-white hover:bg-blue-700\"\n : variant === \"outline\"\n ? \"border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800\"\n : \"bg-red-600 text-white hover:bg-red-700\"\n }`}\n onClick={onClick}\n >\n {children}\n </button>\n);\n\nconst Table: React.FC<{\n items?: Record<string, React.ReactNode>[] | undefined;\n fields?: { key: string; label: string }[] | undefined;\n onSelect?: ((item: Record<string, React.ReactNode>) => void) | undefined;\n selectable?: boolean | undefined;\n}> = ({ items = [], fields = [], onSelect, selectable }) => (\n <div className=\"w-full border border-gray-300 dark:border-gray-700 rounded-lg overflow-hidden shadow-sm\">\n <table className=\"w-full\">\n <thead className=\"bg-gray-100 dark:bg-gray-800 border-b border-gray-300 dark:border-gray-700\">\n <tr>\n {fields.map((field) => (\n <th\n key={field.key}\n className=\"px-6 py-3 text-left text-xs font-medium text-gray-700 dark:text-gray-300 uppercase tracking-wider\"\n >\n {field.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-700\">\n {items.map((item, index) => (\n <tr\n key={index}\n onClick={() => selectable && onSelect && onSelect(item)}\n className={\n selectable\n ? \"cursor-pointer hover:bg-gray-100 dark:hover:bg-gray-800\"\n : \"\"\n }\n >\n {fields.map((field) => (\n <td\n key={field.key}\n className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-800 dark:text-gray-300\"\n >\n {item[field.key] ?? \"\"}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n);\n\nconst Detail: React.FC<{\n data?: Record<string, React.ReactNode> | undefined;\n fields?: { key: string; label: string; type?: string }[] | undefined;\n title?: string | undefined;\n visible?: boolean | undefined;\n onBack?: (() => void) | undefined;\n}> = ({ data, fields = [], title, visible = true, onBack }) => {\n if (!visible) return null;\n\n return (\n <div className=\"w-full border border-gray-300 dark:border-gray-700 rounded-lg p-6 space-y-4 bg-white dark:bg-gray-900 shadow-sm\">\n <div className=\"flex justify-between items-center border-b border-gray-200 dark:border-gray-700 pb-3\">\n {title && (\n <h2 className=\"text-lg font-medium text-gray-800 dark:text-white\">\n {title}\n </h2>\n )}\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\n key={field.key}\n className=\"text-xl font-semibold text-gray-800 dark:text-white\"\n >\n {data?.[field.key] ?? \"\"}\n </h3>\n );\n }\n\n if (field.type === \"content\") {\n return (\n <div\n key={field.key}\n className=\"text-sm text-gray-700 dark:text-gray-300\"\n >\n {data?.[field.key] ?? \"\"}\n </div>\n );\n }\n\n return (\n <div\n key={field.key}\n className=\"flex flex-col border-b border-gray-100 dark:border-gray-800 py-2\"\n >\n {field.label && (\n <span className=\"text-xs text-gray-600 dark:text-gray-400 font-medium\">\n {field.label}\n </span>\n )}\n <span className=\"text-sm text-gray-800 dark:text-gray-200\">\n {data?.[field.key] ?? \"\"}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nconst getSafeProp = <T, K extends string, D extends T>(\n props: Record<string, unknown> | null | undefined,\n key: K,\n validator: (value: unknown) => value is T,\n defaultValue: D\n): T | D => {\n if (props && typeof props === \"object\" && key in props) {\n const value = props[key];\n if (validator(value)) {\n return value;\n }\n }\n return defaultValue;\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null;\nconst isString = (value: unknown): value is string => typeof value === \"string\";\nconst isBoolean = (value: unknown): value is boolean =>\n typeof value === \"boolean\";\nconst isCSSProperties = (value: unknown): value is React.CSSProperties =>\n isObject(value); // Simplified check\nconst isButtonVariant = (\n value: unknown\n): value is \"default\" | \"outline\" | \"destructive\" =>\n isString(value) && [\"default\", \"outline\", \"destructive\"].includes(value);\n\nconst getSafeBinding = <T, K extends string, D extends T>(\n bindings: Record<string, unknown> | null | undefined,\n key: K,\n validator: (value: unknown) => value is T,\n defaultValue: D\n): T | D => {\n if (bindings && typeof bindings === \"object\" && key in bindings) {\n const value = bindings[key];\n if (validator(value)) {\n return value;\n }\n }\n return defaultValue;\n};\n\nconst isArrayOf =\n <T extends object>(itemValidator: (item: unknown) => item is T) =>\n (arr: unknown): arr is T[] =>\n Array.isArray(arr) && arr.every(itemValidator);\n\nconst isReactNode = (value: unknown): value is React.ReactNode => {\n // This is a simplified check. A full check is complex.\n // For basic scenarios, we can check for string, number, boolean, null, undefined, or React elements.\n return (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null ||\n typeof value === \"undefined\" ||\n (typeof value === \"object\" && value !== null && \"$$typeof\" in value) // Basic check for React element\n );\n};\n\nconst isRecordWithReactNodeValues = (\n value: unknown\n): value is Record<string, React.ReactNode> =>\n isObject(value) && Object.values(value).every(isReactNode);\n\nconst isFieldObject = (item: unknown): item is { key: string; label: string } =>\n isObject(item) && isString(item.key) && isString(item.label);\n\nconst isDetailFieldObject = (\n item: unknown\n): item is { key: string; label: string; type?: string } =>\n isObject(item) &&\n isString(item.key) &&\n isString(item.label) &&\n (item.type === undefined || isString(item.type));\n\n// Mock implementation - in a real application, this would dispatch events to your state engine\nconst createEventHandler = (\n node: UISpecNode,\n eventName: string,\n uiEventType: UIEventType,\n processEvent?: (event: UIEvent) => void\n) => {\n const eventConfig = node.events?.[uiEventType];\n if (!processEvent || !eventConfig) return undefined;\n\n return (eventPayload?: Record<string, unknown>) => {\n const fullEvent: UIEvent = {\n type: uiEventType,\n nodeId: node.id,\n timestamp: Date.now(),\n payload: {\n ...(eventConfig.payload || {}),\n ...(eventPayload || {}),\n },\n };\n processEvent(fullEvent);\n };\n};\n\nexport const adapterMap: Record<\n string,\n (\n node: UISpecNode,\n processEvent?: (event: UIEvent) => void\n ) => React.ReactElement\n> = {\n Container: (node, processEvent) => (\n <Container\n style={getSafeProp(node.props, \"style\", isCSSProperties, {})}\n className={getSafeProp(node.props, \"className\", isString, \"\")}\n >\n {node.children?.map((child) => renderNode(child, processEvent))}\n </Container>\n ),\n\n Header: (node) => (\n <Header\n title={getSafeProp(node.props, \"title\", isString, \"Untitled\")}\n className={getSafeProp(node.props, \"className\", isString, \"\")}\n />\n ),\n\n Button: (node, processEvent) => (\n <Button\n variant={getSafeProp(node.props, \"variant\", isButtonVariant, \"default\")}\n onClick={createEventHandler(node, \"onClick\", \"CLICK\", processEvent)}\n >\n {getSafeProp(node.props, \"label\", isString, \"Button\")}\n </Button>\n ),\n\n ListView: (node, processEvent) => {\n const items = getSafeBinding(\n node.bindings,\n \"items\",\n isArrayOf(isRecordWithReactNodeValues),\n []\n );\n const fields = getSafeBinding(\n node.bindings,\n \"fields\",\n isArrayOf(isFieldObject),\n []\n );\n const selectable = getSafeProp(node.props, \"selectable\", isBoolean, false);\n\n return (\n <Table\n items={items as Record<string, React.ReactNode>[]}\n fields={fields}\n selectable={selectable}\n onSelect={(item) => {\n const handler = createEventHandler(\n node,\n \"onSelect\",\n \"CLICK\",\n processEvent\n );\n if (handler) {\n handler({ selectedItem: item });\n }\n }}\n />\n );\n },\n\n Detail: (node, processEvent) => {\n const data = getSafeBinding(\n node.bindings,\n \"data\",\n isRecordWithReactNodeValues,\n {}\n ) as Record<string, React.ReactNode>;\n const fields = getSafeBinding(\n node.bindings,\n \"fields\",\n isArrayOf(isDetailFieldObject),\n []\n );\n const title = getSafeProp(node.props, \"title\", isString, \"\");\n const visible = getSafeProp(node.props, \"visible\", isBoolean, true);\n\n return (\n <Detail\n data={data}\n fields={fields}\n title={title}\n visible={visible}\n onBack={createEventHandler(node, \"onBack\", \"CLICK\", processEvent)}\n />\n );\n },\n};\n\nexport function renderNode(\n node: UISpecNode,\n processEvent?: (event: UIEvent) => void\n): React.ReactElement {\n const mappedComponent = adapterMap[node.node_type];\n if (mappedComponent) {\n return mappedComponent(node, processEvent);\n }\n console.warn(`Unknown node type: ${node.node_type}`);\n return React.createElement(\n Container,\n {},\n `Unknown node type: ${node.node_type}`\n );\n}\n\n// Export the component configuration for reference\nexport { componentConfig };\n","/**\n * Component definitions for shadcn/ui integration\n * This file defines which components from shadcn/ui are used by AutoUI\n */\n\nimport { z } from \"zod\";\n\n// Define all possible component types\nexport const componentType = z.enum([\n // Layout components\n \"Container\",\n \"Card\",\n \"Header\",\n\n // Input components\n \"Button\",\n \"Input\",\n \"Select\",\n \"Textarea\",\n \"Checkbox\",\n \"RadioGroup\",\n\n // Data display components\n \"ListView\",\n \"Detail\",\n \"Tabs\",\n \"Dialog\",\n\n // Typography\n \"Heading\",\n \"Text\",\n]);\n\nexport type ComponentType = z.infer<typeof componentType>;\n\n// Map component types to their shadcn component and required props\nexport const componentConfig = {\n Button: {\n component: \"Button\",\n requiredProps: [\"label\"],\n optionalProps: [\"variant\", \"size\", \"disabled\"],\n events: [\"onClick\"],\n },\n Card: {\n component: \"Card\",\n requiredProps: [],\n optionalProps: [\"className\"],\n events: [],\n },\n Input: {\n component: \"Input\",\n requiredProps: [\"name\"],\n optionalProps: [\"label\", \"placeholder\", \"disabled\", \"value\"],\n events: [\"onChange\", \"onFocus\", \"onBlur\"],\n },\n Select: {\n component: \"Select\",\n requiredProps: [\"name\", \"options\"],\n optionalProps: [\"label\", \"placeholder\", \"disabled\", \"value\"],\n events: [\"onChange\"],\n },\n Textarea: {\n component: \"Textarea\",\n requiredProps: [\"name\"],\n optionalProps: [\"label\", \"placeholder\", \"disabled\", \"value\", \"rows\"],\n events: [\"onChange\", \"onFocus\", \"onBlur\"],\n },\n Container: {\n component: \"div\",\n requiredProps: [],\n optionalProps: [\"className\", \"style\"],\n events: [],\n },\n Header: {\n component: \"header\",\n requiredProps: [\"title\"],\n optionalProps: [\"className\"],\n events: [],\n },\n ListView: {\n component: \"Table\",\n requiredProps: [\"fields\"],\n optionalProps: [\"items\", \"selectable\"],\n events: [\"onSelect\"],\n },\n Detail: {\n component: \"div\",\n requiredProps: [\"fields\"],\n optionalProps: [\"data\", \"title\", \"visible\"],\n events: [\"onBack\"],\n },\n Dialog: {\n component: \"Dialog\",\n requiredProps: [\"title\"],\n optionalProps: [\"open\", \"onClose\", \"description\"],\n events: [\"onClose\"],\n },\n Tabs: {\n component: \"Tabs\",\n requiredProps: [\"tabs\"],\n optionalProps: [\"defaultValue\"],\n events: [\"onChange\"],\n },\n Heading: {\n component: \"h2\",\n requiredProps: [\"text\"],\n optionalProps: [\"size\", \"className\"],\n events: [],\n },\n Text: {\n component: \"p\",\n requiredProps: [\"text\"],\n optionalProps: [\"size\", \"className\"],\n events: [],\n },\n Checkbox: {\n component: \"Checkbox\",\n requiredProps: [\"name\"],\n optionalProps: [\"label\", \"checked\", \"disabled\"],\n events: [\"onChange\"],\n },\n RadioGroup: {\n component: \"RadioGroup\",\n requiredProps: [\"name\", \"options\"],\n optionalProps: [\"label\", \"value\", \"disabled\"],\n events: [\"onChange\"],\n },\n};\n\n// List of required shadcn components for the setup script\nexport const shadcnComponents = [\n \"button\",\n \"card\",\n \"dialog\",\n \"dropdown-menu\",\n \"form\",\n \"input\",\n \"label\",\n \"select\",\n \"table\",\n \"tabs\",\n \"textarea\",\n \"checkbox\",\n \"radio-group\",\n];\n","import React from \"react\";\nimport { UISpecNode, UIEvent } from \"../schema/ui\";\nimport {\n renderNode as renderShadcnNode,\n ShimmerBlock,\n ShimmerTable,\n ShimmerCard,\n} from \"../adapters/shadcn\";\nimport {\n createSystemEvent,\n systemEvents,\n SystemEventType,\n} from \"./system-events\";\n\n// Simple LRU cache for rendered nodes to avoid re-rendering the same node multiple times\n// This helps prevent infinite loops in the rendering process\nconst renderedNodesCache = new Map<\n string,\n { element: React.ReactElement; timestamp: number }\n>();\nconst MAX_CACHE_SIZE = 10;\nconst CACHE_TTL = 5000; // 5 seconds\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 * @param processEvent - Optional callback to handle UI events\n * @returns React element\n */\nexport async function renderNode(\n node: UISpecNode,\n adapter: \"shadcn\" = \"shadcn\",\n processEvent?: (event: UIEvent) => void\n): Promise<React.ReactElement> {\n const startTime = Date.now();\n const nodeId = node.id;\n\n // Check cache first\n const cachedItem = renderedNodesCache.get(nodeId);\n if (cachedItem && startTime - cachedItem.timestamp < CACHE_TTL) {\n // Return cached result if it's not too old\n return cachedItem.element;\n }\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, processEvent);\n break;\n default:\n console.warn(`Unsupported adapter: ${adapter}, falling back to shadcn`);\n result = renderShadcnNode(node, processEvent);\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 // Store in cache\n renderedNodesCache.set(nodeId, {\n element: result,\n timestamp: startTime,\n });\n\n // Clean cache if it gets too big\n if (renderedNodesCache.size > MAX_CACHE_SIZE) {\n // Delete oldest entry\n const oldestKey = [...renderedNodesCache.entries()].sort(\n ([, a], [, b]) => a.timestamp - b.timestamp\n )[0][0];\n renderedNodesCache.delete(oldestKey);\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.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}\n","import { UISpecNode } from \"../schema/ui\";\nimport {\n createSystemEvent,\n systemEvents,\n SystemEventType,\n} from \"./system-events\";\n\n/**\n * Interface for the runtime data context\n */\nexport interface DataContext {\n [key: string]: unknown;\n}\n\n// Create a cache to prevent redundant resolving of the same node with same context\n// This helps prevent infinite loops\n// interface CacheKey { // Commented out as CacheKey is unused\n// nodeId: string;\n// contextHash: string;\n// }\nconst bindingsCache = new Map<string, UISpecNode>();\nconst MAX_CACHE_SIZE = 50;\nconst CACHE_TTL = 2000; // 2 seconds\nconst nodeCacheTimestamps = new Map<string, number>();\n\n// Simple hash function for data context objects to create cache keys\nfunction hashDataContext(context: DataContext): string {\n return JSON.stringify(context);\n}\n\n// Create a cache key from node id and context\nfunction createCacheKey(nodeId: string, context: DataContext): string {\n return `${nodeId}:${hashDataContext(context)}`;\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 if (parts.length === 0) return result; // No path, return original context\n\n let current: unknown = 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 // Ensure current is an object and not null before trying to access/create properties\n if (typeof current !== \"object\" || current === null) {\n // This state should ideally not be reached if path creation is consistent.\n // If it is, it means we are trying to set a nested property on a primitive.\n console.error(\"setValueByPath: Cannot create path in a non-object.\");\n return context; // Return original context to avoid undefined behavior\n }\n\n const currentAsObject = current as Record<string, unknown>; // Type assertion after check\n\n // Create the object if it doesn't exist or is not an object\n if (\n !(part in currentAsObject) ||\n typeof currentAsObject[part] !== \"object\" ||\n currentAsObject[part] === null\n ) {\n currentAsObject[part] = {};\n }\n\n // Move to the next level\n current = currentAsObject[part];\n }\n\n // Set the value at the final property\n const lastPart = parts[parts.length - 1];\n if (typeof current === \"object\" && current !== null) {\n (current as Record<string, unknown>)[lastPart] = value;\n } else if (\n parts.length === 1 &&\n typeof result === \"object\" &&\n result !== null\n ) {\n // Handle setting a property on the root if the path had only one part\n // and current became non-object (should not happen with loop logic but as safeguard)\n (result as Record<string, unknown>)[lastPart] = value;\n } else {\n console.warn(\n `setValueByPath: Could not set value for path \"${path}\". Final segment location is not an object.`\n );\n // Optionally return original context or throw error\n return context;\n }\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(\n binding: unknown,\n context: DataContext\n): 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(\n node: UISpecNode,\n context: DataContext\n): Promise<UISpecNode> {\n // Check if we have a cached result first\n const currentTime = Date.now();\n const cacheKey = createCacheKey(node.id, context);\n const cachedNode = bindingsCache.get(cacheKey);\n const cachedTimestamp = nodeCacheTimestamps.get(cacheKey);\n\n // If we have a cached result and it's not too old, use it\n if (\n cachedNode &&\n cachedTimestamp &&\n currentTime - cachedTimestamp < CACHE_TTL\n ) {\n return cachedNode;\n }\n\n // Emit binding resolution start event\n await systemEvents.emit(\n createSystemEvent(SystemEventType.BINDING_RESOLUTION_START, {\n layout: node,\n })\n );\n\n // Clone the node to avoid mutating the original\n const result: UISpecNode = {\n ...node,\n props: node.props ? { ...node.props } : null,\n events: node.events ? { ...node.events } : null,\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 and is a string\n if (value !== undefined && typeof value === \"string\") {\n if (!result.props) {\n result.props = {};\n }\n result.props[key] = value;\n } else if (value !== undefined && typeof value !== \"string\") {\n // Handle non-string values from bindings if necessary, or log a warning\n // For now, we will not assign non-string values to props to maintain type safety\n // console.warn(`Binding for '${key}' resolved to a non-string value:`, value);\n }\n }\n }\n\n // Process children recursively\n if (node.children) {\n result.children = await Promise.all(\n node.children.map((child) => resolveBindings(child, context))\n );\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 // Cache the result\n bindingsCache.set(cacheKey, result);\n nodeCacheTimestamps.set(cacheKey, currentTime);\n\n // Clean up cache if it gets too big\n if (bindingsCache.size > MAX_CACHE_SIZE) {\n // Find the oldest entry\n const entries = [...nodeCacheTimestamps.entries()];\n if (entries.length > 0) {\n entries.sort((a, b) => a[1] - b[1]);\n const oldestKey = entries[0][0];\n bindingsCache.delete(oldestKey);\n nodeCacheTimestamps.delete(oldestKey);\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}\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(\n eventTypes: UIEventType[] | \"all\",\n hook: EventHook\n ): () => 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: () => {\n defaultPrevented = true;\n },\n stopPropagation: () => {\n propagationStopped = true;\n },\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}\n","/**\n * Checks if shadcn components are available in the project\n * @returns Boolean indicating whether shadcn components are available\n */\nexport function areShadcnComponentsAvailable(): boolean {\n try {\n // Try to require one of the shadcn components\n require(\"../../components/ui/button\");\n return true;\n } catch (error) {\n return false;\n }\n}\n\n/**\n * Provides helpful guidance for missing components\n */\nexport function getMissingComponentsMessage(): string {\n return `Missing required shadcn components. Please run:\n> npm run setup-shadcn`;\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(\n columns: Record<string, DrizzleColumn>\n ): 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}\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(\n options: SchemaAdapterOptions\n): 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(\n `Unsupported schema adapter type: ${(options as any).type}`\n );\n }\n}\n\nexport { DrizzleAdapter, type DrizzleAdapterOptions };\n","/**\n * AI Utilities for AutoUI React\n * Provides AI-powered UI generation functionality\n */\n\n// Temporary placeholder implementations for the exported functions\n// These will be replaced with actual implementations later\n\n/**\n * Generates a component using AI\n */\nexport const generateComponent = async (prompt: string) => {\n console.warn(\n \"generateComponent is a placeholder and will be implemented in a future version\"\n );\n return `<div>Generated Component for: ${prompt}</div>`;\n};\n\n/**\n * Generates a UI description using AI\n */\nexport const generateUIDescription = async (prompt: string) => {\n console.warn(\n \"generateUIDescription is a placeholder and will be implemented in a future version\"\n );\n return `Description for ${prompt}`;\n};\n\n/**\n * Generates a UI component using AI\n */\nexport const generateUIComponent = async (prompt: string) => {\n console.warn(\n \"generateUIComponent is a placeholder and will be implemented in a future version\"\n );\n return `<div>Generated UI Component for: ${prompt}</div>`;\n};\n","import { useState, useCallback } from \"react\";\nimport { openai } from \"@ai-sdk/openai\";\nimport {\n ActionRouter,\n callPlannerLLM,\n createDefaultRouter,\n processEvent,\n} from \"../core\";\nimport { PlannerInput, UIEvent, UISpecNode } from \"../schema/ui\";\n\ninterface UsePlannerOptions {\n goal: string;\n schema: Record<string, unknown>;\n userContext?: Record<string, unknown>;\n router?: ActionRouter;\n modelProvider?: unknown; // To be expanded for different providers\n}\n\ninterface UsePlannerResult {\n layout: UISpecNode | undefined;\n loading: boolean;\n error: Error | null;\n handleEvent: (event: UIEvent) => Promise<void>;\n generateInitialLayout: () => Promise<void>;\n}\n\n/**\n * React hook for utilizing the AI planner functionality\n */\nexport function usePlanner(options: UsePlannerOptions): UsePlannerResult {\n const { goal, schema, userContext, router: customRouter } = options;\n\n // State for UI layout\n const [layout, setLayout] = useState<UISpecNode | undefined>(undefined);\n\n // State for loading and error tracking\n const [loading, setLoading] = useState<boolean>(false);\n const [error, setError] = useState<Error | null>(null);\n\n // Use provided router or create a default one\n const router = customRouter || createDefaultRouter();\n\n // Data context for bindings (simplified for now)\n const dataContext: Record<string, unknown> = {};\n\n /**\n * Generate the initial UI layout\n */\n const generateInitialLayout = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n // Create initial planner input\n const plannerInput: PlannerInput = {\n schema,\n goal,\n userContext: userContext || null,\n history: null,\n };\n\n // Call the planner to generate the UI\n const generatedLayout = await callPlannerLLM(plannerInput);\n setLayout(generatedLayout);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n }, [schema, goal, userContext]);\n\n /**\n * Handle UI events and update the layout\n */\n const handleEvent = useCallback(\n async (event: UIEvent) => {\n if (!layout) {\n setError(new Error(\"Cannot handle event - no layout exists\"));\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n // Process the event using the router and generate an updated UI\n const updatedLayout = await processEvent(\n event,\n router,\n schema,\n layout,\n dataContext,\n goal,\n userContext\n );\n\n setLayout(updatedLayout);\n } catch (err) {\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setLoading(false);\n }\n },\n [layout, router, schema, dataContext, goal, userContext]\n );\n\n return {\n layout,\n loading,\n error,\n handleEvent,\n generateInitialLayout,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/reducer.ts","../src/core/action-router.ts","../src/schema/ui.ts","../src/core/system-events.ts","../src/env.ts","../src/core/planner.ts","../src/core/state.ts","../src/adapters/shadcn.tsx","../src/core/renderer.tsx","../src/core/bindings.ts","../src/core/events.ts","../src/AutoUI.tsx","../src/adapters/schema/drizzle.ts","../src/adapters/schema/index.ts"],"names":["path","parent","ActionType","plannerInput","z","SystemEventType","useReducer","useCallback","useEffect","jsx","jsxs","renderNode","useState","useRef","findNodeById"],"mappings":"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","file":"index.js","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 { 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 { 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 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 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 \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 // 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 {renderNode(resolvedLayout, componentAdapter as \"shadcn\")}\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 { 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};"]}
|