@pixerate/editor 0.29.0 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/index.cjs +6 -2
- package/dist/animation/index.cjs.map +1 -1
- package/dist/animation/index.d.cts +2 -2
- package/dist/animation/index.d.ts +2 -2
- package/dist/animation/index.js +17 -13
- package/dist/canvas/index.cjs +338 -28
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +106 -3
- package/dist/canvas/index.d.ts +106 -3
- package/dist/canvas/index.js +323 -13
- package/dist/canvas/index.js.map +1 -1
- package/dist/chunk-UB2OY7FD.js +262 -0
- package/dist/chunk-UB2OY7FD.js.map +1 -0
- package/dist/{chunk-PWJARCI4.js → chunk-W7BOBWZD.js} +5 -196
- package/dist/chunk-W7BOBWZD.js.map +1 -0
- package/dist/{chunk-TTYCN6ZH.cjs → chunk-XHRZSB77.cjs} +8 -199
- package/dist/chunk-XHRZSB77.cjs.map +1 -0
- package/dist/chunk-XZ4L3R4K.cjs +262 -0
- package/dist/chunk-XZ4L3R4K.cjs.map +1 -0
- package/dist/{easing-B6iAnJHk.d.cts → easing-DTmX99QG.d.cts} +20 -6
- package/dist/{easing-B6iAnJHk.d.ts → easing-DTmX99QG.d.ts} +20 -6
- package/dist/parameters/index.cjs +38 -1
- package/dist/parameters/index.cjs.map +1 -1
- package/dist/parameters/index.d.cts +32 -2
- package/dist/parameters/index.d.ts +32 -2
- package/dist/parameters/index.js +37 -0
- package/dist/parameters/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-PWJARCI4.js.map +0 -1
- package/dist/chunk-TTYCN6ZH.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/parameters/schema.ts","../../src/parameters/keyframes.ts","../../src/parameters/controller.ts","../../src/parameters/commands.ts","../../src/parameters/shader.ts"],"sourcesContent":["import type {\n\tChoiceParameterField,\n\tNumberParameterField,\n\tParameterChoiceOption,\n\tParameterCondition,\n\tParameterConditionTest,\n\tParameterError,\n\tParameterField,\n\tParameterGroup,\n\tParameterSchema,\n\tParameterSchemaItem,\n\tParameterValue,\n\tParameterValues,\n\tVectorParameterField\n} from './types.js';\nimport type { JsonSchema } from '../tools/schema.js';\n\n// ---------------------------------------------------------------------------\n// Labels and colours\n// ---------------------------------------------------------------------------\n\n/** `flowSpeed`, `flow_speed` or `uFlowSpeed` → \"Flow speed\". */\nexport function humanizeParameterId(id: string): string {\n\tconst words = id\n\t\t.replace(/^u(?=[A-Z])/, '')\n\t\t.replace(/[_-]+/g, ' ')\n\t\t.replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n\t\t.trim()\n\t\t.toLowerCase();\n\treturn words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/** The label shown for a field or group. */\nexport function parameterLabel(item: { id: string; label?: string }): string {\n\treturn item.label ?? humanizeParameterId(item.id);\n}\n\nconst HEX = /^#?([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n\n/**\n * Normalises a hex colour to lower-case `#rrggbb`, or `#rrggbbaa` when `alpha` is true\n * (opaque colours get `ff`). Accepts 3, 4, 6 and 8 digits with or without `#`; returns\n * `null` for anything else. Without `alpha`, a colour's alpha is dropped.\n */\nexport function normalizeHexColor(input: string, alpha = false): string | null {\n\tconst m = HEX.exec(input.trim());\n\tif (!m) return null;\n\tlet digits = m[1].toLowerCase();\n\tif (digits.length <= 4) digits = [...digits].map((c) => c + c).join('');\n\tconst rgb = digits.slice(0, 6);\n\tconst a = digits.length === 8 ? digits.slice(6) : 'ff';\n\treturn alpha ? `#${rgb}${a}` : `#${rgb}`;\n}\n\n/** `#77c16a` → `[0.467, 0.757, 0.416]` (0–1 components; four with `alpha`). `null` if not a colour. */\nexport function hexToRgba01(hex: string, alpha = false): number[] | null {\n\tconst n = normalizeHexColor(hex, true);\n\tif (!n) return null;\n\tconst parts = [1, 3, 5, 7].map((i) => parseInt(n.slice(i, i + 2), 16) / 255);\n\treturn alpha ? parts : parts.slice(0, 3);\n}\n\n/** `[0.467, 0.757, 0.416]` → `#77c16a`; a fourth component becomes alpha when `alpha` is true. Clamped to 0–1. */\nexport function rgba01ToHex(components: readonly number[], alpha = false): string {\n\tconst byte = (c: number) =>\n\t\tMath.round(Math.min(1, Math.max(0, Number.isFinite(c) ? c : 0)) * 255)\n\t\t\t.toString(16)\n\t\t\t.padStart(2, '0');\n\tconst rgb = [0, 1, 2].map((i) => byte(components[i] ?? 0)).join('');\n\treturn alpha ? `#${rgb}${byte(components[3] ?? 1)}` : `#${rgb}`;\n}\n\n// ---------------------------------------------------------------------------\n// Walking a schema\n// ---------------------------------------------------------------------------\n\nexport const isParameterGroup = (item: ParameterSchemaItem): item is ParameterGroup => item.type === 'group';\n\n/** Every field in schema order, groups flattened. */\nexport function getParameterFields(schema: ParameterSchema | readonly ParameterSchemaItem[]): ParameterField[] {\n\tconst out: ParameterField[] = [];\n\tconst walk = (items: readonly ParameterSchemaItem[]) => {\n\t\tfor (const item of items) {\n\t\t\tif (isParameterGroup(item)) walk(item.fields);\n\t\t\telse out.push(item);\n\t\t}\n\t};\n\twalk(Array.isArray(schema) ? schema : (schema as ParameterSchema).fields);\n\treturn out;\n}\n\n/** Every group in schema order (nested groups after their parent). */\nexport function getParameterGroups(schema: ParameterSchema): ParameterGroup[] {\n\tconst out: ParameterGroup[] = [];\n\tconst walk = (items: readonly ParameterSchemaItem[]) => {\n\t\tfor (const item of items) {\n\t\t\tif (isParameterGroup(item)) {\n\t\t\t\tout.push(item);\n\t\t\t\twalk(item.fields);\n\t\t\t}\n\t\t}\n\t};\n\twalk(schema.fields);\n\treturn out;\n}\n\nexport class ParameterSchemaError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = 'ParameterSchemaError';\n\t}\n}\n\nconst FIELD_TYPES = new Set(['number', 'int', 'boolean', 'choice', 'color', 'vector', 'image', 'text']);\n\n/**\n * Checks a schema's structure: unique ids, known types, choice options, vector sizes and\n * defaults that pass validation. Returns sentences; an empty array means the schema is fine.\n */\nexport function checkParameterSchema(schema: ParameterSchema): string[] {\n\tconst problems: string[] = [];\n\tconst ids = new Set<string>();\n\tconst visit = (items: readonly ParameterSchemaItem[]) => {\n\t\tfor (const item of items) {\n\t\t\tif (!item || typeof item.id !== 'string' || item.id === '') {\n\t\t\t\tproblems.push('Every field and group needs an id.');\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ids.has(item.id)) problems.push(`The id \"${item.id}\" is used twice.`);\n\t\t\tids.add(item.id);\n\t\t\tif (isParameterGroup(item)) {\n\t\t\t\tvisit(item.fields ?? []);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!FIELD_TYPES.has((item as ParameterField).type)) {\n\t\t\t\tproblems.push(`Field \"${item.id}\" has an unknown type \"${(item as { type: string }).type}\".`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (item.type === 'choice' && (!item.options || item.options.length === 0)) {\n\t\t\t\tproblems.push(`Field \"${item.id}\" needs at least one option.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (item.type === 'vector') {\n\t\t\t\tconst size = vectorSize(item);\n\t\t\t\tif (size < 2 || size > 4) {\n\t\t\t\t\tproblems.push(`Field \"${item.id}\" must have 2 to 4 components.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst error = validateParameterValue(item, item.default);\n\t\t\tif (error) problems.push(`Field \"${item.id}\" has an invalid default: ${error.message}`);\n\t\t}\n\t};\n\tvisit(schema.fields ?? []);\n\tconst presetNames = new Set<string>();\n\tfor (const preset of schema.presets ?? []) {\n\t\tif (presetNames.has(preset.name)) problems.push(`The preset name \"${preset.name}\" is used twice.`);\n\t\tpresetNames.add(preset.name);\n\t}\n\treturn problems;\n}\n\n/** The defaults of every field (colours normalised to lower-case hex, `int`s rounded). */\nexport function getParameterDefaults(schema: ParameterSchema): ParameterValues {\n\tconst values: ParameterValues = {};\n\tfor (const field of getParameterFields(schema)) {\n\t\tconst result = coerceParameterValue(field, field.default);\n\t\tvalues[field.id] = result.ok ? result.value : cloneValue(field.default);\n\t}\n\treturn values;\n}\n\nexport const cloneValue = <T extends ParameterValue>(value: T): T => (Array.isArray(value) ? ([...value] as T) : value);\n\n/** Value equality (vectors compare component-wise). */\nexport function parameterValuesEqual(a: ParameterValue | undefined, b: ParameterValue | undefined): boolean {\n\tif (a === b) return true;\n\tif (Array.isArray(a) && Array.isArray(b)) return a.length === b.length && a.every((v, i) => v === b[i]);\n\treturn false;\n}\n\n// ---------------------------------------------------------------------------\n// Visibility\n// ---------------------------------------------------------------------------\n\nconst truthy = (v: ParameterValue | undefined) =>\n\tArray.isArray(v) ? v.some((c) => c !== 0) : v !== undefined && v !== false && v !== 0 && v !== '';\n\nfunction testCondition(value: ParameterValue | undefined, test: ParameterConditionTest): boolean {\n\tif (Array.isArray(test)) return test.some((option) => parameterValuesEqual(value, option));\n\tif (typeof test !== 'object' || test === null) return parameterValuesEqual(value, test as ParameterValue);\n\tconst t = test as Exclude<ParameterConditionTest, string | number | boolean | readonly unknown[]>;\n\tif (t.eq !== undefined && !parameterValuesEqual(value, t.eq)) return false;\n\tif (t.ne !== undefined && parameterValuesEqual(value, t.ne)) return false;\n\tif (t.in && !t.in.some((option) => parameterValuesEqual(value, option))) return false;\n\tif (t.notIn && t.notIn.some((option) => parameterValuesEqual(value, option))) return false;\n\tif (t.truthy !== undefined && truthy(value) !== t.truthy) return false;\n\tconst n = typeof value === 'number' ? value : NaN;\n\tif (t.gt !== undefined && !(n > t.gt)) return false;\n\tif (t.gte !== undefined && !(n >= t.gte)) return false;\n\tif (t.lt !== undefined && !(n < t.lt)) return false;\n\tif (t.lte !== undefined && !(n <= t.lte)) return false;\n\treturn true;\n}\n\n/** Whether a `showIf` condition holds for `values` (no condition: `true`). */\nexport function evaluateParameterCondition(condition: ParameterCondition | undefined, values: Readonly<ParameterValues>): boolean {\n\tif (!condition) return true;\n\tif (typeof condition === 'function') {\n\t\ttry {\n\t\t\treturn condition(values) !== false;\n\t\t} catch {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn Object.entries(condition).every(([id, test]) => testCondition(values[id], test));\n}\n\n/**\n * Field and group id → shown. An item is hidden when its own `showIf` fails or any\n * enclosing group is hidden.\n */\nexport function getParameterVisibility(schema: ParameterSchema, values: Readonly<ParameterValues>): Record<string, boolean> {\n\tconst visible: Record<string, boolean> = {};\n\tconst walk = (items: readonly ParameterSchemaItem[], parentVisible: boolean) => {\n\t\tfor (const item of items) {\n\t\t\tconst shown = parentVisible && evaluateParameterCondition(item.showIf, values);\n\t\t\tvisible[item.id] = shown;\n\t\t\tif (isParameterGroup(item)) walk(item.fields, shown);\n\t\t}\n\t};\n\twalk(schema.fields, true);\n\treturn visible;\n}\n\n// ---------------------------------------------------------------------------\n// Field details\n// ---------------------------------------------------------------------------\n\n/** A choice field's options as objects. */\nexport function getChoiceOptions(field: ChoiceParameterField): ParameterChoiceOption[] {\n\treturn field.options.map((o) => (typeof o === 'object' ? o : { value: o }));\n}\n\n/** An option's label (default: the value made readable). */\nexport const choiceOptionLabel = (option: ParameterChoiceOption): string =>\n\toption.label ?? (typeof option.value === 'string' ? humanizeParameterId(option.value) : String(option.value));\n\nexport function vectorSize(field: VectorParameterField): number {\n\treturn field.size ?? (Array.isArray(field.default) ? field.default.length : 2);\n}\n\nconst pick = (bound: number | readonly number[] | undefined, i: number) => (typeof bound === 'number' ? bound : bound?.[i]);\n\n/** A vector component as a number field (its bounds, step, unit and label). */\nexport function vectorComponentField(field: VectorParameterField, index: number): NumberParameterField {\n\tconst labels = field.labels ?? ['x', 'y', 'z', 'w'];\n\treturn {\n\t\tid: `${field.id}.${index}`,\n\t\ttype: 'number',\n\t\tlabel: labels[index] ?? String(index),\n\t\tdefault: field.default[index] ?? 0,\n\t\tmin: pick(field.min, index),\n\t\tmax: pick(field.max, index),\n\t\tstep: field.step,\n\t\tunit: field.unit,\n\t\tdecimals: field.decimals,\n\t\tcontrol: 'input'\n\t};\n}\n\n/** The step a number field moves by: `step`, else 1 for `int`, else 1/100 of the range (0.01 without one). */\nexport function parameterStep(field: NumberParameterField): number {\n\tif (field.step !== undefined && field.step > 0) return field.type === 'int' ? Math.max(1, Math.round(field.step)) : field.step;\n\tif (field.type === 'int') return 1;\n\tif (field.min !== undefined && field.max !== undefined && field.max > field.min) return (field.max - field.min) / 100;\n\treturn 0.01;\n}\n\n/** Decimal places to show: `decimals`, else enough for the step (at most 4). */\nexport function parameterDecimals(field: NumberParameterField): number {\n\tif (field.decimals !== undefined) return field.decimals;\n\tif (field.type === 'int') return 0;\n\tconst step = parameterStep(field);\n\tfor (let d = 0; d <= 4; d++) if (Math.abs(Math.round(step * 10 ** d) - step * 10 ** d) < 1e-9) return d;\n\treturn 4;\n}\n\n/** Whether a number field renders a slider (`control`, else when it has both bounds). */\nexport const isSliderField = (field: NumberParameterField): boolean =>\n\tfield.control ? field.control === 'slider' : field.min !== undefined && field.max !== undefined;\n\n/** A number as shown for a field: fixed decimals, trailing zeros trimmed, plus the unit. */\nexport function formatParameterNumber(field: NumberParameterField, value: number): string {\n\tconst fixed = (Number.isFinite(value) ? value : 0).toFixed(parameterDecimals(field));\n\tconst trimmed = fixed.includes('.') ? fixed.replace(/\\.?0+$/, '') : fixed;\n\treturn `${trimmed === '-0' ? '0' : trimmed}${field.unit ?? ''}`;\n}\n\n/** Clamps into the field's bounds, rounds `int`s and snaps float noise (for UI inputs). */\nexport function clampParameterNumber(field: NumberParameterField, value: number): number {\n\tlet v = Number.isFinite(value) ? value : field.default;\n\tif (field.min !== undefined) v = Math.max(field.min, v);\n\tif (field.max !== undefined) v = Math.min(field.max, v);\n\tif (field.type === 'int') return Math.round(v);\n\treturn Math.round(v * 1e6) / 1e6;\n}\n\n/**\n * Parses what someone typed into a number box (\"2.5\", \"2.5x\", \"-1e2\") and clamps it into\n * the field's bounds. Returns `null` when it is not a number.\n */\nexport function parseParameterNumberInput(field: NumberParameterField, text: string): number | null {\n\tlet t = text.trim();\n\tif (field.unit && t.endsWith(field.unit)) t = t.slice(0, -field.unit.length).trim();\n\tif (t === '') return null;\n\tconst n = Number(t.replace(',', '.'));\n\treturn Number.isFinite(n) ? clampParameterNumber(field, n) : null;\n}\n\n/** A value as short display text (numbers formatted, vectors comma-separated, booleans On/Off). */\nexport function formatParameterValue(field: ParameterField, value: ParameterValue | undefined): string {\n\tif (value === undefined) return '';\n\tswitch (field.type) {\n\t\tcase 'number':\n\t\tcase 'int':\n\t\t\treturn formatParameterNumber(field, value as number);\n\t\tcase 'boolean':\n\t\t\treturn value ? 'On' : 'Off';\n\t\tcase 'choice': {\n\t\t\tconst option = getChoiceOptions(field).find((o) => o.value === value);\n\t\t\treturn option ? choiceOptionLabel(option) : String(value);\n\t\t}\n\t\tcase 'vector':\n\t\t\treturn (value as number[]).map((v, i) => formatParameterNumber(vectorComponentField(field, i), v)).join(', ');\n\t\tdefault:\n\t\t\treturn String(value);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nconst describe = (v: unknown) =>\n\tv === null ? 'null' : Array.isArray(v) ? 'a list' : typeof v === 'string' ? `\"${v.length > 40 ? `${v.slice(0, 40)}…` : v}\"` : String(v);\n\nfunction err(field: ParameterField, message: string, index?: number): ParameterError {\n\treturn { id: field.id, path: index === undefined ? `/${field.id}` : `/${field.id}/${index}`, message };\n}\n\nfunction numberError(field: ParameterField, name: string, v: unknown, opts: { int: boolean; min?: number; max?: number }, index?: number): ParameterError | null {\n\tif (typeof v !== 'number' || !Number.isFinite(v)) return err(field, `${name} must be a number, not ${describe(v)}.`, index);\n\tif (opts.int && !Number.isInteger(v)) return err(field, `${name} must be a whole number.`, index);\n\tif (opts.min !== undefined && v < opts.min) return err(field, `${name} must be at least ${opts.min}.`, index);\n\tif (opts.max !== undefined && v > opts.max) return err(field, `${name} must be at most ${opts.max}.`, index);\n\treturn null;\n}\n\n/**\n * Checks a value against a field. Returns `null` when it is valid, else one error whose\n * message is a sentence naming the field (\"Speed must be at most 4.\").\n */\nexport function validateParameterValue(field: ParameterField, value: unknown): ParameterError | null {\n\tconst name = parameterLabel(field);\n\tswitch (field.type) {\n\t\tcase 'number':\n\t\tcase 'int':\n\t\t\treturn numberError(field, name, value, { int: field.type === 'int', min: field.min, max: field.max });\n\t\tcase 'boolean':\n\t\t\treturn typeof value === 'boolean' ? null : err(field, `${name} must be true or false.`);\n\t\tcase 'choice': {\n\t\t\tconst options = getChoiceOptions(field);\n\t\t\tif (options.some((o) => o.value === value)) return null;\n\t\t\treturn err(field, `${name} must be one of ${options.map((o) => JSON.stringify(o.value)).join(', ')}, not ${describe(value)}.`);\n\t\t}\n\t\tcase 'color': {\n\t\t\tconst example = field.alpha ? '\"#77c16aff\"' : '\"#77c16a\"';\n\t\t\tif (typeof value !== 'string' || normalizeHexColor(value, !!field.alpha) === null) {\n\t\t\t\treturn err(field, `${name} must be a hex colour like ${example}.`);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tcase 'vector': {\n\t\t\tconst size = vectorSize(field);\n\t\t\tif (!Array.isArray(value) || value.length !== size) return err(field, `${name} must be a list of ${size} numbers.`);\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tconst component = `${name} ${(field.labels ?? ['x', 'y', 'z', 'w'])[i] ?? i}`;\n\t\t\t\tconst e = numberError(field, component, value[i], { int: false, min: pick(field.min, i), max: pick(field.max, i) }, i);\n\t\t\t\tif (e) return e;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tcase 'image':\n\t\t\treturn typeof value === 'string' ? null : err(field, `${name} must be an image URL (or \"\" for none).`);\n\t\tcase 'text': {\n\t\t\tif (typeof value !== 'string') return err(field, `${name} must be text.`);\n\t\t\tif (field.minLength !== undefined && value.length < field.minLength) {\n\t\t\t\treturn err(field, `${name} must be at least ${field.minLength} characters.`);\n\t\t\t}\n\t\t\tif (field.maxLength !== undefined && value.length > field.maxLength) {\n\t\t\t\treturn err(field, `${name} must be at most ${field.maxLength} characters.`);\n\t\t\t}\n\t\t\tif (field.pattern !== undefined) {\n\t\t\t\tlet regex: RegExp | null = null;\n\t\t\t\ttry {\n\t\t\t\t\tregex = new RegExp(`^(?:${field.pattern})$`, 'u');\n\t\t\t\t} catch {\n\t\t\t\t\t// An invalid pattern in the schema is not the caller's fault.\n\t\t\t\t}\n\t\t\t\tif (regex && !regex.test(value)) return err(field, `${name} must match the pattern ${field.pattern}.`);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tdefault:\n\t\t\treturn err(field as ParameterField, `${name} has an unknown type.`);\n\t}\n}\n\nexport type ParameterCoercion = { ok: true; value: ParameterValue } | { ok: false; error: ParameterError };\n\n/**\n * Checks a value from outside (an agent's tool call, a URL, a form) and returns the value to\n * store. Coercion is narrow: `int`s are rounded, colours normalised to lower-case hex.\n */\nexport function coerceParameterValue(field: ParameterField, raw: unknown): ParameterCoercion {\n\tlet value = raw;\n\tif (field.type === 'int' && typeof raw === 'number' && Number.isFinite(raw)) value = Math.round(raw);\n\tif (field.type === 'color' && typeof raw === 'string') value = normalizeHexColor(raw, !!field.alpha) ?? raw;\n\tif (field.type === 'vector' && Array.isArray(raw)) value = [...raw];\n\tconst error = validateParameterValue(field, value);\n\treturn error ? { ok: false, error } : { ok: true, value: value as ParameterValue };\n}\n\n/** Every error for `values` (missing values are reported too). */\nexport function validateParameterValues(schema: ParameterSchema, values: Readonly<Partial<ParameterValues>>): ParameterError[] {\n\tconst errors: ParameterError[] = [];\n\tfor (const field of getParameterFields(schema)) {\n\t\tconst value = values[field.id];\n\t\tif (value === undefined) {\n\t\t\terrors.push(err(field, `${parameterLabel(field)} is missing.`));\n\t\t\tcontinue;\n\t\t}\n\t\tconst error = validateParameterValue(field, value);\n\t\tif (error) errors.push(error);\n\t}\n\treturn errors;\n}\n\n// ---------------------------------------------------------------------------\n// JSON Schema (for agents)\n// ---------------------------------------------------------------------------\n\n/** One field as JSON Schema (for agent tool parameters). */\nexport function parameterFieldToJsonSchema(field: ParameterField): JsonSchema {\n\tconst description = [parameterLabel(field), field.description].filter(Boolean).join(': ');\n\tconst base: JsonSchema = { title: parameterLabel(field), description, default: field.default };\n\tswitch (field.type) {\n\t\tcase 'number':\n\t\tcase 'int': {\n\t\t\tconst unit = field.unit ? ` (${field.unit})` : '';\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tdescription: description + unit,\n\t\t\t\ttype: field.type === 'int' ? 'integer' : 'number',\n\t\t\t\t...(field.min !== undefined ? { minimum: field.min } : {}),\n\t\t\t\t...(field.max !== undefined ? { maximum: field.max } : {})\n\t\t\t};\n\t\t}\n\t\tcase 'boolean':\n\t\t\treturn { ...base, type: 'boolean' };\n\t\tcase 'choice': {\n\t\t\tconst options = getChoiceOptions(field);\n\t\t\treturn { ...base, enum: options.map((o) => o.value) };\n\t\t}\n\t\tcase 'color':\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\ttype: 'string',\n\t\t\t\tdescription: `${description} (hex colour${field.alpha ? ' with alpha, #rrggbbaa' : ', #rrggbb'})`,\n\t\t\t\tpattern: field.alpha ? '^#?([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$' : '^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$'\n\t\t\t};\n\t\tcase 'vector': {\n\t\t\tconst size = vectorSize(field);\n\t\t\tconst items: JsonSchema = { type: 'number' };\n\t\t\tif (typeof field.min === 'number') items.minimum = field.min;\n\t\t\tif (typeof field.max === 'number') items.maximum = field.max;\n\t\t\treturn { ...base, type: 'array', items, minItems: size, maxItems: size };\n\t\t}\n\t\tcase 'image':\n\t\t\treturn { ...base, type: 'string', description: `${description} (image URL, \"\" for none)` };\n\t\tcase 'text':\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\ttype: 'string',\n\t\t\t\t...(field.minLength !== undefined ? { minLength: field.minLength } : {}),\n\t\t\t\t...(field.maxLength !== undefined ? { maxLength: field.maxLength } : {})\n\t\t\t};\n\t}\n}\n\n/** The schema's values as one object JSON Schema (every property optional). */\nexport function parameterSchemaToJsonSchema(schema: ParameterSchema): JsonSchema & { type: 'object' } {\n\tconst properties: Record<string, JsonSchema> = {};\n\tfor (const field of getParameterFields(schema)) properties[field.id] = parameterFieldToJsonSchema(field);\n\treturn { type: 'object', properties, additionalProperties: false };\n}\n","import type { ParameterKeyframe, ParameterKeyframes, ParameterKeyState, ParameterTrack } from './types.js';\n\n/** Keyframes closer than this (ms) to the playhead count as \"at\" it (default for the controller). */\nexport const PARAMETER_KEY_TOLERANCE = 0.5;\n\n/** Whether a track has a keyframe within `tolerance` ms of `time`. */\nexport function findParameterKeyframe(track: ParameterTrack<any> | undefined, time: number, tolerance = PARAMETER_KEY_TOLERANCE): number {\n\tif (!track) return -1;\n\treturn track.keyframes.findIndex((k) => Math.abs(k.time - time) <= tolerance);\n}\n\n/** `keyed` (a key at `time`), `animated` (keys elsewhere) or `none`. */\nexport function getParameterKeyState(track: ParameterTrack<any> | undefined, time: number, tolerance = PARAMETER_KEY_TOLERANCE): ParameterKeyState {\n\tif (!track || track.keyframes.length === 0) return 'none';\n\treturn findParameterKeyframe(track, time, tolerance) >= 0 ? 'keyed' : 'animated';\n}\n\nconst sortKeys = <T>(keys: ParameterKeyframe<T>[]) => keys.sort((a, b) => a.time - b.time);\n\n/** A copy of `track` with a key at `time` holding `value` (replacing one already there). */\nexport function withParameterKeyframe<T>(track: ParameterTrack<T> | undefined, key: ParameterKeyframe<T>, tolerance = PARAMETER_KEY_TOLERANCE): ParameterTrack<T> {\n\tconst keyframes = [...(track?.keyframes ?? [])];\n\tconst at = findParameterKeyframe(track, key.time, tolerance);\n\tif (at >= 0) keyframes[at] = { ...keyframes[at], value: key.value, ...(key.easing !== undefined ? { easing: key.easing } : {}) };\n\telse keyframes.push({ ...key });\n\treturn { ...(track ?? {}), keyframes: sortKeys(keyframes) };\n}\n\n/** A copy of `track` without the key at `time`; `undefined` when no keys remain. */\nexport function withoutParameterKeyframe<T>(track: ParameterTrack<T> | undefined, time: number, tolerance = PARAMETER_KEY_TOLERANCE): ParameterTrack<T> | undefined {\n\tif (!track) return undefined;\n\tconst keyframes = track.keyframes.filter((k) => Math.abs(k.time - time) > tolerance);\n\treturn keyframes.length ? { ...track, keyframes } : undefined;\n}\n\nexport interface ParameterKeyframeStore extends ParameterKeyframes {\n\t/** Every track (id → track). Stable between changes. */\n\tgetTracks(): Readonly<Record<string, ParameterTrack<any>>>;\n\t/** Replaces every track (no notification when `silent`). */\n\tsetTracks(tracks: Record<string, ParameterTrack<any>>, silent?: boolean): void;\n\tsubscribe(listener: () => void): () => void;\n}\n\n/**\n * An in-memory `ParameterKeyframes` adapter for apps that keep tracks next to their values\n * (an effect document can implement the interface over its own storage instead).\n */\nexport function createParameterKeyframeStore(initial: Record<string, ParameterTrack<any>> = {}): ParameterKeyframeStore {\n\tlet tracks: Record<string, ParameterTrack<any>> = { ...initial };\n\tconst listeners = new Set<() => void>();\n\tconst emit = () => listeners.forEach((l) => l());\n\treturn {\n\t\tgetTrack: (id) => tracks[id],\n\t\tgetTracks: () => tracks,\n\t\tsetTrack(id, track) {\n\t\t\tconst next = { ...tracks };\n\t\t\tif (track && track.keyframes.length > 0) next[id] = { ...track, keyframes: sortKeys([...track.keyframes]) };\n\t\t\telse delete next[id];\n\t\t\ttracks = next;\n\t\t\temit();\n\t\t},\n\t\tsetTracks(next, silent) {\n\t\t\ttracks = { ...next };\n\t\t\tif (!silent) emit();\n\t\t},\n\t\tsubscribe(listener) {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => listeners.delete(listener);\n\t\t}\n\t};\n}\n","import { HistoryManager } from '../history/HistoryManager.js';\nimport type { Command, HistoryState } from '../history/types.js';\nimport { findParameterKeyframe, getParameterKeyState, PARAMETER_KEY_TOLERANCE, withoutParameterKeyframe, withParameterKeyframe } from './keyframes.js';\nimport {\n\tcheckParameterSchema,\n\tcloneValue,\n\tcoerceParameterValue,\n\tgetChoiceOptions,\n\tgetParameterDefaults,\n\tgetParameterFields,\n\tgetParameterGroups,\n\tgetParameterVisibility,\n\tnormalizeHexColor,\n\tParameterSchemaError,\n\tparameterLabel,\n\tparameterStep,\n\tparameterValuesEqual,\n\tvectorComponentField,\n\tvectorSize\n} from './schema.js';\nimport type {\n\tParameterError,\n\tParameterField,\n\tParameterKeyframes,\n\tParameterKeyState,\n\tParameterPreset,\n\tParameterSchema,\n\tParameterTrack,\n\tParameterValue,\n\tParameterValues\n} from './types.js';\n\nexport interface ParametersControllerOptions {\n\tschema: ParameterSchema;\n\t/** Starting values (missing or invalid ones use the default; invalid ones are reported in `errors`). */\n\tvalues?: Partial<ParameterValues>;\n\t/** User presets (the schema's presets are added as built-in). */\n\tpresets?: readonly ParameterPreset[];\n\t/** History to record into, e.g. one shared with the rest of the app (default: a new one). */\n\thistory?: HistoryManager;\n\t/** Where keyframes live. Without it, keyframe methods do nothing. */\n\tkeyframes?: ParameterKeyframes;\n\t/** Starting playhead time in ms (default 0). */\n\ttime?: number;\n\t/** Keys within this many ms of the playhead count as \"at\" it (default 0.5). */\n\tkeyTolerance?: number;\n\t/** Random source for `randomize` (default `Math.random`). */\n\trandom?: () => number;\n\t/** Called after values change (set, undo, preset, load, …) with the ids that changed. */\n\tonChange?: (values: Readonly<ParameterValues>, changed: readonly string[]) => void;\n}\n\n/** A snapshot of the controller. The same object is returned until something changes. */\nexport interface ParametersState {\n\tschema: ParameterSchema;\n\t/** Every field in schema order (groups flattened). */\n\tfields: readonly ParameterField[];\n\tvalues: Readonly<ParameterValues>;\n\tdefaults: Readonly<ParameterValues>;\n\t/** Field and group id → shown (see `showIf`). */\n\tvisible: Readonly<Record<string, boolean>>;\n\t/** Group id → collapsed. */\n\tcollapsed: Readonly<Record<string, boolean>>;\n\t/** Field id → the last rejected value's error (cleared when the field is next set). */\n\terrors: Readonly<Record<string, string>>;\n\t/** Built-in presets first, then user presets. */\n\tpresets: readonly ParameterPreset[];\n\t/** The first preset whose values match the current values, if any. */\n\tactivePreset: string | null;\n\t/** Any value differs from its default. */\n\tmodified: boolean;\n\t/** Playhead time in ms (for keyframes). */\n\ttime: number;\n\t/** Whether a keyframes adapter is attached. */\n\tkeyframesEnabled: boolean;\n\t/** Field id → keyframe state at `time`. */\n\tkeys: Readonly<Record<string, ParameterKeyState>>;\n\t/** The gesture in progress (a field id), if any. */\n\tgesture: string | null;\n\tcanUndo: boolean;\n\tcanRedo: boolean;\n\tundoLabel: string;\n\tredoLabel: string;\n\t/** Bumped on every change. */\n\trevision: number;\n}\n\nexport type ParameterSetResult = { ok: true; value: ParameterValue } | { ok: false; error: ParameterError; message: string };\n\nexport type ParameterSetValuesResult =\n\t| { ok: true; values: Partial<ParameterValues>; changed: string[] }\n\t| { ok: false; errors: ParameterError[]; message: string };\n\nexport type ParameterActionResult = { ok: true } | { ok: false; message: string };\n\nexport interface SetParameterOptions {\n\t/** Undo step label (default \"Change <label>\"). */\n\tlabel?: string;\n}\n\nexport interface RandomizeParametersOptions {\n\t/** Only these fields (default: every visible field that allows it). */\n\tids?: readonly string[];\n\t/** Seed for a repeatable result. */\n\tseed?: number;\n\t/** Random source (default: the controller's). */\n\trandom?: () => number;\n}\n\nexport interface ApplyPresetOptions {\n\t/** Keep values the preset leaves out (default: they go back to their defaults). */\n\tmerge?: boolean;\n}\n\n/** What `toJSON` returns and `load` takes. */\nexport interface ParametersSnapshot {\n\tvalues: Partial<ParameterValues>;\n\t/** User presets. */\n\tpresets?: ParameterPreset[];\n}\n\ninterface Change {\n\tvalues?: { before: Partial<ParameterValues>; after: Partial<ParameterValues> };\n\tpresets?: { before: ParameterPreset[]; after: ParameterPreset[] };\n\ttracks?: Record<string, { before: ParameterTrack | undefined; after: ParameterTrack | undefined }>;\n}\n\n/** A repeatable random source (mulberry32). */\nexport function seededRandom(seed: number): () => number {\n\tlet a = seed >>> 0;\n\treturn () => {\n\t\ta = (a + 0x6d2b79f5) >>> 0;\n\t\tlet t = a;\n\t\tt = Math.imul(t ^ (t >>> 15), t | 1);\n\t\tt ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n\t\treturn ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n\t};\n}\n\nconst unknownMessage = (id: string, fields: readonly ParameterField[]) =>\n\t`There is no parameter \"${id}\"; expected one of ${fields.map((f) => `\"${f.id}\"`).join(', ')}.`;\n\n/**\n * Headless state for a parameters panel: values with validation, undo (slider drags merge\n * into one step), reset, randomize, presets and optional keyframe hooks. `getState()` returns\n * the same object until something changes, so it works with `useSyncExternalStore`.\n */\nexport class ParametersController {\n\treadonly history: HistoryManager;\n\tprivate schema: ParameterSchema;\n\tprivate fields: ParameterField[] = [];\n\tprivate fieldMap = new Map<string, ParameterField>();\n\tprivate defaults: ParameterValues = {};\n\tprivate values: ParameterValues = {};\n\tprivate userPresets: ParameterPreset[];\n\tprivate collapsed: Record<string, boolean> = {};\n\tprivate errors: Record<string, string> = {};\n\tprivate time: number;\n\tprivate keyframes?: ParameterKeyframes;\n\tprivate readonly keyTolerance: number;\n\tprivate readonly random: () => number;\n\tprivate readonly onChange?: ParametersControllerOptions['onChange'];\n\tprivate readonly listeners = new Set<(state: ParametersState) => void>();\n\tprivate readonly cleanups: Array<() => void> = [];\n\tprivate gestureId: string | null = null;\n\tprivate gestureCount = 0;\n\tprivate revision = 0;\n\tprivate applying = false;\n\tprivate state!: ParametersState;\n\n\tconstructor(options: ParametersControllerOptions) {\n\t\tthis.history = options.history ?? new HistoryManager();\n\t\tthis.schema = options.schema;\n\t\tthis.userPresets = (options.presets ?? []).map((p) => ({ ...p, values: { ...p.values }, builtIn: false }));\n\t\tthis.time = options.time ?? 0;\n\t\tthis.keyframes = options.keyframes;\n\t\tthis.keyTolerance = options.keyTolerance ?? PARAMETER_KEY_TOLERANCE;\n\t\tthis.random = options.random ?? Math.random;\n\t\tthis.onChange = options.onChange;\n\t\tthis.indexSchema(options.schema);\n\t\tfor (const group of getParameterGroups(this.schema)) if (group.collapsed) this.collapsed[group.id] = true;\n\t\tthis.values = this.adopt(options.values ?? {}, this.defaults);\n\t\tthis.state = this.computeState();\n\t\tthis.cleanups.push(\n\t\t\tthis.history.subscribe((h) => {\n\t\t\t\t// Edits notify as they apply; only re-notify when the undo/redo state moved on.\n\t\t\t\tconst s = this.state;\n\t\t\t\tif (this.applying || (s.canUndo === h.canUndo && s.canRedo === h.canRedo && s.undoLabel === h.undoName && s.redoLabel === h.redoName)) return;\n\t\t\t\tthis.notify();\n\t\t\t})\n\t\t);\n\t\tthis.watchKeyframes();\n\t}\n\n\tprivate unwatchKeyframes?: () => void;\n\n\tprivate watchKeyframes() {\n\t\tthis.unwatchKeyframes?.();\n\t\tthis.unwatchKeyframes = this.keyframes?.subscribe?.(() => {\n\t\t\tif (!this.applying) this.notify();\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// State\n\t// -------------------------------------------------------------------------\n\n\t/** The current snapshot (stable until the next change). */\n\tgetState = (): ParametersState => this.state;\n\n\t/** Calls `listener` after every change. Returns an unsubscribe function. */\n\tsubscribe = (listener: (state: ParametersState) => void): (() => void) => {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t};\n\n\tgetSchema(): ParameterSchema {\n\t\treturn this.schema;\n\t}\n\n\tgetField(id: string): ParameterField | undefined {\n\t\treturn this.fieldMap.get(id);\n\t}\n\n\tgetValue(id: string): ParameterValue | undefined {\n\t\treturn this.values[id];\n\t}\n\n\tgetValues(): Readonly<ParameterValues> {\n\t\treturn this.values;\n\t}\n\n\tprivate indexSchema(schema: ParameterSchema) {\n\t\tconst problems = checkParameterSchema(schema);\n\t\tif (problems.length) throw new ParameterSchemaError(problems.join(' '));\n\t\tthis.fields = getParameterFields(schema);\n\t\tthis.fieldMap = new Map(this.fields.map((f) => [f.id, f]));\n\t\tthis.defaults = getParameterDefaults(schema);\n\t}\n\n\t/** Values for every field: valid entries of `values`, else `fallback`. Invalid ones are reported. */\n\tprivate adopt(values: Partial<ParameterValues>, fallback: ParameterValues): ParameterValues {\n\t\tconst out: ParameterValues = {};\n\t\tfor (const field of this.fields) {\n\t\t\tconst raw = values[field.id];\n\t\t\tif (raw === undefined) {\n\t\t\t\tout[field.id] = cloneValue(fallback[field.id] ?? field.default);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst result = coerceParameterValue(field, raw);\n\t\t\tif (result.ok) out[field.id] = result.value;\n\t\t\telse {\n\t\t\t\tout[field.id] = cloneValue(fallback[field.id] ?? field.default);\n\t\t\t\tthis.errors = { ...this.errors, [field.id]: result.error.message };\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate allPresets(): ParameterPreset[] {\n\t\tconst builtIn = (this.schema.presets ?? []).map((p) => ({ ...p, builtIn: true }));\n\t\tconst names = new Set(builtIn.map((p) => p.name));\n\t\treturn [...builtIn, ...this.userPresets.filter((p) => !names.has(p.name))];\n\t}\n\n\tprivate presetValues(preset: ParameterPreset, base: ParameterValues): ParameterValues {\n\t\tconst out: ParameterValues = { ...base };\n\t\tfor (const field of this.fields) {\n\t\t\tconst raw = preset.values[field.id];\n\t\t\tif (raw === undefined) continue;\n\t\t\tconst result = coerceParameterValue(field, raw);\n\t\t\tif (result.ok) out[field.id] = result.value;\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate computeState(): ParametersState {\n\t\tconst history: HistoryState = this.history.getState();\n\t\tconst presets = this.allPresets();\n\t\tconst keys: Record<string, ParameterKeyState> = {};\n\t\tif (this.keyframes) {\n\t\t\tfor (const field of this.fields) keys[field.id] = getParameterKeyState(this.keyframes.getTrack(field.id), this.time, this.keyTolerance);\n\t\t}\n\t\tconst same = (a: ParameterValues) => this.fields.every((f) => parameterValuesEqual(a[f.id], this.values[f.id]));\n\t\treturn {\n\t\t\tschema: this.schema,\n\t\t\tfields: this.fields,\n\t\t\tvalues: this.values,\n\t\t\tdefaults: this.defaults,\n\t\t\tvisible: getParameterVisibility(this.schema, this.values),\n\t\t\tcollapsed: this.collapsed,\n\t\t\terrors: this.errors,\n\t\t\tpresets,\n\t\t\tactivePreset: presets.find((p) => same(this.presetValues(p, this.defaults)))?.name ?? null,\n\t\t\tmodified: !same(this.defaults),\n\t\t\ttime: this.time,\n\t\t\tkeyframesEnabled: !!this.keyframes,\n\t\t\tkeys,\n\t\t\tgesture: this.gestureId,\n\t\t\tcanUndo: history.canUndo,\n\t\t\tcanRedo: history.canRedo,\n\t\t\tundoLabel: history.undoName,\n\t\t\tredoLabel: history.redoName,\n\t\t\trevision: this.revision\n\t\t};\n\t}\n\n\tprivate notify(changed: readonly string[] = []) {\n\t\tthis.revision++;\n\t\tthis.state = this.computeState();\n\t\tif (changed.length) this.onChange?.(this.values, changed);\n\t\tconst state = this.state;\n\t\tthis.listeners.forEach((listener) => {\n\t\t\ttry {\n\t\t\t\tlistener(state);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[ParametersController] Error in state listener:', error);\n\t\t\t}\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Changes (all edits go through one undoable command shape)\n\t// -------------------------------------------------------------------------\n\n\tprivate apply(change: Change, side: 'before' | 'after') {\n\t\tconst changed: string[] = [];\n\t\tthis.applying = true;\n\t\ttry {\n\t\t\tif (change.values) {\n\t\t\t\tconst patch = change.values[side];\n\t\t\t\tconst next = { ...this.values };\n\t\t\t\tfor (const [id, value] of Object.entries(patch)) {\n\t\t\t\t\tif (!this.fieldMap.has(id) || value === undefined) continue;\n\t\t\t\t\tnext[id] = cloneValue(value);\n\t\t\t\t\tchanged.push(id);\n\t\t\t\t\tif (id in this.errors) {\n\t\t\t\t\t\tconst { [id]: _, ...rest } = this.errors;\n\t\t\t\t\t\tthis.errors = rest;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.values = next;\n\t\t\t}\n\t\t\tif (change.presets) this.userPresets = change.presets[side].map((p) => ({ ...p }));\n\t\t\tif (change.tracks && this.keyframes) {\n\t\t\t\tfor (const [id, t] of Object.entries(change.tracks)) this.keyframes.setTrack(id, t[side]);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.applying = false;\n\t\t}\n\t\tthis.notify(changed);\n\t}\n\n\tprivate command(name: string, change: Change, tag?: string): Command {\n\t\treturn {\n\t\t\tname,\n\t\t\ttag,\n\t\t\texecute: () => this.apply(change, 'after'),\n\t\t\tundo: () => this.apply(change, 'before'),\n\t\t\tredo: () => this.apply(change, 'after')\n\t\t};\n\t}\n\n\t/** Track updates that keep keys at the playhead in step with new values. */\n\tprivate keyUpdates(after: Partial<ParameterValues>): Change['tracks'] {\n\t\tif (!this.keyframes) return undefined;\n\t\tlet tracks: Change['tracks'];\n\t\tfor (const [id, value] of Object.entries(after)) {\n\t\t\tconst track = this.keyframes.getTrack(id);\n\t\t\tif (value === undefined || findParameterKeyframe(track, this.time, this.keyTolerance) < 0) continue;\n\t\t\t(tracks ??= {})[id] = { before: track, after: withParameterKeyframe(track, { time: this.time, value }, this.keyTolerance) };\n\t\t}\n\t\treturn tracks;\n\t}\n\n\tprivate record(name: string, after: Partial<ParameterValues>, extra: Omit<Change, 'values'> = {}) {\n\t\tconst before: Partial<ParameterValues> = {};\n\t\tfor (const id of Object.keys(after)) before[id] = cloneValue(this.values[id]);\n\t\tconst tracks = { ...(this.keyUpdates(after) ?? {}), ...(extra.tracks ?? {}) };\n\t\tconst change: Change = { values: { before, after }, ...extra, ...(Object.keys(tracks).length ? { tracks } : {}) };\n\t\tthis.history.execute(this.command(name, change));\n\t}\n\n\tprivate reject(errors: ParameterError[]) {\n\t\tconst next = { ...this.errors };\n\t\tfor (const e of errors) next[e.id] = e.message;\n\t\tthis.errors = next;\n\t\tthis.notify();\n\t}\n\n\t/** Only the entries of `values` that differ from the current values. */\n\tprivate diff(values: Partial<ParameterValues>): Partial<ParameterValues> {\n\t\tconst out: Partial<ParameterValues> = {};\n\t\tfor (const [id, value] of Object.entries(values)) {\n\t\t\tif (value !== undefined && !parameterValuesEqual(this.values[id], value)) out[id] = value;\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate clearErrors(ids: readonly string[]) {\n\t\tif (!ids.some((id) => id in this.errors)) return false;\n\t\tconst next = { ...this.errors };\n\t\tfor (const id of ids) delete next[id];\n\t\tthis.errors = next;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets one value after validating it (`int`s round, colours normalise). Invalid values are\n\t * not stored; the error is returned and shown in `state.errors`. One undo step, or part of\n\t * the current gesture (see `beginGesture`).\n\t */\n\tsetValue(id: string, value: unknown, options: SetParameterOptions = {}): ParameterSetResult {\n\t\tconst field = this.fieldMap.get(id);\n\t\tif (!field) {\n\t\t\tconst message = unknownMessage(id, this.fields);\n\t\t\treturn { ok: false, error: { id, path: `/${id}`, message }, message };\n\t\t}\n\t\tconst result = coerceParameterValue(field, value);\n\t\tif (!result.ok) {\n\t\t\tthis.reject([result.error]);\n\t\t\treturn { ok: false, error: result.error, message: result.error.message };\n\t\t}\n\t\tif (parameterValuesEqual(this.values[id], result.value)) {\n\t\t\tif (this.clearErrors([id])) this.notify();\n\t\t\treturn { ok: true, value: result.value };\n\t\t}\n\t\tconst name = options.label ?? `Change ${parameterLabel(field)}`;\n\t\tif (this.gestureId !== null) {\n\t\t\tconst after = { [id]: result.value };\n\t\t\tconst before = { [id]: cloneValue(this.values[id]) };\n\t\t\tconst tracks = this.keyUpdates(after);\n\t\t\tconst change: Change = { values: { before, after }, ...(tracks ? { tracks } : {}) };\n\t\t\tthis.history.executeMerged(this.command(name, change, `parameters.set:${id}`), {\n\t\t\t\tkey: `parameters.gesture:${this.gestureId}:${this.gestureCount}`\n\t\t\t});\n\t\t} else {\n\t\t\tthis.record(name, { [id]: result.value });\n\t\t}\n\t\treturn { ok: true, value: result.value };\n\t}\n\n\t/**\n\t * Sets several values as one undo step. All-or-nothing: if any id is unknown or any value\n\t * invalid, nothing changes and every error is returned.\n\t */\n\tsetValues(values: Partial<ParameterValues> | Record<string, unknown>, options: SetParameterOptions = {}): ParameterSetValuesResult {\n\t\tconst errors: ParameterError[] = [];\n\t\tconst coerced: Partial<ParameterValues> = {};\n\t\tfor (const [id, raw] of Object.entries(values)) {\n\t\t\tif (raw === undefined) continue;\n\t\t\tconst field = this.fieldMap.get(id);\n\t\t\tif (!field) {\n\t\t\t\terrors.push({ id, path: `/${id}`, message: unknownMessage(id, this.fields) });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst result = coerceParameterValue(field, raw);\n\t\t\tif (result.ok) coerced[id] = result.value;\n\t\t\telse errors.push(result.error);\n\t\t}\n\t\tif (errors.length) {\n\t\t\tthis.reject(errors.filter((e) => this.fieldMap.has(e.id)));\n\t\t\treturn { ok: false, errors, message: errors.map((e) => e.message).join(' ') };\n\t\t}\n\t\tconst after = this.diff(coerced);\n\t\tconst changed = Object.keys(after);\n\t\tif (changed.length) {\n\t\t\tconst label = options.label ?? (changed.length === 1 ? `Change ${parameterLabel(this.fieldMap.get(changed[0])!)}` : 'Change parameters');\n\t\t\tthis.record(label, after);\n\t\t} else if (this.clearErrors(Object.keys(coerced))) this.notify();\n\t\treturn { ok: true, values: coerced, changed };\n\t}\n\n\t/**\n\t * Starts a continuous edit of `id` (a slider drag): every `setValue` until `endGesture()`\n\t * merges into one undo step.\n\t */\n\tbeginGesture(id: string): void {\n\t\tif (this.gestureId === id) return;\n\t\tthis.history.endGesture();\n\t\tthis.gestureId = id;\n\t\tthis.gestureCount++;\n\t\tthis.notify();\n\t}\n\n\t/** Ends the current gesture; the next change is a new undo step. */\n\tendGesture(): void {\n\t\tif (this.gestureId === null) return;\n\t\tthis.gestureId = null;\n\t\tthis.history.endGesture();\n\t\tthis.notify();\n\t}\n\n\t/** Puts fields (default: all) back to their defaults as one undo step. */\n\treset(ids?: readonly string[]): ParameterActionResult {\n\t\tconst targets = ids ?? this.fields.map((f) => f.id);\n\t\tconst unknown = targets.find((id) => !this.fieldMap.has(id));\n\t\tif (unknown) return { ok: false, message: unknownMessage(unknown, this.fields) };\n\t\tconst after = this.diff(Object.fromEntries(targets.map((id) => [id, cloneValue(this.defaults[id])])));\n\t\tconst changed = Object.keys(after);\n\t\tif (changed.length) {\n\t\t\tconst label = ids && changed.length === 1 ? `Reset ${parameterLabel(this.fieldMap.get(changed[0])!)}` : 'Reset parameters';\n\t\t\tthis.record(label, after);\n\t\t} else if (this.clearErrors(targets)) this.notify();\n\t\treturn { ok: true };\n\t}\n\n\t/**\n\t * Picks random values within each field's range, snapped to its step, as one undo step.\n\t * Skips hidden fields, `randomize: false`, `readOnly`, image and text fields, and numbers\n\t * without both `min` and `max`.\n\t */\n\trandomize(options: RandomizeParametersOptions = {}): ParameterSetValuesResult {\n\t\tconst rand = options.random ?? (options.seed !== undefined ? seededRandom(options.seed) : this.random);\n\t\tconst visible = this.state.visible;\n\t\tconst explicit = options.ids !== undefined;\n\t\tconst errors: ParameterError[] = [];\n\t\tconst after: Partial<ParameterValues> = {};\n\t\tfor (const id of options.ids ?? this.fields.map((f) => f.id)) {\n\t\t\tconst field = this.fieldMap.get(id);\n\t\t\tif (!field) {\n\t\t\t\terrors.push({ id, path: `/${id}`, message: unknownMessage(id, this.fields) });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!explicit && (!visible[id] || field.randomize === false || field.readOnly)) continue;\n\t\t\tconst value = randomValue(field, this.values[id], rand);\n\t\t\tif (value !== undefined) after[id] = value;\n\t\t}\n\t\tif (errors.length) return { ok: false, errors, message: errors.map((e) => e.message).join(' ') };\n\t\tconst diff = this.diff(after);\n\t\tconst changed = Object.keys(diff);\n\t\tif (changed.length) this.record('Randomize parameters', diff);\n\t\treturn { ok: true, values: after, changed };\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Presets\n\t// -------------------------------------------------------------------------\n\n\t/** Applies a preset as one undo step. Fields it leaves out return to their defaults unless `merge`. */\n\tapplyPreset(name: string, options: ApplyPresetOptions = {}): ParameterActionResult {\n\t\tconst preset = this.allPresets().find((p) => p.name === name);\n\t\tif (!preset) return { ok: false, message: this.unknownPreset(name) };\n\t\tconst target = this.presetValues(preset, options.merge ? this.values : this.defaults);\n\t\tconst after = this.diff(target);\n\t\tif (Object.keys(after).length) this.record(`Apply preset \"${name}\"`, after);\n\t\treturn { ok: true };\n\t}\n\n\t/** Saves the current values (all fields) as a user preset, replacing one with the same name. Undoable. */\n\tsavePreset(name: string, options: { description?: string } = {}): ParameterActionResult {\n\t\tconst trimmed = name.trim();\n\t\tif (!trimmed) return { ok: false, message: 'A preset needs a name.' };\n\t\tif ((this.schema.presets ?? []).some((p) => p.name === trimmed)) {\n\t\t\treturn { ok: false, message: `\"${trimmed}\" is a built-in preset; save under another name.` };\n\t\t}\n\t\tconst preset: ParameterPreset = { name: trimmed, values: Object.fromEntries(this.fields.map((f) => [f.id, cloneValue(this.values[f.id])])) };\n\t\tif (options.description) preset.description = options.description;\n\t\tconst before = this.userPresets;\n\t\tconst at = before.findIndex((p) => p.name === trimmed);\n\t\tconst after = at >= 0 ? before.map((p, i) => (i === at ? preset : p)) : [...before, preset];\n\t\tthis.history.execute(this.command(`Save preset \"${trimmed}\"`, { presets: { before, after } }));\n\t\treturn { ok: true };\n\t}\n\n\t/** Deletes a user preset (built-in presets cannot be deleted). Undoable. */\n\tdeletePreset(name: string): ParameterActionResult {\n\t\tif ((this.schema.presets ?? []).some((p) => p.name === name)) {\n\t\t\treturn { ok: false, message: `\"${name}\" is a built-in preset and cannot be deleted.` };\n\t\t}\n\t\tconst before = this.userPresets;\n\t\tif (!before.some((p) => p.name === name)) return { ok: false, message: this.unknownPreset(name) };\n\t\tconst after = before.filter((p) => p.name !== name);\n\t\tthis.history.execute(this.command(`Delete preset \"${name}\"`, { presets: { before, after } }));\n\t\treturn { ok: true };\n\t}\n\n\tprivate unknownPreset(name: string) {\n\t\tconst names = this.allPresets().map((p) => `\"${p.name}\"`);\n\t\treturn `There is no preset \"${name}\"; ${names.length ? `expected one of ${names.join(', ')}` : 'none are saved yet'}.`;\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Keyframes\n\t// -------------------------------------------------------------------------\n\n\t/** Moves the playhead. `values` (e.g. evaluated from the tracks) are shown without an undo step. */\n\tsetTime(time: number, values?: Partial<ParameterValues>): void {\n\t\tconst t = Number.isFinite(time) ? Math.max(0, time) : 0;\n\t\tconst changed: string[] = [];\n\t\tif (values) {\n\t\t\tconst next = { ...this.values };\n\t\t\tfor (const [id, raw] of Object.entries(values)) {\n\t\t\t\tconst field = this.fieldMap.get(id);\n\t\t\t\tif (!field || raw === undefined) continue;\n\t\t\t\tconst result = coerceParameterValue(field, raw);\n\t\t\t\tif (result.ok && !parameterValuesEqual(next[id], result.value)) {\n\t\t\t\t\tnext[id] = result.value;\n\t\t\t\t\tchanged.push(id);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.values = next;\n\t\t}\n\t\tif (t === this.time && changed.length === 0) return;\n\t\tthis.time = t;\n\t\tthis.notify(changed);\n\t}\n\n\t/** `keyed`, `animated` or `none` for a field at `time` (default: the playhead). */\n\tkeyState(id: string, time = this.time): ParameterKeyState {\n\t\tif (!this.keyframes) return 'none';\n\t\treturn getParameterKeyState(this.keyframes.getTrack(id), time, this.keyTolerance);\n\t}\n\n\t/** Attaches (or with `undefined` detaches) a keyframes adapter. */\n\tsetKeyframes(keyframes: ParameterKeyframes | undefined): void {\n\t\tthis.keyframes = keyframes;\n\t\tthis.watchKeyframes();\n\t\tthis.notify();\n\t}\n\n\t/**\n\t * Adds a keyframe with the field's current value at `time` (default: the playhead), or\n\t * removes the one already there. One undo step.\n\t */\n\ttoggleKeyframe(id: string, time = this.time): { ok: true; keyed: boolean } | { ok: false; message: string } {\n\t\tif (!this.keyframes) return { ok: false, message: 'Keyframes are not available here.' };\n\t\tconst field = this.fieldMap.get(id);\n\t\tif (!field) return { ok: false, message: unknownMessage(id, this.fields) };\n\t\tconst before = this.keyframes.getTrack(id);\n\t\tconst keyed = findParameterKeyframe(before, time, this.keyTolerance) >= 0;\n\t\tconst after = keyed\n\t\t\t? withoutParameterKeyframe(before, time, this.keyTolerance)\n\t\t\t: withParameterKeyframe(before, { time, value: cloneValue(this.values[id]) }, this.keyTolerance);\n\t\tconst label = `${keyed ? 'Remove keyframe from' : 'Add keyframe to'} ${parameterLabel(field)}`;\n\t\tthis.history.execute(this.command(label, { tracks: { [id]: { before, after } } }));\n\t\treturn { ok: true, keyed: !keyed };\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Groups, schema, persistence, history\n\t// -------------------------------------------------------------------------\n\n\t/** Collapses or expands a group (view state; not an undo step). */\n\tsetCollapsed(groupId: string, collapsed: boolean): void {\n\t\tif (!!this.collapsed[groupId] === collapsed) return;\n\t\tconst next = { ...this.collapsed };\n\t\tif (collapsed) next[groupId] = true;\n\t\telse delete next[groupId];\n\t\tthis.collapsed = next;\n\t\tthis.notify();\n\t}\n\n\ttoggleCollapsed(groupId: string): void {\n\t\tthis.setCollapsed(groupId, !this.collapsed[groupId]);\n\t}\n\n\t/**\n\t * Replaces the schema (e.g. after a shader recompiles). Values that still fit their field\n\t * are kept; others reset to the new default. Not an undo step; throws a\n\t * `ParameterSchemaError` for an invalid schema.\n\t */\n\tsetSchema(schema: ParameterSchema): void {\n\t\tconst old = this.values;\n\t\tthis.indexSchema(schema);\n\t\tthis.schema = schema;\n\t\tconst kept: ParameterValues = {};\n\t\tfor (const field of this.fields) {\n\t\t\tconst result = old[field.id] === undefined ? null : coerceParameterValue(field, old[field.id]);\n\t\t\tkept[field.id] = result?.ok ? result.value : cloneValue(this.defaults[field.id]);\n\t\t}\n\t\tconst changed = this.fields.filter((f) => !parameterValuesEqual(old[f.id], kept[f.id])).map((f) => f.id);\n\t\tthis.values = kept;\n\t\tthis.errors = Object.fromEntries(Object.entries(this.errors).filter(([id]) => this.fieldMap.has(id)));\n\t\tfor (const group of getParameterGroups(schema)) if (group.collapsed && !(group.id in this.collapsed)) this.collapsed[group.id] = true;\n\t\tthis.collapsed = { ...this.collapsed };\n\t\tthis.notify(changed);\n\t}\n\n\t/** Values and user presets, for saving. */\n\ttoJSON(): ParametersSnapshot {\n\t\treturn {\n\t\t\tvalues: Object.fromEntries(this.fields.map((f) => [f.id, cloneValue(this.values[f.id])])),\n\t\t\tpresets: this.userPresets.map(({ builtIn: _, ...p }) => ({ ...p, values: { ...p.values } }))\n\t\t};\n\t}\n\n\t/**\n\t * Replaces values (and user presets, when given) without an undo step, e.g. when opening a\n\t * document. Missing values use defaults; invalid ones use defaults and are reported in\n\t * `state.errors`. Clears the history when `clearHistory` is true.\n\t */\n\tload(snapshot: ParametersSnapshot, options: { clearHistory?: boolean } = {}): void {\n\t\tconst old = this.values;\n\t\tthis.errors = {};\n\t\tthis.values = this.adopt(snapshot.values ?? {}, this.defaults);\n\t\tif (snapshot.presets) this.userPresets = snapshot.presets.map((p) => ({ ...p, values: { ...p.values }, builtIn: false }));\n\t\tconst changed = this.fields.filter((f) => !parameterValuesEqual(old[f.id], this.values[f.id])).map((f) => f.id);\n\t\tif (options.clearHistory) {\n\t\t\tthis.applying = true;\n\t\t\ttry {\n\t\t\t\tthis.history.clear();\n\t\t\t} finally {\n\t\t\t\tthis.applying = false;\n\t\t\t}\n\t\t}\n\t\tthis.notify(changed);\n\t}\n\n\tundo(): boolean {\n\t\tthis.endGesture();\n\t\treturn this.history.undo();\n\t}\n\n\tredo(): boolean {\n\t\tthis.endGesture();\n\t\treturn this.history.redo();\n\t}\n\n\t/** Stops listening to the history and keyframes adapter. */\n\tdestroy(): void {\n\t\tthis.cleanups.splice(0).forEach((fn) => fn());\n\t\tthis.unwatchKeyframes?.();\n\t\tthis.unwatchKeyframes = undefined;\n\t\tthis.listeners.clear();\n\t}\n}\n\nexport function createParametersController(options: ParametersControllerOptions): ParametersController {\n\treturn new ParametersController(options);\n}\n\nfunction randomNumber(rand: () => number, min: number, max: number, step: number, int: boolean): number {\n\tconst raw = min + rand() * (max - min);\n\tconst snapped = step > 0 ? min + Math.round((raw - min) / step) * step : raw;\n\tconst v = Math.min(max, Math.max(min, snapped));\n\treturn int ? Math.round(v) : Math.round(v * 1e6) / 1e6;\n}\n\n/** A random value for a field, or `undefined` when it cannot be randomised. */\nfunction randomValue(field: ParameterField, current: ParameterValue | undefined, rand: () => number): ParameterValue | undefined {\n\tswitch (field.type) {\n\t\tcase 'number':\n\t\tcase 'int':\n\t\t\tif (field.min === undefined || field.max === undefined) return undefined;\n\t\t\treturn randomNumber(rand, field.min, field.max, parameterStep(field), field.type === 'int');\n\t\tcase 'boolean':\n\t\t\treturn rand() < 0.5;\n\t\tcase 'choice': {\n\t\t\tconst options = getChoiceOptions(field);\n\t\t\treturn options[Math.min(options.length - 1, Math.floor(rand() * options.length))].value;\n\t\t}\n\t\tcase 'color': {\n\t\t\tconst rgb = Array.from({ length: 3 }, () => Math.floor(rand() * 256).toString(16).padStart(2, '0')).join('');\n\t\t\tconst alpha = field.alpha ? (normalizeHexColor(String(current ?? field.default), true) ?? '#000000ff').slice(7) : '';\n\t\t\treturn `#${rgb}${alpha}`;\n\t\t}\n\t\tcase 'vector': {\n\t\t\tconst out: number[] = [];\n\t\t\tfor (let i = 0; i < vectorSize(field); i++) {\n\t\t\t\tconst c = vectorComponentField(field, i);\n\t\t\t\tconst now = Array.isArray(current) ? current[i] : c.default;\n\t\t\t\tout.push(c.min === undefined || c.max === undefined ? now : randomNumber(rand, c.min, c.max, parameterStep(c), false));\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n","import type { CommandSpec } from '../commands/registry.js';\nimport type { ParametersController } from './controller.js';\nimport { getChoiceOptions, parameterFieldToJsonSchema, parameterLabel, parameterSchemaToJsonSchema, vectorSize } from './schema.js';\nimport type { ParameterField, ParameterValue } from './types.js';\n\nexport interface ParameterCommandOptions {\n\t/** Id prefix (default `parameters.`); use one per panel when several are registered. */\n\tprefix?: string;\n\t/** Palette group (default `Parameters`, or the schema's title). */\n\tgroup?: string;\n\t/** Command scope. Omit for global commands. */\n\tscope?: string;\n}\n\n/** A field as listed for agents: its JSON Schema plus current value and visibility. */\nexport interface ParameterListing {\n\tid: string;\n\tlabel: string;\n\ttype: ParameterField['type'];\n\tdescription?: string;\n\tvalue: ParameterValue;\n\tdefault: ParameterValue;\n\tvisible: boolean;\n\tkeyframe?: 'none' | 'animated' | 'keyed';\n\tschema: Record<string, unknown>;\n}\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nconst IDS = { type: 'array', items: { type: 'string' }, description: 'Parameter ids (default: all).' } as const;\n\n/**\n * Palette and agent commands for a parameters panel: list, set (validated, one undo step),\n * reset, randomize, presets and keyframe toggles. Register them in a `CommandRegistry` and\n * agents get them through `createCommandToolProvider`. Failures throw sentences, which the\n * registry returns as `{ ok: false, code: 'failed', message }`.\n */\nexport function createParameterCommands(controller: ParametersController, options: ParameterCommandOptions = {}): CommandSpec[] {\n\tconst prefix = options.prefix ?? 'parameters.';\n\tconst group = options.group ?? controller.getSchema().title ?? 'Parameters';\n\tconst base = { group, ...(options.scope ? { scope: options.scope } : {}) };\n\tconst presetNames = () => controller.getState().presets.map((p) => p.name);\n\n\tconst set: CommandSpec = {\n\t\t...base,\n\t\tid: `${prefix}set`,\n\t\tlabel: 'Set Parameters…',\n\t\tkeywords: ['change', 'value', 'control', 'slider'],\n\t\tdescription: 'Sets one or more parameter values as one undo step. Invalid values change nothing and return why.',\n\t\t// A getter so agents always see the current schema (it can change with `setSchema`).\n\t\tget params() {\n\t\t\treturn {\n\t\t\t\ttype: 'object' as const,\n\t\t\t\tproperties: { values: { ...parameterSchemaToJsonSchema(controller.getSchema()), description: 'Parameter id → new value.' } },\n\t\t\t\trequired: ['values']\n\t\t\t};\n\t\t},\n\t\trun: (_ctx: unknown, params: { values: Record<string, unknown> }) => {\n\t\t\tconst result = controller.setValues(params.values);\n\t\t\tif (!result.ok) fail(result.message);\n\t\t\treturn { changed: result.ok ? result.changed : [], values: controller.getValues() };\n\t\t}\n\t};\n\n\tconst commands: CommandSpec[] = [\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}list`,\n\t\t\tlabel: 'List Parameters',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['controls', 'values', 'schema'],\n\t\t\tdescription: 'Lists every parameter with its type, constraints, current value and default.',\n\t\t\trun: (): { parameters: ParameterListing[]; presets: string[]; time: number } => {\n\t\t\t\tconst state = controller.getState();\n\t\t\t\treturn {\n\t\t\t\t\tparameters: state.fields.map((field) => ({\n\t\t\t\t\t\tid: field.id,\n\t\t\t\t\t\tlabel: parameterLabel(field),\n\t\t\t\t\t\ttype: field.type,\n\t\t\t\t\t\t...(field.description ? { description: field.description } : {}),\n\t\t\t\t\t\tvalue: state.values[field.id],\n\t\t\t\t\t\tdefault: state.defaults[field.id],\n\t\t\t\t\t\tvisible: state.visible[field.id] !== false,\n\t\t\t\t\t\t...(state.keyframesEnabled ? { keyframe: state.keys[field.id] } : {}),\n\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t...parameterFieldToJsonSchema(field),\n\t\t\t\t\t\t\t...(field.type === 'choice' ? { options: getChoiceOptions(field) } : {}),\n\t\t\t\t\t\t\t...(field.type === 'vector' ? { size: vectorSize(field) } : {})\n\t\t\t\t\t\t}\n\t\t\t\t\t})),\n\t\t\t\t\tpresets: presetNames(),\n\t\t\t\t\ttime: state.time\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\tset,\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}reset`,\n\t\t\tlabel: 'Reset Parameters',\n\t\t\tkeywords: ['default', 'revert', 'clear'],\n\t\t\tdescription: 'Puts parameters back to their defaults.',\n\t\t\tparams: { type: 'object', properties: { ids: IDS } },\n\t\t\tenabled: (_ctx: unknown, params: { ids?: string[] } | undefined) => (params?.ids || controller.getState().modified ? true : 'Every parameter is already at its default.'),\n\t\t\trun: (_ctx: unknown, params: { ids?: string[] }) => {\n\t\t\t\tconst result = controller.reset(params?.ids);\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { values: controller.getValues() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}randomize`,\n\t\t\tlabel: 'Randomize Parameters',\n\t\t\tkeywords: ['random', 'shuffle', 'surprise', 'explore'],\n\t\t\tdescription: 'Picks random values within each parameter range (visible fields only unless `ids` is given).',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { ids: IDS, seed: { type: 'integer', description: 'Seed for a repeatable result.' } }\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: { ids?: string[]; seed?: number }) => {\n\t\t\t\tconst result = controller.randomize({ ids: params?.ids, seed: params?.seed });\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { changed: result.ok ? result.changed : [], values: controller.getValues() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}applyPreset`,\n\t\t\tlabel: 'Apply Parameter Preset…',\n\t\t\tkeywords: ['preset', 'look', 'style'],\n\t\t\tdescription: 'Applies a preset; parameters it leaves out return to their defaults unless `merge` is true.',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { name: { type: 'string', description: 'Preset name (see parameters list).' }, merge: { type: 'boolean' } },\n\t\t\t\trequired: ['name']\n\t\t\t},\n\t\t\tenabled: () => (presetNames().length ? true : 'There are no presets.'),\n\t\t\trun: (_ctx: unknown, params: { name: string; merge?: boolean }) => {\n\t\t\t\tconst result = controller.applyPreset(params.name, { merge: params.merge });\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { values: controller.getValues() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}savePreset`,\n\t\t\tlabel: 'Save Parameter Preset…',\n\t\t\tkeywords: ['preset', 'store', 'remember'],\n\t\t\tdescription: 'Saves the current values as a preset (replacing a user preset with the same name).',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { name: { type: 'string', minLength: 1 }, description: { type: 'string' } },\n\t\t\t\trequired: ['name']\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: { name: string; description?: string }) => {\n\t\t\t\tconst result = controller.savePreset(params.name, { description: params.description });\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { presets: presetNames() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}deletePreset`,\n\t\t\tlabel: 'Delete Parameter Preset…',\n\t\t\tkeywords: ['preset', 'remove'],\n\t\t\tparams: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },\n\t\t\tenabled: () => (controller.getState().presets.some((p) => !p.builtIn) ? true : 'There are no saved presets.'),\n\t\t\trun: (_ctx: unknown, params: { name: string }) => {\n\t\t\t\tconst result = controller.deletePreset(params.name);\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { presets: presetNames() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}toggleKeyframe`,\n\t\t\tlabel: 'Toggle Parameter Keyframe…',\n\t\t\tkeywords: ['key', 'animate', 'diamond'],\n\t\t\tdescription: 'Adds a keyframe with the current value at `time` (default: the playhead), or removes the one there.',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { id: { type: 'string', description: 'Parameter id.' }, time: { type: 'number', minimum: 0, description: 'Time in ms.' } },\n\t\t\t\trequired: ['id']\n\t\t\t},\n\t\t\tenabled: () => (controller.getState().keyframesEnabled ? true : 'Keyframes are not available here.'),\n\t\t\trun: (_ctx: unknown, params: { id: string; time?: number }) => {\n\t\t\t\tconst result = controller.toggleKeyframe(params.id, params.time);\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { keyed: result.ok && result.keyed, time: params.time ?? controller.getState().time };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}undo`,\n\t\t\tlabel: 'Undo Parameter Change',\n\t\t\thidden: true,\n\t\t\tenabled: () => (controller.getState().canUndo ? true : 'Nothing to undo.'),\n\t\t\trun: () => controller.undo()\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}redo`,\n\t\t\tlabel: 'Redo Parameter Change',\n\t\t\thidden: true,\n\t\t\tenabled: () => (controller.getState().canRedo ? true : 'Nothing to redo.'),\n\t\t\trun: () => controller.redo()\n\t\t}\n\t];\n\treturn commands;\n}\n","import { hexToRgba01, rgba01ToHex } from './schema.js';\nimport type { ParameterField, ParameterSchema, ParameterValue } from './types.js';\n\n/** A shader uniform type that can be a control (Flair's `@control` uniforms). */\nexport type ShaderControlType = 'float' | 'int' | 'bool' | 'vec2' | 'vec3' | 'vec4' | 'sampler2D';\n\n/** A shader control value: a number, a boolean, vector components (colours are 0–1) or an image URL. */\nexport type ShaderControlValue = number | boolean | number[] | string;\n\n/**\n * The shape of a parsed shader control, e.g. Flair's `ControlDef`\n * (`uniform vec3 uTint; // @control color default=#77C16A`).\n */\nexport interface ShaderControlLike {\n\tname: string;\n\ttype: ShaderControlType;\n\tlabel?: string;\n\t/** A `vec3` / `vec4` shown as a colour picker. */\n\tcolor?: boolean;\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tdefault: ShaderControlValue;\n\tdescription?: string;\n}\n\nconst SIZES: Record<string, 2 | 3 | 4> = { vec2: 2, vec3: 3, vec4: 4 };\n\n/** One shader control as a parameter field (colour vectors become hex `color` fields). */\nexport function parameterFieldFromShaderControl(control: ShaderControlLike): ParameterField {\n\tconst common = {\n\t\tid: control.name,\n\t\t...(control.label ? { label: control.label } : {}),\n\t\t...(control.description ? { description: control.description } : {})\n\t};\n\tswitch (control.type) {\n\t\tcase 'bool':\n\t\t\treturn { ...common, type: 'boolean', default: control.default === true };\n\t\tcase 'sampler2D':\n\t\t\treturn { ...common, type: 'image', default: typeof control.default === 'string' ? control.default : '' };\n\t\tcase 'float':\n\t\tcase 'int':\n\t\t\treturn {\n\t\t\t\t...common,\n\t\t\t\ttype: control.type === 'int' ? 'int' : 'number',\n\t\t\t\tdefault: typeof control.default === 'number' ? control.default : 0,\n\t\t\t\t...(control.min !== undefined ? { min: control.min } : {}),\n\t\t\t\t...(control.max !== undefined ? { max: control.max } : {}),\n\t\t\t\t...(control.step !== undefined ? { step: control.step } : {})\n\t\t\t};\n\t\tdefault: {\n\t\t\tconst size = SIZES[control.type];\n\t\t\tconst components = Array.isArray(control.default) ? control.default : Array.from({ length: size }, () => 0);\n\t\t\tif (control.color && size >= 3) {\n\t\t\t\treturn { ...common, type: 'color', alpha: size === 4, default: rgba01ToHex(components, size === 4) };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...common,\n\t\t\t\ttype: 'vector',\n\t\t\t\tsize,\n\t\t\t\tdefault: Array.from({ length: size }, (_, i) => components[i] ?? 0),\n\t\t\t\t...(control.min !== undefined ? { min: control.min } : {}),\n\t\t\t\t...(control.max !== undefined ? { max: control.max } : {}),\n\t\t\t\t...(control.step !== undefined ? { step: control.step } : {})\n\t\t\t};\n\t\t}\n\t}\n}\n\n/** A parameter schema for a shader's controls, in source order. */\nexport function parameterSchemaFromShaderControls(controls: readonly ShaderControlLike[], options: { title?: string } = {}): ParameterSchema {\n\treturn { ...(options.title ? { title: options.title } : {}), fields: controls.map(parameterFieldFromShaderControl) };\n}\n\n/** A parameter value as the shader takes it: hex colours become 0–1 RGB(A) arrays. */\nexport function shaderControlValue(control: ShaderControlLike, value: ParameterValue): ShaderControlValue {\n\tif (control.color && typeof value === 'string') {\n\t\treturn hexToRgba01(value, control.type === 'vec4') ?? (control.default as number[]);\n\t}\n\treturn value;\n}\n\n/** A shader control value as a parameter value: colour arrays become hex. */\nexport function parameterValueFromShaderControl(control: ShaderControlLike, value: ShaderControlValue): ParameterValue {\n\tif (control.color && Array.isArray(value)) return rgba01ToHex(value, control.type === 'vec4');\n\treturn value;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/parameters/schema.ts","../../src/parameters/keyframes.ts","../../src/parameters/controller.ts","../../src/parameters/commands.ts","../../src/parameters/shader.ts","../../src/parameters/rangeMapper.ts"],"sourcesContent":["import type {\n\tChoiceParameterField,\n\tNumberParameterField,\n\tParameterChoiceOption,\n\tParameterCondition,\n\tParameterConditionTest,\n\tParameterError,\n\tParameterField,\n\tParameterGroup,\n\tParameterSchema,\n\tParameterSchemaItem,\n\tParameterValue,\n\tParameterValues,\n\tVectorParameterField\n} from './types.js';\nimport type { JsonSchema } from '../tools/schema.js';\n\n// ---------------------------------------------------------------------------\n// Labels and colours\n// ---------------------------------------------------------------------------\n\n/** `flowSpeed`, `flow_speed` or `uFlowSpeed` → \"Flow speed\". */\nexport function humanizeParameterId(id: string): string {\n\tconst words = id\n\t\t.replace(/^u(?=[A-Z])/, '')\n\t\t.replace(/[_-]+/g, ' ')\n\t\t.replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n\t\t.trim()\n\t\t.toLowerCase();\n\treturn words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/** The label shown for a field or group. */\nexport function parameterLabel(item: { id: string; label?: string }): string {\n\treturn item.label ?? humanizeParameterId(item.id);\n}\n\nconst HEX = /^#?([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n\n/**\n * Normalises a hex colour to lower-case `#rrggbb`, or `#rrggbbaa` when `alpha` is true\n * (opaque colours get `ff`). Accepts 3, 4, 6 and 8 digits with or without `#`; returns\n * `null` for anything else. Without `alpha`, a colour's alpha is dropped.\n */\nexport function normalizeHexColor(input: string, alpha = false): string | null {\n\tconst m = HEX.exec(input.trim());\n\tif (!m) return null;\n\tlet digits = m[1].toLowerCase();\n\tif (digits.length <= 4) digits = [...digits].map((c) => c + c).join('');\n\tconst rgb = digits.slice(0, 6);\n\tconst a = digits.length === 8 ? digits.slice(6) : 'ff';\n\treturn alpha ? `#${rgb}${a}` : `#${rgb}`;\n}\n\n/** `#77c16a` → `[0.467, 0.757, 0.416]` (0–1 components; four with `alpha`). `null` if not a colour. */\nexport function hexToRgba01(hex: string, alpha = false): number[] | null {\n\tconst n = normalizeHexColor(hex, true);\n\tif (!n) return null;\n\tconst parts = [1, 3, 5, 7].map((i) => parseInt(n.slice(i, i + 2), 16) / 255);\n\treturn alpha ? parts : parts.slice(0, 3);\n}\n\n/** `[0.467, 0.757, 0.416]` → `#77c16a`; a fourth component becomes alpha when `alpha` is true. Clamped to 0–1. */\nexport function rgba01ToHex(components: readonly number[], alpha = false): string {\n\tconst byte = (c: number) =>\n\t\tMath.round(Math.min(1, Math.max(0, Number.isFinite(c) ? c : 0)) * 255)\n\t\t\t.toString(16)\n\t\t\t.padStart(2, '0');\n\tconst rgb = [0, 1, 2].map((i) => byte(components[i] ?? 0)).join('');\n\treturn alpha ? `#${rgb}${byte(components[3] ?? 1)}` : `#${rgb}`;\n}\n\n// ---------------------------------------------------------------------------\n// Walking a schema\n// ---------------------------------------------------------------------------\n\nexport const isParameterGroup = (item: ParameterSchemaItem): item is ParameterGroup => item.type === 'group';\n\n/** Every field in schema order, groups flattened. */\nexport function getParameterFields(schema: ParameterSchema | readonly ParameterSchemaItem[]): ParameterField[] {\n\tconst out: ParameterField[] = [];\n\tconst walk = (items: readonly ParameterSchemaItem[]) => {\n\t\tfor (const item of items) {\n\t\t\tif (isParameterGroup(item)) walk(item.fields);\n\t\t\telse out.push(item);\n\t\t}\n\t};\n\twalk(Array.isArray(schema) ? schema : (schema as ParameterSchema).fields);\n\treturn out;\n}\n\n/** Every group in schema order (nested groups after their parent). */\nexport function getParameterGroups(schema: ParameterSchema): ParameterGroup[] {\n\tconst out: ParameterGroup[] = [];\n\tconst walk = (items: readonly ParameterSchemaItem[]) => {\n\t\tfor (const item of items) {\n\t\t\tif (isParameterGroup(item)) {\n\t\t\t\tout.push(item);\n\t\t\t\twalk(item.fields);\n\t\t\t}\n\t\t}\n\t};\n\twalk(schema.fields);\n\treturn out;\n}\n\nexport class ParameterSchemaError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = 'ParameterSchemaError';\n\t}\n}\n\nconst FIELD_TYPES = new Set(['number', 'int', 'boolean', 'choice', 'color', 'vector', 'image', 'text']);\n\n/**\n * Checks a schema's structure: unique ids, known types, choice options, vector sizes and\n * defaults that pass validation. Returns sentences; an empty array means the schema is fine.\n */\nexport function checkParameterSchema(schema: ParameterSchema): string[] {\n\tconst problems: string[] = [];\n\tconst ids = new Set<string>();\n\tconst visit = (items: readonly ParameterSchemaItem[]) => {\n\t\tfor (const item of items) {\n\t\t\tif (!item || typeof item.id !== 'string' || item.id === '') {\n\t\t\t\tproblems.push('Every field and group needs an id.');\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ids.has(item.id)) problems.push(`The id \"${item.id}\" is used twice.`);\n\t\t\tids.add(item.id);\n\t\t\tif (isParameterGroup(item)) {\n\t\t\t\tvisit(item.fields ?? []);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!FIELD_TYPES.has((item as ParameterField).type)) {\n\t\t\t\tproblems.push(`Field \"${item.id}\" has an unknown type \"${(item as { type: string }).type}\".`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (item.type === 'choice' && (!item.options || item.options.length === 0)) {\n\t\t\t\tproblems.push(`Field \"${item.id}\" needs at least one option.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (item.type === 'vector') {\n\t\t\t\tconst size = vectorSize(item);\n\t\t\t\tif (size < 2 || size > 4) {\n\t\t\t\t\tproblems.push(`Field \"${item.id}\" must have 2 to 4 components.`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst error = validateParameterValue(item, item.default);\n\t\t\tif (error) problems.push(`Field \"${item.id}\" has an invalid default: ${error.message}`);\n\t\t}\n\t};\n\tvisit(schema.fields ?? []);\n\tconst presetNames = new Set<string>();\n\tfor (const preset of schema.presets ?? []) {\n\t\tif (presetNames.has(preset.name)) problems.push(`The preset name \"${preset.name}\" is used twice.`);\n\t\tpresetNames.add(preset.name);\n\t}\n\treturn problems;\n}\n\n/** The defaults of every field (colours normalised to lower-case hex, `int`s rounded). */\nexport function getParameterDefaults(schema: ParameterSchema): ParameterValues {\n\tconst values: ParameterValues = {};\n\tfor (const field of getParameterFields(schema)) {\n\t\tconst result = coerceParameterValue(field, field.default);\n\t\tvalues[field.id] = result.ok ? result.value : cloneValue(field.default);\n\t}\n\treturn values;\n}\n\nexport const cloneValue = <T extends ParameterValue>(value: T): T => (Array.isArray(value) ? ([...value] as T) : value);\n\n/** Value equality (vectors compare component-wise). */\nexport function parameterValuesEqual(a: ParameterValue | undefined, b: ParameterValue | undefined): boolean {\n\tif (a === b) return true;\n\tif (Array.isArray(a) && Array.isArray(b)) return a.length === b.length && a.every((v, i) => v === b[i]);\n\treturn false;\n}\n\n// ---------------------------------------------------------------------------\n// Visibility\n// ---------------------------------------------------------------------------\n\nconst truthy = (v: ParameterValue | undefined) =>\n\tArray.isArray(v) ? v.some((c) => c !== 0) : v !== undefined && v !== false && v !== 0 && v !== '';\n\nfunction testCondition(value: ParameterValue | undefined, test: ParameterConditionTest): boolean {\n\tif (Array.isArray(test)) return test.some((option) => parameterValuesEqual(value, option));\n\tif (typeof test !== 'object' || test === null) return parameterValuesEqual(value, test as ParameterValue);\n\tconst t = test as Exclude<ParameterConditionTest, string | number | boolean | readonly unknown[]>;\n\tif (t.eq !== undefined && !parameterValuesEqual(value, t.eq)) return false;\n\tif (t.ne !== undefined && parameterValuesEqual(value, t.ne)) return false;\n\tif (t.in && !t.in.some((option) => parameterValuesEqual(value, option))) return false;\n\tif (t.notIn && t.notIn.some((option) => parameterValuesEqual(value, option))) return false;\n\tif (t.truthy !== undefined && truthy(value) !== t.truthy) return false;\n\tconst n = typeof value === 'number' ? value : NaN;\n\tif (t.gt !== undefined && !(n > t.gt)) return false;\n\tif (t.gte !== undefined && !(n >= t.gte)) return false;\n\tif (t.lt !== undefined && !(n < t.lt)) return false;\n\tif (t.lte !== undefined && !(n <= t.lte)) return false;\n\treturn true;\n}\n\n/** Whether a `showIf` condition holds for `values` (no condition: `true`). */\nexport function evaluateParameterCondition(condition: ParameterCondition | undefined, values: Readonly<ParameterValues>): boolean {\n\tif (!condition) return true;\n\tif (typeof condition === 'function') {\n\t\ttry {\n\t\t\treturn condition(values) !== false;\n\t\t} catch {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn Object.entries(condition).every(([id, test]) => testCondition(values[id], test));\n}\n\n/**\n * Field and group id → shown. An item is hidden when its own `showIf` fails or any\n * enclosing group is hidden.\n */\nexport function getParameterVisibility(schema: ParameterSchema, values: Readonly<ParameterValues>): Record<string, boolean> {\n\tconst visible: Record<string, boolean> = {};\n\tconst walk = (items: readonly ParameterSchemaItem[], parentVisible: boolean) => {\n\t\tfor (const item of items) {\n\t\t\tconst shown = parentVisible && evaluateParameterCondition(item.showIf, values);\n\t\t\tvisible[item.id] = shown;\n\t\t\tif (isParameterGroup(item)) walk(item.fields, shown);\n\t\t}\n\t};\n\twalk(schema.fields, true);\n\treturn visible;\n}\n\n// ---------------------------------------------------------------------------\n// Field details\n// ---------------------------------------------------------------------------\n\n/** A choice field's options as objects. */\nexport function getChoiceOptions(field: ChoiceParameterField): ParameterChoiceOption[] {\n\treturn field.options.map((o) => (typeof o === 'object' ? o : { value: o }));\n}\n\n/** An option's label (default: the value made readable). */\nexport const choiceOptionLabel = (option: ParameterChoiceOption): string =>\n\toption.label ?? (typeof option.value === 'string' ? humanizeParameterId(option.value) : String(option.value));\n\nexport function vectorSize(field: VectorParameterField): number {\n\treturn field.size ?? (Array.isArray(field.default) ? field.default.length : 2);\n}\n\nconst pick = (bound: number | readonly number[] | undefined, i: number) => (typeof bound === 'number' ? bound : bound?.[i]);\n\n/** A vector component as a number field (its bounds, step, unit and label). */\nexport function vectorComponentField(field: VectorParameterField, index: number): NumberParameterField {\n\tconst labels = field.labels ?? ['x', 'y', 'z', 'w'];\n\treturn {\n\t\tid: `${field.id}.${index}`,\n\t\ttype: 'number',\n\t\tlabel: labels[index] ?? String(index),\n\t\tdefault: field.default[index] ?? 0,\n\t\tmin: pick(field.min, index),\n\t\tmax: pick(field.max, index),\n\t\tstep: field.step,\n\t\tunit: field.unit,\n\t\tdecimals: field.decimals,\n\t\tcontrol: 'input'\n\t};\n}\n\n/** The step a number field moves by: `step`, else 1 for `int`, else 1/100 of the range (0.01 without one). */\nexport function parameterStep(field: NumberParameterField): number {\n\tif (field.step !== undefined && field.step > 0) return field.type === 'int' ? Math.max(1, Math.round(field.step)) : field.step;\n\tif (field.type === 'int') return 1;\n\tif (field.min !== undefined && field.max !== undefined && field.max > field.min) return (field.max - field.min) / 100;\n\treturn 0.01;\n}\n\n/** Decimal places to show: `decimals`, else enough for the step (at most 4). */\nexport function parameterDecimals(field: NumberParameterField): number {\n\tif (field.decimals !== undefined) return field.decimals;\n\tif (field.type === 'int') return 0;\n\tconst step = parameterStep(field);\n\tfor (let d = 0; d <= 4; d++) if (Math.abs(Math.round(step * 10 ** d) - step * 10 ** d) < 1e-9) return d;\n\treturn 4;\n}\n\n/** Whether a number field renders a slider (`control`, else when it has both bounds). */\nexport const isSliderField = (field: NumberParameterField): boolean =>\n\tfield.control ? field.control === 'slider' : field.min !== undefined && field.max !== undefined;\n\n/** A number as shown for a field: fixed decimals, trailing zeros trimmed, plus the unit. */\nexport function formatParameterNumber(field: NumberParameterField, value: number): string {\n\tconst fixed = (Number.isFinite(value) ? value : 0).toFixed(parameterDecimals(field));\n\tconst trimmed = fixed.includes('.') ? fixed.replace(/\\.?0+$/, '') : fixed;\n\treturn `${trimmed === '-0' ? '0' : trimmed}${field.unit ?? ''}`;\n}\n\n/** Clamps into the field's bounds, rounds `int`s and snaps float noise (for UI inputs). */\nexport function clampParameterNumber(field: NumberParameterField, value: number): number {\n\tlet v = Number.isFinite(value) ? value : field.default;\n\tif (field.min !== undefined) v = Math.max(field.min, v);\n\tif (field.max !== undefined) v = Math.min(field.max, v);\n\tif (field.type === 'int') return Math.round(v);\n\treturn Math.round(v * 1e6) / 1e6;\n}\n\n/**\n * Parses what someone typed into a number box (\"2.5\", \"2.5x\", \"-1e2\") and clamps it into\n * the field's bounds. Returns `null` when it is not a number.\n */\nexport function parseParameterNumberInput(field: NumberParameterField, text: string): number | null {\n\tlet t = text.trim();\n\tif (field.unit && t.endsWith(field.unit)) t = t.slice(0, -field.unit.length).trim();\n\tif (t === '') return null;\n\tconst n = Number(t.replace(',', '.'));\n\treturn Number.isFinite(n) ? clampParameterNumber(field, n) : null;\n}\n\n/** A value as short display text (numbers formatted, vectors comma-separated, booleans On/Off). */\nexport function formatParameterValue(field: ParameterField, value: ParameterValue | undefined): string {\n\tif (value === undefined) return '';\n\tswitch (field.type) {\n\t\tcase 'number':\n\t\tcase 'int':\n\t\t\treturn formatParameterNumber(field, value as number);\n\t\tcase 'boolean':\n\t\t\treturn value ? 'On' : 'Off';\n\t\tcase 'choice': {\n\t\t\tconst option = getChoiceOptions(field).find((o) => o.value === value);\n\t\t\treturn option ? choiceOptionLabel(option) : String(value);\n\t\t}\n\t\tcase 'vector':\n\t\t\treturn (value as number[]).map((v, i) => formatParameterNumber(vectorComponentField(field, i), v)).join(', ');\n\t\tdefault:\n\t\t\treturn String(value);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nconst describe = (v: unknown) =>\n\tv === null ? 'null' : Array.isArray(v) ? 'a list' : typeof v === 'string' ? `\"${v.length > 40 ? `${v.slice(0, 40)}…` : v}\"` : String(v);\n\nfunction err(field: ParameterField, message: string, index?: number): ParameterError {\n\treturn { id: field.id, path: index === undefined ? `/${field.id}` : `/${field.id}/${index}`, message };\n}\n\nfunction numberError(field: ParameterField, name: string, v: unknown, opts: { int: boolean; min?: number; max?: number }, index?: number): ParameterError | null {\n\tif (typeof v !== 'number' || !Number.isFinite(v)) return err(field, `${name} must be a number, not ${describe(v)}.`, index);\n\tif (opts.int && !Number.isInteger(v)) return err(field, `${name} must be a whole number.`, index);\n\tif (opts.min !== undefined && v < opts.min) return err(field, `${name} must be at least ${opts.min}.`, index);\n\tif (opts.max !== undefined && v > opts.max) return err(field, `${name} must be at most ${opts.max}.`, index);\n\treturn null;\n}\n\n/**\n * Checks a value against a field. Returns `null` when it is valid, else one error whose\n * message is a sentence naming the field (\"Speed must be at most 4.\").\n */\nexport function validateParameterValue(field: ParameterField, value: unknown): ParameterError | null {\n\tconst name = parameterLabel(field);\n\tswitch (field.type) {\n\t\tcase 'number':\n\t\tcase 'int':\n\t\t\treturn numberError(field, name, value, { int: field.type === 'int', min: field.min, max: field.max });\n\t\tcase 'boolean':\n\t\t\treturn typeof value === 'boolean' ? null : err(field, `${name} must be true or false.`);\n\t\tcase 'choice': {\n\t\t\tconst options = getChoiceOptions(field);\n\t\t\tif (options.some((o) => o.value === value)) return null;\n\t\t\treturn err(field, `${name} must be one of ${options.map((o) => JSON.stringify(o.value)).join(', ')}, not ${describe(value)}.`);\n\t\t}\n\t\tcase 'color': {\n\t\t\tconst example = field.alpha ? '\"#77c16aff\"' : '\"#77c16a\"';\n\t\t\tif (typeof value !== 'string' || normalizeHexColor(value, !!field.alpha) === null) {\n\t\t\t\treturn err(field, `${name} must be a hex colour like ${example}.`);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tcase 'vector': {\n\t\t\tconst size = vectorSize(field);\n\t\t\tif (!Array.isArray(value) || value.length !== size) return err(field, `${name} must be a list of ${size} numbers.`);\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tconst component = `${name} ${(field.labels ?? ['x', 'y', 'z', 'w'])[i] ?? i}`;\n\t\t\t\tconst e = numberError(field, component, value[i], { int: false, min: pick(field.min, i), max: pick(field.max, i) }, i);\n\t\t\t\tif (e) return e;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tcase 'image':\n\t\t\treturn typeof value === 'string' ? null : err(field, `${name} must be an image URL (or \"\" for none).`);\n\t\tcase 'text': {\n\t\t\tif (typeof value !== 'string') return err(field, `${name} must be text.`);\n\t\t\tif (field.minLength !== undefined && value.length < field.minLength) {\n\t\t\t\treturn err(field, `${name} must be at least ${field.minLength} characters.`);\n\t\t\t}\n\t\t\tif (field.maxLength !== undefined && value.length > field.maxLength) {\n\t\t\t\treturn err(field, `${name} must be at most ${field.maxLength} characters.`);\n\t\t\t}\n\t\t\tif (field.pattern !== undefined) {\n\t\t\t\tlet regex: RegExp | null = null;\n\t\t\t\ttry {\n\t\t\t\t\tregex = new RegExp(`^(?:${field.pattern})$`, 'u');\n\t\t\t\t} catch {\n\t\t\t\t\t// An invalid pattern in the schema is not the caller's fault.\n\t\t\t\t}\n\t\t\t\tif (regex && !regex.test(value)) return err(field, `${name} must match the pattern ${field.pattern}.`);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\tdefault:\n\t\t\treturn err(field as ParameterField, `${name} has an unknown type.`);\n\t}\n}\n\nexport type ParameterCoercion = { ok: true; value: ParameterValue } | { ok: false; error: ParameterError };\n\n/**\n * Checks a value from outside (an agent's tool call, a URL, a form) and returns the value to\n * store. Coercion is narrow: `int`s are rounded, colours normalised to lower-case hex.\n */\nexport function coerceParameterValue(field: ParameterField, raw: unknown): ParameterCoercion {\n\tlet value = raw;\n\tif (field.type === 'int' && typeof raw === 'number' && Number.isFinite(raw)) value = Math.round(raw);\n\tif (field.type === 'color' && typeof raw === 'string') value = normalizeHexColor(raw, !!field.alpha) ?? raw;\n\tif (field.type === 'vector' && Array.isArray(raw)) value = [...raw];\n\tconst error = validateParameterValue(field, value);\n\treturn error ? { ok: false, error } : { ok: true, value: value as ParameterValue };\n}\n\n/** Every error for `values` (missing values are reported too). */\nexport function validateParameterValues(schema: ParameterSchema, values: Readonly<Partial<ParameterValues>>): ParameterError[] {\n\tconst errors: ParameterError[] = [];\n\tfor (const field of getParameterFields(schema)) {\n\t\tconst value = values[field.id];\n\t\tif (value === undefined) {\n\t\t\terrors.push(err(field, `${parameterLabel(field)} is missing.`));\n\t\t\tcontinue;\n\t\t}\n\t\tconst error = validateParameterValue(field, value);\n\t\tif (error) errors.push(error);\n\t}\n\treturn errors;\n}\n\n// ---------------------------------------------------------------------------\n// JSON Schema (for agents)\n// ---------------------------------------------------------------------------\n\n/** One field as JSON Schema (for agent tool parameters). */\nexport function parameterFieldToJsonSchema(field: ParameterField): JsonSchema {\n\tconst description = [parameterLabel(field), field.description].filter(Boolean).join(': ');\n\tconst base: JsonSchema = { title: parameterLabel(field), description, default: field.default };\n\tswitch (field.type) {\n\t\tcase 'number':\n\t\tcase 'int': {\n\t\t\tconst unit = field.unit ? ` (${field.unit})` : '';\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tdescription: description + unit,\n\t\t\t\ttype: field.type === 'int' ? 'integer' : 'number',\n\t\t\t\t...(field.min !== undefined ? { minimum: field.min } : {}),\n\t\t\t\t...(field.max !== undefined ? { maximum: field.max } : {})\n\t\t\t};\n\t\t}\n\t\tcase 'boolean':\n\t\t\treturn { ...base, type: 'boolean' };\n\t\tcase 'choice': {\n\t\t\tconst options = getChoiceOptions(field);\n\t\t\treturn { ...base, enum: options.map((o) => o.value) };\n\t\t}\n\t\tcase 'color':\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\ttype: 'string',\n\t\t\t\tdescription: `${description} (hex colour${field.alpha ? ' with alpha, #rrggbbaa' : ', #rrggbb'})`,\n\t\t\t\tpattern: field.alpha ? '^#?([0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$' : '^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$'\n\t\t\t};\n\t\tcase 'vector': {\n\t\t\tconst size = vectorSize(field);\n\t\t\tconst items: JsonSchema = { type: 'number' };\n\t\t\tif (typeof field.min === 'number') items.minimum = field.min;\n\t\t\tif (typeof field.max === 'number') items.maximum = field.max;\n\t\t\treturn { ...base, type: 'array', items, minItems: size, maxItems: size };\n\t\t}\n\t\tcase 'image':\n\t\t\treturn { ...base, type: 'string', description: `${description} (image URL, \"\" for none)` };\n\t\tcase 'text':\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\ttype: 'string',\n\t\t\t\t...(field.minLength !== undefined ? { minLength: field.minLength } : {}),\n\t\t\t\t...(field.maxLength !== undefined ? { maxLength: field.maxLength } : {})\n\t\t\t};\n\t}\n}\n\n/** The schema's values as one object JSON Schema (every property optional). */\nexport function parameterSchemaToJsonSchema(schema: ParameterSchema): JsonSchema & { type: 'object' } {\n\tconst properties: Record<string, JsonSchema> = {};\n\tfor (const field of getParameterFields(schema)) properties[field.id] = parameterFieldToJsonSchema(field);\n\treturn { type: 'object', properties, additionalProperties: false };\n}\n","import type { ParameterKeyframe, ParameterKeyframes, ParameterKeyState, ParameterTrack } from './types.js';\n\n/** Keyframes closer than this (ms) to the playhead count as \"at\" it (default for the controller). */\nexport const PARAMETER_KEY_TOLERANCE = 0.5;\n\n/** Whether a track has a keyframe within `tolerance` ms of `time`. */\nexport function findParameterKeyframe(track: ParameterTrack<any> | undefined, time: number, tolerance = PARAMETER_KEY_TOLERANCE): number {\n\tif (!track) return -1;\n\treturn track.keyframes.findIndex((k) => Math.abs(k.time - time) <= tolerance);\n}\n\n/** `keyed` (a key at `time`), `animated` (keys elsewhere) or `none`. */\nexport function getParameterKeyState(track: ParameterTrack<any> | undefined, time: number, tolerance = PARAMETER_KEY_TOLERANCE): ParameterKeyState {\n\tif (!track || track.keyframes.length === 0) return 'none';\n\treturn findParameterKeyframe(track, time, tolerance) >= 0 ? 'keyed' : 'animated';\n}\n\nconst sortKeys = <T>(keys: ParameterKeyframe<T>[]) => keys.sort((a, b) => a.time - b.time);\n\n/** A copy of `track` with a key at `time` holding `value` (replacing one already there). */\nexport function withParameterKeyframe<T>(track: ParameterTrack<T> | undefined, key: ParameterKeyframe<T>, tolerance = PARAMETER_KEY_TOLERANCE): ParameterTrack<T> {\n\tconst keyframes = [...(track?.keyframes ?? [])];\n\tconst at = findParameterKeyframe(track, key.time, tolerance);\n\tif (at >= 0) keyframes[at] = { ...keyframes[at], value: key.value, ...(key.easing !== undefined ? { easing: key.easing } : {}) };\n\telse keyframes.push({ ...key });\n\treturn { ...(track ?? {}), keyframes: sortKeys(keyframes) };\n}\n\n/** A copy of `track` without the key at `time`; `undefined` when no keys remain. */\nexport function withoutParameterKeyframe<T>(track: ParameterTrack<T> | undefined, time: number, tolerance = PARAMETER_KEY_TOLERANCE): ParameterTrack<T> | undefined {\n\tif (!track) return undefined;\n\tconst keyframes = track.keyframes.filter((k) => Math.abs(k.time - time) > tolerance);\n\treturn keyframes.length ? { ...track, keyframes } : undefined;\n}\n\nexport interface ParameterKeyframeStore extends ParameterKeyframes {\n\t/** Every track (id → track). Stable between changes. */\n\tgetTracks(): Readonly<Record<string, ParameterTrack<any>>>;\n\t/** Replaces every track (no notification when `silent`). */\n\tsetTracks(tracks: Record<string, ParameterTrack<any>>, silent?: boolean): void;\n\tsubscribe(listener: () => void): () => void;\n}\n\n/**\n * An in-memory `ParameterKeyframes` adapter for apps that keep tracks next to their values\n * (an effect document can implement the interface over its own storage instead).\n */\nexport function createParameterKeyframeStore(initial: Record<string, ParameterTrack<any>> = {}): ParameterKeyframeStore {\n\tlet tracks: Record<string, ParameterTrack<any>> = { ...initial };\n\tconst listeners = new Set<() => void>();\n\tconst emit = () => listeners.forEach((l) => l());\n\treturn {\n\t\tgetTrack: (id) => tracks[id],\n\t\tgetTracks: () => tracks,\n\t\tsetTrack(id, track) {\n\t\t\tconst next = { ...tracks };\n\t\t\tif (track && track.keyframes.length > 0) next[id] = { ...track, keyframes: sortKeys([...track.keyframes]) };\n\t\t\telse delete next[id];\n\t\t\ttracks = next;\n\t\t\temit();\n\t\t},\n\t\tsetTracks(next, silent) {\n\t\t\ttracks = { ...next };\n\t\t\tif (!silent) emit();\n\t\t},\n\t\tsubscribe(listener) {\n\t\t\tlisteners.add(listener);\n\t\t\treturn () => listeners.delete(listener);\n\t\t}\n\t};\n}\n","import { HistoryManager } from '../history/HistoryManager.js';\nimport type { Command, HistoryState } from '../history/types.js';\nimport { findParameterKeyframe, getParameterKeyState, PARAMETER_KEY_TOLERANCE, withoutParameterKeyframe, withParameterKeyframe } from './keyframes.js';\nimport {\n\tcheckParameterSchema,\n\tcloneValue,\n\tcoerceParameterValue,\n\tgetChoiceOptions,\n\tgetParameterDefaults,\n\tgetParameterFields,\n\tgetParameterGroups,\n\tgetParameterVisibility,\n\tnormalizeHexColor,\n\tParameterSchemaError,\n\tparameterLabel,\n\tparameterStep,\n\tparameterValuesEqual,\n\tvectorComponentField,\n\tvectorSize\n} from './schema.js';\nimport type {\n\tParameterError,\n\tParameterField,\n\tParameterKeyframes,\n\tParameterKeyState,\n\tParameterPreset,\n\tParameterSchema,\n\tParameterTrack,\n\tParameterValue,\n\tParameterValues\n} from './types.js';\n\nexport interface ParametersControllerOptions {\n\tschema: ParameterSchema;\n\t/** Starting values (missing or invalid ones use the default; invalid ones are reported in `errors`). */\n\tvalues?: Partial<ParameterValues>;\n\t/** User presets (the schema's presets are added as built-in). */\n\tpresets?: readonly ParameterPreset[];\n\t/** History to record into, e.g. one shared with the rest of the app (default: a new one). */\n\thistory?: HistoryManager;\n\t/** Where keyframes live. Without it, keyframe methods do nothing. */\n\tkeyframes?: ParameterKeyframes;\n\t/** Starting playhead time in ms (default 0). */\n\ttime?: number;\n\t/** Keys within this many ms of the playhead count as \"at\" it (default 0.5). */\n\tkeyTolerance?: number;\n\t/** Random source for `randomize` (default `Math.random`). */\n\trandom?: () => number;\n\t/** Called after values change (set, undo, preset, load, …) with the ids that changed. */\n\tonChange?: (values: Readonly<ParameterValues>, changed: readonly string[]) => void;\n}\n\n/** A snapshot of the controller. The same object is returned until something changes. */\nexport interface ParametersState {\n\tschema: ParameterSchema;\n\t/** Every field in schema order (groups flattened). */\n\tfields: readonly ParameterField[];\n\tvalues: Readonly<ParameterValues>;\n\tdefaults: Readonly<ParameterValues>;\n\t/** Field and group id → shown (see `showIf`). */\n\tvisible: Readonly<Record<string, boolean>>;\n\t/** Group id → collapsed. */\n\tcollapsed: Readonly<Record<string, boolean>>;\n\t/** Field id → the last rejected value's error (cleared when the field is next set). */\n\terrors: Readonly<Record<string, string>>;\n\t/** Built-in presets first, then user presets. */\n\tpresets: readonly ParameterPreset[];\n\t/** The first preset whose values match the current values, if any. */\n\tactivePreset: string | null;\n\t/** Any value differs from its default. */\n\tmodified: boolean;\n\t/** Playhead time in ms (for keyframes). */\n\ttime: number;\n\t/** Whether a keyframes adapter is attached. */\n\tkeyframesEnabled: boolean;\n\t/** Field id → keyframe state at `time`. */\n\tkeys: Readonly<Record<string, ParameterKeyState>>;\n\t/** The gesture in progress (a field id), if any. */\n\tgesture: string | null;\n\tcanUndo: boolean;\n\tcanRedo: boolean;\n\tundoLabel: string;\n\tredoLabel: string;\n\t/** Bumped on every change. */\n\trevision: number;\n}\n\nexport type ParameterSetResult = { ok: true; value: ParameterValue } | { ok: false; error: ParameterError; message: string };\n\nexport type ParameterSetValuesResult =\n\t| { ok: true; values: Partial<ParameterValues>; changed: string[] }\n\t| { ok: false; errors: ParameterError[]; message: string };\n\nexport type ParameterActionResult = { ok: true } | { ok: false; message: string };\n\nexport interface SetParameterOptions {\n\t/** Undo step label (default \"Change <label>\"). */\n\tlabel?: string;\n}\n\nexport interface RandomizeParametersOptions {\n\t/** Only these fields (default: every visible field that allows it). */\n\tids?: readonly string[];\n\t/** Seed for a repeatable result. */\n\tseed?: number;\n\t/** Random source (default: the controller's). */\n\trandom?: () => number;\n}\n\nexport interface ApplyPresetOptions {\n\t/** Keep values the preset leaves out (default: they go back to their defaults). */\n\tmerge?: boolean;\n}\n\n/** What `toJSON` returns and `load` takes. */\nexport interface ParametersSnapshot {\n\tvalues: Partial<ParameterValues>;\n\t/** User presets. */\n\tpresets?: ParameterPreset[];\n}\n\ninterface Change {\n\tvalues?: { before: Partial<ParameterValues>; after: Partial<ParameterValues> };\n\tpresets?: { before: ParameterPreset[]; after: ParameterPreset[] };\n\ttracks?: Record<string, { before: ParameterTrack | undefined; after: ParameterTrack | undefined }>;\n}\n\n/** A repeatable random source (mulberry32). */\nexport function seededRandom(seed: number): () => number {\n\tlet a = seed >>> 0;\n\treturn () => {\n\t\ta = (a + 0x6d2b79f5) >>> 0;\n\t\tlet t = a;\n\t\tt = Math.imul(t ^ (t >>> 15), t | 1);\n\t\tt ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n\t\treturn ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n\t};\n}\n\nconst unknownMessage = (id: string, fields: readonly ParameterField[]) =>\n\t`There is no parameter \"${id}\"; expected one of ${fields.map((f) => `\"${f.id}\"`).join(', ')}.`;\n\n/**\n * Headless state for a parameters panel: values with validation, undo (slider drags merge\n * into one step), reset, randomize, presets and optional keyframe hooks. `getState()` returns\n * the same object until something changes, so it works with `useSyncExternalStore`.\n */\nexport class ParametersController {\n\treadonly history: HistoryManager;\n\tprivate schema: ParameterSchema;\n\tprivate fields: ParameterField[] = [];\n\tprivate fieldMap = new Map<string, ParameterField>();\n\tprivate defaults: ParameterValues = {};\n\tprivate values: ParameterValues = {};\n\tprivate userPresets: ParameterPreset[];\n\tprivate collapsed: Record<string, boolean> = {};\n\tprivate errors: Record<string, string> = {};\n\tprivate time: number;\n\tprivate keyframes?: ParameterKeyframes;\n\tprivate readonly keyTolerance: number;\n\tprivate readonly random: () => number;\n\tprivate readonly onChange?: ParametersControllerOptions['onChange'];\n\tprivate readonly listeners = new Set<(state: ParametersState) => void>();\n\tprivate readonly cleanups: Array<() => void> = [];\n\tprivate gestureId: string | null = null;\n\tprivate gestureCount = 0;\n\tprivate revision = 0;\n\tprivate applying = false;\n\tprivate state!: ParametersState;\n\n\tconstructor(options: ParametersControllerOptions) {\n\t\tthis.history = options.history ?? new HistoryManager();\n\t\tthis.schema = options.schema;\n\t\tthis.userPresets = (options.presets ?? []).map((p) => ({ ...p, values: { ...p.values }, builtIn: false }));\n\t\tthis.time = options.time ?? 0;\n\t\tthis.keyframes = options.keyframes;\n\t\tthis.keyTolerance = options.keyTolerance ?? PARAMETER_KEY_TOLERANCE;\n\t\tthis.random = options.random ?? Math.random;\n\t\tthis.onChange = options.onChange;\n\t\tthis.indexSchema(options.schema);\n\t\tfor (const group of getParameterGroups(this.schema)) if (group.collapsed) this.collapsed[group.id] = true;\n\t\tthis.values = this.adopt(options.values ?? {}, this.defaults);\n\t\tthis.state = this.computeState();\n\t\tthis.cleanups.push(\n\t\t\tthis.history.subscribe((h) => {\n\t\t\t\t// Edits notify as they apply; only re-notify when the undo/redo state moved on.\n\t\t\t\tconst s = this.state;\n\t\t\t\tif (this.applying || (s.canUndo === h.canUndo && s.canRedo === h.canRedo && s.undoLabel === h.undoName && s.redoLabel === h.redoName)) return;\n\t\t\t\tthis.notify();\n\t\t\t})\n\t\t);\n\t\tthis.watchKeyframes();\n\t}\n\n\tprivate unwatchKeyframes?: () => void;\n\n\tprivate watchKeyframes() {\n\t\tthis.unwatchKeyframes?.();\n\t\tthis.unwatchKeyframes = this.keyframes?.subscribe?.(() => {\n\t\t\tif (!this.applying) this.notify();\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// State\n\t// -------------------------------------------------------------------------\n\n\t/** The current snapshot (stable until the next change). */\n\tgetState = (): ParametersState => this.state;\n\n\t/** Calls `listener` after every change. Returns an unsubscribe function. */\n\tsubscribe = (listener: (state: ParametersState) => void): (() => void) => {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t};\n\n\tgetSchema(): ParameterSchema {\n\t\treturn this.schema;\n\t}\n\n\tgetField(id: string): ParameterField | undefined {\n\t\treturn this.fieldMap.get(id);\n\t}\n\n\tgetValue(id: string): ParameterValue | undefined {\n\t\treturn this.values[id];\n\t}\n\n\tgetValues(): Readonly<ParameterValues> {\n\t\treturn this.values;\n\t}\n\n\tprivate indexSchema(schema: ParameterSchema) {\n\t\tconst problems = checkParameterSchema(schema);\n\t\tif (problems.length) throw new ParameterSchemaError(problems.join(' '));\n\t\tthis.fields = getParameterFields(schema);\n\t\tthis.fieldMap = new Map(this.fields.map((f) => [f.id, f]));\n\t\tthis.defaults = getParameterDefaults(schema);\n\t}\n\n\t/** Values for every field: valid entries of `values`, else `fallback`. Invalid ones are reported. */\n\tprivate adopt(values: Partial<ParameterValues>, fallback: ParameterValues): ParameterValues {\n\t\tconst out: ParameterValues = {};\n\t\tfor (const field of this.fields) {\n\t\t\tconst raw = values[field.id];\n\t\t\tif (raw === undefined) {\n\t\t\t\tout[field.id] = cloneValue(fallback[field.id] ?? field.default);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst result = coerceParameterValue(field, raw);\n\t\t\tif (result.ok) out[field.id] = result.value;\n\t\t\telse {\n\t\t\t\tout[field.id] = cloneValue(fallback[field.id] ?? field.default);\n\t\t\t\tthis.errors = { ...this.errors, [field.id]: result.error.message };\n\t\t\t}\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate allPresets(): ParameterPreset[] {\n\t\tconst builtIn = (this.schema.presets ?? []).map((p) => ({ ...p, builtIn: true }));\n\t\tconst names = new Set(builtIn.map((p) => p.name));\n\t\treturn [...builtIn, ...this.userPresets.filter((p) => !names.has(p.name))];\n\t}\n\n\tprivate presetValues(preset: ParameterPreset, base: ParameterValues): ParameterValues {\n\t\tconst out: ParameterValues = { ...base };\n\t\tfor (const field of this.fields) {\n\t\t\tconst raw = preset.values[field.id];\n\t\t\tif (raw === undefined) continue;\n\t\t\tconst result = coerceParameterValue(field, raw);\n\t\t\tif (result.ok) out[field.id] = result.value;\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate computeState(): ParametersState {\n\t\tconst history: HistoryState = this.history.getState();\n\t\tconst presets = this.allPresets();\n\t\tconst keys: Record<string, ParameterKeyState> = {};\n\t\tif (this.keyframes) {\n\t\t\tfor (const field of this.fields) keys[field.id] = getParameterKeyState(this.keyframes.getTrack(field.id), this.time, this.keyTolerance);\n\t\t}\n\t\tconst same = (a: ParameterValues) => this.fields.every((f) => parameterValuesEqual(a[f.id], this.values[f.id]));\n\t\treturn {\n\t\t\tschema: this.schema,\n\t\t\tfields: this.fields,\n\t\t\tvalues: this.values,\n\t\t\tdefaults: this.defaults,\n\t\t\tvisible: getParameterVisibility(this.schema, this.values),\n\t\t\tcollapsed: this.collapsed,\n\t\t\terrors: this.errors,\n\t\t\tpresets,\n\t\t\tactivePreset: presets.find((p) => same(this.presetValues(p, this.defaults)))?.name ?? null,\n\t\t\tmodified: !same(this.defaults),\n\t\t\ttime: this.time,\n\t\t\tkeyframesEnabled: !!this.keyframes,\n\t\t\tkeys,\n\t\t\tgesture: this.gestureId,\n\t\t\tcanUndo: history.canUndo,\n\t\t\tcanRedo: history.canRedo,\n\t\t\tundoLabel: history.undoName,\n\t\t\tredoLabel: history.redoName,\n\t\t\trevision: this.revision\n\t\t};\n\t}\n\n\tprivate notify(changed: readonly string[] = []) {\n\t\tthis.revision++;\n\t\tthis.state = this.computeState();\n\t\tif (changed.length) this.onChange?.(this.values, changed);\n\t\tconst state = this.state;\n\t\tthis.listeners.forEach((listener) => {\n\t\t\ttry {\n\t\t\t\tlistener(state);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[ParametersController] Error in state listener:', error);\n\t\t\t}\n\t\t});\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Changes (all edits go through one undoable command shape)\n\t// -------------------------------------------------------------------------\n\n\tprivate apply(change: Change, side: 'before' | 'after') {\n\t\tconst changed: string[] = [];\n\t\tthis.applying = true;\n\t\ttry {\n\t\t\tif (change.values) {\n\t\t\t\tconst patch = change.values[side];\n\t\t\t\tconst next = { ...this.values };\n\t\t\t\tfor (const [id, value] of Object.entries(patch)) {\n\t\t\t\t\tif (!this.fieldMap.has(id) || value === undefined) continue;\n\t\t\t\t\tnext[id] = cloneValue(value);\n\t\t\t\t\tchanged.push(id);\n\t\t\t\t\tif (id in this.errors) {\n\t\t\t\t\t\tconst { [id]: _, ...rest } = this.errors;\n\t\t\t\t\t\tthis.errors = rest;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.values = next;\n\t\t\t}\n\t\t\tif (change.presets) this.userPresets = change.presets[side].map((p) => ({ ...p }));\n\t\t\tif (change.tracks && this.keyframes) {\n\t\t\t\tfor (const [id, t] of Object.entries(change.tracks)) this.keyframes.setTrack(id, t[side]);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.applying = false;\n\t\t}\n\t\tthis.notify(changed);\n\t}\n\n\tprivate command(name: string, change: Change, tag?: string): Command {\n\t\treturn {\n\t\t\tname,\n\t\t\ttag,\n\t\t\texecute: () => this.apply(change, 'after'),\n\t\t\tundo: () => this.apply(change, 'before'),\n\t\t\tredo: () => this.apply(change, 'after')\n\t\t};\n\t}\n\n\t/** Track updates that keep keys at the playhead in step with new values. */\n\tprivate keyUpdates(after: Partial<ParameterValues>): Change['tracks'] {\n\t\tif (!this.keyframes) return undefined;\n\t\tlet tracks: Change['tracks'];\n\t\tfor (const [id, value] of Object.entries(after)) {\n\t\t\tconst track = this.keyframes.getTrack(id);\n\t\t\tif (value === undefined || findParameterKeyframe(track, this.time, this.keyTolerance) < 0) continue;\n\t\t\t(tracks ??= {})[id] = { before: track, after: withParameterKeyframe(track, { time: this.time, value }, this.keyTolerance) };\n\t\t}\n\t\treturn tracks;\n\t}\n\n\tprivate record(name: string, after: Partial<ParameterValues>, extra: Omit<Change, 'values'> = {}) {\n\t\tconst before: Partial<ParameterValues> = {};\n\t\tfor (const id of Object.keys(after)) before[id] = cloneValue(this.values[id]);\n\t\tconst tracks = { ...(this.keyUpdates(after) ?? {}), ...(extra.tracks ?? {}) };\n\t\tconst change: Change = { values: { before, after }, ...extra, ...(Object.keys(tracks).length ? { tracks } : {}) };\n\t\tthis.history.execute(this.command(name, change));\n\t}\n\n\tprivate reject(errors: ParameterError[]) {\n\t\tconst next = { ...this.errors };\n\t\tfor (const e of errors) next[e.id] = e.message;\n\t\tthis.errors = next;\n\t\tthis.notify();\n\t}\n\n\t/** Only the entries of `values` that differ from the current values. */\n\tprivate diff(values: Partial<ParameterValues>): Partial<ParameterValues> {\n\t\tconst out: Partial<ParameterValues> = {};\n\t\tfor (const [id, value] of Object.entries(values)) {\n\t\t\tif (value !== undefined && !parameterValuesEqual(this.values[id], value)) out[id] = value;\n\t\t}\n\t\treturn out;\n\t}\n\n\tprivate clearErrors(ids: readonly string[]) {\n\t\tif (!ids.some((id) => id in this.errors)) return false;\n\t\tconst next = { ...this.errors };\n\t\tfor (const id of ids) delete next[id];\n\t\tthis.errors = next;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Sets one value after validating it (`int`s round, colours normalise). Invalid values are\n\t * not stored; the error is returned and shown in `state.errors`. One undo step, or part of\n\t * the current gesture (see `beginGesture`).\n\t */\n\tsetValue(id: string, value: unknown, options: SetParameterOptions = {}): ParameterSetResult {\n\t\tconst field = this.fieldMap.get(id);\n\t\tif (!field) {\n\t\t\tconst message = unknownMessage(id, this.fields);\n\t\t\treturn { ok: false, error: { id, path: `/${id}`, message }, message };\n\t\t}\n\t\tconst result = coerceParameterValue(field, value);\n\t\tif (!result.ok) {\n\t\t\tthis.reject([result.error]);\n\t\t\treturn { ok: false, error: result.error, message: result.error.message };\n\t\t}\n\t\tif (parameterValuesEqual(this.values[id], result.value)) {\n\t\t\tif (this.clearErrors([id])) this.notify();\n\t\t\treturn { ok: true, value: result.value };\n\t\t}\n\t\tconst name = options.label ?? `Change ${parameterLabel(field)}`;\n\t\tif (this.gestureId !== null) {\n\t\t\tconst after = { [id]: result.value };\n\t\t\tconst before = { [id]: cloneValue(this.values[id]) };\n\t\t\tconst tracks = this.keyUpdates(after);\n\t\t\tconst change: Change = { values: { before, after }, ...(tracks ? { tracks } : {}) };\n\t\t\tthis.history.executeMerged(this.command(name, change, `parameters.set:${id}`), {\n\t\t\t\tkey: `parameters.gesture:${this.gestureId}:${this.gestureCount}`\n\t\t\t});\n\t\t} else {\n\t\t\tthis.record(name, { [id]: result.value });\n\t\t}\n\t\treturn { ok: true, value: result.value };\n\t}\n\n\t/**\n\t * Sets several values as one undo step. All-or-nothing: if any id is unknown or any value\n\t * invalid, nothing changes and every error is returned.\n\t */\n\tsetValues(values: Partial<ParameterValues> | Record<string, unknown>, options: SetParameterOptions = {}): ParameterSetValuesResult {\n\t\tconst errors: ParameterError[] = [];\n\t\tconst coerced: Partial<ParameterValues> = {};\n\t\tfor (const [id, raw] of Object.entries(values)) {\n\t\t\tif (raw === undefined) continue;\n\t\t\tconst field = this.fieldMap.get(id);\n\t\t\tif (!field) {\n\t\t\t\terrors.push({ id, path: `/${id}`, message: unknownMessage(id, this.fields) });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst result = coerceParameterValue(field, raw);\n\t\t\tif (result.ok) coerced[id] = result.value;\n\t\t\telse errors.push(result.error);\n\t\t}\n\t\tif (errors.length) {\n\t\t\tthis.reject(errors.filter((e) => this.fieldMap.has(e.id)));\n\t\t\treturn { ok: false, errors, message: errors.map((e) => e.message).join(' ') };\n\t\t}\n\t\tconst after = this.diff(coerced);\n\t\tconst changed = Object.keys(after);\n\t\tif (changed.length) {\n\t\t\tconst label = options.label ?? (changed.length === 1 ? `Change ${parameterLabel(this.fieldMap.get(changed[0])!)}` : 'Change parameters');\n\t\t\tthis.record(label, after);\n\t\t} else if (this.clearErrors(Object.keys(coerced))) this.notify();\n\t\treturn { ok: true, values: coerced, changed };\n\t}\n\n\t/**\n\t * Starts a continuous edit of `id` (a slider drag): every `setValue` until `endGesture()`\n\t * merges into one undo step.\n\t */\n\tbeginGesture(id: string): void {\n\t\tif (this.gestureId === id) return;\n\t\tthis.history.endGesture();\n\t\tthis.gestureId = id;\n\t\tthis.gestureCount++;\n\t\tthis.notify();\n\t}\n\n\t/** Ends the current gesture; the next change is a new undo step. */\n\tendGesture(): void {\n\t\tif (this.gestureId === null) return;\n\t\tthis.gestureId = null;\n\t\tthis.history.endGesture();\n\t\tthis.notify();\n\t}\n\n\t/** Puts fields (default: all) back to their defaults as one undo step. */\n\treset(ids?: readonly string[]): ParameterActionResult {\n\t\tconst targets = ids ?? this.fields.map((f) => f.id);\n\t\tconst unknown = targets.find((id) => !this.fieldMap.has(id));\n\t\tif (unknown) return { ok: false, message: unknownMessage(unknown, this.fields) };\n\t\tconst after = this.diff(Object.fromEntries(targets.map((id) => [id, cloneValue(this.defaults[id])])));\n\t\tconst changed = Object.keys(after);\n\t\tif (changed.length) {\n\t\t\tconst label = ids && changed.length === 1 ? `Reset ${parameterLabel(this.fieldMap.get(changed[0])!)}` : 'Reset parameters';\n\t\t\tthis.record(label, after);\n\t\t} else if (this.clearErrors(targets)) this.notify();\n\t\treturn { ok: true };\n\t}\n\n\t/**\n\t * Picks random values within each field's range, snapped to its step, as one undo step.\n\t * Skips hidden fields, `randomize: false`, `readOnly`, image and text fields, and numbers\n\t * without both `min` and `max`.\n\t */\n\trandomize(options: RandomizeParametersOptions = {}): ParameterSetValuesResult {\n\t\tconst rand = options.random ?? (options.seed !== undefined ? seededRandom(options.seed) : this.random);\n\t\tconst visible = this.state.visible;\n\t\tconst explicit = options.ids !== undefined;\n\t\tconst errors: ParameterError[] = [];\n\t\tconst after: Partial<ParameterValues> = {};\n\t\tfor (const id of options.ids ?? this.fields.map((f) => f.id)) {\n\t\t\tconst field = this.fieldMap.get(id);\n\t\t\tif (!field) {\n\t\t\t\terrors.push({ id, path: `/${id}`, message: unknownMessage(id, this.fields) });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!explicit && (!visible[id] || field.randomize === false || field.readOnly)) continue;\n\t\t\tconst value = randomValue(field, this.values[id], rand);\n\t\t\tif (value !== undefined) after[id] = value;\n\t\t}\n\t\tif (errors.length) return { ok: false, errors, message: errors.map((e) => e.message).join(' ') };\n\t\tconst diff = this.diff(after);\n\t\tconst changed = Object.keys(diff);\n\t\tif (changed.length) this.record('Randomize parameters', diff);\n\t\treturn { ok: true, values: after, changed };\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Presets\n\t// -------------------------------------------------------------------------\n\n\t/** Applies a preset as one undo step. Fields it leaves out return to their defaults unless `merge`. */\n\tapplyPreset(name: string, options: ApplyPresetOptions = {}): ParameterActionResult {\n\t\tconst preset = this.allPresets().find((p) => p.name === name);\n\t\tif (!preset) return { ok: false, message: this.unknownPreset(name) };\n\t\tconst target = this.presetValues(preset, options.merge ? this.values : this.defaults);\n\t\tconst after = this.diff(target);\n\t\tif (Object.keys(after).length) this.record(`Apply preset \"${name}\"`, after);\n\t\treturn { ok: true };\n\t}\n\n\t/** Saves the current values (all fields) as a user preset, replacing one with the same name. Undoable. */\n\tsavePreset(name: string, options: { description?: string } = {}): ParameterActionResult {\n\t\tconst trimmed = name.trim();\n\t\tif (!trimmed) return { ok: false, message: 'A preset needs a name.' };\n\t\tif ((this.schema.presets ?? []).some((p) => p.name === trimmed)) {\n\t\t\treturn { ok: false, message: `\"${trimmed}\" is a built-in preset; save under another name.` };\n\t\t}\n\t\tconst preset: ParameterPreset = { name: trimmed, values: Object.fromEntries(this.fields.map((f) => [f.id, cloneValue(this.values[f.id])])) };\n\t\tif (options.description) preset.description = options.description;\n\t\tconst before = this.userPresets;\n\t\tconst at = before.findIndex((p) => p.name === trimmed);\n\t\tconst after = at >= 0 ? before.map((p, i) => (i === at ? preset : p)) : [...before, preset];\n\t\tthis.history.execute(this.command(`Save preset \"${trimmed}\"`, { presets: { before, after } }));\n\t\treturn { ok: true };\n\t}\n\n\t/** Deletes a user preset (built-in presets cannot be deleted). Undoable. */\n\tdeletePreset(name: string): ParameterActionResult {\n\t\tif ((this.schema.presets ?? []).some((p) => p.name === name)) {\n\t\t\treturn { ok: false, message: `\"${name}\" is a built-in preset and cannot be deleted.` };\n\t\t}\n\t\tconst before = this.userPresets;\n\t\tif (!before.some((p) => p.name === name)) return { ok: false, message: this.unknownPreset(name) };\n\t\tconst after = before.filter((p) => p.name !== name);\n\t\tthis.history.execute(this.command(`Delete preset \"${name}\"`, { presets: { before, after } }));\n\t\treturn { ok: true };\n\t}\n\n\tprivate unknownPreset(name: string) {\n\t\tconst names = this.allPresets().map((p) => `\"${p.name}\"`);\n\t\treturn `There is no preset \"${name}\"; ${names.length ? `expected one of ${names.join(', ')}` : 'none are saved yet'}.`;\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Keyframes\n\t// -------------------------------------------------------------------------\n\n\t/** Moves the playhead. `values` (e.g. evaluated from the tracks) are shown without an undo step. */\n\tsetTime(time: number, values?: Partial<ParameterValues>): void {\n\t\tconst t = Number.isFinite(time) ? Math.max(0, time) : 0;\n\t\tconst changed: string[] = [];\n\t\tif (values) {\n\t\t\tconst next = { ...this.values };\n\t\t\tfor (const [id, raw] of Object.entries(values)) {\n\t\t\t\tconst field = this.fieldMap.get(id);\n\t\t\t\tif (!field || raw === undefined) continue;\n\t\t\t\tconst result = coerceParameterValue(field, raw);\n\t\t\t\tif (result.ok && !parameterValuesEqual(next[id], result.value)) {\n\t\t\t\t\tnext[id] = result.value;\n\t\t\t\t\tchanged.push(id);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.values = next;\n\t\t}\n\t\tif (t === this.time && changed.length === 0) return;\n\t\tthis.time = t;\n\t\tthis.notify(changed);\n\t}\n\n\t/** `keyed`, `animated` or `none` for a field at `time` (default: the playhead). */\n\tkeyState(id: string, time = this.time): ParameterKeyState {\n\t\tif (!this.keyframes) return 'none';\n\t\treturn getParameterKeyState(this.keyframes.getTrack(id), time, this.keyTolerance);\n\t}\n\n\t/** Attaches (or with `undefined` detaches) a keyframes adapter. */\n\tsetKeyframes(keyframes: ParameterKeyframes | undefined): void {\n\t\tthis.keyframes = keyframes;\n\t\tthis.watchKeyframes();\n\t\tthis.notify();\n\t}\n\n\t/**\n\t * Adds a keyframe with the field's current value at `time` (default: the playhead), or\n\t * removes the one already there. One undo step.\n\t */\n\ttoggleKeyframe(id: string, time = this.time): { ok: true; keyed: boolean } | { ok: false; message: string } {\n\t\tif (!this.keyframes) return { ok: false, message: 'Keyframes are not available here.' };\n\t\tconst field = this.fieldMap.get(id);\n\t\tif (!field) return { ok: false, message: unknownMessage(id, this.fields) };\n\t\tconst before = this.keyframes.getTrack(id);\n\t\tconst keyed = findParameterKeyframe(before, time, this.keyTolerance) >= 0;\n\t\tconst after = keyed\n\t\t\t? withoutParameterKeyframe(before, time, this.keyTolerance)\n\t\t\t: withParameterKeyframe(before, { time, value: cloneValue(this.values[id]) }, this.keyTolerance);\n\t\tconst label = `${keyed ? 'Remove keyframe from' : 'Add keyframe to'} ${parameterLabel(field)}`;\n\t\tthis.history.execute(this.command(label, { tracks: { [id]: { before, after } } }));\n\t\treturn { ok: true, keyed: !keyed };\n\t}\n\n\t// -------------------------------------------------------------------------\n\t// Groups, schema, persistence, history\n\t// -------------------------------------------------------------------------\n\n\t/** Collapses or expands a group (view state; not an undo step). */\n\tsetCollapsed(groupId: string, collapsed: boolean): void {\n\t\tif (!!this.collapsed[groupId] === collapsed) return;\n\t\tconst next = { ...this.collapsed };\n\t\tif (collapsed) next[groupId] = true;\n\t\telse delete next[groupId];\n\t\tthis.collapsed = next;\n\t\tthis.notify();\n\t}\n\n\ttoggleCollapsed(groupId: string): void {\n\t\tthis.setCollapsed(groupId, !this.collapsed[groupId]);\n\t}\n\n\t/**\n\t * Replaces the schema (e.g. after a shader recompiles). Values that still fit their field\n\t * are kept; others reset to the new default. Not an undo step; throws a\n\t * `ParameterSchemaError` for an invalid schema.\n\t */\n\tsetSchema(schema: ParameterSchema): void {\n\t\tconst old = this.values;\n\t\tthis.indexSchema(schema);\n\t\tthis.schema = schema;\n\t\tconst kept: ParameterValues = {};\n\t\tfor (const field of this.fields) {\n\t\t\tconst result = old[field.id] === undefined ? null : coerceParameterValue(field, old[field.id]);\n\t\t\tkept[field.id] = result?.ok ? result.value : cloneValue(this.defaults[field.id]);\n\t\t}\n\t\tconst changed = this.fields.filter((f) => !parameterValuesEqual(old[f.id], kept[f.id])).map((f) => f.id);\n\t\tthis.values = kept;\n\t\tthis.errors = Object.fromEntries(Object.entries(this.errors).filter(([id]) => this.fieldMap.has(id)));\n\t\tfor (const group of getParameterGroups(schema)) if (group.collapsed && !(group.id in this.collapsed)) this.collapsed[group.id] = true;\n\t\tthis.collapsed = { ...this.collapsed };\n\t\tthis.notify(changed);\n\t}\n\n\t/** Values and user presets, for saving. */\n\ttoJSON(): ParametersSnapshot {\n\t\treturn {\n\t\t\tvalues: Object.fromEntries(this.fields.map((f) => [f.id, cloneValue(this.values[f.id])])),\n\t\t\tpresets: this.userPresets.map(({ builtIn: _, ...p }) => ({ ...p, values: { ...p.values } }))\n\t\t};\n\t}\n\n\t/**\n\t * Replaces values (and user presets, when given) without an undo step, e.g. when opening a\n\t * document. Missing values use defaults; invalid ones use defaults and are reported in\n\t * `state.errors`. Clears the history when `clearHistory` is true.\n\t */\n\tload(snapshot: ParametersSnapshot, options: { clearHistory?: boolean } = {}): void {\n\t\tconst old = this.values;\n\t\tthis.errors = {};\n\t\tthis.values = this.adopt(snapshot.values ?? {}, this.defaults);\n\t\tif (snapshot.presets) this.userPresets = snapshot.presets.map((p) => ({ ...p, values: { ...p.values }, builtIn: false }));\n\t\tconst changed = this.fields.filter((f) => !parameterValuesEqual(old[f.id], this.values[f.id])).map((f) => f.id);\n\t\tif (options.clearHistory) {\n\t\t\tthis.applying = true;\n\t\t\ttry {\n\t\t\t\tthis.history.clear();\n\t\t\t} finally {\n\t\t\t\tthis.applying = false;\n\t\t\t}\n\t\t}\n\t\tthis.notify(changed);\n\t}\n\n\tundo(): boolean {\n\t\tthis.endGesture();\n\t\treturn this.history.undo();\n\t}\n\n\tredo(): boolean {\n\t\tthis.endGesture();\n\t\treturn this.history.redo();\n\t}\n\n\t/** Stops listening to the history and keyframes adapter. */\n\tdestroy(): void {\n\t\tthis.cleanups.splice(0).forEach((fn) => fn());\n\t\tthis.unwatchKeyframes?.();\n\t\tthis.unwatchKeyframes = undefined;\n\t\tthis.listeners.clear();\n\t}\n}\n\nexport function createParametersController(options: ParametersControllerOptions): ParametersController {\n\treturn new ParametersController(options);\n}\n\nfunction randomNumber(rand: () => number, min: number, max: number, step: number, int: boolean): number {\n\tconst raw = min + rand() * (max - min);\n\tconst snapped = step > 0 ? min + Math.round((raw - min) / step) * step : raw;\n\tconst v = Math.min(max, Math.max(min, snapped));\n\treturn int ? Math.round(v) : Math.round(v * 1e6) / 1e6;\n}\n\n/** A random value for a field, or `undefined` when it cannot be randomised. */\nfunction randomValue(field: ParameterField, current: ParameterValue | undefined, rand: () => number): ParameterValue | undefined {\n\tswitch (field.type) {\n\t\tcase 'number':\n\t\tcase 'int':\n\t\t\tif (field.min === undefined || field.max === undefined) return undefined;\n\t\t\treturn randomNumber(rand, field.min, field.max, parameterStep(field), field.type === 'int');\n\t\tcase 'boolean':\n\t\t\treturn rand() < 0.5;\n\t\tcase 'choice': {\n\t\t\tconst options = getChoiceOptions(field);\n\t\t\treturn options[Math.min(options.length - 1, Math.floor(rand() * options.length))].value;\n\t\t}\n\t\tcase 'color': {\n\t\t\tconst rgb = Array.from({ length: 3 }, () => Math.floor(rand() * 256).toString(16).padStart(2, '0')).join('');\n\t\t\tconst alpha = field.alpha ? (normalizeHexColor(String(current ?? field.default), true) ?? '#000000ff').slice(7) : '';\n\t\t\treturn `#${rgb}${alpha}`;\n\t\t}\n\t\tcase 'vector': {\n\t\t\tconst out: number[] = [];\n\t\t\tfor (let i = 0; i < vectorSize(field); i++) {\n\t\t\t\tconst c = vectorComponentField(field, i);\n\t\t\t\tconst now = Array.isArray(current) ? current[i] : c.default;\n\t\t\t\tout.push(c.min === undefined || c.max === undefined ? now : randomNumber(rand, c.min, c.max, parameterStep(c), false));\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n","import type { CommandSpec } from '../commands/registry.js';\nimport type { ParametersController } from './controller.js';\nimport { getChoiceOptions, parameterFieldToJsonSchema, parameterLabel, parameterSchemaToJsonSchema, vectorSize } from './schema.js';\nimport type { ParameterField, ParameterValue } from './types.js';\n\nexport interface ParameterCommandOptions {\n\t/** Id prefix (default `parameters.`); use one per panel when several are registered. */\n\tprefix?: string;\n\t/** Palette group (default `Parameters`, or the schema's title). */\n\tgroup?: string;\n\t/** Command scope. Omit for global commands. */\n\tscope?: string;\n}\n\n/** A field as listed for agents: its JSON Schema plus current value and visibility. */\nexport interface ParameterListing {\n\tid: string;\n\tlabel: string;\n\ttype: ParameterField['type'];\n\tdescription?: string;\n\tvalue: ParameterValue;\n\tdefault: ParameterValue;\n\tvisible: boolean;\n\tkeyframe?: 'none' | 'animated' | 'keyed';\n\tschema: Record<string, unknown>;\n}\n\nconst fail = (message: string): never => {\n\tthrow new Error(message);\n};\n\nconst IDS = { type: 'array', items: { type: 'string' }, description: 'Parameter ids (default: all).' } as const;\n\n/**\n * Palette and agent commands for a parameters panel: list, set (validated, one undo step),\n * reset, randomize, presets and keyframe toggles. Register them in a `CommandRegistry` and\n * agents get them through `createCommandToolProvider`. Failures throw sentences, which the\n * registry returns as `{ ok: false, code: 'failed', message }`.\n */\nexport function createParameterCommands(controller: ParametersController, options: ParameterCommandOptions = {}): CommandSpec[] {\n\tconst prefix = options.prefix ?? 'parameters.';\n\tconst group = options.group ?? controller.getSchema().title ?? 'Parameters';\n\tconst base = { group, ...(options.scope ? { scope: options.scope } : {}) };\n\tconst presetNames = () => controller.getState().presets.map((p) => p.name);\n\n\tconst set: CommandSpec = {\n\t\t...base,\n\t\tid: `${prefix}set`,\n\t\tlabel: 'Set Parameters…',\n\t\tkeywords: ['change', 'value', 'control', 'slider'],\n\t\tdescription: 'Sets one or more parameter values as one undo step. Invalid values change nothing and return why.',\n\t\t// A getter so agents always see the current schema (it can change with `setSchema`).\n\t\tget params() {\n\t\t\treturn {\n\t\t\t\ttype: 'object' as const,\n\t\t\t\tproperties: { values: { ...parameterSchemaToJsonSchema(controller.getSchema()), description: 'Parameter id → new value.' } },\n\t\t\t\trequired: ['values']\n\t\t\t};\n\t\t},\n\t\trun: (_ctx: unknown, params: { values: Record<string, unknown> }) => {\n\t\t\tconst result = controller.setValues(params.values);\n\t\t\tif (!result.ok) fail(result.message);\n\t\t\treturn { changed: result.ok ? result.changed : [], values: controller.getValues() };\n\t\t}\n\t};\n\n\tconst commands: CommandSpec[] = [\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}list`,\n\t\t\tlabel: 'List Parameters',\n\t\t\treadOnly: true,\n\t\t\tkeywords: ['controls', 'values', 'schema'],\n\t\t\tdescription: 'Lists every parameter with its type, constraints, current value and default.',\n\t\t\trun: (): { parameters: ParameterListing[]; presets: string[]; time: number } => {\n\t\t\t\tconst state = controller.getState();\n\t\t\t\treturn {\n\t\t\t\t\tparameters: state.fields.map((field) => ({\n\t\t\t\t\t\tid: field.id,\n\t\t\t\t\t\tlabel: parameterLabel(field),\n\t\t\t\t\t\ttype: field.type,\n\t\t\t\t\t\t...(field.description ? { description: field.description } : {}),\n\t\t\t\t\t\tvalue: state.values[field.id],\n\t\t\t\t\t\tdefault: state.defaults[field.id],\n\t\t\t\t\t\tvisible: state.visible[field.id] !== false,\n\t\t\t\t\t\t...(state.keyframesEnabled ? { keyframe: state.keys[field.id] } : {}),\n\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t...parameterFieldToJsonSchema(field),\n\t\t\t\t\t\t\t...(field.type === 'choice' ? { options: getChoiceOptions(field) } : {}),\n\t\t\t\t\t\t\t...(field.type === 'vector' ? { size: vectorSize(field) } : {})\n\t\t\t\t\t\t}\n\t\t\t\t\t})),\n\t\t\t\t\tpresets: presetNames(),\n\t\t\t\t\ttime: state.time\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\tset,\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}reset`,\n\t\t\tlabel: 'Reset Parameters',\n\t\t\tkeywords: ['default', 'revert', 'clear'],\n\t\t\tdescription: 'Puts parameters back to their defaults.',\n\t\t\tparams: { type: 'object', properties: { ids: IDS } },\n\t\t\tenabled: (_ctx: unknown, params: { ids?: string[] } | undefined) => (params?.ids || controller.getState().modified ? true : 'Every parameter is already at its default.'),\n\t\t\trun: (_ctx: unknown, params: { ids?: string[] }) => {\n\t\t\t\tconst result = controller.reset(params?.ids);\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { values: controller.getValues() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}randomize`,\n\t\t\tlabel: 'Randomize Parameters',\n\t\t\tkeywords: ['random', 'shuffle', 'surprise', 'explore'],\n\t\t\tdescription: 'Picks random values within each parameter range (visible fields only unless `ids` is given).',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { ids: IDS, seed: { type: 'integer', description: 'Seed for a repeatable result.' } }\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: { ids?: string[]; seed?: number }) => {\n\t\t\t\tconst result = controller.randomize({ ids: params?.ids, seed: params?.seed });\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { changed: result.ok ? result.changed : [], values: controller.getValues() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}applyPreset`,\n\t\t\tlabel: 'Apply Parameter Preset…',\n\t\t\tkeywords: ['preset', 'look', 'style'],\n\t\t\tdescription: 'Applies a preset; parameters it leaves out return to their defaults unless `merge` is true.',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { name: { type: 'string', description: 'Preset name (see parameters list).' }, merge: { type: 'boolean' } },\n\t\t\t\trequired: ['name']\n\t\t\t},\n\t\t\tenabled: () => (presetNames().length ? true : 'There are no presets.'),\n\t\t\trun: (_ctx: unknown, params: { name: string; merge?: boolean }) => {\n\t\t\t\tconst result = controller.applyPreset(params.name, { merge: params.merge });\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { values: controller.getValues() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}savePreset`,\n\t\t\tlabel: 'Save Parameter Preset…',\n\t\t\tkeywords: ['preset', 'store', 'remember'],\n\t\t\tdescription: 'Saves the current values as a preset (replacing a user preset with the same name).',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { name: { type: 'string', minLength: 1 }, description: { type: 'string' } },\n\t\t\t\trequired: ['name']\n\t\t\t},\n\t\t\trun: (_ctx: unknown, params: { name: string; description?: string }) => {\n\t\t\t\tconst result = controller.savePreset(params.name, { description: params.description });\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { presets: presetNames() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}deletePreset`,\n\t\t\tlabel: 'Delete Parameter Preset…',\n\t\t\tkeywords: ['preset', 'remove'],\n\t\t\tparams: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },\n\t\t\tenabled: () => (controller.getState().presets.some((p) => !p.builtIn) ? true : 'There are no saved presets.'),\n\t\t\trun: (_ctx: unknown, params: { name: string }) => {\n\t\t\t\tconst result = controller.deletePreset(params.name);\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { presets: presetNames() };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}toggleKeyframe`,\n\t\t\tlabel: 'Toggle Parameter Keyframe…',\n\t\t\tkeywords: ['key', 'animate', 'diamond'],\n\t\t\tdescription: 'Adds a keyframe with the current value at `time` (default: the playhead), or removes the one there.',\n\t\t\tparams: {\n\t\t\t\ttype: 'object',\n\t\t\t\tproperties: { id: { type: 'string', description: 'Parameter id.' }, time: { type: 'number', minimum: 0, description: 'Time in ms.' } },\n\t\t\t\trequired: ['id']\n\t\t\t},\n\t\t\tenabled: () => (controller.getState().keyframesEnabled ? true : 'Keyframes are not available here.'),\n\t\t\trun: (_ctx: unknown, params: { id: string; time?: number }) => {\n\t\t\t\tconst result = controller.toggleKeyframe(params.id, params.time);\n\t\t\t\tif (!result.ok) fail(result.message);\n\t\t\t\treturn { keyed: result.ok && result.keyed, time: params.time ?? controller.getState().time };\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}undo`,\n\t\t\tlabel: 'Undo Parameter Change',\n\t\t\thidden: true,\n\t\t\tenabled: () => (controller.getState().canUndo ? true : 'Nothing to undo.'),\n\t\t\trun: () => controller.undo()\n\t\t},\n\t\t{\n\t\t\t...base,\n\t\t\tid: `${prefix}redo`,\n\t\t\tlabel: 'Redo Parameter Change',\n\t\t\thidden: true,\n\t\t\tenabled: () => (controller.getState().canRedo ? true : 'Nothing to redo.'),\n\t\t\trun: () => controller.redo()\n\t\t}\n\t];\n\treturn commands;\n}\n","import { hexToRgba01, rgba01ToHex } from './schema.js';\nimport type { ParameterField, ParameterSchema, ParameterValue } from './types.js';\n\n/** A shader uniform type that can be a control (Flair's `@control` uniforms). */\nexport type ShaderControlType = 'float' | 'int' | 'bool' | 'vec2' | 'vec3' | 'vec4' | 'sampler2D';\n\n/** A shader control value: a number, a boolean, vector components (colours are 0–1) or an image URL. */\nexport type ShaderControlValue = number | boolean | number[] | string;\n\n/**\n * The shape of a parsed shader control, e.g. Flair's `ControlDef`\n * (`uniform vec3 uTint; // @control color default=#77C16A`).\n */\nexport interface ShaderControlLike {\n\tname: string;\n\ttype: ShaderControlType;\n\tlabel?: string;\n\t/** A `vec3` / `vec4` shown as a colour picker. */\n\tcolor?: boolean;\n\tmin?: number;\n\tmax?: number;\n\tstep?: number;\n\tdefault: ShaderControlValue;\n\tdescription?: string;\n}\n\nconst SIZES: Record<string, 2 | 3 | 4> = { vec2: 2, vec3: 3, vec4: 4 };\n\n/** One shader control as a parameter field (colour vectors become hex `color` fields). */\nexport function parameterFieldFromShaderControl(control: ShaderControlLike): ParameterField {\n\tconst common = {\n\t\tid: control.name,\n\t\t...(control.label ? { label: control.label } : {}),\n\t\t...(control.description ? { description: control.description } : {})\n\t};\n\tswitch (control.type) {\n\t\tcase 'bool':\n\t\t\treturn { ...common, type: 'boolean', default: control.default === true };\n\t\tcase 'sampler2D':\n\t\t\treturn { ...common, type: 'image', default: typeof control.default === 'string' ? control.default : '' };\n\t\tcase 'float':\n\t\tcase 'int':\n\t\t\treturn {\n\t\t\t\t...common,\n\t\t\t\ttype: control.type === 'int' ? 'int' : 'number',\n\t\t\t\tdefault: typeof control.default === 'number' ? control.default : 0,\n\t\t\t\t...(control.min !== undefined ? { min: control.min } : {}),\n\t\t\t\t...(control.max !== undefined ? { max: control.max } : {}),\n\t\t\t\t...(control.step !== undefined ? { step: control.step } : {})\n\t\t\t};\n\t\tdefault: {\n\t\t\tconst size = SIZES[control.type];\n\t\t\tconst components = Array.isArray(control.default) ? control.default : Array.from({ length: size }, () => 0);\n\t\t\tif (control.color && size >= 3) {\n\t\t\t\treturn { ...common, type: 'color', alpha: size === 4, default: rgba01ToHex(components, size === 4) };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...common,\n\t\t\t\ttype: 'vector',\n\t\t\t\tsize,\n\t\t\t\tdefault: Array.from({ length: size }, (_, i) => components[i] ?? 0),\n\t\t\t\t...(control.min !== undefined ? { min: control.min } : {}),\n\t\t\t\t...(control.max !== undefined ? { max: control.max } : {}),\n\t\t\t\t...(control.step !== undefined ? { step: control.step } : {})\n\t\t\t};\n\t\t}\n\t}\n}\n\n/** A parameter schema for a shader's controls, in source order. */\nexport function parameterSchemaFromShaderControls(controls: readonly ShaderControlLike[], options: { title?: string } = {}): ParameterSchema {\n\treturn { ...(options.title ? { title: options.title } : {}), fields: controls.map(parameterFieldFromShaderControl) };\n}\n\n/** A parameter value as the shader takes it: hex colours become 0–1 RGB(A) arrays. */\nexport function shaderControlValue(control: ShaderControlLike, value: ParameterValue): ShaderControlValue {\n\tif (control.color && typeof value === 'string') {\n\t\treturn hexToRgba01(value, control.type === 'vec4') ?? (control.default as number[]);\n\t}\n\treturn value;\n}\n\n/** A shader control value as a parameter value: colour arrays become hex. */\nexport function parameterValueFromShaderControl(control: ShaderControlLike, value: ShaderControlValue): ParameterValue {\n\tif (control.color && Array.isArray(value)) return rgba01ToHex(value, control.type === 'vec4');\n\treturn value;\n}\n","import { evaluateEasing, type AnimationEasing } from '../animation/easing.js';\n\nexport interface RangeMapperOptions {\n\t/**\n\t * Input domain [min, max]. Defaults to [0, 1].\n\t */\n\tfrom?: readonly [number, number];\n\n\t/**\n\t * Output range [min, max]. Defaults to [0, 1].\n\t */\n\tto?: readonly [number, number];\n\n\t/**\n\t * Optional easing function, preset name, or descriptor applied to normalized progress.\n\t */\n\teasing?: AnimationEasing | string | ((t: number) => number);\n\n\t/**\n\t * Whether to clamp input values to the [from[0], from[1]] domain before mapping.\n\t * Defaults to true.\n\t */\n\tclamp?: boolean;\n}\n\nexport type RangeMapper = (value: number) => number;\n\n/**\n * Creates a reusable function that maps numbers from an input interval to an output interval,\n * with optional clamping and easing curve application (inspired by Rive's DataConverterRangeMapper).\n */\nexport function createRangeMapper(options: RangeMapperOptions = {}): RangeMapper {\n\tconst [inMin, inMax] = options.from ?? [0, 1];\n\tconst [outMin, outMax] = options.to ?? [0, 1];\n\tconst shouldClamp = options.clamp ?? true;\n\tconst easing = options.easing;\n\n\tconst inSpan = inMax - inMin;\n\tconst outSpan = outMax - outMin;\n\n\treturn function map(value: number): number {\n\t\tif (!Number.isFinite(value)) return outMin;\n\n\t\t// Degenerate input range: avoid division by zero\n\t\tif (Math.abs(inSpan) < 1e-12) {\n\t\t\treturn outMin;\n\t\t}\n\n\t\tlet normalized = (value - inMin) / inSpan;\n\n\t\tif (shouldClamp) {\n\t\t\tnormalized = Math.min(1, Math.max(0, normalized));\n\t\t}\n\n\t\tlet progress = normalized;\n\t\tif (easing !== undefined && easing !== null) {\n\t\t\tif (typeof easing === 'function') {\n\t\t\t\tprogress = easing(normalized);\n\t\t\t} else {\n\t\t\t\tprogress = evaluateEasing(easing, normalized);\n\t\t\t}\n\t\t}\n\n\t\treturn outMin + progress * outSpan;\n\t};\n}\n\n/**\n * One-off helper to map a value from one interval to another with optional clamping and easing.\n */\nexport function mapRange(\n\tvalue: number,\n\tfrom: readonly [number, number],\n\tto: readonly [number, number],\n\toptions?: Omit<RangeMapperOptions, 'from' | 'to'>\n): number {\n\treturn createRangeMapper({ from, to, ...options })(value);\n}\n"],"mappings":"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","names":[]}
|