@json-render/core 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +159 -19
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +159 -19
- 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/props.ts","../src/actions.ts","../src/validation.ts","../src/spec-validator.ts","../src/schema.ts","../src/prompt.ts","../src/catalog.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { ActionBinding } from \"./actions\";\n\n/**\n * Dynamic value - can be a literal or a path reference to state 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 /** Event bindings — maps event names to action bindings */\n on?: Record<string, ActionBinding | ActionBinding[]>;\n /** Repeat children once per item in a state array */\n repeat?: { path: string; key?: string };\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 /** Optional initial state to seed the state model.\n * Components using statePath will read from / write to this state. */\n state?: Record<string, unknown>;\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 * State model type\n */\nexport type StateModel = 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 state model\n */\nexport function resolveDynamicValue<T>(\n value: DynamicValue<T>,\n stateModel: StateModel,\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(stateModel, 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 StateModel,\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 stateModel: StateModel;\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 { stateModel } = 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 }, stateModel);\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, stateModel);\n const rightValue = resolveDynamicValue(right, stateModel);\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, stateModel);\n const rightValue = resolveDynamicValue(right, stateModel);\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 stateModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n stateModel,\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 stateModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n stateModel,\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 stateModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n stateModel,\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 stateModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n stateModel,\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.stateModel);\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 type { VisibilityCondition, StateModel, AuthState } from \"./types\";\nimport { getByPath } from \"./types\";\nimport { evaluateVisibility, type VisibilityContext } from \"./visibility\";\n\n// =============================================================================\n// Prop Expression Types\n// =============================================================================\n\n/**\n * A prop expression that resolves to a value based on state.\n *\n * - `{ $path: string }` reads a value from the state model\n * - `{ $cond, $then, $else }` conditionally picks a value\n * - Any other value is a literal (passthrough)\n */\nexport type PropExpression<T = unknown> =\n | T\n | { $path: string }\n | {\n $cond: VisibilityCondition;\n $then: PropExpression<T>;\n $else: PropExpression<T>;\n };\n\n/**\n * Check if a value is a $path expression\n */\nfunction isPathExpression(value: unknown): value is { $path: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"$path\" in value &&\n typeof (value as Record<string, unknown>).$path === \"string\"\n );\n}\n\n/**\n * Check if a value is a $cond expression\n */\nfunction isCondExpression(\n value: unknown,\n): value is { $cond: VisibilityCondition; $then: unknown; $else: unknown } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"$cond\" in value &&\n \"$then\" in value &&\n \"$else\" in value\n );\n}\n\n// =============================================================================\n// Prop Expression Resolution\n// =============================================================================\n\n/**\n * Resolve a single prop value that may contain expressions.\n * Recursively resolves $path and $cond/$then/$else expressions.\n */\nexport function resolvePropValue(\n value: unknown,\n ctx: VisibilityContext,\n): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n // $path: read from state model\n if (isPathExpression(value)) {\n return getByPath(ctx.stateModel, value.$path);\n }\n\n // $cond/$then/$else: evaluate condition and pick branch\n if (isCondExpression(value)) {\n const result = evaluateVisibility(value.$cond, ctx);\n return resolvePropValue(result ? value.$then : value.$else, ctx);\n }\n\n // Arrays: resolve each element\n if (Array.isArray(value)) {\n return value.map((item) => resolvePropValue(item, ctx));\n }\n\n // Plain objects (not expressions): resolve each value recursively\n if (typeof value === \"object\") {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = resolvePropValue(val, ctx);\n }\n return resolved;\n }\n\n // Primitive literal: passthrough\n return value;\n}\n\n/**\n * Resolve all prop values in an element's props object.\n * Returns a new props object with all expressions resolved.\n */\nexport function resolveElementProps(\n props: Record<string, unknown>,\n ctx: VisibilityContext,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n resolved[key] = resolvePropValue(value, ctx);\n }\n return resolved;\n}\n","import { z } from \"zod\";\nimport type { DynamicValue, StateModel } 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 * Action binding — maps an event to an action invocation.\n *\n * Used inside the `on` field of a UIElement:\n * ```json\n * { \"on\": { \"press\": { \"action\": \"setState\", \"params\": { \"path\": \"/x\", \"value\": 1 } } } }\n * ```\n */\nexport interface ActionBinding {\n /** Action name (must be in catalog) */\n action: 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 * @deprecated Use ActionBinding instead\n */\nexport type Action = ActionBinding;\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 binding schema\n */\nexport const ActionBindingSchema = z.object({\n action: 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 * @deprecated Use ActionBindingSchema instead\n */\nexport const ActionSchema = ActionBindingSchema;\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 action: 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 binding\n */\nexport function resolveAction(\n binding: ActionBinding,\n stateModel: StateModel,\n): ResolvedAction {\n const resolvedParams: Record<string, unknown> = {};\n\n if (binding.params) {\n for (const [key, value] of Object.entries(binding.params)) {\n resolvedParams[key] = resolveDynamicValue(value, stateModel);\n }\n }\n\n // Interpolate confirmation message if present\n let confirm = binding.confirm;\n if (confirm) {\n confirm = {\n ...confirm,\n message: interpolateString(confirm.message, stateModel),\n title: interpolateString(confirm.title, stateModel),\n };\n }\n\n return {\n action: binding.action,\n params: resolvedParams,\n confirm,\n onSuccess: binding.onSuccess,\n onError: binding.onError,\n };\n}\n\n/**\n * Interpolate ${path} expressions in a string\n */\nexport function interpolateString(\n template: string,\n stateModel: StateModel,\n): string {\n return template.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n const value = resolveDynamicValue({ path }, stateModel);\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 state model */\n setState: (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, setState, 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 setState(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 setState(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 action bindings\n */\nexport const actionBinding = {\n /** Create a simple action binding */\n simple: (\n actionName: string,\n params?: Record<string, DynamicValue>,\n ): ActionBinding => ({\n action: actionName,\n params,\n }),\n\n /** Create an action binding with confirmation */\n withConfirm: (\n actionName: string,\n confirm: ActionConfirm,\n params?: Record<string, DynamicValue>,\n ): ActionBinding => ({\n action: actionName,\n params,\n confirm,\n }),\n\n /** Create an action binding with success handler */\n withSuccess: (\n actionName: string,\n onSuccess: ActionOnSuccess,\n params?: Record<string, DynamicValue>,\n ): ActionBinding => ({\n action: actionName,\n params,\n onSuccess,\n }),\n};\n\n/**\n * @deprecated Use actionBinding instead\n */\nexport const action = actionBinding;\n","import { z } from \"zod\";\nimport type { DynamicValue, StateModel, 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 stateModel: StateModel;\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, stateModel, 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, stateModel);\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 stateModel: ctx.stateModel,\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 type { Spec, UIElement } from \"./types\";\n\n// =============================================================================\n// Spec Structural Validation\n// =============================================================================\n\n/**\n * Severity level for validation issues.\n */\nexport type SpecIssueSeverity = \"error\" | \"warning\";\n\n/**\n * A single validation issue found in a spec.\n */\nexport interface SpecIssue {\n /** Severity: errors should be fixed, warnings are informational */\n severity: SpecIssueSeverity;\n /** Human-readable description of the issue */\n message: string;\n /** The element key where the issue was found (if applicable) */\n elementKey?: string;\n /** Machine-readable issue code for programmatic handling */\n code:\n | \"missing_root\"\n | \"root_not_found\"\n | \"missing_child\"\n | \"visible_in_props\"\n | \"orphaned_element\"\n | \"empty_spec\"\n | \"on_in_props\"\n | \"repeat_in_props\";\n}\n\n/**\n * Result of spec structural validation.\n */\nexport interface SpecValidationIssues {\n /** Whether the spec passed validation (no errors; warnings are OK) */\n valid: boolean;\n /** List of issues found */\n issues: SpecIssue[];\n}\n\n/**\n * Options for validateSpec.\n */\nexport interface ValidateSpecOptions {\n /**\n * Whether to check for orphaned elements (elements not reachable from root).\n * Defaults to false since orphans are harmless (just unused).\n */\n checkOrphans?: boolean;\n}\n\n/**\n * Validate a spec for structural integrity.\n *\n * Checks for common AI-generation errors:\n * - Missing or empty root\n * - Root element not found in elements map\n * - Children referencing non-existent elements\n * - `visible` placed inside `props` instead of on the element\n * - Orphaned elements (optional)\n *\n * @example\n * ```ts\n * const result = validateSpec(spec);\n * if (!result.valid) {\n * console.log(\"Spec errors:\", result.issues);\n * }\n * ```\n */\nexport function validateSpec(\n spec: Spec,\n options: ValidateSpecOptions = {},\n): SpecValidationIssues {\n const { checkOrphans = false } = options;\n const issues: SpecIssue[] = [];\n\n // 1. Check root\n if (!spec.root) {\n issues.push({\n severity: \"error\",\n message: \"Spec has no root element defined.\",\n code: \"missing_root\",\n });\n return { valid: false, issues };\n }\n\n if (!spec.elements[spec.root]) {\n issues.push({\n severity: \"error\",\n message: `Root element \"${spec.root}\" not found in elements map.`,\n code: \"root_not_found\",\n });\n }\n\n // 2. Check for empty spec\n if (Object.keys(spec.elements).length === 0) {\n issues.push({\n severity: \"error\",\n message: \"Spec has no elements.\",\n code: \"empty_spec\",\n });\n return { valid: false, issues };\n }\n\n // 3. Check each element\n for (const [key, element] of Object.entries(spec.elements)) {\n // 3a. Missing children\n if (element.children) {\n for (const childKey of element.children) {\n if (!spec.elements[childKey]) {\n issues.push({\n severity: \"error\",\n message: `Element \"${key}\" references child \"${childKey}\" which does not exist in the elements map.`,\n elementKey: key,\n code: \"missing_child\",\n });\n }\n }\n }\n\n // 3b. `visible` inside props\n const props = element.props as Record<string, unknown> | undefined;\n if (props && \"visible\" in props && props.visible !== undefined) {\n issues.push({\n severity: \"error\",\n message: `Element \"${key}\" has \"visible\" inside \"props\". It should be a top-level field on the element (sibling of type/props/children).`,\n elementKey: key,\n code: \"visible_in_props\",\n });\n }\n\n // 3c. `on` inside props (should be a top-level field)\n if (props && \"on\" in props && props.on !== undefined) {\n issues.push({\n severity: \"error\",\n message: `Element \"${key}\" has \"on\" inside \"props\". It should be a top-level field on the element (sibling of type/props/children).`,\n elementKey: key,\n code: \"on_in_props\",\n });\n }\n\n // 3d. `repeat` inside props (should be a top-level field)\n if (props && \"repeat\" in props && props.repeat !== undefined) {\n issues.push({\n severity: \"error\",\n message: `Element \"${key}\" has \"repeat\" inside \"props\". It should be a top-level field on the element (sibling of type/props/children).`,\n elementKey: key,\n code: \"repeat_in_props\",\n });\n }\n }\n\n // 4. Orphaned elements (optional)\n if (checkOrphans) {\n const reachable = new Set<string>();\n const walk = (key: string) => {\n if (reachable.has(key)) return;\n reachable.add(key);\n const el = spec.elements[key];\n if (el?.children) {\n for (const childKey of el.children) {\n if (spec.elements[childKey]) {\n walk(childKey);\n }\n }\n }\n };\n if (spec.elements[spec.root]) {\n walk(spec.root);\n }\n\n for (const key of Object.keys(spec.elements)) {\n if (!reachable.has(key)) {\n issues.push({\n severity: \"warning\",\n message: `Element \"${key}\" is not reachable from root \"${spec.root}\".`,\n elementKey: key,\n code: \"orphaned_element\",\n });\n }\n }\n }\n\n const hasErrors = issues.some((i) => i.severity === \"error\");\n return { valid: !hasErrors, issues };\n}\n\n/**\n * Auto-fix common spec issues in-place and return a corrected copy.\n *\n * Currently fixes:\n * - `visible` inside `props` → moved to element level\n * - `on` inside `props` → moved to element level\n * - `repeat` inside `props` → moved to element level\n *\n * Returns the fixed spec and a list of fixes applied.\n */\nexport function autoFixSpec(spec: Spec): {\n spec: Spec;\n fixes: string[];\n} {\n const fixes: string[] = [];\n const fixedElements: Record<string, UIElement> = {};\n\n for (const [key, element] of Object.entries(spec.elements)) {\n const props = element.props as Record<string, unknown> | undefined;\n let fixed = element;\n\n if (props && \"visible\" in props && props.visible !== undefined) {\n // Move visible from props to element level\n const { visible, ...restProps } = fixed.props as Record<string, unknown>;\n fixed = {\n ...fixed,\n props: restProps,\n visible: visible as UIElement[\"visible\"],\n };\n fixes.push(`Moved \"visible\" from props to element level on \"${key}\".`);\n }\n\n let currentProps = fixed.props as Record<string, unknown> | undefined;\n if (currentProps && \"on\" in currentProps && currentProps.on !== undefined) {\n // Move on from props to element level\n const { on, ...restProps } = currentProps;\n fixed = {\n ...fixed,\n props: restProps,\n on: on as UIElement[\"on\"],\n };\n fixes.push(`Moved \"on\" from props to element level on \"${key}\".`);\n }\n\n currentProps = fixed.props as Record<string, unknown> | undefined;\n if (\n currentProps &&\n \"repeat\" in currentProps &&\n currentProps.repeat !== undefined\n ) {\n // Move repeat from props to element level\n const { repeat, ...restProps } = currentProps;\n fixed = {\n ...fixed,\n props: restProps,\n repeat: repeat as UIElement[\"repeat\"],\n };\n fixes.push(`Moved \"repeat\" from props to element level on \"${key}\".`);\n }\n\n fixedElements[key] = fixed;\n }\n\n return {\n spec: { root: spec.root, elements: fixedElements },\n fixes,\n };\n}\n\n/**\n * Format validation issues into a human-readable string suitable for\n * inclusion in a repair prompt sent back to the AI.\n */\nexport function formatSpecIssues(issues: SpecIssue[]): string {\n const errors = issues.filter((i) => i.severity === \"error\");\n if (errors.length === 0) return \"\";\n\n const lines = [\"The generated UI spec has the following errors:\"];\n for (const issue of errors) {\n lines.push(`- ${issue.message}`);\n }\n return lines.join(\"\\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 /** Default rules baked into the schema (injected before customRules) */\n readonly defaultRules?: string[];\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 /** Default rules baked into the schema (injected before customRules in prompts) */\n defaultRules?: string[];\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 defaultRules: options?.defaultRules,\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 /root, then stream /elements and /state patches interleaved so the UI fills in progressively as it streams.\",\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\":\"blog\"}\n{\"op\":\"add\",\"path\":\"/elements/blog\",\"value\":{\"type\":\"Stack\",\"props\":{\"direction\":\"vertical\",\"gap\":\"md\"},\"children\":[\"heading\",\"posts-grid\"]}}\n{\"op\":\"add\",\"path\":\"/elements/heading\",\"value\":{\"type\":\"Heading\",\"props\":{\"text\":\"Blog\",\"level\":\"h1\"},\"children\":[]}}\n{\"op\":\"add\",\"path\":\"/elements/posts-grid\",\"value\":{\"type\":\"Grid\",\"props\":{\"columns\":2,\"gap\":\"md\"},\"repeat\":{\"path\":\"/posts\",\"key\":\"id\"},\"children\":[\"post-card\"]}}\n{\"op\":\"add\",\"path\":\"/elements/post-card\",\"value\":{\"type\":\"Card\",\"props\":{\"title\":{\"$path\":\"$item/title\"}},\"children\":[\"post-meta\"]}}\n{\"op\":\"add\",\"path\":\"/elements/post-meta\",\"value\":{\"type\":\"Text\",\"props\":{\"text\":{\"$path\":\"$item/author\"},\"variant\":\"muted\"},\"children\":[]}}\n{\"op\":\"add\",\"path\":\"/state/posts\",\"value\":[]}\n{\"op\":\"add\",\"path\":\"/state/posts/0\",\"value\":{\"id\":\"1\",\"title\":\"Getting Started\",\"author\":\"Jane\",\"date\":\"Jan 15\"}}\n{\"op\":\"add\",\"path\":\"/state/posts/1\",\"value\":{\"id\":\"2\",\"title\":\"Advanced Tips\",\"author\":\"Bob\",\"date\":\"Feb 3\"}}\n\nNote: state patches appear right after the elements that use them, so the UI fills in as it streams.`);\n lines.push(\"\");\n\n // Initial state section\n lines.push(\"INITIAL STATE:\");\n lines.push(\n \"Specs include a /state field to seed the state model. Components with statePath read from and write to this state, and $path expressions read from it.\",\n );\n lines.push(\n \"CRITICAL: You MUST include state patches whenever your UI displays data via $path expressions, uses repeat to iterate over arrays, or uses statePath bindings. Without state, $path references resolve to nothing and repeat lists render zero items.\",\n );\n lines.push(\n \"Output state patches right after the elements that reference them, so the UI fills in progressively as it streams.\",\n );\n lines.push(\n \"Stream state progressively - output one patch per array item instead of one giant blob:\",\n );\n lines.push(\n ' For arrays: {\"op\":\"add\",\"path\":\"/state/posts/0\",\"value\":{\"id\":\"1\",\"title\":\"First Post\",...}} then /state/posts/1, /state/posts/2, etc.',\n );\n lines.push(\n ' For scalars: {\"op\":\"add\",\"path\":\"/state/newTodoText\",\"value\":\"\"}',\n );\n lines.push(\n ' Initialize the array first if needed: {\"op\":\"add\",\"path\":\"/state/posts\",\"value\":[]}',\n );\n lines.push(\n 'When content comes from the state model, use { \"$path\": \"/some/path\" } dynamic props to display it instead of hardcoding the same value in both state and props. The state model is the single source of truth.',\n );\n lines.push(\n \"Include realistic sample data in state. For blogs: 3-4 posts with titles, excerpts, authors, dates. For product lists: 3-5 items with names, prices, descriptions. Never leave arrays empty.\",\n );\n lines.push(\"\");\n lines.push(\"DYNAMIC LISTS (repeat field):\");\n lines.push(\n 'Any element can have a top-level \"repeat\" field to render its children once per item in a state array: { \"repeat\": { \"path\": \"/arrayPath\", \"key\": \"id\" } }.',\n );\n lines.push(\n 'The element itself renders once (as the container), and its children are expanded once per array item. \"path\" is the state array path. \"key\" is an optional field name on each item for stable React keys.',\n );\n lines.push(\n 'Example: { \"type\": \"Column\", \"props\": { \"gap\": 8 }, \"repeat\": { \"path\": \"/todos\", \"key\": \"id\" }, \"children\": [\"todo-item\"] }',\n );\n lines.push(\n 'Inside children of a repeated element, use \"$item/field\" for per-item paths: statePath:\"$item/completed\", { \"$path\": \"$item/title\" }. Use \"$index\" for the current array index.',\n );\n lines.push(\n \"ALWAYS use the repeat field for lists backed by state arrays. NEVER hardcode individual elements for each array item.\",\n );\n lines.push(\n 'IMPORTANT: \"repeat\" is a top-level field on the element (sibling of type/props/children), NOT inside props.',\n );\n lines.push(\"\");\n lines.push(\"ARRAY STATE ACTIONS:\");\n lines.push(\n 'Use action \"pushState\" to append items to arrays. Params: { path: \"/arrayPath\", value: { ...item }, clearPath: \"/inputPath\" }.',\n );\n lines.push(\n 'Values inside pushState can contain { \"path\": \"/statePath\" } references to read current state (e.g. the text from an input field).',\n );\n lines.push(\n 'Use \"$id\" inside a pushState value to auto-generate a unique ID.',\n );\n lines.push(\n 'Example: on: { \"press\": { \"action\": \"pushState\", \"params\": { \"path\": \"/todos\", \"value\": { \"id\": \"$id\", \"title\": { \"path\": \"/newTodoText\" }, \"completed\": false }, \"clearPath\": \"/newTodoText\" } } }',\n );\n lines.push(\n 'Use action \"removeState\" to remove items from arrays by index. Params: { path: \"/arrayPath\", index: N }. Inside a repeated element\\'s children, use \"$index\" for the current item index.',\n );\n lines.push(\n \"For lists where users can add/remove items (todos, carts, etc.), use pushState and removeState instead of hardcoding with setState.\",\n );\n lines.push(\"\");\n lines.push(\n 'IMPORTANT: State paths use RFC 6901 JSON Pointer syntax (e.g. \"/todos/0/title\"). Do NOT use JavaScript-style dot notation (e.g. \"/todos.length\" is WRONG). To generate unique IDs for new items, use \"$id\" instead of trying to read array length.',\n );\n lines.push(\"\");\n\n // Components section\n const components = (catalog.data as Record<string, unknown>).components as\n | Record<\n string,\n {\n props?: z.ZodType;\n description?: string;\n slots?: string[];\n events?: string[];\n }\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 eventsStr =\n def.events && def.events.length > 0\n ? ` [events: ${def.events.join(\", \")}]`\n : \"\";\n const descStr = def.description ? ` - ${def.description}` : \"\";\n lines.push(`- ${name}: ${propsStr}${descStr}${childrenStr}${eventsStr}`);\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 // Events section\n lines.push(\"EVENTS (the `on` field):\");\n lines.push(\n \"Elements can have an optional `on` field to bind events to actions. The `on` field is a top-level field on the element (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\n 'Each key in `on` is an event name (from the component\\'s supported events), and the value is an action binding: `{ \"action\": \"<actionName>\", \"params\": { ... } }`.',\n );\n lines.push(\"\");\n lines.push(\"Example:\");\n lines.push(\n ' {\"type\":\"Button\",\"props\":{\"label\":\"Save\"},\"on\":{\"press\":{\"action\":\"setState\",\"params\":{\"path\":\"/saved\",\"value\":true}}},\"children\":[]}',\n );\n lines.push(\"\");\n lines.push(\n 'Action params can use dynamic path references to read from state: { \"path\": \"/statePath\" }.',\n );\n lines.push(\n \"IMPORTANT: Do NOT put action/actionParams inside props. Always use the `on` field for event bindings.\",\n );\n lines.push(\"\");\n\n // Visibility conditions\n lines.push(\"VISIBILITY CONDITIONS:\");\n lines.push(\n \"Elements can have an optional `visible` field to conditionally show/hide based on data state. IMPORTANT: `visible` is a top-level field on the element object (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\n 'Correct: {\"type\":\"Column\",\"props\":{\"gap\":8},\"visible\":{\"eq\":[{\"path\":\"/tab\"},\"home\"]},\"children\":[...]}',\n );\n lines.push(\n '- `{ \"eq\": [{ \"path\": \"/statePath\" }, \"value\"] }` - visible when state at path equals value',\n );\n lines.push(\n '- `{ \"neq\": [{ \"path\": \"/statePath\" }, \"value\"] }` - visible when state at path does not equal value',\n );\n lines.push('- `{ \"path\": \"/statePath\" }` - visible when path is truthy');\n lines.push(\n '- `{ \"and\": [...] }`, `{ \"or\": [...] }`, `{ \"not\": {...} }` - combine conditions',\n );\n lines.push(\"- `true` / `false` - always visible/hidden\");\n lines.push(\"\");\n lines.push(\n \"Use the Pressable component with on.press bound to setState to update state and drive visibility.\",\n );\n lines.push(\n 'Example: A Pressable with on: { \"press\": { \"action\": \"setState\", \"params\": { \"path\": \"/activeTab\", \"value\": \"home\" } } } sets state, then a container with visible: { \"eq\": [{ \"path\": \"/activeTab\" }, \"home\"] } shows only when that tab is active.',\n );\n lines.push(\"\");\n\n // Dynamic prop expressions\n lines.push(\"DYNAMIC PROPS:\");\n lines.push(\n \"Any prop value can be a dynamic expression that resolves based on state. Two forms are supported:\",\n );\n lines.push(\"\");\n lines.push(\n '1. State binding: `{ \"$path\": \"/statePath\" }` - resolves to the value at that state path.',\n );\n lines.push(\n ' Example: `\"color\": { \"$path\": \"/theme/primary\" }` reads the color from state.',\n );\n lines.push(\"\");\n lines.push(\n '2. Conditional: `{ \"$cond\": <condition>, \"$then\": <value>, \"$else\": <value> }` - evaluates the condition (same syntax as visibility conditions) and picks the matching value.',\n );\n lines.push(\n ' Example: `\"color\": { \"$cond\": { \"eq\": [{ \"path\": \"/activeTab\" }, \"home\"] }, \"$then\": \"#007AFF\", \"$else\": \"#8E8E93\" }`',\n );\n lines.push(\n ' Example: `\"name\": { \"$cond\": { \"eq\": [{ \"path\": \"/activeTab\" }, \"home\"] }, \"$then\": \"home\", \"$else\": \"home-outline\" }`',\n );\n lines.push(\"\");\n lines.push(\n \"Use dynamic props instead of duplicating elements with opposing visible conditions when only prop values differ.\",\n );\n lines.push(\"\");\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 set root: {\"op\":\"add\",\"path\":\"/root\",\"value\":\"<root-key>\"}',\n 'Then add each element: {\"op\":\"add\",\"path\":\"/elements/<key>\",\"value\":{...}}',\n \"Output /state patches right after the elements that use them, one per array item for progressive loading. REQUIRED whenever using $path, repeat, or statePath.\",\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 schemaRules = catalog.schema.defaultRules ?? [];\n const allRules = [...baseRules, ...schemaRules, ...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 type { Spec } from \"./types\";\n\n/**\n * Options for building a user prompt.\n */\nexport interface UserPromptOptions {\n /** The user's text prompt */\n prompt: string;\n /** Existing spec to refine (triggers patch-only mode) */\n currentSpec?: Spec | null;\n /** Runtime state context to include */\n state?: Record<string, unknown> | null;\n /** Maximum length for the user's text prompt (applied before wrapping) */\n maxPromptLength?: number;\n}\n\n/**\n * Check whether a spec is non-empty (has a root and at least one element).\n */\nfunction isNonEmptySpec(spec: unknown): spec is Spec {\n if (!spec || typeof spec !== \"object\") return false;\n const s = spec as Record<string, unknown>;\n return (\n typeof s.root === \"string\" &&\n typeof s.elements === \"object\" &&\n s.elements !== null &&\n Object.keys(s.elements as object).length > 0\n );\n}\n\nconst PATCH_INSTRUCTIONS = `IMPORTANT: The current UI is already loaded. Output ONLY the patches needed to make the requested change:\n- To add a new element: {\"op\":\"add\",\"path\":\"/elements/new-key\",\"value\":{...}}\n- To modify an existing element: {\"op\":\"replace\",\"path\":\"/elements/existing-key\",\"value\":{...}}\n- To remove an element: {\"op\":\"remove\",\"path\":\"/elements/old-key\"}\n- To update the root: {\"op\":\"replace\",\"path\":\"/root\",\"value\":\"new-root-key\"}\n- To add children: update the parent element with new children array\n\nDO NOT output patches for elements that don't need to change. Only output what's necessary for the requested modification.`;\n\n/**\n * Build a user prompt for AI generation.\n *\n * Handles common patterns that every consuming app needs:\n * - Truncating the user's prompt to a max length\n * - Including the current spec for refinement (patch-only mode)\n * - Including runtime state context\n *\n * @example\n * ```ts\n * // Fresh generation\n * buildUserPrompt({ prompt: \"create a todo app\" })\n *\n * // Refinement with existing spec\n * buildUserPrompt({ prompt: \"add a dark mode toggle\", currentSpec: spec })\n *\n * // With state context\n * buildUserPrompt({ prompt: \"show my data\", state: { todos: [] } })\n * ```\n */\nexport function buildUserPrompt(options: UserPromptOptions): string {\n const { prompt, currentSpec, state, maxPromptLength } = options;\n\n // Sanitize and optionally truncate the user's text\n let userText = String(prompt || \"\");\n if (maxPromptLength !== undefined && maxPromptLength > 0) {\n userText = userText.slice(0, maxPromptLength);\n }\n\n // --- Refinement mode: currentSpec is provided ---\n if (isNonEmptySpec(currentSpec)) {\n const parts: string[] = [];\n\n parts.push(\n `CURRENT UI STATE (already loaded, DO NOT recreate existing elements):`,\n );\n parts.push(JSON.stringify(currentSpec, null, 2));\n parts.push(\"\");\n parts.push(`USER REQUEST: ${userText}`);\n\n // Append state context if provided\n if (state && Object.keys(state).length > 0) {\n parts.push(\"\");\n parts.push(`AVAILABLE STATE:\\n${JSON.stringify(state, null, 2)}`);\n }\n\n parts.push(\"\");\n parts.push(PATCH_INSTRUCTIONS);\n\n return parts.join(\"\\n\");\n }\n\n // --- Fresh generation mode ---\n const parts: string[] = [userText];\n\n if (state && Object.keys(state).length > 0) {\n parts.push(`\\nAVAILABLE STATE:\\n${JSON.stringify(state, null, 2)}`);\n }\n\n parts.push(\n `\\nRemember: Output /root first, then interleave /elements and /state patches so the UI fills in progressively as it streams. Output each state patch right after the elements that use it, one per array item.`,\n );\n\n return parts.join(\"\\n\");\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\": \"/state/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","parts","z","z","name","formatZodType"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/visibility.ts","../src/props.ts","../src/actions.ts","../src/validation.ts","../src/spec-validator.ts","../src/schema.ts","../src/prompt.ts","../src/catalog.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { ActionBinding } from \"./actions\";\n\n/**\n * Dynamic value - can be a literal or a path reference to state 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 /** Event bindings — maps event names to action bindings */\n on?: Record<string, ActionBinding | ActionBinding[]>;\n /** Repeat children once per item in a state array */\n repeat?: { path: string; key?: string };\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 /** Optional initial state to seed the state model.\n * Components using statePath will read from / write to this state. */\n state?: Record<string, unknown>;\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 * State model type\n */\nexport type StateModel = 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 state model\n */\nexport function resolveDynamicValue<T>(\n value: DynamicValue<T>,\n stateModel: StateModel,\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(stateModel, 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 StateModel,\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 stateModel: StateModel;\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 { stateModel } = 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 }, stateModel);\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, stateModel);\n const rightValue = resolveDynamicValue(right, stateModel);\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, stateModel);\n const rightValue = resolveDynamicValue(right, stateModel);\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 stateModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n stateModel,\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 stateModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n stateModel,\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 stateModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n stateModel,\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 stateModel,\n );\n const rightValue = resolveDynamicValue(\n right as DynamicValue<number>,\n stateModel,\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.stateModel);\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 type { VisibilityCondition, StateModel, AuthState } from \"./types\";\nimport { getByPath } from \"./types\";\nimport { evaluateVisibility, type VisibilityContext } from \"./visibility\";\n\n// =============================================================================\n// Prop Expression Types\n// =============================================================================\n\n/**\n * A prop expression that resolves to a value based on state.\n *\n * - `{ $path: string }` reads a value from the state model\n * - `{ $cond, $then, $else }` conditionally picks a value\n * - Any other value is a literal (passthrough)\n */\nexport type PropExpression<T = unknown> =\n | T\n | { $path: string }\n | {\n $cond: VisibilityCondition;\n $then: PropExpression<T>;\n $else: PropExpression<T>;\n };\n\n/**\n * Check if a value is a $path expression\n */\nfunction isPathExpression(value: unknown): value is { $path: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"$path\" in value &&\n typeof (value as Record<string, unknown>).$path === \"string\"\n );\n}\n\n/**\n * Check if a value is a $cond expression\n */\nfunction isCondExpression(\n value: unknown,\n): value is { $cond: VisibilityCondition; $then: unknown; $else: unknown } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"$cond\" in value &&\n \"$then\" in value &&\n \"$else\" in value\n );\n}\n\n// =============================================================================\n// Prop Expression Resolution\n// =============================================================================\n\n/**\n * Resolve a single prop value that may contain expressions.\n * Recursively resolves $path and $cond/$then/$else expressions.\n */\nexport function resolvePropValue(\n value: unknown,\n ctx: VisibilityContext,\n): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n // $path: read from state model\n if (isPathExpression(value)) {\n return getByPath(ctx.stateModel, value.$path);\n }\n\n // $cond/$then/$else: evaluate condition and pick branch\n if (isCondExpression(value)) {\n const result = evaluateVisibility(value.$cond, ctx);\n return resolvePropValue(result ? value.$then : value.$else, ctx);\n }\n\n // Arrays: resolve each element\n if (Array.isArray(value)) {\n return value.map((item) => resolvePropValue(item, ctx));\n }\n\n // Plain objects (not expressions): resolve each value recursively\n if (typeof value === \"object\") {\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n resolved[key] = resolvePropValue(val, ctx);\n }\n return resolved;\n }\n\n // Primitive literal: passthrough\n return value;\n}\n\n/**\n * Resolve all prop values in an element's props object.\n * Returns a new props object with all expressions resolved.\n */\nexport function resolveElementProps(\n props: Record<string, unknown>,\n ctx: VisibilityContext,\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n resolved[key] = resolvePropValue(value, ctx);\n }\n return resolved;\n}\n","import { z } from \"zod\";\nimport type { DynamicValue, StateModel } 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 * Action binding — maps an event to an action invocation.\n *\n * Used inside the `on` field of a UIElement:\n * ```json\n * { \"on\": { \"press\": { \"action\": \"setState\", \"params\": { \"path\": \"/x\", \"value\": 1 } } } }\n * ```\n */\nexport interface ActionBinding {\n /** Action name (must be in catalog) */\n action: 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 * @deprecated Use ActionBinding instead\n */\nexport type Action = ActionBinding;\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 binding schema\n */\nexport const ActionBindingSchema = z.object({\n action: 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 * @deprecated Use ActionBindingSchema instead\n */\nexport const ActionSchema = ActionBindingSchema;\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 action: 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 binding\n */\nexport function resolveAction(\n binding: ActionBinding,\n stateModel: StateModel,\n): ResolvedAction {\n const resolvedParams: Record<string, unknown> = {};\n\n if (binding.params) {\n for (const [key, value] of Object.entries(binding.params)) {\n resolvedParams[key] = resolveDynamicValue(value, stateModel);\n }\n }\n\n // Interpolate confirmation message if present\n let confirm = binding.confirm;\n if (confirm) {\n confirm = {\n ...confirm,\n message: interpolateString(confirm.message, stateModel),\n title: interpolateString(confirm.title, stateModel),\n };\n }\n\n return {\n action: binding.action,\n params: resolvedParams,\n confirm,\n onSuccess: binding.onSuccess,\n onError: binding.onError,\n };\n}\n\n/**\n * Interpolate ${path} expressions in a string\n */\nexport function interpolateString(\n template: string,\n stateModel: StateModel,\n): string {\n return template.replace(/\\$\\{([^}]+)\\}/g, (_, path) => {\n const value = resolveDynamicValue({ path }, stateModel);\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 state model */\n setState: (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, setState, 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 setState(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 setState(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 action bindings\n */\nexport const actionBinding = {\n /** Create a simple action binding */\n simple: (\n actionName: string,\n params?: Record<string, DynamicValue>,\n ): ActionBinding => ({\n action: actionName,\n params,\n }),\n\n /** Create an action binding with confirmation */\n withConfirm: (\n actionName: string,\n confirm: ActionConfirm,\n params?: Record<string, DynamicValue>,\n ): ActionBinding => ({\n action: actionName,\n params,\n confirm,\n }),\n\n /** Create an action binding with success handler */\n withSuccess: (\n actionName: string,\n onSuccess: ActionOnSuccess,\n params?: Record<string, DynamicValue>,\n ): ActionBinding => ({\n action: actionName,\n params,\n onSuccess,\n }),\n};\n\n/**\n * @deprecated Use actionBinding instead\n */\nexport const action = actionBinding;\n","import { z } from \"zod\";\nimport type { DynamicValue, StateModel, 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 stateModel: StateModel;\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, stateModel, 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, stateModel);\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 stateModel: ctx.stateModel,\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 type { Spec, UIElement } from \"./types\";\n\n// =============================================================================\n// Spec Structural Validation\n// =============================================================================\n\n/**\n * Severity level for validation issues.\n */\nexport type SpecIssueSeverity = \"error\" | \"warning\";\n\n/**\n * A single validation issue found in a spec.\n */\nexport interface SpecIssue {\n /** Severity: errors should be fixed, warnings are informational */\n severity: SpecIssueSeverity;\n /** Human-readable description of the issue */\n message: string;\n /** The element key where the issue was found (if applicable) */\n elementKey?: string;\n /** Machine-readable issue code for programmatic handling */\n code:\n | \"missing_root\"\n | \"root_not_found\"\n | \"missing_child\"\n | \"visible_in_props\"\n | \"orphaned_element\"\n | \"empty_spec\"\n | \"on_in_props\"\n | \"repeat_in_props\";\n}\n\n/**\n * Result of spec structural validation.\n */\nexport interface SpecValidationIssues {\n /** Whether the spec passed validation (no errors; warnings are OK) */\n valid: boolean;\n /** List of issues found */\n issues: SpecIssue[];\n}\n\n/**\n * Options for validateSpec.\n */\nexport interface ValidateSpecOptions {\n /**\n * Whether to check for orphaned elements (elements not reachable from root).\n * Defaults to false since orphans are harmless (just unused).\n */\n checkOrphans?: boolean;\n}\n\n/**\n * Validate a spec for structural integrity.\n *\n * Checks for common AI-generation errors:\n * - Missing or empty root\n * - Root element not found in elements map\n * - Children referencing non-existent elements\n * - `visible` placed inside `props` instead of on the element\n * - Orphaned elements (optional)\n *\n * @example\n * ```ts\n * const result = validateSpec(spec);\n * if (!result.valid) {\n * console.log(\"Spec errors:\", result.issues);\n * }\n * ```\n */\nexport function validateSpec(\n spec: Spec,\n options: ValidateSpecOptions = {},\n): SpecValidationIssues {\n const { checkOrphans = false } = options;\n const issues: SpecIssue[] = [];\n\n // 1. Check root\n if (!spec.root) {\n issues.push({\n severity: \"error\",\n message: \"Spec has no root element defined.\",\n code: \"missing_root\",\n });\n return { valid: false, issues };\n }\n\n if (!spec.elements[spec.root]) {\n issues.push({\n severity: \"error\",\n message: `Root element \"${spec.root}\" not found in elements map.`,\n code: \"root_not_found\",\n });\n }\n\n // 2. Check for empty spec\n if (Object.keys(spec.elements).length === 0) {\n issues.push({\n severity: \"error\",\n message: \"Spec has no elements.\",\n code: \"empty_spec\",\n });\n return { valid: false, issues };\n }\n\n // 3. Check each element\n for (const [key, element] of Object.entries(spec.elements)) {\n // 3a. Missing children\n if (element.children) {\n for (const childKey of element.children) {\n if (!spec.elements[childKey]) {\n issues.push({\n severity: \"error\",\n message: `Element \"${key}\" references child \"${childKey}\" which does not exist in the elements map.`,\n elementKey: key,\n code: \"missing_child\",\n });\n }\n }\n }\n\n // 3b. `visible` inside props\n const props = element.props as Record<string, unknown> | undefined;\n if (props && \"visible\" in props && props.visible !== undefined) {\n issues.push({\n severity: \"error\",\n message: `Element \"${key}\" has \"visible\" inside \"props\". It should be a top-level field on the element (sibling of type/props/children).`,\n elementKey: key,\n code: \"visible_in_props\",\n });\n }\n\n // 3c. `on` inside props (should be a top-level field)\n if (props && \"on\" in props && props.on !== undefined) {\n issues.push({\n severity: \"error\",\n message: `Element \"${key}\" has \"on\" inside \"props\". It should be a top-level field on the element (sibling of type/props/children).`,\n elementKey: key,\n code: \"on_in_props\",\n });\n }\n\n // 3d. `repeat` inside props (should be a top-level field)\n if (props && \"repeat\" in props && props.repeat !== undefined) {\n issues.push({\n severity: \"error\",\n message: `Element \"${key}\" has \"repeat\" inside \"props\". It should be a top-level field on the element (sibling of type/props/children).`,\n elementKey: key,\n code: \"repeat_in_props\",\n });\n }\n }\n\n // 4. Orphaned elements (optional)\n if (checkOrphans) {\n const reachable = new Set<string>();\n const walk = (key: string) => {\n if (reachable.has(key)) return;\n reachable.add(key);\n const el = spec.elements[key];\n if (el?.children) {\n for (const childKey of el.children) {\n if (spec.elements[childKey]) {\n walk(childKey);\n }\n }\n }\n };\n if (spec.elements[spec.root]) {\n walk(spec.root);\n }\n\n for (const key of Object.keys(spec.elements)) {\n if (!reachable.has(key)) {\n issues.push({\n severity: \"warning\",\n message: `Element \"${key}\" is not reachable from root \"${spec.root}\".`,\n elementKey: key,\n code: \"orphaned_element\",\n });\n }\n }\n }\n\n const hasErrors = issues.some((i) => i.severity === \"error\");\n return { valid: !hasErrors, issues };\n}\n\n/**\n * Auto-fix common spec issues in-place and return a corrected copy.\n *\n * Currently fixes:\n * - `visible` inside `props` → moved to element level\n * - `on` inside `props` → moved to element level\n * - `repeat` inside `props` → moved to element level\n *\n * Returns the fixed spec and a list of fixes applied.\n */\nexport function autoFixSpec(spec: Spec): {\n spec: Spec;\n fixes: string[];\n} {\n const fixes: string[] = [];\n const fixedElements: Record<string, UIElement> = {};\n\n for (const [key, element] of Object.entries(spec.elements)) {\n const props = element.props as Record<string, unknown> | undefined;\n let fixed = element;\n\n if (props && \"visible\" in props && props.visible !== undefined) {\n // Move visible from props to element level\n const { visible, ...restProps } = fixed.props as Record<string, unknown>;\n fixed = {\n ...fixed,\n props: restProps,\n visible: visible as UIElement[\"visible\"],\n };\n fixes.push(`Moved \"visible\" from props to element level on \"${key}\".`);\n }\n\n let currentProps = fixed.props as Record<string, unknown> | undefined;\n if (currentProps && \"on\" in currentProps && currentProps.on !== undefined) {\n // Move on from props to element level\n const { on, ...restProps } = currentProps;\n fixed = {\n ...fixed,\n props: restProps,\n on: on as UIElement[\"on\"],\n };\n fixes.push(`Moved \"on\" from props to element level on \"${key}\".`);\n }\n\n currentProps = fixed.props as Record<string, unknown> | undefined;\n if (\n currentProps &&\n \"repeat\" in currentProps &&\n currentProps.repeat !== undefined\n ) {\n // Move repeat from props to element level\n const { repeat, ...restProps } = currentProps;\n fixed = {\n ...fixed,\n props: restProps,\n repeat: repeat as UIElement[\"repeat\"],\n };\n fixes.push(`Moved \"repeat\" from props to element level on \"${key}\".`);\n }\n\n fixedElements[key] = fixed;\n }\n\n return {\n spec: { root: spec.root, elements: fixedElements },\n fixes,\n };\n}\n\n/**\n * Format validation issues into a human-readable string suitable for\n * inclusion in a repair prompt sent back to the AI.\n */\nexport function formatSpecIssues(issues: SpecIssue[]): string {\n const errors = issues.filter((i) => i.severity === \"error\");\n if (errors.length === 0) return \"\";\n\n const lines = [\"The generated UI spec has the following errors:\"];\n for (const issue of errors) {\n lines.push(`- ${issue.message}`);\n }\n return lines.join(\"\\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 /** Default rules baked into the schema (injected before customRules) */\n readonly defaultRules?: string[];\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 /** Default rules baked into the schema (injected before customRules in prompts) */\n defaultRules?: string[];\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 defaultRules: options?.defaultRules,\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 (JSONL, RFC 6902 JSON Patch):\");\n lines.push(\n \"Output JSONL (one JSON object per line) using RFC 6902 JSON Patch operations to build a UI tree.\",\n );\n lines.push(\n \"Each line is a JSON patch operation (add, remove, replace). Start with /root, then stream /elements and /state patches interleaved so the UI fills in progressively as it streams.\",\n );\n lines.push(\"\");\n lines.push(\"Example output (each line is a separate JSON object):\");\n lines.push(\"\");\n\n // Build example using actual catalog component names and props to avoid hallucinations\n const allComponents = (catalog.data as Record<string, unknown>).components as\n | Record<string, CatalogComponentDef>\n | undefined;\n const cn = catalog.componentNames;\n const comp1 = cn[0] || \"Component\";\n const comp2 = cn.length > 1 ? cn[1]! : comp1;\n const comp1Def = allComponents?.[comp1];\n const comp2Def = allComponents?.[comp2];\n const comp1Props = comp1Def ? getExampleProps(comp1Def) : {};\n const comp2Props = comp2Def ? getExampleProps(comp2Def) : {};\n\n // Find a string prop on comp2 to demonstrate $path dynamic bindings\n const dynamicPropName = comp2Def?.props\n ? findFirstStringProp(comp2Def.props)\n : null;\n const dynamicProps = dynamicPropName\n ? { ...comp2Props, [dynamicPropName]: { $path: \"$item/title\" } }\n : comp2Props;\n\n const exampleOutput = [\n JSON.stringify({ op: \"add\", path: \"/root\", value: \"main\" }),\n JSON.stringify({\n op: \"add\",\n path: \"/elements/main\",\n value: {\n type: comp1,\n props: comp1Props,\n children: [\"child-1\", \"list\"],\n },\n }),\n JSON.stringify({\n op: \"add\",\n path: \"/elements/child-1\",\n value: { type: comp2, props: comp2Props, children: [] },\n }),\n JSON.stringify({\n op: \"add\",\n path: \"/elements/list\",\n value: {\n type: comp1,\n props: comp1Props,\n repeat: { path: \"/items\", key: \"id\" },\n children: [\"item\"],\n },\n }),\n JSON.stringify({\n op: \"add\",\n path: \"/elements/item\",\n value: { type: comp2, props: dynamicProps, children: [] },\n }),\n JSON.stringify({ op: \"add\", path: \"/state/items\", value: [] }),\n JSON.stringify({\n op: \"add\",\n path: \"/state/items/0\",\n value: { id: \"1\", title: \"First Item\" },\n }),\n JSON.stringify({\n op: \"add\",\n path: \"/state/items/1\",\n value: { id: \"2\", title: \"Second Item\" },\n }),\n ].join(\"\\n\");\n\n lines.push(`${exampleOutput}\n\nNote: state patches appear right after the elements that use them, so the UI fills in as it streams. ONLY use component types from the AVAILABLE COMPONENTS list below.`);\n lines.push(\"\");\n\n // Initial state section\n lines.push(\"INITIAL STATE:\");\n lines.push(\n \"Specs include a /state field to seed the state model. Components with statePath read from and write to this state, and $path expressions read from it.\",\n );\n lines.push(\n \"CRITICAL: You MUST include state patches whenever your UI displays data via $path expressions, uses repeat to iterate over arrays, or uses statePath bindings. Without state, $path references resolve to nothing and repeat lists render zero items.\",\n );\n lines.push(\n \"Output state patches right after the elements that reference them, so the UI fills in progressively as it streams.\",\n );\n lines.push(\n \"Stream state progressively - output one patch per array item instead of one giant blob:\",\n );\n lines.push(\n ' For arrays: {\"op\":\"add\",\"path\":\"/state/posts/0\",\"value\":{\"id\":\"1\",\"title\":\"First Post\",...}} then /state/posts/1, /state/posts/2, etc.',\n );\n lines.push(\n ' For scalars: {\"op\":\"add\",\"path\":\"/state/newTodoText\",\"value\":\"\"}',\n );\n lines.push(\n ' Initialize the array first if needed: {\"op\":\"add\",\"path\":\"/state/posts\",\"value\":[]}',\n );\n lines.push(\n 'When content comes from the state model, use { \"$path\": \"/some/path\" } dynamic props to display it instead of hardcoding the same value in both state and props. The state model is the single source of truth.',\n );\n lines.push(\n \"Include realistic sample data in state. For blogs: 3-4 posts with titles, excerpts, authors, dates. For product lists: 3-5 items with names, prices, descriptions. Never leave arrays empty.\",\n );\n lines.push(\"\");\n lines.push(\"DYNAMIC LISTS (repeat field):\");\n lines.push(\n 'Any element can have a top-level \"repeat\" field to render its children once per item in a state array: { \"repeat\": { \"path\": \"/arrayPath\", \"key\": \"id\" } }.',\n );\n lines.push(\n 'The element itself renders once (as the container), and its children are expanded once per array item. \"path\" is the state array path. \"key\" is an optional field name on each item for stable React keys.',\n );\n lines.push(\n `Example: ${JSON.stringify({ type: comp1, props: comp1Props, repeat: { path: \"/todos\", key: \"id\" }, children: [\"todo-item\"] })}`,\n );\n lines.push(\n 'Inside children of a repeated element, use \"$item/field\" for per-item paths: statePath:\"$item/completed\", { \"$path\": \"$item/title\" }. Use \"$index\" for the current array index.',\n );\n lines.push(\n \"ALWAYS use the repeat field for lists backed by state arrays. NEVER hardcode individual elements for each array item.\",\n );\n lines.push(\n 'IMPORTANT: \"repeat\" is a top-level field on the element (sibling of type/props/children), NOT inside props.',\n );\n lines.push(\"\");\n lines.push(\"ARRAY STATE ACTIONS:\");\n lines.push(\n 'Use action \"pushState\" to append items to arrays. Params: { path: \"/arrayPath\", value: { ...item }, clearPath: \"/inputPath\" }.',\n );\n lines.push(\n 'Values inside pushState can contain { \"path\": \"/statePath\" } references to read current state (e.g. the text from an input field).',\n );\n lines.push(\n 'Use \"$id\" inside a pushState value to auto-generate a unique ID.',\n );\n lines.push(\n 'Example: on: { \"press\": { \"action\": \"pushState\", \"params\": { \"path\": \"/todos\", \"value\": { \"id\": \"$id\", \"title\": { \"path\": \"/newTodoText\" }, \"completed\": false }, \"clearPath\": \"/newTodoText\" } } }',\n );\n lines.push(\n 'Use action \"removeState\" to remove items from arrays by index. Params: { path: \"/arrayPath\", index: N }. Inside a repeated element\\'s children, use \"$index\" for the current item index.',\n );\n lines.push(\n \"For lists where users can add/remove items (todos, carts, etc.), use pushState and removeState instead of hardcoding with setState.\",\n );\n lines.push(\"\");\n lines.push(\n 'IMPORTANT: State paths use RFC 6901 JSON Pointer syntax (e.g. \"/todos/0/title\"). Do NOT use JavaScript-style dot notation (e.g. \"/todos.length\" is WRONG). To generate unique IDs for new items, use \"$id\" instead of trying to read array length.',\n );\n lines.push(\"\");\n\n // Components section — reuse the typed reference from example generation\n const components = allComponents;\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 eventsStr =\n def.events && def.events.length > 0\n ? ` [events: ${def.events.join(\", \")}]`\n : \"\";\n const descStr = def.description ? ` - ${def.description}` : \"\";\n lines.push(`- ${name}: ${propsStr}${descStr}${childrenStr}${eventsStr}`);\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 // Events section\n lines.push(\"EVENTS (the `on` field):\");\n lines.push(\n \"Elements can have an optional `on` field to bind events to actions. The `on` field is a top-level field on the element (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\n 'Each key in `on` is an event name (from the component\\'s supported events), and the value is an action binding: `{ \"action\": \"<actionName>\", \"params\": { ... } }`.',\n );\n lines.push(\"\");\n lines.push(\"Example:\");\n lines.push(\n ` ${JSON.stringify({ type: comp1, props: comp1Props, on: { press: { action: \"setState\", params: { path: \"/saved\", value: true } } }, children: [] })}`,\n );\n lines.push(\"\");\n lines.push(\n 'Action params can use dynamic path references to read from state: { \"path\": \"/statePath\" }.',\n );\n lines.push(\n \"IMPORTANT: Do NOT put action/actionParams inside props. Always use the `on` field for event bindings.\",\n );\n lines.push(\"\");\n\n // Visibility conditions\n lines.push(\"VISIBILITY CONDITIONS:\");\n lines.push(\n \"Elements can have an optional `visible` field to conditionally show/hide based on data state. IMPORTANT: `visible` is a top-level field on the element object (sibling of type/props/children), NOT inside props.\",\n );\n lines.push(\n `Correct: ${JSON.stringify({ type: comp1, props: comp1Props, visible: { eq: [{ path: \"/tab\" }, \"home\"] }, children: [\"...\"] })}`,\n );\n lines.push(\n '- `{ \"eq\": [{ \"path\": \"/statePath\" }, \"value\"] }` - visible when state at path equals value',\n );\n lines.push(\n '- `{ \"neq\": [{ \"path\": \"/statePath\" }, \"value\"] }` - visible when state at path does not equal value',\n );\n lines.push('- `{ \"path\": \"/statePath\" }` - visible when path is truthy');\n lines.push(\n '- `{ \"and\": [...] }`, `{ \"or\": [...] }`, `{ \"not\": {...} }` - combine conditions',\n );\n lines.push(\"- `true` / `false` - always visible/hidden\");\n lines.push(\"\");\n lines.push(\n \"Use a component with on.press bound to setState to update state and drive visibility.\",\n );\n lines.push(\n `Example: A ${comp1} with on: { \"press\": { \"action\": \"setState\", \"params\": { \"path\": \"/activeTab\", \"value\": \"home\" } } } sets state, then a container with visible: { \"eq\": [{ \"path\": \"/activeTab\" }, \"home\"] } shows only when that tab is active.`,\n );\n lines.push(\"\");\n\n // Dynamic prop expressions\n lines.push(\"DYNAMIC PROPS:\");\n lines.push(\n \"Any prop value can be a dynamic expression that resolves based on state. Two forms are supported:\",\n );\n lines.push(\"\");\n lines.push(\n '1. State binding: `{ \"$path\": \"/statePath\" }` - resolves to the value at that state path.',\n );\n lines.push(\n ' Example: `\"color\": { \"$path\": \"/theme/primary\" }` reads the color from state.',\n );\n lines.push(\"\");\n lines.push(\n '2. Conditional: `{ \"$cond\": <condition>, \"$then\": <value>, \"$else\": <value> }` - evaluates the condition (same syntax as visibility conditions) and picks the matching value.',\n );\n lines.push(\n ' Example: `\"color\": { \"$cond\": { \"eq\": [{ \"path\": \"/activeTab\" }, \"home\"] }, \"$then\": \"#007AFF\", \"$else\": \"#8E8E93\" }`',\n );\n lines.push(\n ' Example: `\"name\": { \"$cond\": { \"eq\": [{ \"path\": \"/activeTab\" }, \"home\"] }, \"$then\": \"home\", \"$else\": \"home-outline\" }`',\n );\n lines.push(\"\");\n lines.push(\n \"Use dynamic props instead of duplicating elements with opposing visible conditions when only prop values differ.\",\n );\n lines.push(\"\");\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 set root: {\"op\":\"add\",\"path\":\"/root\",\"value\":\"<root-key>\"}',\n 'Then add each element: {\"op\":\"add\",\"path\":\"/elements/<key>\",\"value\":{...}}',\n \"Output /state patches right after the elements that use them, one per array item for progressive loading. REQUIRED whenever using $path, repeat, or statePath.\",\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 schemaRules = catalog.schema.defaultRules ?? [];\n const allRules = [...baseRules, ...schemaRules, ...customRules];\n allRules.forEach((rule, i) => {\n lines.push(`${i + 1}. ${rule}`);\n });\n\n return lines.join(\"\\n\");\n}\n\n// =============================================================================\n// Example Value Generation from Zod Schemas\n// =============================================================================\n\n/**\n * Component definition shape as it appears in catalog data\n */\ninterface CatalogComponentDef {\n props?: z.ZodType;\n description?: string;\n slots?: string[];\n events?: string[];\n example?: Record<string, unknown>;\n}\n\n/**\n * Get example props for a catalog component.\n * Uses the explicit `example` field if provided, otherwise generates from Zod schema.\n */\nfunction getExampleProps(def: CatalogComponentDef): Record<string, unknown> {\n if (def.example && Object.keys(def.example).length > 0) {\n return def.example;\n }\n if (def.props) {\n return generateExamplePropsFromZod(def.props);\n }\n return {};\n}\n\n/**\n * Generate example prop values from a Zod object schema.\n * Only includes required fields to keep examples concise.\n */\nfunction generateExamplePropsFromZod(\n schema: z.ZodType,\n): Record<string, unknown> {\n if (!schema || !schema._def) return {};\n const def = schema._def as unknown as Record<string, unknown>;\n const typeName = getZodTypeName(schema);\n\n if (typeName !== \"ZodObject\" && typeName !== \"object\") return {};\n\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 {};\n\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(shape)) {\n const innerTypeName = getZodTypeName(value);\n // Skip optional props to keep examples concise\n if (\n innerTypeName === \"ZodOptional\" ||\n innerTypeName === \"optional\" ||\n innerTypeName === \"ZodNullable\" ||\n innerTypeName === \"nullable\"\n ) {\n continue;\n }\n result[key] = generateExampleValue(value);\n }\n return result;\n}\n\n/**\n * Generate a single example value from a Zod type.\n */\nfunction generateExampleValue(schema: z.ZodType): unknown {\n if (!schema || !schema._def) return \"...\";\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 \"example\";\n case \"ZodNumber\":\n case \"number\":\n return 0;\n case \"ZodBoolean\":\n case \"boolean\":\n return true;\n case \"ZodLiteral\":\n case \"literal\":\n return def.value;\n case \"ZodEnum\":\n case \"enum\": {\n if (Array.isArray(def.values) && def.values.length > 0)\n return def.values[0];\n if (def.entries && typeof def.entries === \"object\") {\n const values = Object.values(def.entries as Record<string, string>);\n return values.length > 0 ? values[0] : \"example\";\n }\n return \"example\";\n }\n case \"ZodOptional\":\n case \"optional\":\n case \"ZodNullable\":\n case \"nullable\":\n case \"ZodDefault\":\n case \"default\": {\n const inner = (def.innerType as z.ZodType) ?? (def.wrapped as z.ZodType);\n return inner ? generateExampleValue(inner) : null;\n }\n case \"ZodArray\":\n case \"array\":\n return [];\n case \"ZodObject\":\n case \"object\":\n return generateExamplePropsFromZod(schema);\n case \"ZodUnion\":\n case \"union\": {\n const options = def.options as z.ZodType[] | undefined;\n return options && options.length > 0\n ? generateExampleValue(options[0]!)\n : \"...\";\n }\n default:\n return \"...\";\n }\n}\n\n/**\n * Find the name of the first required string prop in a Zod object schema.\n * Used to demonstrate $path dynamic bindings in examples.\n */\nfunction findFirstStringProp(schema?: z.ZodType): string | null {\n if (!schema || !schema._def) return null;\n const def = schema._def as unknown as Record<string, unknown>;\n const typeName = getZodTypeName(schema);\n\n if (typeName !== \"ZodObject\" && typeName !== \"object\") return null;\n\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 null;\n\n for (const [key, value] of Object.entries(shape)) {\n const innerTypeName = getZodTypeName(value);\n // Skip optional props\n if (\n innerTypeName === \"ZodOptional\" ||\n innerTypeName === \"optional\" ||\n innerTypeName === \"ZodNullable\" ||\n innerTypeName === \"nullable\"\n ) {\n continue;\n }\n // Unwrap to check the actual type\n if (innerTypeName === \"ZodString\" || innerTypeName === \"string\") {\n return key;\n }\n }\n return null;\n}\n\n// =============================================================================\n// Zod Introspection Helpers\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 type { Spec } from \"./types\";\n\n/**\n * Options for building a user prompt.\n */\nexport interface UserPromptOptions {\n /** The user's text prompt */\n prompt: string;\n /** Existing spec to refine (triggers patch-only mode) */\n currentSpec?: Spec | null;\n /** Runtime state context to include */\n state?: Record<string, unknown> | null;\n /** Maximum length for the user's text prompt (applied before wrapping) */\n maxPromptLength?: number;\n}\n\n/**\n * Check whether a spec is non-empty (has a root and at least one element).\n */\nfunction isNonEmptySpec(spec: unknown): spec is Spec {\n if (!spec || typeof spec !== \"object\") return false;\n const s = spec as Record<string, unknown>;\n return (\n typeof s.root === \"string\" &&\n typeof s.elements === \"object\" &&\n s.elements !== null &&\n Object.keys(s.elements as object).length > 0\n );\n}\n\nconst PATCH_INSTRUCTIONS = `IMPORTANT: The current UI is already loaded. Output ONLY the patches needed to make the requested change:\n- To add a new element: {\"op\":\"add\",\"path\":\"/elements/new-key\",\"value\":{...}}\n- To modify an existing element: {\"op\":\"replace\",\"path\":\"/elements/existing-key\",\"value\":{...}}\n- To remove an element: {\"op\":\"remove\",\"path\":\"/elements/old-key\"}\n- To update the root: {\"op\":\"replace\",\"path\":\"/root\",\"value\":\"new-root-key\"}\n- To add children: update the parent element with new children array\n\nDO NOT output patches for elements that don't need to change. Only output what's necessary for the requested modification.`;\n\n/**\n * Build a user prompt for AI generation.\n *\n * Handles common patterns that every consuming app needs:\n * - Truncating the user's prompt to a max length\n * - Including the current spec for refinement (patch-only mode)\n * - Including runtime state context\n *\n * @example\n * ```ts\n * // Fresh generation\n * buildUserPrompt({ prompt: \"create a todo app\" })\n *\n * // Refinement with existing spec\n * buildUserPrompt({ prompt: \"add a dark mode toggle\", currentSpec: spec })\n *\n * // With state context\n * buildUserPrompt({ prompt: \"show my data\", state: { todos: [] } })\n * ```\n */\nexport function buildUserPrompt(options: UserPromptOptions): string {\n const { prompt, currentSpec, state, maxPromptLength } = options;\n\n // Sanitize and optionally truncate the user's text\n let userText = String(prompt || \"\");\n if (maxPromptLength !== undefined && maxPromptLength > 0) {\n userText = userText.slice(0, maxPromptLength);\n }\n\n // --- Refinement mode: currentSpec is provided ---\n if (isNonEmptySpec(currentSpec)) {\n const parts: string[] = [];\n\n parts.push(\n `CURRENT UI STATE (already loaded, DO NOT recreate existing elements):`,\n );\n parts.push(JSON.stringify(currentSpec, null, 2));\n parts.push(\"\");\n parts.push(`USER REQUEST: ${userText}`);\n\n // Append state context if provided\n if (state && Object.keys(state).length > 0) {\n parts.push(\"\");\n parts.push(`AVAILABLE STATE:\\n${JSON.stringify(state, null, 2)}`);\n }\n\n parts.push(\"\");\n parts.push(PATCH_INSTRUCTIONS);\n\n return parts.join(\"\\n\");\n }\n\n // --- Fresh generation mode ---\n const parts: string[] = [userText];\n\n if (state && Object.keys(state).length > 0) {\n parts.push(`\\nAVAILABLE STATE:\\n${JSON.stringify(state, null, 2)}`);\n }\n\n parts.push(\n `\\nRemember: Output /root first, then interleave /elements and /state patches so the UI fills in progressively as it streams. Output each state patch right after the elements that use it, one per array item.`,\n );\n\n return parts.join(\"\\n\");\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 /** Example prop values used in prompt examples (auto-generated from Zod schema if omitted) */\n example?: Record<string, unknown>;\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\": \"/state/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","parts","z","z","name","formatZodType"]}
|