{"version":3,"file":"index.cjs","names":["z","z","builtinSteps","target","normalizeProjectIdentity","getPostHogConfig","TELEMETRY_REQUEST_TIMEOUT_MS","isRuntimeTelemetryEnabled","z","obj","evaluatePropValue"],"sources":["../src/reactive.ts","../src/signature.ts","../src/extend.ts","../src/functions.ts","../src/parser/builtins.ts","../src/telemetry/runtime.ts","../src/parser/validate-library.ts","../src/parser/cloud-config.ts","../src/parser/prompt.ts","../src/library.ts","../src/message.ts","../src/parser/types.ts","../src/parser/ast.ts","../src/parser/expressions.ts","../src/parser/lexer.ts","../src/parser/validation.ts","../src/parser/materialize.ts","../src/parser/statements.ts","../src/parser/parser.ts","../src/parser/enrich-errors.ts","../src/parser/merge.ts","../src/parser/serialize.ts","../src/runtime/evaluator.ts","../src/runtime/evaluate-prop.ts","../src/runtime/evaluate-tree.ts","../src/runtime/mcp.ts","../src/runtime/toolProvider.ts","../src/runtime/queryManager.ts","../src/runtime/state-field.ts","../src/runtime/store.ts","../src/utils/validation.ts"],"sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n// Reactive schema marker — shared between lang-core (introspection) and\n// framework adapters (runtime binding).\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** WeakSet tracks reactive schemas without mutating the schema objects. */\nconst reactiveSchemas = new WeakSet<object>();\n\n/** Mark a schema as reactive. Called by framework adapters' reactive() function. */\nexport function markReactive(schema: object): void {\n  reactiveSchemas.add(schema);\n}\n\n/** Check if a schema was marked reactive. Used by Zod introspection for $binding<> prefix. */\nexport function isReactiveSchema(schema: unknown): boolean {\n  return typeof schema === \"object\" && schema !== null && reactiveSchemas.has(schema as object);\n}\n","import * as z from \"zod/v4/core\";\nimport type { ActionRef } from \"./parser/builtins\";\nimport { isReactiveSchema } from \"./reactive\";\n\n// Zod introspection and the one prompt signature builder for components,\n// functions and actions.\n\n// ─── Schema ID tagging ─────────────────────────────────────────────────────\n// WeakMap-based naming for schemas. defineComponent tags component schemas\n// automatically. tagSchemaId is exported for non-component schemas\n// (e.g. ActionExpression) that also need friendly names in prompts.\n\nexport const schemaIdTags = new WeakMap<object, string>();\n\n/**\n * Tag a schema with an ID for prompt signatures.\n * Use for non-component schemas that need friendly type names (e.g. ActionExpression).\n * This affects prompt output only, not JSON Schema $defs.\n */\nexport function tagSchemaId(schema: object, id: string): void {\n  schemaIdTags.set(schema, id);\n}\n\n// Action refs print as `@Name` in signatures: share?: @CopyToClipboard | @OpenUrl\nconst actionRefTags = new WeakMap<object, string>();\n\n// actionRef(\"OpenUrl\", data) -> `$defs.OpenUrl` = data in JSON, `@OpenUrl` in prompt signatures\nexport function actionRef(name: string, data: z.$ZodType): ActionRef {\n  actionRefTags.set(data, name);\n  return data as unknown as ActionRef;\n}\n\n// A cloned schema keeps its prompt name: Card's clone still prints as Card, an action ref as @Name\nexport function copySchemaTags(from: object, to: object): void {\n  const id = schemaIdTags.get(from);\n  if (id) schemaIdTags.set(to, id);\n  const action = actionRefTags.get(from);\n  if (action) actionRefTags.set(to, action);\n}\n\n// ─── Zod v3 detection ──────────────────────────────────────────────────────\n\nexport function assertV4Schema(schema: unknown, componentName: string): void {\n  if (schema != null && typeof schema === \"object\" && \"_def\" in schema && !(\"_zod\" in schema)) {\n    throw new Error(\n      `[OpenUI] Component \"${componentName}\" was defined with a Zod 3 schema. ` +\n        `OpenUI requires Zod 4 schemas. ` +\n        `If you're on zod@3.25+, import from \"zod/v4\" instead of \"zod\". ` +\n        `See: https://zod.dev/v4/versioning`,\n    );\n  }\n}\n\n// ─── Zod introspection ──────────────────────────────────────────────────────\n\nexport function getZodDef(schema: unknown): any {\n  return (schema as any)?._zod?.def;\n}\n\nfunction getZodType(schema: unknown): string | undefined {\n  return getZodDef(schema)?.type;\n}\n\nfunction isOptionalType(schema: unknown): boolean {\n  const type = getZodType(schema);\n  return type === \"optional\" || type === \"default\" || type === \"nullable\";\n}\n\nexport function unwrap(schema: unknown): unknown {\n  let s = schema;\n  let def = getZodDef(s);\n  while (def?.type === \"optional\" || def?.type === \"default\" || def?.type === \"nullable\") {\n    s = def.innerType;\n    def = getZodDef(s);\n  }\n  return s;\n}\n\nfunction isArrayType(schema: unknown): boolean {\n  const s = unwrap(schema);\n  return getZodType(s) === \"array\";\n}\n\nfunction getArrayInnerType(schema: unknown): unknown | undefined {\n  const s = unwrap(schema);\n  const def = getZodDef(s);\n  if (def?.type === \"array\") return def.element ?? def.innerType;\n  return undefined;\n}\n\nfunction getEnumValues(schema: unknown): string[] | undefined {\n  const s = unwrap(schema);\n  const def = getZodDef(s);\n  if (def?.type !== \"enum\") return undefined;\n  if (Array.isArray(def.values)) return def.values;\n  if (def.entries && typeof def.entries === \"object\") return Object.keys(def.entries);\n  return undefined;\n}\n\nexport type SchemaRegistry = ReturnType<typeof z.registry<{ id: string }>>;\n\nfunction getSchemaId(schema: unknown, reg?: SchemaRegistry): string | undefined {\n  // Check per-library registry first\n  try {\n    const meta = reg?.get(schema as z.$ZodType) as { id?: string } | undefined;\n    if (meta?.id) return meta.id;\n  } catch {\n    // not registered — fall through\n  }\n  // Fallback: WeakMap tags from defineComponent / tagSchemaId\n  if (typeof schema === \"object\" && schema !== null) {\n    return schemaIdTags.get(schema);\n  }\n  return undefined;\n}\n\nexport function getUnionOptions(schema: unknown): unknown[] | undefined {\n  const def = getZodDef(schema);\n  if (def?.type === \"union\" && Array.isArray(def.options)) return def.options;\n  return undefined;\n}\n\nfunction getObjectShape(schema: unknown): Record<string, unknown> | undefined {\n  const def = getZodDef(schema);\n  if (def?.type === \"object\" && def.shape && typeof def.shape === \"object\")\n    return def.shape as Record<string, unknown>;\n  return undefined;\n}\n\n/**\n * Resolve the type annotation for a schema field.\n * Returns a human-readable type string for the schema.\n * If the schema is marked reactive(), prefixes with \"$binding<...>\".\n */\nfunction resolveTypeAnnotation(schema: unknown, reg?: SchemaRegistry): string | undefined {\n  const isReactive = isReactiveSchema(schema);\n  const inner = unwrap(schema);\n\n  const baseType = resolveBaseType(inner, reg);\n  if (!baseType) return undefined;\n  return isReactive ? `$binding<${baseType}>` : baseType;\n}\n\nfunction resolveBaseType(inner: unknown, reg?: SchemaRegistry): string | undefined {\n  const actionRef = typeof inner === \"object\" && inner !== null && actionRefTags.get(inner);\n  if (actionRef) return `@${actionRef}`;\n  const directId = getSchemaId(inner, reg);\n  if (directId) return directId;\n\n  const unionOpts = getUnionOptions(inner);\n  if (unionOpts) {\n    const resolved = unionOpts.map((o) => resolveTypeAnnotation(o, reg));\n    const names = resolved.filter(Boolean) as string[];\n    if (names.length > 0) return names.join(\" | \");\n  }\n\n  if (isArrayType(inner)) {\n    const arrayInner = getArrayInnerType(inner);\n    if (!arrayInner) return undefined;\n    const innerType = resolveTypeAnnotation(arrayInner, reg);\n    if (innerType) {\n      const isUnion = getUnionOptions(unwrap(arrayInner)) !== undefined;\n      return isUnion ? `(${innerType})[]` : `${innerType}[]`;\n    }\n    return undefined;\n  }\n\n  const zodType = getZodType(inner);\n  if (zodType === \"string\") return \"string\";\n  if (zodType === \"number\") return \"number\";\n  if (zodType === \"boolean\") return \"boolean\";\n  if (zodType === \"any\") return \"any\";\n\n  if (zodType === \"record\") {\n    const def = getZodDef(inner);\n    const keyType = resolveTypeAnnotation(def?.keyType, reg) ?? \"string\";\n    const valueType = resolveTypeAnnotation(def?.valueType, reg) ?? \"any\";\n    return `Record<${keyType}, ${valueType}>`;\n  }\n\n  const enumVals = getEnumValues(inner);\n  if (enumVals) return enumVals.map((v) => `\"${v}\"`).join(\" | \");\n\n  if (zodType === \"literal\") {\n    const vals = getZodDef(inner)?.values;\n    if (Array.isArray(vals) && vals.length === 1) {\n      const v = vals[0];\n      return typeof v === \"string\" ? `\"${v}\"` : String(v);\n    }\n  }\n\n  const shape = getObjectShape(inner);\n  if (shape) {\n    const fields = Object.entries(shape).map(([name, fieldSchema]) => {\n      const opt = isOptionalType(fieldSchema) ? \"?\" : \"\";\n      const fieldType = resolveTypeAnnotation(fieldSchema as z.$ZodType, reg);\n      return fieldType ? `${name}${opt}: ${fieldType}` : `${name}${opt}`;\n    });\n    return `{${fields.join(\", \")}}`;\n  }\n\n  // Fallback for unrecognized Zod types (z.tuple, z.date, etc.)\n  // \"any\" is safer than undefined — the LLM sees `param: any` instead of bare `param`\n  return \"any\";\n}\n\n// ─── Field analysis & signature generation ──────────────────────────────────\n\ninterface FieldInfo {\n  name: string;\n  isOptional: boolean;\n  isArray: boolean;\n  typeAnnotation?: string;\n}\n\nfunction analyzeFields(shape: Record<string, z.$ZodType>, reg?: SchemaRegistry): FieldInfo[] {\n  return Object.entries(shape).map(([name, schema]) => ({\n    name,\n    isOptional: isOptionalType(schema),\n    isArray: isArrayType(schema),\n    typeAnnotation: resolveTypeAnnotation(schema, reg),\n  }));\n}\n\nexport function buildSignature(componentName: string, fields: FieldInfo[]): string {\n  const params = fields.map((f) => {\n    if (f.typeAnnotation) {\n      return f.isOptional ? `${f.name}?: ${f.typeAnnotation}` : `${f.name}: ${f.typeAnnotation}`;\n    }\n    if (f.isArray) {\n      return f.isOptional ? `[${f.name}]?` : `[${f.name}]`;\n    }\n    return f.isOptional ? `${f.name}?` : f.name;\n  });\n  return `${componentName}(${params.join(\", \")})`;\n}\n\n/**\n * Prompt signature of a component, function or action: `Name(a: T, b?: U)`,\n * plus ` → R` when it declares a return type. Key order is the positional order.\n */\nexport function schemaSignature(\n  name: string,\n  params: z.$ZodObject,\n  returns?: z.$ZodType,\n  reg?: SchemaRegistry,\n): string {\n  const signature = buildSignature(name, analyzeFields(params._zod.def.shape, reg));\n  const type = returns && resolveTypeAnnotation(returns, reg);\n  return type ? `${signature} → ${type}` : signature;\n}\n","// library.extend: derives a library definition from a base plus additions, overrides and removals.\nimport * as z from \"zod/v4/core\";\nimport type {\n  AnyAction,\n  ComponentGroup,\n  DefinedComponent,\n  LibraryDefinition,\n  LibraryExtension,\n} from \"./library\";\nimport { isReactiveSchema, markReactive } from \"./reactive\";\nimport { copySchemaTags, getUnionOptions, getZodDef, unwrap } from \"./signature\";\n\n// ─── library.extend ─────────────────────────────────────────────────────────\n\ntype Comp<C> = DefinedComponent<any, C>;\n\nconst fail = (message: string): never => {\n  throw new Error(`[extend] ${message}`);\n};\n\n// add ProductCard into \"Card\", remove Frame -> the base parts with Card, every parent and the groups updated\nexport function extendDefinition<C>(\n  base: LibraryDefinition<C, AnyAction>,\n  ext: LibraryExtension<C, AnyAction>,\n): LibraryDefinition<C, AnyAction> {\n  const changes = applyComponentVerbs(base, ext.components);\n  const slots = findContentSlots(changes);\n  const placements = placeInSlots(changes, slots);\n  return {\n    ...base,\n    id: undefined, // a derived library does not inherit the base's public id\n    components: rebuildComponents(changes, placements),\n    componentGroups: withoutRemoved(base.componentGroups, changes.removed),\n    functions: [...(base.functions ?? []), ...(ext.functions?.add ?? [])],\n    actions: [...(base.actions ?? []), ...(ext.actions?.add ?? [])],\n  };\n}\n\ninterface ComponentChanges<C> {\n  /** The library's components after the verbs, in order. */\n  byName: Map<string, Comp<C>>;\n  /** Every schema that stands for a component, old, new or removed, mapped to its name. */\n  nameOf: Map<unknown, string>;\n  /** \"ProductCard\" -> [\"Card\"] */\n  slotRequests: Map<string, string[]>;\n  removed: Set<string>;\n}\n\n// add [Card], override [Image], remove [\"Frame\"] -> Stack, Text, Image (new), Card\nfunction applyComponentVerbs<C>(\n  base: LibraryDefinition<C, AnyAction>,\n  verbs: LibraryExtension<C, AnyAction>[\"components\"] = {},\n): ComponentChanges<C> {\n  const byName = new Map(base.components.map((c) => [c.name, c]));\n  const nameOf = new Map<unknown, string>(base.components.map((c) => [c.props, c.name]));\n  const slotRequests = new Map<string, string[]>();\n  const touched = new Set<string>(); // added or overridden in this call\n  const put = (comp: Comp<C>) => {\n    byName.set(comp.name, comp);\n    nameOf.set(comp.props, comp.name);\n    touched.add(comp.name);\n  };\n\n  for (const entry of verbs.add ?? []) {\n    const { component, slots } = \"slots\" in entry ? entry : { component: entry, slots: undefined };\n    const name = component.name;\n    if (byName.has(name)) fail(`Component \"${name}\" already exists. Use override.`);\n    if (slots?.length === 0) fail(`\"slots\" for \"${name}\" is empty. Omit it to only list it.`);\n    put(component);\n    if (slots) slotRequests.set(name, slots);\n  }\n  const overridden = new Set<string>();\n  for (const comp of verbs.override ?? []) {\n    if (!byName.has(comp.name))\n      fail(`Cannot override \"${comp.name}\": not in the library. Use add.`);\n    if (overridden.has(comp.name)) fail(`Component \"${comp.name}\" is overridden twice.`);\n    overridden.add(comp.name);\n    put(comp);\n  }\n  const removed = new Set(verbs.remove);\n  for (const name of removed) {\n    if (touched.has(name))\n      fail(`Cannot remove \"${name}\": it is added or overridden in the same call.`);\n    if (!byName.delete(name)) fail(`Cannot remove \"${name}\": not in the library.`);\n    if (name === base.root) fail(`Cannot remove \"${name}\": it is the library root.`);\n  }\n  return { byName, nameOf, slotRequests, removed };\n}\n\n// A content slot holds a union of components, maybe optional or in an array:\n// children: z.array(z.union([Text.ref, Image.ref])) -> that union\nfunction slotUnion(schema: unknown, nameOf: Map<unknown, string>): unknown {\n  const inner = unwrap(schema);\n  const def = getZodDef(inner);\n  if (def?.type === \"array\") return slotUnion(def.element, nameOf);\n  return getUnionOptions(inner)?.some((o) => nameOf.has(o)) ? inner : undefined;\n}\n\n// Stack(children: (Text | Image)[]) -> [\"Stack.children\"]\nfunction findContentSlots<C>({ byName, nameOf }: ComponentChanges<C>): string[] {\n  const slots: string[] = [];\n  for (const comp of byName.values()) {\n    for (const [prop, schema] of Object.entries(comp.props.shape)) {\n      if (slotUnion(schema, nameOf)) slots.push(`${comp.name}.${prop}`);\n    }\n  }\n  return slots;\n}\n\n// ProductCard asks for [\"Card\"] -> \"Card.children\" -> [\"ProductCard\"]\nfunction placeInSlots<C>(changes: ComponentChanges<C>, slots: string[]): Map<string, string[]> {\n  const placements = new Map<string, string[]>();\n  for (const [name, requested] of changes.slotRequests) {\n    for (const slot of requested) {\n      const path = resolveSlot(slot, name, slots, changes.byName);\n      const placed = placements.get(path) ?? [];\n      // slots: [\"Stack.children\", \"Stack\"] name one path; Card joins it once\n      if (!placed.includes(name)) placements.set(path, [...placed, name]);\n    }\n  }\n  return placements;\n}\n\n// \"Stack.children\" stays; \"Stack\" -> \"Stack.children\" when Stack has exactly one content slot\nfunction resolveSlot(slot: string, name: string, slots: string[], byName: Map<string, unknown>) {\n  if (slots.includes(slot)) return slot;\n  const parent = slot.split(\".\")[0]!;\n  const candidates = slots.filter((s) => s.startsWith(`${parent}.`));\n  if (!slot.includes(\".\") && candidates.length === 1) return candidates[0]!;\n  const what = `Slot \"${slot}\" for \"${name}\"`;\n  if (!byName.has(parent)) fail(`${what}: \"${parent}\" is not in the library.`);\n  if (!candidates.length)\n    fail(\n      `${what}: \"${parent}\" has no content slot (a prop that is a union of components, or an optional or array of one).`,\n    );\n  return fail(`${what} must be one content slot. Candidates: ${candidates.join(\", \")}.`);\n}\n\n/** The prop being rebuilt, its content-slot union if any, and the schemas slotted into it. */\ntype Slot = { path: string; union: unknown; added: unknown[] };\n\n// Zod parents hold their children's schema objects, not their names, so every parent of an\n// overridden, removed or slotted-in component is cloned to point at the final schemas.\n// Schemas with nothing to change keep their identity. Built in two passes so cycles work:\n// every clone exists (with an empty shape) before any shape is filled, so Card(body: Stack)\n// slotted into Stack.children points at the new Stack, and the new Stack at the new Card.\nfunction rebuildComponents<C>(\n  changes: ComponentChanges<C>,\n  placements: Map<string, string[]>,\n): Comp<C>[] {\n  const { byName, nameOf, removed } = changes;\n  const final = new Map<string, Comp<C>>(byName);\n  const shapes = new Map<string, Record<string, unknown>>();\n  for (const name of findRebuilt(changes, placements)) {\n    const comp = byName.get(name)!;\n    const shape: Record<string, unknown> = {};\n    const props = cloneSchema(comp.props, {\n      get shape() {\n        return shape; // filled below, read by zod only after\n      },\n    }) as z.$ZodObject;\n    final.set(name, { ...comp, props, ref: props as unknown as Comp<C>[\"ref\"] });\n    shapes.set(name, shape);\n  }\n  const finalProps = (name: string) => final.get(name)!.props;\n\n  const onlyType = (name: string | undefined, slot: Slot): never =>\n    fail(`Cannot remove \"${name}\": it is the only type allowed in ${slot.path}.`);\n\n  // z.array(z.union([Text, Frame])) with Frame removed -> z.array(z.union([Text]))\n  const rebind = (schema: unknown, slot: Slot, memo: Map<unknown, unknown>): unknown => {\n    const name = nameOf.get(schema);\n    if (name !== undefined) {\n      if (removed.has(name)) onlyType(name, slot);\n      return finalProps(name);\n    }\n    const def = getZodDef(schema);\n    if (!def || def.type === \"lazy\") return schema;\n    if (memo.has(schema)) return memo.get(schema);\n    memo.set(schema, schema); // cycle guard\n    const walk = (child: unknown) => rebind(child, slot, memo);\n\n    const patch: Record<string, unknown> = {};\n    const options = getUnionOptions(schema);\n    const holdsComponents = options?.some((o) => nameOf.has(o));\n    for (const [key, value] of Object.entries(def)) {\n      if (key === \"checks\" || (holdsComponents && key === \"options\")) continue;\n      const next = rebindField(key, value, walk);\n      if (!sameField(next, value)) patch[key] = next;\n    }\n    if (holdsComponents) {\n      // Text | Image | Frame, Frame removed and Card slotted in -> Text | Image | Card\n      const kept = options!.filter((o) => !removed.has(nameOf.get(o) ?? \"\")).map(walk);\n      const added = schema === slot.union ? slot.added.filter((a) => !kept.includes(a)) : [];\n      if (!kept.length && !added.length) onlyType(nameOf.get(options![0]), slot);\n      const next = [...kept, ...added];\n      if (!sameField(next, options)) patch.options = next;\n    }\n    const out = Object.keys(patch).length ? cloneSchema(schema, patch) : schema;\n    memo.set(schema, out);\n    return out;\n  };\n\n  for (const [name, shape] of shapes) {\n    for (const [prop, schema] of Object.entries(byName.get(name)!.props.shape)) {\n      const path = `${name}.${prop}`;\n      const added = (placements.get(path) ?? []).map(finalProps);\n      shape[prop] = rebind(schema, { path, union: slotUnion(schema, nameOf), added }, new Map());\n    }\n  }\n  return [...final.values()];\n}\n\n// Stack gets a slotted-in Card, Frame nests a removed or overridden Image, or a component nests\n// one of those (repeated until nothing changes, so cycles settle) -> those names\nfunction findRebuilt<C>(\n  { byName, nameOf, removed }: ComponentChanges<C>,\n  placements: Map<string, string[]>,\n): Set<string> {\n  const nested = new Map<string, Set<unknown>>();\n  for (const [name, comp] of byName) {\n    const found = new Set<unknown>();\n    for (const schema of Object.values(comp.props.shape)) nestedComponents(schema, nameOf, found);\n    nested.set(name, found);\n  }\n  const stale = (s: unknown) => {\n    const name = nameOf.get(s)!;\n    return removed.has(name) || byName.get(name)!.props !== s;\n  };\n  const slotted = new Set([...placements.keys()].map((path) => path.split(\".\")[0]!));\n  const rebuilt = new Set([...byName.keys()].filter((n) => slotted.has(n)));\n  for (const [name, found] of nested) if ([...found].some(stale)) rebuilt.add(name);\n  for (let grew = true; grew;) {\n    grew = false;\n    for (const [name, found] of nested) {\n      if (rebuilt.has(name) || ![...found].some((s) => rebuilt.has(nameOf.get(s)!))) continue;\n      rebuilt.add(name);\n      grew = true;\n    }\n  }\n  return rebuilt;\n}\n\n// Card(body: Stack, tags?: (Text | Image)[]) -> Stack, Text, Image; stops at each component\nfunction nestedComponents(\n  schema: unknown,\n  nameOf: Map<unknown, string>,\n  found: Set<unknown>,\n  seen = new Set<unknown>(),\n): void {\n  if (nameOf.has(schema)) return void found.add(schema);\n  const def = getZodDef(schema);\n  if (!def || def.type === \"lazy\" || seen.has(schema)) return;\n  seen.add(schema);\n  for (const [key, value] of Object.entries(def)) {\n    if (key === \"checks\") continue;\n    rebindField(key, value, (child) => nestedComponents(child, nameOf, found, seen));\n  }\n}\n\n// A def field holds a schema, an array of schemas, a shape of schemas, or plain data\nfunction rebindField(key: string, value: unknown, walk: (s: unknown) => unknown): unknown {\n  if (getZodDef(value)) return walk(value);\n  if (Array.isArray(value)) return value.map(walk);\n  if (key !== \"shape\") return value;\n  const shape: Record<string, unknown> = {};\n  for (const [prop, child] of Object.entries(value as object)) shape[prop] = walk(child);\n  return shape;\n}\n\n// Arrays and shapes are rebuilt on every walk, so compare their entries, not their identity\nfunction sameField(next: unknown, old: any): boolean {\n  if (next === old) return true;\n  if (getZodDef(next)) return false;\n  const entries = Object.entries(next as object);\n  return entries.length === Object.keys(old).length && entries.every(([i, c]) => c === old[i]);\n}\n\n// Copy a schema with a patched def, keeping its prompt tags and metadata.\nfunction cloneSchema(s: unknown, patch: Record<string, unknown>): unknown {\n  const schema = s as z.$ZodType;\n  const copy = z.clone(schema, z.util.mergeDefs(schema._zod.def, patch) as any);\n  copySchemaTags(schema, copy);\n  if (isReactiveSchema(schema)) markReactive(copy);\n  const meta = z.globalRegistry.get(schema);\n  if (meta) z.globalRegistry.add(copy, meta);\n  return copy;\n}\n\n// Media: [\"Image\", \"Frame\"] with Frame removed -> Media: [\"Image\"]; a group left empty is dropped\nfunction withoutRemoved(groups: ComponentGroup[] | undefined, removed: Set<string>) {\n  return groups\n    ?.map((g) => ({ ...g, components: g.components.filter((n) => !removed.has(n)) }))\n    .filter((g) => g.components.length);\n}\n","import { literal, object } from \"zod/v4\";\nimport type * as z from \"zod/v4/core\";\nimport type { ActionRef } from \"./parser/builtins\";\nimport { actionRef, assertV4Schema } from \"./signature\";\n\nfunction assertParamsObject(params: z.$ZodType, name: string): void {\n  assertV4Schema(params, name);\n  if (params?._zod?.def.type !== \"object\") {\n    throw new Error(`[OpenUI] \"${name}\" params must be a z.object().`);\n  }\n}\n\n/** defineFunction({name: \"Percent\", params, fn}) -> called as @Percent(done, total) */\nexport interface DefinedFunction<\n  T extends z.$ZodObject = z.$ZodObject,\n  R extends z.$ZodType | undefined = z.$ZodType | undefined,\n> {\n  name: string;\n  description: string;\n  /** z.object({part, total}) -> @Percent(part, total), in key order */\n  params: T;\n  /** z.string() -> the return type in the prompt signature, checked at runtime */\n  returns?: R;\n  /** `@Percent(3, 4)` -> fn({part: 3, total: 4}); bad args or result, or a throw -> null */\n  fn: (args: z.infer<T>) => R extends z.$ZodType ? z.infer<R> : unknown;\n}\n\n/** createLibrary({ functions: [defineFunction({name: \"Percent\", ...})] }) */\nexport function defineFunction<\n  T extends z.$ZodObject,\n  R extends z.$ZodType | undefined = undefined,\n>(config: DefinedFunction<T, R>): DefinedFunction<T, R> {\n  assertParamsObject(config.params, config.name);\n  if (config.returns) assertV4Schema(config.returns, config.name);\n  return config;\n}\n\n/** A library action step, delivered to `onAction` as `{ type: name, params }` on click. */\nexport interface DefinedAction<T extends z.$ZodObject = z.$ZodObject, N extends string = string> {\n  name: N;\n  description: string;\n  /** Parameters as a Zod object. Key order is the positional order in programs. */\n  params: T;\n  /** For a slot that takes only some actions: `z.union([copy.ref, steps.OpenUrl.ref])` */\n  ref: ActionRef;\n}\n\n/** Define a library action for `createLibrary({ actions })`. */\nexport function defineAction<const N extends string, T extends z.$ZodObject>(\n  config: Omit<DefinedAction<T, N>, \"ref\">,\n): DefinedAction<T, N> {\n  assertParamsObject(config.params, config.name);\n  // copy.ref in JSON: {type: \"CopyToClipboard\", params: {text: string}}\n  const data = object({ type: literal(config.name), params: config.params });\n  return { ...config, ref: actionRef(config.name, data) };\n}\n","/** Built-in functions and action steps (defined like library ones), and reserved calls. */\n\nimport { z } from \"zod/v4\";\nimport {\n  defineAction,\n  defineFunction,\n  type DefinedAction,\n  type DefinedFunction,\n} from \"../functions\";\nimport { actionRef, tagSchemaId } from \"../signature\";\nimport type { ActionStep, CallDef, ParamMap } from \"./types\";\n\n/** Resolve a field path on an object. Supports dot-paths: \"state.name\" → obj.state.name */\nfunction resolveField(obj: any, path: string): unknown {\n  if (!path || obj == null) return undefined;\n  if (!path.includes(\".\")) return obj[path];\n  let cur = obj;\n  for (const p of path.split(\".\")) {\n    if (cur == null) return undefined;\n    cur = cur[p];\n  }\n  return cur;\n}\n\nfunction toNumber(val: unknown): number {\n  if (typeof val === \"number\") return val;\n  if (typeof val === \"string\") {\n    const n = Number(val);\n    return isNaN(n) ? 0 : n;\n  }\n  if (typeof val === \"boolean\") return val ? 1 : 0;\n  return 0;\n}\n\nconst sumOf = (arr: unknown[]) => arr.reduce((a: number, b: unknown) => a + toNumber(b), 0);\nconst array = () => z.array(z.any());\nconst numbers = () => z.object({ numbers: z.array(z.number()) });\nconst number = () => z.object({ number: z.number() });\n\n/** A built-in function. A lazy one (@Each) has no `fn`: the evaluator runs it on raw args. */\nexport type BuiltinFunction = Omit<DefinedFunction<any, any>, \"fn\"> & {\n  fn?: (args: any) => unknown;\n  lazy?: true;\n};\n\nconst builtins: BuiltinFunction[] = [\n  defineFunction({\n    name: \"Count\",\n    description: \"Returns array length\",\n    params: z.object({ array: array() }),\n    returns: z.number(),\n    fn: ({ array }) => (Array.isArray(array) ? array.length : 0),\n  }),\n  defineFunction({\n    name: \"First\",\n    description: \"Returns first element of array\",\n    params: z.object({ array: array() }),\n    returns: z.any(),\n    fn: ({ array }) => (Array.isArray(array) ? (array[0] ?? null) : null),\n  }),\n  defineFunction({\n    name: \"Last\",\n    description: \"Returns last element of array\",\n    params: z.object({ array: array() }),\n    returns: z.any(),\n    fn: ({ array }) => (Array.isArray(array) ? (array[array.length - 1] ?? null) : null),\n  }),\n  defineFunction({\n    name: \"Sum\",\n    description: \"Sum of numeric array\",\n    params: numbers(),\n    returns: z.number(),\n    fn: ({ numbers }) => (Array.isArray(numbers) ? sumOf(numbers) : 0),\n  }),\n  defineFunction({\n    name: \"Avg\",\n    description: \"Average of numeric array\",\n    params: numbers(),\n    returns: z.number(),\n    fn: ({ numbers }) =>\n      Array.isArray(numbers) && numbers.length ? sumOf(numbers) / numbers.length : 0,\n  }),\n  defineFunction({\n    name: \"Min\",\n    description: \"Minimum value in array\",\n    params: numbers(),\n    returns: z.number(),\n    fn: ({ numbers }) =>\n      Array.isArray(numbers) && numbers.length\n        ? numbers.reduce((acc, b) => Math.min(acc, toNumber(b)), toNumber(numbers[0]))\n        : 0,\n  }),\n  defineFunction({\n    name: \"Max\",\n    description: \"Maximum value in array\",\n    params: numbers(),\n    returns: z.number(),\n    fn: ({ numbers }) =>\n      Array.isArray(numbers) && numbers.length\n        ? numbers.reduce((acc, b) => Math.max(acc, toNumber(b)), toNumber(numbers[0]))\n        : 0,\n  }),\n  defineFunction({\n    name: \"Sort\",\n    description: 'Sort array by field. Direction: \"asc\" (default) or \"desc\"',\n    params: z.object({\n      array: array(),\n      field: z.string(),\n      direction: z.enum([\"asc\", \"desc\"]).optional(),\n    }),\n    returns: array(),\n    fn: ({ array, field, direction }) => {\n      if (!Array.isArray(array)) return array;\n      const f = String(field ?? \"\");\n      const desc = String(direction ?? \"asc\") === \"desc\";\n      return [...array].sort((a: any, b: any) => {\n        const av = f ? resolveField(a, f) : a;\n        const bv = f ? resolveField(b, f) : b;\n        const aIsNumeric =\n          typeof av === \"number\" || (typeof av === \"string\" && !isNaN(Number(av)) && av !== \"\");\n        const bIsNumeric =\n          typeof bv === \"number\" || (typeof bv === \"string\" && !isNaN(Number(bv)) && bv !== \"\");\n        if (aIsNumeric && bIsNumeric) {\n          const diff = toNumber(av) - toNumber(bv);\n          return desc ? -diff : diff;\n        }\n        const cmp = String(av ?? \"\").localeCompare(String(bv ?? \"\"));\n        return desc ? -cmp : cmp;\n      });\n    },\n  }),\n  defineFunction({\n    name: \"Filter\",\n    description: \"Filter array by field value\",\n    params: z.object({\n      array: array(),\n      field: z.string(),\n      operator: z.enum([\"==\", \"!=\", \">\", \"<\", \">=\", \"<=\", \"contains\"]),\n      value: z.any(),\n    }),\n    returns: array(),\n    fn: ({ array, field, operator, value }) => {\n      if (!Array.isArray(array)) return [];\n      const f = String(field ?? \"\");\n      const o = String(operator ?? \"==\");\n      return array.filter((item: any) => {\n        const v = f ? resolveField(item, f) : item;\n        switch (o) {\n          case \"==\":\n            return v == value;\n          case \"!=\":\n            return v != value;\n          case \">\":\n            return toNumber(v) > toNumber(value);\n          case \"<\":\n            return toNumber(v) < toNumber(value);\n          case \">=\":\n            return toNumber(v) >= toNumber(value);\n          case \"<=\":\n            return toNumber(v) <= toNumber(value);\n          case \"contains\":\n            return String(v ?? \"\").includes(String(value ?? \"\"));\n          default:\n            return false;\n        }\n      });\n    },\n  }),\n  defineFunction({\n    name: \"Round\",\n    description: \"Round to N decimal places (default 0)\",\n    params: z.object({ number: z.number(), decimals: z.number().optional() }),\n    returns: z.number(),\n    fn: ({ number, decimals }) => {\n      const num = toNumber(number);\n      const d = decimals != null ? toNumber(decimals) : 0;\n      const factor = Math.pow(10, d);\n      return Math.round(num * factor) / factor;\n    },\n  }),\n  defineFunction({\n    name: \"Abs\",\n    description: \"Absolute value\",\n    params: number(),\n    returns: z.number(),\n    fn: ({ number }) => Math.abs(toNumber(number)),\n  }),\n  defineFunction({\n    name: \"Floor\",\n    description: \"Round down to nearest integer\",\n    params: number(),\n    returns: z.number(),\n    fn: ({ number }) => Math.floor(toNumber(number)),\n  }),\n  defineFunction({\n    name: \"Ceil\",\n    description: \"Round up to nearest integer\",\n    params: number(),\n    returns: z.number(),\n    fn: ({ number }) => Math.ceil(toNumber(number)),\n  }),\n  {\n    name: \"Each\",\n    description:\n      \"Evaluate template for each element. varName is the loop variable — use it ONLY inside the template expression (inline). Do NOT create a separate statement for the template.\",\n    params: z.object({ array: array(), varName: z.string(), template: z.any() }),\n    lazy: true,\n  },\n];\n\n/** All built-in functions by name, in prompt order. */\nexport const BUILTINS: Record<string, BuiltinFunction> = Object.fromEntries(\n  builtins.map((b) => [b.name, b]),\n);\n\n/** Maps parser-level action step names → runtime step type values. Single source of truth. */\nexport const ACTION_STEPS = {\n  Run: \"run\",\n  ToAssistant: \"continue_conversation\",\n  OpenUrl: \"open_url\",\n  Set: \"set\",\n  Reset: \"reset\",\n} as const;\n\n/** A schema that only names its type in prompt signatures, e.g. `$variable`. */\nfunction named(id: string) {\n  const schema = z.any();\n  tagSchemaId(schema, id);\n  return schema;\n}\n\nconst openUrlData = () => z.object({ type: z.literal(\"open_url\"), url: z.string() });\nconst toAssistantData = () =>\n  z.object({ type: z.literal(\"continue_conversation\"), context: z.string().optional() });\n\nconst actionSchema = z.union([\n  openUrlData(),\n  toAssistantData(),\n  z.object({ type: z.string(), params: z.record(z.string(), z.any()).optional() }),\n]);\ntagSchemaId(actionSchema, \"ActionExpression\");\n\n/**\n * Schema for a component's action prop: `action: action().optional()`. Tagged\n * `ActionExpression`, so the prompt teaches the @step syntax (one @step, or\n * Action([...]) for several). Its JSON schema describes the legacy `{ type, ... }`\n * action objects, which also still work. Returns the same schema on every call.\n */\nexport function action() {\n  return actionSchema;\n}\n\n/** A slot schema naming one action, typed like an action prop: `z.union([steps.OpenUrl.ref])`. */\nexport type ActionRef = z.ZodType<z.infer<typeof actionSchema>>;\n\n/** Refs of the built-in steps that have a legacy JSON shape, for restricted action slots. */\nexport const steps = {\n  OpenUrl: { ref: actionRef(\"OpenUrl\", openUrlData()) },\n  ToAssistant: { ref: actionRef(\"ToAssistant\", toAssistantData()) },\n};\n\n/** The action `$defs` of every library, e.g. action: {$ref: \"#/$defs/ActionExpression\"}. */\nexport const ACTION_DEFS: Record<string, z.ZodType> = {\n  ActionExpression: actionSchema,\n  OpenUrl: steps.OpenUrl.ref,\n  ToAssistant: steps.ToAssistant.ref,\n};\n\n/** A built-in step: `step` builds it from coerced args; a lazy one reads raw args in the evaluator. */\nexport type BuiltinStep = DefinedAction<any> & {\n  step?: (args: any) => ActionStep;\n  lazy?: true;\n};\n\nconst builtinSteps: BuiltinStep[] = [\n  {\n    ...defineAction({\n      name: \"Run\",\n      description: \"Execute a Mutation or re-fetch a Query (ref must be a declared Query/Mutation)\",\n      params: z.object({ ref: named(\"Query | Mutation\") }),\n    }),\n    lazy: true,\n  },\n  {\n    ...defineAction({\n      name: \"ToAssistant\",\n      description:\n        'Send a message to the assistant (for conversational buttons like \"Tell me more\", \"Explain this\"). The optional context is any value (object, array, string, number) passed to the assistant as hidden data, e.g. @ToAssistant(\"Show details\", {orderId: 42})',\n      params: z.object({ message: z.string(), context: z.any().optional() }),\n    }),\n    ref: steps.ToAssistant.ref,\n    // The context may be any value and is passed through unchanged; null means none\n    step: ({ message, context }) => ({\n      type: ACTION_STEPS.ToAssistant,\n      message: String(message ?? \"\"),\n      context: context ?? undefined,\n    }),\n  },\n  {\n    ...defineAction({\n      name: \"OpenUrl\",\n      description: \"Navigate to a URL\",\n      params: z.object({ url: z.string() }),\n    }),\n    ref: steps.OpenUrl.ref,\n    step: ({ url }) => ({ type: ACTION_STEPS.OpenUrl, url: String(url ?? \"\") }),\n  },\n  {\n    ...defineAction({\n      name: \"Set\",\n      description: \"Set a $variable to a specific value\",\n      params: z.object({ variable: named(\"$variable\"), value: z.any() }),\n    }),\n    lazy: true,\n  },\n  {\n    ...defineAction({\n      name: \"Reset\",\n      description:\n        'Reset $variables to their declared defaults; pass several to reset each (e.g. @Reset($title, $priority) restores $title=\"\" and $priority=\"medium\")',\n      params: z.object({ variable: named(\"$variable\") }),\n    }),\n    lazy: true,\n  },\n];\n\n/** All built-in steps by name, in prompt order. */\nexport const BUILTIN_STEPS: Record<string, BuiltinStep> = Object.fromEntries(\n  builtinSteps.map((s) => [s.name, s]),\n);\n\nconst callDef = (kind: CallDef[\"kind\"], def: BuiltinFunction | BuiltinStep): CallDef => ({\n  kind,\n  params: Object.keys(def.params.shape).map((name) => ({ name, required: false })),\n  builtin: true,\n  ...(def.lazy ? { lazy: true } : {}),\n});\n\n/** The built-in functions, steps and Action: the base of every library's call registry. */\nexport const BUILTIN_CALLS: ReadonlyMap<string, CallDef> = new Map([\n  ...builtins.map((b) => [b.name, callDef(\"function\", b)] as const),\n  ...builtinSteps.map((s) => [s.name, callDef(\"action\", s)] as const),\n  [\n    \"Action\",\n    { kind: \"action\", params: [{ name: \"steps\", required: true }], builtin: true, lazy: true },\n  ],\n]);\n\n// getCallDefs(cat).get(\"Percent\") -> the library's @Percent; no cat -> built-ins only\nexport function getCallDefs(cat: ParamMap | undefined): ReadonlyMap<string, CallDef> {\n  return cat?.callDefs ?? BUILTIN_CALLS;\n}\n\n/** True for a built-in function, step, or Action (not a component). */\nexport function isBuiltin(name: string): boolean {\n  return BUILTIN_CALLS.has(name);\n}\n\n/** True for a step call: a built-in step, Action, or one of `actions`. */\nexport function isStep(name: string, actions?: object): boolean {\n  return (\n    BUILTIN_CALLS.get(name)?.kind === \"action\" ||\n    (!!actions && Object.prototype.hasOwnProperty.call(actions, name))\n  );\n}\n\n/** Reserved statement-level call names — not builtins, not components */\nexport const RESERVED_CALLS = { Query: \"Query\", Mutation: \"Mutation\" } as const;\n\n/** Check if a name is a reserved statement call (Query, Mutation) */\nexport function isReservedCall(name: string): boolean {\n  return name in RESERVED_CALLS;\n}\n\nexport { toNumber };\n","import type { PromptSpec } from \"../parser/prompt\";\nimport type { ParseResult, ValidationErrorCode } from \"../parser/types\";\nimport {\n  getPostHogConfig,\n  isRuntimeTelemetryEnabled,\n  normalizeProjectIdentity,\n  TELEMETRY_REQUEST_TIMEOUT_MS,\n  TELEMETRY_SCHEMA_VERSION,\n} from \"./shared\";\n\n/**\n * Telemetry disclosure\n *\n * Opt-in: nothing is sent unless OPENUI_RUNTIME_TELEMETRY_ENABLED=1 is set.\n *\n * Sent for sampled server-side system-prompt generations:\n * - Event timestamp, SDK and runtime versions, environment, CI status, and CI provider category\n * - API input shape, component count, tool count, and schema/sample versions\n * - Random event and runtime identifiers\n * - A locally computed SHA-256 prompt-configuration hash\n * - A locally computed SHA-256 project hash when a project identifier is available\n *\n * Sent for sampled server-side createParser().parse() calls:\n * - The same event/runtime metadata and optional locally computed project hash\n * - Outcome, incomplete/root booleans, structural counts, and fixed validation-code counts\n *\n * The configuration hash covers the root component, component names, signatures and\n * descriptions, component groups and notes, and generation-mode flags. The project hash\n * uses the normalized Git origin, REPOSITORY_URL, or working directory. Only the hashes\n * are sent.\n *\n * Not sent:\n * - Prompts, preambles, examples, additional rules, OpenUI Lang source, or generated output\n * - Raw component definitions, tool definitions, or tool examples\n * - Component/prop/statement names, error messages/paths, unresolved/orphaned names, or exceptions\n * - Git origins, working-directory paths, credentials, user identifiers, or chat data\n *\n * Browser and browser-worker environments never send this telemetry.\n */\ndeclare const __OPENUI_LANG_CORE_VERSION__: string;\n\nconst SYSTEM_PROMPT_EVENT_NAME = \"lang_core_system_prompt_generation_used\";\nconst PARSER_PARSE_EVENT_NAME = \"lang_core_parser_parse_used\";\nconst SYSTEM_PROMPT_SAMPLE_RATE = 0.1;\nconst PARSER_PARSE_SAMPLE_RATE = 0.1;\nconst SDK_VERSION =\n  typeof __OPENUI_LANG_CORE_VERSION__ === \"string\"\n    ? __OPENUI_LANG_CORE_VERSION__\n    : \"0.0.0-development\";\n\ntype Json = null | boolean | number | string | Json[] | { [key: string]: Json };\ntype InputShape = \"library_spec\" | \"legacy_prompt_spec\";\ntype Environment = \"production\" | \"development\" | \"test\" | \"unknown\";\ntype RuntimeName = \"node\" | \"bun\" | \"deno\" | \"edge\";\n\ninterface ProcessLike {\n  cwd?: () => string;\n  env?: Record<string, string | undefined>;\n  getBuiltinModule?: (specifier: string) => unknown;\n  release?: { name?: string };\n  versions?: Record<string, string | undefined>;\n}\n\ninterface RuntimeInfo {\n  name: RuntimeName;\n  version?: string;\n  env?: Record<string, string | undefined>;\n  process?: ProcessLike;\n}\n\ninterface TelemetryState {\n  projectHash?: Promise<string | undefined>;\n  runtimeId: string;\n}\n\ninterface SystemPromptCaptureProperties {\n  distinct_id: string;\n  $process_person_profile: false;\n  event_id: string;\n  telemetry_schema_version: typeof TELEMETRY_SCHEMA_VERSION;\n  system_prompt_config_hash_version: 1;\n  system_prompt_config_hash: string;\n  project_hash_version?: 1;\n  project_hash?: string;\n  component_count: number;\n  tool_count: number;\n  sdk_name: \"@openuidev/lang-core\";\n  sdk_version: string;\n  api_surface: \"generate_system_prompt\";\n  input_shape: InputShape;\n  runtime: RuntimeName;\n  runtime_version?: string;\n  environment: Environment;\n  ci: boolean;\n  ci_name?: string;\n  sample_rate: typeof SYSTEM_PROMPT_SAMPLE_RATE;\n}\n\ntype ParserParseOutcome = \"valid\" | \"invalid\" | \"no_renderable_root\" | \"threw\";\n\ninterface ParserParseResultProperties {\n  outcome: Exclude<ParserParseOutcome, \"threw\">;\n  incomplete: boolean;\n  has_renderable_root: boolean;\n  statement_count: number;\n  unresolved_count: number;\n  orphaned_count: number;\n  validation_error_count: number;\n  unknown_component_count: number;\n  missing_required_count: number;\n  null_required_count: number;\n  inline_reserved_count: number;\n  excess_args_count: number;\n}\n\ninterface ParserParseThrownProperties {\n  outcome: \"threw\";\n}\n\ntype ParserParseOutcomeProperties = ParserParseResultProperties | ParserParseThrownProperties;\n\ninterface ParserParseCaptureProperties {\n  distinct_id: string;\n  $process_person_profile: false;\n  event_id: string;\n  telemetry_schema_version: typeof TELEMETRY_SCHEMA_VERSION;\n  project_hash_version?: 1;\n  project_hash?: string;\n  sdk_name: \"@openuidev/lang-core\";\n  sdk_version: string;\n  api_surface: \"parser.parse\";\n  runtime: RuntimeName;\n  runtime_version?: string;\n  environment: Environment;\n  ci: boolean;\n  ci_name?: string;\n  sample_rate: typeof PARSER_PARSE_SAMPLE_RATE;\n}\n\nexport interface ParserParseCaptureContext {\n  state: TelemetryState;\n  runtime: RuntimeInfo;\n  environment: Environment;\n}\n\ninterface CiInfoSnapshot {\n  id: string | null;\n  isCI: boolean;\n}\n\nconst STATE_KEY = Symbol.for(\"@openuidev/lang-core/telemetry/v1\");\n\nexport function buildSystemPromptConfigProjection(spec: PromptSpec): Json {\n  const hasTools = (spec.tools?.length ?? 0) > 0;\n  const toolCalls = spec.toolCalls ?? hasTools;\n  const bindings = spec.bindings ?? toolCalls;\n\n  const components = Object.entries(spec.components)\n    .sort(([left], [right]) => left.localeCompare(right))\n    .map(([name, component]) => ({\n      name,\n      signature: component.signature,\n      description: component.description ?? null,\n    }));\n\n  const componentGroups = (spec.componentGroups ?? [])\n    .map((group) => ({\n      name: group.name,\n      components: [...group.components].sort(),\n      notes: [...(group.notes ?? [])],\n    }))\n    .sort((left, right) => left.name.localeCompare(right.name));\n\n  return {\n    root: spec.root ?? \"Root\",\n    components,\n    componentGroups,\n    modes: {\n      toolCalls,\n      bindings,\n      editMode: spec.editMode === true,\n      inlineMode: spec.inlineMode === true,\n    },\n  };\n}\n\nasync function sha256(value: string): Promise<string> {\n  const subtle = globalThis.crypto?.subtle;\n  if (!subtle) throw new Error(\"Web Crypto is unavailable\");\n\n  const bytes = new TextEncoder().encode(value);\n  const digest = await subtle.digest(\"SHA-256\", bytes);\n  return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nexport function calculateSystemPromptConfigHash(spec: PromptSpec): Promise<string> {\n  // The projection constructs object keys deterministically and sorts unordered collections.\n  const canonicalJson = JSON.stringify(buildSystemPromptConfigProjection(spec));\n  return sha256(canonicalJson);\n}\n\nfunction getProcess(): ProcessLike | undefined {\n  const candidate = (globalThis as typeof globalThis & { process?: unknown }).process;\n  if (!candidate || typeof candidate !== \"object\") return undefined;\n  return candidate as ProcessLike;\n}\n\nfunction hasBrowserWindow(): boolean {\n  const target = globalThis as typeof globalThis & {\n    document?: unknown;\n    navigator?: { product?: string };\n    window?: unknown;\n  };\n  return target.navigator?.product === \"ReactNative\" || Boolean(target.window && target.document);\n}\n\nfunction isBrowserWorker(): boolean {\n  const target = globalThis as typeof globalThis & {\n    WorkerGlobalScope?: { prototype: object };\n  };\n  const workerGlobalScope = target.WorkerGlobalScope;\n  return Boolean(workerGlobalScope && workerGlobalScope.prototype.isPrototypeOf(globalThis));\n}\n\nfunction detectRuntime(): RuntimeInfo | undefined {\n  if (hasBrowserWindow()) return undefined;\n\n  const target = globalThis as typeof globalThis & {\n    Bun?: { version?: string };\n    Deno?: {\n      version?: { deno?: string };\n    };\n    EdgeRuntime?: unknown;\n    WebSocketPair?: unknown;\n  };\n  const processLike = getProcess();\n\n  if (target.Bun && typeof target.Bun === \"object\") {\n    return {\n      name: \"bun\",\n      version: target.Bun.version,\n      env: processLike?.env,\n      process: processLike,\n    };\n  }\n\n  if (target.Deno && typeof target.Deno === \"object\") {\n    return { name: \"deno\", version: target.Deno.version?.deno };\n  }\n\n  if (typeof target.EdgeRuntime === \"string\") {\n    return { name: \"edge\", version: target.EdgeRuntime };\n  }\n\n  if (typeof target.WebSocketPair === \"function\") {\n    return { name: \"edge\" };\n  }\n\n  if (isBrowserWorker()) return undefined;\n\n  if (\n    processLike?.release?.name === \"node\" ||\n    (typeof processLike?.versions?.node === \"string\" && processLike.versions.node.length > 0)\n  ) {\n    return {\n      name: \"node\",\n      version: processLike.versions?.node,\n      env: processLike.env,\n      process: processLike,\n    };\n  }\n\n  return undefined;\n}\n\nfunction getEnvironment(env: Record<string, string | undefined> | undefined): Environment {\n  const value = env?.NODE_ENV;\n  if (value === \"production\" || value === \"development\" || value === \"test\") return value;\n  return \"unknown\";\n}\n\nfunction getState(): TelemetryState {\n  const registry = globalThis as typeof globalThis & { [STATE_KEY]?: TelemetryState };\n  registry[STATE_KEY] ??= {\n    runtimeId: globalThis.crypto.randomUUID(),\n  };\n  return registry[STATE_KEY];\n}\n\nfunction readGitOrigin(processLike: ProcessLike): Promise<string | undefined> {\n  const childProcess = processLike.getBuiltinModule?.(\"node:child_process\") as\n    | {\n        execFile?: (\n          file: string,\n          args: string[],\n          options: Record<string, unknown>,\n          callback: (error: unknown, stdout?: string) => void,\n        ) => unknown;\n      }\n    | undefined;\n  const execFile = childProcess?.execFile;\n  if (!execFile) return Promise.resolve(undefined);\n\n  // Repository discovery happens at most once and must never block the event loop.\n  return new Promise((resolve) => {\n    try {\n      execFile(\n        \"git\",\n        [\"config\", \"--local\", \"--get\", \"remote.origin.url\"],\n        {\n          encoding: \"utf8\",\n          timeout: 1_000,\n          windowsHide: true,\n        },\n        (error, stdout) => {\n          const origin = stdout?.trim();\n          resolve(error || !origin ? undefined : origin);\n        },\n      );\n    } catch {\n      resolve(undefined);\n    }\n  });\n}\n\nasync function getRepositoryIdentifier(\n  processLike: ProcessLike | undefined,\n): Promise<string | undefined> {\n  if (!processLike) return undefined;\n\n  const rawValue =\n    (await readGitOrigin(processLike)) || processLike.env?.REPOSITORY_URL || processLike.cwd?.();\n  return rawValue ? normalizeProjectIdentity(rawValue) || undefined : undefined;\n}\n\nexport function calculateProjectHash(repositoryIdentifier: string): Promise<string> {\n  const normalized = normalizeProjectIdentity(repositoryIdentifier);\n  if (!normalized) return Promise.reject(new TypeError(\"Repository identifier is empty\"));\n  return sha256(normalized);\n}\n\nfunction getProjectHash(state: TelemetryState, runtime: RuntimeInfo): Promise<string | undefined> {\n  if (runtime.name !== \"node\") return Promise.resolve(undefined);\n\n  state.projectHash ??= Promise.resolve()\n    .then(() => getRepositoryIdentifier(runtime.process))\n    .then((identifier) => (identifier ? calculateProjectHash(identifier) : undefined))\n    .catch(() => undefined);\n  return state.projectHash;\n}\n\nasync function getCIInfo(runtime: RuntimeInfo): Promise<CiInfoSnapshot> {\n  if (!runtime.env) return { id: null, isCI: false };\n\n  try {\n    const ciInfo = await import(\"ci-info\");\n    return { id: ciInfo.id, isCI: ciInfo.isCI };\n  } catch {\n    return { id: null, isCI: false };\n  }\n}\n\nasync function postCapture(\n  event: string,\n  properties:\n    SystemPromptCaptureProperties | (ParserParseCaptureProperties & ParserParseOutcomeProperties),\n  runtime: RuntimeInfo,\n): Promise<void> {\n  const postHog = getPostHogConfig(runtime.env);\n  await globalThis.fetch(postHog.captureUrl, {\n    method: \"POST\",\n    headers: { \"content-type\": \"application/json\" },\n    body: JSON.stringify({\n      api_key: postHog.apiKey,\n      event,\n      timestamp: new Date().toISOString(),\n      properties,\n    }),\n    keepalive: true,\n    signal: globalThis.AbortSignal.timeout(TELEMETRY_REQUEST_TIMEOUT_MS),\n  });\n}\n\nasync function sendSystemPromptCapture(\n  state: TelemetryState,\n  spec: PromptSpec,\n  configHash: Promise<string>,\n  inputShape: InputShape,\n  runtime: RuntimeInfo,\n  environment: Environment,\n): Promise<void> {\n  const [systemPromptConfigHash, projectHash, ciInfo] = await Promise.all([\n    configHash,\n    getProjectHash(state, runtime),\n    getCIInfo(runtime),\n  ]);\n\n  const properties: SystemPromptCaptureProperties = {\n    distinct_id: state.runtimeId,\n    $process_person_profile: false,\n    event_id: globalThis.crypto.randomUUID(),\n    telemetry_schema_version: TELEMETRY_SCHEMA_VERSION,\n    system_prompt_config_hash_version: 1,\n    system_prompt_config_hash: systemPromptConfigHash,\n    component_count: Object.keys(spec.components).length,\n    tool_count: spec.tools?.length ?? 0,\n    sdk_name: \"@openuidev/lang-core\",\n    sdk_version: SDK_VERSION,\n    api_surface: \"generate_system_prompt\",\n    input_shape: inputShape,\n    runtime: runtime.name,\n    runtime_version: runtime.version,\n    environment,\n    ci: ciInfo.isCI,\n    ...(ciInfo.id ? { ci_name: ciInfo.id } : {}),\n    sample_rate: SYSTEM_PROMPT_SAMPLE_RATE,\n    ...(projectHash\n      ? {\n          project_hash_version: 1 as const,\n          project_hash: projectHash,\n        }\n      : {}),\n  };\n\n  await postCapture(SYSTEM_PROMPT_EVENT_NAME, properties, runtime);\n}\n\nexport function recordSystemPromptGeneration(spec: PromptSpec, inputShape: InputShape): void {\n  try {\n    const runtime = detectRuntime();\n    if (\n      !runtime ||\n      typeof globalThis.fetch !== \"function\" ||\n      !globalThis.crypto?.subtle ||\n      typeof globalThis.crypto.randomUUID !== \"function\" ||\n      typeof globalThis.AbortSignal?.timeout !== \"function\"\n    ) {\n      return;\n    }\n\n    const env = runtime.env;\n    const environment = getEnvironment(env);\n    if (!isRuntimeTelemetryEnabled(env)) return;\n\n    // Reject 90% of calls before projection, hashing, repository lookup, or payload allocation.\n    if (Math.random() >= SYSTEM_PROMPT_SAMPLE_RATE) return;\n\n    const state = getState();\n    const configHash = calculateSystemPromptConfigHash(spec);\n\n    void Promise.resolve()\n      .then(() =>\n        sendSystemPromptCapture(state, spec, configHash, inputShape, runtime, environment),\n      )\n      .catch(() => undefined);\n  } catch {\n    // Telemetry must never affect prompt generation.\n  }\n}\n\nfunction getValidationErrorCounts(\n  result: ParseResult,\n): Omit<\n  ParserParseResultProperties,\n  | \"outcome\"\n  | \"incomplete\"\n  | \"has_renderable_root\"\n  | \"statement_count\"\n  | \"unresolved_count\"\n  | \"orphaned_count\"\n  | \"validation_error_count\"\n> {\n  const counts: Record<ValidationErrorCode, number> = {\n    \"unknown-component\": 0,\n    \"missing-required\": 0,\n    \"null-required\": 0,\n    \"inline-reserved\": 0,\n    \"excess-args\": 0,\n    \"type-mismatch\": 0,\n    \"unknown-function\": 0,\n    \"no-root\": 0,\n  };\n\n  for (const error of result.meta.errors) counts[error.code] += 1;\n\n  return {\n    unknown_component_count: counts[\"unknown-component\"],\n    missing_required_count: counts[\"missing-required\"],\n    null_required_count: counts[\"null-required\"],\n    inline_reserved_count: counts[\"inline-reserved\"],\n    excess_args_count: counts[\"excess-args\"],\n  };\n}\n\nfunction summarizeParserParse(result: ParseResult): ParserParseResultProperties {\n  return {\n    outcome:\n      result.meta.errors.length > 0 ? \"invalid\" : result.root ? \"valid\" : \"no_renderable_root\",\n    incomplete: result.meta.incomplete,\n    has_renderable_root: result.root !== null,\n    statement_count: result.meta.statementCount,\n    unresolved_count: result.meta.unresolved.length,\n    orphaned_count: result.meta.orphaned.length,\n    validation_error_count: result.meta.errors.length,\n    ...getValidationErrorCounts(result),\n  };\n}\n\nasync function sendParserParseCapture(\n  context: ParserParseCaptureContext,\n  outcome: ParserParseOutcomeProperties,\n): Promise<void> {\n  const { state, runtime, environment } = context;\n  const [projectHash, ciInfo] = await Promise.all([\n    getProjectHash(state, runtime),\n    getCIInfo(runtime),\n  ]);\n\n  const properties: ParserParseCaptureProperties & ParserParseOutcomeProperties = {\n    distinct_id: state.runtimeId,\n    $process_person_profile: false,\n    event_id: globalThis.crypto.randomUUID(),\n    telemetry_schema_version: TELEMETRY_SCHEMA_VERSION,\n    sdk_name: \"@openuidev/lang-core\",\n    sdk_version: SDK_VERSION,\n    api_surface: \"parser.parse\",\n    runtime: runtime.name,\n    runtime_version: runtime.version,\n    environment,\n    ci: ciInfo.isCI,\n    ...(ciInfo.id ? { ci_name: ciInfo.id } : {}),\n    sample_rate: PARSER_PARSE_SAMPLE_RATE,\n    ...outcome,\n    ...(projectHash\n      ? {\n          project_hash_version: 1 as const,\n          project_hash: projectHash,\n        }\n      : {}),\n  };\n\n  await postCapture(PARSER_PARSE_EVENT_NAME, properties, runtime);\n}\n\nexport function prepareParserParseTelemetry(): ParserParseCaptureContext | undefined {\n  try {\n    const runtime = detectRuntime();\n    if (\n      !runtime ||\n      typeof globalThis.fetch !== \"function\" ||\n      typeof globalThis.crypto?.randomUUID !== \"function\" ||\n      typeof globalThis.AbortSignal?.timeout !== \"function\"\n    ) {\n      return undefined;\n    }\n\n    const env = runtime.env;\n    if (!isRuntimeTelemetryEnabled(env)) return undefined;\n\n    // Reject 90% of calls before telemetry state, project lookup, or payload allocation.\n    if (Math.random() >= PARSER_PARSE_SAMPLE_RATE) return undefined;\n\n    return {\n      state: getState(),\n      runtime,\n      environment: getEnvironment(env),\n    };\n  } catch {\n    return undefined;\n  }\n}\n\nexport function captureParserParseResult(\n  context: ParserParseCaptureContext | undefined,\n  result: ParseResult,\n): void {\n  if (!context) return;\n\n  try {\n    const outcome = summarizeParserParse(result);\n    void Promise.resolve()\n      .then(() => sendParserParseCapture(context, outcome))\n      .catch(() => undefined);\n  } catch {\n    // Telemetry must never affect parsing.\n  }\n}\n\nexport function captureParserParseException(context: ParserParseCaptureContext | undefined): void {\n  if (!context) return;\n\n  try {\n    void Promise.resolve()\n      .then(() => sendParserParseCapture(context, { outcome: \"threw\" }))\n      .catch(() => undefined);\n  } catch {\n    // Telemetry must never affect parsing or replace the original thrown value.\n  }\n}\n","/**\n * Structural validator for your own library.\n * Hand-rolled walker — reports every issue in one pass.\n */\nimport type { LibrarySpec } from \"./prompt\";\n\nexport interface ChatLibraryIssue {\n  code:\n    | \"invalid-shape\"\n    | \"root-not-found\"\n    | \"unresolved-ref\"\n    | \"unknown-group-component\"\n    | \"invalid-required\";\n  message: string;\n  /** e.g. \"$defs/Card/properties/children/items\" */\n  path?: string;\n}\n\nconst REF_PATTERN = /^#\\/\\$defs\\/(.+)$/;\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Recursively collect every `$ref` and check it resolves within `$defs`. */\nfunction collectRefIssues(\n  node: unknown,\n  path: string,\n  defNames: Set<string>,\n  issues: ChatLibraryIssue[],\n): void {\n  if (Array.isArray(node)) {\n    node.forEach((item, i) => collectRefIssues(item, `${path}/${i}`, defNames, issues));\n    return;\n  }\n  if (!isPlainObject(node)) return;\n\n  const ref = node[\"$ref\"];\n  if (typeof ref === \"string\") {\n    const match = REF_PATTERN.exec(ref);\n    if (!match || !defNames.has(match[1] as string)) {\n      issues.push({\n        code: \"unresolved-ref\",\n        message: `Unresolvable $ref \"${ref}\" at ${path} — refs must be \"#/$defs/<name>\" pointing at a component in $defs.`,\n        path,\n      });\n    }\n  }\n\n  for (const [key, value] of Object.entries(node)) {\n    if (key === \"$ref\") continue;\n    collectRefIssues(value, `${path}/${key}`, defNames, issues);\n  }\n}\n\n/**\n * Structural validation of your own library.\n * Returns ALL issues found (empty array = valid).\n */\nexport function validateChatLibrary(library: LibrarySpec): ChatLibraryIssue[] {\n  const issues: ChatLibraryIssue[] = [];\n\n  if (!isPlainObject(library)) {\n    return [\n      {\n        code: \"invalid-shape\",\n        message: \"chatLibrary must be an object.\",\n      },\n    ];\n  }\n\n  const { root, schema, componentGroups } = library;\n\n  if (root !== undefined && (typeof root !== \"string\" || root.length === 0)) {\n    issues.push({\n      code: \"invalid-shape\",\n      message: \"chatLibrary.root, when present, must be a non-empty string.\",\n      path: \"root\",\n    });\n  }\n\n  if (!isPlainObject(schema)) {\n    issues.push({\n      code: \"invalid-shape\",\n      message: \"chatLibrary.schema must be an object with a $defs map of component schemas.\",\n      path: \"schema\",\n    });\n    return issues;\n  }\n\n  const defs = schema.$defs;\n  if (!isPlainObject(defs) || Object.keys(defs).length === 0) {\n    issues.push({\n      code: \"invalid-shape\",\n      message: \"chatLibrary.schema.$defs must be a non-empty object keyed by component name.\",\n      path: \"schema/$defs\",\n    });\n    return issues;\n  }\n\n  const defNames = new Set(Object.keys(defs));\n\n  if (typeof root === \"string\" && root.length > 0 && !defNames.has(root)) {\n    issues.push({\n      code: \"root-not-found\",\n      message: `Root component \"${root}\" was not found in schema.$defs. Available components: ${[...defNames].join(\", \")}.`,\n      path: \"root\",\n    });\n  }\n\n  for (const [name, def] of Object.entries(defs)) {\n    const defPath = `$defs/${name}`;\n    if (!isPlainObject(def)) {\n      issues.push({\n        code: \"invalid-shape\",\n        message: `${defPath} must be an object component schema.`,\n        path: defPath,\n      });\n      continue;\n    }\n\n    const properties = def[\"properties\"];\n    if (properties !== undefined && !isPlainObject(properties)) {\n      issues.push({\n        code: \"invalid-shape\",\n        message: `${defPath}/properties must be an object.`,\n        path: `${defPath}/properties`,\n      });\n    }\n\n    const required = def[\"required\"];\n    if (required !== undefined) {\n      if (!Array.isArray(required) || required.some((r) => typeof r !== \"string\")) {\n        issues.push({\n          code: \"invalid-required\",\n          message: `${defPath}/required must be an array of property names.`,\n          path: `${defPath}/required`,\n        });\n      } else {\n        const propKeys = new Set(isPlainObject(properties) ? Object.keys(properties) : []);\n        for (const r of required) {\n          if (!propKeys.has(r)) {\n            issues.push({\n              code: \"invalid-required\",\n              message: `${defPath} lists required property \"${r}\" that is not in properties.`,\n              path: `${defPath}/required`,\n            });\n          }\n        }\n      }\n    }\n\n    collectRefIssues(properties, `${defPath}/properties`, defNames, issues);\n  }\n\n  for (const group of componentGroups ?? []) {\n    if (\n      !isPlainObject(group) ||\n      typeof group.name !== \"string\" ||\n      !Array.isArray(group.components)\n    ) {\n      issues.push({\n        code: \"invalid-shape\",\n        message:\n          \"Each componentGroups entry must be {name: string, components: string[], notes?: string[]}.\",\n        path: \"componentGroups\",\n      });\n      continue;\n    }\n    for (const comp of group.components) {\n      if (typeof comp !== \"string\" || !defNames.has(comp)) {\n        issues.push({\n          code: \"unknown-group-component\",\n          message: `Component group \"${group.name}\" references unknown component \"${String(comp)}\".`,\n          path: \"componentGroups\",\n        });\n      }\n    }\n  }\n\n  return issues;\n}\n","import type { CloudPromptOptions, LibrarySpec, SystemPromptOptions } from \"./prompt\";\nimport { validateChatLibrary } from \"./validate-library\";\n\n/** `]]>openui:config\\n` — request-direction config block header. Trailing newline is part of the wire contract. */\nconst CLOUD_CONFIG_MARKER = \"]]>openui:config\\n\";\n\n/**\n * Wire pin for OpenUI Cloud's built-in chat library when `generateSystemPrompt({ cloud: true })`\n * is called without your own library. Cloud rejects a non-numeric or too-old version.\n */\nconst CLOUD_CHAT_LIBRARY_VERSION = \"0.1.0\";\n\ntype CloudConfig =\n  | { libraryVersion: string }\n  | { chatLibrary: Omit<LibrarySpec, \"components\">; systemPromptOptions?: CloudPromptOptions };\n\nfunction pickCloudPromptOptions(\n  options: SystemPromptOptions | CloudPromptOptions | undefined,\n): CloudPromptOptions | undefined {\n  if (!options) return undefined;\n  const picked: CloudPromptOptions = {};\n  if (options.examples) picked.examples = options.examples;\n  if (options.preamble) picked.preamble = options.preamble;\n  if (options.additionalRules) picked.additionalRules = options.additionalRules;\n  return Object.keys(picked).length > 0 ? picked : undefined;\n}\n\nexport function generateCloudConfig(spec: {\n  library?: LibrarySpec;\n  promptOptions?: SystemPromptOptions | CloudPromptOptions;\n  instructions?: string;\n}): string {\n  let config: CloudConfig;\n\n  if (spec.library) {\n    const issues = validateChatLibrary(spec.library);\n    if (issues.length > 0) {\n      throw new Error(\n        `[generateSystemPrompt] Invalid library: ${issues.map((i) => i.message).join(\" \")}`,\n      );\n    }\n    const { components: _components, ...chatLibrary } = spec.library;\n    const promptOptions = pickCloudPromptOptions(spec.promptOptions);\n    config = {\n      chatLibrary,\n      ...(promptOptions ? { systemPromptOptions: promptOptions } : {}),\n    };\n  } else {\n    if (spec.promptOptions && pickCloudPromptOptions(spec.promptOptions)) {\n      throw new Error(\n        \"[generateSystemPrompt] promptOptions requires a library — the built-in library ignores it.\",\n      );\n    }\n    config = { libraryVersion: CLOUD_CHAT_LIBRARY_VERSION };\n  }\n\n  const block = `${CLOUD_CONFIG_MARKER}${JSON.stringify(config)}`;\n  return spec.instructions ? `${block}\\n${spec.instructions}` : block;\n}\n","import { schemaSignature } from \"../signature\";\nimport { recordSystemPromptGeneration } from \"../telemetry/runtime\";\nimport { BUILTIN_STEPS, BUILTINS, type BuiltinStep } from \"./builtins\";\nimport { generateCloudConfig } from \"./cloud-config\";\nimport type { LibraryJSONSchema } from \"./types\";\n\n// ─── PromptSpec types (JSON-serializable, no Zod deps) ──────────────────────\n\n/**\n * Tool schema for prompt generation — describes a tool the LLM can use via Query()/Mutation().\n * Shape inspired by MCP's tool schema (name, description, inputSchema, annotations).\n */\nexport interface ToolSpec {\n  name: string;\n  description?: string;\n  inputSchema: Record<string, unknown>;\n  outputSchema: Record<string, unknown>;\n  annotations?: { readOnlyHint?: boolean; destructiveHint?: boolean };\n}\n\nexport interface ComponentPromptSpec {\n  signature: string; // pre-built: \"Card(children: Component[], title?: string)\"\n  description?: string;\n}\n\nexport interface ComponentGroup {\n  name: string;\n  components: string[];\n  notes?: string[];\n}\n\nexport interface BaseSpec {\n  id?: string;\n  root?: string;\n  components: Record<string, ComponentPromptSpec>;\n  componentGroups?: ComponentGroup[];\n  /** Library functions, listed next to the built-ins. Signatures are pre-built. */\n  functions?: Record<string, ComponentPromptSpec>;\n  /** Custom library actions, listed with the built-in action steps. Signatures are pre-built. */\n  actions?: Record<string, ComponentPromptSpec>;\n}\n\nexport interface PromptSpec extends BaseSpec {\n  tools?: (string | ToolSpec)[];\n  editMode?: boolean;\n  inlineMode?: boolean;\n  /** Enable Query(), Mutation(), @Run, tool workflow. Default: true if tools provided. */\n  toolCalls?: boolean;\n  /** Enable $variables, @Set, @Reset, interactive filters. Default: true if toolCalls. */\n  bindings?: boolean;\n  /** List the built-in functions (@Count, @Sum, ...). Default: true if toolCalls or bindings. */\n  builtinFunctions?: boolean;\n  preamble?: string;\n  /** General examples (static/layout patterns). Both `examples` and `toolExamples` are included when present. */\n  examples?: string[];\n  /** Tool-specific examples (Query/Mutation patterns). Both `examples` and `toolExamples` are included when present. */\n  toolExamples?: string[];\n  additionalRules?: string[];\n}\n\nexport interface LibrarySpec extends BaseSpec {\n  schema?: LibraryJSONSchema;\n}\n\n// ─── JSON Schema → type string helper ───────────────────────────────────────\n\nfunction jsonSchemaTypeStr(schema: Record<string, unknown>): string {\n  const type = schema.type as string | undefined;\n\n  if (type === \"string\") {\n    const enumVals = schema.enum as string[] | undefined;\n    if (enumVals) return enumVals.map((v) => `\"${v}\"`).join(\" | \");\n    return \"string\";\n  }\n  if (type === \"number\" || type === \"integer\") return \"number\";\n  if (type === \"boolean\") return \"boolean\";\n  if (type === \"array\") {\n    const items = schema.items as Record<string, unknown> | undefined;\n    if (items) return `${jsonSchemaTypeStr(items)}[]`;\n    return \"any[]\";\n  }\n  if (type === \"object\") {\n    const props = schema.properties as Record<string, Record<string, unknown>> | undefined;\n    if (props && Object.keys(props).length > 0) {\n      const required = (schema.required as string[]) ?? [];\n      const fields = Object.entries(props).map(([k, v]) => {\n        const opt = required.includes(k) ? \"\" : \"?\";\n        return `${k}${opt}: ${jsonSchemaTypeStr(v)}`;\n      });\n      return `{${fields.join(\", \")}}`;\n    }\n    return \"object\";\n  }\n\n  return \"any\";\n}\n\n/** Generate a default-values hint object for an output schema. */\nfunction defaultForSchema(schema: Record<string, unknown>): unknown {\n  const type = schema.type as string | undefined;\n  if (type === \"string\") return \"\";\n  if (type === \"number\" || type === \"integer\") return 0;\n  if (type === \"boolean\") return false;\n  if (type === \"array\") return [];\n  if (type === \"object\") {\n    const props = schema.properties as Record<string, Record<string, unknown>> | undefined;\n    if (props && Object.keys(props).length > 0) {\n      const result: Record<string, unknown> = {};\n      for (const [k, v] of Object.entries(props)) {\n        result[k] = defaultForSchema(v);\n      }\n      return result;\n    }\n    return {};\n  }\n  return null;\n}\n\n// ─── Section generators ─────────────────────────────────────────────────────\n\nconst PREAMBLE = `You are an AI assistant that responds using openui-lang, a declarative UI language. Your ENTIRE response must be valid openui-lang code — no markdown, no explanations, just openui-lang.`;\n\nfunction syntaxRules(\n  rootName: string,\n  flags: { supportsExpressions: boolean; bindings: boolean },\n): string {\n  const lines = [\n    \"## Syntax Rules\",\n    \"\",\n    \"1. Each statement is on its own line: `identifier = Expression`\",\n    `2. \\`root\\` is the entry point — every program must define \\`root = ${rootName}(...)\\``,\n    '3. Expressions are: strings (\"...\"), numbers, booleans (true/false), null, arrays ([...]), objects ({...}), or component calls TypeName(arg1, arg2, ...)',\n    \"4. Use references for readability: define `name = ...` on one line, then use `name` later\",\n    \"5. EVERY variable (except root) MUST be referenced by at least one other variable. Unreferenced variables are silently dropped and will NOT render. Always include defined variables in their parent's children/items array.\",\n    '6. Arguments are POSITIONAL (order matters, not names). Write `SomeComp([children], \"row\", \"l\")` NOT `SomeComp([children], direction: \"row\", gap: \"l\")` — colon syntax is NOT supported and silently breaks',\n    \"7. Optional arguments can be omitted from the end\",\n  ];\n\n  let ruleNum = 8;\n  if (flags.bindings) {\n    lines.push(\n      `${ruleNum++}. Declare mutable state with \\`$varName = defaultValue\\`. Components marked with \\`$binding\\` can read/write these. Undeclared $variables are auto-created with null default.`,\n    );\n  }\n  if (flags.supportsExpressions) {\n    lines.push(\n      `${ruleNum++}. String concatenation: \\`\"text\" + $var + \"more\"\\``,\n      `${ruleNum++}. Dot member access: \\`query.field\\` reads a field; on arrays it extracts that field from every element`,\n      `${ruleNum++}. Index access: \\`arr[0]\\`, \\`data[index]\\``,\n      `${ruleNum++}. Arithmetic operators: +, -, *, /, % (work on numbers; + is string concat when either side is a string)`,\n      `${ruleNum++}. Comparison: ==, !=, >, <, >=, <=`,\n      `${ruleNum++}. Logical: &&, ||, ! (prefix)`,\n      `${ruleNum++}. Ternary: \\`condition ? valueIfTrue : valueIfFalse\\``,\n      `${ruleNum++}. Parentheses for grouping: \\`(a + b) * c\\``,\n    );\n  }\n\n  lines.push(\"- Strings use double quotes with backslash escaping\");\n\n  return lines.join(\"\\n\");\n}\n\nfunction functionLine(f: { signature: string; description?: string }): string {\n  return f.description ? `@${f.signature} — ${f.description}` : `@${f.signature}`;\n}\n\nfunction builtinFunctionsSection(custom: string[], toolCalls: boolean): string {\n  const lines = [\n    ...Object.values(BUILTINS).map((b) =>\n      functionLine({ ...b, signature: schemaSignature(b.name, b.params, b.returns) }),\n    ),\n    ...custom,\n  ].join(\"\\n\");\n\n  return `## Built-in Functions\n\nData functions prefixed with \\`@\\` to distinguish from components. These are the ONLY functions available — do NOT invent new ones.\nUse @-prefixed built-in functions (@Count, @Sum, @Avg, @Min, @Max, @Round) on ${toolCalls ? \"Query results\" : \"data\"}. Do NOT hardcode computed values.\n\n${lines}\n\nBuiltins compose — output of one is input to the next:\n\\`@Count(@Filter(data.rows, \"field\", \"==\", \"val\"))\\` for KPIs/chart values, \\`@Round(@Avg(data.rows.score), 1)\\`, \\`@Each(data.rows, \"item\", Comp(item.field))\\` for per-item rendering.\nArray pluck: \\`data.rows.field\\` extracts a field from every row → use with @Sum, @Avg, charts, tables.\n\nIMPORTANT @Each rule: The loop variable (e.g. \"item\") is ONLY available inside the @Each template expression. Always inline the template — do NOT extract it to a separate statement.\nCORRECT: \\`list = @Each(rows, \"t\", Comp(t.name))\\`\nWRONG: \\`item = Comp(t.name)\\` then \\`list = @Each(rows, \"t\", item)\\`, because t is undefined in item.`;\n}\n\nfunction querySection(): string {\n  return `## Query — Live Data Fetching\n\nFetch data from available tools. Returns defaults instantly, swaps in real data when it arrives.\n\n\\`\\`\\`\nmetrics = Query(\"tool_name\", {arg1: value, arg2: $binding}, {defaultField: 0, defaultData: []}, refreshInterval?)\n\\`\\`\\`\n\n- First arg: tool name (string)\n- Second arg: arguments object (may reference $bindings — re-fetches automatically on change)\n- Third arg: default data (rendered immediately before fetch resolves)\n- Fourth arg (optional): refresh interval in seconds (e.g. 30 for auto-refresh every 30s)\n- Use dot access on results: metrics.totalEvents, metrics.data.day (array pluck)\n- Query results must use regular identifiers: \\`metrics = Query(...)\\`, NOT \\`$metrics = Query(...)\\`\n- Manual refresh: \\`Button(\"Refresh\", Action([@Run(query1), @Run(query2)]), \"secondary\")\\` — re-fetches the listed queries\n- Refresh all queries: create Action with @Run for each query`;\n}\n\nfunction mutationSection(): string {\n  return `## Mutation — Write Operations\n\nExecute state-changing tool calls (create, update, delete). Unlike Query (auto-fetches on render), Mutation fires only on button click via Action.\n\n\\`\\`\\`\nresult = Mutation(\"tool_name\", {arg1: $binding, arg2: \"value\"})\n\\`\\`\\`\n\n- First arg: tool name (string)\n- Second arg: arguments object (evaluated with current $binding values at click time)\n- result.status: \"idle\" | \"loading\" | \"success\" | \"error\"\n- result.data: tool response on success\n- result.error: error message on failure\n- Mutation results use regular identifiers: \\`result = Mutation(...)\\`, NOT \\`$result\\`\n- Show loading state: \\`result.status == \"loading\" ? TextContent(\"Saving...\") : null\\``;\n}\n\nconst ACTION_HEADER = \"## Action — Button Behavior\";\n\n/** The built-in steps the prompt lists: @Run needs toolCalls, @Set and @Reset need bindings. */\nfunction builtinSteps(flags: { toolCalls: boolean; bindings: boolean }): BuiltinStep[] {\n  return Object.values(BUILTIN_STEPS).filter((s) => {\n    if (s.name === \"Run\") return flags.toolCalls;\n    if (s.name === \"Set\" || s.name === \"Reset\") return flags.bindings;\n    return true;\n  });\n}\n\nfunction actionSection(flags: { toolCalls: boolean; bindings: boolean }, custom: string[]): string {\n  const steps = [\n    ...builtinSteps(flags).map(\n      (s) => `- ${functionLine({ ...s, signature: schemaSignature(s.name, s.params) })}`,\n    ),\n    ...custom,\n  ];\n\n  const examples: string[] = [];\n  if (flags.toolCalls) {\n    examples.push(`Example — mutation + refresh + reset (PREFERRED pattern):\n\\`\\`\\`\n$binding = \"default\"\nresult = Mutation(\"tool_name\", {field: $binding})\ndata = Query(\"tool_name\", {}, {rows: []})\nonSubmit = Action([@Run(result), @Run(data), @Reset($binding)])\n\\`\\`\\``);\n  }\n\n  examples.push(`Example — simple nav:\n\\`\\`\\`\nviewBtn = Button(\"View\", @OpenUrl(\"https://example.com\"))\n\\`\\`\\``);\n\n  const rules = [\n    '- An action can be assigned to a variable or inlined: Button(\"Go\", onSubmit) and Button(\"Go\", Action([...])) both work',\n  ];\n  if (flags.toolCalls) {\n    rules.push(\n      \"- If a @Run(mutation) step fails, remaining steps are skipped (halt on failure)\",\n      \"- @Run(queryRef) re-fetches the query (fire-and-forget, cannot fail)\",\n    );\n  }\n\n  return `${ACTION_HEADER}\n\nAn action wires a button click to operations. Pass one @-prefixed step bare, e.g. Button(\"Ask\", @ToAssistant(\"Tell me more\")). Put several steps in Action([...]), e.g. Button(\"Read\", Action([@OpenUrl(\"https://example.com\"), @ToAssistant(\"Summarize this page\")])). Steps execute in order.\nButtons without an action automatically send their label to the assistant (equivalent to @ToAssistant(label)).\n\nAvailable steps:\n${steps.join(\"\\n\")}\n\n${examples.join(\"\\n\\n\")}\n\n${rules.join(\"\\n\")}`;\n}\n\nfunction interactiveFiltersSection(): string {\n  return `## Interactive Filters\n\nTo let the user filter data with a dropdown:\n1. Declare a $variable with a default: \\`$dateRange = \"14\"\\`\n2. Create a Select with name, items, and binding: \\`Select(\"dateRange\", [SelectItem(\"7\", \"Last 7 days\"), ...], null, null, $dateRange)\\`\n3. Wrap in FormControl for a label: \\`FormControl(\"Date Range\", Select(...))\\`\n4. Pass $dateRange in Query args: \\`Query(\"tool\", {dateRange: $dateRange}, {defaults})\\`\n5. When the user changes the Select, $dateRange updates and the Query automatically re-fetches\n\nFILTER WIRING RULE: If a $binding filter is visible in the UI, EVERY relevant Query MUST reference that $binding in its args. Never show a filter dropdown while hardcoding the query args.\n\nRules for $variables:\n- $variables hold simple values (strings or numbers), NOT arrays or objects\n- $variables must be bound to a Select/Input component via the value argument (last positional arg) to be interactive\n- Queries must use regular identifiers (NOT $variables): \\`metrics = Query(...)\\` not \\`$metrics = Query(...)\\`\n- **Auto-declare**: You do NOT need to explicitly declare $variables. If you use \\`$foo\\` without declaring it, the parser auto-creates \\`$foo = null\\`. You can still declare explicitly to set a default: \\`$days = \"14\"\\`\n\n## Forms\n\nSimple form — no $bindings needed. Field values are managed internally by the Form via the name prop:\n\\`\\`\\`\ncontactForm = Form(\"contact\", submitBtn, [nameField, emailField])\nnameField = FormControl(\"Name\", Input(\"name\", \"Your name\", \"text\", {required: true}))\nemailField = FormControl(\"Email\", Input(\"email\", \"your@email.com\", \"email\", {required: true, email: true}))\nsubmitBtn = Button(\"Submit\")\n\\`\\`\\`\n\nUse $bindings when you need to read field values elsewhere (in Action context, Query args, or conditionals). They are auto-declared:\n\\`\\`\\`\n$role = \"engineer\"\ncontactForm = Form(\"contact\", submitBtn, [nameField, emailField, roleField])\nnameField = FormControl(\"Name\", Input(\"name\", \"Enter your name\", \"text\", {required: true}, $name))\nemailField = FormControl(\"Email\", Input(\"email\", \"Enter your email\", \"email\", {required: true, email: true}, $email))\nroleField = FormControl(\"Role\", Select(\"role\", [SelectItem(\"engineer\", \"Engineer\"), SelectItem(\"designer\", \"Designer\"), SelectItem(\"pm\", \"PM\")], null, {required: true}, $role))\nsubmitBtn = Button(\"Submit\")\n\\`\\`\\`\n\nFor form + mutation patterns (create, refresh, reset), see the Action section example above.\n\nIMPORTANT: Always add validation rules to form fields used with Mutations. Use OBJECT syntax: {required: true, email: true, minLength: 8}. The renderer shows error messages automatically and blocks submit when validation fails.`;\n}\n\nfunction editModeSection(): string {\n  return `## Edit Mode\n\nThe runtime merges by statement name: same name = replace, new name = append.\nOutput ONLY statements that changed or are new. Everything else is kept automatically.\n\n### Delete\nTo remove a component, re-declare its parent without that component in the parent's children array. The removed component and any statements only it referenced are automatically garbage-collected.\n\n### Patch size guide\n- Changing a title or label: 1 statement\n- Adding a component: 2-3 statements (the new component + parent update)\n- Removing a component: 1 statement (re-declare parent without the removed child)\n- Adding a filter + wiring to query: 3-5 statements\n- Restructuring into tabs: 5-10 statements\n\n### Rules\n- Reuse existing statement names exactly — do not rename\n- Do NOT re-emit unchanged statements — the runtime keeps them\n- A typical edit patch is 1-10 statements, not 20+\n- If the existing code already satisfies the request, output only the root statement\n- NEVER output the entire program as a patch. Only output what actually changes\n- If you are about to output more than 10 statements, reconsider — most edits need fewer`;\n}\n\nfunction streamingRules(\n  rootName: string,\n  flags: { supportsExpressions: boolean; toolCalls: boolean },\n): string {\n  const steps = [`1. \\`root = ${rootName}(...)\\` — UI shell appears immediately`];\n  if (flags.supportsExpressions) {\n    steps.push(\"2. $variable declarations — state ready for bindings\");\n    if (flags.toolCalls) {\n      steps.push(\n        \"3. Query statements — defaults resolve immediately so components render with data\",\n      );\n    }\n    const n = steps.length;\n    steps.push(`${n + 1}. Component definitions — fill in with data already available`);\n    steps.push(`${n + 2}. Data values — leaf content last`);\n  } else {\n    steps.push(\"2. Component definitions — fill in as they stream\");\n    steps.push(\"3. Data values — leaf content last\");\n  }\n\n  return `## Hoisting & Streaming (CRITICAL)\n\nopenui-lang supports hoisting: a reference can be used BEFORE it is defined. The parser resolves all references after the full input is parsed.\n\nDuring streaming, the output is re-parsed on every chunk. Undefined references are temporarily unresolved and appear once their definitions stream in. This creates a progressive top-down reveal — structure first, then data fills in.\n\n**Recommended statement order for optimal streaming:**\n${steps.join(\"\\n\")}\n\nAlways write the root = ${rootName}(...) statement first so the UI shell appears immediately, even before child data has streamed in.`;\n}\n\nfunction inlineModeSection(): string {\n  return `## Inline Mode\n\nYou are in inline mode. You can respond in two ways:\n\n### 1. Code response (when the user wants to CREATE or CHANGE the UI)\nWrap openui-lang code in triple-backtick fences. You can include explanatory text before/after:\n\nHere's your dashboard:\n\n\\`\\`\\`openui-lang\nroot = RootComp([header, content])\nheader = SomeHeader(\"Title\")\ncontent = SomeContent(\"Hello world\")\n\\`\\`\\`\n\nI created a simple layout with a header.\n\n### 2. Text-only response (when the user asks a QUESTION)\nIf the user asks \"what is this?\", \"explain the chart\", \"how does this work\", etc. — respond with plain text. Do NOT output any openui-lang code. The existing dashboard stays unchanged.\n\n### Rules\n- When the user asks for changes, output ONLY the changed/new statements in a fenced block\n- When the user asks a question, respond with text only — NO code. The dashboard stays unchanged.\n- The parser extracts code from fences automatically. Text outside fences is shown as chat.`;\n}\n\nfunction toolWorkflowSection(): string {\n  return `## Data Workflow\n\nWhen tools are available, follow this workflow:\n1. FIRST: Call the most relevant tool to inspect the real data shape before generating code\n2. Use Query() for READ operations (data that should stay live) — NEVER hardcode tool results as literal arrays or objects\n3. Use Mutation() for WRITE operations (create, update, delete) — triggered by button clicks via @Run(mutationRef)\n4. Use the real data from step 1 as condensed Query defaults (3-5 rows) so the UI renders immediately\n5. Use @-prefixed builtins (@Count, @Filter, @Sort, @Sum) on Query results for KPIs and aggregations — the runtime evaluates these live on every refresh\n6. Hardcoded arrays are ONLY for static display data (labels, options) where no tool exists\n\nWRONG — you called a tool and got data back, but you inlined the results:\n\\`\\`\\`\nopenCount = 2\nitem1 = SomeComp(\"first item title\")\nitem2 = SomeComp(\"second item title\")\nlist = SomeList([item1, item2])\nchart = SomeChart([\"A\", \"B\"], [12, 8])\n\\`\\`\\`\nThis is static — it shows stale data and won't update. Creating item1, item2, item3... manually is ALWAYS wrong when a tool exists.\n\nRIGHT — use Query() for live data, Mutation() for writes, @builtins to derive values:\n\\`\\`\\`\ndata = Query(\"tool_name\", {}, {rows: []})\nopenCount = @Count(@Filter(data.rows, \"field\", \"==\", \"value\"))\nlist = @Each(data.rows, \"item\", SomeComp(item.title, item.field))\ncreateResult = Mutation(\"create_tool\", {title: $title})\nsubmitBtn = Button(\"Create\", Action([@Run(createResult), @Run(data), @Reset($title)]))\n\\`\\`\\`\nEverything derives from the Query — when data refreshes, the entire dashboard updates automatically.`;\n}\n\nfunction importantRules(\n  rootName: string,\n  flags: { toolCalls: boolean; bindings: boolean },\n): string {\n  const verifyLines = [\n    `1. root = ${rootName}(...) is the FIRST line (for optimal streaming).`,\n    \"2. Every referenced name is defined. Every defined name (other than root) is reachable from root.\",\n  ];\n  if (flags.toolCalls) {\n    verifyLines.push(\"3. Every Query result is referenced by at least one component.\");\n  }\n  if (flags.bindings) {\n    verifyLines.push(\n      `${flags.toolCalls ? \"4\" : \"3\"}. Every $binding appears in at least one component or expression.`,\n    );\n  }\n  if (flags.toolCalls && flags.bindings) {\n    verifyLines.push(\"5. Every visible filter $binding appears in at least one Query args object.\");\n  }\n\n  return `## Important Rules\n- Choose components that best represent the content (tables for comparisons, charts for trends, forms for input, etc.)\n\n## Final Verification\nBefore finishing, walk your output and verify:\n${verifyLines.join(\"\\n\")}`;\n}\n\n// ─── Tool rendering ─────────────────────────────────────────────────────────\n\nfunction renderToolSignature(tool: ToolSpec): string {\n  let args = \"\";\n  if (tool.inputSchema) {\n    const props = (tool.inputSchema as any).properties as\n      Record<string, Record<string, unknown>> | undefined;\n    const required = ((tool.inputSchema as any).required as string[]) ?? [];\n    if (props && Object.keys(props).length > 0) {\n      args = Object.entries(props)\n        .map(([k, v]) => {\n          const opt = required.includes(k) ? \"\" : \"?\";\n          return `${k}${opt}: ${jsonSchemaTypeStr(v)}`;\n        })\n        .join(\", \");\n    }\n  }\n\n  let returnType = \"\";\n  if (tool.outputSchema) {\n    returnType = ` → ${jsonSchemaTypeStr(tool.outputSchema as Record<string, unknown>)}`;\n  }\n\n  let line = `- ${tool.name}(${args})${returnType}`;\n  if (tool.description) {\n    line += `\\n  ${tool.description}`;\n  }\n  return line;\n}\n\nfunction renderToolsSection(tools: (string | ToolSpec)[]): string {\n  const lines: string[] = [];\n\n  const stringTools: string[] = [];\n  const specTools: ToolSpec[] = [];\n\n  for (const tool of tools) {\n    if (typeof tool === \"string\") {\n      stringTools.push(tool);\n    } else {\n      specTools.push(tool);\n    }\n  }\n\n  lines.push(\"## Available Tools\");\n  lines.push(\"\");\n  lines.push(\n    \"Use these with Query() for read operations or Mutation() for write operations. The LLM decides which is appropriate based on the tool's purpose.\",\n  );\n  lines.push(\"\");\n  for (const t of stringTools) {\n    lines.push(`- ${t}`);\n  }\n  for (const t of specTools) {\n    lines.push(renderToolSignature(t));\n  }\n\n  // Default values hint for ToolSpec tools with outputSchema\n  const toolsWithOutput = specTools.filter((t) => t.outputSchema);\n  if (toolsWithOutput.length > 0) {\n    lines.push(\"\");\n    lines.push(\"### Default values for Query results\");\n    lines.push(\"\");\n    lines.push(\"Use these shapes as minimal Query defaults:\");\n    for (const t of toolsWithOutput) {\n      const defaults = defaultForSchema(t.outputSchema as Record<string, unknown>);\n      lines.push(`- ${t.name}: \\`${JSON.stringify(defaults)}\\``);\n    }\n  }\n\n  lines.push(\"\");\n  lines.push(\n    \"CRITICAL: Use ONLY the tools listed above in Query() and Mutation() calls. Do NOT invent or guess tool names. If the user asks for functionality that doesn't match any available tool, use realistic mock data instead of fabricating a tool call.\",\n  );\n\n  return lines.join(\"\\n\");\n}\n\n// ─── Component signatures ───────────────────────────────────────────────────\n\n// A restricted action slot in a signature, e.g. `share?: @CopyToClipboard | @OpenUrl`\nconst RESTRICTED_SLOT = /[:|] @[A-Z]/;\n\nfunction generateComponentSignatures(\n  spec: PromptSpec,\n  flags: { toolCalls: boolean; bindings: boolean; usesActionExpression: boolean },\n): string {\n  const lines = [\n    \"## Component Signatures\",\n    \"\",\n    \"Arguments marked with ? are optional. Sub-components can be inline or referenced; prefer references for better streaming.\",\n  ];\n  if (flags.usesActionExpression) {\n    const allSteps = [\n      ...builtinSteps(flags).map((step) => step.name),\n      ...Object.keys(spec.actions ?? {}),\n    ].map((name) => `@${name}`);\n    lines.push(\n      `Props typed \\`ActionExpression\\` accept one @step, or Action([@steps...]) for several. See the Action section for available steps (${allSteps.join(\", \")}).`,\n    );\n    if (Object.values(spec.components).some((c) => RESTRICTED_SLOT.test(c.signature ?? \"\"))) {\n      lines.push(\"Props typed like `@OpenUrl | @ToAssistant` accept only the steps listed.\");\n    }\n  }\n  const usesBindings =\n    flags.bindings || Object.values(spec.components).some((c) => c.signature?.includes(\"$binding\"));\n  if (usesBindings) {\n    lines.push(\"Props marked `$binding<type>` accept a `$variable` reference for two-way binding.\");\n  }\n\n  const formatSig = (comp: { signature: string; description?: string }) =>\n    comp.description ? `${comp.signature} — ${comp.description}` : comp.signature;\n\n  if (spec.componentGroups?.length) {\n    const grouped = new Set<string>();\n    for (const group of spec.componentGroups) {\n      lines.push(\"\", `### ${group.name}`);\n      for (const name of group.components) {\n        if (grouped.has(name)) continue;\n        const comp = spec.components[name];\n        if (!comp) continue;\n        grouped.add(name);\n        lines.push(formatSig(comp));\n      }\n      if (group.notes?.length) {\n        for (const note of group.notes) lines.push(note);\n      }\n    }\n    const ungrouped = Object.keys(spec.components).filter((n) => !grouped.has(n));\n    if (ungrouped.length) {\n      lines.push(\"\", \"### Other\");\n      for (const name of ungrouped) {\n        const comp = spec.components[name];\n        lines.push(formatSig(comp));\n      }\n    }\n  } else {\n    lines.push(\"\");\n    for (const [, comp] of Object.entries(spec.components)) {\n      lines.push(formatSig(comp));\n    }\n  }\n  return lines.join(\"\\n\");\n}\n\n// ─── Prompt assembly ────────────────────────────────────────────────────────\n\n/** @deprecated Use {@link generateSystemPrompt}. */\nexport function generatePrompt(spec: PromptSpec): string {\n  const rootName = spec.root ?? \"Root\";\n  const hasTools = !!spec.tools?.length;\n\n  // Resolve prompt flags — defaults preserve backward compat\n  const toolCalls = spec.toolCalls ?? hasTools;\n  const bindings = spec.bindings ?? toolCalls;\n  const supportsExpressions = toolCalls || bindings;\n\n  // Detect component-level feature usage\n  const usesActionExpression = Object.values(spec.components).some(\n    (c) => c.signature?.includes(\"ActionExpression\") || RESTRICTED_SLOT.test(c.signature ?? \"\"),\n  );\n\n  const parts: string[] = [];\n\n  parts.push(spec.preamble ?? PREAMBLE);\n  parts.push(\"\");\n  parts.push(syntaxRules(rootName, { supportsExpressions, bindings }));\n  parts.push(\"\");\n  parts.push(generateComponentSignatures(spec, { toolCalls, bindings, usesActionExpression }));\n\n  // Library functions get the section alone when built-ins are not listed\n  const customFunctions = Object.values(spec.functions ?? {}).map(functionLine);\n  if (spec.builtinFunctions ?? supportsExpressions) {\n    parts.push(\"\");\n    parts.push(builtinFunctionsSection(customFunctions, toolCalls));\n  } else if (customFunctions.length) {\n    parts.push(\"\");\n    parts.push(`## Built-in Functions\\n\\n${customFunctions.join(\"\\n\")}`);\n  }\n\n  // Query + Mutation sections\n  if (toolCalls) {\n    parts.push(\"\");\n    parts.push(querySection());\n    parts.push(\"\");\n    parts.push(mutationSection());\n  }\n\n  // Library actions get the Action section alone when no component uses ActionExpression\n  const customActions = Object.values(spec.actions ?? {}).map((a) => `- ${functionLine(a)}`);\n  if (usesActionExpression) {\n    parts.push(\"\");\n    parts.push(actionSection({ toolCalls, bindings }, customActions));\n  } else if (customActions.length) {\n    parts.push(\"\");\n    parts.push(\n      `${ACTION_HEADER}\\n\\nPass one step, or Action([...]) with several steps, as a button's action.\\n\\nAvailable steps:\\n${customActions.join(\"\\n\")}`,\n    );\n  }\n\n  // Interactive filters (needs both toolCalls and bindings)\n  if (toolCalls && bindings) {\n    parts.push(\"\");\n    parts.push(interactiveFiltersSection());\n  }\n\n  // Tool workflow\n  if (toolCalls) {\n    parts.push(\"\");\n    parts.push(toolWorkflowSection());\n  }\n\n  // Tools list (only if actual tools provided)\n  if (spec.tools?.length) {\n    parts.push(\"\");\n    parts.push(renderToolsSection(spec.tools));\n  }\n\n  parts.push(\"\");\n  parts.push(streamingRules(rootName, { supportsExpressions, toolCalls }));\n\n  // Append both examples and toolExamples when both are present\n  const allExamples = [...(spec.examples ?? []), ...(spec.toolExamples ?? [])];\n  if (allExamples.length) {\n    parts.push(\"\");\n    parts.push(\"## Examples\");\n    parts.push(\"\");\n    for (const ex of allExamples) {\n      parts.push(ex);\n      parts.push(\"\");\n    }\n  }\n\n  // Edit mode instructions\n  if (spec.editMode) {\n    parts.push(\"\");\n    parts.push(editModeSection());\n  }\n\n  // Inline mode instructions\n  if (spec.inlineMode) {\n    parts.push(\"\");\n    parts.push(inlineModeSection());\n  }\n\n  parts.push(importantRules(rootName, { toolCalls, bindings }));\n\n  if (spec.additionalRules?.length) {\n    parts.push(\"\");\n    for (const rule of spec.additionalRules) {\n      parts.push(`- ${rule}`);\n    }\n  }\n\n  return parts.join(\"\\n\");\n}\n\n// ─── System prompt (library + options) ──────────────────────────────────────\n\n/** Prompt options for {@link generateSystemPrompt} */\nexport type SystemPromptOptions = Omit<PromptSpec, keyof BaseSpec>;\n\n/**\n * Prompt options allowed on the OpenUI Cloud wire. Extra flags (`tools`,\n * `editMode`, …) are stripped — Cloud's built-in prompt assembler ignores them.\n */\nexport type CloudPromptOptions = Pick<\n  SystemPromptOptions,\n  \"examples\" | \"preamble\" | \"additionalRules\"\n>;\n\n/**\n * Object input for {@link generateSystemPrompt}.\n *\n * Pass `cloud: true` to emit OpenUI Cloud's managed `]]>openui:config` block\n * instead of a locally generated prompt. In that mode `library` is optional —\n * omit it to use Cloud's built-in chat library. `instructions` is Cloud-only\n * extra prose appended after the config block.\n */\nexport type SystemPromptSpec =\n  | {\n      library: LibrarySpec;\n      promptOptions?: SystemPromptOptions;\n      cloud?: false;\n    }\n  | {\n      cloud: true;\n      library?: LibrarySpec;\n      promptOptions?: CloudPromptOptions;\n      instructions?: string;\n    };\n\n/** Render the full system prompt for a library, or Cloud's managed config block when `cloud: true`. */\nexport function generateSystemPrompt(spec: SystemPromptSpec): string;\n/** @deprecated Pass `{ library, promptOptions }` instead. Removed at the next major. */\nexport function generateSystemPrompt(spec: PromptSpec): string;\nexport function generateSystemPrompt(spec: SystemPromptSpec | PromptSpec): string {\n  if (isCloudSpec(spec)) {\n    return generateCloudConfig(spec);\n  }\n  if (!isSystemPromptSpec(spec)) {\n    const prompt = generatePrompt(spec);\n    recordSystemPromptGeneration(spec, \"legacy_prompt_spec\");\n    return prompt;\n  }\n  const merged: PromptSpec = { ...spec.library, ...spec.promptOptions };\n  const prompt = generatePrompt(merged);\n  recordSystemPromptGeneration(merged, \"library_spec\");\n  return prompt;\n}\n\nfunction isCloudSpec(\n  spec: SystemPromptSpec | PromptSpec,\n): spec is Extract<SystemPromptSpec, { cloud: true }> {\n  return \"cloud\" in spec && (spec as { cloud?: unknown }).cloud === true;\n}\n\nfunction isSystemPromptSpec(\n  spec: SystemPromptSpec | PromptSpec,\n): spec is Extract<SystemPromptSpec, { library: LibrarySpec }> {\n  return \"library\" in spec && typeof (spec as { library?: unknown }).library === \"object\";\n}\n","import { object as zObject } from \"zod/v4\";\nimport * as z from \"zod/v4/core\";\nimport { extendDefinition } from \"./extend\";\nimport type { DefinedAction, DefinedFunction } from \"./functions\";\nimport { ACTION_DEFS, isBuiltin, isReservedCall } from \"./parser/builtins\";\nimport type { ComponentPromptSpec, LibrarySpec, PromptSpec, ToolSpec } from \"./parser/prompt\";\nimport { generatePrompt } from \"./parser/prompt\";\nimport type {\n  ActionEvent,\n  BuiltinActionType,\n  FunctionSchema,\n  JSONSchemaDef,\n  LibraryJSONSchema,\n} from \"./parser/types\";\nimport { assertV4Schema, schemaSignature, tagSchemaId, type SchemaRegistry } from \"./signature\";\n\nexport {\n  defineAction,\n  defineFunction,\n  type DefinedAction,\n  type DefinedFunction,\n} from \"./functions\";\nexport type { LibraryJSONSchema } from \"./parser/types\";\nexport { buildSignature, tagSchemaId } from \"./signature\";\n\n// ─── Sub-component type ──────────────────────────────────────────────────────\n\n/**\n * Runtime shape of a parsed sub-component element as seen by parent renderers.\n */\nexport type SubComponentOf<P> = {\n  type: \"element\";\n  typeName: string;\n  props: P;\n  partial: boolean;\n};\n\n// ─── Renderer types (framework-generic) ──────────────────────────────────────\n\n/**\n * The props passed to every component renderer.\n *\n * Framework adapters narrow `RenderNode`:\n * - React:  RenderNode = ReactNode\n * - Svelte: RenderNode = Snippet<[unknown]>\n * - Vue:    RenderNode = VNode\n */\nexport interface ComponentRenderProps<P = Record<string, unknown>, RenderNode = unknown> {\n  props: P;\n  renderNode: (value: unknown) => RenderNode;\n  /** The statement ID from the parsed program (e.g., \"header\", \"prose1\"). Undefined for inline components. */\n  statementId?: string;\n}\n\n// ─── DefinedComponent (framework-generic) ────────────────────────────────────\n\n/**\n * A fully defined component. The `C` parameter represents the\n * framework-specific component/renderer type. lang-core never\n * inspects this value — it is stored opaquely and consumed\n * by the framework adapter's Renderer.\n */\nexport interface DefinedComponent<T extends z.$ZodObject = z.$ZodObject, C = unknown> {\n  name: string;\n  props: T;\n  description: string;\n  component: C;\n  /** Use in parent schemas: `z.array(ChildComponent.ref)` */\n  ref: z.$ZodType<SubComponentOf<T extends z.$ZodType<infer O> ? O : any>>;\n}\n\n/**\n * Define a component with name, schema, description, and renderer.\n * Tags the schema with the component name so it resolves in prompt\n * signatures even if the component isn't in every library.\n */\nexport function defineComponent<T extends z.$ZodObject, C>(config: {\n  name: string;\n  props: T;\n  description: string;\n  component: C;\n}): DefinedComponent<T, C> {\n  assertV4Schema(config.props, config.name);\n  tagSchemaId(config.props, config.name);\n  return {\n    ...config,\n    ref: config.props as unknown as z.$ZodType<\n      SubComponentOf<T extends z.$ZodType<infer O> ? O : any>\n    >,\n  };\n}\n\n// ─── Groups & Prompt Options ─────────────────────────────────────────────────\n\nexport interface ComponentGroup {\n  name: string;\n  components: string[];\n  notes?: string[];\n}\n\n/** Tool descriptor for prompt generation — simple string or rich ToolSpec. */\nexport type ToolDescriptor = string | ToolSpec;\n\nexport interface PromptOptions {\n  preamble?: string;\n  additionalRules?: string[];\n  /** Examples shown when no tools are present (static/layout patterns). */\n  examples?: string[];\n  /** Examples shown when tools ARE present (Query/Mutation patterns). Takes priority over `examples`. */\n  toolExamples?: string[];\n  /** Available tools for Query() — string names or rich ToolSpec descriptors injected into the prompt. */\n  tools?: ToolDescriptor[];\n  /** Enable edit-mode instructions in the prompt. */\n  editMode?: boolean;\n  /** Enable inline mode — LLM can respond with text + optional openui-lang fenced code. */\n  inlineMode?: boolean;\n  /** Enable Query(), Mutation(), @Run, tool workflow. Default: true if tools provided. */\n  toolCalls?: boolean;\n  /** Enable $variables, @Set, @Reset, interactive filters. Default: true if toolCalls. */\n  bindings?: boolean;\n  /** List the built-in functions (@Count, @Sum, ...). Default: true if toolCalls or bindings. */\n  builtinFunctions?: boolean;\n}\n\nfunction buildComponentSpecs(\n  components: Record<string, DefinedComponent<any, any>>,\n  reg: SchemaRegistry,\n): Record<string, ComponentPromptSpec> {\n  const specs: Record<string, ComponentPromptSpec> = {};\n  for (const [name, def] of Object.entries(components)) {\n    specs[name] = {\n      signature: schemaSignature(name, def.props, undefined, reg),\n      description: def.description,\n    };\n  }\n  return specs;\n}\n\ntype CallDefinition = DefinedFunction<any, any> | DefinedAction<any>;\n\n/** Function or action specs in the same shape as component specs. Undefined when there are none. */\nfunction buildCallSpecs(\n  calls: Record<string, CallDefinition>,\n  reg: SchemaRegistry,\n): Record<string, ComponentPromptSpec> | undefined {\n  const entries = Object.entries(calls);\n  if (!entries.length) return undefined;\n  const specs: Record<string, ComponentPromptSpec> = {};\n  for (const [name, def] of entries) {\n    specs[name] = {\n      signature: schemaSignature(name, def.params, \"returns\" in def ? def.returns : undefined, reg),\n      description: def.description,\n    };\n  }\n  return specs;\n}\n\n// ─── Library ────────────────────────────────────────────────────────────────\n\nexport type AnyAction = DefinedAction<any, string>;\n\nexport interface Library<C = unknown, A extends AnyAction = AnyAction> {\n  readonly components: Record<string, DefinedComponent<any, C>>;\n  readonly componentGroups: ComponentGroup[] | undefined;\n  /** Library functions keyed by name; optional so hand-built libraries without them still type-check. */\n  readonly functions?: Record<string, DefinedFunction<any, any>>;\n  /** Custom actions keyed by name; optional like `functions`. */\n  readonly actions?: { readonly [K in A as K[\"name\"]]: K };\n  readonly root: string | undefined;\n  readonly id: string | undefined;\n  /** Instance id minted by `createLibrary()`. Distinct from the optional public `id`. */\n  readonly __libraryId: string;\n\n  prompt(options?: PromptOptions): string;\n  toSpec(): PromptSpec;\n  toJSONSchema(): LibraryJSONSchema;\n  /** Derive a new library (the base stays untouched); create it at module scope, parsers memoize by identity. */\n  extend?<A2 extends AnyAction = never>(\n    extension: LibraryExtension<C, A2>,\n  ): Required<Library<C, A | A2>>;\n}\n\nexport interface LibraryExtension<C = unknown, A extends AnyAction = AnyAction> {\n  components?: {\n    /** New components; with `slots` (\"Parent.prop\", or \"Parent\" with one slot) they join those unions. */\n    add?: (DefinedComponent<any, C> | { component: DefinedComponent<any, C>; slots: string[] })[];\n    /** Replacements (schema and renderer) by name. Every parent points at the new one. */\n    override?: DefinedComponent<any, C>[];\n    /**\n     * Names to drop from the library, every parent union and componentGroups.\n     * Throws when a prop would be left with no type, even an optional one\n     * (`image?: Image` with Image removed): override that parent instead.\n     */\n    remove?: string[];\n  };\n  functions?: ExtensionVerbs<DefinedFunction<any, any>>;\n  actions?: ExtensionVerbs<A>;\n}\n\ninterface ExtensionVerbs<T> {\n  /** Joins the library and is listed in the prompt. */\n  add?: T[];\n}\n\ntype LibraryAction<L> = L extends { readonly actions?: infer R }\n  ? NonNullable<R>[keyof NonNullable<R>]\n  : never;\ntype CustomActionEvent<A> =\n  A extends DefinedAction<infer T, infer N>\n    ? Omit<ActionEvent, \"type\" | \"params\"> & { type: N; params: z.infer<T> }\n    : never;\n\n/** The `onAction` event for library `L`: a union discriminated on `type` when it has custom actions. */\nexport type LibraryActionEvent<L> = [LibraryAction<L>] extends [never]\n  ? ActionEvent\n  : string extends LibraryAction<L>[\"name\"]\n    ? ActionEvent\n    : | (Omit<ActionEvent, \"type\"> & { type: `${BuiltinActionType}` | \"custom\" })\n      | CustomActionEvent<LibraryAction<L>>;\n\nexport interface LibraryDefinition<C = unknown, A extends AnyAction = AnyAction> {\n  components: DefinedComponent<any, C>[];\n  componentGroups?: ComponentGroup[];\n  /** Library functions, called as `@Name(...)` in programs. */\n  functions?: DefinedFunction<any, any>[];\n  /** Custom actions, used as `@Name(...)` steps in action props. */\n  actions?: A[];\n  root?: string;\n  id?: string;\n}\n\nlet fallbackLibraryId = 0;\n\nfunction createLibraryId(): string {\n  if (typeof globalThis.crypto?.randomUUID === \"function\") {\n    return globalThis.crypto.randomUUID();\n  }\n  fallbackLibraryId += 1;\n  return `openui-lib-${Date.now().toString(36)}-${fallbackLibraryId.toString(36)}`;\n}\n\n/**\n * Create a component library from an array of defined components.\n */\n// A defaults to never so a library without actions extends to a real union.\nexport function createLibrary<C = unknown, A extends AnyAction = never>(\n  input: LibraryDefinition<C, A>,\n): Required<Library<C, A>> {\n  const componentsRecord: Record<string, DefinedComponent<any, C>> = {};\n  const reg = z.registry<{ id: string }>();\n  const __libraryId = createLibraryId();\n\n  for (const comp of input.components) {\n    reg.add(comp.props as z.$ZodType, { id: comp.name });\n    componentsRecord[comp.name] = comp;\n  }\n\n  // Action slots are $refs like component slots; a component of the same name wins\n  for (const [id, schema] of Object.entries(ACTION_DEFS)) {\n    if (!componentsRecord[id]) reg.add(schema, { id });\n  }\n\n  if (input.root && !componentsRecord[input.root]) {\n    const available = Object.keys(componentsRecord).join(\", \");\n    throw new Error(\n      `[createLibrary] Root component \"${input.root}\" was not found in components. Available components: ${available}`,\n    );\n  }\n\n  const names = new Set(Object.keys(componentsRecord));\n  const claim = (kind: string, name: string) => {\n    if (isBuiltin(name) || isReservedCall(name) || names.has(name)) {\n      throw new Error(\n        `[createLibrary] ${kind} \"${name}\" collides with a built-in, component, function, or action of the same name. Rename it.`,\n      );\n    }\n    names.add(name);\n  };\n  const functionsRecord: Record<string, DefinedFunction<any, any>> = {};\n  for (const fn of input.functions ?? []) {\n    claim(\"Function\", fn.name);\n    functionsRecord[fn.name] = fn;\n  }\n  const actionsRecord: Record<string, DefinedAction<any>> = {};\n  for (const action of input.actions ?? []) {\n    claim(\"Action\", action.name);\n    actionsRecord[action.name] = action;\n    reg.add(action.ref, { id: action.name });\n  }\n  const callSpecs = () => {\n    const functions = buildCallSpecs(functionsRecord, reg);\n    const actions = buildCallSpecs(actionsRecord, reg);\n    return { ...(functions ? { functions } : {}), ...(actions ? { actions } : {}) };\n  };\n\n  const library: Required<Library<C, A>> = {\n    components: componentsRecord,\n    componentGroups: input.componentGroups,\n    functions: functionsRecord,\n    actions: actionsRecord as Required<Library<C, A>>[\"actions\"],\n    root: input.root,\n    id: input.id,\n    __libraryId,\n\n    prompt(options?: PromptOptions): string {\n      const spec: PromptSpec = {\n        root: input.root,\n        components: buildComponentSpecs(componentsRecord, reg),\n        componentGroups: input.componentGroups,\n        ...callSpecs(),\n        ...options,\n      };\n      return generatePrompt(spec);\n    },\n\n    toSpec(): LibrarySpec {\n      return {\n        root: input.root,\n        components: buildComponentSpecs(componentsRecord, reg),\n        componentGroups: input.componentGroups,\n        ...callSpecs(),\n        schema: buildJSONSchema(),\n        ...(input.id !== undefined ? { id: input.id } : {}),\n      };\n    },\n\n    toJSONSchema(): LibraryJSONSchema {\n      return buildJSONSchema();\n    },\n\n    // lib.extend({ components: { add: [ProductCard] }, functions: { add: [percent] } })\n    extend<A2 extends AnyAction = never>(extension: LibraryExtension<C, A2>) {\n      return createLibrary(extendDefinition<C>(input, extension)) as Required<Library<C, A | A2>>;\n    },\n  };\n\n  // Component refs resolve against the library's top-level $defs\n  function toCallJSONSchema(schema: z.$ZodType): Record<string, unknown> {\n    const { $schema: _, $defs: __, ...rest } = z.toJSONSchema(schema, { metadata: reg });\n    return rest;\n  }\n\n  function callSchemas(\n    calls: Record<string, CallDefinition>,\n  ): Record<string, FunctionSchema> | undefined {\n    const entries = Object.entries(calls);\n    if (!entries.length) return undefined;\n    return Object.fromEntries(\n      entries.map(([name, def]) => [\n        name,\n        {\n          description: def.description,\n          params: toCallJSONSchema(def.params) as JSONSchemaDef,\n          ...(\"returns\" in def && def.returns ? { returns: toCallJSONSchema(def.returns) } : {}),\n        },\n      ]),\n    );\n  }\n\n  function buildJSONSchema(): LibraryJSONSchema {\n    const combinedSchema = zObject(\n      Object.fromEntries(Object.entries(componentsRecord).map(([k, v]) => [k, v.props])) as any,\n    );\n    const schema = z.toJSONSchema(combinedSchema, { metadata: reg }) as LibraryJSONSchema;\n    // zod only serializes what lives on the zod schemas / the metadata\n    // registry, so component descriptions (a defineComponent field) must be\n    // merged in explicitly — without this the serialized library loses them.\n    for (const [name, comp] of Object.entries(componentsRecord)) {\n      const def = schema.$defs?.[name];\n      if (def && comp.description) def.description = comp.description;\n    }\n    const functions = callSchemas(functionsRecord);\n    if (functions) schema.functions = functions;\n    const actions = callSchemas(actionsRecord);\n    if (actions) schema.actions = actions;\n    return schema;\n  }\n\n  return library;\n}\n","// The OpenUI message protocol (spec section 7): marker lines around a stored response,\n// e.g. `]]>openui:content?library=x`, `]]>openui:context`, `]]>openui:end`.\n\nconst PREFIX = \"]]>openui:\";\nconst MARKER = /^\\]\\]>openui:([a-z]+)(?:\\?(.*))?$/;\n// A regenerated response writes its content line right after the cut-off text, with no newline\n// before it. Start it on its own line so the last content wins.\nconst RETRY = /([^\\n])(?=\\]\\]>openui:content(?:\\?|\\r?\\n|$))/g;\n// While streaming, hold back a mid-line `]]>openui:con` that may become a content line.\nconst RETRY_CUT = /[^\\n](\\]\\]>[a-z:]*)$/;\n\nexport interface ParsedMessage {\n  /** Body of the last `content` section, or the whole text when there is none. */\n  content: string;\n  /** Body of the `context` section: parsed JSON, else raw text. null when absent. */\n  context: unknown;\n  /** String attributes of the winning `content` marker. */\n  attributes: Record<string, string>;\n  /** An `end` line follows the winning `content` section. */\n  end: boolean;\n}\n\nexport interface ParseMessageOptions {\n  /** Hold back a last line that may be a marker cut mid-stream. */\n  streaming?: boolean;\n}\n\nexport interface BuildMessageInput {\n  content: string;\n  /** Written as is when a string, else as JSON. Omitted when null or undefined. */\n  context?: unknown;\n  attributes?: Record<string, string>;\n  end?: boolean;\n}\n\ninterface Section {\n  kind: string | null;\n  attributes: Record<string, string>;\n  lines: string[];\n}\n\n// Same bytes as URLSearchParams, which React Native only partly implements.\nconst encode = (s: string) =>\n  encodeURIComponent(s)\n    .replace(/[!'()~]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)\n    .replace(/%20/g, \"+\");\n\nconst decode = (s: string) => {\n  try {\n    return decodeURIComponent(s.replace(/\\+/g, \" \"));\n  } catch {\n    return s;\n  }\n};\n\nfunction readAttributes(query = \"\"): Record<string, string> {\n  const out: Record<string, string> = {};\n  for (const pair of query.split(\"&\")) {\n    const eq = pair.indexOf(\"=\");\n    const key = decode(eq === -1 ? pair : pair.slice(0, eq));\n    if (key) out[key] = eq === -1 ? \"\" : decode(pair.slice(eq + 1));\n  }\n  return out;\n}\n\n/** Splits a stored message into its content, context, attributes and end flag. */\nexport function parseMessage(raw: string, { streaming }: ParseMessageOptions = {}): ParsedMessage {\n  let text = raw.replace(RETRY, \"$1\\n\");\n  const cut = streaming ? RETRY_CUT.exec(text) : null;\n  if (cut && `${PREFIX}content`.startsWith(cut[1])) text = text.slice(0, cut.index + 1);\n  const lines = text.split(\"\\n\");\n  const last = lines[lines.length - 1];\n  const held = streaming && last !== \"\" && (last.startsWith(PREFIX) || PREFIX.startsWith(last));\n  if (held) lines.pop();\n\n  const sections: Section[] = [{ kind: null, attributes: {}, lines: [] }];\n  // The newline (and its `\\r`) before a marker is not part of the body.\n  const close = () => {\n    const body = sections[sections.length - 1].lines;\n    if (body.length) body[body.length - 1] = body[body.length - 1].replace(/\\r$/, \"\");\n  };\n  let endAt = -1;\n  for (const [i, line] of lines.entries()) {\n    const match = MARKER.exec(line.replace(/\\r$/, \"\"));\n    if (!match) {\n      sections[sections.length - 1].lines.push(line);\n      continue;\n    }\n    close();\n    if (match[1] === \"end\") {\n      endAt = sections.length - 1;\n      if (i === lines.length - 2 && lines[i + 1] === \"\") break;\n      continue;\n    }\n    sections.push({ kind: match[1], attributes: readAttributes(match[2]), lines: [] });\n  }\n  if (held) close();\n\n  // Last content wins; text before the first marker is content only when there is none.\n  const kinds = sections.map((s) => s.kind);\n  const win = Math.max(0, kinds.lastIndexOf(\"content\"));\n  const ctx = kinds.lastIndexOf(\"context\");\n  let context: unknown = ctx > win ? sections[ctx].lines.join(\"\\n\") : null;\n  try {\n    if (typeof context === \"string\") context = JSON.parse(context);\n  } catch {\n    // Not JSON (yet): keep the raw text.\n  }\n  const winner = sections[win];\n  // Like context, an `end` before the winning content belongs to an earlier attempt.\n  const end = endAt >= win;\n  return { content: winner.lines.join(\"\\n\"), context, attributes: winner.attributes, end };\n}\n\n/** Writes a stored message with its marker lines. */\nexport function buildMessage({ content, context, attributes, end }: BuildMessageInput): string {\n  const query = Object.entries(attributes ?? {})\n    .map(([key, value]) => `${encode(key)}=${encode(value)}`)\n    .join(\"&\");\n  let out = `${PREFIX}content${query ? `?${query}` : \"\"}\\n${content}`;\n  if (context != null) {\n    out += `\\n${PREFIX}context\\n${typeof context === \"string\" ? context : JSON.stringify(context)}`;\n  }\n  return end ? `${out}\\n${PREFIX}end` : out;\n}\n","import type { ASTNode } from \"./ast\";\n\nexport type JSONSchemaProperty = Record<string, unknown>;\n/** A JSON Schema object; keywords are added as libraries use them (anyOf: the ActionExpression union). */\nexport type JSONSchemaDef = {\n  properties?: JSONSchemaProperty;\n  required?: string[];\n  description?: string;\n  type?: string;\n  anyOf?: JSONSchemaProperty[];\n};\n\n/** A function's params and return value as JSON Schema. */\nexport interface FunctionSchema {\n  description?: string;\n  /** JSON Schema object of the params. Property order is the positional order in programs. */\n  params: JSONSchemaDef;\n  /** JSON Schema of the return value. */\n  returns?: JSONSchemaProperty;\n}\n\n/**\n * The JSON Schema document produced by `library.toJSONSchema()`.\n * All component schemas live in `$defs`, keyed by component name.\n * Library functions and actions live in `functions` and `actions`.\n */\nexport interface LibraryJSONSchema {\n  $defs?: Record<string, JSONSchemaDef>;\n  /** Component names as keys. Other `$defs` are data shapes. */\n  properties?: Record<string, unknown>;\n  functions?: Record<string, FunctionSchema>;\n  /** Custom actions, when the library has any. They have no `returns`. */\n  actions?: Record<string, FunctionSchema>;\n}\n\n/** Scalar JSON Schema types we can reliably check a positional literal against. */\nexport type ScalarParamType = \"string\" | \"number\" | \"boolean\";\n\nexport interface ParamDef {\n  /** Parameter name, e.g. \"title\", \"columns\". */\n  name: string;\n  /** Whether the parameter is required by the component. */\n  required: boolean;\n  /** Default value from JSON Schema — used when the required field is missing/null. */\n  defaultValue?: unknown;\n  /** The raw JSON Schema fragment for this param. */\n  schema?: unknown;\n}\n\n/** `@Percent(part, total)` -> params [{name: \"part\"}, {name: \"total\"}], kept as AST */\nexport interface CallDef {\n  kind: \"function\" | \"action\";\n  params: ParamDef[];\n  /** Built-ins coerce their args: the runtime maps them by name, unvalidated. */\n  builtin?: true;\n  /** Lazy built-ins (@Each, Action, @Run, @Set, @Reset) get their args unevaluated. */\n  lazy?: true;\n}\n\n/** \"Card\" -> its params; callDefs: \"Sum\" -> built-in CallDef, \"Percent\" -> library CallDef */\nexport type ParamMap = Map<string, { params: ParamDef[] }> & {\n  callDefs?: Map<string, CallDef>;\n};\n\n/**\n * A fully resolved component node from the parser.\n *\n * The parser converts openui-lang text into a tree of these nodes.\n * Each node represents one component invocation with its positional\n * arguments mapped into named `props` via the library's Zod key order.\n */\nexport interface ElementNode {\n  type: \"element\";\n  /** Source variable name (e.g. \"header\" from `header = TextContent(...)`). Undefined for inline components. */\n  statementId?: string;\n  /** Component name as defined in the library (e.g. \"Table\", \"BarChart\"). */\n  typeName: string;\n  /** Named props produced by positional-to-named mapping in the parser. */\n  props: Record<string, unknown>;\n  /**\n   * True when the parser hasn't received all tokens for this node yet\n   * (streaming in progress).\n   */\n  partial: boolean;\n  /**\n   * False when all props are static literals — evaluation can be skipped.\n   * Undefined is treated as true (dynamic) for backward compatibility.\n   */\n  hasDynamicProps?: boolean;\n}\n\nexport function isElementNode(value: unknown): value is ElementNode {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n  const node = value as Record<string, unknown>;\n  return (\n    node.type === \"element\" &&\n    typeof node.typeName === \"string\" &&\n    typeof node.props === \"object\" &&\n    node.props !== null &&\n    typeof node.partial === \"boolean\"\n  );\n}\n\n/**\n * Validation error codes for schema-related issues.\n */\nexport type ValidationErrorCode =\n  | \"missing-required\"\n  | \"null-required\"\n  | \"unknown-component\"\n  | \"inline-reserved\"\n  | \"excess-args\"\n  | \"type-mismatch\"\n  | \"unknown-function\"\n  | \"no-root\";\n\n/**\n * A prop validation error. Components with missing required props are\n * dropped from the output tree and errors are recorded here.\n */\nexport interface ValidationError {\n  /** Machine-readable error code. */\n  code: ValidationErrorCode;\n  /** Component type name, e.g. \"Header\", \"BarChart\". */\n  component: string;\n  /** JSON Pointer path within the props object, e.g. \"/title\", \"\". */\n  path: string;\n  /** Human-readable error message. */\n  message: string;\n  /** Statement name that triggered the error (e.g. \"header\", \"chart\"). */\n  statementId?: string;\n  /** \"warning\" when the program still renders (e.g. the `no-root` fallback); absent means error. */\n  severity?: \"warning\";\n}\n\nexport interface MaterializeCtx {\n  syms: Map<string, ASTNode>;\n  cat: ParamMap | undefined;\n  errors: ValidationError[];\n  unres: string[];\n  visited: Set<string>;\n  partial: boolean;\n  /** Tracks which statement is currently being materialized (for error attribution). */\n  currentStatementId?: string;\n  /** Statement IDs not yet reached — delete as they're touched. Remaining = orphaned. */\n  unreached?: Set<string>;\n}\n\n/**\n * Error sources across the openui-lang pipeline.\n */\nexport type OpenUIErrorSource = \"parser\" | \"runtime\" | \"query\" | \"mutation\";\n\n/**\n * Machine-readable error codes for the openui-lang pipeline.\n *\n * - Parser: \"unknown-component\", \"missing-required\", \"null-required\", \"inline-reserved\",\n *   \"excess-args\", \"type-mismatch\", \"unknown-function\", \"no-root\", \"parse-exception\", \"parse-failed\"\n * - Runtime: \"runtime-error\" (prop evaluation), \"render-error\" (React render)\n * - Query/Mutation: \"tool-not-found\", \"tool-error\", \"mcp-error\"\n */\nexport type OpenUIErrorCode =\n  | ValidationErrorCode\n  | \"runtime-error\"\n  | \"render-error\"\n  | \"parse-exception\"\n  | \"parse-failed\"\n  | \"tool-not-found\"\n  | \"tool-error\"\n  | \"mcp-error\";\n\n/**\n * Structured, LLM-friendly error from the openui-lang pipeline.\n *\n * Designed for an automated correction loop: send these to the LLM so it can\n * generate patches. Only includes errors that are fixable by changing the\n * openui-lang code — transient streaming errors, network failures, and tool\n * execution errors are excluded.\n */\nexport interface OpenUIError {\n  /** Where the error originated. */\n  source: OpenUIErrorSource;\n  /** Machine-readable error code. */\n  code: OpenUIErrorCode;\n  /** Human/LLM-readable description of what went wrong. */\n  message: string;\n  /** Statement name (e.g. \"header\", \"metrics\") — tells the LLM which statement to patch. */\n  statementId?: string;\n  /** Component type name (e.g. \"BarChart\", \"Query\"). */\n  component?: string;\n  /** Prop path (e.g. \"/title\"). */\n  path?: string;\n  /** Tool name for query/mutation errors (e.g. \"get_users\", \"create_item\"). */\n  toolName?: string;\n  /** Actionable fix context for the LLM (e.g. available components, correct signature). */\n  hint?: string;\n  /** \"warning\" when the program still renders; absent means error. */\n  severity?: \"warning\";\n}\n\n/**\n * Built-in action types for host app events.\n */\nexport enum BuiltinActionType {\n  ContinueConversation = \"continue_conversation\",\n  OpenUrl = \"open_url\",\n}\n\n/**\n * A single step in an ActionPlan.\n * Step type values match ACTION_STEPS in builtins.ts (single source of truth).\n */\nexport type ActionStep =\n  | { type: \"run\"; statementId: string; refType: \"query\" | \"mutation\" }\n  | { type: \"continue_conversation\"; message: string; context?: unknown }\n  | { type: \"open_url\"; url: string }\n  | { type: \"set\"; target: string; valueAST: ASTNode }\n  | { type: \"reset\"; targets: string[] }\n  /** A library action from `defineAction`; delivered to `onAction` as `{ type: name, params }`. */\n  | { type: \"custom_action\"; name: string; params: Record<string, unknown> };\n\n/**\n * An ordered sequence of steps to execute when a button is clicked.\n * Produced by evaluating an Action() expression at runtime.\n */\nexport interface ActionPlan {\n  steps: ActionStep[];\n}\n\n/**\n * Structured action event fired by interactive components.\n */\nexport interface ActionEvent {\n  /** Action type. See `BuiltinActionType` for built-in types. */\n  type: BuiltinActionType | (string & {});\n  /** Action-specific params (e.g. { url } for OpenUrl, custom params for Custom). */\n  params: Record<string, unknown>;\n  /** Human-readable label for the action (displayed as user message in chat). */\n  humanFriendlyMessage: string;\n  /** Raw form state at the time of the action — all field values. */\n  formState?: Record<string, unknown>;\n  /** The form name that triggered this action, if any. */\n  formName?: string;\n}\n\n/**\n * Extracted info about a Query() call from the parsed program.\n */\nexport interface QueryStatementInfo {\n  /** Statement name that holds this query (e.g. \"metrics\"). */\n  statementId: string;\n  /** First arg AST — the tool name (should evaluate to a string). */\n  toolAST: ASTNode | null;\n  /** Second arg AST — the arguments object (may contain $var refs). */\n  argsAST: ASTNode | null;\n  /** Third arg AST — default data returned before fetch resolves. */\n  defaultsAST: ASTNode | null;\n  /** Fourth arg AST — refresh interval in seconds. */\n  refreshAST: ASTNode | null;\n  /** Pre-computed $variable deps from argsAST (extracted at parse time). */\n  deps?: string[];\n  /** False while the Query() call is still being streamed. */\n  complete: boolean;\n}\n\n/**\n * Extracted info about a Mutation() call from the parsed program.\n */\nexport interface MutationStatementInfo {\n  /** Statement name that holds this mutation (e.g. \"createResult\"). */\n  statementId: string;\n  /** First arg AST — the tool name (should evaluate to a string). */\n  toolAST: ASTNode | null;\n  /** Second arg AST — the arguments object (may contain $var refs). */\n  argsAST: ASTNode | null;\n}\n\n/**\n * The output of a single `parser.parse(text)` call.\n *\n * During streaming, each chunk produces a new ParseResult as the\n * accumulated text is re-parsed. The `root` progressively resolves\n * from null → partial tree → complete tree.\n */\nexport interface ParseResult {\n  /** The root ElementNode (typically a Root component), or null if parsing hasn't produced one yet. */\n  root: ElementNode | null;\n  /** Set when the entry picks a component at runtime (`root = $t ? A : B`); see `evaluateRoot`. */\n  rootExpression?: ASTNode;\n  meta: {\n    /** True if the parser detected truncated/incomplete input. */\n    incomplete: boolean;\n    /** Names of references used but not yet defined (dropped as null in output). */\n    unresolved: string[];\n    /** Names of value statements defined but not reachable from root. Excludes $state, Query, and Mutation declarations. */\n    orphaned: string[];\n    /** Total number of `identifier = Expression` statements parsed. */\n    statementCount: number;\n    /**\n     * Prop validation errors. Components with missing required props are\n     * redacted (dropped as null) and listed here.\n     */\n    errors: ValidationError[];\n  };\n  /** $variable declarations — maps \"$varName\" to its materialized default value. */\n  stateDeclarations: Record<string, unknown>;\n  /** Extracted Query() calls with their positional args as AST nodes. */\n  queryStatements: QueryStatementInfo[];\n  /** Extracted Mutation() calls with their positional args as AST nodes. */\n  mutationStatements: MutationStatementInfo[];\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// AST node types for openui-lang\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Discriminated union representing every value that can appear in an\n * openui-lang expression. The `k` field is the discriminant.\n *\n * Literal & structural nodes:\n * - `Comp`       — a component call: `Header(\"Hello\", \"Subtitle\")`\n * - `Str`        — a string literal: `\"hello\"`\n * - `Num`        — a number literal: `42` or `3.14`\n * - `Bool`       — a boolean literal: `true` or `false`\n * - `Null`       — the null literal\n * - `Arr`        — an array: `[a, b, c]`\n * - `Obj`        — an object: `{ key: value }`\n * - `Ref`        — a reference to another statement: `myTable`\n * - `Ph`         — a placeholder for an unresolvable reference\n *\n * Reactive & expression nodes:\n * - `StateRef`   — a reactive state variable reference: `$count`\n * - `RuntimeRef` — a reference resolved at runtime (e.g. Query results)\n * - `BinOp`      — a binary operation: `a + b`, `x == y`\n * - `UnaryOp`    — a unary operation: `!flag`\n * - `Ternary`    — a conditional expression: `cond ? a : b`\n * - `Member`     — dot member access: `obj.field`\n * - `Index`      — bracket index access: `arr[0]`\n * - `Assign`     — state assignment: `$count = $count + 1`\n */\nexport type ASTNode =\n  | {\n      k: \"Comp\";\n      name: string;\n      args: ASTNode[];\n      mappedProps?: Record<string, ASTNode>;\n      /** Set on an `@Name(...)` call whose name is not a built-in or action step. */\n      fn?: true;\n    }\n  | { k: \"Str\"; v: string }\n  | { k: \"Num\"; v: number }\n  | { k: \"Bool\"; v: boolean }\n  | { k: \"Null\" }\n  | { k: \"Arr\"; els: ASTNode[] }\n  | { k: \"Obj\"; entries: [string, ASTNode][] }\n  | { k: \"Ref\"; n: string }\n  | { k: \"Ph\"; n: string }\n  | { k: \"StateRef\"; n: string }\n  | { k: \"RuntimeRef\"; n: string; refType: \"query\" | \"mutation\" }\n  | { k: \"BinOp\"; op: string; left: ASTNode; right: ASTNode }\n  | { k: \"UnaryOp\"; op: string; operand: ASTNode }\n  | { k: \"Ternary\"; cond: ASTNode; then: ASTNode; else: ASTNode }\n  | { k: \"Member\"; obj: ASTNode; field: string }\n  | { k: \"Index\"; obj: ASTNode; index: ASTNode }\n  | { k: \"Assign\"; target: string; value: ASTNode };\n\n/**\n * Subset of ASTNode that must be preserved for runtime evaluation.\n * These nodes survive parser lowering and are resolved by the evaluator.\n */\nexport type RuntimeExprNode = Extract<\n  ASTNode,\n  | { k: \"StateRef\" }\n  | { k: \"RuntimeRef\" }\n  | { k: \"BinOp\" }\n  | { k: \"UnaryOp\" }\n  | { k: \"Ternary\" }\n  | { k: \"Member\" }\n  | { k: \"Index\" }\n  | { k: \"Assign\" }\n>;\n\n/** Type guard for runtime expression nodes that survive parser lowering. */\nexport function isRuntimeExpr(node: ASTNode): node is RuntimeExprNode {\n  switch (node.k) {\n    case \"StateRef\":\n    case \"RuntimeRef\":\n    case \"BinOp\":\n    case \"UnaryOp\":\n    case \"Ternary\":\n    case \"Member\":\n    case \"Index\":\n    case \"Assign\":\n      return true;\n    default:\n      return false;\n  }\n}\n\n/** Valid AST discriminant values. */\nconst AST_KINDS = new Set([\n  \"Comp\",\n  \"Ref\",\n  \"StateRef\",\n  \"RuntimeRef\",\n  \"BinOp\",\n  \"UnaryOp\",\n  \"Ternary\",\n  \"Member\",\n  \"Index\",\n  \"Assign\",\n  \"Str\",\n  \"Num\",\n  \"Bool\",\n  \"Null\",\n  \"Arr\",\n  \"Obj\",\n  \"Ph\",\n]);\n\n/** Check if a value is an AST node (has a valid `k` discriminant field). */\nexport function isASTNode(value: unknown): value is ASTNode {\n  if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n  return AST_KINDS.has((value as Record<string, unknown>).k as string);\n}\n\nexport function walkAST(node: ASTNode, visit: (node: ASTNode) => void): void {\n  const walk = (current: ASTNode) => {\n    visit(current);\n\n    switch (current.k) {\n      case \"Comp\":\n        current.args.forEach(walk);\n        Object.values(current.mappedProps ?? {}).forEach(walk);\n        break;\n      case \"Arr\":\n        current.els.forEach(walk);\n        break;\n      case \"Obj\":\n        current.entries.forEach(([, value]) => walk(value));\n        break;\n      case \"BinOp\":\n        walk(current.left);\n        walk(current.right);\n        break;\n      case \"UnaryOp\":\n        walk(current.operand);\n        break;\n      case \"Ternary\":\n        walk(current.cond);\n        walk(current.then);\n        walk(current.else);\n        break;\n      case \"Member\":\n        walk(current.obj);\n        break;\n      case \"Index\":\n        walk(current.obj);\n        walk(current.index);\n        break;\n      case \"Assign\":\n        walk(current.value);\n        break;\n    }\n  };\n\n  walk(node);\n}\n\n// ─── Typed Statement model ─────────────────────────────────────────────────\n// Classification determined at parse time from token type + expression shape.\n// Eliminates id.startsWith(\"$\") and ast.name === \"Query\" hacks downstream.\n\n/** Tool/Query call shape extracted from Comp nodes */\nexport interface CallNode {\n  callee: string;\n  args: ASTNode[];\n}\n\n/** Typed statement — kind known at parse time */\nexport type Statement =\n  | { kind: \"value\"; id: string; expr: ASTNode }\n  | { kind: \"state\"; id: string; init: ASTNode }\n  | { kind: \"query\"; id: string; call: CallNode; expr: ASTNode; deps?: string[] }\n  | { kind: \"mutation\"; id: string; call: CallNode; expr: ASTNode };\n\n// {n: [1]} -> {k:\"Obj\", entries: [[\"n\", {k:\"Arr\", els:[Num 1]}]]}\nexport function toLiteralAST(value: unknown): ASTNode {\n  if (value === null || value === undefined) return { k: \"Null\" };\n  if (typeof value === \"string\") return { k: \"Str\", v: value };\n  if (typeof value === \"number\") return { k: \"Num\", v: value };\n  if (typeof value === \"boolean\") return { k: \"Bool\", v: value };\n  if (Array.isArray(value)) return { k: \"Arr\", els: value.map(toLiteralAST) };\n  if (typeof value === \"object\") {\n    return {\n      k: \"Obj\",\n      entries: Object.entries(value).map(([k, v]) => [k, toLiteralAST(v)] as [string, ASTNode]),\n    };\n  }\n  return { k: \"Null\" };\n}\n\n// {k:\"Arr\", els:[Num 1]} -> {v: [1]}; a Ref or call -> undefined\nexport function literalValue(node: ASTNode): { v: unknown } | undefined {\n  switch (node.k) {\n    case \"Str\":\n    case \"Num\":\n    case \"Bool\":\n      return { v: node.v };\n    case \"Null\":\n      return { v: null };\n    case \"Arr\": {\n      const v: unknown[] = [];\n      for (const e of node.els) {\n        const lit = literalValue(e);\n        if (!lit) return undefined;\n        v.push(lit.v);\n      }\n      return { v };\n    }\n    case \"Obj\": {\n      const v: Record<string, unknown> = {};\n      for (const [k, e] of node.entries) {\n        const lit = literalValue(e);\n        if (!lit) return undefined;\n        v[k] = lit.v;\n      }\n      return { v };\n    }\n    default:\n      return undefined;\n  }\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// Pratt precedence expression parser for openui-lang\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { ASTNode } from \"./ast\";\nimport { isBuiltin } from \"./builtins\";\nimport { T, type Token } from \"./tokens\";\n\n// ── Precedence levels (from spec Section 2.11) ─────────────────────────────\nconst PREC_TERNARY = 1;\nconst PREC_OR = 2;\nconst PREC_AND = 3;\nconst PREC_EQ = 4;\nconst PREC_CMP = 5;\nconst PREC_ADD = 6;\nconst PREC_MUL = 7;\nconst PREC_UNARY = 8;\nconst PREC_MEMBER = 9;\n\n/**\n * Parse a token array into an AST node using a Pratt (top-down operator\n * precedence) parser.\n */\nexport function parseExpression(tokens: Token[]): ASTNode {\n  let pos = 0;\n\n  const cur = (): Token => tokens[pos] ?? { t: T.EOF };\n  const adv = (): Token => {\n    const tok = cur();\n    pos++;\n    return tok;\n  };\n  const eat = (kind: T): void => {\n    if (cur().t === kind) pos++;\n  };\n\n  // ── Infix precedence lookup ─────────────────────────────────────────────\n  function getInfixPrec(tok: Token): number {\n    switch (tok.t) {\n      case T.Question:\n        return PREC_TERNARY;\n      case T.Or:\n        return PREC_OR;\n      case T.And:\n        return PREC_AND;\n      case T.EqEq:\n      case T.NotEq:\n        return PREC_EQ;\n      case T.Greater:\n      case T.Less:\n      case T.GreaterEq:\n      case T.LessEq:\n        return PREC_CMP;\n      case T.Plus:\n      case T.Minus:\n        return PREC_ADD;\n      case T.Star:\n      case T.Slash:\n      case T.Percent:\n        return PREC_MUL;\n      case T.Dot:\n      case T.LBrack:\n        return PREC_MEMBER;\n      default:\n        return 0;\n    }\n  }\n\n  // ── Main Pratt loop ─────────────────────────────────────────────────────\n  function parseExpr(minPrec: number = 0): ASTNode {\n    let left = parsePrefix();\n    while (getInfixPrec(cur()) > minPrec) {\n      left = parseInfix(left);\n    }\n    return left;\n  }\n\n  // ── Prefix / atoms ─────────────────────────────────────────────────────\n  function parsePrefix(): ASTNode {\n    const tok = cur();\n\n    // String literal\n    if (tok.t === T.Str) {\n      adv();\n      return { k: \"Str\", v: tok.v as string };\n    }\n\n    // Number literal\n    if (tok.t === T.Num) {\n      adv();\n      return { k: \"Num\", v: tok.v as number };\n    }\n\n    // Boolean literals\n    if (tok.t === T.True) {\n      adv();\n      return { k: \"Bool\", v: true };\n    }\n    if (tok.t === T.False) {\n      adv();\n      return { k: \"Bool\", v: false };\n    }\n\n    // Null literal\n    if (tok.t === T.Null) {\n      adv();\n      return { k: \"Null\" };\n    }\n\n    // Array\n    if (tok.t === T.LBrack) return parseArr();\n\n    // Object\n    if (tok.t === T.LBrace) return parseObj();\n\n    // State variable — may be assignment or reference\n    if (tok.t === T.StateVar) {\n      const name = tok.v as string;\n      adv();\n      // Check for assignment: $var = expr (Equals, NOT EqEq)\n      if (cur().t === T.Equals) {\n        adv(); // consume =\n        const value = parseExpr(0);\n        return { k: \"Assign\", target: name, value };\n      }\n      return { k: \"StateRef\", n: name };\n    }\n\n    // PascalCase — component call or reference\n    if (tok.t === T.Type) {\n      const name = tok.v as string;\n      // Builtins (Count, Each, Set, Run, etc.) require @-prefix — only Action is exempt\n      if (tokens[pos + 1]?.t === T.LParen && (!isBuiltin(name) || name === \"Action\"))\n        return parseComp();\n      adv();\n      return { k: \"Ref\", n: name };\n    }\n\n    // @-prefixed builtin call: @Count(...), @Each(...), @Set(...), etc.\n    if (tok.t === T.BuiltinCall) {\n      if (tokens[pos + 1]?.t === T.LParen) {\n        const call = parseComp();\n        if (call.k === \"Comp\" && !isBuiltin(call.name)) call.fn = true;\n        return call;\n      }\n      adv();\n      return { k: \"Ref\", n: tok.v as string };\n    }\n\n    // Lowercase identifier — reference\n    if (tok.t === T.Ident) {\n      adv();\n      return { k: \"Ref\", n: tok.v as string };\n    }\n\n    // Unary NOT\n    if (tok.t === T.Not) {\n      adv();\n      return { k: \"UnaryOp\", op: \"!\", operand: parseExpr(PREC_UNARY) };\n    }\n\n    // Unary negation\n    if (tok.t === T.Minus) {\n      adv();\n      return { k: \"UnaryOp\", op: \"-\", operand: parseExpr(PREC_UNARY) };\n    }\n\n    // Grouped expression\n    if (tok.t === T.LParen) {\n      adv(); // skip (\n      const inner = parseExpr(0);\n      eat(T.RParen);\n      return inner;\n    }\n\n    // Unknown token — skip and return Null\n    adv();\n    return { k: \"Null\" };\n  }\n\n  // ── Infix / postfix ────────────────────────────────────────────────────\n  function parseInfix(left: ASTNode): ASTNode {\n    const tok = cur();\n\n    // Arithmetic: + -\n    if (tok.t === T.Plus) {\n      adv();\n      return { k: \"BinOp\", op: \"+\", left, right: parseExpr(PREC_ADD) };\n    }\n    if (tok.t === T.Minus) {\n      adv();\n      return { k: \"BinOp\", op: \"-\", left, right: parseExpr(PREC_ADD) };\n    }\n\n    // Arithmetic: * / %\n    if (tok.t === T.Star) {\n      adv();\n      return { k: \"BinOp\", op: \"*\", left, right: parseExpr(PREC_MUL) };\n    }\n    if (tok.t === T.Slash) {\n      adv();\n      return { k: \"BinOp\", op: \"/\", left, right: parseExpr(PREC_MUL) };\n    }\n    if (tok.t === T.Percent) {\n      adv();\n      return { k: \"BinOp\", op: \"%\", left, right: parseExpr(PREC_MUL) };\n    }\n\n    // Equality: == !=\n    if (tok.t === T.EqEq) {\n      adv();\n      return { k: \"BinOp\", op: \"==\", left, right: parseExpr(PREC_EQ) };\n    }\n    if (tok.t === T.NotEq) {\n      adv();\n      return { k: \"BinOp\", op: \"!=\", left, right: parseExpr(PREC_EQ) };\n    }\n\n    // Comparison: > < >= <=\n    if (tok.t === T.Greater) {\n      adv();\n      return { k: \"BinOp\", op: \">\", left, right: parseExpr(PREC_CMP) };\n    }\n    if (tok.t === T.Less) {\n      adv();\n      return { k: \"BinOp\", op: \"<\", left, right: parseExpr(PREC_CMP) };\n    }\n    if (tok.t === T.GreaterEq) {\n      adv();\n      return { k: \"BinOp\", op: \">=\", left, right: parseExpr(PREC_CMP) };\n    }\n    if (tok.t === T.LessEq) {\n      adv();\n      return { k: \"BinOp\", op: \"<=\", left, right: parseExpr(PREC_CMP) };\n    }\n\n    // Logical AND\n    if (tok.t === T.And) {\n      adv();\n      return { k: \"BinOp\", op: \"&&\", left, right: parseExpr(PREC_AND) };\n    }\n\n    // Logical OR\n    if (tok.t === T.Or) {\n      adv();\n      return { k: \"BinOp\", op: \"||\", left, right: parseExpr(PREC_OR) };\n    }\n\n    // Ternary: cond ? then : else (right-associative)\n    if (tok.t === T.Question) {\n      adv(); // consume ?\n      const then = parseExpr(0);\n      eat(T.Colon);\n      const els = parseExpr(0); // right-assoc: parse at lowest prec\n      return { k: \"Ternary\", cond: left, then, else: els };\n    }\n\n    // Member access: obj.field\n    if (tok.t === T.Dot) {\n      adv(); // consume .\n      const fieldTok = cur();\n      const field =\n        fieldTok.t === T.Ident ||\n        fieldTok.t === T.Type ||\n        fieldTok.t === T.Str ||\n        fieldTok.t === T.Num\n          ? (adv(), String(fieldTok.v))\n          : fieldTok.t === T.StateVar\n            ? (adv(), (fieldTok.v as string).replace(/^\\$/, \"\"))\n            : (adv(), \"?\");\n      return { k: \"Member\", obj: left, field };\n    }\n\n    // Index access: obj[expr]\n    if (tok.t === T.LBrack) {\n      adv(); // consume [\n      const index = parseExpr(0);\n      eat(T.RBrack);\n      return { k: \"Index\", obj: left, index };\n    }\n\n    // Fallback — should not be reached if getInfixPrec is correct\n    return left;\n  }\n\n  // ── Compound parsers ───────────────────────────────────────────────────\n\n  /** Parse `TypeName(arg1, arg2, ...)` */\n  function parseComp(): ASTNode {\n    const name = cur().v as string;\n    adv(); // consume TypeName\n    eat(T.LParen);\n    const args: ASTNode[] = [];\n    while (cur().t !== T.RParen && cur().t !== T.EOF) {\n      args.push(parseExpr(0));\n      if (cur().t === T.Comma) adv();\n    }\n    eat(T.RParen);\n    return { k: \"Comp\", name, args };\n  }\n\n  /** Parse `[elem1, elem2, ...]` */\n  function parseArr(): ASTNode {\n    adv(); // skip [\n    const els: ASTNode[] = [];\n    while (cur().t !== T.RBrack && cur().t !== T.EOF) {\n      els.push(parseExpr(0));\n      if (cur().t === T.Comma) adv();\n    }\n    eat(T.RBrack);\n    return { k: \"Arr\", els };\n  }\n\n  /** Parse `{ key: value, ... }` */\n  function parseObj(): ASTNode {\n    adv(); // skip {\n    const entries: [string, ASTNode][] = [];\n    while (cur().t !== T.RBrace && cur().t !== T.EOF) {\n      const kt = cur();\n      const key =\n        kt.t === T.Ident || kt.t === T.Str || kt.t === T.Type || kt.t === T.Num\n          ? (adv(), String(kt.v))\n          : kt.t === T.StateVar\n            ? (adv(), (kt.v as string).replace(/^\\$/, \"\"))\n            : (adv(), \"?\");\n      eat(T.Colon);\n      entries.push([key, parseExpr(0)]);\n      if (cur().t === T.Comma) adv();\n    }\n    eat(T.RBrace);\n    return { k: \"Obj\", entries };\n  }\n\n  return parseExpr(0);\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// Lexer for openui-lang\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport { T, type Token } from \"./tokens\";\n\n/**\n * Tokenize an openui-lang source string into a flat token array.\n *\n * Handles all token types: identifiers, literals, operators,\n * state variables ($name), dot access, ternary.\n */\nexport function tokenize(src: string): Token[] {\n  const tokens: Token[] = [];\n  let i = 0;\n  const n = src.length;\n\n  while (i < n) {\n    // Skip horizontal whitespace (not newlines — they're significant)\n    while (i < n && (src[i] === \" \" || src[i] === \"\\t\" || src[i] === \"\\r\")) i++;\n    if (i >= n) break;\n\n    const c = src[i];\n\n    // ── Newline ────────────────────────────────────────────────────────\n    if (c === \"\\n\") {\n      tokens.push({ t: T.Newline });\n      i++;\n      continue;\n    }\n\n    // ── Single-character punctuation (brackets, comma, colon) ─────────\n    if (c === \"(\") {\n      tokens.push({ t: T.LParen });\n      i++;\n      continue;\n    }\n    if (c === \")\") {\n      tokens.push({ t: T.RParen });\n      i++;\n      continue;\n    }\n    if (c === \"[\") {\n      tokens.push({ t: T.LBrack });\n      i++;\n      continue;\n    }\n    if (c === \"]\") {\n      tokens.push({ t: T.RBrack });\n      i++;\n      continue;\n    }\n    if (c === \"{\") {\n      tokens.push({ t: T.LBrace });\n      i++;\n      continue;\n    }\n    if (c === \"}\") {\n      tokens.push({ t: T.RBrace });\n      i++;\n      continue;\n    }\n    if (c === \",\") {\n      tokens.push({ t: T.Comma });\n      i++;\n      continue;\n    }\n    if (c === \":\") {\n      tokens.push({ t: T.Colon });\n      i++;\n      continue;\n    }\n\n    // ── Equals / EqEq ─────────────────────────────────────────────────\n    if (c === \"=\") {\n      if (i + 1 < n && src[i + 1] === \"=\") {\n        tokens.push({ t: T.EqEq });\n        i += 2;\n      } else {\n        tokens.push({ t: T.Equals });\n        i++;\n      }\n      continue;\n    }\n\n    // ── Not / NotEq ───────────────────────────────────────────────────\n    if (c === \"!\") {\n      if (i + 1 < n && src[i + 1] === \"=\") {\n        tokens.push({ t: T.NotEq });\n        i += 2;\n      } else {\n        tokens.push({ t: T.Not });\n        i++;\n      }\n      continue;\n    }\n\n    // ── Greater / GreaterEq ───────────────────────────────────────────\n    if (c === \">\") {\n      if (i + 1 < n && src[i + 1] === \"=\") {\n        tokens.push({ t: T.GreaterEq });\n        i += 2;\n      } else {\n        tokens.push({ t: T.Greater });\n        i++;\n      }\n      continue;\n    }\n\n    // ── Less / LessEq ────────────────────────────────────────────────\n    if (c === \"<\") {\n      if (i + 1 < n && src[i + 1] === \"=\") {\n        tokens.push({ t: T.LessEq });\n        i += 2;\n      } else {\n        tokens.push({ t: T.Less });\n        i++;\n      }\n      continue;\n    }\n\n    // ── And (&&) ──────────────────────────────────────────────────────\n    if (c === \"&\") {\n      if (i + 1 < n && src[i + 1] === \"&\") {\n        tokens.push({ t: T.And });\n        i += 2;\n      } else {\n        tokens.push({ t: T.And });\n        i++;\n      }\n      continue;\n    }\n\n    // ── Or (||) ───────────────────────────────────────────────────────\n    if (c === \"|\") {\n      if (i + 1 < n && src[i + 1] === \"|\") {\n        tokens.push({ t: T.Or });\n        i += 2;\n      } else {\n        tokens.push({ t: T.Or });\n        i++;\n      }\n      continue;\n    }\n\n    // ── Dot ───────────────────────────────────────────────────────────\n    if (c === \".\") {\n      tokens.push({ t: T.Dot });\n      i++;\n      continue;\n    }\n\n    // ── Question ──────────────────────────────────────────────────────\n    if (c === \"?\") {\n      tokens.push({ t: T.Question });\n      i++;\n      continue;\n    }\n\n    // ── Plus ──────────────────────────────────────────────────────────\n    if (c === \"+\") {\n      tokens.push({ t: T.Plus });\n      i++;\n      continue;\n    }\n\n    // ── Star ──────────────────────────────────────────────────────────\n    if (c === \"*\") {\n      tokens.push({ t: T.Star });\n      i++;\n      continue;\n    }\n\n    // ── Slash ─────────────────────────────────────────────────────────\n    if (c === \"/\") {\n      tokens.push({ t: T.Slash });\n      i++;\n      continue;\n    }\n\n    // ── Percent ───────────────────────────────────────────────────────\n    if (c === \"%\") {\n      tokens.push({ t: T.Percent });\n      i++;\n      continue;\n    }\n\n    // ── String literal: \"...\" ─────────────────────────────────────────\n    if (c === '\"') {\n      const start = i;\n      i++; // skip opening quote\n      let isClosed = false;\n      // Fast-forward to the closing quote, respecting escapes\n      while (i < n) {\n        if (src[i] === \"\\\\\") {\n          i += 2; // skip backslash and the escaped character\n        } else if (src[i] === '\"') {\n          i++; // include the closing quote\n          isClosed = true;\n          break;\n        } else {\n          i++;\n        }\n      }\n      const rawString = src.slice(start, i);\n      try {\n        // Let JavaScript's native JSON parser handle all unescaping (\\n, \\t, \\uXXXX, etc.)\n        // If the string is incomplete (streaming), we add a closing quote to parse what we have so far.\n        const validJsonString = isClosed ? rawString : rawString + '\"';\n        tokens.push({ t: T.Str, v: JSON.parse(validJsonString) });\n      } catch {\n        // Fallback if JSON.parse fails (e.g., malformed unicode escape during streaming)\n        // Strip the quotes and return the raw text so the UI doesn't crash\n        const stripped = rawString.replace(/^\"|\"$/g, \"\");\n        tokens.push({ t: T.Str, v: stripped });\n      }\n      continue;\n    }\n\n    // ── String literal: '...' (single quotes) ────────────────────────\n    if (c === \"'\") {\n      i++; // skip opening quote\n      let result = \"\";\n      let isClosed = false;\n      while (i < n) {\n        if (src[i] === \"\\\\\") {\n          i++; // skip backslash\n          if (i < n) {\n            const esc = src[i];\n            if (esc === \"'\") result += \"'\";\n            else if (esc === \"\\\\\") result += \"\\\\\";\n            else if (esc === \"n\") result += \"\\n\";\n            else if (esc === \"t\") result += \"\\t\";\n            else result += esc; // pass through other escaped chars\n            i++;\n          }\n        } else if (src[i] === \"'\") {\n          i++; // skip closing quote\n          isClosed = true;\n          break;\n        } else {\n          result += src[i];\n          i++;\n        }\n      }\n      void isClosed; // consumed for streaming parity with double-quote path\n      tokens.push({ t: T.Str, v: result });\n      continue;\n    }\n\n    // ── Minus: negative number literal or subtraction operator ────────\n    if (c === \"-\") {\n      const prev = tokens.length > 0 ? tokens[tokens.length - 1] : null;\n      const afterValue =\n        prev != null &&\n        (prev.t === T.Num ||\n          prev.t === T.Str ||\n          prev.t === T.Ident ||\n          prev.t === T.Type ||\n          prev.t === T.RParen ||\n          prev.t === T.RBrack ||\n          prev.t === T.True ||\n          prev.t === T.False ||\n          prev.t === T.Null ||\n          prev.t === T.StateVar ||\n          prev.t === T.BuiltinCall);\n\n      if (!afterValue && i + 1 < n && src[i + 1] >= \"0\" && src[i + 1] <= \"9\") {\n        // Negative number literal — fall through to number parsing below\n      } else {\n        // Binary subtraction operator (or unary minus handled by expression parser)\n        tokens.push({ t: T.Minus });\n        i++;\n        continue;\n      }\n    }\n\n    // ── Number literal: 42, -3, 1.5, 1e10 ────────────────────────────\n    const isDigit = c >= \"0\" && c <= \"9\";\n    const isNegDigit = c === \"-\" && i + 1 < n && src[i + 1] >= \"0\" && src[i + 1] <= \"9\";\n    if (isDigit || isNegDigit) {\n      const start = i;\n      if (src[i] === \"-\") i++; // optional minus\n      while (i < n && src[i] >= \"0\" && src[i] <= \"9\") i++; // integer part\n      if (i < n && src[i] === \".\" && i + 1 < n && src[i + 1] >= \"0\" && src[i + 1] <= \"9\") {\n        // optional decimal — only if a digit follows the dot\n        i++;\n        while (i < n && src[i] >= \"0\" && src[i] <= \"9\") i++;\n      }\n      if (i < n && (src[i] === \"e\" || src[i] === \"E\")) {\n        // optional exponent\n        i++;\n        if (i < n && (src[i] === \"+\" || src[i] === \"-\")) i++;\n        while (i < n && src[i] >= \"0\" && src[i] <= \"9\") i++;\n      }\n      tokens.push({ t: T.Num, v: +src.slice(start, i) });\n      continue;\n    }\n\n    // ── State variable: $identifier ───────────────────────────────────\n    if (\n      c === \"$\" &&\n      i + 1 < n &&\n      ((src[i + 1] >= \"a\" && src[i + 1] <= \"z\") ||\n        (src[i + 1] >= \"A\" && src[i + 1] <= \"Z\") ||\n        src[i + 1] === \"_\")\n    ) {\n      const start = i;\n      i++; // skip $\n      while (\n        i < n &&\n        ((src[i] >= \"a\" && src[i] <= \"z\") ||\n          (src[i] >= \"A\" && src[i] <= \"Z\") ||\n          (src[i] >= \"0\" && src[i] <= \"9\") ||\n          src[i] === \"_\")\n      )\n        i++;\n      tokens.push({ t: T.StateVar, v: src.slice(start, i) });\n      continue;\n    }\n\n    // ── Keyword or identifier ─────────────────────────────────────────\n    const isAlpha = (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\";\n    if (isAlpha) {\n      const start = i;\n      while (\n        i < n &&\n        ((src[i] >= \"a\" && src[i] <= \"z\") ||\n          (src[i] >= \"A\" && src[i] <= \"Z\") ||\n          (src[i] >= \"0\" && src[i] <= \"9\") ||\n          src[i] === \"_\")\n      )\n        i++;\n      const word = src.slice(start, i);\n      if (word === \"true\") {\n        tokens.push({ t: T.True });\n        continue;\n      }\n      if (word === \"false\") {\n        tokens.push({ t: T.False });\n        continue;\n      }\n      if (word === \"null\") {\n        tokens.push({ t: T.Null });\n        continue;\n      }\n      // PascalCase → component type name; lowercase → variable reference\n      const kind = c >= \"A\" && c <= \"Z\" ? T.Type : T.Ident;\n      tokens.push({ t: kind, v: word });\n      continue;\n    }\n\n    // ── Builtin call: @identifier ───────────────────────────────────\n    if (\n      c === \"@\" &&\n      i + 1 < n &&\n      ((src[i + 1] >= \"a\" && src[i + 1] <= \"z\") ||\n        (src[i + 1] >= \"A\" && src[i + 1] <= \"Z\") ||\n        src[i + 1] === \"_\")\n    ) {\n      i++; // skip @\n      const start = i;\n      while (\n        i < n &&\n        ((src[i] >= \"a\" && src[i] <= \"z\") ||\n          (src[i] >= \"A\" && src[i] <= \"Z\") ||\n          (src[i] >= \"0\" && src[i] <= \"9\") ||\n          src[i] === \"_\")\n      )\n        i++;\n      tokens.push({ t: T.BuiltinCall, v: src.slice(start, i) });\n      continue;\n    }\n\n    i++; // skip any other character (e.g. #, emojis)\n  }\n\n  tokens.push({ t: T.EOF });\n  return tokens;\n}\n","import { isASTNode } from \"./ast\";\nimport {\n  isElementNode,\n  type ElementNode,\n  type MaterializeCtx,\n  type ParamDef,\n  type ScalarParamType,\n} from \"./types\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Schema & value introspection\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** `typeof` results a scalar/enum leaf can be checked against. */\nconst SCALAR_TYPEOFS: readonly string[] = [\"string\", \"number\", \"boolean\"];\n\nconst NO_PROPS: Record<string, unknown> = {};\nconst NO_REQUIRED: readonly string[] = [];\n\nfunction jsType(value: unknown): string {\n  return Array.isArray(value) ? \"array\" : typeof value;\n}\n\n/** `{ $ref: \"#/$defs/Name\" }` → `\"Name\"`. */\nfunction refName(s: Record<string, unknown>): string | undefined {\n  return typeof s[\"$ref\"] === \"string\" ? s[\"$ref\"].split(\"/\").pop() : undefined;\n}\n\n/** Composite shapes can't be reliably matched to a single plain value. */\nfunction isCompositeSchema(s: Record<string, unknown>): boolean {\n  return \"$ref\" in s || \"anyOf\" in s || \"oneOf\" in s || \"allOf\" in s;\n}\n\n/** Scalar type/enum info extracted from a JSON Schema leaf, for describeTypeMismatch. */\ninterface ScalarTypeInfo {\n  /** Scalar leaf type, when the property is a plain string/number/boolean. */\n  expectedType?: ScalarParamType;\n  /** Allowed literal values from `enum`/`const`. */\n  enumValues?: readonly unknown[];\n}\n\n/** Extract the scalar leaf type/enum from an already-narrowed JSON Schema object. */\nexport function getScalarTypeInfo(s: Record<string, unknown>): ScalarTypeInfo {\n  if (Array.isArray(s[\"enum\"])) return { enumValues: s[\"enum\"] };\n  if (\"const\" in s) return { enumValues: [s[\"const\"]] };\n  switch (s[\"type\"]) {\n    case \"string\":\n      return { expectedType: \"string\" };\n    case \"number\":\n    case \"integer\":\n      return { expectedType: \"number\" };\n    case \"boolean\":\n      return { expectedType: \"boolean\" };\n    default:\n      return {};\n  }\n}\n\n/** Read a JSON Schema fragment's `default`, if it carries one. */\nexport function getSchemaDefaultValue(property: unknown): unknown {\n  if (!property || typeof property !== \"object\" || Array.isArray(property)) {\n    return undefined;\n  }\n  return (property as { default?: unknown }).default;\n}\n\n/** Returns the expected type for a param from its schema properties */\nexport function getTypeFromSchema(property: unknown): string | undefined {\n  if (!property || typeof property !== \"object\" || Array.isArray(property)) {\n    return undefined;\n  }\n  const p = property as Record<string, unknown>;\n  // $refs and compound types aren't validator-checkable but still make useful hints.\n  const ref = refName(p);\n  if (ref) return ref;\n  // Scalar/enum leaves: share the validator's schema-leaf interpretation so\n  // signatures and type-mismatch messages never disagree.\n  const leaf = getScalarTypeInfo(p);\n  if (leaf.enumValues) {\n    return leaf.enumValues.map((v) => JSON.stringify(v)).join(\"|\");\n  }\n  if (leaf.expectedType) {\n    return leaf.expectedType;\n  }\n  return typeof p.type === \"string\" ? p.type : undefined;\n}\n\n/**\n * Build a typed signature like `Header(title*: string, variant: \"a\"|\"b\")` from\n * compiled params — * marks required. Positional order is preserved so an LLM\n * can fix swapped args.\n */\nexport function buildParamsSignature(component: string, params: ParamDef[]): string {\n  const rendered = params\n    .map((p) => {\n      const type = getTypeFromSchema(p.schema);\n      const marked = p.required ? `${p.name}*` : p.name;\n      return type ? `${marked}: ${type}` : marked;\n    })\n    .join(\", \");\n  return `${component}(${rendered})`;\n}\n\n/** Checks a param's returned value against its expected value */\nfunction checkTypeMismatch(\n  value: unknown,\n  info: ScalarTypeInfo,\n): { expected: string; actual: string } | null {\n  const actual = typeof value;\n  if (info.enumValues) {\n    if (!SCALAR_TYPEOFS.includes(actual)) return null;\n    if (info.enumValues.includes(value)) return null;\n    return {\n      expected: `one of [${info.enumValues.map((v) => JSON.stringify(v)).join(\", \")}]`,\n      actual: JSON.stringify(value),\n    };\n  }\n  if (info.expectedType && info.expectedType !== actual) {\n    return { expected: info.expectedType, actual: jsType(value) };\n  }\n  return null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Errors\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A structured validation issue. Every error of a kind reads identically\n * because its message template lives in validationMessage — call sites only\n * supply the varying parts.\n */\nexport type ValidationIssue =\n  | { code: \"type-mismatch\"; expected: string; actual: string }\n  | { code: \"missing-required\"; signature?: string }\n  | { code: \"null-required\"; signature?: string }\n  | { code: \"unknown-component\"; available?: string[] }\n  | { code: \"inline-reserved\" }\n  | { code: \"excess-args\"; declared: number; got: number }\n  | { code: \"unknown-function\" }\n  | { code: \"no-root\"; reason: \"missing\" | \"not-component\" | \"fallback\" };\n\nfunction validationMessage(component: string, path: string, issue: ValidationIssue): string {\n  switch (issue.code) {\n    case \"type-mismatch\":\n      return `field \"${path}\" expects ${issue.expected} but got ${issue.actual}`;\n    case \"missing-required\":\n      return `missing required field \"${path}\"${issue.signature ? ` — signature: ${issue.signature}` : \"\"}`;\n    case \"null-required\":\n      return `required field \"${path}\" cannot be null${issue.signature ? ` — signature: ${issue.signature}` : \"\"}`;\n    case \"unknown-component\":\n      return `Unknown component \"${component}\" — not found in catalog or builtins${issue.available?.length ? `. Available components: ${issue.available.join(\", \")}` : \"\"}`;\n    case \"inline-reserved\":\n      return `${component}() must be declared as a top-level statement, not used inline as a value`;\n    case \"excess-args\":\n      return `${component} takes ${issue.declared} arg(s), got ${issue.got} (${issue.got - issue.declared} excess dropped)`;\n    case \"unknown-function\":\n      return `Unknown function \"@${component}\": not a built-in or action step. The call evaluates to null`;\n    case \"no-root\":\n      if (issue.reason === \"not-component\") return \"root does not evaluate to a component\";\n      if (issue.reason === \"fallback\") {\n        return `No root statement. Rendering the first statement that calls the root component ${component}`;\n      }\n      return component\n        ? `No root statement, and no statement calls the root component ${component}`\n        : \"No root statement\";\n  }\n}\n\n/** Append a validation error, deriving its message from the structured issue. */\nexport function pushValidationIssue(\n  ctx: MaterializeCtx,\n  component: string,\n  path: string,\n  issue: ValidationIssue,\n): void {\n  ctx.errors.push({\n    code: issue.code,\n    component,\n    path,\n    message: validationMessage(component, path, issue),\n    statementId: ctx.currentStatementId,\n    ...(issue.code === \"no-root\" &&\n      issue.reason === \"fallback\" && { severity: \"warning\" as const }),\n  });\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Invalid-value resolution — the edge rule\n// ─────────────────────────────────────────────────────────────────────────────\n\n// \"x\" against {type: \"number\"} -> INVALID, after reporting the type-mismatch\nexport const INVALID: unique symbol = Symbol(\"invalid\");\n\n// invalid value: default 5 -> 5; no default -> INVALID if required, else undefined (omit)\nexport function resolveInvalidValue(required: boolean, defaultValue: unknown): unknown {\n  if (defaultValue !== undefined) return defaultValue;\n  return required ? INVALID : undefined;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Validators — one per schema shape, dispatched by validateSchemaValue\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Position check for a component element in a data slot: slots that admit\n * components ($ref / anyOf / oneOf members) are left unchecked, a slot\n * declaring a plain-data shape can never be satisfied by a component, and\n * unconstrained slots stay conservative.\n */\nfunction validateElementPosition(\n  element: ElementNode,\n  s: Record<string, unknown>,\n  component: string,\n  path: string,\n  ctx: MaterializeCtx,\n): boolean {\n  if (isCompositeSchema(s)) return false;\n  if (typeof s[\"type\"] === \"string\" || Array.isArray(s[\"enum\"]) || \"const\" in s) {\n    pushValidationIssue(ctx, component, path, {\n      code: \"type-mismatch\",\n      expected: typeof s[\"type\"] === \"string\" ? s[\"type\"] : \"a literal value\",\n      actual: `component \"${element.typeName}\"`,\n    });\n    return true;\n  }\n  return false;\n}\n\n/** The `$ref` names a slot allows: one for `$ref`, several for anyOf/oneOf. */\nfunction slotRefNames(s: Record<string, unknown>): (string | undefined)[] {\n  return ((s[\"anyOf\"] ?? s[\"oneOf\"] ?? [s]) as Record<string, unknown>[]).map(refName);\n}\n\n/** True when every option of the slot is a `$ref` to a component. */\nfunction isOnlyComponentSlot(s: Record<string, unknown>, ctx: MaterializeCtx): boolean {\n  const names = slotRefNames(s);\n  return names.length > 0 && names.every((n) => n !== undefined && ctx.cat?.has(n));\n}\n\n/**\n * Validate an object-shaped slot: container type, required keys (absent/null\n * ones fill silently from their schema default), then each declared property\n * recursively, resolving invalid children via the edge rule. Copies the object\n * only when a key changes.\n */\nfunction validateObjectValue(\n  value: unknown,\n  s: Record<string, unknown>,\n  component: string,\n  path: string,\n  ctx: MaterializeCtx,\n): unknown {\n  if (typeof value !== \"object\" || Array.isArray(value)) {\n    pushValidationIssue(ctx, component, path, {\n      code: \"type-mismatch\",\n      expected: \"object\",\n      actual: jsType(value),\n    });\n    return INVALID;\n  }\n  const obj = value as Record<string, unknown>;\n  let out: Record<string, unknown> | undefined;\n  const props =\n    s[\"properties\"] && typeof s[\"properties\"] === \"object\"\n      ? (s[\"properties\"] as Record<string, unknown>)\n      : NO_PROPS;\n  const required = Array.isArray(s[\"required\"]) ? (s[\"required\"] as string[]) : NO_REQUIRED;\n  let invalid = false;\n  // Structural checks are streaming-sensitive — only run on complete input.\n  if (!ctx.partial) {\n    for (const key of required) {\n      const present = key in obj;\n      if (!present || obj[key] == null) {\n        const fallback = getSchemaDefaultValue(props[key]);\n        if (fallback !== undefined) {\n          (out ??= { ...obj })[key] = fallback;\n          continue;\n        }\n        pushValidationIssue(ctx, component, `${path}/${key}`, {\n          code: present ? \"null-required\" : \"missing-required\",\n        });\n        invalid = true;\n      }\n    }\n  }\n  for (const key of Object.keys(props)) {\n    if (!(key in obj)) continue;\n    const sub = props[key];\n    let next = validateSchemaValue(obj[key], sub, component, `${path}/${key}`, ctx);\n    if (next === INVALID) {\n      next = resolveInvalidValue(required.includes(key), getSchemaDefaultValue(sub));\n      if (next === INVALID) {\n        invalid = true;\n        continue;\n      }\n    }\n    if (next === obj[key]) continue;\n    out ??= { ...obj };\n    if (next === undefined) delete out[key];\n    else out[key] = next;\n  }\n  return invalid ? INVALID : (out ?? obj);\n}\n\n/**\n * Validate an array slot. Invalid items are pruned; error paths keep the\n * original indices. Copies the array only when an item changes.\n */\nfunction validateArrayValue(\n  value: unknown,\n  s: Record<string, unknown>,\n  component: string,\n  path: string,\n  ctx: MaterializeCtx,\n): unknown {\n  if (!Array.isArray(value)) {\n    pushValidationIssue(ctx, component, path, {\n      code: \"type-mismatch\",\n      expected: \"array\",\n      actual: jsType(value),\n    });\n    return INVALID;\n  }\n  const items = s[\"items\"];\n  if (!items || typeof items !== \"object\" || Array.isArray(items)) return value;\n  let out: unknown[] | undefined;\n  for (let i = 0; i < value.length; i++) {\n    const next = validateSchemaValue(value[i], items, component, `${path}/${i}`, ctx);\n    if (next !== value[i] && !out) out = value.slice(0, i);\n    if (out && next !== INVALID) out.push(next);\n  }\n  return out ?? value;\n}\n\n/**\n * Validate a scalar/enum leaf. Enum membership defers while streaming — a\n * partial literal may still complete toward a valid member; scalar type\n * checks stay on (a wrong type won't become right with more input).\n */\nfunction validateLeafValue(\n  value: unknown,\n  s: Record<string, unknown>,\n  component: string,\n  path: string,\n  ctx: MaterializeCtx,\n): boolean {\n  const leaf = getScalarTypeInfo(s);\n  if (leaf.expectedType == null && leaf.enumValues == null) return false;\n  if (leaf.enumValues && ctx.partial) return false;\n  const mismatch = checkTypeMismatch(value, leaf);\n  if (mismatch) {\n    pushValidationIssue(ctx, component, path, { code: \"type-mismatch\", ...mismatch });\n    return true;\n  }\n  return false;\n}\n\n/**\n * Recursively validate a materialized value against a JSON Schema fragment.\n * Dispatches on the schema shape: objects and arrays descend recursively\n * (reporting nested errors with JSON-pointer paths), leaf scalars check\n * type/enum, and component elements get a position check only (their own args\n * validate separately).\n *\n * Every violation is reported, then the same rule (resolveInvalidValue)\n * applies at each recursion edge: schema default → substitute; REQUIRED edge →\n * parent invalid, caller repeats one level up; OPTIONAL edge → prune. ARRAY\n * ITEMS are always pruned. Absent/null required keys fill silently from their\n * schema default; reported violations keep their error even when a default steps in.\n *\n * Never mutates: returns the value itself when nothing changes, a cleaned copy\n * when something does, or INVALID.\n */\nexport function validateSchemaValue(\n  value: unknown,\n  schema: unknown,\n  component: string,\n  path: string,\n  ctx: MaterializeCtx,\n): unknown {\n  if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) return value;\n  const s = schema as Record<string, unknown>;\n  // Absence is handled by required checks on the parent; skip null/undefined.\n  if (value == null) return value;\n  // Dynamic runtime expressions ($var, builtins) resolve later — don't flag.\n  if (isASTNode(value)) return value;\n  // Child components: only their position is checked here.\n  if (isElementNode(value)) {\n    return validateElementPosition(value, s, component, path, ctx) ? INVALID : value;\n  }\n  if (isCompositeSchema(s)) {\n    // Data (an object, array, string, number or boolean) in a component-only slot is invalid.\n    if (!isOnlyComponentSlot(s, ctx)) return value;\n    pushValidationIssue(ctx, component, path, {\n      code: \"type-mismatch\",\n      expected: slotRefNames(s).join(\" | \"),\n      actual: Array.isArray(value)\n        ? \"array\"\n        : typeof value === \"object\"\n          ? \"plain object\"\n          : typeof value,\n    });\n    return INVALID;\n  }\n\n  const type = s[\"type\"];\n  if (type === \"object\") return validateObjectValue(value, s, component, path, ctx);\n  if (type === \"array\") return validateArrayValue(value, s, component, path, ctx);\n  return validateLeafValue(value, s, component, path, ctx) ? INVALID : value;\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// Schema-aware materialization — single-pass lowering\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { ASTNode } from \"./ast\";\nimport { isASTNode, isRuntimeExpr, literalValue, toLiteralAST, walkAST } from \"./ast\";\nimport { getCallDefs, isReservedCall, RESERVED_CALLS } from \"./builtins\";\nimport { isElementNode, type CallDef, type MaterializeCtx, type ParamDef } from \"./types\";\nimport {\n  buildParamsSignature,\n  INVALID,\n  pushValidationIssue,\n  resolveInvalidValue,\n  validateSchemaValue,\n} from \"./validation\";\n\n/**\n * Recursively check if a prop value contains any AST nodes that need runtime\n * evaluation. Walks into arrays, ElementNode children, and plain objects.\n */\nexport function containsDynamicValue(v: unknown): boolean {\n  if (v == null || typeof v !== \"object\") return false;\n  if (isASTNode(v)) return true;\n  if (Array.isArray(v)) return v.some(containsDynamicValue);\n  if (isElementNode(v)) {\n    return Object.values(v.props).some(containsDynamicValue);\n  }\n  const obj = v as Record<string, unknown>;\n  // A `{steps: [...]}` literal is evaluated too, so data cannot pose as custom action steps\n  if (Array.isArray(obj.steps)) return true;\n  return Object.values(obj).some(containsDynamicValue);\n}\n\n/**\n * Resolve a Ref node: inline from symbol table, detect cycles, emit RuntimeRef\n * for Query/Mutation declarations. Shared by materializeValue and materializeExpr.\n */\nfunction resolveRef(name: string, ctx: MaterializeCtx, mode: \"value\" | \"expr\"): unknown | ASTNode {\n  if (ctx.visited.has(name)) {\n    ctx.unres.push(name);\n    return mode === \"expr\" ? { k: \"Ph\", n: name } : null;\n  }\n  if (!ctx.syms.has(name)) {\n    ctx.unres.push(name);\n    return mode === \"expr\" ? { k: \"Ph\", n: name } : null;\n  }\n  const target = ctx.syms.get(name)!;\n  ctx.unreached?.delete(name);\n  // Query/Mutation declarations → RuntimeRef (resolved at runtime by evaluator)\n  if (target.k === \"Comp\" && isReservedCall(target.name)) {\n    const refType =\n      target.name === RESERVED_CALLS.Mutation ? (\"mutation\" as const) : (\"query\" as const);\n    return { k: \"RuntimeRef\", n: name, refType };\n  }\n  ctx.visited.add(name);\n  const prevStatementId = ctx.currentStatementId;\n  ctx.currentStatementId = name;\n  try {\n    const result = mode === \"value\" ? materializeValue(target, ctx) : materializeExpr(target, ctx);\n    // Tag ElementNode with its source statement name\n    if (mode === \"value\" && isElementNode(result)) {\n      result.statementId = name;\n    }\n    return result;\n  } finally {\n    ctx.currentStatementId = prevStatementId;\n    ctx.visited.delete(name);\n  }\n}\n\n/** Registry calls (functions and steps) and reserved calls stay AST for the runtime. */\nfunction isRuntimeCall(name: string, ctx: MaterializeCtx): boolean {\n  return getCallDefs(ctx.cat).has(name) || isReservedCall(name);\n}\n\n// [Num 1, Ref x] with params [a, b] -> {a: Num 1, b: Ref x}; extra args dropped\nexport function nameArgs(args: ASTNode[], params: ParamDef[]): Record<string, ASTNode> {\n  const named: Record<string, ASTNode> = {};\n  for (let i = 0; i < params.length && i < args.length; i++) named[params[i]!.name] = args[i]!;\n  return named;\n}\n\n// @Percent(\"x\", 4) -> type-mismatch at parse time, call becomes null\nexport function mapCallArgs(\n  name: string,\n  args: ASTNode[],\n  def: CallDef,\n  ctx: MaterializeCtx,\n): Record<string, ASTNode> | null {\n  const { params } = def;\n  if (args.length > params.length) {\n    pushValidationIssue(ctx, name, \"\", {\n      code: \"excess-args\",\n      declared: params.length,\n      got: args.length,\n    });\n  }\n  const mapped = nameArgs(args, params);\n  let invalid = false;\n  const errorsBefore = ctx.errors.length;\n  for (const p of params) {\n    const arg = mapped[p.name];\n    const lit = arg ? literalValue(arg) : { v: undefined };\n    if (!lit) continue;\n    if (lit.v == null) {\n      if (!p.required || p.defaultValue !== undefined) continue;\n      pushValidationIssue(ctx, name, `/${p.name}`, {\n        code: arg ? \"null-required\" : \"missing-required\",\n        signature: buildParamsSignature(name, params),\n      });\n      invalid = true;\n      continue;\n    }\n    let next = validateSchemaValue(lit.v, p.schema, name, `/${p.name}`, ctx);\n    if (next === INVALID) next = resolveInvalidValue(p.required, p.defaultValue);\n    if (next === INVALID) invalid = true;\n    else if (next === undefined) delete mapped[p.name];\n    else if (next !== lit.v) mapped[p.name] = toLiteralAST(next);\n  }\n  // An action never runs with a value the model did not write:\n  // @ExportFile(\"report\", \"xlsx\") is a no-op, not an export with the \"csv\" default\n  if (def.kind === \"action\" && ctx.errors.length > errorsBefore) invalid = true;\n  return invalid ? null : mapped;\n}\n\n// @Percent(3, total) -> mappedProps {part: Num 3, total: <total AST>}\nfunction materializeCall(\n  node: ASTNode & { k: \"Comp\" },\n  ctx: MaterializeCtx,\n  materializeArg: (a: ASTNode) => ASTNode,\n): ASTNode {\n  const args = node.args.map(materializeArg);\n  const def = getCallDefs(ctx.cat).get(node.name);\n  if (!def || def.lazy) return { ...node, args };\n  // Built-ins coerce their args, so only library calls are checked\n  const mappedProps = def.builtin\n    ? nameArgs(args, def.params)\n    : mapCallArgs(node.name, args, def, ctx);\n  if (mappedProps) return { ...node, args, mappedProps };\n  // An invalid action step is an empty plan, a no-op\n  return def.kind === \"action\"\n    ? { k: \"Comp\", name: \"Action\", args: [{ k: \"Arr\", els: [] }] }\n    : { k: \"Null\" };\n}\n\n// Query(\"s\", {n: @Count(rows)}): names @Count's args in place.\n// Literal library args are checked like props; an invalid call keeps raw names and is null at runtime.\nexport function nameRawCallArgs(args: ASTNode[], ctx: MaterializeCtx, statementId: string): void {\n  const prevStatementId = ctx.currentStatementId;\n  ctx.currentStatementId = statementId;\n  const seen = new Set<ASTNode>(); // walkAST visits nested calls through args and mappedProps\n  for (const arg of args) {\n    walkAST(arg, (node) => {\n      if (node.k !== \"Comp\" || seen.has(node)) return;\n      seen.add(node);\n      const def = getCallDefs(ctx.cat).get(node.name);\n      if (!def || def.lazy) return;\n      const checked = def.builtin ? null : mapCallArgs(node.name, node.args, def, ctx);\n      node.mappedProps = checked ?? nameArgs(node.args, def.params);\n    });\n  }\n  ctx.currentStatementId = prevStatementId;\n}\n\n/**\n * If node is a lazy builtin like Each(arr, varName, template), temporarily\n * scope the iterator variable during materialization so template refs resolve.\n * Returns the materialized Comp node, or null if not a lazy builtin.\n */\nfunction materializeLazyBuiltin(\n  node: ASTNode & { k: \"Comp\" },\n  ctx: MaterializeCtx,\n  scopedRefs: ReadonlySet<string>,\n): ASTNode | null {\n  const def = getCallDefs(ctx.cat).get(node.name);\n  if (def?.kind !== \"function\" || !def.lazy || node.args.length < 3) return null;\n  const varArg = node.args[1];\n  const varName = varArg.k === \"Ref\" ? varArg.n : varArg.k === \"Str\" ? varArg.v : null;\n  if (!varName) return null;\n\n  const nextScopedRefs = new Set(scopedRefs);\n  nextScopedRefs.add(varName);\n  // Skip args[1] (the iterator declaration) but preserve scoped refs elsewhere.\n  const recursedArgs = node.args.map((a, i) =>\n    i === 1 ? a : materializeExprInternal(a, ctx, nextScopedRefs),\n  );\n  return { ...node, args: recursedArgs };\n}\n\nfunction materializeExprInternal(\n  node: ASTNode,\n  ctx: MaterializeCtx,\n  scopedRefs: ReadonlySet<string>,\n): ASTNode {\n  switch (node.k) {\n    case \"Ref\":\n      return scopedRefs.has(node.n) ? node : (resolveRef(node.n, ctx, \"expr\") as ASTNode);\n\n    case \"Ph\":\n      return node;\n\n    case \"Comp\": {\n      if (node.fn && !isRuntimeCall(node.name, ctx)) {\n        pushValidationIssue(ctx, node.name, \"\", { code: \"unknown-function\" });\n        return { k: \"Null\" };\n      }\n      const lazy = materializeLazyBuiltin(node, ctx, scopedRefs);\n      if (lazy) return lazy;\n      // Built-ins, library functions, action steps, reserved calls: keep as AST\n      if (isRuntimeCall(node.name, ctx)) {\n        return materializeCall(node, ctx, (a) => materializeExprInternal(a, ctx, scopedRefs));\n      }\n      const recursedArgs = node.args.map((a) => materializeExprInternal(a, ctx, scopedRefs));\n      // Catalog component: add mappedProps for the evaluator\n      const def = ctx.cat?.get(node.name);\n      if (def) {\n        const mappedProps: Record<string, ASTNode> = {};\n        for (let i = 0; i < def.params.length && i < recursedArgs.length; i++) {\n          mappedProps[def.params[i].name] = recursedArgs[i];\n        }\n        return { ...node, args: recursedArgs, mappedProps };\n      }\n      // Unknown component in expression: push error (same as value path)\n      pushValidationIssue(ctx, node.name, \"\", {\n        code: \"unknown-component\",\n        available: ctx.cat && [...ctx.cat.keys()],\n      });\n      return { ...node, args: recursedArgs };\n    }\n\n    case \"Arr\":\n      return { ...node, els: node.els.map((e) => materializeExprInternal(e, ctx, scopedRefs)) };\n    case \"Obj\":\n      return {\n        ...node,\n        entries: node.entries.map(\n          ([k, v]) => [k, materializeExprInternal(v, ctx, scopedRefs)] as [string, ASTNode],\n        ),\n      };\n    case \"BinOp\":\n      return {\n        ...node,\n        left: materializeExprInternal(node.left, ctx, scopedRefs),\n        right: materializeExprInternal(node.right, ctx, scopedRefs),\n      };\n    case \"UnaryOp\":\n      return { ...node, operand: materializeExprInternal(node.operand, ctx, scopedRefs) };\n    case \"Ternary\":\n      return {\n        ...node,\n        cond: materializeExprInternal(node.cond, ctx, scopedRefs),\n        then: materializeExprInternal(node.then, ctx, scopedRefs),\n        else: materializeExprInternal(node.else, ctx, scopedRefs),\n      };\n    case \"Member\":\n      return { ...node, obj: materializeExprInternal(node.obj, ctx, scopedRefs) };\n    case \"Index\":\n      return {\n        ...node,\n        obj: materializeExprInternal(node.obj, ctx, scopedRefs),\n        index: materializeExprInternal(node.index, ctx, scopedRefs),\n      };\n    case \"Assign\":\n      return { ...node, value: materializeExprInternal(node.value, ctx, scopedRefs) };\n\n    // Literals, StateRef, RuntimeRef — pass through unchanged\n    default:\n      return node;\n  }\n}\n\n/**\n * Normalize an AST node for use inside runtime expressions.\n * Resolves Refs, adds mappedProps to catalog Comp nodes.\n * Returns ASTNode — structure preserved for runtime evaluation by the evaluator.\n */\nexport function materializeExpr(node: ASTNode, ctx: MaterializeCtx): ASTNode {\n  return materializeExprInternal(node, ctx, new Set());\n}\n\n/**\n * Schema-aware materialization: resolves refs, normalizes catalog component args\n * to named props, validates required props, applies defaults, converts literals\n * to plain values, and preserves runtime expressions as AST nodes — all in a\n * single recursive traversal.\n *\n * Returns:\n *   - ElementNode for catalog/unknown components\n *   - ASTNode for builtins and runtime expression nodes\n *   - Plain values for literals, arrays, objects\n *   - null for placeholders\n */\nexport function materializeValue(node: ASTNode, ctx: MaterializeCtx): unknown {\n  switch (node.k) {\n    // ── Ref resolution ───────────────────────────────────────────────────\n    case \"Ref\":\n      return resolveRef(node.n, ctx, \"value\");\n\n    // ── Literals → plain values ──────────────────────────────────────────\n    case \"Str\":\n      return node.v;\n    case \"Num\":\n      return node.v;\n    case \"Bool\":\n      return node.v;\n    case \"Null\":\n      return null;\n    case \"Ph\":\n      return null;\n\n    // ── Collections ──────────────────────────────────────────────────────\n    case \"Arr\": {\n      const items: unknown[] = [];\n      for (const e of node.els) {\n        // Drop unresolved placeholders from arrays\n        if (e.k === \"Ph\") continue;\n        const value = materializeValue(e, ctx);\n        // Drop null entries from component/ref resolution (incomplete props, unresolved refs, unknown components)\n        if (value === null && (e.k === \"Comp\" || e.k === \"Ref\")) continue;\n        items.push(value);\n      }\n      return items;\n    }\n    case \"Obj\": {\n      const o: Record<string, unknown> = {};\n      for (const [k, v] of node.entries) o[k] = materializeValue(v, ctx);\n      return o;\n    }\n\n    // ── Component nodes ──────────────────────────────────────────────────\n    case \"Comp\": {\n      const { name, args } = node;\n\n      if (node.fn && !isRuntimeCall(name, ctx)) {\n        pushValidationIssue(ctx, name, \"\", { code: \"unknown-function\" });\n        return null;\n      }\n\n      // Inline Query/Mutation (not from a statement-level declaration) → validation error\n      if (isReservedCall(name)) {\n        pushValidationIssue(ctx, name, \"\", { code: \"inline-reserved\" });\n        return null;\n      }\n\n      // Built-ins, library functions and action steps → preserve as ASTNode for runtime\n      if (isRuntimeCall(name, ctx)) {\n        const lazy = materializeLazyBuiltin(node, ctx, new Set());\n        if (lazy) return lazy;\n        return materializeCall(node, ctx, (a) => materializeExpr(a, ctx));\n      }\n\n      const def = ctx.cat?.get(name);\n      const props: Record<string, unknown> = {};\n\n      if (def) {\n        // Set when a REQUIRED prop holds invalid data with no default to fall\n        // back on — the only case where invalidity reaches the component itself.\n        let dropComponent = false;\n        // Catalog component: map positional args → named props\n        for (let i = 0; i < def.params.length && i < args.length; i++) {\n          const param = def.params[i];\n          const value = materializeValue(args[i], ctx);\n          props[param.name] = value;\n          if (param.schema === undefined) continue;\n          // Single validation entry point: scalar leaf type/enum for simple\n          // props, recursive key/type checks (with pruning) for nested shapes.\n          let next = validateSchemaValue(value, param.schema, name, `/${param.name}`, ctx);\n          if (next === INVALID) {\n            // Invalid prop value (error already reported). Same resolution rule as\n            // every nested edge; propagation here means dropping the component.\n            next = resolveInvalidValue(param.required, param.defaultValue);\n            if (next === INVALID) dropComponent = true;\n            else if (next === undefined) delete props[param.name];\n          }\n          if (next !== INVALID && next !== undefined) props[param.name] = next;\n        }\n\n        // Report excess positional args (extra args are silently dropped)\n        if (args.length > def.params.length) {\n          pushValidationIssue(ctx, name, \"\", {\n            code: \"excess-args\",\n            declared: def.params.length,\n            got: args.length,\n          });\n        }\n\n        // Validate required props — try defaultValue first before dropping\n        const missingRequired = def.params.filter(\n          (p) => p.required && (!(p.name in props) || props[p.name] === null),\n        );\n        if (missingRequired.length) {\n          const stillInvalid = missingRequired.filter((p) => {\n            if (p.defaultValue !== undefined) {\n              props[p.name] = p.defaultValue;\n              return false;\n            }\n            return true;\n          });\n          if (stillInvalid.length) {\n            for (const p of stillInvalid) {\n              pushValidationIssue(ctx, name, `/${p.name}`, {\n                code: p.name in props ? \"null-required\" : \"missing-required\",\n                signature: buildParamsSignature(name, def.params),\n              });\n            }\n            return null;\n          }\n        }\n\n        // A required prop with unsalvageable data (no default) drops the\n        // component — its error was already reported during validation.\n        if (dropComponent) return null;\n      } else {\n        // Unknown component: error and drop from tree\n        pushValidationIssue(ctx, name, \"\", {\n          code: \"unknown-component\",\n          available: ctx.cat && [...ctx.cat.keys()],\n        });\n        return null;\n      }\n\n      const hasDynamicProps = Object.values(props).some((v) => containsDynamicValue(v));\n      return { type: \"element\", typeName: name, props, partial: ctx.partial, hasDynamicProps };\n    }\n\n    // ── Runtime expression nodes → preserve as ASTNode, normalize children ─\n    default: {\n      if (isRuntimeExpr(node)) {\n        return materializeExpr(node, ctx);\n      }\n      // Unreachable for well-formed AST, but preserve the value defensively.\n      return node;\n    }\n  }\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// Statement splitter for openui-lang\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport { T, type Token } from \"./tokens\";\n\nexport interface RawStmt {\n  id: string;\n  /** Token type of the LHS identifier — used to classify statement kind */\n  idTokenType: T;\n  tokens: Token[];\n}\n\n/**\n * Auto-close unclosed strings and brackets so that partial/streaming input\n * can be parsed without syntax errors.\n */\nexport function autoClose(input: string): { text: string; wasIncomplete: boolean } {\n  const stack: string[] = [];\n  let inStr: false | '\"' | \"'\" = false;\n  let esc = false;\n\n  for (let i = 0; i < input.length; i++) {\n    const c = input[i];\n    if (esc) {\n      esc = false;\n      continue;\n    }\n    if (c === \"\\\\\" && inStr) {\n      esc = true;\n      continue;\n    }\n    if (inStr) {\n      if (c === inStr) inStr = false;\n      continue;\n    }\n    if (c === '\"' || c === \"'\") {\n      inStr = c;\n      continue;\n    }\n    if (c === \"(\" || c === \"[\" || c === \"{\") stack.push(c);\n    else if (c === \")\" && stack[stack.length - 1] === \"(\") stack.pop();\n    else if (c === \"]\" && stack[stack.length - 1] === \"[\") stack.pop();\n    else if (c === \"}\" && stack[stack.length - 1] === \"{\") stack.pop();\n  }\n\n  const wasIncomplete = !!inStr || stack.length > 0;\n  if (!wasIncomplete) return { text: input, wasIncomplete: false };\n\n  let out = input;\n  if (inStr) {\n    if (esc) out += \"\\\\\";\n    out += inStr; // close with matching quote\n  }\n  for (let j = stack.length - 1; j >= 0; j--)\n    out += stack[j] === \"(\" ? \")\" : stack[j] === \"[\" ? \"]\" : \"}\";\n\n  return { text: out, wasIncomplete: true };\n}\n\n/**\n * Splits the flat token stream into individual statements.\n *\n * Each statement has the form `identifier = expression`. Statements are\n * separated by newlines at depth 0 (newlines inside brackets are ignored).\n *\n * Accepts `Ident`, `Type`, and `StateVar` as statement identifiers.\n * For StateVar, the id is the full token value including $ (e.g., \"$count\").\n *\n * Invalid lines (no `=`, or no identifier) are silently skipped.\n */\nexport function split(tokens: Token[]): RawStmt[] {\n  const stmts: RawStmt[] = [];\n  let pos = 0;\n\n  while (pos < tokens.length) {\n    // Skip blank lines\n    while (pos < tokens.length && tokens[pos].t === T.Newline) pos++;\n    if (pos >= tokens.length || tokens[pos].t === T.EOF) break;\n\n    // Expect: Ident|Type|StateVar = expression\n    const tok = tokens[pos];\n    if (tok.t !== T.Ident && tok.t !== T.Type && tok.t !== T.StateVar) {\n      while (pos < tokens.length && tokens[pos].t !== T.Newline && tokens[pos].t !== T.EOF) pos++;\n      continue;\n    }\n    const id = tok.v as string;\n    const idTokenType = tok.t;\n    pos++;\n\n    // Must be followed by `=`\n    if (pos >= tokens.length || tokens[pos].t !== T.Equals) {\n      while (pos < tokens.length && tokens[pos].t !== T.Newline && tokens[pos].t !== T.EOF) pos++;\n      continue;\n    }\n    pos++;\n\n    // Collect expression tokens until a depth-0 newline or EOF.\n    // Track both bracket depth and ternary depth so that multiline\n    // ternary expressions (condition on one line, ? ... : on the next)\n    // are not incorrectly split into separate statements.\n    const expr: Token[] = [];\n    let depth = 0;\n    let ternaryDepth = 0;\n    while (pos < tokens.length && tokens[pos].t !== T.EOF) {\n      const tt = tokens[pos].t;\n      if (tt === T.Newline && depth <= 0 && ternaryDepth <= 0) {\n        // Before breaking, look ahead past whitespace/newlines to see if\n        // the next meaningful token is `?` or `:` — if so, the ternary\n        // continues on the next line and we should NOT split here.\n        let peek = pos + 1;\n        while (peek < tokens.length && tokens[peek].t === T.Newline) peek++;\n        const nextT = peek < tokens.length ? tokens[peek].t : T.EOF;\n        if (nextT === T.Question || (nextT === T.Colon && ternaryDepth > 0)) {\n          // Ternary continuation — skip the newline and keep collecting\n          pos++;\n          continue;\n        }\n        break; // statement boundary\n      }\n      if (tt === T.Newline) {\n        pos++;\n        continue;\n      } // newline inside bracket/ternary — skip\n      if (tt === T.LParen || tt === T.LBrack || tt === T.LBrace) depth++;\n      else if ((tt === T.RParen || tt === T.RBrack || tt === T.RBrace) && depth > 0) depth--;\n      // Track ternary ? and : at bracket depth 0 (colons inside {} are object key separators)\n      else if (tt === T.Question && depth === 0) ternaryDepth++;\n      else if (tt === T.Colon && depth === 0 && ternaryDepth > 0) ternaryDepth--;\n      expr.push(tokens[pos++]);\n    }\n\n    if (expr.length) stmts.push({ id, idTokenType, tokens: expr });\n  }\n\n  return stmts;\n}\n","import {\n  captureParserParseException,\n  captureParserParseResult,\n  prepareParserParseTelemetry,\n} from \"../telemetry/runtime\";\nimport type { ASTNode, Statement } from \"./ast\";\nimport { isASTNode, walkAST } from \"./ast\";\nimport { ACTION_DEFS, BUILTIN_CALLS, isBuiltin, isReservedCall, RESERVED_CALLS } from \"./builtins\";\nimport { parseExpression } from \"./expressions\";\nimport { tokenize } from \"./lexer\";\nimport { materializeValue, nameRawCallArgs } from \"./materialize\";\nimport { autoClose, split, type RawStmt } from \"./statements\";\nimport { T } from \"./tokens\";\nimport {\n  isElementNode,\n  type ElementNode,\n  type JSONSchemaDef,\n  type LibraryJSONSchema,\n  type MaterializeCtx,\n  type MutationStatementInfo,\n  type ParamDef,\n  type ParamMap,\n  type ParseResult,\n  type QueryStatementInfo,\n  type ValidationError,\n} from \"./types\";\nimport { getSchemaDefaultValue, pushValidationIssue } from \"./validation\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Result building\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction emptyResult(incomplete = true): ParseResult {\n  return {\n    root: null,\n    meta: {\n      incomplete,\n      unresolved: [],\n      orphaned: [],\n      statementCount: 0,\n      errors: [],\n    },\n    stateDeclarations: {},\n    queryStatements: [],\n    mutationStatements: [],\n  };\n}\n\n/**\n * Walk an AST node to collect all StateRef ($variable) names referenced\n * within. Used at parse time to pre-compute per-query state dependencies.\n */\nexport function collectQueryDeps(node: unknown): string[] {\n  if (!isASTNode(node)) return [];\n  const refs = new Set<string>();\n  walkAST(node, (current) => {\n    if (current.k === \"StateRef\") refs.add(current.n);\n  });\n  return [...refs];\n}\n\n/**\n * Classify a raw statement + parsed expression into a typed Statement.\n * Determined at parse time from token type + expression shape.\n */\nfunction classifyStatement(raw: RawStmt, expr: ASTNode): Statement {\n  // Query(...) → query declaration — check BEFORE $var to handle `$foo = Query(...)` correctly\n  if (expr.k === \"Comp\" && expr.name === RESERVED_CALLS.Query) {\n    const deps = collectQueryDeps(expr.args[1]);\n    return {\n      kind: \"query\",\n      id: raw.id,\n      call: { callee: RESERVED_CALLS.Query, args: expr.args },\n      expr,\n      deps: deps.length > 0 ? deps : undefined,\n    };\n  }\n  // Mutation(...) → mutation declaration\n  if (expr.k === \"Comp\" && expr.name === RESERVED_CALLS.Mutation) {\n    return {\n      kind: \"mutation\",\n      id: raw.id,\n      call: { callee: RESERVED_CALLS.Mutation, args: expr.args },\n      expr,\n    };\n  }\n  // $variables → state declaration\n  if (raw.idTokenType === T.StateVar) {\n    return { kind: \"state\", id: raw.id, init: expr };\n  }\n  // Everything else → value declaration\n  return { kind: \"value\", id: raw.id, expr };\n}\n\n/**\n * Extract typed statements from the symbol table.\n * State defaults are materialized to plain values (no raw AST in output).\n */\n/** A `$name` at the very end of streamed text, which may still be growing (`$d` of `$dishes`). */\ninterface PartialRef {\n  name: string;\n  stmts: ReadonlySet<Statement>;\n}\n\nfunction extractStatements(\n  stmts: Statement[],\n  ctx: MaterializeCtx,\n  partialRef?: PartialRef,\n): {\n  stateDeclarations: Record<string, unknown>;\n  queryStatements: QueryStatementInfo[];\n  mutationStatements: MutationStatementInfo[];\n} {\n  const stateDeclarations: Record<string, unknown> = {};\n  const queryStatements: QueryStatementInfo[] = [];\n  const mutationStatements: MutationStatementInfo[] = [];\n\n  for (const stmt of stmts) {\n    switch (stmt.kind) {\n      case \"state\":\n        stateDeclarations[stmt.id] = materializeValue(stmt.init, ctx);\n        break;\n      case \"query\":\n        nameRawCallArgs(stmt.call.args, ctx, stmt.id);\n        queryStatements.push({\n          statementId: stmt.id,\n          toolAST: stmt.call.args[0] ?? null,\n          argsAST: stmt.call.args[1] ?? null,\n          defaultsAST: stmt.call.args[2] ?? null,\n          refreshAST: stmt.call.args[3] ?? null,\n          deps: stmt.deps,\n          complete: true,\n        });\n        break;\n      case \"mutation\":\n        nameRawCallArgs(stmt.call.args, ctx, stmt.id);\n        mutationStatements.push({\n          statementId: stmt.id,\n          toolAST: stmt.call.args[0] ?? null,\n          argsAST: stmt.call.args[1] ?? null,\n        });\n        break;\n    }\n  }\n\n  // Auto-declare: any $var referenced in code but not explicitly declared → null default.\n  // collectQueryDeps already walks AST for StateRef nodes — reuse it here.\n  for (const stmt of stmts) {\n    const nodes =\n      stmt.kind === \"state\"\n        ? [stmt.init]\n        : stmt.kind === \"value\"\n          ? [stmt.expr]\n          : stmt.kind === \"query\" || stmt.kind === \"mutation\"\n            ? stmt.call.args\n            : [];\n    for (const node of nodes) {\n      for (const dep of collectQueryDeps(node)) {\n        if (dep === partialRef?.name && partialRef.stmts.has(stmt)) continue;\n        if (!(dep in stateDeclarations)) {\n          stateDeclarations[dep] = null;\n        }\n      }\n    }\n  }\n\n  return { stateDeclarations, queryStatements, mutationStatements };\n}\n\nconst DEFAULT_ROOT_STATEMENT_ID = \"root\";\n\n/** A call to a library component: not an `@` function, built-in, Query or Mutation. */\nfunction isComponentCall(node: ASTNode | undefined): node is Extract<ASTNode, { k: \"Comp\" }> {\n  return node?.k === \"Comp\" && !node.fn && !isBuiltin(node.name) && !isReservedCall(node.name);\n}\n\n/** Entry: `root`, else the first statement that calls the root component. */\nfunction pickEntry(\n  stmtMap: Map<string, Statement>,\n  rootName?: string,\n): { id: string; fallback: boolean } | null {\n  if (stmtMap.has(DEFAULT_ROOT_STATEMENT_ID))\n    return { id: DEFAULT_ROOT_STATEMENT_ID, fallback: false };\n  for (const stmt of stmtMap.values()) {\n    if (stmt.kind === \"value\" && isComponentCall(stmt.expr) && stmt.expr.name === rootName)\n      return { id: stmt.id, fallback: true };\n  }\n  return null;\n}\n\n/** Follow refs to the entry's value; a component call that did not render was dropped by validation. */\nfunction resolvesToComponentCall(node: ASTNode | undefined, syms: Map<string, ASTNode>): boolean {\n  const seen = new Set<string>();\n  while (node?.k === \"Ref\" && !seen.has(node.n)) {\n    seen.add(node.n);\n    node = syms.get(node.n);\n  }\n  return isComponentCall(node);\n}\n\n/** True when a runtime expression can produce a component, e.g. `$t ? A : B`. */\nfunction containsComponent(node: ASTNode): boolean {\n  let found = false;\n  walkAST(node, (current) => {\n    if (isComponentCall(current)) found = true;\n  });\n  return found;\n}\n\nfunction buildResult(\n  stmtMap: Map<string, Statement>,\n  typedStmts: Statement[],\n  wasIncomplete: boolean,\n  stmtCount: number,\n  cat: ParamMap | undefined,\n  rootName?: string,\n  partialRef?: PartialRef,\n): ParseResult {\n  const entry = pickEntry(stmtMap, rootName);\n\n  const syms = new Map<string, ASTNode>();\n  for (const [id, stmt] of stmtMap) {\n    syms.set(id, stmt.kind === \"state\" ? stmt.init : stmt.expr);\n  }\n  const unres: string[] = [];\n  const errors: ValidationError[] = [];\n  // Track orphaned: start with value statement IDs, delete as they're reached.\n  // Exclude root, state ($var), query, and mutation declarations — they're consumed separately.\n  const unreached = new Set<string>();\n  for (const [id, stmt] of stmtMap) {\n    if (id === entry?.id) continue;\n    if (stmt.kind === \"state\" || stmt.kind === \"query\" || stmt.kind === \"mutation\") continue;\n    unreached.add(id);\n  }\n  const ctx: MaterializeCtx = {\n    syms,\n    cat,\n    errors,\n    unres,\n    visited: new Set(),\n    partial: wasIncomplete,\n    currentStatementId: entry?.id,\n    unreached,\n  };\n\n  let root: ElementNode | null = null;\n  let rootExpression: ASTNode | undefined;\n  if (entry) {\n    const materialized = materializeValue(syms.get(entry.id)!, ctx);\n    if (isElementNode(materialized)) {\n      root = materialized;\n      root.statementId = entry.id;\n    } else if (isASTNode(materialized) && containsComponent(materialized)) {\n      rootExpression = materialized;\n    }\n  }\n\n  const { stateDeclarations, queryStatements, mutationStatements } = extractStatements(\n    typedStmts,\n    ctx,\n    partialRef,\n  );\n\n  // Streaming consumers drop parser errors until the stream ends, so this reads as a stream-end check.\n  ctx.currentStatementId = entry?.id;\n  const component = rootName ?? \"\";\n  if (!entry) {\n    pushValidationIssue(ctx, component, \"\", { code: \"no-root\", reason: \"missing\" });\n  } else if (!root && !rootExpression && !resolvesToComponentCall(syms.get(entry.id), syms)) {\n    pushValidationIssue(ctx, component, \"\", { code: \"no-root\", reason: \"not-component\" });\n  } else if (entry.fallback) {\n    pushValidationIssue(ctx, component, \"\", {\n      code: \"no-root\",\n      reason: root ? \"fallback\" : \"missing\",\n    });\n  }\n\n  // With no entry nothing is reachable; `no-root` alone describes the problem.\n  const orphaned = entry ? [...unreached] : [];\n\n  return {\n    root,\n    ...(rootExpression ? { rootExpression } : {}),\n    meta: {\n      incomplete: wasIncomplete,\n      unresolved: unres,\n      orphaned,\n      statementCount: stmtCount,\n      errors: errors,\n    },\n    stateDeclarations,\n    queryStatements,\n    mutationStatements,\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction skipString(input: string, start: number): number {\n  if (input[start] !== '\"') return start;\n  let i = start + 1;\n  while (i < input.length) {\n    const c = input[i];\n    if (c === \"\\\\\") {\n      i += 2; // skip escape character and the escaped character\n    } else if (c === '\"') {\n      return i + 1; // return index after the closing quote\n    } else {\n      i++;\n    }\n  }\n  return i; // return length if string was unclosed\n}\n\n/** Extract code from markdown fences, or return as-is if no fences found.\n *  String-context-aware: skips ``` inside double-quoted strings. */\nexport function stripFences(input: string): string {\n  const blocks: string[] = [];\n  let i = 0;\n\n  while (i < input.length) {\n    // Scan for opening ``` while tracking string context\n    let fenceStart = -1;\n    while (i < input.length) {\n      const nextI = skipString(input, i);\n      if (nextI > i) {\n        i = nextI;\n        continue;\n      }\n\n      const c = input[i];\n      if (\n        c === \"`\" &&\n        i + 1 < input.length &&\n        input[i + 1] === \"`\" &&\n        i + 2 < input.length &&\n        input[i + 2] === \"`\"\n      ) {\n        fenceStart = i;\n        break;\n      }\n      i++;\n    }\n\n    if (fenceStart === -1) break;\n\n    // Skip language tag until newline\n    let j = fenceStart + 3;\n    while (j < input.length && input[j] !== \"\\n\") j++;\n    if (j >= input.length) {\n      // No newline after opening fence (streaming) — take everything after fence marker + lang tag\n      blocks.push(input.slice(fenceStart + 3).replace(/^[^\\n]*\\n?/, \"\"));\n      i = input.length;\n      break;\n    }\n    j++; // skip the newline\n\n    // Scan for closing ``` while tracking string context\n    let closePos = -1;\n    let k = j;\n    while (k < input.length) {\n      const nextK = skipString(input, k);\n      if (nextK > k) {\n        k = nextK;\n        continue;\n      }\n      const c = input[k];\n      if (\n        c === \"`\" &&\n        k + 1 < input.length &&\n        input[k + 1] === \"`\" &&\n        k + 2 < input.length &&\n        input[k + 2] === \"`\"\n      ) {\n        closePos = k;\n        break;\n      }\n      k++;\n    }\n\n    if (closePos !== -1) {\n      blocks.push(input.slice(j, closePos));\n      i = closePos + 3;\n    } else {\n      // No closing fence found (streaming) — take everything after opening fence\n      blocks.push(input.slice(j));\n      i = input.length;\n    }\n  }\n\n  if (blocks.length > 0) return blocks.join(\"\\n\");\n\n  // Fallback: if input starts with ``` but wasn't matched (e.g. no newline after fence)\n  if (input.startsWith(\"```\")) {\n    let j = 3;\n    while (j < input.length && input[j] !== \"\\n\") j++;\n    const start = j < input.length ? j + 1 : 3;\n    // Try to strip trailing ```\n    const body = input.slice(start);\n    const trailingFence = body.lastIndexOf(\"```\");\n    if (trailingFence !== -1) {\n      return body.slice(0, trailingFence);\n    }\n    return body;\n  }\n\n  return input;\n}\n\n/** Strip // and # line comments outside of strings (handles both \" and ' delimiters). */\nfunction stripComments(input: string): string {\n  let inStr: false | '\"' | \"'\" = false;\n  return input\n    .split(\"\\n\")\n    .map((line) => {\n      for (let i = 0; i < line.length; i++) {\n        const c = line[i];\n        if (inStr) {\n          if (c === \"\\\\\" && i + 1 < line.length) {\n            i++; // skip escaped char\n            continue;\n          }\n          if (c === inStr) inStr = false;\n          continue;\n        }\n        if (c === '\"' || c === \"'\") {\n          inStr = c;\n          continue;\n        }\n        // // style comments\n        if (c === \"/\" && line[i + 1] === \"/\") {\n          return line.substring(0, i).trimEnd();\n        }\n        // # style comments (Python/YAML style — LLMs sometimes use these)\n        if (c === \"#\") {\n          return line.substring(0, i).trimEnd();\n        }\n      }\n      return line;\n    })\n    .join(\"\\n\");\n}\n\n/** Clean LLM response: strip fences, comments, whitespace. */\nfunction preprocess(input: string): string {\n  return stripComments(stripFences(input.trim())).trim();\n}\n\n/**\n * Parse a complete openui-lang string in one pass.\n *\n * @param input  - Full openui-lang source text (may be partial/streaming)\n * @param cat    - Param map for positional-arg → named-prop mapping\n * @returns      ParseResult with root ElementNode (or null) and metadata\n */\nexport function parse(input: string, cat: ParamMap, rootName?: string): ParseResult {\n  const trimmed = preprocess(input);\n  if (!trimmed) return emptyResult();\n\n  const { text, wasIncomplete } = autoClose(trimmed);\n  const stmts = split(tokenize(text));\n  if (!stmts.length) return emptyResult(wasIncomplete);\n\n  const stmtMap = new Map<string, Statement>();\n  for (const s of stmts) {\n    const expr = parseExpression(s.tokens);\n    const stmt = classifyStatement(s, expr);\n    stmtMap.set(s.id, stmt);\n  }\n  // Derive from map to deduplicate — Map.set overwrites duplicates\n  const typedStmts = [...stmtMap.values()];\n\n  return buildResult(stmtMap, typedStmts, wasIncomplete, stmtMap.size, cat, rootName);\n}\n\nexport interface StreamParser {\n  /** Feed the next SSE/stream chunk and get the latest ParseResult.\n   *  Pass `complete` once the stream has ended. */\n  push(chunk: string, complete?: boolean): ParseResult;\n  /** Set the full text — diffs against internal buffer, pushes only the delta.\n   *  Resets automatically if the text was replaced (not appended).\n   *  Pass `complete` once the stream has ended. */\n  set(fullText: string, complete?: boolean): ParseResult;\n  /** Get the latest ParseResult without consuming new data. */\n  getResult(complete?: boolean): ParseResult;\n}\n\nexport function createStreamParser(cat: ParamMap, rootName?: string): StreamParser {\n  let buf = \"\"; // raw accumulated input (kept for set() diffing)\n  // Preprocessed view of `buf` (fences + comments stripped, same as parse()'s\n  // preprocess). The completed-statement scan runs over THIS, never the raw\n  // buffer — so leading markdown prose / ```fences``` (e.g. an apostrophe in\n  // \"You're …\" before the program) can't corrupt statement-boundary detection.\n  let cleaned = \"\";\n  let completedEnd = 0; // watermark: how far into `cleaned` is already completed\n  const completedStmtMap = new Map<string, Statement>();\n\n  let completedCount = 0;\n\n  function addStmt(text: string) {\n    // `text` is sliced from `cleaned`, so it's already fence/comment-free.\n    const t = text.trim();\n    if (!t) return;\n    for (const s of split(tokenize(t))) {\n      const expr = parseExpression(s.tokens);\n      const stmt = classifyStatement(s, expr);\n      completedStmtMap.set(s.id, stmt);\n      completedCount++;\n    }\n  }\n\n  // Recompute `cleaned` from `buf`. If the already-completed prefix is no longer\n  // a prefix of the new cleaned text (e.g. an opening ```fence``` just appeared\n  // and shifted the stripped output), the watermark + cache are stale, so reset\n  // and re-scan. When the prefix is stable (the common streaming case) the cache\n  // is kept; pending text is overlaid on a copy when building the current result.\n  function refreshCleaned() {\n    const next = preprocess(buf);\n    if (!next.startsWith(cleaned.slice(0, completedEnd))) {\n      completedEnd = 0;\n      completedStmtMap.clear();\n      completedCount = 0;\n    }\n    cleaned = next;\n  }\n\n  function scanNewCompleted(): number {\n    let depth = 0,\n      ternaryDepth = 0,\n      inStr: false | '\"' | \"'\" = false,\n      esc = false;\n    let stmtStart = completedEnd;\n\n    for (let i = completedEnd; i < cleaned.length; i++) {\n      const c = cleaned[i];\n      if (esc) {\n        esc = false;\n        continue;\n      }\n      if (c === \"\\\\\" && inStr) {\n        esc = true;\n        continue;\n      }\n      if (inStr) {\n        if (c === inStr) inStr = false;\n        continue;\n      }\n      if (c === '\"' || c === \"'\") {\n        inStr = c;\n        continue;\n      }\n\n      if (c === \"(\" || c === \"[\" || c === \"{\") depth++;\n      else if (c === \")\" || c === \"]\" || c === \"}\") depth = Math.max(0, depth - 1);\n      // Track ternary ? and : at bracket depth 0 (colons inside {} are object key separators)\n      else if (c === \"?\" && depth === 0) ternaryDepth++;\n      else if (c === \":\" && depth === 0 && ternaryDepth > 0) ternaryDepth--;\n      else if (c === \"\\n\" && depth <= 0 && ternaryDepth <= 0) {\n        // Before splitting, look ahead past whitespace to see if the next\n        // meaningful character is `?` or `:` — ternary continuation.\n        let peek = i + 1;\n        while (\n          peek < cleaned.length &&\n          (cleaned[peek] === \" \" ||\n            cleaned[peek] === \"\\t\" ||\n            cleaned[peek] === \"\\r\" ||\n            cleaned[peek] === \"\\n\")\n        )\n          peek++;\n        if (\n          peek < cleaned.length &&\n          (cleaned[peek] === \"?\" || (cleaned[peek] === \":\" && ternaryDepth > 0))\n        ) {\n          continue; // ternary continuation — don't split\n        }\n        // Depth-0 newline = end of a statement\n        const t = cleaned.slice(stmtStart, i).trim();\n        if (t) addStmt(t);\n        stmtStart = i + 1; // next statement begins after this newline\n        completedEnd = i + 1; // advance the \"already processed\" watermark\n      }\n    }\n\n    return stmtStart; // start of the current pending (incomplete) statement\n  }\n\n  function currentResult(complete = false): ParseResult {\n    refreshCleaned();\n    const pendingStart = scanNewCompleted();\n    const pendingText = cleaned.slice(pendingStart).trim();\n\n    // No pending text — all statements are complete\n    if (!pendingText) {\n      if (completedCount === 0) return emptyResult();\n      return buildResult(\n        completedStmtMap,\n        [...completedStmtMap.values()],\n        false,\n        completedCount,\n        cat,\n        rootName,\n      );\n    }\n\n    // `cleaned` is already preprocessed (fences + comments stripped); just\n    // autoclose the incomplete trailing statement so it's syntactically valid.\n    const { text: closed, wasIncomplete } = autoClose(pendingText);\n    const stmts = split(tokenize(closed));\n\n    if (!stmts.length) {\n      if (completedCount === 0) return emptyResult(wasIncomplete);\n      return buildResult(\n        completedStmtMap,\n        [...completedStmtMap.values()],\n        wasIncomplete,\n        completedCount,\n        cat,\n        rootName,\n      );\n    }\n\n    // New IDs can render progressively; existing IDs are replaced only when\n    // the pending expression no longer needs automatic closing.\n    const allStmtMap = new Map(completedStmtMap);\n    const pendingStmts = new Set<Statement>();\n    for (const s of stmts) {\n      if (completedStmtMap.has(s.id) && wasIncomplete) continue;\n      const expr = parseExpression(s.tokens);\n      const stmt = classifyStatement(s, expr);\n      allStmtMap.set(s.id, stmt);\n      pendingStmts.add(stmt);\n    }\n    // A `$name` ending the raw text may still be growing (`$d` of `$dishes`): skip it unless\n    // the stream is complete or the same name already appears in full in the pending text.\n    const tail = complete ? undefined : /\\$\\w+$/.exec(buf)?.[0];\n    const tailName =\n      tail &&\n      pendingText.endsWith(tail) &&\n      !new RegExp(`\\\\${tail}(?!\\\\w)`).test(pendingText.slice(0, -tail.length))\n        ? tail\n        : undefined;\n    // Derive from map to deduplicate\n    const allTypedStmts = [...allStmtMap.values()];\n\n    return buildResult(\n      allStmtMap,\n      allTypedStmts,\n      wasIncomplete,\n      completedCount + stmts.length,\n      cat,\n      rootName,\n      tailName ? { name: tailName, stmts: pendingStmts } : undefined,\n    );\n  }\n\n  function reset() {\n    buf = \"\";\n    cleaned = \"\";\n    completedEnd = 0;\n    completedStmtMap.clear();\n    completedCount = 0;\n  }\n\n  return {\n    push(chunk, complete) {\n      buf += chunk;\n      return currentResult(complete);\n    },\n    set(fullText, complete) {\n      if (fullText.length < buf.length || !fullText.startsWith(buf)) {\n        reset();\n      }\n      const delta = fullText.slice(buf.length);\n      if (delta) buf += delta;\n      return currentResult(complete);\n    },\n    getResult: currentResult,\n  };\n}\n\nexport interface Parser {\n  parse(input: string): ParseResult;\n}\n\ntype ActionDefs = Map<string, unknown>;\n\n// {$ref: \"#/$defs/ActionExpression\"} -> its body, so action slots validate as inline unions\nfunction inlineActionRefs(node: unknown, defs: ActionDefs): unknown {\n  if (!node || typeof node !== \"object\") return node;\n  const ref = (node as { $ref?: unknown }).$ref;\n  if (typeof ref === \"string\") return defs.has(ref) ? inlineActionRefs(defs.get(ref), defs) : node;\n  const copy = (Array.isArray(node) ? [...node] : { ...node }) as Record<string, unknown>;\n  let changed = false;\n  for (const [key, value] of Object.entries(copy)) {\n    copy[key] = inlineActionRefs(value, defs);\n    changed ||= copy[key] !== value;\n  }\n  return changed ? copy : node;\n}\n\nfunction compileParams(def: JSONSchemaDef, defs: ActionDefs): ParamDef[] {\n  const properties = def.properties ?? {};\n  const required = def.required ?? [];\n  return Object.keys(properties).map((key) => ({\n    name: key,\n    required: required.includes(key),\n    defaultValue: getSchemaDefaultValue(properties[key]),\n    schema: defs.size ? inlineActionRefs(properties[key], defs) : properties[key],\n  }));\n}\n\nexport function compileSchema(schema: LibraryJSONSchema): ParamMap {\n  const map: ParamMap = new Map();\n  const components = schema.properties && new Set(Object.keys(schema.properties));\n  // Action $defs (ActionExpression, OpenUrl, custom actions) are data shapes, never components\n  const defs: ActionDefs = new Map();\n  for (const name of [...Object.keys(ACTION_DEFS), ...Object.keys(schema.actions ?? {})]) {\n    const body = schema.$defs?.[name];\n    if (body && !components?.has(name)) defs.set(`#/$defs/${name}`, body);\n  }\n  for (const [name, def] of Object.entries(schema.$defs ?? {})) {\n    // Skip non-component defs, e.g. zod's hoisted recursive schemas (__schema0).\n    if (components ? !components.has(name) : defs.has(`#/$defs/${name}`)) continue;\n    map.set(name, { params: compileParams(def, defs) });\n  }\n  // The call registry: the built-ins plus the library's functions and actions\n  map.callDefs = new Map(BUILTIN_CALLS);\n  for (const [name, fn] of Object.entries(schema.functions ?? {})) {\n    map.callDefs.set(name, { kind: \"function\", params: compileParams(fn.params, defs) });\n  }\n  for (const [name, action] of Object.entries(schema.actions ?? {})) {\n    map.callDefs.set(name, { kind: \"action\", params: compileParams(action.params, defs) });\n  }\n  return map;\n}\n\n/**\n * Create a parser from a library JSON Schema document.\n * Pass `library.toJSONSchema()` to get the schema.\n *\n * @example\n * ```ts\n * const parser = createParser(library.toJSONSchema());\n * const result = parser.parse(openuiLangString);\n * ```\n */\nexport function createParser(schema: LibraryJSONSchema, rootName?: string): Parser {\n  const paramMap = compileSchema(schema);\n  return {\n    parse(input: string): ParseResult {\n      const telemetry = prepareParserParseTelemetry();\n      try {\n        const result = parse(input, paramMap, rootName);\n        captureParserParseResult(telemetry, result);\n        return result;\n      } catch (error) {\n        captureParserParseException(telemetry);\n        throw error;\n      }\n    },\n  };\n}\n\n/**\n * Create a streaming parser from a library JSON Schema document.\n * Pass `library.toJSONSchema()` to get the schema.\n */\nexport function createStreamingParser(schema: LibraryJSONSchema, rootName?: string): StreamParser {\n  return createStreamParser(compileSchema(schema), rootName);\n}\n","import type { LibraryJSONSchema, OpenUIError, ValidationError } from \"./types\";\n\n/** Build a signature hint like \"Header(title*, subtitle, icon)\" from JSON schema. */\nfunction buildSignatureHint(\n  componentName: string,\n  schema: { properties?: Record<string, unknown>; required?: string[] } | undefined,\n): string | undefined {\n  if (!schema?.properties) return undefined;\n  const required = new Set(schema.required ?? []);\n  const params = Object.keys(schema.properties)\n    .map((k) => (required.has(k) ? `${k}*` : k))\n    .join(\", \");\n  return `Signature: ${componentName}(${params}) — * marks required`;\n}\n\n/**\n * Convert parser ValidationErrors into enriched OpenUIErrors with hints.\n *\n * Framework-agnostic — usable by React, Svelte, Vue, or standalone.\n *\n * @deprecated ValidationError.message is already humanized and self-sufficient\n * (signatures, available components, expected types are inlined) — read\n * `result.meta.errors` directly. Will be removed in a future major release.\n */\nexport function enrichErrors(\n  validationErrors: ValidationError[],\n  schema: LibraryJSONSchema,\n  componentNames: string[],\n): OpenUIError[] {\n  return validationErrors.map((ve) => {\n    const error: OpenUIError = {\n      source: \"parser\",\n      code: ve.code,\n      message: ve.message,\n      component: ve.component,\n      path: ve.path || undefined,\n      statementId: ve.statementId,\n      ...(ve.severity && { severity: ve.severity }),\n    };\n    if (ve.code === \"unknown-component\" && componentNames.length) {\n      error.hint = `Available components: ${componentNames.join(\", \")}`;\n    } else if (ve.code === \"missing-required\" || ve.code === \"null-required\") {\n      error.hint = buildSignatureHint(ve.component, schema.$defs?.[ve.component]);\n    } else if (ve.code === \"inline-reserved\") {\n      error.hint = `Declare as a top-level statement: myVar = ${ve.component}(...)`;\n    }\n    return error;\n  });\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// Edit/Merge for openui-lang\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { ASTNode } from \"./ast\";\nimport { walkAST } from \"./ast\";\nimport { parseExpression } from \"./expressions\";\nimport { tokenize } from \"./lexer\";\nimport { stripFences } from \"./parser\";\nimport { split } from \"./statements\";\n\ninterface ParsedStatement {\n  id: string;\n  ast: ASTNode;\n  raw: string;\n}\n\nfunction splitStatementSource(input: string): string[] {\n  const stmts: string[] = [];\n  let depth = 0;\n  let inStr: false | '\"' | \"'\" = false;\n  let esc = false;\n  let start = 0;\n\n  for (let i = 0; i < input.length; i++) {\n    const c = input[i];\n\n    if (esc) {\n      esc = false;\n      continue;\n    }\n    if (c === \"\\\\\" && inStr) {\n      esc = true;\n      continue;\n    }\n    if (inStr) {\n      if (c === inStr) inStr = false;\n      continue;\n    }\n    if (c === '\"' || c === \"'\") {\n      inStr = c;\n      continue;\n    }\n\n    if (c === \"(\" || c === \"[\" || c === \"{\") depth++;\n    else if (c === \")\" || c === \"]\" || c === \"}\") depth = Math.max(0, depth - 1);\n    else if (c === \"\\n\" && depth <= 0) {\n      const stmt = input.slice(start, i).trim();\n      if (stmt) stmts.push(stmt);\n      start = i + 1;\n    }\n  }\n\n  const tail = input.slice(start).trim();\n  if (tail) stmts.push(tail);\n  return stmts;\n}\n\nfunction parseStatements(input: string): ParsedStatement[] {\n  const trimmed = input.trim();\n  if (!trimmed) return [];\n\n  const result: ParsedStatement[] = [];\n  for (const raw of splitStatementSource(trimmed)) {\n    const stmt = split(tokenize(raw))[0];\n    if (!stmt) continue;\n    result.push({\n      id: stmt.id,\n      ast: parseExpression(stmt.tokens),\n      raw,\n    });\n  }\n\n  return result;\n}\n\n/**\n * Recursively collect all Ref names from an AST node.\n */\nfunction collectRefs(node: ASTNode, out: Set<string>): void {\n  walkAST(node, (current) => {\n    if (current.k === \"Ref\") out.add(current.n);\n    if (current.k === \"RuntimeRef\") out.add(current.n);\n  });\n}\n\n/**\n * Remove statements unreachable from `root` (garbage collection).\n * Walks the AST graph from root, collecting all referenced statement IDs.\n * $state variables are always kept (they're referenced at runtime, not by Ref nodes).\n */\nfunction gcUnreachable(\n  order: string[],\n  merged: Map<string, string>,\n  asts: Map<string, ASTNode>,\n  rootId = \"root\",\n): void {\n  const rootAst = asts.get(rootId);\n  if (!rootAst) return; // no root → can't GC\n\n  // BFS from root to find all reachable statements\n  const reachable = new Set<string>([rootId]);\n  const queue: string[] = [rootId];\n\n  while (queue.length > 0) {\n    const id = queue.pop()!;\n    const ast = asts.get(id);\n    if (!ast) continue;\n\n    const refs = new Set<string>();\n    collectRefs(ast, refs);\n\n    for (const ref of refs) {\n      if (!reachable.has(ref) && asts.has(ref)) {\n        reachable.add(ref);\n        queue.push(ref);\n      }\n    }\n  }\n\n  // Keep $state variables — they're bound at runtime, not via Ref\n  for (const id of order) {\n    if (id.startsWith(\"$\")) reachable.add(id);\n  }\n\n  // Remove unreachable statements\n  for (let i = order.length - 1; i >= 0; i--) {\n    if (!reachable.has(order[i])) {\n      merged.delete(order[i]);\n      order.splice(i, 1);\n    }\n  }\n}\n\n/**\n * Merge an existing program with a patch (partial update).\n * Patch statements override existing ones by name.\n * Unreachable statements are automatically garbage-collected.\n * Returns the merged program as a string.\n */\nexport function mergeStatements(existing: string, patch: string, rootId = \"root\"): string {\n  const existingStmts = parseStatements(existing);\n  const patchStmts = parseStatements(stripFences(patch));\n\n  if (!existingStmts.length) {\n    return patchStmts.map((stmt) => stmt.raw).join(\"\\n\");\n  }\n  if (!patchStmts.length) return existing;\n\n  // Merge: patch statements override existing by name\n  const merged = new Map<string, string>();\n  const asts = new Map<string, ASTNode>();\n  const order: string[] = [];\n\n  for (const stmt of existingStmts) {\n    merged.set(stmt.id, stmt.raw);\n    asts.set(stmt.id, stmt.ast);\n    order.push(stmt.id);\n  }\n\n  for (const stmt of patchStmts) {\n    if (stmt.ast.k === \"Null\") {\n      // `name = null` in a patch means \"delete this statement\"\n      merged.delete(stmt.id);\n      asts.delete(stmt.id);\n      const idx = order.indexOf(stmt.id);\n      if (idx !== -1) order.splice(idx, 1);\n      continue;\n    }\n    if (!merged.has(stmt.id)) {\n      order.push(stmt.id);\n    }\n    merged.set(stmt.id, stmt.raw);\n    asts.set(stmt.id, stmt.ast);\n  }\n\n  // GC: remove statements unreachable from root\n  gcUnreachable(order, merged, asts, rootId);\n\n  return order\n    .filter((id) => merged.has(id))\n    .map((id) => merged.get(id)!)\n    .join(\"\\n\");\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// ElementNode → openui-lang source text serializer\n// Inverse of the parse + materialize pipeline.\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { Library } from \"../library\";\nimport type { ASTNode } from \"./ast\";\nimport { isASTNode } from \"./ast\";\nimport { getCallDefs } from \"./builtins\";\nimport { compileSchema } from \"./parser\";\nimport { isElementNode, type CallDef, type ElementNode, type ParamMap } from \"./types\";\n\n// ─── Operator precedence (mirrors expressions.ts) ────────────────────────────\n\nconst PRECEDENCE: Record<string, number> = {\n  \"||\": 2,\n  \"&&\": 3,\n  \"==\": 4,\n  \"!=\": 4,\n  \">\": 5,\n  \"<\": 5,\n  \">=\": 5,\n  \"<=\": 5,\n  \"+\": 6,\n  \"-\": 6,\n  \"*\": 7,\n  \"/\": 7,\n  \"%\": 7,\n};\n\n// ─── Statement collector ─────────────────────────────────────────────────────\n\ninterface CollectedStatement {\n  id: string;\n  text: string;\n}\n\nclass StatementCollector {\n  private statements: CollectedStatement[] = [];\n  private registered = new Set<string>();\n\n  /** Register an ElementNode as a named statement. Returns the statementId for use as a reference. */\n  register(id: string, text: string): void {\n    if (this.registered.has(id)) return;\n    this.registered.add(id);\n    this.statements.push({ id, text });\n  }\n\n  has(id: string): boolean {\n    return this.registered.has(id);\n  }\n\n  getStatements(): CollectedStatement[] {\n    return this.statements;\n  }\n}\n\n// ─── AST node serializer ─────────────────────────────────────────────────────\n\n/** `calls` are the library's call names (built-ins, functions, actions), written with `@`. */\nfunction serializeASTNode(node: ASTNode, calls: ReadonlyMap<string, CallDef>): string {\n  switch (node.k) {\n    case \"Str\":\n      return JSON.stringify(node.v);\n    case \"Num\":\n      return String(node.v);\n    case \"Bool\":\n      return node.v ? \"true\" : \"false\";\n    case \"Null\":\n      return \"null\";\n    case \"Ph\":\n      return node.n;\n    case \"StateRef\":\n      return node.n; // already includes $ prefix\n    case \"RuntimeRef\":\n      return node.n;\n    case \"Arr\":\n      return \"[\" + node.els.map((el) => serializeASTNode(el, calls)).join(\", \") + \"]\";\n    case \"Obj\":\n      return (\n        \"{\" + node.entries.map(([k, v]) => `${k}: ${serializeASTNode(v, calls)}`).join(\", \") + \"}\"\n      );\n    case \"BinOp\": {\n      const left = serializeBinOpChild(node.left, node.op, \"left\", calls);\n      const right = serializeBinOpChild(node.right, node.op, \"right\", calls);\n      return `${left} ${node.op} ${right}`;\n    }\n    case \"UnaryOp\":\n      return `${node.op}${serializeASTNode(node.operand, calls)}`;\n    case \"Ternary\":\n      return `${serializeASTNode(node.cond, calls)} ? ${serializeASTNode(node.then, calls)} : ${serializeASTNode(node.else, calls)}`;\n    case \"Member\":\n      return `${serializeASTNode(node.obj, calls)}.${node.field}`;\n    case \"Index\":\n      return `${serializeASTNode(node.obj, calls)}[${serializeASTNode(node.index, calls)}]`;\n    case \"Assign\":\n      return `${node.target} = ${serializeASTNode(node.value, calls)}`;\n    case \"Comp\": {\n      const args = node.args.map((arg) => serializeASTNode(arg, calls)).join(\", \");\n      // Built-ins, library functions and actions (not Action) → @-prefix\n      if (calls.has(node.name) && node.name !== \"Action\") {\n        return `@${node.name}(${args})`;\n      }\n      // Action, reserved calls (Query/Mutation), catalog components → no prefix\n      return `${node.name}(${args})`;\n    }\n    // Ref nodes should not appear after materialization, but handle defensively\n    case \"Ref\":\n      return node.n;\n    default:\n      return \"null\";\n  }\n}\n\n/** Wrap a BinOp child in parens if its precedence is lower than the parent's. */\nfunction serializeBinOpChild(\n  child: ASTNode,\n  parentOp: string,\n  _side: \"left\" | \"right\",\n  calls: ReadonlyMap<string, CallDef>,\n): string {\n  const inner = serializeASTNode(child, calls);\n  if (child.k !== \"BinOp\") return inner;\n  const parentPrec = PRECEDENCE[parentOp] ?? 0;\n  const childPrec = PRECEDENCE[child.op] ?? 0;\n  if (childPrec < parentPrec) return `(${inner})`;\n  return inner;\n}\n\n// ─── Value serializer ────────────────────────────────────────────────────────\n\nfunction serializeValue(value: unknown, paramMap: ParamMap, collector: StatementCollector): string {\n  if (value === null || value === undefined) return \"null\";\n  if (typeof value === \"string\") return JSON.stringify(value);\n  if (typeof value === \"number\") return String(value);\n  if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n\n  // ElementNode — check before isASTNode (they don't overlap, but order is clear)\n  if (isElementNode(value)) {\n    return serializeElementValue(value, paramMap, collector);\n  }\n\n  // ASTNode (surviving runtime expressions in dynamic props)\n  if (isASTNode(value)) {\n    return serializeASTNode(value, getCallDefs(paramMap));\n  }\n\n  // Array\n  if (Array.isArray(value)) {\n    const items = value.map((el) => serializeValue(el, paramMap, collector));\n    return \"[\" + items.join(\", \") + \"]\";\n  }\n\n  // Plain object\n  if (typeof value === \"object\") {\n    const obj = value as Record<string, unknown>;\n    const entries = Object.entries(obj).map(\n      ([k, v]) => `${k}: ${serializeValue(v, paramMap, collector)}`,\n    );\n    return \"{\" + entries.join(\", \") + \"}\";\n  }\n\n  return \"null\";\n}\n\n/** Serialize an ElementNode — either as a reference (if it has statementId) or inline. */\nfunction serializeElementValue(\n  node: ElementNode,\n  paramMap: ParamMap,\n  collector: StatementCollector,\n): string {\n  if (node.statementId) {\n    // Register as separate statement if not already registered\n    if (!collector.has(node.statementId)) {\n      // Serialize the expression first (depth-first → children registered before parent)\n      const expr = serializeElementExpr(node, paramMap, collector);\n      collector.register(node.statementId, `${node.statementId} = ${expr}`);\n    }\n    // Emit bare reference\n    return node.statementId;\n  }\n  // Inline (no statementId)\n  return serializeElementExpr(node, paramMap, collector);\n}\n\n// ─── ElementNode → expression string ─────────────────────────────────────────\n\nfunction serializeElementExpr(\n  node: ElementNode,\n  paramMap: ParamMap,\n  collector: StatementCollector,\n): string {\n  const def = paramMap.get(node.typeName);\n\n  if (def) {\n    // Map named props back to positional args using ParamMap order\n    const args: string[] = [];\n    for (const param of def.params) {\n      const val = node.props[param.name];\n      args.push(serializeValue(val, paramMap, collector));\n    }\n\n    // Trim trailing null/undefined/default args\n    while (args.length > 0) {\n      const last = args[args.length - 1];\n      if (last !== \"null\") break;\n      const paramIdx = args.length - 1;\n      const param = def.params[paramIdx];\n      if (!param) break;\n      // Only trim if the param is optional or has a default matching null\n      if (param.required) break;\n      args.pop();\n    }\n\n    return `${node.typeName}(${args.join(\", \")})`;\n  }\n\n  // Unknown component — fallback to Object.keys() order\n  const fallbackArgs = Object.values(node.props).map((v) => serializeValue(v, paramMap, collector));\n  return `${node.typeName}(${fallbackArgs.join(\", \")})`;\n}\n\n// ─── State declaration serializer ────────────────────────────────────────────\n\nfunction serializeStateDeclarations(\n  stateDeclarations: Record<string, unknown>,\n  paramMap: ParamMap,\n  collector: StatementCollector,\n): string[] {\n  const lines: string[] = [];\n  for (const [name, value] of Object.entries(stateDeclarations)) {\n    // Auto-declared null defaults ($var = null) can be omitted for cleaner output\n    if (value === null) continue;\n    lines.push(`${name} = ${serializeValue(value, paramMap, collector)}`);\n  }\n  return lines;\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport interface SerializeOptions {\n  /** $variable declarations to include (e.g. from ParseResult.stateDeclarations). */\n  stateDeclarations?: Record<string, unknown>;\n}\n\n/**\n * Convert an ElementNode tree back to openui-lang source text.\n * Output is compatible with `mergeStatements()` for patching existing programs.\n *\n * @param json - The root ElementNode tree\n * @param library - The component Library (for positional arg ordering)\n * @param options - Optional state declarations\n * @returns openui-lang source text (multiple statements joined by newlines)\n */\nexport function jsonToOpenUI(\n  json: ElementNode,\n  library: Library,\n  options?: SerializeOptions,\n): string {\n  const paramMap = compileSchema(library.toJSONSchema());\n  const collector = new StatementCollector();\n\n  // Serialize root — this recursively registers all child statements\n  const rootExpr = serializeElementExpr(json, paramMap, collector);\n  const rootId = json.statementId || \"root\";\n\n  // Build output: root first, then children (depth-first post-order), then state\n  const lines: string[] = [];\n\n  // Root statement\n  lines.push(`${rootId} = ${rootExpr}`);\n\n  // Child statements (already in depth-first post-order from collector)\n  for (const stmt of collector.getStatements()) {\n    // Skip root if it was also registered in collector\n    if (stmt.id === rootId) continue;\n    lines.push(stmt.text);\n  }\n\n  // State declarations\n  if (options?.stateDeclarations) {\n    const stateLines = serializeStateDeclarations(options.stateDeclarations, paramMap, collector);\n    lines.push(...stateLines);\n  }\n\n  return lines.join(\"\\n\");\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// AST evaluator — resolves AST nodes to runtime values.\n// Framework-agnostic. No React imports.\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { ASTNode } from \"../parser/ast\";\nimport { isASTNode, toLiteralAST } from \"../parser/ast\";\nimport {\n  ACTION_STEPS,\n  BUILTIN_CALLS,\n  BUILTIN_STEPS,\n  BUILTINS,\n  isStep,\n  toNumber,\n} from \"../parser/builtins\";\nimport { nameArgs } from \"../parser/materialize\";\nimport type {\n  ActionPlan,\n  ActionStep,\n  ElementNode,\n  FunctionSchema,\n  JSONSchemaDef,\n  MaterializeCtx,\n  ParamDef,\n} from \"../parser/types\";\nimport { isElementNode } from \"../parser/types\";\nimport { getSchemaDefaultValue, INVALID, validateSchemaValue } from \"../parser/validation\";\nimport { isReactiveSchema } from \"../reactive\";\nimport { evaluatePropCore } from \"./evaluate-prop\";\n\n/** Optional schema context for reactive-aware evaluation. */\nexport interface SchemaContext {\n  /** Component library — used to look up reactive schemas per prop. */\n  library: { components: Record<string, { props: { shape?: Record<string, unknown> } }> };\n}\n\nexport interface EvaluationContext {\n  /** Read $variable from the store */\n  getState(name: string): unknown;\n  /** Resolve a reference to another declaration's evaluated value */\n  resolveRef(name: string): unknown;\n  /** Extra scope for $value injection during reactive prop evaluation */\n  extraScope?: Record<string, unknown>;\n  /** Library functions: `library.toJSONSchema().functions` entries plus each `fn`. */\n  functions?: Record<string, RuntimeFunction>;\n  /** Custom actions: the `library.toJSONSchema().actions` entries. */\n  actions?: Record<string, FunctionSchema>;\n  /** Reports a runtime error, such as a library function call that evaluated to null. */\n  reportError?: (message: string) => void;\n}\n\n/** A library function as the evaluator runs it. */\nexport interface RuntimeFunction extends FunctionSchema {\n  fn: (args: any) => unknown;\n}\n\nexport interface ReactiveAssign {\n  __reactive: \"assign\";\n  target: string;\n  expr: ASTNode;\n}\n\nexport function isReactiveAssign(value: unknown): value is ReactiveAssign {\n  return typeof value === \"object\" && value !== null && (value as any).__reactive === \"assign\";\n}\n\n/**\n * Evaluate an AST node to a runtime value.\n */\nexport function evaluate(\n  node: ASTNode,\n  context: EvaluationContext,\n  schemaCtx?: SchemaContext,\n): unknown {\n  switch (node.k) {\n    // ── Literals ──────────────────────────────────────────────────────────\n    case \"Str\":\n      return node.v;\n    case \"Num\":\n      return node.v;\n    case \"Bool\":\n      return node.v;\n    case \"Null\":\n      return null;\n    case \"Ph\":\n      return null;\n\n    // ── State references ──────────────────────────────────────────────────\n    case \"StateRef\":\n      return context.extraScope?.[node.n] ?? context.getState(node.n);\n\n    // ── References ────────────────────────────────────────────────────────\n    case \"Ref\":\n    case \"RuntimeRef\":\n      return context.resolveRef(node.n);\n\n    // ── Collections ───────────────────────────────────────────────────────\n    case \"Arr\":\n      return node.els.map((el) => evaluate(el, context));\n    case \"Obj\":\n      return Object.fromEntries(node.entries.map(([k, v]) => [k, evaluate(v, context)]));\n\n    // ── Component ─────────────────────────────────────────────────────────\n    case \"Comp\": {\n      // Built-ins coerce their args, so they skip validation. Lazy ones get them unevaluated.\n      const builtin = BUILTINS[node.name];\n      if (builtin) {\n        if (builtin.lazy) return evaluateLazyBuiltin(node.name, node.args, context, schemaCtx);\n        return builtin.fn!(evaluateArgs(node, context));\n      }\n      // Built-in steps and Action([...]) → an ActionPlan\n      if (isStep(node.name)) return evaluateActionCall(node, context);\n      const fns = context.functions;\n      if (fns && Object.prototype.hasOwnProperty.call(fns, node.name)) {\n        return callFunction(node.name, fns[node.name]!, node, context);\n      }\n      // Custom actions: a one-step plan; any invalid arg gives an empty plan, a no-op,\n      // even an optional one with a default: @ExportFile(\"r\", \"xlsx\") must not export csv\n      const acts = context.actions;\n      if (acts && Object.prototype.hasOwnProperty.call(acts, node.name)) {\n        const def = acts[node.name]!;\n        const args = callArgs(node, context, def.params);\n        if (missesRequired(args, def.params)) return { steps: [] };\n        const params = checkValue(args, def.params, node.name, \"\", context, true);\n        if (params === INVALID) return { steps: [] };\n        const step: ActionStep = {\n          type: \"custom_action\",\n          name: node.name,\n          params: params as Record<string, unknown>,\n        };\n        customSteps.add(step);\n        return { steps: [step] };\n      }\n      // If parser already mapped args→props (via materializeExpr), use named props.\n      // With schema context: emit ReactiveAssign for StateRef on reactive props.\n      // Without schema context: preserve StateRef as AST for evaluate-tree to handle.\n      if (node.mappedProps) {\n        const def = schemaCtx?.library.components[node.name];\n        const props: Record<string, unknown> = {};\n        for (const [key, val] of Object.entries(node.mappedProps)) {\n          const propSchema = def?.props?.shape?.[key];\n          if (val.k === \"StateRef\" && propSchema && isReactiveSchema(propSchema)) {\n            // Reactive schema + StateRef → emit ReactiveAssign marker\n            props[key] = {\n              __reactive: \"assign\" as const,\n              target: val.n,\n              expr: { k: \"StateRef\" as const, n: \"$value\" },\n            };\n          } else if (val.k === \"StateRef\") {\n            // Non-reactive StateRef or no schema context → preserve for evaluate-tree\n            props[key] = schemaCtx ? context.getState(val.n) : val;\n          } else {\n            props[key] = evaluate(val, context, schemaCtx);\n          }\n        }\n        const result: ElementNode = {\n          type: \"element\",\n          typeName: node.name,\n          props,\n          partial: false,\n          hasDynamicProps: true,\n        };\n        // If we have schema context, recursively evaluate nested ElementNodes in props\n        if (schemaCtx) {\n          for (const [key, val] of Object.entries(props)) {\n            if (isElementNode(val)) {\n              props[key] = evaluateElementInline(val, context, schemaCtx);\n            } else if (Array.isArray(val)) {\n              props[key] = val.map((item) =>\n                isElementNode(item) ? evaluateElementInline(item, context, schemaCtx) : item,\n              );\n            }\n          }\n        }\n        return result;\n      }\n      // After materializeValue, all catalog/unknown components are lowered to\n      // ElementNode at parse time. Only builtins and mappedProps Comp nodes\n      // reach here. If we somehow get an unmapped Comp, warn and return null.\n      console.warn(`[openui] Unexpected unmapped Comp node: ${node.name}`);\n      return null;\n    }\n\n    // ── Binary operators ──────────────────────────────────────────────────\n    case \"BinOp\": {\n      // Short-circuit operators evaluate lazily\n      if (node.op === \"&&\") {\n        const left = evaluate(node.left, context);\n        return left ? evaluate(node.right, context) : left;\n      }\n      if (node.op === \"||\") {\n        const left = evaluate(node.left, context);\n        return left ? left : evaluate(node.right, context);\n      }\n\n      const left = evaluate(node.left, context);\n      const right = evaluate(node.right, context);\n\n      switch (node.op) {\n        case \"+\":\n          if (typeof left === \"string\" || typeof right === \"string\") {\n            // Treat null/undefined as \"\" for string concat to avoid \"textnull\"\n            return String(left ?? \"\") + String(right ?? \"\");\n          }\n          return toNumber(left) + toNumber(right);\n        case \"-\":\n          return toNumber(left) - toNumber(right);\n        case \"*\":\n          return toNumber(left) * toNumber(right);\n        case \"/\":\n          // DSL design choice: division by zero returns 0 instead of JavaScript's Infinity/NaN.\n          return toNumber(right) === 0 ? 0 : toNumber(left) / toNumber(right);\n        case \"%\":\n          return toNumber(right) === 0 ? 0 : toNumber(left) % toNumber(right);\n        case \"==\":\n          // Use loose equality so that e.g. 5 == \"5\" is true,\n          // consistent with the toNumber coercion used by comparison operators.\n          return left == right;\n        case \"!=\":\n          return left != right;\n        case \">\":\n          return toNumber(left) > toNumber(right);\n        case \"<\":\n          return toNumber(left) < toNumber(right);\n        case \">=\":\n          return toNumber(left) >= toNumber(right);\n        case \"<=\":\n          return toNumber(left) <= toNumber(right);\n        default:\n          return null;\n      }\n    }\n\n    // ── Unary operators ───────────────────────────────────────────────────\n    case \"UnaryOp\":\n      if (node.op === \"!\") {\n        return !evaluate(node.operand, context);\n      }\n      if (node.op === \"-\") {\n        return -toNumber(evaluate(node.operand, context));\n      }\n      return null;\n\n    // ── Ternary ───────────────────────────────────────────────────────────\n    case \"Ternary\": {\n      const cond = evaluate(node.cond, context);\n      return cond ? evaluate(node.then, context) : evaluate(node.else, context);\n    }\n\n    // ── Member access ─────────────────────────────────────────────────────\n    case \"Member\": {\n      const obj = evaluate(node.obj, context) as any;\n      if (obj == null) return null;\n      // Array pluck: if obj is an array, extract field from every element\n      if (Array.isArray(obj)) {\n        if (node.field === \"length\") return obj.length;\n        return obj.map((item: any) => item?.[node.field] ?? null);\n      }\n      return obj[node.field];\n    }\n\n    // ── Index access ──────────────────────────────────────────────────────\n    case \"Index\": {\n      const obj = evaluate(node.obj, context) as any;\n      const idx = evaluate(node.index, context);\n      if (obj == null || idx == null) return null;\n      if (Array.isArray(obj)) {\n        return obj[toNumber(idx)];\n      }\n      return obj[String(idx)];\n    }\n\n    // ── Assignment ────────────────────────────────────────────────────────\n    case \"Assign\":\n      return {\n        __reactive: \"assign\" as const,\n        target: node.target,\n        expr: node.value,\n      };\n  }\n}\n\n/**\n * Strip a ReactiveAssign to its current value in a non-reactive context.\n * When transport args or non-reactive props contain a ReactiveAssign, this\n * resolves it to the current state value (or null if getState is unavailable).\n */\nexport function stripReactiveAssign(value: unknown, context: EvaluationContext): unknown {\n  if (!isReactiveAssign(value)) return value;\n  return context.getState(value.target) ?? null;\n}\n\n/**\n * Evaluate an ElementNode's props with schema awareness. Used by evaluate()\n * when schema context is available and a Comp produces an ElementNode that\n * needs its own props evaluated with reactive schema detection.\n */\nfunction evaluateElementInline(\n  el: ElementNode,\n  context: EvaluationContext,\n  schemaCtx: SchemaContext,\n): ElementNode {\n  if (el.hasDynamicProps === false) return el;\n  const def = schemaCtx.library.components[el.typeName];\n  const evaluated: Record<string, unknown> = {};\n\n  for (const [key, value] of Object.entries(el.props)) {\n    const propSchema = def?.props?.shape?.[key];\n    evaluated[key] = evaluatePropInline(value, context, schemaCtx, propSchema);\n  }\n  return { ...el, props: evaluated };\n}\n\n/**\n * Evaluate a single prop value with schema awareness.\n * Delegates to shared evaluatePropCore with inline-specific recursion callbacks.\n */\nfunction evaluatePropInline(\n  value: unknown,\n  context: EvaluationContext,\n  schemaCtx: SchemaContext,\n  reactiveSchema?: unknown,\n): unknown {\n  return evaluatePropCore(value, context, schemaCtx, reactiveSchema, {\n    recurseElement: (el) => evaluateElementInline(el, context, schemaCtx),\n    recurse: (v, rs) => evaluatePropInline(v, context, schemaCtx, rs),\n  });\n}\n\n// @Percent(done, 10) with done = 3 -> {part: 3, total: 10}\nfunction evaluateArgs(\n  node: ASTNode & { k: \"Comp\" },\n  context: EvaluationContext,\n  params: ParamDef[] = BUILTIN_CALLS.get(node.name)?.params ?? [],\n): Record<string, unknown> {\n  // The parser names args in mappedProps; an AST from parseExpression() alone is named here\n  const named = node.mappedProps ?? nameArgs(node.args, params);\n  const args: Record<string, unknown> = {};\n  for (const key in named) args[key] = evaluate(named[key]!, context);\n  return args;\n}\n\n/** A library function's or action's args; an explicit null for an optional param is omitted, so its default applies. */\nfunction callArgs(\n  node: ASTNode & { k: \"Comp\" },\n  context: EvaluationContext,\n  params: JSONSchemaDef,\n): Record<string, unknown> {\n  const names = Object.keys(params.properties ?? {});\n  const args = evaluateArgs(\n    node,\n    context,\n    names.map((name) => ({ name, required: false })),\n  );\n  for (const key in args) {\n    if (args[key] === null && !params.required?.includes(key)) delete args[key];\n  }\n  return args;\n}\n\n// returns z.string() but fn gives 5 -> reports \"@Percent: ... expects string but got number\".\n// strict: any reported error gives INVALID instead of falling back to a default.\nfunction checkValue(\n  value: unknown,\n  schema: unknown,\n  name: string,\n  path: string,\n  context: EvaluationContext,\n  strict = false,\n): unknown {\n  const ctx = { errors: [], partial: false } as unknown as MaterializeCtx;\n  const checked = validateSchemaValue(value, schema, name, path, ctx);\n  for (const e of ctx.errors) context.reportError?.(`@${name}: ${e.message}`);\n  return strict && ctx.errors.length > 0 ? INVALID : checked;\n}\n\n// @Percent($p) with $p unset -> null, no error\nfunction missesRequired(args: Record<string, unknown>, params: RuntimeFunction[\"params\"]): boolean {\n  return !!params.required?.some(\n    (key) => args[key] == null && getSchemaDefaultValue(params.properties?.[key]) === undefined,\n  );\n}\n\n// @Percent(1, 0) where fn throws -> null, reports \"@Percent threw: ...\"\nfunction callFunction(\n  name: string,\n  def: RuntimeFunction,\n  node: ASTNode & { k: \"Comp\" },\n  context: EvaluationContext,\n): unknown {\n  const raw = callArgs(node, context, def.params);\n  if (missesRequired(raw, def.params)) return null;\n  const args = checkValue(raw, def.params, name, \"\", context);\n  if (args === INVALID) return null;\n  let result: unknown;\n  try {\n    result = def.fn(args);\n  } catch (e) {\n    context.reportError?.(`@${name} threw: ${e instanceof Error ? e.message : String(e)}`);\n    return null;\n  }\n  if (!def.returns) return result;\n  const checked = checkValue(result, def.returns, name, \"/returns\", context);\n  return checked === INVALID ? null : (checked ?? null);\n}\n\n/** True for an evaluated action plan (`{ steps: [...] }`). */\nexport function isActionPlan(value: unknown): value is ActionPlan {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    Array.isArray((value as { steps?: unknown }).steps)\n  );\n}\n\n/** Flatten plans (and stray step objects) into one plan; other values are dropped. */\nfunction flattenPlans(values: unknown[]): ActionPlan {\n  return ownSteps({\n    steps: values.flatMap((v): ActionStep[] => {\n      if (isActionPlan(v)) return v.steps;\n      return v != null && typeof v === \"object\" && \"type\" in v ? [v as ActionStep] : [];\n    }),\n  });\n}\n\n/** The custom steps made by real calls; a custom step read from data is not among them. */\nconst customSteps = new WeakSet<ActionStep>();\n\n/** Drops the custom steps no real call made, so data cannot pose as a custom action. */\nexport function ownSteps(plan: ActionPlan): ActionPlan {\n  const own = (s: ActionStep | null) => s?.type !== \"custom_action\" || customSteps.has(s);\n  return plan.steps.every(own) ? plan : { ...plan, steps: plan.steps.filter(own) };\n}\n\n/** A step call is a one-step plan, an invalid step an empty plan; Action([...]) flattens. */\nfunction evaluateActionCall(node: ASTNode & { k: \"Comp\" }, context: EvaluationContext): ActionPlan {\n  const { name, args } = node;\n  if (name === \"Action\") {\n    const list = args.length > 0 ? evaluate(args[0], context) : [];\n    return flattenPlans(Array.isArray(list) ? list : []);\n  }\n  const def = BUILTIN_STEPS[name]!;\n  const step = def.step ? def.step(evaluateArgs(node, context)) : evaluateLazyStep(name, args);\n  return { steps: step ? [step] : [] };\n}\n\n/** The steps whose args are refs, read as AST. */\nfunction evaluateLazyStep(name: string, args: ASTNode[]): ActionStep | null {\n  switch (name) {\n    case \"Run\": {\n      // Run(runtimeRef); an unresolved Ref is invalid\n      const refNode = args[0];\n      if (refNode?.k !== \"RuntimeRef\") return null;\n      return { type: ACTION_STEPS.Run, statementId: refNode.n, refType: refNode.refType };\n    }\n    case \"Set\": {\n      // Set($varName, value). valueAST is evaluated at click time by triggerAction;\n      // loop variables (e.g. t.id from Each) are pre-resolved by Each's substituteRef.\n      if (args.length < 2 || args[0].k !== \"StateRef\") return null;\n      return { type: ACTION_STEPS.Set, target: args[0].n, valueAST: args[1] };\n    }\n    case \"Reset\": {\n      // Reset($var1, $var2, ...) restores declared defaults at runtime.\n      const targets = args\n        .filter((a): a is ASTNode & { k: \"StateRef\" } => a.k === \"StateRef\")\n        .map((a) => a.n);\n      if (targets.length === 0) return null;\n      return { type: ACTION_STEPS.Reset, targets };\n    }\n    default:\n      return null;\n  }\n}\n\n/**\n * Substitute all Ref(varName) nodes in an AST tree with a literal value.\n * This pre-resolves loop variables so deferred expressions (like Action steps)\n * don't lose scope when evaluated later at click time.\n */\nfunction substituteRef(node: ASTNode, varName: string, value: unknown): ASTNode {\n  switch (node.k) {\n    case \"Ref\":\n      return node.n === varName ? toLiteralAST(value) : node;\n    case \"Member\": {\n      // Member access on the loop var: t.id → resolve t, then access .id\n      if (isASTNode(node.obj)) {\n        const subObj = substituteRef(node.obj as ASTNode, varName, value);\n        // If obj resolved to a literal, we can inline the member access result\n        if (subObj.k === \"Obj\") {\n          const entry = subObj.entries.find(([k]) => k === node.field);\n          if (entry) return entry[1];\n        }\n        return { ...node, obj: subObj };\n      }\n      return node;\n    }\n    case \"Index\":\n      return {\n        ...node,\n        obj: isASTNode(node.obj) ? substituteRef(node.obj as ASTNode, varName, value) : node.obj,\n        index: isASTNode(node.index)\n          ? substituteRef(node.index as ASTNode, varName, value)\n          : node.index,\n      };\n    case \"BinOp\":\n      return {\n        ...node,\n        left: substituteRef(node.left, varName, value),\n        right: substituteRef(node.right, varName, value),\n      };\n    case \"UnaryOp\":\n      return { ...node, operand: substituteRef(node.operand, varName, value) };\n    case \"Ternary\":\n      return {\n        ...node,\n        cond: substituteRef(node.cond, varName, value),\n        then: substituteRef(node.then, varName, value),\n        else: substituteRef(node.else, varName, value),\n      };\n    case \"Arr\":\n      return { ...node, els: node.els.map((e) => substituteRef(e, varName, value)) };\n    case \"Obj\":\n      return {\n        ...node,\n        entries: node.entries.map(\n          ([k, v]) => [k, substituteRef(v, varName, value)] as [string, ASTNode],\n        ),\n      };\n    case \"Comp\": {\n      const sub = (a: ASTNode) => substituteRef(a, varName, value);\n      const result = { ...node, args: node.args.map(sub) };\n      if (node.mappedProps) result.mappedProps = mapValues(node.mappedProps, sub);\n      return result;\n    }\n    case \"Assign\":\n      return { ...node, value: substituteRef(node.value, varName, value) };\n    default:\n      return node;\n  }\n}\n\nfunction mapValues(\n  record: Record<string, ASTNode>,\n  fn: (node: ASTNode) => ASTNode,\n): Record<string, ASTNode> {\n  const out: Record<string, ASTNode> = {};\n  for (const key in record) out[key] = fn(record[key]!);\n  return out;\n}\n\n/**\n * Each(array, varName, template) — evaluate template once per array item.\n * varName is user-defined (e.g. `issue`, `ticket`) — no $ prefix collision.\n *\n * Before evaluation, substitutes all Ref(varName) in the template with the\n * current item's literal value. This ensures deferred expressions (like\n * Action/Set steps) capture concrete values instead of dangling loop refs.\n */\nfunction evaluateLazyBuiltin(\n  name: string,\n  args: ASTNode[],\n  context: EvaluationContext,\n  schemaCtx?: SchemaContext,\n): unknown {\n  if (name === \"Each\") {\n    if (args.length < 3) return [];\n    const arr = evaluate(args[0], context);\n    if (!Array.isArray(arr)) return [];\n\n    const varName =\n      args[1].k === \"Ref\" ? args[1].n : args[1].k === \"Str\" ? (args[1] as any).v : null;\n    if (!varName) return [];\n    const template = args[2];\n\n    return arr.map((item, _idx) => {\n      // Pre-substitute loop variable refs with concrete values in the template AST.\n      // This captures the item for deferred expressions (Action steps evaluated at click time).\n      const substituted = substituteRef(template, varName, item);\n      const childCtx: EvaluationContext = {\n        ...context,\n        resolveRef: (refName: string) => {\n          if (refName === varName) return item;\n          return context.resolveRef(refName);\n        },\n      };\n      const result = evaluate(substituted, childCtx, schemaCtx);\n      // If schema context is available and result is an ElementNode, evaluate its props\n      if (schemaCtx && isElementNode(result)) {\n        return evaluateElementInline(result as ElementNode, childCtx, schemaCtx);\n      }\n      return result;\n    });\n  }\n  return null;\n}\n","/**\n * Shared prop value evaluation logic.\n *\n * Both evaluator.ts (inline path) and evaluate-tree.ts (React path) need\n * identical prop evaluation — AST resolution, ReactiveAssign handling,\n * ElementNode recursion, ActionPlan preservation. The only difference is\n * how they recurse into ElementNodes. This module extracts the shared core\n * and takes recursion callbacks so each caller can supply its own strategy.\n *\n * Also fixes the nested reactive drop bug: reactiveSchema is now correctly\n * passed through plain object recursion.\n */\n\nimport { isASTNode } from \"../parser/ast\";\nimport type { ElementNode } from \"../parser/types\";\nimport { isElementNode } from \"../parser/types\";\nimport { isReactiveSchema } from \"../reactive\";\nimport type { EvaluationContext, SchemaContext } from \"./evaluator\";\nimport { evaluate, isActionPlan, isReactiveAssign, ownSteps } from \"./evaluator\";\n\nexport interface PropEvalCallbacks {\n  /** How to recurse into an ElementNode (evaluator vs evaluate-tree differ here). */\n  recurseElement: (el: ElementNode) => ElementNode;\n  /** How to self-recurse for a prop value. */\n  recurse: (value: unknown, reactiveSchema?: unknown) => unknown;\n}\n\n/**\n * Evaluate a single prop value with schema awareness. Handles AST nodes,\n * ReactiveAssign markers, nested ElementNodes, arrays, and ActionPlans.\n */\nexport function evaluatePropCore(\n  value: unknown,\n  context: EvaluationContext,\n  schemaCtx: SchemaContext,\n  reactiveSchema: unknown | undefined,\n  callbacks: PropEvalCallbacks,\n): unknown {\n  const result = evaluatePropValue(value, context, schemaCtx, reactiveSchema, callbacks);\n  // Only real calls make custom steps: a plan read from data loses them\n  return isActionPlan(result) ? ownSteps(result) : result;\n}\n\nfunction evaluatePropValue(\n  value: unknown,\n  context: EvaluationContext,\n  schemaCtx: SchemaContext,\n  reactiveSchema: unknown | undefined,\n  callbacks: PropEvalCallbacks,\n): unknown {\n  if (value == null) return value;\n  if (typeof value !== \"object\") return value;\n\n  // AST node — evaluate with schema context\n  if (isASTNode(value)) {\n    // StateRef on reactive prop → ReactiveAssign marker\n    if (value.k === \"StateRef\" && reactiveSchema && isReactiveSchema(reactiveSchema)) {\n      return {\n        __reactive: \"assign\" as const,\n        target: value.n,\n        expr: { k: \"StateRef\" as const, n: \"$value\" },\n      };\n    }\n    const result = evaluate(value, context, schemaCtx);\n    // ElementNode result (from ternary/Comp) → recurse into its props\n    if (isElementNode(result)) {\n      return callbacks.recurseElement(result as ElementNode);\n    }\n    // Array result (from Each) → recurse into any ElementNodes\n    if (Array.isArray(result)) {\n      return result.map((item) =>\n        isElementNode(item) ? callbacks.recurseElement(item as ElementNode) : item,\n      );\n    }\n    // Strip ReactiveAssign from non-reactive props\n    if (isReactiveAssign(result) && !(reactiveSchema && isReactiveSchema(reactiveSchema))) {\n      return context.getState(result.target) ?? null;\n    }\n    return result;\n  }\n\n  // String on reactive schema → pass through (component's useStateField resolves it)\n  if (typeof value === \"string\" && reactiveSchema && isReactiveSchema(reactiveSchema)) {\n    return value;\n  }\n\n  // Array — recurse\n  if (Array.isArray(value)) {\n    return value.map((v) => callbacks.recurse(v, reactiveSchema));\n  }\n\n  // ElementNode — recurse with schema\n  if (isElementNode(value)) {\n    return callbacks.recurseElement(value as ElementNode);\n  }\n\n  // ActionPlan — preserve as-is (deferred click-time evaluation)\n  if (isActionPlan(value)) return value;\n  const obj = value as Record<string, unknown>;\n\n  // Plain data object — recurse if contains nested objects\n  // NOTE: reactiveSchema is passed through — fixes nested reactive drop bug\n  let needsEval = false;\n  for (const val of Object.values(obj)) {\n    if (typeof val === \"object\" && val !== null) {\n      needsEval = true;\n      break;\n    }\n  }\n  if (needsEval) {\n    const result: Record<string, unknown> = {};\n    for (const [k, v] of Object.entries(obj)) {\n      result[k] = callbacks.recurse(v, reactiveSchema);\n    }\n    return result;\n  }\n\n  return value;\n}\n","/**\n * Evaluate-tree: entry point for evaluating ElementNode prop trees.\n *\n * Delegates to the evaluator's schema-aware evaluation when schema context\n * is available. This ensures reactive schemas, ActionPlan preservation,\n * Each loop variable substitution, and ternary resolution all happen in\n * a single unified pass.\n */\n\nimport type { Library } from \"../library\";\nimport {\n  isElementNode,\n  type ElementNode,\n  type OpenUIError,\n  type ParseResult,\n} from \"../parser/types\";\nimport { evaluatePropCore } from \"./evaluate-prop\";\nimport { evaluate, type EvaluationContext, type SchemaContext } from \"./evaluator\";\nimport type { Store } from \"./store\";\n\n/** Context passed through the evaluation chain — no module-level state. */\nexport interface EvalContext {\n  /** AST evaluation context (getState, resolveRef) */\n  ctx: EvaluationContext;\n  /** Component library for reactive schema lookup */\n  library: Library;\n  /** Reactive binding store (null in v1 mode) */\n  store: Store | null;\n  /** Runtime errors collected during prop evaluation (optional — populated by evaluateElementProps). */\n  errors?: OpenUIError[];\n}\n\n/**\n * Evaluate all AST nodes in an ElementNode tree's props.\n * Returns a new ElementNode with all props resolved to concrete values.\n *\n * Uses the unified evaluator with schema context for reactive-aware evaluation.\n */\nexport function evaluateElementProps(el: ElementNode, evalCtx: EvalContext): ElementNode {\n  if (el.hasDynamicProps === false) return el;\n\n  const schemaCtx: SchemaContext = { library: evalCtx.library };\n  const def = evalCtx.library.components[el.typeName];\n  const evaluated: Record<string, unknown> = {};\n\n  let key = \"\";\n  const report = (msg: string) => {\n    evalCtx.errors?.push({\n      source: \"runtime\",\n      code: \"runtime-error\",\n      component: el.typeName,\n      statementId: el.statementId,\n      message: `Evaluating prop \"${key}\" on ${el.typeName} failed: ${msg}`,\n      hint: `Check the expression used for prop \"${key}\"`,\n    });\n  };\n  // Library function calls and actions that fail report why here\n  const propCtx =\n    evalCtx.ctx.functions || evalCtx.ctx.actions\n      ? { ...evalCtx, ctx: { ...evalCtx.ctx, reportError: report } }\n      : evalCtx;\n\n  for (const [propKey, value] of Object.entries(el.props)) {\n    key = propKey;\n    const propSchema = def?.props?.shape?.[key];\n    try {\n      evaluated[key] = evaluatePropValue(value, propCtx, schemaCtx, propSchema);\n    } catch (e) {\n      // Use raw value as fallback for this prop, collect structured error\n      evaluated[key] = value;\n      report(e instanceof Error ? e.message : String(e));\n    }\n  }\n\n  return { ...el, props: evaluated };\n}\n\n/** Evaluate `root`, or the component a runtime entry (`rootExpression`) picks; null if none. */\nexport function evaluateRoot(\n  result: Pick<ParseResult, \"root\" | \"rootExpression\">,\n  evalCtx: EvalContext,\n): ElementNode | null {\n  if (result.root) return evaluateElementProps(result.root, evalCtx);\n  if (!result.rootExpression) return null;\n  const value = evaluate(result.rootExpression, evalCtx.ctx, { library: evalCtx.library });\n  if (isElementNode(value)) return evaluateElementProps(value, evalCtx);\n  evalCtx.errors?.push({\n    source: \"runtime\",\n    code: \"no-root\",\n    statementId: \"root\",\n    message: \"root does not evaluate to a component\",\n  });\n  return null;\n}\n\n/**\n * Evaluate a single prop value with schema awareness.\n * Delegates to shared evaluatePropCore with evaluate-tree-specific recursion callbacks.\n */\nfunction evaluatePropValue(\n  value: unknown,\n  evalCtx: EvalContext,\n  schemaCtx: SchemaContext,\n  reactiveSchema?: unknown,\n): unknown {\n  return evaluatePropCore(value, evalCtx.ctx, schemaCtx, reactiveSchema, {\n    recurseElement: (el) => evaluateElementProps(el, evalCtx),\n    recurse: (v, rs) => evaluatePropValue(v, evalCtx, schemaCtx, rs),\n  });\n}\n","/**\n * MCP utilities — type definitions and result extraction for MCP client integration.\n *\n * The Renderer accepts an MCP client directly as `toolProvider`.\n * It detects the MCP client shape (has `callTool({ name, arguments })`) and\n * wraps responses with `extractToolResult` automatically.\n *\n * @example\n * ```tsx\n * import { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\n * import { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\n *\n * const client = new Client({ name: \"my-app\", version: \"1.0.0\" });\n * await client.connect(new StreamableHTTPClientTransport(new URL(\"/api/mcp\")));\n *\n * // Pass directly — Renderer handles MCP response extraction\n * <Renderer toolProvider={client} library={library} response={content} />\n * ```\n */\n\n/**\n * Error thrown when an MCP tool call returns `isError: true`.\n * Preserves the raw error content from the MCP response for structured handling.\n */\nexport class McpToolError extends Error {\n  readonly toolErrorText: string;\n\n  constructor(errorText: string) {\n    super(`MCP tool error: ${errorText || \"Unknown error\"}`);\n    this.name = \"McpToolError\";\n    this.toolErrorText = errorText;\n  }\n}\n\n/**\n * Minimal shape of an MCP Client — matches @modelcontextprotocol/sdk Client\n * without requiring it as a hard import. Users can pass any object that\n * implements these methods.\n */\nexport interface McpClientLike {\n  callTool(\n    params: { name: string; arguments?: Record<string, unknown> },\n    options?: unknown,\n  ): Promise<{\n    content: Array<{ type: string; text?: string; [key: string]: unknown }>;\n    structuredContent?: unknown;\n    isError?: boolean;\n  }>;\n  close?(): Promise<void>;\n}\n\n/**\n * Extract the actual data from an MCP callTool result.\n * Prefers structuredContent (machine-readable JSON), falls back to parsing text content.\n */\nexport function extractToolResult(result: {\n  content: Array<{ type: string; text?: string; [key: string]: unknown }>;\n  structuredContent?: unknown;\n  isError?: boolean;\n}): unknown {\n  if (result.isError) {\n    const errorText = result.content\n      ?.filter((c) => c.type === \"text\")\n      .map((c) => c.text)\n      .join(\"\\n\");\n    throw new McpToolError(errorText || \"Unknown error\");\n  }\n\n  // Prefer structuredContent (JSON data, no parsing needed)\n  if (result.structuredContent != null) {\n    return result.structuredContent;\n  }\n\n  // Fall back to text content — try to parse as JSON\n  const textParts = result.content?.filter((c) => c.type === \"text\").map((c) => c.text ?? \"\");\n  if (textParts?.length) {\n    const text = textParts.join(\"\");\n    try {\n      return JSON.parse(text);\n    } catch {\n      return text;\n    }\n  }\n\n  return null;\n}\n","/**\n * Standard error thrown when a tool name is not found in a function-map ToolProvider.\n * Used by Renderer's inline normalization to give clear error messages.\n */\nexport class ToolNotFoundError extends Error {\n  readonly toolName: string;\n  readonly availableTools: string[];\n\n  constructor(toolName: string, availableTools: string[] = []) {\n    super(\n      `[openui] No handler for tool \"${toolName}\". Available: ${availableTools.join(\", \") || \"(none)\"}`,\n    );\n    this.name = \"ToolNotFoundError\";\n    this.toolName = toolName;\n    this.availableTools = availableTools;\n  }\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// Query Manager — reactive data fetching for openui-lang\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { OpenUIError } from \"../parser/types\";\nimport { McpToolError } from \"./mcp\";\nimport { ToolNotFoundError } from \"./toolProvider\";\n\n/**\n * ToolProvider interface for Query() and Mutation() tool calls.\n * Framework-agnostic — works with MCP, REST, GraphQL, or any backend.\n *\n * @example\n * ```ts\n * // Function map (Renderer normalizes this automatically)\n * <Renderer toolProvider={{\n *   get_users: (args) => fetch(`/api/users`).then(r => r.json()),\n * }} />\n *\n * // MCP client (Renderer wraps extractToolResult automatically)\n * <Renderer toolProvider={mcpClient} />\n * ```\n */\nexport interface ToolProvider {\n  callTool(toolName: string, args: Record<string, unknown>): Promise<unknown>;\n}\n\n// ── Public types ─────────────────────────────────────────────────────────────\n\nexport interface QueryNode {\n  statementId: string;\n  toolName: string;\n  args: unknown;\n  defaults: unknown;\n  /** Evaluated dependency value — included in cache key to force re-fetch on change. */\n  deps: unknown;\n  /** Auto-refresh interval in seconds. */\n  refreshInterval?: number;\n  complete: boolean;\n}\n\nexport interface MutationNode {\n  statementId: string;\n  toolName: string;\n}\n\nexport interface MutationResult {\n  status: \"idle\" | \"loading\" | \"success\" | \"error\";\n  data?: unknown;\n  error?: unknown;\n}\n\nexport interface QuerySnapshot extends Record<string, unknown> {\n  __openui_loading: string[];\n  __openui_refetching: string[];\n  __openui_errors: OpenUIError[];\n}\n\nexport interface QueryManager {\n  evaluateQueries(queryNodes: QueryNode[]): void;\n  getResult(statementId: string): unknown;\n  isLoading(statementId: string): boolean;\n  isAnyLoading(): boolean;\n  invalidate(statementIds?: string[]): void;\n  registerMutations(nodes: MutationNode[]): void;\n  fireMutation(\n    statementId: string,\n    evaluatedArgs: Record<string, unknown>,\n    refreshQueryIds?: string[],\n  ): Promise<boolean>;\n  getMutationResult(statementId: string): MutationResult | null;\n  subscribe(listener: () => void): () => void;\n  getSnapshot(): QuerySnapshot;\n  activate(): void;\n  dispose(): void;\n}\n\n// ── Internal types ───────────────────────────────────────────────────────────\n\ninterface QueryEntry {\n  toolName: string;\n  args: unknown;\n  defaults: unknown;\n  cacheKey: string;\n  prevCacheKey?: string;\n  loading: boolean;\n  everFetched: boolean;\n  refreshInterval: number;\n  timer?: ReturnType<typeof setInterval>;\n  needsRefetch: boolean;\n  error?: OpenUIError;\n}\n\ninterface MutationEntry {\n  toolName: string;\n  result: MutationResult;\n  error?: OpenUIError;\n}\n\ninterface CacheEntry {\n  data: unknown;\n  inFlight: boolean;\n}\n\n// ── Utilities ────────────────────────────────────────────────────────────────\n\n/** JSON.stringify with stable key ordering at all nesting levels. */\nfunction stableStringify(value: unknown): string {\n  return JSON.stringify(value, (_key: string, val: unknown) => {\n    if (val && typeof val === \"object\" && !Array.isArray(val)) {\n      const sorted: Record<string, unknown> = {};\n      for (const k of Object.keys(val as object).sort()) {\n        sorted[k] = (val as any)[k];\n      }\n      return sorted;\n    }\n    // Serialize non-JSON-safe primitives to stable strings.\n    // evaluate() can pull arbitrary values from store/ref state,\n    // including undefined in object literals and edge-case numbers.\n    if (val === undefined) return \"__undefined__\";\n    if (typeof val === \"number\") {\n      if (Number.isNaN(val)) return \"__NaN__\";\n      if (val === Infinity) return \"__Inf__\";\n      if (val === -Infinity) return \"__-Inf__\";\n    }\n    return val;\n  });\n}\n\nfunction buildCacheKey(toolName: string, args: unknown, deps: unknown): string {\n  const depsKey = deps != null ? \"::\" + stableStringify(deps) : \"\";\n  return toolName + \"::\" + stableStringify(args) + depsKey;\n}\n\n// ── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createQueryManager(toolProvider: ToolProvider | null): QueryManager {\n  const queries = new Map<string, QueryEntry>();\n  const mutations = new Map<string, MutationEntry>();\n  const cache = new Map<string, CacheEntry>();\n  const listeners = new Set<() => void>();\n\n  let snapshot: QuerySnapshot = {\n    __openui_loading: [],\n    __openui_refetching: [],\n    __openui_errors: [],\n  };\n  let snapshotJson = JSON.stringify(snapshot);\n  let disposed = false;\n  let generation = 0;\n\n  // ── Snapshot & notification ──────────────────────────────────────────────\n\n  function rebuildSnapshot(): boolean {\n    const out: QuerySnapshot = {\n      __openui_loading: [],\n      __openui_refetching: [],\n      __openui_errors: [],\n    };\n\n    for (const [sid, q] of queries) {\n      const entry = cache.get(q.cacheKey);\n      if (entry && entry.data !== undefined) {\n        // Use settled data (even while refetching — shows last good value)\n        out[sid] = entry.data;\n      } else if (q.prevCacheKey) {\n        const prev = cache.get(q.prevCacheKey);\n        if (prev && prev.data !== undefined) {\n          out[sid] = prev.data;\n        } else {\n          out[sid] = q.defaults;\n        }\n      } else {\n        out[sid] = q.defaults;\n      }\n      if (q.loading) {\n        out.__openui_loading.push(sid);\n        if (q.everFetched) out.__openui_refetching.push(sid);\n      }\n      if (q.error) out.__openui_errors.push(q.error);\n    }\n\n    for (const [sid, m] of mutations) {\n      out[sid] = m.result;\n      if (m.error) out.__openui_errors.push(m.error);\n    }\n\n    try {\n      const outJson = JSON.stringify(out);\n      if (outJson === snapshotJson) return false;\n      snapshot = out;\n      snapshotJson = outJson;\n    } catch {\n      snapshot = out;\n      snapshotJson = \"\";\n    }\n    return true;\n  }\n\n  function notify() {\n    for (const listener of [...listeners]) {\n      listener();\n    }\n  }\n\n  // ── Fetch execution ──────────────────────────────────────────────────────\n\n  async function executeFetch(cacheKey: string, statementId: string) {\n    if (!toolProvider) return;\n\n    const q = queries.get(statementId);\n    if (!q) return;\n\n    // Capture the cache key at fetch start — if the query's key changes\n    // while we're in-flight (deps changed), this fetch is stale.\n    const fetchKey = cacheKey;\n    const toolName = q.toolName;\n    const args = q.args;\n\n    // Mark in-flight — use undefined as \"no data yet\" sentinel (distinct from null)\n    let entry = cache.get(fetchKey);\n    if (!entry) {\n      entry = { data: undefined, inFlight: true };\n      cache.set(fetchKey, entry);\n    } else {\n      entry.inFlight = true;\n    }\n    q.loading = true;\n    rebuildSnapshot();\n    notify();\n\n    try {\n      const data = await toolProvider.callTool(toolName, (args as Record<string, unknown>) ?? {});\n      if (disposed) return;\n      // Query removed or moved to a different cache key while in-flight — discard\n      const current = queries.get(statementId);\n      if (!current || current.cacheKey !== fetchKey) {\n        entry.inFlight = false;\n        return;\n      }\n\n      entry.data = data ?? null;\n      current.everFetched = true;\n      current.error = undefined;\n\n      // Clean up previous cache entry — clear prevCacheKey FIRST so\n      // cleanupCacheEntry doesn't see this query as a live reference.\n      if (current.prevCacheKey && current.prevCacheKey !== fetchKey) {\n        const prevKey = current.prevCacheKey;\n        current.prevCacheKey = undefined;\n        cleanupCacheEntry(prevKey);\n      }\n    } catch (err) {\n      // Only update error state if this fetch is still current\n      const current = queries.get(statementId);\n      if (current && current.cacheKey === fetchKey) {\n        if (err instanceof ToolNotFoundError) {\n          current.error = {\n            source: \"query\",\n            code: \"tool-not-found\",\n            message: `Query tool \"${toolName}\" not found`,\n            statementId,\n            component: \"Query\",\n            toolName,\n            hint: err.availableTools.length\n              ? `Available tools: ${err.availableTools.join(\", \")}`\n              : undefined,\n          };\n        } else if (err instanceof McpToolError) {\n          current.error = {\n            source: \"query\",\n            code: \"mcp-error\",\n            message: `Query \"${toolName}\" returned an error: ${err.toolErrorText}`,\n            statementId,\n            component: \"Query\",\n            toolName,\n          };\n        } else {\n          const msg = err instanceof Error ? err.message : String(err);\n          current.error = {\n            source: \"query\",\n            code: \"tool-error\",\n            message: `Query \"${toolName}\" failed: ${msg}`,\n            statementId,\n            component: \"Query\",\n            toolName,\n          };\n        }\n      }\n      console.error(`Query \"${toolName}\" failed:`, err);\n    } finally {\n      entry.inFlight = false;\n      const current = queries.get(statementId);\n      // Only clear loading if this fetch is still current\n      if (current && current.cacheKey === fetchKey) {\n        current.loading = false;\n        if (rebuildSnapshot()) notify();\n        // Re-fetch if invalidation occurred while in-flight\n        if (current.needsRefetch) {\n          current.needsRefetch = false;\n          executeFetch(current.cacheKey, statementId);\n        }\n      } else {\n        if (rebuildSnapshot()) notify();\n      }\n    }\n  }\n\n  /** Remove a cache entry if no query references it. */\n  function cleanupCacheEntry(cacheKey: string) {\n    for (const q of queries.values()) {\n      if (q.cacheKey === cacheKey || q.prevCacheKey === cacheKey) return;\n    }\n    cache.delete(cacheKey);\n  }\n\n  // ── Query evaluation ─────────────────────────────────────────────────────\n\n  function evaluateQueries(queryNodes: QueryNode[]) {\n    if (disposed) return;\n\n    const activeIds = new Set(queryNodes.map((n) => n.statementId));\n\n    // Clean up removed queries\n    for (const [sid, q] of queries) {\n      if (!activeIds.has(sid)) {\n        if (q.timer) clearInterval(q.timer);\n        queries.delete(sid);\n        // Clean up cache entries that are no longer referenced\n        cleanupCacheEntry(q.cacheKey);\n        if (q.prevCacheKey) cleanupCacheEntry(q.prevCacheKey);\n      }\n    }\n\n    // Process active queries\n    for (const node of queryNodes) {\n      if (!node.complete) continue;\n\n      const cacheKey = buildCacheKey(node.toolName, node.args, node.deps);\n      const existing = queries.get(node.statementId);\n\n      if (existing) {\n        // Track previous cache key for fallback display\n        if (existing.cacheKey !== cacheKey) {\n          existing.prevCacheKey = existing.cacheKey;\n        }\n        existing.toolName = node.toolName;\n        existing.args = node.args;\n        existing.defaults = node.defaults;\n        existing.cacheKey = cacheKey;\n      } else {\n        queries.set(node.statementId, {\n          toolName: node.toolName,\n          args: node.args,\n          defaults: node.defaults,\n          cacheKey,\n          loading: false,\n          everFetched: false,\n          refreshInterval: 0,\n          needsRefetch: false,\n        });\n      }\n\n      const q = queries.get(node.statementId)!;\n\n      // Fire fetch if no settled data and not already in-flight\n      const entry = cache.get(cacheKey);\n      const hasSettledData = entry && entry.data !== undefined && !entry.inFlight;\n      if (toolProvider && !hasSettledData && !entry?.inFlight) {\n        executeFetch(cacheKey, node.statementId);\n      }\n\n      // Configure auto-refresh timer\n      const newInterval = node.refreshInterval ?? 0;\n      if (newInterval !== q.refreshInterval) {\n        if (q.timer) {\n          clearInterval(q.timer);\n          q.timer = undefined;\n        }\n        if (newInterval > 0) {\n          q.timer = setInterval(() => {\n            if (disposed || !toolProvider) return;\n            const entry = cache.get(q.cacheKey);\n            if (!entry?.inFlight) {\n              executeFetch(q.cacheKey, node.statementId);\n            }\n          }, newInterval * 1000);\n        }\n        q.refreshInterval = newInterval;\n      }\n    }\n\n    if (rebuildSnapshot()) notify();\n  }\n\n  // ── Query accessors ──────────────────────────────────────────────────────\n\n  function getResult(statementId: string): unknown {\n    const q = queries.get(statementId);\n    if (!q) return null;\n    const entry = cache.get(q.cacheKey);\n    if (entry && entry.data !== undefined) return entry.data;\n    // Fall back to previous cache entry while loading\n    if (q.prevCacheKey) {\n      const prev = cache.get(q.prevCacheKey);\n      if (prev && prev.data !== undefined) return prev.data;\n    }\n    return q.defaults;\n  }\n\n  function isLoading(statementId: string): boolean {\n    return queries.get(statementId)?.loading ?? false;\n  }\n\n  function isAnyLoading(): boolean {\n    for (const q of queries.values()) {\n      if (q.loading) return true;\n    }\n    return false;\n  }\n\n  function invalidate(statementIds?: string[]) {\n    if (disposed || !toolProvider) return;\n\n    const targets = statementIds?.length\n      ? statementIds.filter((sid) => queries.has(sid))\n      : [...queries.keys()];\n\n    for (const sid of targets) {\n      const q = queries.get(sid);\n      if (!q) continue;\n      const entry = cache.get(q.cacheKey);\n      if (entry?.inFlight) {\n        q.needsRefetch = true;\n      } else {\n        executeFetch(q.cacheKey, sid);\n      }\n    }\n  }\n\n  // ── Mutation methods ─────────────────────────────────────────────────────\n\n  function registerMutations(nodes: MutationNode[]) {\n    const activeIds = new Set(nodes.map((n) => n.statementId));\n\n    // Clean up removed mutations\n    for (const sid of mutations.keys()) {\n      if (!activeIds.has(sid)) mutations.delete(sid);\n    }\n\n    // Register/update active mutations\n    for (const node of nodes) {\n      const existing = mutations.get(node.statementId);\n      if (existing) {\n        if (existing.toolName !== node.toolName) {\n          existing.toolName = node.toolName;\n          existing.result = { status: \"idle\", data: null, error: null };\n          existing.error = undefined;\n        }\n      } else {\n        mutations.set(node.statementId, {\n          toolName: node.toolName,\n          result: { status: \"idle\" },\n        });\n      }\n    }\n\n    if (rebuildSnapshot()) notify();\n  }\n\n  async function fireMutation(\n    statementId: string,\n    evaluatedArgs: Record<string, unknown>,\n    refreshQueryIds?: string[],\n  ): Promise<boolean> {\n    if (disposed || !toolProvider) return false;\n    const m = mutations.get(statementId);\n    if (!m) return false;\n\n    // Reject concurrent calls on the same mutation — prevents double-submit\n    if (m.result.status === \"loading\") return false;\n\n    const gen = generation;\n\n    m.result = { status: \"loading\" };\n    rebuildSnapshot();\n    notify();\n\n    let success = false;\n    try {\n      const data = await toolProvider.callTool(m.toolName, evaluatedArgs);\n      if (disposed || gen !== generation) return false;\n      m.result = { status: \"success\", data };\n      m.error = undefined;\n      success = true;\n    } catch (err) {\n      if (disposed || gen !== generation) return false;\n      const msg = err instanceof Error ? err.message : String(err);\n      m.result = { status: \"error\", error: msg };\n      if (err instanceof ToolNotFoundError) {\n        m.error = {\n          source: \"mutation\",\n          code: \"tool-not-found\",\n          message: `Mutation tool \"${m.toolName}\" not found`,\n          statementId,\n          component: \"Mutation\",\n          toolName: m.toolName,\n          hint: err.availableTools.length\n            ? `Available tools: ${err.availableTools.join(\", \")}`\n            : undefined,\n        };\n      } else if (err instanceof McpToolError) {\n        m.error = {\n          source: \"mutation\",\n          code: \"mcp-error\",\n          message: `Mutation \"${m.toolName}\" returned an error: ${err.toolErrorText}`,\n          statementId,\n          component: \"Mutation\",\n          toolName: m.toolName,\n        };\n      } else {\n        m.error = {\n          source: \"mutation\",\n          code: \"tool-error\",\n          message: `Mutation \"${m.toolName}\" failed: ${msg}`,\n          statementId,\n          component: \"Mutation\",\n          toolName: m.toolName,\n        };\n      }\n    }\n\n    rebuildSnapshot();\n    notify();\n\n    if (success && refreshQueryIds?.length) {\n      invalidate(refreshQueryIds);\n    }\n\n    return success;\n  }\n\n  function getMutationResult(statementId: string): MutationResult | null {\n    return mutations.get(statementId)?.result ?? null;\n  }\n\n  // ── Pub/sub ──────────────────────────────────────────────────────────────\n\n  function subscribe(listener: () => void): () => void {\n    listeners.add(listener);\n    return () => listeners.delete(listener);\n  }\n\n  function getSnapshot(): QuerySnapshot {\n    return snapshot;\n  }\n\n  // ── Lifecycle ────────────────────────────────────────────────────────────\n\n  function activate() {\n    disposed = false;\n  }\n\n  function dispose() {\n    disposed = true;\n    generation++;\n    listeners.clear();\n    // Clear timers and transient state, preserve cache + query entries for Strict Mode re-attach\n    for (const q of queries.values()) {\n      if (q.timer) {\n        clearInterval(q.timer);\n        q.timer = undefined;\n      }\n      q.refreshInterval = 0;\n      q.loading = false;\n      q.needsRefetch = false;\n    }\n    mutations.clear();\n  }\n\n  return {\n    evaluateQueries,\n    getResult,\n    isLoading,\n    isAnyLoading,\n    invalidate,\n    registerMutations,\n    fireMutation,\n    getMutationResult,\n    subscribe,\n    getSnapshot,\n    activate,\n    dispose,\n  };\n}\n","import type { EvaluationContext } from \"./evaluator\";\nimport { evaluate, isReactiveAssign } from \"./evaluator\";\nimport type { Store } from \"./store\";\n\nexport interface StateField<T = unknown> {\n  name: string;\n  value: T;\n  setValue: (newValue: T) => void;\n  isReactive: boolean;\n}\n\nexport type InferStateFieldValue<T> = T extends StateField<infer U> ? U : T;\n\nexport function resolveStateField<T = unknown>(\n  name: string,\n  bindingValue: unknown,\n  store: Store | null,\n  evaluationContext: EvaluationContext | null,\n  fieldGetter: (fieldName: string) => unknown,\n  fieldSetter: (fieldName: string, value: unknown) => void,\n): StateField<T> {\n  if (isReactiveAssign(bindingValue) && store && evaluationContext) {\n    const { target, expr } = bindingValue;\n    return {\n      name,\n      value: store.get(target) as T,\n      setValue: (value: T) => {\n        const extraScope: Record<string, unknown> = { $value: value };\n        const nextValue = evaluate(expr, { ...evaluationContext, extraScope });\n        store.set(target, nextValue);\n      },\n      isReactive: true,\n    };\n  }\n\n  return {\n    name,\n    value: (fieldGetter(name) ?? bindingValue) as T,\n    setValue: (value: T) => fieldSetter(name, value),\n    isReactive: false,\n  };\n}\n","// ─────────────────────────────────────────────────────────────────────────────\n// Reactive state store for openui-lang\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Store {\n  get(name: string): unknown;\n  /** `pristine: true` restores a declared default that a later parse may still replace. */\n  set(name: string, value: unknown, options?: { pristine?: boolean }): void;\n  subscribe(listener: () => void): () => void;\n  getSnapshot(): Record<string, unknown>;\n  initialize(defaults: Record<string, unknown>, persisted: Record<string, unknown>): void;\n  dispose(): void;\n}\n\nexport function createStore(): Store {\n  const state = new Map<string, unknown>();\n  // Keys still holding their declared default; a later parse may replace it.\n  const pristine = new Set<string>();\n  const listeners = new Set<() => void>();\n  let snapshot: Record<string, unknown> = {};\n\n  function notify() {\n    const currentListeners = [...listeners];\n    for (const listener of currentListeners) {\n      listener();\n    }\n  }\n\n  function rebuildSnapshot() {\n    snapshot = Object.fromEntries(state);\n  }\n\n  function get(name: string): unknown {\n    return state.get(name);\n  }\n\n  function set(name: string, value: unknown, options?: { pristine?: boolean }): void {\n    if (options?.pristine) pristine.add(name);\n    else pristine.delete(name);\n    const existing = state.get(name);\n    if (Object.is(existing, value)) return;\n    // Shallow-compare plain objects (form data)\n    if (\n      value &&\n      existing &&\n      typeof value === \"object\" &&\n      typeof existing === \"object\" &&\n      !Array.isArray(value) &&\n      !Array.isArray(existing)\n    ) {\n      const nk = Object.keys(value as Record<string, unknown>);\n      const ok = Object.keys(existing as Record<string, unknown>);\n      if (\n        nk.length === ok.length &&\n        nk.every((k) =>\n          Object.is(\n            (value as Record<string, unknown>)[k],\n            (existing as Record<string, unknown>)[k],\n          ),\n        )\n      ) {\n        return;\n      }\n    }\n    state.set(name, value);\n    rebuildSnapshot();\n    notify();\n  }\n\n  function subscribe(listener: () => void): () => void {\n    listeners.add(listener);\n    return () => {\n      listeners.delete(listener);\n    };\n  }\n\n  function getSnapshot(): Record<string, unknown> {\n    return snapshot;\n  }\n\n  function initialize(defaults: Record<string, unknown>, persisted: Record<string, unknown>): void {\n    // Defaults replace a pristine value (e.g. one read from a truncated statement\n    // while streaming). User-set and persisted values are never overwritten, and\n    // keys are never deleted: declarations can briefly disappear while streaming.\n    let changed = false;\n    for (const key of Object.keys(persisted)) {\n      pristine.delete(key);\n      if (!state.has(key) || !Object.is(state.get(key), persisted[key])) {\n        state.set(key, persisted[key]);\n        changed = true;\n      }\n    }\n    for (const key of Object.keys(defaults)) {\n      if (!state.has(key)) {\n        state.set(key, defaults[key]);\n        pristine.add(key);\n        changed = true;\n      } else if (pristine.has(key) && !Object.is(state.get(key), defaults[key])) {\n        state.set(key, defaults[key]);\n        changed = true;\n      }\n    }\n    if (changed) {\n      rebuildSnapshot();\n      notify();\n    }\n  }\n\n  function dispose(): void {\n    state.clear();\n    pristine.clear();\n    listeners.clear();\n    snapshot = {};\n  }\n\n  return { get, set, subscribe, getSnapshot, initialize, dispose };\n}\n","export interface ParsedRule {\n  type: string;\n  arg?: number | string;\n}\n\n/**\n * Parse a rule string into a structured rule.\n *   \"required\"       → { type: \"required\" }\n *   \"min:8\"          → { type: \"min\", arg: 8 }\n *   \"minLength:3\"    → { type: \"minLength\", arg: 3 }\n *   \"pattern:^[a-z]\" → { type: \"pattern\", arg: \"^[a-z]\" }\n */\nconst NUMERIC_RULES = new Set([\"min\", \"max\", \"minLength\", \"maxLength\"]);\n\nexport function parseRule(rule: string): ParsedRule {\n  const colonIdx = rule.indexOf(\":\");\n  if (colonIdx === -1) return { type: rule };\n\n  const type = rule.slice(0, colonIdx);\n  const rawArg = rule.slice(colonIdx + 1);\n  const arg = NUMERIC_RULES.has(type) && !Number.isNaN(Number(rawArg)) ? Number(rawArg) : rawArg;\n  return { type, arg };\n}\n\nexport function parseRules(rules: unknown): ParsedRule[] {\n  if (!Array.isArray(rules)) return [];\n  return rules.filter((r): r is string => typeof r === \"string\").map(parseRule);\n}\n\nexport type ValidatorFn = (value: unknown, arg?: number | string) => string | undefined;\n\nfunction isEmpty(value: unknown): boolean {\n  if (value === null || value === undefined || value === \"\") return true;\n  if (Array.isArray(value) && value.length === 0) return true;\n  // Form state stores { value, componentType } — extract actual value for validation\n  if (value && typeof value === \"object\" && !Array.isArray(value) && \"value\" in value) {\n    return isEmpty((value as { value: unknown }).value);\n  }\n  // Empty plain object (e.g. CheckBoxGroup with no selection)\n  if (\n    typeof value === \"object\" &&\n    value !== null &&\n    !Array.isArray(value) &&\n    Object.keys(value).length === 0\n  ) {\n    return true;\n  }\n  return false;\n}\n\nexport const builtInValidators: Record<string, ValidatorFn> = {\n  required: (value) => {\n    if (isEmpty(value)) return \"This field is required\";\n    if (typeof value === \"object\" && !Array.isArray(value) && value !== null) {\n      const vals = Object.values(value);\n      if (vals.length > 0 && vals.every((v) => typeof v === \"boolean\") && !vals.some(Boolean)) {\n        return \"At least one option is required\";\n      }\n    }\n    return undefined;\n  },\n\n  email: (value) => {\n    if (isEmpty(value)) return undefined;\n    if (typeof value !== \"string\") return \"Please enter a valid email\";\n    return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value) ? undefined : \"Please enter a valid email\";\n  },\n\n  url: (value) => {\n    if (isEmpty(value)) return undefined;\n    if (typeof value !== \"string\") return \"Please enter a valid URL\";\n    try {\n      new URL(value);\n      return undefined;\n    } catch {\n      return \"Please enter a valid URL\";\n    }\n  },\n\n  numeric: (value) => {\n    if (isEmpty(value)) return undefined;\n    if (typeof value === \"number\" && !isNaN(value)) return undefined;\n    if (typeof value === \"string\" && !isNaN(parseFloat(value)) && value.trim() !== \"\")\n      return undefined;\n    return \"Must be a number\";\n  },\n\n  min: (value, arg) => {\n    if (isEmpty(value)) return undefined;\n    const n = typeof value === \"number\" ? value : parseFloat(String(value));\n    if (isNaN(n)) return undefined;\n    const min = Number(arg);\n    return n >= min ? undefined : `Must be at least ${min}`;\n  },\n\n  max: (value, arg) => {\n    if (isEmpty(value)) return undefined;\n    const n = typeof value === \"number\" ? value : parseFloat(String(value));\n    if (isNaN(n)) return undefined;\n    const max = Number(arg);\n    return n <= max ? undefined : `Must be no more than ${max}`;\n  },\n\n  minLength: (value, arg) => {\n    if (isEmpty(value)) return undefined;\n    if (typeof value !== \"string\") return undefined;\n    const min = Number(arg);\n    return value.length >= min ? undefined : `Must be at least ${min} characters`;\n  },\n\n  maxLength: (value, arg) => {\n    if (isEmpty(value)) return undefined;\n    if (typeof value !== \"string\") return undefined;\n    const max = Number(arg);\n    return value.length <= max ? undefined : `Must be no more than ${max} characters`;\n  },\n\n  pattern: (value, arg) => {\n    if (isEmpty(value)) return undefined;\n    if (typeof value !== \"string\" || typeof arg !== \"string\") return undefined;\n    try {\n      return new RegExp(arg).test(value) ? undefined : \"Invalid format\";\n    } catch {\n      return undefined;\n    }\n  },\n};\n\n/**\n * Run all rules against a value. Stop on first error.\n * Custom validators are checked first, then built-in ones.\n */\nexport function validate(\n  value: unknown,\n  rules: ParsedRule[],\n  customValidators?: Record<string, ValidatorFn>,\n): string | undefined {\n  for (const rule of rules) {\n    const validator = customValidators?.[rule.type] ?? builtInValidators[rule.type];\n    if (!validator) {\n      console.warn(`[openui] Unknown validation rule type: \"${rule.type}\"`);\n      continue;\n    }\n    const error = validator(value, rule.arg);\n    if (error) return error;\n  }\n  return undefined;\n}\n\n/**\n * Parse a structured rules object into ParsedRule[].\n * Accepts: { required: true, minLength: 5, email: true, max: 100 }\n * Skips keys with false/undefined values.\n */\nexport function parseStructuredRules(rules: unknown): ParsedRule[] {\n  if (!rules || typeof rules !== \"object\" || Array.isArray(rules)) return [];\n  const obj = rules as Record<string, any>;\n  const result: ParsedRule[] = [];\n  for (const [key, val] of Object.entries(obj)) {\n    if (val === false || val === undefined || val === null) continue;\n    if (val === true) {\n      result.push({ type: key });\n    } else {\n      result.push({ type: key, arg: val });\n    }\n  }\n  return result;\n}\n"],"mappings":"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"}