@json-render/core 0.4.3 → 0.4.4
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 +8 -6
- package/dist/index.d.mts +39 -13
- package/dist/index.d.ts +39 -13
- package/dist/index.js +149 -29
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +147 -29
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/visibility.ts","../src/actions.ts","../src/validation.ts","../src/schema.ts","../src/catalog.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Dynamic value - can be a literal or a path reference to data model\n */\nexport type DynamicValue<T = unknown> = T | { path: string };\n\n/**\n * Dynamic string value\n */\nexport type DynamicString = DynamicValue<string>;\n\n/**\n * Dynamic number value\n */\nexport type DynamicNumber = DynamicValue<number>;\n\n/**\n * Dynamic boolean value\n */\nexport type DynamicBoolean = DynamicValue<boolean>;\n\n/**\n * Zod schema for dynamic values\n */\nexport const DynamicValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.object({ path: z.string() }),\n]);\n\nexport const DynamicStringSchema = z.union([\n z.string(),\n z.object({ path: z.string() }),\n]);\n\nexport const DynamicNumberSchema = z.union([\n z.number(),\n z.object({ path: z.string() }),\n]);\n\nexport const DynamicBooleanSchema = z.union([\n z.boolean(),\n z.object({ path: z.string() }),\n]);\n\n/**\n * Base UI element structure for v2\n */\nexport interface UIElement<\n T extends string = string,\n P = Record<string, unknown>,\n> {\n /** Unique key for reconciliation */\n key: string;\n /** Component type from the catalog */\n type: T;\n /** Component props */\n props: P;\n /** Child element keys (flat structure) */\n children?: string[];\n /** Parent element key (null for root) */\n parentKey?: string | null;\n /** Visibility condition */\n visible?: VisibilityCondition;\n}\n\n/**\n * Visibility condition types\n */\nexport type VisibilityCondition =\n | boolean\n | { path: string }\n | { auth: \"signedIn\" | \"signedOut\" }\n | LogicExpression;\n\n/**\n * Logic expression for complex conditions\n */\nexport type LogicExpression =\n | { and: LogicExpression[] }\n | { or: LogicExpression[] }\n | { not: LogicExpression }\n | { path: string }\n | { eq: [DynamicValue, DynamicValue] }\n | { neq: [DynamicValue, DynamicValue] }\n | { gt: [DynamicValue<number>, DynamicValue<number>] }\n | { gte: [DynamicValue<number>, DynamicValue<number>] }\n | { lt: [DynamicValue<number>, DynamicValue<number>] }\n | { lte: [DynamicValue<number>, DynamicValue<number>] };\n\n/**\n * Flat UI tree structure (optimized for LLM generation)\n */\nexport interface Spec {\n /** Root element key */\n root: string;\n /** Flat map of elements by key */\n elements: Record<string, UIElement>;\n}\n\n/**\n * Auth state for visibility evaluation\n */\nexport interface AuthState {\n isSignedIn: boolean;\n user?: Record<string, unknown>;\n}\n\n/**\n * Data model type\n */\nexport type DataModel = Record<string, unknown>;\n\n/**\n * Component schema definition using Zod\n */\nexport type ComponentSchema = z.ZodType<Record<string, unknown>>;\n\n/**\n * Validation mode for catalog validation\n */\nexport type ValidationMode = \"strict\" | \"warn\" | \"ignore\";\n\n/**\n * JSON patch operation types\n */\nexport type PatchOp = \"add\" | \"remove\" | \"replace\" | \"set\";\n\n/**\n * JSON patch operation\n */\nexport interface JsonPatch {\n op: PatchOp;\n path: string;\n value?: unknown;\n}\n\n/**\n * Resolve a dynamic value against a data model\n */\nexport function resolveDynamicValue<T>(\n value: DynamicValue<T>,\n dataModel: DataModel,\n): T | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (typeof value === \"object\" && \"path\" in value) {\n return getByPath(dataModel, value.path) as T | undefined;\n }\n\n return value as T;\n}\n\n/**\n * Get a value from an object by JSON Pointer path\n */\nexport function getByPath(obj: unknown, path: string): unknown {\n if (!path || path === \"/\") {\n return obj;\n }\n\n const segments = path.startsWith(\"/\")\n ? path.slice(1).split(\"/\")\n : path.split(\"/\");\n\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (typeof current === \"object\") {\n current = (current as Record<string, unknown>)[segment];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Check if a string is a numeric index\n */\nfunction isNumericIndex(str: string): boolean {\n return /^\\d+$/.test(str);\n}\n\n/**\n * Set a value in an object by JSON Pointer path.\n * Automatically creates arrays when the path segment is a numeric index.\n */\nexport function setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void {\n const segments = path.startsWith(\"/\")\n ? path.slice(1).split(\"/\")\n : path.split(\"/\");\n\n if (segments.length === 0) return;\n\n let current: Record<string, unknown> | unknown[] = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!;\n const nextSegment = segments[i + 1];\n const nextIsNumeric =\n nextSegment !== undefined && isNumericIndex(nextSegment);\n\n if (Array.isArray(current)) {\n const index = parseInt(segment, 10);\n if (current[index] === undefined || typeof current[index] !== \"object\") {\n current[index] = nextIsNumeric ? [] : {};\n }\n current = current[index] as Record<string, unknown> | unknown[];\n } else {\n if (!(segment in current) || typeof current[segment] !== \"object\") {\n current[segment] = nextIsNumeric ? [] : {};\n }\n current = current[segment] as Record<string, unknown> | unknown[];\n }\n }\n\n const lastSegment = segments[segments.length - 1]!;\n if (Array.isArray(current)) {\n const index = parseInt(lastSegment, 10);\n current[index] = value;\n } else {\n current[lastSegment] = value;\n }\n}\n\n/**\n * Find a form value from params and/or data.\n * Useful in action handlers to locate form input values regardless of path format.\n *\n * Checks in order:\n * 1. Direct param key (if not a path reference)\n * 2. Param keys ending with the field name\n * 3. Data keys ending with the field name (dot notation)\n * 4. Data paths using getByPath (slash notation)\n *\n * @example\n * // Find \"name\" from params or data\n * const name = findFormValue(\"name\", params, data);\n *\n * // Will find from: params.name, params[\"form.name\"], data[\"customerForm.name\"], data.customerForm.name\n */\nexport function findFormValue(\n fieldName: string,\n params?: Record<string, unknown>,\n data?: Record<string, unknown>,\n): unknown {\n // Check params first (but not if it looks like a data path reference)\n if (params?.[fieldName] !== undefined) {\n const val = params[fieldName];\n // If the value looks like a path reference (contains dots), skip it\n if (typeof val !== \"string\" || !val.includes(\".\")) {\n return val;\n }\n }\n\n // Check param keys that end with the field name\n if (params) {\n for (const key of Object.keys(params)) {\n if (key.endsWith(`.${fieldName}`)) {\n const val = params[key];\n if (typeof val !== \"string\" || !val.includes(\".\")) {\n return val;\n }\n }\n }\n }\n\n // Check data keys that end with the field name (handles any form naming)\n if (data) {\n for (const key of Object.keys(data)) {\n if (key === fieldName || key.endsWith(`.${fieldName}`)) {\n return data[key];\n }\n }\n\n // Try getByPath with common prefixes\n const prefixes = [\"form\", \"newCustomer\", \"customer\", \"\"];\n for (const prefix of prefixes) {\n const path = prefix ? `${prefix}/${fieldName}` : fieldName;\n const val = getByPath(data, path);\n if (val !== undefined) {\n return val;\n }\n }\n }\n\n return undefined;\n}\n\n// =============================================================================\n// SpecStream - Streaming format for progressively building specs\n// =============================================================================\n\n/**\n * A SpecStream line - a single patch operation in the stream.\n */\nexport type SpecStreamLine = JsonPatch;\n\n/**\n * Parse a single SpecStream line into a patch operation.\n * Returns null if the line is invalid or empty.\n *\n * SpecStream is json-render's streaming format where each line is a JSON patch\n * operation that progressively builds up the final spec.\n */\nexport function parseSpecStreamLine(line: string): SpecStreamLine | null {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"{\")) return null;\n\n try {\n const patch = JSON.parse(trimmed) as SpecStreamLine;\n if (patch.op && patch.path !== undefined) {\n return patch;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply a single SpecStream patch to an object.\n * Mutates the object in place.\n */\nexport function applySpecStreamPatch<T extends Record<string, unknown>>(\n obj: T,\n patch: SpecStreamLine,\n): T {\n if (patch.op === \"set\" || patch.op === \"add\" || patch.op === \"replace\") {\n setByPath(obj, patch.path, patch.value);\n } else if (patch.op === \"remove\") {\n setByPath(obj, patch.path, undefined);\n }\n return obj;\n}\n\n/**\n * Compile a SpecStream string into a JSON object.\n * Each line should be a patch operation.\n *\n * @example\n * const stream = `{\"op\":\"set\",\"path\":\"/name\",\"value\":\"Alice\"}\n * {\"op\":\"set\",\"path\":\"/age\",\"value\":30}`;\n * const result = compileSpecStream(stream);\n * // { name: \"Alice\", age: 30 }\n */\nexport function compileSpecStream<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(stream: string, initial: T = {} as T): T {\n const lines = stream.split(\"\\n\");\n const result = { ...initial };\n\n for (const line of lines) {\n const patch = parseSpecStreamLine(line);\n if (patch) {\n applySpecStreamPatch(result, patch);\n }\n }\n\n return result as T;\n}\n\n/**\n * Streaming SpecStream compiler.\n * Useful for processing SpecStream data as it streams in from AI.\n *\n * @example\n * const compiler = createSpecStreamCompiler<MySpec>();\n *\n * // As chunks arrive:\n * const { result, newPatches } = compiler.push(chunk);\n * if (newPatches.length > 0) {\n * updateUI(result);\n * }\n *\n * // When done:\n * const finalResult = compiler.getResult();\n */\nexport interface SpecStreamCompiler<T> {\n /** Push a chunk of text. Returns the current result and any new patches applied. */\n push(chunk: string): { result: T; newPatches: SpecStreamLine[] };\n /** Get the current compiled result */\n getResult(): T;\n /** Get all patches that have been applied */\n getPatches(): SpecStreamLine[];\n /** Reset the compiler to initial state */\n reset(initial?: Partial<T>): void;\n}\n\n/**\n * Create a streaming SpecStream compiler.\n *\n * SpecStream is json-render's streaming format. AI outputs patch operations\n * line by line, and this compiler progressively builds the final spec.\n *\n * @example\n * const compiler = createSpecStreamCompiler<TimelineSpec>();\n *\n * // Process streaming response\n * const reader = response.body.getReader();\n * while (true) {\n * const { done, value } = await reader.read();\n * if (done) break;\n *\n * const { result, newPatches } = compiler.push(decoder.decode(value));\n * if (newPatches.length > 0) {\n * setSpec(result); // Update UI with partial result\n * }\n * }\n */\nexport function createSpecStreamCompiler<T = Record<string, unknown>>(\n initial: Partial<T> = {},\n): SpecStreamCompiler<T> {\n let result = { ...initial } as T;\n let buffer = \"\";\n const appliedPatches: SpecStreamLine[] = [];\n const processedLines = new Set<string>();\n\n return {\n push(chunk: string): { result: T; newPatches: SpecStreamLine[] } {\n buffer += chunk;\n const newPatches: SpecStreamLine[] = [];\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || processedLines.has(trimmed)) continue;\n processedLines.add(trimmed);\n\n const patch = parseSpecStreamLine(trimmed);\n if (patch) {\n applySpecStreamPatch(result as Record<string, unknown>, patch);\n appliedPatches.push(patch);\n newPatches.push(patch);\n }\n }\n\n // Return a shallow copy to trigger re-renders\n if (newPatches.length > 0) {\n result = { ...result };\n }\n\n return { result, newPatches };\n },\n\n getResult(): T {\n // Process any remaining buffer\n if (buffer.trim()) {\n const patch = parseSpecStreamLine(buffer);\n if (patch && !processedLines.has(buffer.trim())) {\n processedLines.add(buffer.trim());\n applySpecStreamPatch(result as Record<string, unknown>, patch);\n appliedPatches.push(patch);\n result = { ...result };\n }\n buffer = \"\";\n }\n return result;\n },\n\n getPatches(): SpecStreamLine[] {\n return [...appliedPatches];\n },\n\n reset(newInitial: Partial<T> = {}): void {\n result = { ...newInitial } as T;\n buffer = \"\";\n appliedPatches.length = 0;\n processedLines.clear();\n },\n };\n}\n","import { z } from \"zod\";\nimport type {\n VisibilityCondition,\n LogicExpression,\n DataModel,\n AuthState,\n DynamicValue,\n} from \"./types\";\nimport { resolveDynamicValue, DynamicValueSchema } from \"./types\";\n\n// Dynamic value schema for comparisons (number-focused)\nconst DynamicNumberValueSchema = z.union([\n z.number(),\n z.object({ path: z.string() }),\n]);\n\n/**\n * Logic expression schema (recursive)\n * Using a more permissive schema that aligns with runtime behavior\n */\nexport const LogicExpressionSchema: z.ZodType<LogicExpression> = z.lazy(() =>\n z.union([\n z.object({ and: z.array(LogicExpressionSchema) }),\n z.object({ or: z.array(LogicExpressionSchema) }),\n z.object({ not: LogicExpressionSchema }),\n z.object({ path: z.string() }),\n z.object({ eq: z.tuple([DynamicValueSchema, DynamicValueSchema]) }),\n z.object({ neq: z.tuple([DynamicValueSchema, DynamicValueSchema]) }),\n z.object({\n gt: z.tuple([DynamicNumberValueSchema, DynamicNumberValueSchema]),\n }),\n z.object({\n gte: z.tuple([DynamicNumberValueSchema, DynamicNumberValueSchema]),\n }),\n z.object({\n lt: z.tuple([DynamicNumberValueSchema, DynamicNumberValueSchema]),\n }),\n z.object({\n lte: z.tuple([DynamicNumberValueSchema, DynamicNumberValueSchema]),\n }),\n ]),\n) as z.ZodType<LogicExpression>;\n\n/**\n * Visibility condition schema\n */\nexport const VisibilityConditionSchema: z.ZodType<VisibilityCondition> =\n z.union([\n z.boolean(),\n z.object({ path: z.string() }),\n z.object({ auth: z.enum([\"signedIn\", \"signedOut\"]) }),\n LogicExpressionSchema,\n ]);\n\n/**\n * Context for evaluating visibility\n */\nexport interface VisibilityContext {\n dataModel: DataModel;\n authState?: AuthState;\n}\n\n/**\n * Evaluate a logic expression against data and auth state\n */\nexport function evaluateLogicExpression(\n expr: LogicExpression,\n ctx: VisibilityContext,\n): boolean {\n const { dataModel } = ctx;\n\n // AND expression\n if (\"and\" in expr) {\n return expr.and.every((subExpr) => evaluateLogicExpression(subExpr, ctx));\n }\n\n // OR expression\n if (\"or\" in expr) {\n return expr.or.some((subExpr) => evaluateLogicExpression(subExpr, ctx));\n }\n\n // NOT expression\n if (\"not\" in expr) {\n return !evaluateLogicExpression(expr.not, ctx);\n }\n\n // Path expression (resolve to boolean)\n if (\"path\" in expr) {\n const value = resolveDynamicValue({ path: expr.path }, dataModel);\n return Boolean(value);\n }\n\n // Equality comparison\n if (\"eq\" in expr) {\n const [left, right] = expr.eq;\n const leftValue = resolveDynamicValue(left, dataModel);\n const rightValue = resolveDynamicValue(right, dataModel);\n return leftValue === rightValue;\n }\n\n // Not equal comparison\n if (\"neq\" in expr) {\n const [left, right] = expr.neq;\n const leftValue = resolveDynamicValue(left, dataModel);\n const rightValue = resolveDynamicValue(right, dataModel);\n return leftValue !== rightValue;\n }\n\n // Greater than\n if (\"gt\" in expr) {\n const [left, right] = expr.gt;\n const leftValue = resolveDynamicValue(\n left as DynamicValue<number>,\n dataModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n dataModel,\n );\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n return leftValue > rightValue;\n }\n return false;\n }\n\n // Greater than or equal\n if (\"gte\" in expr) {\n const [left, right] = expr.gte;\n const leftValue = resolveDynamicValue(\n left as DynamicValue<number>,\n dataModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n dataModel,\n );\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n return leftValue >= rightValue;\n }\n return false;\n }\n\n // Less than\n if (\"lt\" in expr) {\n const [left, right] = expr.lt;\n const leftValue = resolveDynamicValue(\n left as DynamicValue<number>,\n dataModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n dataModel,\n );\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n return leftValue < rightValue;\n }\n return false;\n }\n\n // Less than or equal\n if (\"lte\" in expr) {\n const [left, right] = expr.lte;\n const leftValue = resolveDynamicValue(\n left as DynamicValue<number>,\n dataModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n dataModel,\n );\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n return leftValue <= rightValue;\n }\n return false;\n }\n\n return false;\n}\n\n/**\n * Evaluate a visibility condition\n */\nexport function evaluateVisibility(\n condition: VisibilityCondition | undefined,\n ctx: VisibilityContext,\n): boolean {\n // No condition = visible\n if (condition === undefined) {\n return true;\n }\n\n // Boolean literal\n if (typeof condition === \"boolean\") {\n return condition;\n }\n\n // Path reference\n if (\"path\" in condition && !(\"and\" in condition) && !(\"or\" in condition)) {\n const value = resolveDynamicValue({ path: condition.path }, ctx.dataModel);\n return Boolean(value);\n }\n\n // Auth condition\n if (\"auth\" in condition) {\n const isSignedIn = ctx.authState?.isSignedIn ?? false;\n if (condition.auth === \"signedIn\") {\n return isSignedIn;\n }\n if (condition.auth === \"signedOut\") {\n return !isSignedIn;\n }\n return false;\n }\n\n // Logic expression\n return evaluateLogicExpression(condition as LogicExpression, ctx);\n}\n\n/**\n * Helper to create visibility conditions\n */\nexport const visibility = {\n /** Always visible */\n always: true as const,\n\n /** Never visible */\n never: false as const,\n\n /** Visible when path is truthy */\n when: (path: string): VisibilityCondition => ({ path }),\n\n /** Visible when signed in */\n signedIn: { auth: \"signedIn\" } as const,\n\n /** Visible when signed out */\n signedOut: { auth: \"signedOut\" } as const,\n\n /** AND multiple conditions */\n and: (...conditions: LogicExpression[]): LogicExpression => ({\n and: conditions,\n }),\n\n /** OR multiple conditions */\n or: (...conditions: LogicExpression[]): LogicExpression => ({\n or: conditions,\n }),\n\n /** NOT a condition */\n not: (condition: LogicExpression): LogicExpression => ({ not: condition }),\n\n /** Equality check */\n eq: (left: DynamicValue, right: DynamicValue): LogicExpression => ({\n eq: [left, right],\n }),\n\n /** Not equal check */\n neq: (left: DynamicValue, right: DynamicValue): LogicExpression => ({\n neq: [left, right],\n }),\n\n /** Greater than */\n gt: (\n left: DynamicValue<number>,\n right: DynamicValue<number>,\n ): LogicExpression => ({ gt: [left, right] }),\n\n /** Greater than or equal */\n gte: (\n left: DynamicValue<number>,\n right: DynamicValue<number>,\n ): LogicExpression => ({ gte: [left, right] }),\n\n /** Less than */\n lt: (\n left: DynamicValue<number>,\n right: DynamicValue<number>,\n ): LogicExpression => ({ lt: [left, right] }),\n\n /** Less than or equal */\n lte: (\n left: DynamicValue<number>,\n right: DynamicValue<number>,\n ): LogicExpression => ({ lte: [left, right] }),\n};\n","import { z } from \"zod\";\nimport type { DynamicValue, DataModel } from \"./types\";\nimport { DynamicValueSchema, resolveDynamicValue } from \"./types\";\n\n/**\n * Confirmation dialog configuration\n */\nexport interface ActionConfirm {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"danger\";\n}\n\n/**\n * Action success handler\n */\nexport type ActionOnSuccess =\n | { navigate: string }\n | { set: Record<string, unknown> }\n | { action: string };\n\n/**\n * Action error handler\n */\nexport type ActionOnError =\n | { set: Record<string, unknown> }\n | { action: string };\n\n/**\n * Rich action definition\n */\nexport interface Action {\n /** Action name (must be in catalog) */\n name: string;\n /** Parameters to pass to the action handler */\n params?: Record<string, DynamicValue>;\n /** Confirmation dialog before execution */\n confirm?: ActionConfirm;\n /** Handler after successful execution */\n onSuccess?: ActionOnSuccess;\n /** Handler after failed execution */\n onError?: ActionOnError;\n}\n\n/**\n * Schema for action confirmation\n */\nexport const ActionConfirmSchema = z.object({\n title: z.string(),\n message: z.string(),\n confirmLabel: z.string().optional(),\n cancelLabel: z.string().optional(),\n variant: z.enum([\"default\", \"danger\"]).optional(),\n});\n\n/**\n * Schema for success handlers\n */\nexport const ActionOnSuccessSchema = z.union([\n z.object({ navigate: z.string() }),\n z.object({ set: z.record(z.string(), z.unknown()) }),\n z.object({ action: z.string() }),\n]);\n\n/**\n * Schema for error handlers\n */\nexport const ActionOnErrorSchema = z.union([\n z.object({ set: z.record(z.string(), z.unknown()) }),\n z.object({ action: z.string() }),\n]);\n\n/**\n * Full action schema\n */\nexport const ActionSchema = z.object({\n name: z.string(),\n params: z.record(z.string(), DynamicValueSchema).optional(),\n confirm: ActionConfirmSchema.optional(),\n onSuccess: ActionOnSuccessSchema.optional(),\n onError: ActionOnErrorSchema.optional(),\n});\n\n/**\n * Action handler function signature\n */\nexport type ActionHandler<\n TParams = Record<string, unknown>,\n TResult = unknown,\n> = (params: TParams) => Promise<TResult> | TResult;\n\n/**\n * Action definition in catalog\n */\nexport interface ActionDefinition<TParams = Record<string, unknown>> {\n /** Zod schema for params validation */\n params?: z.ZodType<TParams>;\n /** Description for AI */\n description?: string;\n}\n\n/**\n * Resolved action with all dynamic values resolved\n */\nexport interface ResolvedAction {\n name: string;\n params: Record<string, unknown>;\n confirm?: ActionConfirm;\n onSuccess?: ActionOnSuccess;\n onError?: ActionOnError;\n}\n\n/**\n * Resolve all dynamic values in an action\n */\nexport function resolveAction(\n action: Action,\n dataModel: DataModel,\n): ResolvedAction {\n const resolvedParams: Record<string, unknown> = {};\n\n if (action.params) {\n for (const [key, value] of Object.entries(action.params)) {\n resolvedParams[key] = resolveDynamicValue(value, dataModel);\n }\n }\n\n // Interpolate confirmation message if present\n let confirm = action.confirm;\n if (confirm) {\n confirm = {\n ...confirm,\n message: interpolateString(confirm.message, dataModel),\n title: interpolateString(confirm.title, dataModel),\n };\n }\n\n return {\n name: action.name,\n params: resolvedParams,\n confirm,\n onSuccess: action.onSuccess,\n onError: action.onError,\n };\n}\n\n/**\n * Interpolate ${path} expressions in a string\n */\nexport function interpolateString(\n template: string,\n dataModel: DataModel,\n): string {\n return template.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n const value = resolveDynamicValue({ path }, dataModel);\n return String(value ?? \"\");\n });\n}\n\n/**\n * Context for action execution\n */\nexport interface ActionExecutionContext {\n /** The resolved action */\n action: ResolvedAction;\n /** The action handler from the host */\n handler: ActionHandler;\n /** Function to update data model */\n setData: (path: string, value: unknown) => void;\n /** Function to navigate */\n navigate?: (path: string) => void;\n /** Function to execute another action */\n executeAction?: (name: string) => Promise<void>;\n}\n\n/**\n * Execute an action with all callbacks\n */\nexport async function executeAction(\n ctx: ActionExecutionContext,\n): Promise<void> {\n const { action, handler, setData, navigate, executeAction } = ctx;\n\n try {\n await handler(action.params);\n\n // Handle success\n if (action.onSuccess) {\n if (\"navigate\" in action.onSuccess && navigate) {\n navigate(action.onSuccess.navigate);\n } else if (\"set\" in action.onSuccess) {\n for (const [path, value] of Object.entries(action.onSuccess.set)) {\n setData(path, value);\n }\n } else if (\"action\" in action.onSuccess && executeAction) {\n await executeAction(action.onSuccess.action);\n }\n }\n } catch (error) {\n // Handle error\n if (action.onError) {\n if (\"set\" in action.onError) {\n for (const [path, value] of Object.entries(action.onError.set)) {\n // Replace $error.message with actual error\n const resolvedValue =\n typeof value === \"string\" && value === \"$error.message\"\n ? (error as Error).message\n : value;\n setData(path, resolvedValue);\n }\n } else if (\"action\" in action.onError && executeAction) {\n await executeAction(action.onError.action);\n }\n } else {\n throw error;\n }\n }\n}\n\n/**\n * Helper to create actions\n */\nexport const action = {\n /** Create a simple action */\n simple: (name: string, params?: Record<string, DynamicValue>): Action => ({\n name,\n params,\n }),\n\n /** Create an action with confirmation */\n withConfirm: (\n name: string,\n confirm: ActionConfirm,\n params?: Record<string, DynamicValue>,\n ): Action => ({\n name,\n params,\n confirm,\n }),\n\n /** Create an action with success handler */\n withSuccess: (\n name: string,\n onSuccess: ActionOnSuccess,\n params?: Record<string, DynamicValue>,\n ): Action => ({\n name,\n params,\n onSuccess,\n }),\n};\n","import { z } from \"zod\";\nimport type { DynamicValue, DataModel, LogicExpression } from \"./types\";\nimport { DynamicValueSchema, resolveDynamicValue } from \"./types\";\nimport { LogicExpressionSchema, evaluateLogicExpression } from \"./visibility\";\n\n/**\n * Validation check definition\n */\nexport interface ValidationCheck {\n /** Function name (built-in or from catalog) */\n fn: string;\n /** Additional arguments for the function */\n args?: Record<string, DynamicValue>;\n /** Error message to display if check fails */\n message: string;\n}\n\n/**\n * Validation configuration for a field\n */\nexport interface ValidationConfig {\n /** Array of checks to run */\n checks?: ValidationCheck[];\n /** When to run validation */\n validateOn?: \"change\" | \"blur\" | \"submit\";\n /** Condition for when validation is enabled */\n enabled?: LogicExpression;\n}\n\n/**\n * Schema for validation check\n */\nexport const ValidationCheckSchema = z.object({\n fn: z.string(),\n args: z.record(z.string(), DynamicValueSchema).optional(),\n message: z.string(),\n});\n\n/**\n * Schema for validation config\n */\nexport const ValidationConfigSchema = z.object({\n checks: z.array(ValidationCheckSchema).optional(),\n validateOn: z.enum([\"change\", \"blur\", \"submit\"]).optional(),\n enabled: LogicExpressionSchema.optional(),\n});\n\n/**\n * Validation function signature\n */\nexport type ValidationFunction = (\n value: unknown,\n args?: Record<string, unknown>,\n) => boolean;\n\n/**\n * Validation function definition in catalog\n */\nexport interface ValidationFunctionDefinition {\n /** The validation function */\n validate: ValidationFunction;\n /** Description for AI */\n description?: string;\n}\n\n/**\n * Built-in validation functions\n */\nexport const builtInValidationFunctions: Record<string, ValidationFunction> = {\n /**\n * Check if value is not null, undefined, or empty string\n */\n required: (value: unknown) => {\n if (value === null || value === undefined) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n },\n\n /**\n * Check if value is a valid email address\n */\n email: (value: unknown) => {\n if (typeof value !== \"string\") return false;\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\n },\n\n /**\n * Check minimum string length\n */\n minLength: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"string\") return false;\n const min = args?.min;\n if (typeof min !== \"number\") return false;\n return value.length >= min;\n },\n\n /**\n * Check maximum string length\n */\n maxLength: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"string\") return false;\n const max = args?.max;\n if (typeof max !== \"number\") return false;\n return value.length <= max;\n },\n\n /**\n * Check if string matches a regex pattern\n */\n pattern: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"string\") return false;\n const pattern = args?.pattern;\n if (typeof pattern !== \"string\") return false;\n try {\n return new RegExp(pattern).test(value);\n } catch {\n return false;\n }\n },\n\n /**\n * Check minimum numeric value\n */\n min: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"number\") return false;\n const min = args?.min;\n if (typeof min !== \"number\") return false;\n return value >= min;\n },\n\n /**\n * Check maximum numeric value\n */\n max: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"number\") return false;\n const max = args?.max;\n if (typeof max !== \"number\") return false;\n return value <= max;\n },\n\n /**\n * Check if value is a number\n */\n numeric: (value: unknown) => {\n if (typeof value === \"number\") return !isNaN(value);\n if (typeof value === \"string\") return !isNaN(parseFloat(value));\n return false;\n },\n\n /**\n * Check if value is a valid URL\n */\n url: (value: unknown) => {\n if (typeof value !== \"string\") return false;\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n },\n\n /**\n * Check if value matches another field\n */\n matches: (value: unknown, args?: Record<string, unknown>) => {\n const other = args?.other;\n return value === other;\n },\n};\n\n/**\n * Validation result for a single check\n */\nexport interface ValidationCheckResult {\n fn: string;\n valid: boolean;\n message: string;\n}\n\n/**\n * Full validation result for a field\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n checks: ValidationCheckResult[];\n}\n\n/**\n * Context for running validation\n */\nexport interface ValidationContext {\n /** Current value to validate */\n value: unknown;\n /** Full data model for resolving paths */\n dataModel: DataModel;\n /** Custom validation functions from catalog */\n customFunctions?: Record<string, ValidationFunction>;\n}\n\n/**\n * Run a single validation check\n */\nexport function runValidationCheck(\n check: ValidationCheck,\n ctx: ValidationContext,\n): ValidationCheckResult {\n const { value, dataModel, customFunctions } = ctx;\n\n // Resolve args\n const resolvedArgs: Record<string, unknown> = {};\n if (check.args) {\n for (const [key, argValue] of Object.entries(check.args)) {\n resolvedArgs[key] = resolveDynamicValue(argValue, dataModel);\n }\n }\n\n // Find the validation function\n const fn =\n builtInValidationFunctions[check.fn] ?? customFunctions?.[check.fn];\n\n if (!fn) {\n console.warn(`Unknown validation function: ${check.fn}`);\n return {\n fn: check.fn,\n valid: true, // Don't fail on unknown functions\n message: check.message,\n };\n }\n\n const valid = fn(value, resolvedArgs);\n\n return {\n fn: check.fn,\n valid,\n message: check.message,\n };\n}\n\n/**\n * Run all validation checks for a field\n */\nexport function runValidation(\n config: ValidationConfig,\n ctx: ValidationContext & { authState?: { isSignedIn: boolean } },\n): ValidationResult {\n const checks: ValidationCheckResult[] = [];\n const errors: string[] = [];\n\n // Check if validation is enabled\n if (config.enabled) {\n const enabled = evaluateLogicExpression(config.enabled, {\n dataModel: ctx.dataModel,\n authState: ctx.authState,\n });\n if (!enabled) {\n return { valid: true, errors: [], checks: [] };\n }\n }\n\n // Run each check\n if (config.checks) {\n for (const check of config.checks) {\n const result = runValidationCheck(check, ctx);\n checks.push(result);\n if (!result.valid) {\n errors.push(result.message);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n checks,\n };\n}\n\n/**\n * Helper to create validation checks\n */\nexport const check = {\n required: (message = \"This field is required\"): ValidationCheck => ({\n fn: \"required\",\n message,\n }),\n\n email: (message = \"Invalid email address\"): ValidationCheck => ({\n fn: \"email\",\n message,\n }),\n\n minLength: (min: number, message?: string): ValidationCheck => ({\n fn: \"minLength\",\n args: { min },\n message: message ?? `Must be at least ${min} characters`,\n }),\n\n maxLength: (max: number, message?: string): ValidationCheck => ({\n fn: \"maxLength\",\n args: { max },\n message: message ?? `Must be at most ${max} characters`,\n }),\n\n pattern: (pattern: string, message = \"Invalid format\"): ValidationCheck => ({\n fn: \"pattern\",\n args: { pattern },\n message,\n }),\n\n min: (min: number, message?: string): ValidationCheck => ({\n fn: \"min\",\n args: { min },\n message: message ?? `Must be at least ${min}`,\n }),\n\n max: (max: number, message?: string): ValidationCheck => ({\n fn: \"max\",\n args: { max },\n message: message ?? `Must be at most ${max}`,\n }),\n\n url: (message = \"Invalid URL\"): ValidationCheck => ({\n fn: \"url\",\n message,\n }),\n\n matches: (\n otherPath: string,\n message = \"Fields must match\",\n ): ValidationCheck => ({\n fn: \"matches\",\n args: { other: { path: otherPath } },\n message,\n }),\n};\n","import { z } from \"zod\";\n\n/**\n * Schema builder primitives\n */\nexport interface SchemaBuilder {\n /** String type */\n string(): SchemaType<\"string\">;\n /** Number type */\n number(): SchemaType<\"number\">;\n /** Boolean type */\n boolean(): SchemaType<\"boolean\">;\n /** Array of type */\n array<T extends SchemaType>(item: T): SchemaType<\"array\", T>;\n /** Object with shape */\n object<T extends Record<string, SchemaType>>(\n shape: T,\n ): SchemaType<\"object\", T>;\n /** Record/map with value type */\n record<T extends SchemaType>(value: T): SchemaType<\"record\", T>;\n /** Any type */\n any(): SchemaType<\"any\">;\n /** Placeholder for user-provided Zod schema */\n zod(): SchemaType<\"zod\">;\n /** Reference to catalog key (e.g., 'catalog.components') */\n ref(path: string): SchemaType<\"ref\", string>;\n /** Props from referenced catalog entry */\n propsOf(path: string): SchemaType<\"propsOf\", string>;\n /** Map of named entries with shared shape */\n map<T extends Record<string, SchemaType>>(\n entryShape: T,\n ): SchemaType<\"map\", T>;\n /** Optional modifier */\n optional(): { optional: true };\n}\n\n/**\n * Schema type representation\n */\nexport interface SchemaType<TKind extends string = string, TInner = unknown> {\n kind: TKind;\n inner?: TInner;\n optional?: boolean;\n}\n\n/**\n * Schema definition shape\n */\nexport interface SchemaDefinition<\n TSpec extends SchemaType = SchemaType,\n TCatalog extends SchemaType = SchemaType,\n> {\n /** What the AI-generated spec looks like */\n spec: TSpec;\n /** What the catalog must provide */\n catalog: TCatalog;\n}\n\n/**\n * Schema instance with methods\n */\nexport interface Schema<TDef extends SchemaDefinition = SchemaDefinition> {\n /** The schema definition */\n readonly definition: TDef;\n /** Custom prompt template for this schema */\n readonly promptTemplate?: PromptTemplate;\n /** Create a catalog from this schema */\n createCatalog<TCatalog extends InferCatalogInput<TDef[\"catalog\"]>>(\n catalog: TCatalog,\n ): Catalog<TDef, TCatalog>;\n}\n\n/**\n * Catalog instance with methods\n */\nexport interface Catalog<\n TDef extends SchemaDefinition = SchemaDefinition,\n TCatalog = unknown,\n> {\n /** The schema this catalog is based on */\n readonly schema: Schema<TDef>;\n /** The catalog data */\n readonly data: TCatalog;\n /** Component names */\n readonly componentNames: string[];\n /** Action names */\n readonly actionNames: string[];\n /** Generate system prompt for AI */\n prompt(options?: PromptOptions): string;\n /** Export as JSON Schema for structured outputs */\n jsonSchema(): object;\n /** Validate a spec against this catalog */\n validate(spec: unknown): SpecValidationResult<InferSpec<TDef, TCatalog>>;\n /** Get the Zod schema for the spec */\n zodSchema(): z.ZodType<InferSpec<TDef, TCatalog>>;\n /** Type helper for the spec type */\n readonly _specType: InferSpec<TDef, TCatalog>;\n}\n\n/**\n * Prompt generation options\n */\nexport interface PromptOptions {\n /** Custom system message intro */\n system?: string;\n /** Additional rules to append */\n customRules?: string[];\n}\n\n/**\n * Context provided to prompt templates\n */\nexport interface PromptContext<TCatalog = unknown> {\n /** The catalog data */\n catalog: TCatalog;\n /** Component names from the catalog */\n componentNames: string[];\n /** Action names from the catalog (if any) */\n actionNames: string[];\n /** Prompt options provided by the user */\n options: PromptOptions;\n /** Helper to format a Zod type as a human-readable string */\n formatZodType: (schema: z.ZodType) => string;\n}\n\n/**\n * Prompt template function type\n */\nexport type PromptTemplate<TCatalog = unknown> = (\n context: PromptContext<TCatalog>,\n) => string;\n\n/**\n * Schema options\n */\nexport interface SchemaOptions<TCatalog = unknown> {\n /** Custom prompt template for this schema */\n promptTemplate?: PromptTemplate<TCatalog>;\n}\n\n/**\n * Spec validation result\n */\nexport interface SpecValidationResult<T> {\n success: boolean;\n data?: T;\n error?: z.ZodError;\n}\n\n// =============================================================================\n// Catalog Type Inference Helpers\n// =============================================================================\n\n/**\n * Extract the components map type from a catalog\n * @example type Components = InferCatalogComponents<typeof myCatalog>;\n */\nexport type InferCatalogComponents<C extends Catalog> =\n C extends Catalog<SchemaDefinition, infer TCatalog>\n ? TCatalog extends { components: infer Comps }\n ? Comps\n : never\n : never;\n\n/**\n * Extract the actions map type from a catalog\n * @example type Actions = InferCatalogActions<typeof myCatalog>;\n */\nexport type InferCatalogActions<C extends Catalog> =\n C extends Catalog<SchemaDefinition, infer TCatalog>\n ? TCatalog extends { actions: infer Acts }\n ? Acts\n : never\n : never;\n\n/**\n * Infer component props from a catalog by component name\n * @example type ButtonProps = InferComponentProps<typeof myCatalog, 'Button'>;\n */\nexport type InferComponentProps<\n C extends Catalog,\n K extends keyof InferCatalogComponents<C>,\n> = InferCatalogComponents<C>[K] extends { props: z.ZodType<infer P> }\n ? P\n : never;\n\n/**\n * Infer action params from a catalog by action name\n * @example type ViewCustomersParams = InferActionParams<typeof myCatalog, 'viewCustomers'>;\n */\nexport type InferActionParams<\n C extends Catalog,\n K extends keyof InferCatalogActions<C>,\n> = InferCatalogActions<C>[K] extends { params: z.ZodType<infer P> }\n ? P\n : never;\n\n// =============================================================================\n// Internal Type Inference Helpers\n// =============================================================================\n\nexport type InferCatalogInput<T> =\n T extends SchemaType<\"object\", infer Shape>\n ? { [K in keyof Shape]: InferCatalogField<Shape[K]> }\n : never;\n\ntype InferCatalogField<T> =\n T extends SchemaType<\"map\", infer EntryShape>\n ? Record<\n string,\n // Only 'props' is required, rest are optional\n InferMapEntryRequired<EntryShape> &\n Partial<InferMapEntryOptional<EntryShape>>\n >\n : T extends SchemaType<\"zod\">\n ? z.ZodType\n : T extends SchemaType<\"string\">\n ? string\n : T extends SchemaType<\"number\">\n ? number\n : T extends SchemaType<\"boolean\">\n ? boolean\n : T extends SchemaType<\"array\", infer Item>\n ? InferCatalogField<Item>[]\n : T extends SchemaType<\"object\", infer Shape>\n ? { [K in keyof Shape]: InferCatalogField<Shape[K]> }\n : unknown;\n\n// Extract required fields (props is always required)\ntype InferMapEntryRequired<T> = {\n [K in keyof T as K extends \"props\" ? K : never]: InferMapEntryField<T[K]>;\n};\n\n// Extract optional fields (everything except props)\ntype InferMapEntryOptional<T> = {\n [K in keyof T as K extends \"props\" ? never : K]: InferMapEntryField<T[K]>;\n};\n\ntype InferMapEntryField<T> =\n T extends SchemaType<\"zod\">\n ? z.ZodType\n : T extends SchemaType<\"string\">\n ? string\n : T extends SchemaType<\"number\">\n ? number\n : T extends SchemaType<\"boolean\">\n ? boolean\n : T extends SchemaType<\"array\", infer Item>\n ? InferMapEntryField<Item>[]\n : T extends SchemaType<\"object\", infer Shape>\n ? { [K in keyof Shape]: InferMapEntryField<Shape[K]> }\n : unknown;\n\n// Spec inference (simplified - will be expanded)\nexport type InferSpec<TDef extends SchemaDefinition, TCatalog> = TDef extends {\n spec: SchemaType<\"object\", infer Shape>;\n}\n ? InferSpecObject<Shape, TCatalog>\n : unknown;\n\ntype InferSpecObject<Shape, TCatalog> = {\n [K in keyof Shape]: InferSpecField<Shape[K], TCatalog>;\n};\n\ntype InferSpecField<T, TCatalog> =\n T extends SchemaType<\"string\">\n ? string\n : T extends SchemaType<\"number\">\n ? number\n : T extends SchemaType<\"boolean\">\n ? boolean\n : T extends SchemaType<\"array\", infer Item>\n ? InferSpecField<Item, TCatalog>[]\n : T extends SchemaType<\"object\", infer Shape>\n ? InferSpecObject<Shape, TCatalog>\n : T extends SchemaType<\"record\", infer Value>\n ? Record<string, InferSpecField<Value, TCatalog>>\n : T extends SchemaType<\"ref\", infer Path>\n ? InferRefType<Path, TCatalog>\n : T extends SchemaType<\"propsOf\", infer Path>\n ? InferPropsOfType<Path, TCatalog>\n : T extends SchemaType<\"any\">\n ? unknown\n : unknown;\n\ntype InferRefType<Path, TCatalog> = Path extends \"catalog.components\"\n ? TCatalog extends { components: infer C }\n ? keyof C\n : string\n : Path extends \"catalog.actions\"\n ? TCatalog extends { actions: infer A }\n ? keyof A\n : string\n : string;\n\ntype InferPropsOfType<Path, TCatalog> = Path extends \"catalog.components\"\n ? TCatalog extends { components: infer C }\n ? C extends Record<string, { props: z.ZodType<infer P> }>\n ? P\n : Record<string, unknown>\n : Record<string, unknown>\n : Record<string, unknown>;\n\n/**\n * Create the schema builder\n */\nfunction createBuilder(): SchemaBuilder {\n return {\n string: () => ({ kind: \"string\" }),\n number: () => ({ kind: \"number\" }),\n boolean: () => ({ kind: \"boolean\" }),\n array: (item) => ({ kind: \"array\", inner: item }),\n object: (shape) => ({ kind: \"object\", inner: shape }),\n record: (value) => ({ kind: \"record\", inner: value }),\n any: () => ({ kind: \"any\" }),\n zod: () => ({ kind: \"zod\" }),\n ref: (path) => ({ kind: \"ref\", inner: path }),\n propsOf: (path) => ({ kind: \"propsOf\", inner: path }),\n map: (entryShape) => ({ kind: \"map\", inner: entryShape }),\n optional: () => ({ optional: true }),\n };\n}\n\n/**\n * Define a schema using the builder pattern\n */\nexport function defineSchema<TDef extends SchemaDefinition>(\n builder: (s: SchemaBuilder) => TDef,\n options?: SchemaOptions,\n): Schema<TDef> {\n const s = createBuilder();\n const definition = builder(s);\n\n return {\n definition,\n promptTemplate: options?.promptTemplate,\n createCatalog<TCatalog extends InferCatalogInput<TDef[\"catalog\"]>>(\n catalog: TCatalog,\n ): Catalog<TDef, TCatalog> {\n return createCatalogFromSchema(this as Schema<TDef>, catalog);\n },\n };\n}\n\n/**\n * Create a catalog from a schema (internal)\n */\nfunction createCatalogFromSchema<TDef extends SchemaDefinition, TCatalog>(\n schema: Schema<TDef>,\n catalogData: TCatalog,\n): Catalog<TDef, TCatalog> {\n // Extract component and action names\n const components = (catalogData as Record<string, unknown>).components as\n | Record<string, unknown>\n | undefined;\n const actions = (catalogData as Record<string, unknown>).actions as\n | Record<string, unknown>\n | undefined;\n\n const componentNames = components ? Object.keys(components) : [];\n const actionNames = actions ? Object.keys(actions) : [];\n\n // Build the Zod schema for validation\n const zodSchema = buildZodSchemaFromDefinition(\n schema.definition,\n catalogData,\n );\n\n return {\n schema,\n data: catalogData,\n componentNames,\n actionNames,\n\n prompt(options: PromptOptions = {}): string {\n return generatePrompt(this, options);\n },\n\n jsonSchema(): object {\n return zodToJsonSchema(zodSchema);\n },\n\n validate(spec: unknown): SpecValidationResult<InferSpec<TDef, TCatalog>> {\n const result = zodSchema.safeParse(spec);\n if (result.success) {\n return {\n success: true,\n data: result.data as InferSpec<TDef, TCatalog>,\n };\n }\n return { success: false, error: result.error };\n },\n\n zodSchema(): z.ZodType<InferSpec<TDef, TCatalog>> {\n return zodSchema as z.ZodType<InferSpec<TDef, TCatalog>>;\n },\n\n get _specType(): InferSpec<TDef, TCatalog> {\n throw new Error(\"_specType is only for type inference\");\n },\n };\n}\n\n/**\n * Build Zod schema from schema definition\n */\nfunction buildZodSchemaFromDefinition(\n definition: SchemaDefinition,\n catalogData: unknown,\n): z.ZodType {\n return buildZodType(definition.spec, catalogData);\n}\n\nfunction buildZodType(schemaType: SchemaType, catalogData: unknown): z.ZodType {\n switch (schemaType.kind) {\n case \"string\":\n return z.string();\n case \"number\":\n return z.number();\n case \"boolean\":\n return z.boolean();\n case \"any\":\n return z.any();\n case \"array\": {\n const inner = buildZodType(schemaType.inner as SchemaType, catalogData);\n return z.array(inner);\n }\n case \"object\": {\n const shape = schemaType.inner as Record<string, SchemaType>;\n const zodShape: Record<string, z.ZodType> = {};\n for (const [key, value] of Object.entries(shape)) {\n let zodType = buildZodType(value, catalogData);\n if (value.optional) {\n zodType = zodType.optional();\n }\n zodShape[key] = zodType;\n }\n return z.object(zodShape);\n }\n case \"record\": {\n const inner = buildZodType(schemaType.inner as SchemaType, catalogData);\n return z.record(z.string(), inner);\n }\n case \"ref\": {\n // Reference to catalog key - create enum of valid keys\n const path = schemaType.inner as string;\n const keys = getKeysFromPath(path, catalogData);\n if (keys.length === 0) {\n return z.string();\n }\n if (keys.length === 1) {\n return z.literal(keys[0]!);\n }\n return z.enum(keys as [string, ...string[]]);\n }\n case \"propsOf\": {\n // Props from catalog entry - create union of all props schemas\n const path = schemaType.inner as string;\n const propsSchemas = getPropsFromPath(path, catalogData);\n if (propsSchemas.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n if (propsSchemas.length === 1) {\n return propsSchemas[0]!;\n }\n // For propsOf, we need to be lenient since type determines which props apply\n return z.record(z.string(), z.unknown());\n }\n default:\n return z.unknown();\n }\n}\n\nfunction getKeysFromPath(path: string, catalogData: unknown): string[] {\n const parts = path.split(\".\");\n let current: unknown = { catalog: catalogData };\n for (const part of parts) {\n if (current && typeof current === \"object\") {\n current = (current as Record<string, unknown>)[part];\n } else {\n return [];\n }\n }\n if (current && typeof current === \"object\") {\n return Object.keys(current);\n }\n return [];\n}\n\nfunction getPropsFromPath(path: string, catalogData: unknown): z.ZodType[] {\n const parts = path.split(\".\");\n let current: unknown = { catalog: catalogData };\n for (const part of parts) {\n if (current && typeof current === \"object\") {\n current = (current as Record<string, unknown>)[part];\n } else {\n return [];\n }\n }\n if (current && typeof current === \"object\") {\n return Object.values(current as Record<string, { props?: z.ZodType }>)\n .map((entry) => entry.props)\n .filter((props): props is z.ZodType => props !== undefined);\n }\n return [];\n}\n\n/**\n * Generate system prompt from catalog\n */\nfunction generatePrompt<TDef extends SchemaDefinition, TCatalog>(\n catalog: Catalog<TDef, TCatalog>,\n options: PromptOptions,\n): string {\n // Check if schema has a custom prompt template\n if (catalog.schema.promptTemplate) {\n const context: PromptContext<TCatalog> = {\n catalog: catalog.data,\n componentNames: catalog.componentNames,\n actionNames: catalog.actionNames,\n options,\n formatZodType,\n };\n return catalog.schema.promptTemplate(context);\n }\n\n // Default JSONL element-tree format (for @json-render/react and similar)\n const {\n system = \"You are a UI generator that outputs JSON.\",\n customRules = [],\n } = options;\n\n const lines: string[] = [];\n lines.push(system);\n lines.push(\"\");\n\n // Output format section - explain JSONL streaming patch format\n lines.push(\"OUTPUT FORMAT:\");\n lines.push(\n \"Output JSONL (one JSON object per line) with patches to build a UI tree.\",\n );\n lines.push(\n \"Each line is a JSON patch operation. Start with the root, then add each element.\",\n );\n lines.push(\"\");\n lines.push(\"Example output (each line is a separate JSON object):\");\n lines.push(\"\");\n lines.push(`{\"op\":\"set\",\"path\":\"/root\",\"value\":\"card-1\"}\n{\"op\":\"set\",\"path\":\"/elements/card-1\",\"value\":{\"key\":\"card-1\",\"type\":\"Card\",\"props\":{\"title\":\"Dashboard\"},\"children\":[\"metric-1\",\"chart-1\"],\"parentKey\":\"\"}}\n{\"op\":\"set\",\"path\":\"/elements/metric-1\",\"value\":{\"key\":\"metric-1\",\"type\":\"Metric\",\"props\":{\"label\":\"Revenue\",\"valuePath\":\"analytics.revenue\",\"format\":\"currency\"},\"children\":[],\"parentKey\":\"card-1\"}}\n{\"op\":\"set\",\"path\":\"/elements/chart-1\",\"value\":{\"key\":\"chart-1\",\"type\":\"Chart\",\"props\":{\"type\":\"bar\",\"dataPath\":\"analytics.salesByRegion\"},\"children\":[],\"parentKey\":\"card-1\"}}`);\n lines.push(\"\");\n\n // Components section\n const components = (catalog.data as Record<string, unknown>).components as\n | Record<\n string,\n { props?: z.ZodType; description?: string; slots?: string[] }\n >\n | undefined;\n\n if (components) {\n lines.push(`AVAILABLE COMPONENTS (${catalog.componentNames.length}):`);\n lines.push(\"\");\n\n for (const [name, def] of Object.entries(components)) {\n const propsStr = def.props ? formatZodType(def.props) : \"{}\";\n const hasChildren = def.slots && def.slots.length > 0;\n const childrenStr = hasChildren ? \" [accepts children]\" : \"\";\n const descStr = def.description ? ` - ${def.description}` : \"\";\n lines.push(`- ${name}: ${propsStr}${descStr}${childrenStr}`);\n }\n lines.push(\"\");\n }\n\n // Actions section\n const actions = (catalog.data as Record<string, unknown>).actions as\n | Record<string, { params?: z.ZodType; description?: string }>\n | undefined;\n\n if (actions && catalog.actionNames.length > 0) {\n lines.push(\"AVAILABLE ACTIONS:\");\n lines.push(\"\");\n for (const [name, def] of Object.entries(actions)) {\n lines.push(`- ${name}${def.description ? `: ${def.description}` : \"\"}`);\n }\n lines.push(\"\");\n }\n\n // Rules\n lines.push(\"RULES:\");\n const baseRules = [\n \"Output ONLY JSONL patches - one JSON object per line, no markdown, no code fences\",\n 'First line sets root: {\"op\":\"set\",\"path\":\"/root\",\"value\":\"<root-key>\"}',\n 'Then add each element: {\"op\":\"set\",\"path\":\"/elements/<key>\",\"value\":{...}}',\n \"ONLY use components listed above\",\n \"Each element value needs: key, type, props, children (array of child keys), parentKey\",\n \"Use unique keys (e.g., 'header', 'metric-1', 'chart-revenue')\",\n \"Root element's parentKey is empty string, children reference their parent's key\",\n ];\n const allRules = [...baseRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get Zod type name from schema (handles different Zod versions)\n */\nfunction getZodTypeName(schema: z.ZodType): string {\n if (!schema || !schema._def) return \"\";\n const def = schema._def as unknown as Record<string, unknown>;\n // Zod 4+ uses _def.type, older versions use _def.typeName\n return (def.typeName as string) ?? (def.type as string) ?? \"\";\n}\n\n/**\n * Format a Zod type into a human-readable string\n */\nfunction formatZodType(schema: z.ZodType): string {\n if (!schema || !schema._def) return \"unknown\";\n const def = schema._def as unknown as Record<string, unknown>;\n const typeName = getZodTypeName(schema);\n\n switch (typeName) {\n case \"ZodString\":\n case \"string\":\n return \"string\";\n case \"ZodNumber\":\n case \"number\":\n return \"number\";\n case \"ZodBoolean\":\n case \"boolean\":\n return \"boolean\";\n case \"ZodLiteral\":\n case \"literal\":\n return JSON.stringify(def.value);\n case \"ZodEnum\":\n case \"enum\": {\n // Zod 3 uses values array, Zod 4 uses entries object\n let values: string[];\n if (Array.isArray(def.values)) {\n values = def.values as string[];\n } else if (def.entries && typeof def.entries === \"object\") {\n values = Object.values(def.entries as Record<string, string>);\n } else {\n return \"enum\";\n }\n return values.map((v) => `\"${v}\"`).join(\" | \");\n }\n case \"ZodArray\":\n case \"array\": {\n const inner = (def.type as z.ZodType) ?? (def.element as z.ZodType);\n return inner ? `Array<${formatZodType(inner)}>` : \"Array<unknown>\";\n }\n case \"ZodObject\":\n case \"object\": {\n // Shape can be a function (Zod 3) or direct object (Zod 4)\n const shape =\n typeof def.shape === \"function\"\n ? (def.shape as () => Record<string, z.ZodType>)()\n : (def.shape as Record<string, z.ZodType>);\n if (!shape) return \"object\";\n const props = Object.entries(shape)\n .map(([key, value]) => {\n const innerTypeName = getZodTypeName(value);\n const isOptional =\n innerTypeName === \"ZodOptional\" ||\n innerTypeName === \"ZodNullable\" ||\n innerTypeName === \"optional\" ||\n innerTypeName === \"nullable\";\n return `${key}${isOptional ? \"?\" : \"\"}: ${formatZodType(value)}`;\n })\n .join(\", \");\n return `{ ${props} }`;\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\": {\n const inner = (def.innerType as z.ZodType) ?? (def.wrapped as z.ZodType);\n return inner ? formatZodType(inner) : \"unknown\";\n }\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as z.ZodType[] | undefined;\n return options\n ? options.map((opt) => formatZodType(opt)).join(\" | \")\n : \"unknown\";\n }\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Convert Zod schema to JSON Schema\n */\nfunction zodToJsonSchema(schema: z.ZodType): object {\n // Simplified JSON Schema conversion\n const def = schema._def as unknown as Record<string, unknown>;\n const typeName = (def.typeName as string) ?? \"\";\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodLiteral\":\n return { const: def.value };\n case \"ZodEnum\":\n return { enum: def.values };\n case \"ZodArray\": {\n const inner = def.type as z.ZodType | undefined;\n return {\n type: \"array\",\n items: inner ? zodToJsonSchema(inner) : {},\n };\n }\n case \"ZodObject\": {\n const shape = (def.shape as () => Record<string, z.ZodType>)?.();\n if (!shape) return { type: \"object\" };\n const properties: Record<string, object> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value);\n const innerDef = value._def as unknown as Record<string, unknown>;\n if (\n innerDef.typeName !== \"ZodOptional\" &&\n innerDef.typeName !== \"ZodNullable\"\n ) {\n required.push(key);\n }\n }\n return {\n type: \"object\",\n properties,\n required: required.length > 0 ? required : undefined,\n additionalProperties: false,\n };\n }\n case \"ZodRecord\": {\n const valueType = def.valueType as z.ZodType | undefined;\n return {\n type: \"object\",\n additionalProperties: valueType ? zodToJsonSchema(valueType) : true,\n };\n }\n case \"ZodOptional\":\n case \"ZodNullable\": {\n const inner = def.innerType as z.ZodType | undefined;\n return inner ? zodToJsonSchema(inner) : {};\n }\n case \"ZodUnion\": {\n const options = def.options as z.ZodType[] | undefined;\n return options ? { anyOf: options.map(zodToJsonSchema) } : {};\n }\n case \"ZodAny\":\n return {};\n default:\n return {};\n }\n}\n\n/**\n * Shorthand: Define a catalog directly from a schema\n */\nexport function defineCatalog<\n TDef extends SchemaDefinition,\n TCatalog extends InferCatalogInput<TDef[\"catalog\"]>,\n>(schema: Schema<TDef>, catalog: TCatalog): Catalog<TDef, TCatalog> {\n return schema.createCatalog(catalog);\n}\n","import { z } from \"zod\";\nimport type {\n ComponentSchema,\n ValidationMode,\n UIElement,\n Spec,\n VisibilityCondition,\n} from \"./types\";\nimport { VisibilityConditionSchema } from \"./visibility\";\nimport { ActionSchema, type ActionDefinition } from \"./actions\";\nimport { ValidationConfigSchema, type ValidationFunction } from \"./validation\";\n\n/**\n * Component definition with visibility and validation support\n */\nexport interface ComponentDefinition<\n TProps extends ComponentSchema = ComponentSchema,\n> {\n /** Zod schema for component props */\n props: TProps;\n /** Whether this component can have children */\n hasChildren?: boolean;\n /** Description for AI generation */\n description?: string;\n}\n\n/**\n * Catalog configuration\n */\nexport interface CatalogConfig<\n TComponents extends Record<string, ComponentDefinition> = Record<\n string,\n ComponentDefinition\n >,\n TActions extends Record<string, ActionDefinition> = Record<\n string,\n ActionDefinition\n >,\n TFunctions extends Record<string, ValidationFunction> = Record<\n string,\n ValidationFunction\n >,\n> {\n /** Catalog name */\n name?: string;\n /** Component definitions */\n components: TComponents;\n /** Action definitions with param schemas */\n actions?: TActions;\n /** Custom validation functions */\n functions?: TFunctions;\n /** Validation mode */\n validation?: ValidationMode;\n}\n\n/**\n * Catalog instance\n */\nexport interface Catalog<\n TComponents extends Record<string, ComponentDefinition> = Record<\n string,\n ComponentDefinition\n >,\n TActions extends Record<string, ActionDefinition> = Record<\n string,\n ActionDefinition\n >,\n TFunctions extends Record<string, ValidationFunction> = Record<\n string,\n ValidationFunction\n >,\n> {\n /** Catalog name */\n readonly name: string;\n /** Component names */\n readonly componentNames: (keyof TComponents)[];\n /** Action names */\n readonly actionNames: (keyof TActions)[];\n /** Function names */\n readonly functionNames: (keyof TFunctions)[];\n /** Validation mode */\n readonly validation: ValidationMode;\n /** Component definitions */\n readonly components: TComponents;\n /** Action definitions */\n readonly actions: TActions;\n /** Custom validation functions */\n readonly functions: TFunctions;\n /** Full element schema for AI generation */\n readonly elementSchema: z.ZodType<UIElement>;\n /** Full UI spec schema */\n readonly specSchema: z.ZodType<Spec>;\n /** Check if component exists */\n hasComponent(type: string): boolean;\n /** Check if action exists */\n hasAction(name: string): boolean;\n /** Check if function exists */\n hasFunction(name: string): boolean;\n /** Validate an element */\n validateElement(element: unknown): {\n success: boolean;\n data?: UIElement;\n error?: z.ZodError;\n };\n /** Validate a UI spec */\n validateSpec(spec: unknown): {\n success: boolean;\n data?: Spec;\n error?: z.ZodError;\n };\n}\n\n/**\n * Create a v2 catalog with visibility, actions, and validation support\n */\nexport function createCatalog<\n TComponents extends Record<string, ComponentDefinition>,\n TActions extends Record<string, ActionDefinition> = Record<\n string,\n ActionDefinition\n >,\n TFunctions extends Record<string, ValidationFunction> = Record<\n string,\n ValidationFunction\n >,\n>(\n config: CatalogConfig<TComponents, TActions, TFunctions>,\n): Catalog<TComponents, TActions, TFunctions> {\n const {\n name = \"unnamed\",\n components,\n actions = {} as TActions,\n functions = {} as TFunctions,\n validation = \"strict\",\n } = config;\n\n const componentNames = Object.keys(components) as (keyof TComponents)[];\n const actionNames = Object.keys(actions) as (keyof TActions)[];\n const functionNames = Object.keys(functions) as (keyof TFunctions)[];\n\n // Create element schema for each component type\n const componentSchemas = componentNames.map((componentName) => {\n const def = components[componentName]!;\n\n return z.object({\n key: z.string(),\n type: z.literal(componentName as string),\n props: def.props,\n children: z.array(z.string()).optional(),\n parentKey: z.string().nullable().optional(),\n visible: VisibilityConditionSchema.optional(),\n });\n });\n\n // Create union schema for all components\n let elementSchema: z.ZodType<UIElement>;\n\n if (componentSchemas.length === 0) {\n elementSchema = z.object({\n key: z.string(),\n type: z.string(),\n props: z.record(z.string(), z.unknown()),\n children: z.array(z.string()).optional(),\n parentKey: z.string().nullable().optional(),\n visible: VisibilityConditionSchema.optional(),\n }) as unknown as z.ZodType<UIElement>;\n } else if (componentSchemas.length === 1) {\n elementSchema = componentSchemas[0] as unknown as z.ZodType<UIElement>;\n } else {\n elementSchema = z.discriminatedUnion(\"type\", [\n componentSchemas[0] as z.ZodObject<any>,\n componentSchemas[1] as z.ZodObject<any>,\n ...(componentSchemas.slice(2) as z.ZodObject<any>[]),\n ]) as unknown as z.ZodType<UIElement>;\n }\n\n // Create spec schema\n const specSchema = z.object({\n root: z.string(),\n elements: z.record(z.string(), elementSchema),\n }) as unknown as z.ZodType<Spec>;\n\n return {\n name,\n componentNames,\n actionNames,\n functionNames,\n validation,\n components,\n actions,\n functions,\n elementSchema,\n specSchema,\n\n hasComponent(type: string) {\n return type in components;\n },\n\n hasAction(name: string) {\n return name in actions;\n },\n\n hasFunction(name: string) {\n return name in functions;\n },\n\n validateElement(element: unknown) {\n const result = elementSchema.safeParse(element);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n },\n\n validateSpec(spec: unknown) {\n const result = specSchema.safeParse(spec);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n },\n };\n}\n\n/**\n * Generate a prompt for AI that describes the catalog\n */\nexport function generateCatalogPrompt<\n TComponents extends Record<string, ComponentDefinition>,\n TActions extends Record<string, ActionDefinition>,\n TFunctions extends Record<string, ValidationFunction>,\n>(catalog: Catalog<TComponents, TActions, TFunctions>): string {\n const lines: string[] = [\n `# ${catalog.name} Component Catalog`,\n \"\",\n \"## Available Components\",\n \"\",\n ];\n\n // Components\n for (const name of catalog.componentNames) {\n const def = catalog.components[name]!;\n lines.push(`### ${String(name)}`);\n if (def.description) {\n lines.push(def.description);\n }\n lines.push(\"\");\n }\n\n // Actions\n if (catalog.actionNames.length > 0) {\n lines.push(\"## Available Actions\");\n lines.push(\"\");\n for (const name of catalog.actionNames) {\n const def = catalog.actions[name]!;\n lines.push(\n `- \\`${String(name)}\\`${def.description ? `: ${def.description}` : \"\"}`,\n );\n }\n lines.push(\"\");\n }\n\n // Visibility\n lines.push(\"## Visibility Conditions\");\n lines.push(\"\");\n lines.push(\"Components can have a `visible` property:\");\n lines.push(\"- `true` / `false` - Always visible/hidden\");\n lines.push('- `{ \"path\": \"/data/path\" }` - Visible when path is truthy');\n lines.push('- `{ \"auth\": \"signedIn\" }` - Visible when user is signed in');\n lines.push('- `{ \"and\": [...] }` - All conditions must be true');\n lines.push('- `{ \"or\": [...] }` - Any condition must be true');\n lines.push('- `{ \"not\": {...} }` - Negates a condition');\n lines.push('- `{ \"eq\": [a, b] }` - Equality check');\n lines.push(\"\");\n\n // Validation\n lines.push(\"## Validation Functions\");\n lines.push(\"\");\n lines.push(\n \"Built-in: `required`, `email`, `minLength`, `maxLength`, `pattern`, `min`, `max`, `url`\",\n );\n if (catalog.functionNames.length > 0) {\n lines.push(`Custom: ${catalog.functionNames.map(String).join(\", \")}`);\n }\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Type helper to infer component props from catalog\n */\nexport type InferCatalogComponentProps<\n C extends Catalog<Record<string, ComponentDefinition>>,\n> = {\n [K in keyof C[\"components\"]]: z.infer<C[\"components\"][K][\"props\"]>;\n};\n\n/**\n * Internal Zod definition type for introspection\n */\ninterface ZodDefInternal {\n typeName?: string;\n value?: unknown;\n values?: unknown;\n type?: z.ZodTypeAny;\n shape?: () => Record<string, z.ZodTypeAny>;\n innerType?: z.ZodTypeAny;\n options?: z.ZodTypeAny[];\n}\n\n/**\n * Format a Zod type into a human-readable string for prompts\n */\nfunction formatZodType(schema: z.ZodTypeAny, isOptional = false): string {\n const def = schema._def as unknown as ZodDefInternal;\n const typeName = def.typeName ?? \"\";\n\n let result: string;\n\n switch (typeName) {\n case \"ZodString\":\n result = \"string\";\n break;\n case \"ZodNumber\":\n result = \"number\";\n break;\n case \"ZodBoolean\":\n result = \"boolean\";\n break;\n case \"ZodLiteral\":\n result = JSON.stringify(def.value);\n break;\n case \"ZodEnum\":\n result = (def.values as string[]).map((v) => `\"${v}\"`).join(\"|\");\n break;\n case \"ZodNativeEnum\":\n result = Object.values(def.values as Record<string, string>)\n .map((v) => `\"${v}\"`)\n .join(\"|\");\n break;\n case \"ZodArray\":\n result = def.type\n ? `Array<${formatZodType(def.type)}>`\n : \"Array<unknown>\";\n break;\n case \"ZodObject\": {\n if (!def.shape) {\n result = \"object\";\n break;\n }\n const shape = def.shape();\n const props = Object.entries(shape)\n .map(([key, value]) => {\n const innerDef = value._def as unknown as ZodDefInternal;\n const innerOptional =\n innerDef.typeName === \"ZodOptional\" ||\n innerDef.typeName === \"ZodNullable\";\n return `${key}${innerOptional ? \"?\" : \"\"}: ${formatZodType(value)}`;\n })\n .join(\", \");\n result = `{ ${props} }`;\n break;\n }\n case \"ZodOptional\":\n return def.innerType ? formatZodType(def.innerType, true) : \"unknown?\";\n case \"ZodNullable\":\n return def.innerType ? formatZodType(def.innerType, true) : \"unknown?\";\n case \"ZodDefault\":\n return def.innerType\n ? formatZodType(def.innerType, isOptional)\n : \"unknown\";\n case \"ZodUnion\":\n result = def.options\n ? def.options.map((opt) => formatZodType(opt)).join(\"|\")\n : \"unknown\";\n break;\n case \"ZodNull\":\n result = \"null\";\n break;\n case \"ZodUndefined\":\n result = \"undefined\";\n break;\n case \"ZodAny\":\n result = \"any\";\n break;\n case \"ZodUnknown\":\n result = \"unknown\";\n break;\n default:\n result = \"unknown\";\n }\n\n return isOptional ? `${result}?` : result;\n}\n\n/**\n * Extract props from a Zod object schema as formatted entries\n */\nfunction extractPropsFromSchema(\n schema: z.ZodTypeAny,\n): Array<{ name: string; type: string; optional: boolean }> {\n const def = schema._def as unknown as ZodDefInternal;\n const typeName = def.typeName ?? \"\";\n\n if (typeName !== \"ZodObject\" || !def.shape) {\n return [];\n }\n\n const shape = def.shape();\n return Object.entries(shape).map(([name, value]) => {\n const innerDef = value._def as unknown as ZodDefInternal;\n const optional =\n innerDef.typeName === \"ZodOptional\" ||\n innerDef.typeName === \"ZodNullable\";\n return {\n name,\n type: formatZodType(value),\n optional,\n };\n });\n}\n\n/**\n * Format component props as a compact object notation\n */\nfunction formatPropsCompact(\n props: Array<{ name: string; type: string; optional: boolean }>,\n): string {\n if (props.length === 0) return \"{}\";\n const entries = props.map(\n (p) => `${p.name}${p.optional ? \"?\" : \"\"}: ${p.type}`,\n );\n return `{ ${entries.join(\", \")} }`;\n}\n\n/**\n * Options for generating system prompts\n */\nexport interface SystemPromptOptions {\n /** System message intro (replaces default) */\n system?: string;\n /** Additional rules to append to the rules section */\n customRules?: string[];\n}\n\n/**\n * Generate a complete system prompt for AI that can generate UI from a catalog.\n * This produces a ready-to-use prompt that stays in sync with the catalog definition.\n */\nexport function generateSystemPrompt<\n TComponents extends Record<string, ComponentDefinition>,\n TActions extends Record<string, ActionDefinition>,\n TFunctions extends Record<string, ValidationFunction>,\n>(\n catalog: Catalog<TComponents, TActions, TFunctions>,\n options: SystemPromptOptions = {},\n): string {\n const {\n system = \"You are a UI generator that outputs JSONL (JSON Lines) patches.\",\n customRules = [],\n } = options;\n\n const lines: string[] = [];\n\n // System intro\n lines.push(system);\n lines.push(\"\");\n\n // Components section\n const componentCount = catalog.componentNames.length;\n lines.push(`AVAILABLE COMPONENTS (${componentCount}):`);\n lines.push(\"\");\n\n for (const name of catalog.componentNames) {\n const def = catalog.components[name]!;\n const props = extractPropsFromSchema(def.props);\n const propsStr = formatPropsCompact(props);\n const hasChildrenStr = def.hasChildren ? \" Has children.\" : \"\";\n const descStr = def.description ? ` ${def.description}` : \"\";\n\n lines.push(`- ${String(name)}: ${propsStr}${descStr}${hasChildrenStr}`);\n }\n lines.push(\"\");\n\n // Actions section\n if (catalog.actionNames.length > 0) {\n lines.push(\"AVAILABLE ACTIONS:\");\n lines.push(\"\");\n for (const name of catalog.actionNames) {\n const def = catalog.actions[name]!;\n lines.push(\n `- ${String(name)}${def.description ? `: ${def.description}` : \"\"}`,\n );\n }\n lines.push(\"\");\n }\n\n // Output format\n lines.push(\"OUTPUT FORMAT (JSONL):\");\n lines.push('{\"op\":\"set\",\"path\":\"/root\",\"value\":\"element-key\"}');\n lines.push(\n '{\"op\":\"add\",\"path\":\"/elements/key\",\"value\":{\"key\":\"...\",\"type\":\"...\",\"props\":{...},\"children\":[...]}}',\n );\n lines.push('{\"op\":\"remove\",\"path\":\"/elements/key\"}');\n lines.push(\"\");\n\n // Rules\n lines.push(\"RULES:\");\n const baseRules = [\n \"First line sets /root to root element key\",\n \"Add elements with /elements/{key}\",\n \"Remove elements with op:remove - also update the parent's children array to exclude the removed key\",\n \"Children array contains string keys, not objects\",\n \"Parent first, then children\",\n \"Each element needs: key, type, props\",\n \"ONLY use props listed above - never invent new props\",\n ];\n const allRules = [...baseRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n lines.push(\"\");\n\n // Custom validation functions (only if catalog has them)\n if (catalog.functionNames.length > 0) {\n lines.push(\"CUSTOM VALIDATION FUNCTIONS:\");\n lines.push(catalog.functionNames.map(String).join(\", \"));\n lines.push(\"\");\n }\n\n // End with prompt\n lines.push(\"Generate JSONL:\");\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["z","z","z","z","action","executeAction","z","z","check","z","z","z","name","formatZodType"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/visibility.ts","../src/actions.ts","../src/validation.ts","../src/schema.ts","../src/catalog.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * Dynamic value - can be a literal or a path reference to data model\n */\nexport type DynamicValue<T = unknown> = T | { path: string };\n\n/**\n * Dynamic string value\n */\nexport type DynamicString = DynamicValue<string>;\n\n/**\n * Dynamic number value\n */\nexport type DynamicNumber = DynamicValue<number>;\n\n/**\n * Dynamic boolean value\n */\nexport type DynamicBoolean = DynamicValue<boolean>;\n\n/**\n * Zod schema for dynamic values\n */\nexport const DynamicValueSchema = z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.object({ path: z.string() }),\n]);\n\nexport const DynamicStringSchema = z.union([\n z.string(),\n z.object({ path: z.string() }),\n]);\n\nexport const DynamicNumberSchema = z.union([\n z.number(),\n z.object({ path: z.string() }),\n]);\n\nexport const DynamicBooleanSchema = z.union([\n z.boolean(),\n z.object({ path: z.string() }),\n]);\n\n/**\n * Base UI element structure for v2\n */\nexport interface UIElement<\n T extends string = string,\n P = Record<string, unknown>,\n> {\n /** Component type from the catalog */\n type: T;\n /** Component props */\n props: P;\n /** Child element keys (flat structure) */\n children?: string[];\n /** Visibility condition */\n visible?: VisibilityCondition;\n}\n\n/**\n * Element with key and parentKey for use with flatToTree.\n * When elements are in an array (not a keyed map), key and parentKey\n * are needed to establish identity and parent-child relationships.\n */\nexport interface FlatElement<\n T extends string = string,\n P = Record<string, unknown>,\n> extends UIElement<T, P> {\n /** Unique key identifying this element */\n key: string;\n /** Parent element key (null for root) */\n parentKey?: string | null;\n}\n\n/**\n * Visibility condition types\n */\nexport type VisibilityCondition =\n | boolean\n | { path: string }\n | { auth: \"signedIn\" | \"signedOut\" }\n | LogicExpression;\n\n/**\n * Logic expression for complex conditions\n */\nexport type LogicExpression =\n | { and: LogicExpression[] }\n | { or: LogicExpression[] }\n | { not: LogicExpression }\n | { path: string }\n | { eq: [DynamicValue, DynamicValue] }\n | { neq: [DynamicValue, DynamicValue] }\n | { gt: [DynamicValue<number>, DynamicValue<number>] }\n | { gte: [DynamicValue<number>, DynamicValue<number>] }\n | { lt: [DynamicValue<number>, DynamicValue<number>] }\n | { lte: [DynamicValue<number>, DynamicValue<number>] };\n\n/**\n * Flat UI tree structure (optimized for LLM generation)\n */\nexport interface Spec {\n /** Root element key */\n root: string;\n /** Flat map of elements by key */\n elements: Record<string, UIElement>;\n}\n\n/**\n * Auth state for visibility evaluation\n */\nexport interface AuthState {\n isSignedIn: boolean;\n user?: Record<string, unknown>;\n}\n\n/**\n * Data model type\n */\nexport type DataModel = Record<string, unknown>;\n\n/**\n * Component schema definition using Zod\n */\nexport type ComponentSchema = z.ZodType<Record<string, unknown>>;\n\n/**\n * Validation mode for catalog validation\n */\nexport type ValidationMode = \"strict\" | \"warn\" | \"ignore\";\n\n/**\n * JSON patch operation types (RFC 6902)\n */\nexport type PatchOp = \"add\" | \"remove\" | \"replace\" | \"move\" | \"copy\" | \"test\";\n\n/**\n * JSON patch operation (RFC 6902)\n */\nexport interface JsonPatch {\n op: PatchOp;\n path: string;\n /** Required for add, replace, test */\n value?: unknown;\n /** Required for move, copy (source location) */\n from?: string;\n}\n\n/**\n * Resolve a dynamic value against a data model\n */\nexport function resolveDynamicValue<T>(\n value: DynamicValue<T>,\n dataModel: DataModel,\n): T | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n\n if (typeof value === \"object\" && \"path\" in value) {\n return getByPath(dataModel, value.path) as T | undefined;\n }\n\n return value as T;\n}\n\n/**\n * Unescape a JSON Pointer token per RFC 6901 Section 4.\n * ~1 is decoded to / and ~0 is decoded to ~ (order matters).\n */\nfunction unescapeJsonPointer(token: string): string {\n return token.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\n/**\n * Parse a JSON Pointer path into unescaped segments.\n */\nfunction parseJsonPointer(path: string): string[] {\n const raw = path.startsWith(\"/\") ? path.slice(1).split(\"/\") : path.split(\"/\");\n return raw.map(unescapeJsonPointer);\n}\n\n/**\n * Get a value from an object by JSON Pointer path (RFC 6901)\n */\nexport function getByPath(obj: unknown, path: string): unknown {\n if (!path || path === \"/\") {\n return obj;\n }\n\n const segments = parseJsonPointer(path);\n\n let current: unknown = obj;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (Array.isArray(current)) {\n const index = parseInt(segment, 10);\n current = current[index];\n } else if (typeof current === \"object\") {\n current = (current as Record<string, unknown>)[segment];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\n/**\n * Check if a string is a numeric index\n */\nfunction isNumericIndex(str: string): boolean {\n return /^\\d+$/.test(str);\n}\n\n/**\n * Set a value in an object by JSON Pointer path (RFC 6901).\n * Automatically creates arrays when the path segment is a numeric index.\n */\nexport function setByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void {\n const segments = parseJsonPointer(path);\n\n if (segments.length === 0) return;\n\n let current: Record<string, unknown> | unknown[] = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!;\n const nextSegment = segments[i + 1];\n const nextIsNumeric =\n nextSegment !== undefined &&\n (isNumericIndex(nextSegment) || nextSegment === \"-\");\n\n if (Array.isArray(current)) {\n const index = parseInt(segment, 10);\n if (current[index] === undefined || typeof current[index] !== \"object\") {\n current[index] = nextIsNumeric ? [] : {};\n }\n current = current[index] as Record<string, unknown> | unknown[];\n } else {\n if (!(segment in current) || typeof current[segment] !== \"object\") {\n current[segment] = nextIsNumeric ? [] : {};\n }\n current = current[segment] as Record<string, unknown> | unknown[];\n }\n }\n\n const lastSegment = segments[segments.length - 1]!;\n if (Array.isArray(current)) {\n if (lastSegment === \"-\") {\n current.push(value);\n } else {\n const index = parseInt(lastSegment, 10);\n current[index] = value;\n }\n } else {\n current[lastSegment] = value;\n }\n}\n\n/**\n * Add a value per RFC 6902 \"add\" semantics.\n * For objects: create-or-replace the member.\n * For arrays: insert before the given index, or append if \"-\".\n */\nexport function addByPath(\n obj: Record<string, unknown>,\n path: string,\n value: unknown,\n): void {\n const segments = parseJsonPointer(path);\n\n if (segments.length === 0) return;\n\n let current: Record<string, unknown> | unknown[] = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!;\n const nextSegment = segments[i + 1];\n const nextIsNumeric =\n nextSegment !== undefined &&\n (isNumericIndex(nextSegment) || nextSegment === \"-\");\n\n if (Array.isArray(current)) {\n const index = parseInt(segment, 10);\n if (current[index] === undefined || typeof current[index] !== \"object\") {\n current[index] = nextIsNumeric ? [] : {};\n }\n current = current[index] as Record<string, unknown> | unknown[];\n } else {\n if (!(segment in current) || typeof current[segment] !== \"object\") {\n current[segment] = nextIsNumeric ? [] : {};\n }\n current = current[segment] as Record<string, unknown> | unknown[];\n }\n }\n\n const lastSegment = segments[segments.length - 1]!;\n if (Array.isArray(current)) {\n if (lastSegment === \"-\") {\n current.push(value);\n } else {\n const index = parseInt(lastSegment, 10);\n current.splice(index, 0, value);\n }\n } else {\n current[lastSegment] = value;\n }\n}\n\n/**\n * Remove a value per RFC 6902 \"remove\" semantics.\n * For objects: delete the property.\n * For arrays: splice out the element at the given index.\n */\nexport function removeByPath(obj: Record<string, unknown>, path: string): void {\n const segments = parseJsonPointer(path);\n\n if (segments.length === 0) return;\n\n let current: Record<string, unknown> | unknown[] = obj;\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!;\n\n if (Array.isArray(current)) {\n const index = parseInt(segment, 10);\n if (current[index] === undefined || typeof current[index] !== \"object\") {\n return; // path does not exist\n }\n current = current[index] as Record<string, unknown> | unknown[];\n } else {\n if (!(segment in current) || typeof current[segment] !== \"object\") {\n return; // path does not exist\n }\n current = current[segment] as Record<string, unknown> | unknown[];\n }\n }\n\n const lastSegment = segments[segments.length - 1]!;\n if (Array.isArray(current)) {\n const index = parseInt(lastSegment, 10);\n if (index >= 0 && index < current.length) {\n current.splice(index, 1);\n }\n } else {\n delete current[lastSegment];\n }\n}\n\n/**\n * Deep equality check for RFC 6902 \"test\" operation.\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== typeof b) return false;\n if (typeof a !== \"object\") return false;\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n return a.every((item, i) => deepEqual(item, b[i]));\n }\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((key) => deepEqual(aObj[key], bObj[key]));\n}\n\n/**\n * Find a form value from params and/or data.\n * Useful in action handlers to locate form input values regardless of path format.\n *\n * Checks in order:\n * 1. Direct param key (if not a path reference)\n * 2. Param keys ending with the field name\n * 3. Data keys ending with the field name (dot notation)\n * 4. Data paths using getByPath (slash notation)\n *\n * @example\n * // Find \"name\" from params or data\n * const name = findFormValue(\"name\", params, data);\n *\n * // Will find from: params.name, params[\"form.name\"], data[\"customerForm.name\"], data.customerForm.name\n */\nexport function findFormValue(\n fieldName: string,\n params?: Record<string, unknown>,\n data?: Record<string, unknown>,\n): unknown {\n // Check params first (but not if it looks like a data path reference)\n if (params?.[fieldName] !== undefined) {\n const val = params[fieldName];\n // If the value looks like a path reference (contains dots), skip it\n if (typeof val !== \"string\" || !val.includes(\".\")) {\n return val;\n }\n }\n\n // Check param keys that end with the field name\n if (params) {\n for (const key of Object.keys(params)) {\n if (key.endsWith(`.${fieldName}`)) {\n const val = params[key];\n if (typeof val !== \"string\" || !val.includes(\".\")) {\n return val;\n }\n }\n }\n }\n\n // Check data keys that end with the field name (handles any form naming)\n if (data) {\n for (const key of Object.keys(data)) {\n if (key === fieldName || key.endsWith(`.${fieldName}`)) {\n return data[key];\n }\n }\n\n // Try getByPath with common prefixes\n const prefixes = [\"form\", \"newCustomer\", \"customer\", \"\"];\n for (const prefix of prefixes) {\n const path = prefix ? `${prefix}/${fieldName}` : fieldName;\n const val = getByPath(data, path);\n if (val !== undefined) {\n return val;\n }\n }\n }\n\n return undefined;\n}\n\n// =============================================================================\n// SpecStream - Streaming format for progressively building specs\n// =============================================================================\n\n/**\n * A SpecStream line - a single patch operation in the stream.\n */\nexport type SpecStreamLine = JsonPatch;\n\n/**\n * Parse a single SpecStream line into a patch operation.\n * Returns null if the line is invalid or empty.\n *\n * SpecStream is json-render's streaming format where each line is a JSON patch\n * operation that progressively builds up the final spec.\n */\nexport function parseSpecStreamLine(line: string): SpecStreamLine | null {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"{\")) return null;\n\n try {\n const patch = JSON.parse(trimmed) as SpecStreamLine;\n if (patch.op && patch.path !== undefined) {\n return patch;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply a single RFC 6902 JSON Patch operation to an object.\n * Mutates the object in place.\n *\n * Supports all six RFC 6902 operations: add, remove, replace, move, copy, test.\n *\n * @throws {Error} If a \"test\" operation fails (value mismatch).\n */\nexport function applySpecStreamPatch<T extends Record<string, unknown>>(\n obj: T,\n patch: SpecStreamLine,\n): T {\n switch (patch.op) {\n case \"add\":\n addByPath(obj, patch.path, patch.value);\n break;\n case \"replace\":\n // RFC 6902: target must exist. For streaming tolerance we set regardless.\n setByPath(obj, patch.path, patch.value);\n break;\n case \"remove\":\n removeByPath(obj, patch.path);\n break;\n case \"move\": {\n if (!patch.from) break;\n const moveValue = getByPath(obj, patch.from);\n removeByPath(obj, patch.from);\n addByPath(obj, patch.path, moveValue);\n break;\n }\n case \"copy\": {\n if (!patch.from) break;\n const copyValue = getByPath(obj, patch.from);\n addByPath(obj, patch.path, copyValue);\n break;\n }\n case \"test\": {\n const actual = getByPath(obj, patch.path);\n if (!deepEqual(actual, patch.value)) {\n throw new Error(\n `Test operation failed: value at \"${patch.path}\" does not match`,\n );\n }\n break;\n }\n }\n return obj;\n}\n\n/**\n * Compile a SpecStream string into a JSON object.\n * Each line should be a patch operation.\n *\n * @example\n * const stream = `{\"op\":\"add\",\"path\":\"/name\",\"value\":\"Alice\"}\n * {\"op\":\"add\",\"path\":\"/age\",\"value\":30}`;\n * const result = compileSpecStream(stream);\n * // { name: \"Alice\", age: 30 }\n */\nexport function compileSpecStream<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(stream: string, initial: T = {} as T): T {\n const lines = stream.split(\"\\n\");\n const result = { ...initial };\n\n for (const line of lines) {\n const patch = parseSpecStreamLine(line);\n if (patch) {\n applySpecStreamPatch(result, patch);\n }\n }\n\n return result as T;\n}\n\n/**\n * Streaming SpecStream compiler.\n * Useful for processing SpecStream data as it streams in from AI.\n *\n * @example\n * const compiler = createSpecStreamCompiler<MySpec>();\n *\n * // As chunks arrive:\n * const { result, newPatches } = compiler.push(chunk);\n * if (newPatches.length > 0) {\n * updateUI(result);\n * }\n *\n * // When done:\n * const finalResult = compiler.getResult();\n */\nexport interface SpecStreamCompiler<T> {\n /** Push a chunk of text. Returns the current result and any new patches applied. */\n push(chunk: string): { result: T; newPatches: SpecStreamLine[] };\n /** Get the current compiled result */\n getResult(): T;\n /** Get all patches that have been applied */\n getPatches(): SpecStreamLine[];\n /** Reset the compiler to initial state */\n reset(initial?: Partial<T>): void;\n}\n\n/**\n * Create a streaming SpecStream compiler.\n *\n * SpecStream is json-render's streaming format. AI outputs patch operations\n * line by line, and this compiler progressively builds the final spec.\n *\n * @example\n * const compiler = createSpecStreamCompiler<TimelineSpec>();\n *\n * // Process streaming response\n * const reader = response.body.getReader();\n * while (true) {\n * const { done, value } = await reader.read();\n * if (done) break;\n *\n * const { result, newPatches } = compiler.push(decoder.decode(value));\n * if (newPatches.length > 0) {\n * setSpec(result); // Update UI with partial result\n * }\n * }\n */\nexport function createSpecStreamCompiler<T = Record<string, unknown>>(\n initial: Partial<T> = {},\n): SpecStreamCompiler<T> {\n let result = { ...initial } as T;\n let buffer = \"\";\n const appliedPatches: SpecStreamLine[] = [];\n const processedLines = new Set<string>();\n\n return {\n push(chunk: string): { result: T; newPatches: SpecStreamLine[] } {\n buffer += chunk;\n const newPatches: SpecStreamLine[] = [];\n\n // Process complete lines\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || processedLines.has(trimmed)) continue;\n processedLines.add(trimmed);\n\n const patch = parseSpecStreamLine(trimmed);\n if (patch) {\n applySpecStreamPatch(result as Record<string, unknown>, patch);\n appliedPatches.push(patch);\n newPatches.push(patch);\n }\n }\n\n // Return a shallow copy to trigger re-renders\n if (newPatches.length > 0) {\n result = { ...result };\n }\n\n return { result, newPatches };\n },\n\n getResult(): T {\n // Process any remaining buffer\n if (buffer.trim()) {\n const patch = parseSpecStreamLine(buffer);\n if (patch && !processedLines.has(buffer.trim())) {\n processedLines.add(buffer.trim());\n applySpecStreamPatch(result as Record<string, unknown>, patch);\n appliedPatches.push(patch);\n result = { ...result };\n }\n buffer = \"\";\n }\n return result;\n },\n\n getPatches(): SpecStreamLine[] {\n return [...appliedPatches];\n },\n\n reset(newInitial: Partial<T> = {}): void {\n result = { ...newInitial } as T;\n buffer = \"\";\n appliedPatches.length = 0;\n processedLines.clear();\n },\n };\n}\n","import { z } from \"zod\";\nimport type {\n VisibilityCondition,\n LogicExpression,\n DataModel,\n AuthState,\n DynamicValue,\n} from \"./types\";\nimport { resolveDynamicValue, DynamicValueSchema } from \"./types\";\n\n// Dynamic value schema for comparisons (number-focused)\nconst DynamicNumberValueSchema = z.union([\n z.number(),\n z.object({ path: z.string() }),\n]);\n\n/**\n * Logic expression schema (recursive)\n * Using a more permissive schema that aligns with runtime behavior\n */\nexport const LogicExpressionSchema: z.ZodType<LogicExpression> = z.lazy(() =>\n z.union([\n z.object({ and: z.array(LogicExpressionSchema) }),\n z.object({ or: z.array(LogicExpressionSchema) }),\n z.object({ not: LogicExpressionSchema }),\n z.object({ path: z.string() }),\n z.object({ eq: z.tuple([DynamicValueSchema, DynamicValueSchema]) }),\n z.object({ neq: z.tuple([DynamicValueSchema, DynamicValueSchema]) }),\n z.object({\n gt: z.tuple([DynamicNumberValueSchema, DynamicNumberValueSchema]),\n }),\n z.object({\n gte: z.tuple([DynamicNumberValueSchema, DynamicNumberValueSchema]),\n }),\n z.object({\n lt: z.tuple([DynamicNumberValueSchema, DynamicNumberValueSchema]),\n }),\n z.object({\n lte: z.tuple([DynamicNumberValueSchema, DynamicNumberValueSchema]),\n }),\n ]),\n) as z.ZodType<LogicExpression>;\n\n/**\n * Visibility condition schema\n */\nexport const VisibilityConditionSchema: z.ZodType<VisibilityCondition> =\n z.union([\n z.boolean(),\n z.object({ path: z.string() }),\n z.object({ auth: z.enum([\"signedIn\", \"signedOut\"]) }),\n LogicExpressionSchema,\n ]);\n\n/**\n * Context for evaluating visibility\n */\nexport interface VisibilityContext {\n dataModel: DataModel;\n authState?: AuthState;\n}\n\n/**\n * Evaluate a logic expression against data and auth state\n */\nexport function evaluateLogicExpression(\n expr: LogicExpression,\n ctx: VisibilityContext,\n): boolean {\n const { dataModel } = ctx;\n\n // AND expression\n if (\"and\" in expr) {\n return expr.and.every((subExpr) => evaluateLogicExpression(subExpr, ctx));\n }\n\n // OR expression\n if (\"or\" in expr) {\n return expr.or.some((subExpr) => evaluateLogicExpression(subExpr, ctx));\n }\n\n // NOT expression\n if (\"not\" in expr) {\n return !evaluateLogicExpression(expr.not, ctx);\n }\n\n // Path expression (resolve to boolean)\n if (\"path\" in expr) {\n const value = resolveDynamicValue({ path: expr.path }, dataModel);\n return Boolean(value);\n }\n\n // Equality comparison\n if (\"eq\" in expr) {\n const [left, right] = expr.eq;\n const leftValue = resolveDynamicValue(left, dataModel);\n const rightValue = resolveDynamicValue(right, dataModel);\n return leftValue === rightValue;\n }\n\n // Not equal comparison\n if (\"neq\" in expr) {\n const [left, right] = expr.neq;\n const leftValue = resolveDynamicValue(left, dataModel);\n const rightValue = resolveDynamicValue(right, dataModel);\n return leftValue !== rightValue;\n }\n\n // Greater than\n if (\"gt\" in expr) {\n const [left, right] = expr.gt;\n const leftValue = resolveDynamicValue(\n left as DynamicValue<number>,\n dataModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n dataModel,\n );\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n return leftValue > rightValue;\n }\n return false;\n }\n\n // Greater than or equal\n if (\"gte\" in expr) {\n const [left, right] = expr.gte;\n const leftValue = resolveDynamicValue(\n left as DynamicValue<number>,\n dataModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n dataModel,\n );\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n return leftValue >= rightValue;\n }\n return false;\n }\n\n // Less than\n if (\"lt\" in expr) {\n const [left, right] = expr.lt;\n const leftValue = resolveDynamicValue(\n left as DynamicValue<number>,\n dataModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n dataModel,\n );\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n return leftValue < rightValue;\n }\n return false;\n }\n\n // Less than or equal\n if (\"lte\" in expr) {\n const [left, right] = expr.lte;\n const leftValue = resolveDynamicValue(\n left as DynamicValue<number>,\n dataModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n dataModel,\n );\n if (typeof leftValue === \"number\" && typeof rightValue === \"number\") {\n return leftValue <= rightValue;\n }\n return false;\n }\n\n return false;\n}\n\n/**\n * Evaluate a visibility condition\n */\nexport function evaluateVisibility(\n condition: VisibilityCondition | undefined,\n ctx: VisibilityContext,\n): boolean {\n // No condition = visible\n if (condition === undefined) {\n return true;\n }\n\n // Boolean literal\n if (typeof condition === \"boolean\") {\n return condition;\n }\n\n // Path reference\n if (\"path\" in condition && !(\"and\" in condition) && !(\"or\" in condition)) {\n const value = resolveDynamicValue({ path: condition.path }, ctx.dataModel);\n return Boolean(value);\n }\n\n // Auth condition\n if (\"auth\" in condition) {\n const isSignedIn = ctx.authState?.isSignedIn ?? false;\n if (condition.auth === \"signedIn\") {\n return isSignedIn;\n }\n if (condition.auth === \"signedOut\") {\n return !isSignedIn;\n }\n return false;\n }\n\n // Logic expression\n return evaluateLogicExpression(condition as LogicExpression, ctx);\n}\n\n/**\n * Helper to create visibility conditions\n */\nexport const visibility = {\n /** Always visible */\n always: true as const,\n\n /** Never visible */\n never: false as const,\n\n /** Visible when path is truthy */\n when: (path: string): VisibilityCondition => ({ path }),\n\n /** Visible when signed in */\n signedIn: { auth: \"signedIn\" } as const,\n\n /** Visible when signed out */\n signedOut: { auth: \"signedOut\" } as const,\n\n /** AND multiple conditions */\n and: (...conditions: LogicExpression[]): LogicExpression => ({\n and: conditions,\n }),\n\n /** OR multiple conditions */\n or: (...conditions: LogicExpression[]): LogicExpression => ({\n or: conditions,\n }),\n\n /** NOT a condition */\n not: (condition: LogicExpression): LogicExpression => ({ not: condition }),\n\n /** Equality check */\n eq: (left: DynamicValue, right: DynamicValue): LogicExpression => ({\n eq: [left, right],\n }),\n\n /** Not equal check */\n neq: (left: DynamicValue, right: DynamicValue): LogicExpression => ({\n neq: [left, right],\n }),\n\n /** Greater than */\n gt: (\n left: DynamicValue<number>,\n right: DynamicValue<number>,\n ): LogicExpression => ({ gt: [left, right] }),\n\n /** Greater than or equal */\n gte: (\n left: DynamicValue<number>,\n right: DynamicValue<number>,\n ): LogicExpression => ({ gte: [left, right] }),\n\n /** Less than */\n lt: (\n left: DynamicValue<number>,\n right: DynamicValue<number>,\n ): LogicExpression => ({ lt: [left, right] }),\n\n /** Less than or equal */\n lte: (\n left: DynamicValue<number>,\n right: DynamicValue<number>,\n ): LogicExpression => ({ lte: [left, right] }),\n};\n","import { z } from \"zod\";\nimport type { DynamicValue, DataModel } from \"./types\";\nimport { DynamicValueSchema, resolveDynamicValue } from \"./types\";\n\n/**\n * Confirmation dialog configuration\n */\nexport interface ActionConfirm {\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"danger\";\n}\n\n/**\n * Action success handler\n */\nexport type ActionOnSuccess =\n | { navigate: string }\n | { set: Record<string, unknown> }\n | { action: string };\n\n/**\n * Action error handler\n */\nexport type ActionOnError =\n | { set: Record<string, unknown> }\n | { action: string };\n\n/**\n * Rich action definition\n */\nexport interface Action {\n /** Action name (must be in catalog) */\n name: string;\n /** Parameters to pass to the action handler */\n params?: Record<string, DynamicValue>;\n /** Confirmation dialog before execution */\n confirm?: ActionConfirm;\n /** Handler after successful execution */\n onSuccess?: ActionOnSuccess;\n /** Handler after failed execution */\n onError?: ActionOnError;\n}\n\n/**\n * Schema for action confirmation\n */\nexport const ActionConfirmSchema = z.object({\n title: z.string(),\n message: z.string(),\n confirmLabel: z.string().optional(),\n cancelLabel: z.string().optional(),\n variant: z.enum([\"default\", \"danger\"]).optional(),\n});\n\n/**\n * Schema for success handlers\n */\nexport const ActionOnSuccessSchema = z.union([\n z.object({ navigate: z.string() }),\n z.object({ set: z.record(z.string(), z.unknown()) }),\n z.object({ action: z.string() }),\n]);\n\n/**\n * Schema for error handlers\n */\nexport const ActionOnErrorSchema = z.union([\n z.object({ set: z.record(z.string(), z.unknown()) }),\n z.object({ action: z.string() }),\n]);\n\n/**\n * Full action schema\n */\nexport const ActionSchema = z.object({\n name: z.string(),\n params: z.record(z.string(), DynamicValueSchema).optional(),\n confirm: ActionConfirmSchema.optional(),\n onSuccess: ActionOnSuccessSchema.optional(),\n onError: ActionOnErrorSchema.optional(),\n});\n\n/**\n * Action handler function signature\n */\nexport type ActionHandler<\n TParams = Record<string, unknown>,\n TResult = unknown,\n> = (params: TParams) => Promise<TResult> | TResult;\n\n/**\n * Action definition in catalog\n */\nexport interface ActionDefinition<TParams = Record<string, unknown>> {\n /** Zod schema for params validation */\n params?: z.ZodType<TParams>;\n /** Description for AI */\n description?: string;\n}\n\n/**\n * Resolved action with all dynamic values resolved\n */\nexport interface ResolvedAction {\n name: string;\n params: Record<string, unknown>;\n confirm?: ActionConfirm;\n onSuccess?: ActionOnSuccess;\n onError?: ActionOnError;\n}\n\n/**\n * Resolve all dynamic values in an action\n */\nexport function resolveAction(\n action: Action,\n dataModel: DataModel,\n): ResolvedAction {\n const resolvedParams: Record<string, unknown> = {};\n\n if (action.params) {\n for (const [key, value] of Object.entries(action.params)) {\n resolvedParams[key] = resolveDynamicValue(value, dataModel);\n }\n }\n\n // Interpolate confirmation message if present\n let confirm = action.confirm;\n if (confirm) {\n confirm = {\n ...confirm,\n message: interpolateString(confirm.message, dataModel),\n title: interpolateString(confirm.title, dataModel),\n };\n }\n\n return {\n name: action.name,\n params: resolvedParams,\n confirm,\n onSuccess: action.onSuccess,\n onError: action.onError,\n };\n}\n\n/**\n * Interpolate ${path} expressions in a string\n */\nexport function interpolateString(\n template: string,\n dataModel: DataModel,\n): string {\n return template.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n const value = resolveDynamicValue({ path }, dataModel);\n return String(value ?? \"\");\n });\n}\n\n/**\n * Context for action execution\n */\nexport interface ActionExecutionContext {\n /** The resolved action */\n action: ResolvedAction;\n /** The action handler from the host */\n handler: ActionHandler;\n /** Function to update data model */\n setData: (path: string, value: unknown) => void;\n /** Function to navigate */\n navigate?: (path: string) => void;\n /** Function to execute another action */\n executeAction?: (name: string) => Promise<void>;\n}\n\n/**\n * Execute an action with all callbacks\n */\nexport async function executeAction(\n ctx: ActionExecutionContext,\n): Promise<void> {\n const { action, handler, setData, navigate, executeAction } = ctx;\n\n try {\n await handler(action.params);\n\n // Handle success\n if (action.onSuccess) {\n if (\"navigate\" in action.onSuccess && navigate) {\n navigate(action.onSuccess.navigate);\n } else if (\"set\" in action.onSuccess) {\n for (const [path, value] of Object.entries(action.onSuccess.set)) {\n setData(path, value);\n }\n } else if (\"action\" in action.onSuccess && executeAction) {\n await executeAction(action.onSuccess.action);\n }\n }\n } catch (error) {\n // Handle error\n if (action.onError) {\n if (\"set\" in action.onError) {\n for (const [path, value] of Object.entries(action.onError.set)) {\n // Replace $error.message with actual error\n const resolvedValue =\n typeof value === \"string\" && value === \"$error.message\"\n ? (error as Error).message\n : value;\n setData(path, resolvedValue);\n }\n } else if (\"action\" in action.onError && executeAction) {\n await executeAction(action.onError.action);\n }\n } else {\n throw error;\n }\n }\n}\n\n/**\n * Helper to create actions\n */\nexport const action = {\n /** Create a simple action */\n simple: (name: string, params?: Record<string, DynamicValue>): Action => ({\n name,\n params,\n }),\n\n /** Create an action with confirmation */\n withConfirm: (\n name: string,\n confirm: ActionConfirm,\n params?: Record<string, DynamicValue>,\n ): Action => ({\n name,\n params,\n confirm,\n }),\n\n /** Create an action with success handler */\n withSuccess: (\n name: string,\n onSuccess: ActionOnSuccess,\n params?: Record<string, DynamicValue>,\n ): Action => ({\n name,\n params,\n onSuccess,\n }),\n};\n","import { z } from \"zod\";\nimport type { DynamicValue, DataModel, LogicExpression } from \"./types\";\nimport { DynamicValueSchema, resolveDynamicValue } from \"./types\";\nimport { LogicExpressionSchema, evaluateLogicExpression } from \"./visibility\";\n\n/**\n * Validation check definition\n */\nexport interface ValidationCheck {\n /** Function name (built-in or from catalog) */\n fn: string;\n /** Additional arguments for the function */\n args?: Record<string, DynamicValue>;\n /** Error message to display if check fails */\n message: string;\n}\n\n/**\n * Validation configuration for a field\n */\nexport interface ValidationConfig {\n /** Array of checks to run */\n checks?: ValidationCheck[];\n /** When to run validation */\n validateOn?: \"change\" | \"blur\" | \"submit\";\n /** Condition for when validation is enabled */\n enabled?: LogicExpression;\n}\n\n/**\n * Schema for validation check\n */\nexport const ValidationCheckSchema = z.object({\n fn: z.string(),\n args: z.record(z.string(), DynamicValueSchema).optional(),\n message: z.string(),\n});\n\n/**\n * Schema for validation config\n */\nexport const ValidationConfigSchema = z.object({\n checks: z.array(ValidationCheckSchema).optional(),\n validateOn: z.enum([\"change\", \"blur\", \"submit\"]).optional(),\n enabled: LogicExpressionSchema.optional(),\n});\n\n/**\n * Validation function signature\n */\nexport type ValidationFunction = (\n value: unknown,\n args?: Record<string, unknown>,\n) => boolean;\n\n/**\n * Validation function definition in catalog\n */\nexport interface ValidationFunctionDefinition {\n /** The validation function */\n validate: ValidationFunction;\n /** Description for AI */\n description?: string;\n}\n\n/**\n * Built-in validation functions\n */\nexport const builtInValidationFunctions: Record<string, ValidationFunction> = {\n /**\n * Check if value is not null, undefined, or empty string\n */\n required: (value: unknown) => {\n if (value === null || value === undefined) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n },\n\n /**\n * Check if value is a valid email address\n */\n email: (value: unknown) => {\n if (typeof value !== \"string\") return false;\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\n },\n\n /**\n * Check minimum string length\n */\n minLength: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"string\") return false;\n const min = args?.min;\n if (typeof min !== \"number\") return false;\n return value.length >= min;\n },\n\n /**\n * Check maximum string length\n */\n maxLength: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"string\") return false;\n const max = args?.max;\n if (typeof max !== \"number\") return false;\n return value.length <= max;\n },\n\n /**\n * Check if string matches a regex pattern\n */\n pattern: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"string\") return false;\n const pattern = args?.pattern;\n if (typeof pattern !== \"string\") return false;\n try {\n return new RegExp(pattern).test(value);\n } catch {\n return false;\n }\n },\n\n /**\n * Check minimum numeric value\n */\n min: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"number\") return false;\n const min = args?.min;\n if (typeof min !== \"number\") return false;\n return value >= min;\n },\n\n /**\n * Check maximum numeric value\n */\n max: (value: unknown, args?: Record<string, unknown>) => {\n if (typeof value !== \"number\") return false;\n const max = args?.max;\n if (typeof max !== \"number\") return false;\n return value <= max;\n },\n\n /**\n * Check if value is a number\n */\n numeric: (value: unknown) => {\n if (typeof value === \"number\") return !isNaN(value);\n if (typeof value === \"string\") return !isNaN(parseFloat(value));\n return false;\n },\n\n /**\n * Check if value is a valid URL\n */\n url: (value: unknown) => {\n if (typeof value !== \"string\") return false;\n try {\n new URL(value);\n return true;\n } catch {\n return false;\n }\n },\n\n /**\n * Check if value matches another field\n */\n matches: (value: unknown, args?: Record<string, unknown>) => {\n const other = args?.other;\n return value === other;\n },\n};\n\n/**\n * Validation result for a single check\n */\nexport interface ValidationCheckResult {\n fn: string;\n valid: boolean;\n message: string;\n}\n\n/**\n * Full validation result for a field\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n checks: ValidationCheckResult[];\n}\n\n/**\n * Context for running validation\n */\nexport interface ValidationContext {\n /** Current value to validate */\n value: unknown;\n /** Full data model for resolving paths */\n dataModel: DataModel;\n /** Custom validation functions from catalog */\n customFunctions?: Record<string, ValidationFunction>;\n}\n\n/**\n * Run a single validation check\n */\nexport function runValidationCheck(\n check: ValidationCheck,\n ctx: ValidationContext,\n): ValidationCheckResult {\n const { value, dataModel, customFunctions } = ctx;\n\n // Resolve args\n const resolvedArgs: Record<string, unknown> = {};\n if (check.args) {\n for (const [key, argValue] of Object.entries(check.args)) {\n resolvedArgs[key] = resolveDynamicValue(argValue, dataModel);\n }\n }\n\n // Find the validation function\n const fn =\n builtInValidationFunctions[check.fn] ?? customFunctions?.[check.fn];\n\n if (!fn) {\n console.warn(`Unknown validation function: ${check.fn}`);\n return {\n fn: check.fn,\n valid: true, // Don't fail on unknown functions\n message: check.message,\n };\n }\n\n const valid = fn(value, resolvedArgs);\n\n return {\n fn: check.fn,\n valid,\n message: check.message,\n };\n}\n\n/**\n * Run all validation checks for a field\n */\nexport function runValidation(\n config: ValidationConfig,\n ctx: ValidationContext & { authState?: { isSignedIn: boolean } },\n): ValidationResult {\n const checks: ValidationCheckResult[] = [];\n const errors: string[] = [];\n\n // Check if validation is enabled\n if (config.enabled) {\n const enabled = evaluateLogicExpression(config.enabled, {\n dataModel: ctx.dataModel,\n authState: ctx.authState,\n });\n if (!enabled) {\n return { valid: true, errors: [], checks: [] };\n }\n }\n\n // Run each check\n if (config.checks) {\n for (const check of config.checks) {\n const result = runValidationCheck(check, ctx);\n checks.push(result);\n if (!result.valid) {\n errors.push(result.message);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n checks,\n };\n}\n\n/**\n * Helper to create validation checks\n */\nexport const check = {\n required: (message = \"This field is required\"): ValidationCheck => ({\n fn: \"required\",\n message,\n }),\n\n email: (message = \"Invalid email address\"): ValidationCheck => ({\n fn: \"email\",\n message,\n }),\n\n minLength: (min: number, message?: string): ValidationCheck => ({\n fn: \"minLength\",\n args: { min },\n message: message ?? `Must be at least ${min} characters`,\n }),\n\n maxLength: (max: number, message?: string): ValidationCheck => ({\n fn: \"maxLength\",\n args: { max },\n message: message ?? `Must be at most ${max} characters`,\n }),\n\n pattern: (pattern: string, message = \"Invalid format\"): ValidationCheck => ({\n fn: \"pattern\",\n args: { pattern },\n message,\n }),\n\n min: (min: number, message?: string): ValidationCheck => ({\n fn: \"min\",\n args: { min },\n message: message ?? `Must be at least ${min}`,\n }),\n\n max: (max: number, message?: string): ValidationCheck => ({\n fn: \"max\",\n args: { max },\n message: message ?? `Must be at most ${max}`,\n }),\n\n url: (message = \"Invalid URL\"): ValidationCheck => ({\n fn: \"url\",\n message,\n }),\n\n matches: (\n otherPath: string,\n message = \"Fields must match\",\n ): ValidationCheck => ({\n fn: \"matches\",\n args: { other: { path: otherPath } },\n message,\n }),\n};\n","import { z } from \"zod\";\n\n/**\n * Schema builder primitives\n */\nexport interface SchemaBuilder {\n /** String type */\n string(): SchemaType<\"string\">;\n /** Number type */\n number(): SchemaType<\"number\">;\n /** Boolean type */\n boolean(): SchemaType<\"boolean\">;\n /** Array of type */\n array<T extends SchemaType>(item: T): SchemaType<\"array\", T>;\n /** Object with shape */\n object<T extends Record<string, SchemaType>>(\n shape: T,\n ): SchemaType<\"object\", T>;\n /** Record/map with value type */\n record<T extends SchemaType>(value: T): SchemaType<\"record\", T>;\n /** Any type */\n any(): SchemaType<\"any\">;\n /** Placeholder for user-provided Zod schema */\n zod(): SchemaType<\"zod\">;\n /** Reference to catalog key (e.g., 'catalog.components') */\n ref(path: string): SchemaType<\"ref\", string>;\n /** Props from referenced catalog entry */\n propsOf(path: string): SchemaType<\"propsOf\", string>;\n /** Map of named entries with shared shape */\n map<T extends Record<string, SchemaType>>(\n entryShape: T,\n ): SchemaType<\"map\", T>;\n /** Optional modifier */\n optional(): { optional: true };\n}\n\n/**\n * Schema type representation\n */\nexport interface SchemaType<TKind extends string = string, TInner = unknown> {\n kind: TKind;\n inner?: TInner;\n optional?: boolean;\n}\n\n/**\n * Schema definition shape\n */\nexport interface SchemaDefinition<\n TSpec extends SchemaType = SchemaType,\n TCatalog extends SchemaType = SchemaType,\n> {\n /** What the AI-generated spec looks like */\n spec: TSpec;\n /** What the catalog must provide */\n catalog: TCatalog;\n}\n\n/**\n * Schema instance with methods\n */\nexport interface Schema<TDef extends SchemaDefinition = SchemaDefinition> {\n /** The schema definition */\n readonly definition: TDef;\n /** Custom prompt template for this schema */\n readonly promptTemplate?: PromptTemplate;\n /** Create a catalog from this schema */\n createCatalog<TCatalog extends InferCatalogInput<TDef[\"catalog\"]>>(\n catalog: TCatalog,\n ): Catalog<TDef, TCatalog>;\n}\n\n/**\n * Catalog instance with methods\n */\nexport interface Catalog<\n TDef extends SchemaDefinition = SchemaDefinition,\n TCatalog = unknown,\n> {\n /** The schema this catalog is based on */\n readonly schema: Schema<TDef>;\n /** The catalog data */\n readonly data: TCatalog;\n /** Component names */\n readonly componentNames: string[];\n /** Action names */\n readonly actionNames: string[];\n /** Generate system prompt for AI */\n prompt(options?: PromptOptions): string;\n /** Export as JSON Schema for structured outputs */\n jsonSchema(): object;\n /** Validate a spec against this catalog */\n validate(spec: unknown): SpecValidationResult<InferSpec<TDef, TCatalog>>;\n /** Get the Zod schema for the spec */\n zodSchema(): z.ZodType<InferSpec<TDef, TCatalog>>;\n /** Type helper for the spec type */\n readonly _specType: InferSpec<TDef, TCatalog>;\n}\n\n/**\n * Prompt generation options\n */\nexport interface PromptOptions {\n /** Custom system message intro */\n system?: string;\n /** Additional rules to append */\n customRules?: string[];\n}\n\n/**\n * Context provided to prompt templates\n */\nexport interface PromptContext<TCatalog = unknown> {\n /** The catalog data */\n catalog: TCatalog;\n /** Component names from the catalog */\n componentNames: string[];\n /** Action names from the catalog (if any) */\n actionNames: string[];\n /** Prompt options provided by the user */\n options: PromptOptions;\n /** Helper to format a Zod type as a human-readable string */\n formatZodType: (schema: z.ZodType) => string;\n}\n\n/**\n * Prompt template function type\n */\nexport type PromptTemplate<TCatalog = unknown> = (\n context: PromptContext<TCatalog>,\n) => string;\n\n/**\n * Schema options\n */\nexport interface SchemaOptions<TCatalog = unknown> {\n /** Custom prompt template for this schema */\n promptTemplate?: PromptTemplate<TCatalog>;\n}\n\n/**\n * Spec validation result\n */\nexport interface SpecValidationResult<T> {\n success: boolean;\n data?: T;\n error?: z.ZodError;\n}\n\n// =============================================================================\n// Catalog Type Inference Helpers\n// =============================================================================\n\n/**\n * Extract the components map type from a catalog\n * @example type Components = InferCatalogComponents<typeof myCatalog>;\n */\nexport type InferCatalogComponents<C extends Catalog> =\n C extends Catalog<SchemaDefinition, infer TCatalog>\n ? TCatalog extends { components: infer Comps }\n ? Comps\n : never\n : never;\n\n/**\n * Extract the actions map type from a catalog\n * @example type Actions = InferCatalogActions<typeof myCatalog>;\n */\nexport type InferCatalogActions<C extends Catalog> =\n C extends Catalog<SchemaDefinition, infer TCatalog>\n ? TCatalog extends { actions: infer Acts }\n ? Acts\n : never\n : never;\n\n/**\n * Infer component props from a catalog by component name\n * @example type ButtonProps = InferComponentProps<typeof myCatalog, 'Button'>;\n */\nexport type InferComponentProps<\n C extends Catalog,\n K extends keyof InferCatalogComponents<C>,\n> = InferCatalogComponents<C>[K] extends { props: z.ZodType<infer P> }\n ? P\n : never;\n\n/**\n * Infer action params from a catalog by action name\n * @example type ViewCustomersParams = InferActionParams<typeof myCatalog, 'viewCustomers'>;\n */\nexport type InferActionParams<\n C extends Catalog,\n K extends keyof InferCatalogActions<C>,\n> = InferCatalogActions<C>[K] extends { params: z.ZodType<infer P> }\n ? P\n : never;\n\n// =============================================================================\n// Internal Type Inference Helpers\n// =============================================================================\n\nexport type InferCatalogInput<T> =\n T extends SchemaType<\"object\", infer Shape>\n ? { [K in keyof Shape]: InferCatalogField<Shape[K]> }\n : never;\n\ntype InferCatalogField<T> =\n T extends SchemaType<\"map\", infer EntryShape>\n ? Record<\n string,\n // Only 'props' is required, rest are optional\n InferMapEntryRequired<EntryShape> &\n Partial<InferMapEntryOptional<EntryShape>>\n >\n : T extends SchemaType<\"zod\">\n ? z.ZodType\n : T extends SchemaType<\"string\">\n ? string\n : T extends SchemaType<\"number\">\n ? number\n : T extends SchemaType<\"boolean\">\n ? boolean\n : T extends SchemaType<\"array\", infer Item>\n ? InferCatalogField<Item>[]\n : T extends SchemaType<\"object\", infer Shape>\n ? { [K in keyof Shape]: InferCatalogField<Shape[K]> }\n : unknown;\n\n// Extract required fields (props is always required)\ntype InferMapEntryRequired<T> = {\n [K in keyof T as K extends \"props\" ? K : never]: InferMapEntryField<T[K]>;\n};\n\n// Extract optional fields (everything except props)\ntype InferMapEntryOptional<T> = {\n [K in keyof T as K extends \"props\" ? never : K]: InferMapEntryField<T[K]>;\n};\n\ntype InferMapEntryField<T> =\n T extends SchemaType<\"zod\">\n ? z.ZodType\n : T extends SchemaType<\"string\">\n ? string\n : T extends SchemaType<\"number\">\n ? number\n : T extends SchemaType<\"boolean\">\n ? boolean\n : T extends SchemaType<\"array\", infer Item>\n ? InferMapEntryField<Item>[]\n : T extends SchemaType<\"object\", infer Shape>\n ? { [K in keyof Shape]: InferMapEntryField<Shape[K]> }\n : unknown;\n\n// Spec inference (simplified - will be expanded)\nexport type InferSpec<TDef extends SchemaDefinition, TCatalog> = TDef extends {\n spec: SchemaType<\"object\", infer Shape>;\n}\n ? InferSpecObject<Shape, TCatalog>\n : unknown;\n\ntype InferSpecObject<Shape, TCatalog> = {\n [K in keyof Shape]: InferSpecField<Shape[K], TCatalog>;\n};\n\ntype InferSpecField<T, TCatalog> =\n T extends SchemaType<\"string\">\n ? string\n : T extends SchemaType<\"number\">\n ? number\n : T extends SchemaType<\"boolean\">\n ? boolean\n : T extends SchemaType<\"array\", infer Item>\n ? InferSpecField<Item, TCatalog>[]\n : T extends SchemaType<\"object\", infer Shape>\n ? InferSpecObject<Shape, TCatalog>\n : T extends SchemaType<\"record\", infer Value>\n ? Record<string, InferSpecField<Value, TCatalog>>\n : T extends SchemaType<\"ref\", infer Path>\n ? InferRefType<Path, TCatalog>\n : T extends SchemaType<\"propsOf\", infer Path>\n ? InferPropsOfType<Path, TCatalog>\n : T extends SchemaType<\"any\">\n ? unknown\n : unknown;\n\ntype InferRefType<Path, TCatalog> = Path extends \"catalog.components\"\n ? TCatalog extends { components: infer C }\n ? keyof C\n : string\n : Path extends \"catalog.actions\"\n ? TCatalog extends { actions: infer A }\n ? keyof A\n : string\n : string;\n\ntype InferPropsOfType<Path, TCatalog> = Path extends \"catalog.components\"\n ? TCatalog extends { components: infer C }\n ? C extends Record<string, { props: z.ZodType<infer P> }>\n ? P\n : Record<string, unknown>\n : Record<string, unknown>\n : Record<string, unknown>;\n\n/**\n * Create the schema builder\n */\nfunction createBuilder(): SchemaBuilder {\n return {\n string: () => ({ kind: \"string\" }),\n number: () => ({ kind: \"number\" }),\n boolean: () => ({ kind: \"boolean\" }),\n array: (item) => ({ kind: \"array\", inner: item }),\n object: (shape) => ({ kind: \"object\", inner: shape }),\n record: (value) => ({ kind: \"record\", inner: value }),\n any: () => ({ kind: \"any\" }),\n zod: () => ({ kind: \"zod\" }),\n ref: (path) => ({ kind: \"ref\", inner: path }),\n propsOf: (path) => ({ kind: \"propsOf\", inner: path }),\n map: (entryShape) => ({ kind: \"map\", inner: entryShape }),\n optional: () => ({ optional: true }),\n };\n}\n\n/**\n * Define a schema using the builder pattern\n */\nexport function defineSchema<TDef extends SchemaDefinition>(\n builder: (s: SchemaBuilder) => TDef,\n options?: SchemaOptions,\n): Schema<TDef> {\n const s = createBuilder();\n const definition = builder(s);\n\n return {\n definition,\n promptTemplate: options?.promptTemplate,\n createCatalog<TCatalog extends InferCatalogInput<TDef[\"catalog\"]>>(\n catalog: TCatalog,\n ): Catalog<TDef, TCatalog> {\n return createCatalogFromSchema(this as Schema<TDef>, catalog);\n },\n };\n}\n\n/**\n * Create a catalog from a schema (internal)\n */\nfunction createCatalogFromSchema<TDef extends SchemaDefinition, TCatalog>(\n schema: Schema<TDef>,\n catalogData: TCatalog,\n): Catalog<TDef, TCatalog> {\n // Extract component and action names\n const components = (catalogData as Record<string, unknown>).components as\n | Record<string, unknown>\n | undefined;\n const actions = (catalogData as Record<string, unknown>).actions as\n | Record<string, unknown>\n | undefined;\n\n const componentNames = components ? Object.keys(components) : [];\n const actionNames = actions ? Object.keys(actions) : [];\n\n // Build the Zod schema for validation\n const zodSchema = buildZodSchemaFromDefinition(\n schema.definition,\n catalogData,\n );\n\n return {\n schema,\n data: catalogData,\n componentNames,\n actionNames,\n\n prompt(options: PromptOptions = {}): string {\n return generatePrompt(this, options);\n },\n\n jsonSchema(): object {\n return zodToJsonSchema(zodSchema);\n },\n\n validate(spec: unknown): SpecValidationResult<InferSpec<TDef, TCatalog>> {\n const result = zodSchema.safeParse(spec);\n if (result.success) {\n return {\n success: true,\n data: result.data as InferSpec<TDef, TCatalog>,\n };\n }\n return { success: false, error: result.error };\n },\n\n zodSchema(): z.ZodType<InferSpec<TDef, TCatalog>> {\n return zodSchema as z.ZodType<InferSpec<TDef, TCatalog>>;\n },\n\n get _specType(): InferSpec<TDef, TCatalog> {\n throw new Error(\"_specType is only for type inference\");\n },\n };\n}\n\n/**\n * Build Zod schema from schema definition\n */\nfunction buildZodSchemaFromDefinition(\n definition: SchemaDefinition,\n catalogData: unknown,\n): z.ZodType {\n return buildZodType(definition.spec, catalogData);\n}\n\nfunction buildZodType(schemaType: SchemaType, catalogData: unknown): z.ZodType {\n switch (schemaType.kind) {\n case \"string\":\n return z.string();\n case \"number\":\n return z.number();\n case \"boolean\":\n return z.boolean();\n case \"any\":\n return z.any();\n case \"array\": {\n const inner = buildZodType(schemaType.inner as SchemaType, catalogData);\n return z.array(inner);\n }\n case \"object\": {\n const shape = schemaType.inner as Record<string, SchemaType>;\n const zodShape: Record<string, z.ZodType> = {};\n for (const [key, value] of Object.entries(shape)) {\n let zodType = buildZodType(value, catalogData);\n if (value.optional) {\n zodType = zodType.optional();\n }\n zodShape[key] = zodType;\n }\n return z.object(zodShape);\n }\n case \"record\": {\n const inner = buildZodType(schemaType.inner as SchemaType, catalogData);\n return z.record(z.string(), inner);\n }\n case \"ref\": {\n // Reference to catalog key - create enum of valid keys\n const path = schemaType.inner as string;\n const keys = getKeysFromPath(path, catalogData);\n if (keys.length === 0) {\n return z.string();\n }\n if (keys.length === 1) {\n return z.literal(keys[0]!);\n }\n return z.enum(keys as [string, ...string[]]);\n }\n case \"propsOf\": {\n // Props from catalog entry - create union of all props schemas\n const path = schemaType.inner as string;\n const propsSchemas = getPropsFromPath(path, catalogData);\n if (propsSchemas.length === 0) {\n return z.record(z.string(), z.unknown());\n }\n if (propsSchemas.length === 1) {\n return propsSchemas[0]!;\n }\n // For propsOf, we need to be lenient since type determines which props apply\n return z.record(z.string(), z.unknown());\n }\n default:\n return z.unknown();\n }\n}\n\nfunction getKeysFromPath(path: string, catalogData: unknown): string[] {\n const parts = path.split(\".\");\n let current: unknown = { catalog: catalogData };\n for (const part of parts) {\n if (current && typeof current === \"object\") {\n current = (current as Record<string, unknown>)[part];\n } else {\n return [];\n }\n }\n if (current && typeof current === \"object\") {\n return Object.keys(current);\n }\n return [];\n}\n\nfunction getPropsFromPath(path: string, catalogData: unknown): z.ZodType[] {\n const parts = path.split(\".\");\n let current: unknown = { catalog: catalogData };\n for (const part of parts) {\n if (current && typeof current === \"object\") {\n current = (current as Record<string, unknown>)[part];\n } else {\n return [];\n }\n }\n if (current && typeof current === \"object\") {\n return Object.values(current as Record<string, { props?: z.ZodType }>)\n .map((entry) => entry.props)\n .filter((props): props is z.ZodType => props !== undefined);\n }\n return [];\n}\n\n/**\n * Generate system prompt from catalog\n */\nfunction generatePrompt<TDef extends SchemaDefinition, TCatalog>(\n catalog: Catalog<TDef, TCatalog>,\n options: PromptOptions,\n): string {\n // Check if schema has a custom prompt template\n if (catalog.schema.promptTemplate) {\n const context: PromptContext<TCatalog> = {\n catalog: catalog.data,\n componentNames: catalog.componentNames,\n actionNames: catalog.actionNames,\n options,\n formatZodType,\n };\n return catalog.schema.promptTemplate(context);\n }\n\n // Default JSONL element-tree format (for @json-render/react and similar)\n const {\n system = \"You are a UI generator that outputs JSON.\",\n customRules = [],\n } = options;\n\n const lines: string[] = [];\n lines.push(system);\n lines.push(\"\");\n\n // Output format section - explain JSONL streaming patch format\n lines.push(\"OUTPUT FORMAT:\");\n lines.push(\n \"Output JSONL (one JSON object per line) with patches to build a UI tree.\",\n );\n lines.push(\n \"Each line is a JSON patch operation. Start with the root, then add each element.\",\n );\n lines.push(\"\");\n lines.push(\"Example output (each line is a separate JSON object):\");\n lines.push(\"\");\n lines.push(`{\"op\":\"add\",\"path\":\"/root\",\"value\":\"card-1\"}\n{\"op\":\"add\",\"path\":\"/elements/card-1\",\"value\":{\"type\":\"Card\",\"props\":{\"title\":\"Dashboard\"},\"children\":[\"metric-1\",\"chart-1\"]}}\n{\"op\":\"add\",\"path\":\"/elements/metric-1\",\"value\":{\"type\":\"Metric\",\"props\":{\"label\":\"Revenue\",\"valuePath\":\"analytics.revenue\",\"format\":\"currency\"},\"children\":[]}}\n{\"op\":\"add\",\"path\":\"/elements/chart-1\",\"value\":{\"type\":\"Chart\",\"props\":{\"type\":\"bar\",\"dataPath\":\"analytics.salesByRegion\"},\"children\":[]}}`);\n lines.push(\"\");\n\n // Components section\n const components = (catalog.data as Record<string, unknown>).components as\n | Record<\n string,\n { props?: z.ZodType; description?: string; slots?: string[] }\n >\n | undefined;\n\n if (components) {\n lines.push(`AVAILABLE COMPONENTS (${catalog.componentNames.length}):`);\n lines.push(\"\");\n\n for (const [name, def] of Object.entries(components)) {\n const propsStr = def.props ? formatZodType(def.props) : \"{}\";\n const hasChildren = def.slots && def.slots.length > 0;\n const childrenStr = hasChildren ? \" [accepts children]\" : \"\";\n const descStr = def.description ? ` - ${def.description}` : \"\";\n lines.push(`- ${name}: ${propsStr}${descStr}${childrenStr}`);\n }\n lines.push(\"\");\n }\n\n // Actions section\n const actions = (catalog.data as Record<string, unknown>).actions as\n | Record<string, { params?: z.ZodType; description?: string }>\n | undefined;\n\n if (actions && catalog.actionNames.length > 0) {\n lines.push(\"AVAILABLE ACTIONS:\");\n lines.push(\"\");\n for (const [name, def] of Object.entries(actions)) {\n lines.push(`- ${name}${def.description ? `: ${def.description}` : \"\"}`);\n }\n lines.push(\"\");\n }\n\n // Rules\n lines.push(\"RULES:\");\n const baseRules = [\n \"Output ONLY JSONL patches - one JSON object per line, no markdown, no code fences\",\n 'First line sets root: {\"op\":\"add\",\"path\":\"/root\",\"value\":\"<root-key>\"}',\n 'Then add each element: {\"op\":\"add\",\"path\":\"/elements/<key>\",\"value\":{...}}',\n \"ONLY use components listed above\",\n \"Each element value needs: type, props, children (array of child keys)\",\n \"Use unique keys for the element map entries (e.g., 'header', 'metric-1', 'chart-revenue')\",\n ];\n const allRules = [...baseRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get Zod type name from schema (handles different Zod versions)\n */\nfunction getZodTypeName(schema: z.ZodType): string {\n if (!schema || !schema._def) return \"\";\n const def = schema._def as unknown as Record<string, unknown>;\n // Zod 4+ uses _def.type, older versions use _def.typeName\n return (def.typeName as string) ?? (def.type as string) ?? \"\";\n}\n\n/**\n * Format a Zod type into a human-readable string\n */\nfunction formatZodType(schema: z.ZodType): string {\n if (!schema || !schema._def) return \"unknown\";\n const def = schema._def as unknown as Record<string, unknown>;\n const typeName = getZodTypeName(schema);\n\n switch (typeName) {\n case \"ZodString\":\n case \"string\":\n return \"string\";\n case \"ZodNumber\":\n case \"number\":\n return \"number\";\n case \"ZodBoolean\":\n case \"boolean\":\n return \"boolean\";\n case \"ZodLiteral\":\n case \"literal\":\n return JSON.stringify(def.value);\n case \"ZodEnum\":\n case \"enum\": {\n // Zod 3 uses values array, Zod 4 uses entries object\n let values: string[];\n if (Array.isArray(def.values)) {\n values = def.values as string[];\n } else if (def.entries && typeof def.entries === \"object\") {\n values = Object.values(def.entries as Record<string, string>);\n } else {\n return \"enum\";\n }\n return values.map((v) => `\"${v}\"`).join(\" | \");\n }\n case \"ZodArray\":\n case \"array\": {\n const inner = (def.type as z.ZodType) ?? (def.element as z.ZodType);\n return inner ? `Array<${formatZodType(inner)}>` : \"Array<unknown>\";\n }\n case \"ZodObject\":\n case \"object\": {\n // Shape can be a function (Zod 3) or direct object (Zod 4)\n const shape =\n typeof def.shape === \"function\"\n ? (def.shape as () => Record<string, z.ZodType>)()\n : (def.shape as Record<string, z.ZodType>);\n if (!shape) return \"object\";\n const props = Object.entries(shape)\n .map(([key, value]) => {\n const innerTypeName = getZodTypeName(value);\n const isOptional =\n innerTypeName === \"ZodOptional\" ||\n innerTypeName === \"ZodNullable\" ||\n innerTypeName === \"optional\" ||\n innerTypeName === \"nullable\";\n return `${key}${isOptional ? \"?\" : \"\"}: ${formatZodType(value)}`;\n })\n .join(\", \");\n return `{ ${props} }`;\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\": {\n const inner = (def.innerType as z.ZodType) ?? (def.wrapped as z.ZodType);\n return inner ? formatZodType(inner) : \"unknown\";\n }\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as z.ZodType[] | undefined;\n return options\n ? options.map((opt) => formatZodType(opt)).join(\" | \")\n : \"unknown\";\n }\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Convert Zod schema to JSON Schema\n */\nfunction zodToJsonSchema(schema: z.ZodType): object {\n // Simplified JSON Schema conversion\n const def = schema._def as unknown as Record<string, unknown>;\n const typeName = (def.typeName as string) ?? \"\";\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodLiteral\":\n return { const: def.value };\n case \"ZodEnum\":\n return { enum: def.values };\n case \"ZodArray\": {\n const inner = def.type as z.ZodType | undefined;\n return {\n type: \"array\",\n items: inner ? zodToJsonSchema(inner) : {},\n };\n }\n case \"ZodObject\": {\n const shape = (def.shape as () => Record<string, z.ZodType>)?.();\n if (!shape) return { type: \"object\" };\n const properties: Record<string, object> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value);\n const innerDef = value._def as unknown as Record<string, unknown>;\n if (\n innerDef.typeName !== \"ZodOptional\" &&\n innerDef.typeName !== \"ZodNullable\"\n ) {\n required.push(key);\n }\n }\n return {\n type: \"object\",\n properties,\n required: required.length > 0 ? required : undefined,\n additionalProperties: false,\n };\n }\n case \"ZodRecord\": {\n const valueType = def.valueType as z.ZodType | undefined;\n return {\n type: \"object\",\n additionalProperties: valueType ? zodToJsonSchema(valueType) : true,\n };\n }\n case \"ZodOptional\":\n case \"ZodNullable\": {\n const inner = def.innerType as z.ZodType | undefined;\n return inner ? zodToJsonSchema(inner) : {};\n }\n case \"ZodUnion\": {\n const options = def.options as z.ZodType[] | undefined;\n return options ? { anyOf: options.map(zodToJsonSchema) } : {};\n }\n case \"ZodAny\":\n return {};\n default:\n return {};\n }\n}\n\n/**\n * Shorthand: Define a catalog directly from a schema\n */\nexport function defineCatalog<\n TDef extends SchemaDefinition,\n TCatalog extends InferCatalogInput<TDef[\"catalog\"]>,\n>(schema: Schema<TDef>, catalog: TCatalog): Catalog<TDef, TCatalog> {\n return schema.createCatalog(catalog);\n}\n","import { z } from \"zod\";\nimport type {\n ComponentSchema,\n ValidationMode,\n UIElement,\n Spec,\n VisibilityCondition,\n} from \"./types\";\nimport { VisibilityConditionSchema } from \"./visibility\";\nimport { ActionSchema, type ActionDefinition } from \"./actions\";\nimport { ValidationConfigSchema, type ValidationFunction } from \"./validation\";\n\n/**\n * Component definition with visibility and validation support\n */\nexport interface ComponentDefinition<\n TProps extends ComponentSchema = ComponentSchema,\n> {\n /** Zod schema for component props */\n props: TProps;\n /** Whether this component can have children */\n hasChildren?: boolean;\n /** Description for AI generation */\n description?: string;\n}\n\n/**\n * Catalog configuration\n */\nexport interface CatalogConfig<\n TComponents extends Record<string, ComponentDefinition> = Record<\n string,\n ComponentDefinition\n >,\n TActions extends Record<string, ActionDefinition> = Record<\n string,\n ActionDefinition\n >,\n TFunctions extends Record<string, ValidationFunction> = Record<\n string,\n ValidationFunction\n >,\n> {\n /** Catalog name */\n name?: string;\n /** Component definitions */\n components: TComponents;\n /** Action definitions with param schemas */\n actions?: TActions;\n /** Custom validation functions */\n functions?: TFunctions;\n /** Validation mode */\n validation?: ValidationMode;\n}\n\n/**\n * Catalog instance\n */\nexport interface Catalog<\n TComponents extends Record<string, ComponentDefinition> = Record<\n string,\n ComponentDefinition\n >,\n TActions extends Record<string, ActionDefinition> = Record<\n string,\n ActionDefinition\n >,\n TFunctions extends Record<string, ValidationFunction> = Record<\n string,\n ValidationFunction\n >,\n> {\n /** Catalog name */\n readonly name: string;\n /** Component names */\n readonly componentNames: (keyof TComponents)[];\n /** Action names */\n readonly actionNames: (keyof TActions)[];\n /** Function names */\n readonly functionNames: (keyof TFunctions)[];\n /** Validation mode */\n readonly validation: ValidationMode;\n /** Component definitions */\n readonly components: TComponents;\n /** Action definitions */\n readonly actions: TActions;\n /** Custom validation functions */\n readonly functions: TFunctions;\n /** Full element schema for AI generation */\n readonly elementSchema: z.ZodType<UIElement>;\n /** Full UI spec schema */\n readonly specSchema: z.ZodType<Spec>;\n /** Check if component exists */\n hasComponent(type: string): boolean;\n /** Check if action exists */\n hasAction(name: string): boolean;\n /** Check if function exists */\n hasFunction(name: string): boolean;\n /** Validate an element */\n validateElement(element: unknown): {\n success: boolean;\n data?: UIElement;\n error?: z.ZodError;\n };\n /** Validate a UI spec */\n validateSpec(spec: unknown): {\n success: boolean;\n data?: Spec;\n error?: z.ZodError;\n };\n}\n\n/**\n * Create a v2 catalog with visibility, actions, and validation support\n */\nexport function createCatalog<\n TComponents extends Record<string, ComponentDefinition>,\n TActions extends Record<string, ActionDefinition> = Record<\n string,\n ActionDefinition\n >,\n TFunctions extends Record<string, ValidationFunction> = Record<\n string,\n ValidationFunction\n >,\n>(\n config: CatalogConfig<TComponents, TActions, TFunctions>,\n): Catalog<TComponents, TActions, TFunctions> {\n const {\n name = \"unnamed\",\n components,\n actions = {} as TActions,\n functions = {} as TFunctions,\n validation = \"strict\",\n } = config;\n\n const componentNames = Object.keys(components) as (keyof TComponents)[];\n const actionNames = Object.keys(actions) as (keyof TActions)[];\n const functionNames = Object.keys(functions) as (keyof TFunctions)[];\n\n // Create element schema for each component type\n const componentSchemas = componentNames.map((componentName) => {\n const def = components[componentName]!;\n\n return z.object({\n type: z.literal(componentName as string),\n props: def.props,\n children: z.array(z.string()).optional(),\n visible: VisibilityConditionSchema.optional(),\n });\n });\n\n // Create union schema for all components\n let elementSchema: z.ZodType<UIElement>;\n\n if (componentSchemas.length === 0) {\n elementSchema = z.object({\n type: z.string(),\n props: z.record(z.string(), z.unknown()),\n children: z.array(z.string()).optional(),\n visible: VisibilityConditionSchema.optional(),\n }) as unknown as z.ZodType<UIElement>;\n } else if (componentSchemas.length === 1) {\n elementSchema = componentSchemas[0] as unknown as z.ZodType<UIElement>;\n } else {\n elementSchema = z.discriminatedUnion(\"type\", [\n componentSchemas[0] as z.ZodObject<any>,\n componentSchemas[1] as z.ZodObject<any>,\n ...(componentSchemas.slice(2) as z.ZodObject<any>[]),\n ]) as unknown as z.ZodType<UIElement>;\n }\n\n // Create spec schema\n const specSchema = z.object({\n root: z.string(),\n elements: z.record(z.string(), elementSchema),\n }) as unknown as z.ZodType<Spec>;\n\n return {\n name,\n componentNames,\n actionNames,\n functionNames,\n validation,\n components,\n actions,\n functions,\n elementSchema,\n specSchema,\n\n hasComponent(type: string) {\n return type in components;\n },\n\n hasAction(name: string) {\n return name in actions;\n },\n\n hasFunction(name: string) {\n return name in functions;\n },\n\n validateElement(element: unknown) {\n const result = elementSchema.safeParse(element);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n },\n\n validateSpec(spec: unknown) {\n const result = specSchema.safeParse(spec);\n if (result.success) {\n return { success: true, data: result.data };\n }\n return { success: false, error: result.error };\n },\n };\n}\n\n/**\n * Generate a prompt for AI that describes the catalog\n */\nexport function generateCatalogPrompt<\n TComponents extends Record<string, ComponentDefinition>,\n TActions extends Record<string, ActionDefinition>,\n TFunctions extends Record<string, ValidationFunction>,\n>(catalog: Catalog<TComponents, TActions, TFunctions>): string {\n const lines: string[] = [\n `# ${catalog.name} Component Catalog`,\n \"\",\n \"## Available Components\",\n \"\",\n ];\n\n // Components\n for (const name of catalog.componentNames) {\n const def = catalog.components[name]!;\n lines.push(`### ${String(name)}`);\n if (def.description) {\n lines.push(def.description);\n }\n lines.push(\"\");\n }\n\n // Actions\n if (catalog.actionNames.length > 0) {\n lines.push(\"## Available Actions\");\n lines.push(\"\");\n for (const name of catalog.actionNames) {\n const def = catalog.actions[name]!;\n lines.push(\n `- \\`${String(name)}\\`${def.description ? `: ${def.description}` : \"\"}`,\n );\n }\n lines.push(\"\");\n }\n\n // Visibility\n lines.push(\"## Visibility Conditions\");\n lines.push(\"\");\n lines.push(\"Components can have a `visible` property:\");\n lines.push(\"- `true` / `false` - Always visible/hidden\");\n lines.push('- `{ \"path\": \"/data/path\" }` - Visible when path is truthy');\n lines.push('- `{ \"auth\": \"signedIn\" }` - Visible when user is signed in');\n lines.push('- `{ \"and\": [...] }` - All conditions must be true');\n lines.push('- `{ \"or\": [...] }` - Any condition must be true');\n lines.push('- `{ \"not\": {...} }` - Negates a condition');\n lines.push('- `{ \"eq\": [a, b] }` - Equality check');\n lines.push(\"\");\n\n // Validation\n lines.push(\"## Validation Functions\");\n lines.push(\"\");\n lines.push(\n \"Built-in: `required`, `email`, `minLength`, `maxLength`, `pattern`, `min`, `max`, `url`\",\n );\n if (catalog.functionNames.length > 0) {\n lines.push(`Custom: ${catalog.functionNames.map(String).join(\", \")}`);\n }\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Type helper to infer component props from catalog\n */\nexport type InferCatalogComponentProps<\n C extends Catalog<Record<string, ComponentDefinition>>,\n> = {\n [K in keyof C[\"components\"]]: z.infer<C[\"components\"][K][\"props\"]>;\n};\n\n/**\n * Internal Zod definition type for introspection\n */\ninterface ZodDefInternal {\n typeName?: string;\n value?: unknown;\n values?: unknown;\n type?: z.ZodTypeAny;\n shape?: () => Record<string, z.ZodTypeAny>;\n innerType?: z.ZodTypeAny;\n options?: z.ZodTypeAny[];\n}\n\n/**\n * Format a Zod type into a human-readable string for prompts\n */\nfunction formatZodType(schema: z.ZodTypeAny, isOptional = false): string {\n const def = schema._def as unknown as ZodDefInternal;\n const typeName = def.typeName ?? \"\";\n\n let result: string;\n\n switch (typeName) {\n case \"ZodString\":\n result = \"string\";\n break;\n case \"ZodNumber\":\n result = \"number\";\n break;\n case \"ZodBoolean\":\n result = \"boolean\";\n break;\n case \"ZodLiteral\":\n result = JSON.stringify(def.value);\n break;\n case \"ZodEnum\":\n result = (def.values as string[]).map((v) => `\"${v}\"`).join(\"|\");\n break;\n case \"ZodNativeEnum\":\n result = Object.values(def.values as Record<string, string>)\n .map((v) => `\"${v}\"`)\n .join(\"|\");\n break;\n case \"ZodArray\":\n result = def.type\n ? `Array<${formatZodType(def.type)}>`\n : \"Array<unknown>\";\n break;\n case \"ZodObject\": {\n if (!def.shape) {\n result = \"object\";\n break;\n }\n const shape = def.shape();\n const props = Object.entries(shape)\n .map(([key, value]) => {\n const innerDef = value._def as unknown as ZodDefInternal;\n const innerOptional =\n innerDef.typeName === \"ZodOptional\" ||\n innerDef.typeName === \"ZodNullable\";\n return `${key}${innerOptional ? \"?\" : \"\"}: ${formatZodType(value)}`;\n })\n .join(\", \");\n result = `{ ${props} }`;\n break;\n }\n case \"ZodOptional\":\n return def.innerType ? formatZodType(def.innerType, true) : \"unknown?\";\n case \"ZodNullable\":\n return def.innerType ? formatZodType(def.innerType, true) : \"unknown?\";\n case \"ZodDefault\":\n return def.innerType\n ? formatZodType(def.innerType, isOptional)\n : \"unknown\";\n case \"ZodUnion\":\n result = def.options\n ? def.options.map((opt) => formatZodType(opt)).join(\"|\")\n : \"unknown\";\n break;\n case \"ZodNull\":\n result = \"null\";\n break;\n case \"ZodUndefined\":\n result = \"undefined\";\n break;\n case \"ZodAny\":\n result = \"any\";\n break;\n case \"ZodUnknown\":\n result = \"unknown\";\n break;\n default:\n result = \"unknown\";\n }\n\n return isOptional ? `${result}?` : result;\n}\n\n/**\n * Extract props from a Zod object schema as formatted entries\n */\nfunction extractPropsFromSchema(\n schema: z.ZodTypeAny,\n): Array<{ name: string; type: string; optional: boolean }> {\n const def = schema._def as unknown as ZodDefInternal;\n const typeName = def.typeName ?? \"\";\n\n if (typeName !== \"ZodObject\" || !def.shape) {\n return [];\n }\n\n const shape = def.shape();\n return Object.entries(shape).map(([name, value]) => {\n const innerDef = value._def as unknown as ZodDefInternal;\n const optional =\n innerDef.typeName === \"ZodOptional\" ||\n innerDef.typeName === \"ZodNullable\";\n return {\n name,\n type: formatZodType(value),\n optional,\n };\n });\n}\n\n/**\n * Format component props as a compact object notation\n */\nfunction formatPropsCompact(\n props: Array<{ name: string; type: string; optional: boolean }>,\n): string {\n if (props.length === 0) return \"{}\";\n const entries = props.map(\n (p) => `${p.name}${p.optional ? \"?\" : \"\"}: ${p.type}`,\n );\n return `{ ${entries.join(\", \")} }`;\n}\n\n/**\n * Options for generating system prompts\n */\nexport interface SystemPromptOptions {\n /** System message intro (replaces default) */\n system?: string;\n /** Additional rules to append to the rules section */\n customRules?: string[];\n}\n\n/**\n * Generate a complete system prompt for AI that can generate UI from a catalog.\n * This produces a ready-to-use prompt that stays in sync with the catalog definition.\n */\nexport function generateSystemPrompt<\n TComponents extends Record<string, ComponentDefinition>,\n TActions extends Record<string, ActionDefinition>,\n TFunctions extends Record<string, ValidationFunction>,\n>(\n catalog: Catalog<TComponents, TActions, TFunctions>,\n options: SystemPromptOptions = {},\n): string {\n const {\n system = \"You are a UI generator that outputs JSONL (JSON Lines) patches.\",\n customRules = [],\n } = options;\n\n const lines: string[] = [];\n\n // System intro\n lines.push(system);\n lines.push(\"\");\n\n // Components section\n const componentCount = catalog.componentNames.length;\n lines.push(`AVAILABLE COMPONENTS (${componentCount}):`);\n lines.push(\"\");\n\n for (const name of catalog.componentNames) {\n const def = catalog.components[name]!;\n const props = extractPropsFromSchema(def.props);\n const propsStr = formatPropsCompact(props);\n const hasChildrenStr = def.hasChildren ? \" Has children.\" : \"\";\n const descStr = def.description ? ` ${def.description}` : \"\";\n\n lines.push(`- ${String(name)}: ${propsStr}${descStr}${hasChildrenStr}`);\n }\n lines.push(\"\");\n\n // Actions section\n if (catalog.actionNames.length > 0) {\n lines.push(\"AVAILABLE ACTIONS:\");\n lines.push(\"\");\n for (const name of catalog.actionNames) {\n const def = catalog.actions[name]!;\n lines.push(\n `- ${String(name)}${def.description ? `: ${def.description}` : \"\"}`,\n );\n }\n lines.push(\"\");\n }\n\n // Output format\n lines.push(\"OUTPUT FORMAT (JSONL, RFC 6902 JSON Patch):\");\n lines.push('{\"op\":\"add\",\"path\":\"/root\",\"value\":\"element-key\"}');\n lines.push(\n '{\"op\":\"add\",\"path\":\"/elements/key\",\"value\":{\"type\":\"...\",\"props\":{...},\"children\":[...]}}',\n );\n lines.push('{\"op\":\"remove\",\"path\":\"/elements/key\"}');\n lines.push(\"\");\n\n // Rules\n lines.push(\"RULES:\");\n const baseRules = [\n 'First line sets /root to root element key: {\"op\":\"add\",\"path\":\"/root\",\"value\":\"<key>\"}',\n 'Add elements with /elements/{key}: {\"op\":\"add\",\"path\":\"/elements/<key>\",\"value\":{...}}',\n \"Remove elements with op:remove - also update the parent's children array to exclude the removed key\",\n \"Children array contains string keys, not objects\",\n \"Parent first, then children\",\n \"Each element needs: type, props\",\n \"ONLY use props listed above - never invent new props\",\n ];\n const allRules = [...baseRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n lines.push(\"\");\n\n // Custom validation functions (only if catalog has them)\n if (catalog.functionNames.length > 0) {\n lines.push(\"CUSTOM VALIDATION FUNCTIONS:\");\n lines.push(catalog.functionNames.map(String).join(\", \"));\n lines.push(\"\");\n }\n\n // End with prompt\n lines.push(\"Generate JSONL:\");\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["z","z","z","z","action","executeAction","z","z","check","z","z","z","name","formatZodType"]}
|