@decantr/essence-spec 3.1.0 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/schema/essence.v4.json +1 -1
package/README.md
CHANGED
|
@@ -39,7 +39,7 @@ const violations = evaluateGuard(essence, {});
|
|
|
39
39
|
|
|
40
40
|
## Compatibility
|
|
41
41
|
|
|
42
|
-
`@decantr/essence-spec` defines the active Essence v4 public contract for Decantr
|
|
42
|
+
`@decantr/essence-spec` defines the active Essence v4 public contract for Decantr 3. Runtime validation accepts v4 only; older Essence v2/v3 files are supported through `decantr migrate --to v4`.
|
|
43
43
|
|
|
44
44
|
- additive schema fields may be introduced in compatible minor releases
|
|
45
45
|
- breaking schema or migration behavior changes require a major version
|
package/dist/index.js
CHANGED
|
@@ -576,7 +576,6 @@ function migrateGuard(mode) {
|
|
|
576
576
|
return { mode: "strict", dna_enforcement: "error", blueprint_enforcement: "warn" };
|
|
577
577
|
case "guided":
|
|
578
578
|
return { mode: "guided", dna_enforcement: "error", blueprint_enforcement: "off" };
|
|
579
|
-
case "creative":
|
|
580
579
|
default:
|
|
581
580
|
return { mode: "creative", dna_enforcement: "off", blueprint_enforcement: "off" };
|
|
582
581
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/density.ts","../src/types.ts","../src/guard.ts","../src/migrate.ts","../src/normalize.ts","../src/validate.ts"],"sourcesContent":["import type { Density, DensityLevel, SpatialTokenHints, SpatialTokens } from './types.js';\n\ninterface SpatialHints {\n density_bias?: number;\n content_gap_shift?: number;\n}\n\ninterface DensityRule {\n traits: string[];\n level: DensityLevel;\n gap: number;\n}\n\nconst RULES: DensityRule[] = [\n { traits: ['tactical', 'dense', 'data-dense', 'utilitarian'], level: 'compact', gap: 3 },\n { traits: ['luxurious', 'premium', 'editorial'], level: 'spacious', gap: 8 },\n { traits: ['playful', 'bouncy', 'expressive'], level: 'comfortable', gap: 5 },\n { traits: ['minimal', 'clean', 'airy'], level: 'spacious', gap: 6 },\n { traits: ['professional', 'modern', 'balanced'], level: 'comfortable', gap: 4 },\n];\n\nconst MIN_GAP = 2;\nconst MAX_GAP = 10;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function computeDensity(personality: string[], spatialHints?: SpatialHints): Density {\n const lower = personality.map((c) => c.toLowerCase());\n\n let level: DensityLevel = 'comfortable';\n let gap = 4;\n\n for (const rule of RULES) {\n if (rule.traits.some((t) => lower.includes(t))) {\n level = rule.level;\n gap = rule.gap;\n break;\n }\n }\n\n if (spatialHints?.density_bias) {\n gap += spatialHints.density_bias;\n }\n if (spatialHints?.content_gap_shift) {\n gap += spatialHints.content_gap_shift;\n }\n\n gap = clamp(gap, MIN_GAP, MAX_GAP);\n\n if (gap <= 3) level = 'compact';\n else if (gap >= 6) level = 'spacious';\n else level = 'comfortable';\n\n return { level, content_gap: String(gap) };\n}\n\n// --- Spatial Tokens ---\n\nconst DENSITY_SCALES: Record<DensityLevel, number> = {\n compact: 0.65,\n comfortable: 1.0,\n spacious: 1.4,\n};\n\nconst BASE_TOKENS = {\n '--d-section-py': 5,\n '--d-interactive-py': 0.5,\n '--d-interactive-px': 1,\n '--d-surface-p': 1.25,\n '--d-data-py': 0.625,\n '--d-control-py': 0.5,\n '--d-content-gap': 1,\n '--d-label-mb': 0.75,\n '--d-label-px': 0.75,\n '--d-section-gap': 1.5,\n '--d-annotation-mt': 0.5,\n} as const;\n\nfunction roundTo3(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n\nfunction toRemString(value: number): string {\n const rounded = roundTo3(value);\n return `${rounded}rem`;\n}\n\nexport function computeSpatialTokens(\n density: DensityLevel,\n spatialHints?: SpatialTokenHints,\n): SpatialTokens {\n const scale = DENSITY_SCALES[density];\n const biasMultiplier = 1 + (spatialHints?.density_bias ?? 0) / 10;\n\n const result = {} as SpatialTokens;\n\n for (const [key, base] of Object.entries(BASE_TOKENS)) {\n const tokenKey = key as keyof SpatialTokens;\n\n // --d-label-px is a visual anchor — never density-scaled\n if (tokenKey === '--d-label-px') {\n result[tokenKey] = toRemString(base);\n continue;\n }\n\n if (tokenKey === '--d-section-py' && spatialHints?.section_padding) {\n const pxMatch = spatialHints.section_padding.match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (pxMatch) {\n const remValue = parseFloat(pxMatch[1]) / 16;\n result[tokenKey] = toRemString(remValue * scale * biasMultiplier);\n continue;\n }\n const remMatch = spatialHints.section_padding.match(/^(\\d+(?:\\.\\d+)?)rem$/);\n if (remMatch) {\n const remValue = parseFloat(remMatch[1]);\n result[tokenKey] = toRemString(remValue * scale * biasMultiplier);\n continue;\n }\n }\n\n // --d-label-mb can be overridden by theme's label_content_gap\n if (tokenKey === '--d-label-mb' && spatialHints?.label_content_gap) {\n const remMatch = spatialHints.label_content_gap.match(/^(\\d+(?:\\.\\d+)?)rem$/);\n if (remMatch) {\n const remValue = parseFloat(remMatch[1]);\n result[tokenKey] = toRemString(remValue * scale * biasMultiplier);\n continue;\n }\n }\n\n let computed = base * scale * biasMultiplier;\n\n if (tokenKey === '--d-content-gap' && spatialHints?.content_gap_shift) {\n computed += spatialHints.content_gap_shift * 0.25;\n }\n\n result[tokenKey] = toRemString(computed);\n }\n\n return result;\n}\n","/**\n * Essence v4 active contract types.\n *\n * Decantr V2 treats Essence v4 as the only active runtime contract. Older\n * Essence v2/v3 document shapes remain modeled only so `decantr migrate --to v4`\n * can upgrade existing projects.\n */\n\n// --- Theme ---\n\nexport type ThemeStyle =\n | 'auradecantism'\n | 'clean'\n | 'glassmorphism'\n | 'retro'\n | 'bioluminescent'\n | 'launchpad'\n | 'dopamine'\n | 'editorial'\n | 'liquid-glass'\n | 'prismatic';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto';\nexport type ThemeShape = 'sharp' | 'rounded' | 'pill';\n\nexport interface Theme {\n id: string;\n mode: ThemeMode;\n shape?: ThemeShape;\n}\n\n// --- Platform ---\n\nexport type PlatformType = 'spa' | 'ssr' | 'static';\nexport type RoutingStrategy = 'hash' | 'history' | 'pathname';\n\nexport interface Platform {\n type: PlatformType;\n routing: RoutingStrategy;\n}\n\n// --- Structure ---\n\nexport type ShellType =\n | 'sidebar-main'\n | 'top-nav-main'\n | 'full-bleed'\n | 'dashboard'\n | 'stacked'\n | string;\n\nexport type LayoutItem = string | PatternRef | ColumnLayout;\n\nexport interface PatternRef {\n pattern: string;\n preset?: string;\n as?: string;\n}\n\nexport interface ColumnLayout {\n /**\n * Column entries. Each entry is either a pattern id string OR a\n * PatternRef object with `pattern`, optional `preset`, and optional\n * `as` alias. Mixing the two forms is permitted by the schema.\n * Consumers MUST normalize via `getColumnId` / `getColumnAlias` before\n * using as a Map key, joining into strings, or rendering — otherwise\n * objects produce `[object Object]` in serialized output.\n */\n cols: (string | PatternRef)[];\n at?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n span?: Record<string, number>;\n // AUTO: Multi-breakpoint grid — array of { at, cols } entries for cascading breakpoints\n breakpoints?: { at: string; cols: number }[];\n // AUTO: \"container\" uses container queries instead of viewport breakpoints\n responsive?: 'viewport' | 'container';\n}\n\n/** Extract the pattern id string from a column entry. */\nexport function getColumnId(col: string | PatternRef): string {\n return typeof col === 'string' ? col : col.pattern;\n}\n\n/** Extract the alias for a column entry (defaults to pattern id when no `as`). */\nexport function getColumnAlias(col: string | PatternRef): string {\n if (typeof col === 'string') return col;\n return col.as ?? col.pattern;\n}\n\n/** Extract the optional preset for a column entry, or undefined. */\nexport function getColumnPreset(col: string | PatternRef): string | undefined {\n if (typeof col === 'string') return undefined;\n return col.preset;\n}\n\nexport interface StructurePage {\n id: string;\n shell: ShellType;\n layout: LayoutItem[];\n surface?: string;\n}\n\n// --- Density ---\n\nexport type DensityLevel = 'compact' | 'comfortable' | 'spacious';\n\nexport interface Density {\n level: DensityLevel;\n content_gap: string;\n}\n\nexport interface SpatialTokens {\n '--d-section-py': string;\n '--d-interactive-py': string;\n '--d-interactive-px': string;\n '--d-surface-p': string;\n '--d-data-py': string;\n '--d-control-py': string;\n '--d-content-gap': string;\n '--d-label-mb': string;\n '--d-label-px': string;\n '--d-section-gap': string;\n '--d-annotation-mt': string;\n}\n\nexport interface SpatialTokenHints {\n section_padding?: string | null;\n density_bias?: number;\n content_gap_shift?: number;\n label_content_gap?: string | null;\n}\n\nexport interface ShellGuidance {\n section_label_treatment?: string;\n section_density?: DensityLevel;\n [key: string]: string | DensityLevel | undefined;\n}\n\n// --- Guard ---\n\nexport type GuardMode = 'creative' | 'guided' | 'strict';\n\nexport interface Guard {\n enforce_style?: boolean;\n mode: GuardMode;\n}\n\n// --- Impression ---\n\nexport interface Impression {\n vibe: string[];\n references: string[];\n density_intent: DensityLevel | string;\n layout_intent: ShellType | string;\n novel_elements: string[];\n}\n\n// --- Generator Target ---\n\nexport type GeneratorTarget = 'decantr' | 'react' | 'vue' | 'svelte' | string;\n\n// --- Accessibility ---\n\nexport type WcagLevel = 'none' | 'A' | 'AA' | 'AAA';\n\nexport type CvdPreference =\n | 'none'\n | 'auto'\n | 'deuteranopia'\n | 'protanopia'\n | 'tritanopia'\n | 'achromatopsia';\n\nexport interface Accessibility {\n wcag_level?: WcagLevel;\n cvd_preference?: CvdPreference;\n}\n\n// --- Essence (simple) ---\n\nexport interface Essence {\n $schema?: string;\n version: string;\n archetype: string;\n theme: Theme;\n personality: string[];\n platform: Platform;\n structure: StructurePage[];\n features: string[];\n density: Density;\n guard: Guard;\n target: GeneratorTarget;\n accessibility?: Accessibility;\n _impression?: Impression;\n}\n\n// --- Essence (sectioned) ---\n\nexport interface LegacyEssenceSection {\n id: string;\n path: string;\n archetype: string;\n theme: Theme;\n structure: StructurePage[];\n features?: string[];\n}\n\nexport interface SectionedEssence {\n $schema?: string;\n version: string;\n platform: Platform;\n personality: string[];\n sections: LegacyEssenceSection[];\n shared_features?: string[];\n density: Density;\n guard: Guard;\n target: GeneratorTarget;\n accessibility?: Accessibility;\n _impression?: Impression;\n}\n\n// --- Essence v4: DNA/Blueprint/Meta split ---\n\nexport interface EssenceDNA {\n theme: Theme;\n spacing: {\n base_unit: number;\n scale: string;\n density: DensityLevel;\n content_gap: string;\n };\n typography: {\n scale: string;\n heading_weight: number;\n body_weight: number;\n };\n color: {\n palette: string;\n accent_count: number;\n cvd_preference: CvdPreference | string;\n };\n radius: {\n philosophy: ThemeShape | string;\n base: number;\n };\n elevation: {\n system: string;\n max_levels: number;\n };\n motion: {\n preference: string;\n duration_scale: number;\n reduce_motion: boolean;\n timing?: string;\n durations?: Record<string, string>;\n };\n accessibility: {\n wcag_level: WcagLevel;\n focus_visible: boolean;\n skip_nav: boolean;\n };\n personality: string[];\n constraints?: {\n mode?: string;\n typography?: string;\n borders?: string;\n corners?: string;\n shadows?: string;\n effects?: Record<string, string>;\n };\n}\n\n/** Only density and mode may be overridden per-page. DNA axioms like wcag_level and theme.id are never overrideable. */\nexport interface DNAOverrides {\n density?: DensityLevel;\n mode?: ThemeMode;\n}\n\nexport interface BlueprintPage {\n id: string;\n route?: string;\n shell_override?: ShellType | null;\n layout: LayoutItem[];\n patterns?: PatternRef[];\n dna_overrides?: DNAOverrides;\n surface?: string;\n /**\n * Execution-level directives emitted into the page-pack contract.\n * Short imperative rules that cold LLMs should obey when implementing\n * this route. Belongs in the pack (not the narrative doc).\n */\n directives?: string[];\n}\n\nexport type ArchetypeRole = 'primary' | 'gateway' | 'public' | 'auxiliary';\n\nexport interface SectionNavigationItem {\n label: string;\n route: string;\n icon?: string;\n hotkey?: string;\n /** Regex or path prefix for \"active\" matching. Defaults to exact `route` match. */\n active_match?: string;\n badge?: string;\n}\n\nexport interface EssenceSection {\n id: string;\n role: ArchetypeRole;\n shell: ShellType | string;\n features: string[];\n description: string;\n pages: BlueprintPage[];\n dna_overrides?: DNAOverrides;\n /** Items rendered in the shell's primary navigation for this section. */\n navigation_items?: SectionNavigationItem[];\n /**\n * Execution-level directives emitted into the section-pack contract.\n * Short imperative rules every page in this section must obey.\n * Belongs in the pack (not the narrative doc).\n */\n directives?: string[];\n}\n\nexport interface RouteEntry {\n section: string;\n page: string;\n}\n\nexport interface EssenceBlueprint {\n shell?: ShellType | string;\n sections: EssenceSection[];\n /** Migration-only compatibility. Active v4 documents are sectioned-only. */\n pages?: BlueprintPage[];\n features: string[];\n routes?: Record<string, RouteEntry>;\n icon_style?: string;\n avatar_style?: string;\n}\n\nexport interface EssenceV4Guard {\n mode: GuardMode;\n dna_enforcement: 'error' | 'warn' | 'off';\n blueprint_enforcement: 'warn' | 'off';\n /**\n * Severity for the experiential interactions guard rule. When patterns\n * declare `interactions: [...]` but the source\n * tree is missing the canonical implementations, this controls whether\n * the violation is an error, warning, or ignored.\n *\n * Defaults: `creative` mode → 'off'; `guided` → 'warn'; `strict` → 'error'.\n * Authors can override per-essence.\n */\n interactions_enforcement?: 'error' | 'warn' | 'off';\n}\n\nexport interface EssenceMeta {\n archetype: string;\n target: GeneratorTarget;\n platform: Platform;\n guard: EssenceV4Guard;\n seo?: {\n schema_org?: string[];\n meta_priorities?: string[];\n };\n navigation?: {\n hotkeys?: Array<{\n key: string;\n route?: string;\n action?: string;\n label: string;\n semantics?: HotkeySemantics;\n }>;\n command_palette?: boolean | CommandPaletteContract;\n /** Default hotkey semantics applied to every hotkey unless overridden per-key. */\n hotkey_semantics?: HotkeySemantics;\n };\n}\n\nexport interface CommandPaletteContract {\n /** Platform-neutral hotkey (e.g., 'Cmd+K' → Cmd on Mac, Ctrl elsewhere). */\n trigger?: string;\n placeholder?: string;\n /** Preferred width as a CSS length (e.g., '640px' or '40rem'). */\n width?: string;\n /** Presentation mode. */\n styling?: 'modal' | 'sheet' | 'inline' | 'fullscreen';\n /** Seed command vocabulary. If omitted, LLMs may synthesize a minimal default from declared routes. */\n commands?: Array<{\n id: string;\n label: string;\n section?: string;\n hotkey?: string;\n action?: string;\n route?: string;\n }>;\n}\n\nexport interface HotkeySemantics {\n /** Max ms between keystrokes in a chord before it resets. Typical: 900. */\n chord_window_ms?: number;\n /** If true (default): hotkeys don't fire while focus is in an editable element. */\n input_guard?: boolean;\n /** If true (default): hotkeys don't fire when a modifier is held unless the key string declares it. */\n modifier_suppression?: boolean;\n /** If true: hotkey matching is case-sensitive. Default false — uppercase implies Shift. */\n match_case?: boolean;\n /**\n * If true (default): render the .d-hotkey-indicator corner badge when a chord\n * hotkey prefix is armed. If false: silent chord tracking (no visual feedback).\n * Recommended true for discoverability.\n */\n show_chord_indicator?: boolean;\n}\n\nexport interface EssenceV4 {\n $schema?: string;\n version: '4.0.0';\n dna: EssenceDNA;\n blueprint: EssenceBlueprint;\n meta: EssenceMeta;\n _impression?: Impression;\n}\n\nexport type LegacyEssenceV3 = Omit<EssenceV4, 'version'> & {\n version: '3.0.0' | '3.1.0';\n};\n\n// --- Active and migration unions ---\n\nexport type EssenceFile = EssenceV4;\nexport type LegacyEssenceFile = Essence | SectionedEssence | LegacyEssenceV3 | EssenceV4;\n\nexport function isV4(essence: unknown): essence is EssenceV4 {\n return (\n typeof essence === 'object' &&\n essence !== null &&\n (essence as { version?: unknown }).version === '4.0.0' &&\n 'dna' in essence &&\n 'blueprint' in essence\n );\n}\n\nexport function isLegacyV3(essence: unknown): essence is LegacyEssenceV3 {\n return (\n typeof essence === 'object' &&\n essence !== null &&\n ((essence as { version?: unknown }).version === '3.0.0' ||\n (essence as { version?: unknown }).version === '3.1.0') &&\n 'dna' in essence &&\n 'blueprint' in essence\n );\n}\n\n/** Flatten sections into a flat page list (for guards and backward compat). */\nexport function flattenPages(blueprint: EssenceBlueprint): BlueprintPage[] {\n if (blueprint.sections && blueprint.sections.length > 0) {\n return blueprint.sections.flatMap((s) =>\n s.pages.map((p) => ({\n ...p,\n shell_override:\n p.shell_override ?? (s.shell !== blueprint.shell ? (s.shell as ShellType) : undefined),\n })),\n );\n }\n return blueprint.pages ?? [];\n}\n\nexport function isSectioned(essence: unknown): essence is SectionedEssence {\n if (isV4(essence)) return false;\n return (\n typeof essence === 'object' &&\n essence !== null &&\n 'sections' in essence &&\n Array.isArray((essence as SectionedEssence).sections)\n );\n}\n\nexport function isSimple(essence: unknown): essence is Essence {\n if (isV4(essence)) return false;\n return (\n typeof essence === 'object' &&\n essence !== null &&\n 'archetype' in essence &&\n !('sections' in essence)\n );\n}\n","import type {\n DensityLevel,\n EssenceFile,\n EssenceV4,\n EssenceV4Guard,\n LayoutItem,\n StructurePage,\n} from './types.js';\nimport { flattenPages } from './types.js';\n\nexport interface AutoFix {\n type: 'add_page' | 'update_layout' | 'update_blueprint';\n patch: Record<string, unknown>;\n}\n\nexport interface GuardViolation {\n rule:\n | 'theme'\n | 'structure'\n | 'layout'\n | 'density'\n | 'theme-mode'\n | 'pattern-exists'\n | 'accessibility'\n /**\n * V4 C5. Experiential interactions guard rule. Fires when patterns\n * declare `interactions: [...]` but the source tree is missing the\n * canonical implementations. Severity controlled by\n * `meta.guard.interactions_enforcement` (defaults: creative=off,\n * guided=warn, strict=error).\n */\n | 'interactions';\n severity: 'error' | 'warning';\n message: string;\n suggestion?: string;\n layer?: 'dna' | 'blueprint';\n autoFixable?: boolean;\n autoFix?: AutoFix;\n}\n\nexport interface GuardContext {\n pageId?: string;\n theme?: string;\n /** @deprecated Use `theme` instead. */\n style?: string;\n layout?: string[];\n density_gap?: string;\n themeRegistry?: Map<string, { modes: string[] }>;\n patternRegistry?: Map<string, unknown>;\n a11y_issues?: string[];\n /**\n * V4 C5. Pre-computed list of declared interactions whose canonical\n * implementations are missing from the source tree. Produced by\n * `verifyInteractionsInSource` from @decantr/verifier; passed in here\n * so the guard rule can emit violations without owning the source-scan\n * logic. Mirrors the existing `a11y_issues` pattern.\n *\n * Each entry is a short descriptor like\n * `status-pulse (suggestion: Apply 'd-pulse' to the indicator)`.\n */\n interaction_issues?: string[];\n}\n\n/**\n * Check if the theme supports the specified mode.\n */\nfunction checkThemeModeCompatibility(\n essence: EssenceFile,\n context: GuardContext,\n): GuardViolation | null {\n if (!context.themeRegistry) return null;\n\n const themeId = essence.dna.theme?.id ?? null;\n const mode = essence.dna.theme?.mode ?? null;\n\n if (!themeId || !mode) return null;\n\n const theme = context.themeRegistry.get(themeId);\n if (!theme) {\n // Theme not found - separate validation\n return null;\n }\n\n if (!theme.modes.includes(mode) && mode !== 'auto') {\n const supportedModes = theme.modes.join(', ');\n const suggestion =\n theme.modes.length > 0\n ? `Use mode: \"${theme.modes[0]}\" instead, or choose a theme that supports ${mode} mode.`\n : undefined;\n\n return {\n rule: 'theme-mode',\n severity: 'error',\n message: `Theme \"${themeId}\" does not support \"${mode}\" mode. Supported modes: ${supportedModes}.`,\n suggestion,\n layer: 'dna' as const,\n autoFixable: false,\n };\n }\n\n return null;\n}\n\n/**\n * Collect all pattern IDs from a layout item, recursively handling nested structures.\n * Handles cols entries that are either string ids OR PatternRef objects\n * (the schema permits mixing). Without the object branch, PatternRef cols\n * silently dropped from the registry-existence check, masking missing\n * patterns.\n */\nfunction collectPatternIds(item: LayoutItem, ids: Set<string>): void {\n if (typeof item === 'string') {\n ids.add(item);\n return;\n }\n if (typeof item === 'object' && item !== null) {\n if ('pattern' in item && typeof item.pattern === 'string') {\n ids.add(item.pattern);\n }\n if ('cols' in item && Array.isArray(item.cols)) {\n for (const col of item.cols) {\n if (typeof col === 'string') {\n ids.add(col);\n } else if (\n col &&\n typeof col === 'object' &&\n 'pattern' in col &&\n typeof (col as { pattern: unknown }).pattern === 'string'\n ) {\n ids.add((col as { pattern: string }).pattern);\n }\n }\n }\n }\n}\n\n/**\n * Find similar pattern IDs in the registry for suggestion.\n */\nfunction findSimilarPatterns(target: string, registry: Map<string, unknown>): string[] {\n const similar: string[] = [];\n const targetLower = target.toLowerCase();\n\n for (const id of registry.keys()) {\n const idLower = id.toLowerCase();\n // Simple similarity: contains target or target contains id\n if (idLower.includes(targetLower) || targetLower.includes(idLower)) {\n similar.push(id);\n }\n }\n\n return similar.slice(0, 3); // Top 3 suggestions\n}\n\n/**\n * Check if all referenced patterns exist in the registry.\n */\nfunction checkPatternExistence(essence: EssenceFile, context: GuardContext): GuardViolation[] {\n if (!context.patternRegistry) return [];\n\n const violations: GuardViolation[] = [];\n const referencedPatterns = new Set<string>();\n\n // Collect all pattern references from structure\n const pages = getAllPages(essence);\n for (const page of pages) {\n for (const item of page.layout || []) {\n collectPatternIds(item, referencedPatterns);\n }\n }\n\n // Check each pattern exists\n for (const patternId of referencedPatterns) {\n // Brownfield observed contracts use this placeholder to satisfy the\n // layout schema without pretending an existing app route is a registry\n // pattern. It is intentionally not resolved through the registry.\n if (patternId === 'existing-surface') continue;\n if (!context.patternRegistry.has(patternId)) {\n // Find similar patterns for suggestion\n const similar = findSimilarPatterns(patternId, context.patternRegistry);\n const suggestion =\n similar.length > 0\n ? `Similar patterns: ${similar.join(', ')}`\n : `Run \"decantr search ${patternId}\" to find alternatives.`;\n\n violations.push({\n rule: 'pattern-exists',\n severity: 'warning',\n message: `Pattern \"${patternId}\" is referenced but does not exist in the registry.`,\n suggestion,\n layer: 'blueprint' as const,\n autoFixable: false,\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Check accessibility compliance based on declared WCAG level.\n */\nfunction checkAccessibility(essence: EssenceFile, context: GuardContext): GuardViolation | null {\n const accessibility = essence.dna.accessibility;\n\n if (!accessibility?.wcag_level || accessibility.wcag_level === 'none') {\n return null;\n }\n\n if (context.a11y_issues && context.a11y_issues.length > 0) {\n const issueList = context.a11y_issues.slice(0, 3).join(', ');\n const moreCount =\n context.a11y_issues.length > 3 ? ` (+${context.a11y_issues.length - 3} more)` : '';\n\n return {\n rule: 'accessibility',\n severity: 'error',\n message: `WCAG ${accessibility.wcag_level} compliance required. Issues found: ${issueList}${moreCount}`,\n suggestion:\n 'Fix accessibility issues before proceeding. Run an accessibility audit for details.',\n layer: 'dna' as const,\n autoFixable: false,\n };\n }\n\n return null;\n}\n\n/**\n * V4 C5. Experiential interactions guard rule (8th rule). Patterns\n * declare runtime interactions in pattern.v2.json (e.g., status-pulse,\n * drag-nodes, hover-tooltip). When the source tree doesn't implement\n * those interactions, this rule emits a violation. Source scanning\n * happens in @decantr/verifier; pre-computed results land here as\n * `context.interaction_issues`.\n *\n * Severity is governed by `meta.guard.interactions_enforcement`:\n * - 'error' → emits as error (build fails)\n * - 'warn' → emits as warning (build passes, surfaces in CLI)\n * - 'off' → suppresses entirely\n *\n * Defaults when the field is omitted, derived from guard.mode:\n * - creative → 'off'\n * - guided → 'warn'\n * - strict → 'error'\n */\nfunction checkInteractions(essence: EssenceFile, context: GuardContext): GuardViolation | null {\n if (!context.interaction_issues || context.interaction_issues.length === 0) {\n return null;\n }\n\n const guard = essence.meta.guard;\n\n // Resolve enforcement: explicit field wins, otherwise mode-derived default.\n let enforcement: 'error' | 'warn' | 'off';\n if (guard.interactions_enforcement) {\n enforcement = guard.interactions_enforcement;\n } else if (guard.mode === 'strict') {\n enforcement = 'error';\n } else if (guard.mode === 'guided') {\n enforcement = 'warn';\n } else {\n enforcement = 'off';\n }\n\n if (enforcement === 'off') return null;\n\n const issueList = context.interaction_issues.slice(0, 3).join('; ');\n const moreCount =\n context.interaction_issues.length > 3\n ? ` (+${context.interaction_issues.length - 3} more)`\n : '';\n\n return {\n rule: 'interactions',\n severity: enforcement === 'error' ? 'error' : 'warning',\n message: `Declared pattern interactions are not implemented in source: ${issueList}${moreCount}`,\n suggestion:\n 'See \"Interaction Requirements\" in DECANTR.md for canonical implementations. Each declared interaction maps to a treatment class or handler pattern.',\n layer: 'blueprint' as const,\n autoFixable: false,\n };\n}\n\nexport function evaluateGuard(essence: EssenceFile, context: GuardContext = {}): GuardViolation[] {\n const guard = essence.meta.guard;\n\n if (guard.mode === 'creative') {\n return [];\n }\n\n const violations: GuardViolation[] = [];\n const isStrict = guard.mode === 'strict';\n\n // Rule 1: Theme guard\n const requestedTheme = context.theme ?? context.style;\n if (requestedTheme) {\n const essenceThemeId = essence.dna.theme.id;\n if (essenceThemeId && requestedTheme !== essenceThemeId) {\n violations.push({\n rule: 'theme',\n severity: 'error',\n message: `Theme \"${requestedTheme}\" does not match essence theme \"${essenceThemeId}\". Change the essence theme first.`,\n layer: 'dna' as const,\n autoFixable: false,\n });\n }\n }\n\n // Rule 2: Structure guard (enforced in both guided and strict)\n if (context.pageId) {\n const pages = getAllPages(essence);\n const pageExists = pages.some((p) => p.id === context.pageId);\n if (!pageExists) {\n violations.push({\n rule: 'structure',\n severity: 'warning',\n message: `Page \"${context.pageId}\" does not exist in essence structure. Add it to the essence first.`,\n layer: 'blueprint' as const,\n autoFixable: true,\n autoFix: { type: 'add_page' as const, patch: { id: context.pageId } },\n });\n }\n }\n\n // Rule 3: Layout guard (strict only)\n if (isStrict && context.pageId && context.layout) {\n const pages = getAllPages(essence);\n const page = pages.find((p) => p.id === context.pageId);\n if (page) {\n const essenceLayout = page.layout.map((item) =>\n typeof item === 'string' ? item : 'pattern' in item ? item.pattern : 'cols',\n );\n const proposedLayout = context.layout;\n const matches =\n essenceLayout.length === proposedLayout.length &&\n essenceLayout.every((item, i) => item === proposedLayout[i]);\n if (!matches) {\n violations.push({\n rule: 'layout',\n severity: 'warning',\n message: `Layout for page \"${context.pageId}\" deviates from essence. Expected: [${essenceLayout.join(', ')}].`,\n layer: 'blueprint' as const,\n autoFixable: true,\n autoFix: {\n type: 'update_layout' as const,\n patch: { page: context.pageId, layout: context.layout },\n },\n });\n }\n }\n }\n\n // Rule 4: Density guard (strict only)\n if (isStrict && context.density_gap) {\n const overriddenDensity = getPageDensityOverride(essence, context.pageId);\n const expectedGap = overriddenDensity ?? essence.dna.spacing.content_gap;\n if (context.density_gap !== expectedGap) {\n violations.push({\n rule: 'density',\n severity: 'warning',\n message: `Content gap \"${context.density_gap}\" does not match essence density \"${expectedGap}\".`,\n layer: 'dna' as const,\n autoFixable: false,\n });\n }\n }\n\n // Rule 6: Theme/mode compatibility (always checked when registry available)\n const themeModeViolation = checkThemeModeCompatibility(essence, context);\n if (themeModeViolation) {\n violations.push(themeModeViolation);\n }\n\n // Rule 7: Pattern existence (always checked when registry available)\n const patternViolations = checkPatternExistence(essence, context);\n violations.push(...patternViolations);\n\n // Rule 8: Accessibility (when wcag_level is set, guided and strict modes)\n const accessibilityViolation = checkAccessibility(essence, context);\n if (accessibilityViolation) {\n violations.push(accessibilityViolation);\n }\n\n // Rule 9: Experiential interactions (V4 C5). Only fires when caller\n // pre-computed `interaction_issues` from the source-tree scan; severity\n // governed by `meta.guard.interactions_enforcement` with mode-derived\n // defaults. See checkInteractions for the full resolution table.\n const interactionsViolation = checkInteractions(essence, context);\n if (interactionsViolation) {\n violations.push(interactionsViolation);\n }\n\n const v4Guard = guard as EssenceV4Guard;\n\n // DNA enforcement\n if (v4Guard.dna_enforcement === 'off') {\n // Remove all DNA-layer violations\n return violations.filter((v) => v.layer !== 'dna');\n }\n if (v4Guard.dna_enforcement === 'warn') {\n // Downgrade DNA-layer violations to warning severity\n for (const v of violations) {\n if (v.layer === 'dna') {\n v.severity = 'warning';\n }\n }\n }\n\n // Blueprint enforcement\n if (v4Guard.blueprint_enforcement === 'off') {\n // Remove all blueprint-layer violations\n return violations.filter((v) => v.layer !== 'blueprint');\n }\n\n return violations;\n}\n\nfunction getAllPages(essence: EssenceFile): StructurePage[] {\n const pages = flattenPages(essence.blueprint);\n return pages.map((page) => ({\n id: page.id,\n shell: page.shell_override ?? essence.blueprint.shell ?? '',\n layout: page.layout,\n ...(page.surface ? { surface: page.surface } : {}),\n }));\n}\n\n/** Get per-page density override from the v4 blueprint, if set. */\nfunction getPageDensityOverride(essence: EssenceV4, pageId?: string): string | undefined {\n if (!pageId) return undefined;\n const pages = flattenPages(essence.blueprint);\n const page = pages.find((p) => p.id === pageId);\n if (!page?.dna_overrides?.density) return undefined;\n // Map density level to a content_gap value\n const densityGapMap: Record<DensityLevel, string> = {\n compact: '2',\n comfortable: '4',\n spacious: '6',\n };\n return densityGapMap[page.dna_overrides.density] ?? undefined;\n}\n","import type {\n BlueprintPage,\n DensityLevel,\n Essence,\n EssenceBlueprint,\n EssenceDNA,\n EssenceMeta,\n EssenceSection,\n EssenceV4,\n GuardMode,\n LegacyEssenceV3,\n SectionedEssence,\n ThemeShape,\n} from './types.js';\nimport { isLegacyV3, isSectioned, isSimple, isV4 } from './types.js';\n\n/**\n * Explicit legacy-to-v4 migration path used by `decantr migrate --to v4`.\n * Active Decantr V2 commands do not call this implicitly.\n */\nexport function migrateToV4(input: unknown): EssenceV4 {\n if (isV4(input)) return normalizeV4(input);\n if (isLegacyV3(input)) return migrateLegacyV3ToV4(input);\n if (isSectioned(input)) return migrateSectionedToV4(input);\n if (isSimple(input)) return migrateSimpleToV4(input);\n\n throw new Error('Unknown essence format. Only Essence v2, v3.0, v3.1, and v4 can migrate to v4.');\n}\n\nfunction migrateSimpleToV4(essence: Essence): EssenceV4 {\n const dna = buildDNA(essence);\n const defaultShell = essence.structure[0]?.shell ?? 'top-nav-main';\n const pages = essence.structure.map((page, index) => ({\n id: page.id,\n route: page.id === 'home' || index === 0 ? '/' : `/${page.id}`,\n ...(page.shell !== defaultShell ? { shell_override: page.shell } : {}),\n layout: page.layout,\n ...(page.surface ? { surface: page.surface } : {}),\n }));\n const section: EssenceSection = {\n id: essence.archetype,\n role: 'primary',\n shell: defaultShell,\n features: essence.features ?? [],\n description: `${essence.archetype} primary section`,\n pages,\n };\n\n return {\n version: '4.0.0',\n dna,\n blueprint: buildSectionedBlueprint([section], essence.features ?? []),\n meta: buildMeta(essence),\n ...(essence._impression ? { _impression: essence._impression } : {}),\n };\n}\n\nfunction migrateSectionedToV4(essence: SectionedEssence): EssenceV4 {\n const firstSection = essence.sections[0];\n if (!firstSection) {\n throw new Error('Cannot migrate a sectioned essence with no sections.');\n }\n\n const syntheticSimple: Partial<Essence> = {\n theme: firstSection.theme,\n density: essence.density,\n guard: essence.guard,\n accessibility: essence.accessibility,\n personality: essence.personality,\n };\n\n const sections: EssenceSection[] = essence.sections.map((section) => {\n const defaultShell = section.structure[0]?.shell ?? 'top-nav-main';\n return {\n id: section.id,\n role: 'primary',\n shell: defaultShell,\n features: section.features ?? [],\n description: `${section.archetype} section`,\n pages: section.structure.map((page, index) => ({\n id: page.id,\n route:\n index === 0 && section.path\n ? section.path\n : `${section.path}/${page.id}`.replace(/\\/+/g, '/'),\n ...(page.shell !== defaultShell ? { shell_override: page.shell } : {}),\n layout: page.layout,\n ...(page.surface ? { surface: page.surface } : {}),\n })),\n };\n });\n\n const features = [\n ...(essence.shared_features ?? []),\n ...essence.sections.flatMap((section) => section.features ?? []),\n ];\n\n return {\n version: '4.0.0',\n dna: buildDNA(syntheticSimple as Essence),\n blueprint: buildSectionedBlueprint(sections, [...new Set(features)]),\n meta: {\n archetype: firstSection.archetype,\n target: essence.target,\n platform: essence.platform,\n guard: migrateGuard(essence.guard.mode),\n },\n ...(essence._impression ? { _impression: essence._impression } : {}),\n };\n}\n\nfunction migrateLegacyV3ToV4(essence: LegacyEssenceV3): EssenceV4 {\n const sections =\n essence.blueprint.sections && essence.blueprint.sections.length > 0\n ? essence.blueprint.sections\n : [\n {\n id: essence.meta.archetype,\n role: 'primary' as const,\n shell: essence.blueprint.shell ?? 'top-nav-main',\n features: essence.blueprint.features,\n description: `${essence.meta.archetype} primary section`,\n pages: essence.blueprint.pages ?? [],\n },\n ];\n\n return normalizeV4({\n ...essence,\n version: '4.0.0',\n blueprint: buildSectionedBlueprint(\n sections,\n essence.blueprint.features,\n essence.blueprint.routes,\n ),\n });\n}\n\nfunction normalizeV4(essence: EssenceV4): EssenceV4 {\n return {\n ...essence,\n version: '4.0.0',\n blueprint: buildSectionedBlueprint(\n essence.blueprint.sections,\n essence.blueprint.features,\n essence.blueprint.routes,\n essence.blueprint.shell,\n ),\n };\n}\n\nfunction buildSectionedBlueprint(\n sections: EssenceSection[],\n features: string[],\n existingRoutes?: EssenceBlueprint['routes'],\n shell?: string,\n): EssenceBlueprint {\n const routes: NonNullable<EssenceBlueprint['routes']> = { ...(existingRoutes ?? {}) };\n\n for (const section of sections) {\n for (const page of section.pages) {\n if (!page.route || routes[page.route]) continue;\n routes[page.route] = { section: section.id, page: page.id };\n }\n }\n\n return {\n ...(shell ? { shell } : {}),\n sections,\n features: [...new Set(features)],\n routes,\n };\n}\n\nfunction buildDNA(essence: Essence): EssenceDNA {\n const shape = essence.theme.shape ?? 'rounded';\n\n return {\n theme: {\n id: essence.theme.id,\n mode: essence.theme.mode,\n ...(essence.theme.shape ? { shape: essence.theme.shape } : {}),\n },\n spacing: {\n base_unit: 4,\n scale: 'linear',\n density: (essence.density?.level ?? 'comfortable') as DensityLevel,\n content_gap: essence.density?.content_gap ?? '_gap4',\n },\n typography: {\n scale: 'modular',\n heading_weight: 600,\n body_weight: 400,\n },\n color: {\n palette: 'semantic',\n accent_count: 1,\n cvd_preference: essence.accessibility?.cvd_preference ?? 'auto',\n },\n radius: {\n philosophy: shape,\n base: inferRadiusBase(shape),\n },\n elevation: {\n system: 'layered',\n max_levels: 3,\n },\n motion: {\n preference: 'subtle',\n duration_scale: 1,\n reduce_motion: true,\n },\n accessibility: {\n wcag_level: essence.accessibility?.wcag_level ?? 'AA',\n focus_visible: true,\n skip_nav: true,\n },\n personality: essence.personality ?? ['professional'],\n };\n}\n\nfunction buildMeta(essence: Essence): EssenceMeta {\n return {\n archetype: essence.archetype,\n target: essence.target,\n platform: essence.platform,\n guard: migrateGuard(essence.guard.mode),\n };\n}\n\nfunction migrateGuard(mode: GuardMode): EssenceMeta['guard'] {\n switch (mode) {\n case 'strict':\n return { mode: 'strict', dna_enforcement: 'error', blueprint_enforcement: 'warn' };\n case 'guided':\n return { mode: 'guided', dna_enforcement: 'error', blueprint_enforcement: 'off' };\n case 'creative':\n default:\n return { mode: 'creative', dna_enforcement: 'off', blueprint_enforcement: 'off' };\n }\n}\n\nfunction inferRadiusBase(shape: ThemeShape | string): number {\n switch (shape) {\n case 'pill':\n return 12;\n case 'rounded':\n return 8;\n case 'sharp':\n return 2;\n default:\n return 8;\n }\n}\n","import type { EssenceFile } from './types.js';\nimport { isV4 } from './types.js';\n\nconst V4_REQUIRED_MESSAGE =\n 'Active Decantr V2 workflows require Essence v4.0.0. Run `decantr migrate --to v4` for older essence files.';\n\nexport function normalizeEssence(input: Record<string, unknown>): EssenceFile {\n if (isV4(input)) {\n return input;\n }\n\n throw new Error(V4_REQUIRED_MESSAGE);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport Ajv from 'ajv';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst v2SchemaPath = join(__dirname, '..', 'schema', 'essence.v2.json');\nconst v3SchemaPath = join(__dirname, '..', 'schema', 'essence.v3.json');\nconst v4SchemaPath = join(__dirname, '..', 'schema', 'essence.v4.json');\n\nlet cachedAjv: Ajv | null = null;\nconst validatorCache = new Map<string, ReturnType<Ajv['compile']>>();\n\nfunction getAjv(): Ajv {\n if (!cachedAjv) {\n cachedAjv = new Ajv({ allErrors: true, strict: false, validateSchema: false });\n }\n return cachedAjv;\n}\n\nfunction getValidator(version: 'v2' | 'v3' | 'v4'): ReturnType<Ajv['compile']> | null {\n if (validatorCache.has(version)) return validatorCache.get(version)!;\n\n const schemaPath =\n version === 'v4' ? v4SchemaPath : version === 'v3' ? v3SchemaPath : v2SchemaPath;\n if (!existsSync(schemaPath)) return null;\n\n const schema = JSON.parse(readFileSync(schemaPath, 'utf-8'));\n const ajv = getAjv();\n const validate = ajv.compile(schema);\n validatorCache.set(version, validate);\n return validate;\n}\n\nfunction detectLegacyVersion(data: unknown): 'v2' | 'v3' {\n if (typeof data === 'object' && data !== null && 'version' in data) {\n const v = (data as Record<string, unknown>).version;\n if (v === '3.0.0' || v === '3.1.0') return 'v3';\n }\n return 'v2';\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport function validateEssence(data: unknown): ValidationResult {\n const version =\n typeof data === 'object' && data !== null ? (data as { version?: unknown }).version : undefined;\n if (version !== '4.0.0') {\n return {\n valid: false,\n errors: [\n 'Active Decantr V2 workflows require Essence v4.0.0. Run `decantr migrate --to v4` for older essence files.',\n ],\n };\n }\n\n const validate = getValidator('v4');\n\n if (!validate) {\n return { valid: false, errors: ['No schema available for v4 documents'] };\n }\n\n const valid = validate(data);\n\n if (valid) {\n return { valid: true, errors: [] };\n }\n\n const errors = (validate.errors ?? []).map((err) => {\n const path = err.instancePath || '/';\n const msg = err.message ?? 'unknown error';\n return `${path}: ${msg}`;\n });\n\n return { valid: false, errors };\n}\n\nexport function validateLegacyEssenceForMigration(data: unknown): ValidationResult {\n const version =\n typeof data === 'object' && data !== null && (data as { version?: unknown }).version === '4.0.0'\n ? 'v4'\n : detectLegacyVersion(data);\n const validate = getValidator(version);\n\n if (!validate) {\n return { valid: false, errors: [`No schema available for ${version} documents`] };\n }\n\n const valid = validate(data);\n if (valid) {\n return { valid: true, errors: [] };\n }\n\n const errors = (validate.errors ?? []).map((err) => {\n const path = err.instancePath || '/';\n const msg = err.message ?? 'unknown error';\n return `${path}: ${msg}`;\n });\n\n return { valid: false, errors };\n}\n"],"mappings":";AAaA,IAAM,QAAuB;AAAA,EAC3B,EAAE,QAAQ,CAAC,YAAY,SAAS,cAAc,aAAa,GAAG,OAAO,WAAW,KAAK,EAAE;AAAA,EACvF,EAAE,QAAQ,CAAC,aAAa,WAAW,WAAW,GAAG,OAAO,YAAY,KAAK,EAAE;AAAA,EAC3E,EAAE,QAAQ,CAAC,WAAW,UAAU,YAAY,GAAG,OAAO,eAAe,KAAK,EAAE;AAAA,EAC5E,EAAE,QAAQ,CAAC,WAAW,SAAS,MAAM,GAAG,OAAO,YAAY,KAAK,EAAE;AAAA,EAClE,EAAE,QAAQ,CAAC,gBAAgB,UAAU,UAAU,GAAG,OAAO,eAAe,KAAK,EAAE;AACjF;AAEA,IAAM,UAAU;AAChB,IAAM,UAAU;AAEhB,SAAS,MAAM,OAAe,KAAa,KAAqB;AAC9D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEO,SAAS,eAAe,aAAuB,cAAsC;AAC1F,QAAM,QAAQ,YAAY,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;AAEpD,MAAI,QAAsB;AAC1B,MAAI,MAAM;AAEV,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,OAAO,KAAK,CAAC,MAAM,MAAM,SAAS,CAAC,CAAC,GAAG;AAC9C,cAAQ,KAAK;AACb,YAAM,KAAK;AACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,cAAc;AAC9B,WAAO,aAAa;AAAA,EACtB;AACA,MAAI,cAAc,mBAAmB;AACnC,WAAO,aAAa;AAAA,EACtB;AAEA,QAAM,MAAM,KAAK,SAAS,OAAO;AAEjC,MAAI,OAAO,EAAG,SAAQ;AAAA,WACb,OAAO,EAAG,SAAQ;AAAA,MACtB,SAAQ;AAEb,SAAO,EAAE,OAAO,aAAa,OAAO,GAAG,EAAE;AAC3C;AAIA,IAAM,iBAA+C;AAAA,EACnD,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AACZ;AAEA,IAAM,cAAc;AAAA,EAClB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,qBAAqB;AACvB;AAEA,SAAS,SAAS,OAAuB;AACvC,SAAO,KAAK,MAAM,QAAQ,GAAI,IAAI;AACpC;AAEA,SAAS,YAAY,OAAuB;AAC1C,QAAM,UAAU,SAAS,KAAK;AAC9B,SAAO,GAAG,OAAO;AACnB;AAEO,SAAS,qBACd,SACA,cACe;AACf,QAAM,QAAQ,eAAe,OAAO;AACpC,QAAM,iBAAiB,KAAK,cAAc,gBAAgB,KAAK;AAE/D,QAAM,SAAS,CAAC;AAEhB,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,WAAW,GAAG;AACrD,UAAM,WAAW;AAGjB,QAAI,aAAa,gBAAgB;AAC/B,aAAO,QAAQ,IAAI,YAAY,IAAI;AACnC;AAAA,IACF;AAEA,QAAI,aAAa,oBAAoB,cAAc,iBAAiB;AAClE,YAAM,UAAU,aAAa,gBAAgB,MAAM,qBAAqB;AACxE,UAAI,SAAS;AACX,cAAM,WAAW,WAAW,QAAQ,CAAC,CAAC,IAAI;AAC1C,eAAO,QAAQ,IAAI,YAAY,WAAW,QAAQ,cAAc;AAChE;AAAA,MACF;AACA,YAAM,WAAW,aAAa,gBAAgB,MAAM,sBAAsB;AAC1E,UAAI,UAAU;AACZ,cAAM,WAAW,WAAW,SAAS,CAAC,CAAC;AACvC,eAAO,QAAQ,IAAI,YAAY,WAAW,QAAQ,cAAc;AAChE;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa,kBAAkB,cAAc,mBAAmB;AAClE,YAAM,WAAW,aAAa,kBAAkB,MAAM,sBAAsB;AAC5E,UAAI,UAAU;AACZ,cAAM,WAAW,WAAW,SAAS,CAAC,CAAC;AACvC,eAAO,QAAQ,IAAI,YAAY,WAAW,QAAQ,cAAc;AAChE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,OAAO,QAAQ;AAE9B,QAAI,aAAa,qBAAqB,cAAc,mBAAmB;AACrE,kBAAY,aAAa,oBAAoB;AAAA,IAC/C;AAEA,WAAO,QAAQ,IAAI,YAAY,QAAQ;AAAA,EACzC;AAEA,SAAO;AACT;;;AChEO,SAAS,YAAY,KAAkC;AAC5D,SAAO,OAAO,QAAQ,WAAW,MAAM,IAAI;AAC7C;AAGO,SAAS,eAAe,KAAkC;AAC/D,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,SAAO,IAAI,MAAM,IAAI;AACvB;AAGO,SAAS,gBAAgB,KAA8C;AAC5E,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,SAAO,IAAI;AACb;AAoVO,SAAS,KAAK,SAAwC;AAC3D,SACE,OAAO,YAAY,YACnB,YAAY,QACX,QAAkC,YAAY,WAC/C,SAAS,WACT,eAAe;AAEnB;AAEO,SAAS,WAAW,SAA8C;AACvE,SACE,OAAO,YAAY,YACnB,YAAY,SACV,QAAkC,YAAY,WAC7C,QAAkC,YAAY,YACjD,SAAS,WACT,eAAe;AAEnB;AAGO,SAAS,aAAa,WAA8C;AACzE,MAAI,UAAU,YAAY,UAAU,SAAS,SAAS,GAAG;AACvD,WAAO,UAAU,SAAS;AAAA,MAAQ,CAAC,MACjC,EAAE,MAAM,IAAI,CAAC,OAAO;AAAA,QAClB,GAAG;AAAA,QACH,gBACE,EAAE,mBAAmB,EAAE,UAAU,UAAU,QAAS,EAAE,QAAsB;AAAA,MAChF,EAAE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,UAAU,SAAS,CAAC;AAC7B;AAEO,SAAS,YAAY,SAA+C;AACzE,MAAI,KAAK,OAAO,EAAG,QAAO;AAC1B,SACE,OAAO,YAAY,YACnB,YAAY,QACZ,cAAc,WACd,MAAM,QAAS,QAA6B,QAAQ;AAExD;AAEO,SAAS,SAAS,SAAsC;AAC7D,MAAI,KAAK,OAAO,EAAG,QAAO;AAC1B,SACE,OAAO,YAAY,YACnB,YAAY,QACZ,eAAe,WACf,EAAE,cAAc;AAEpB;;;ACnaA,SAAS,4BACP,SACA,SACuB;AACvB,MAAI,CAAC,QAAQ,cAAe,QAAO;AAEnC,QAAM,UAAU,QAAQ,IAAI,OAAO,MAAM;AACzC,QAAM,OAAO,QAAQ,IAAI,OAAO,QAAQ;AAExC,MAAI,CAAC,WAAW,CAAC,KAAM,QAAO;AAE9B,QAAM,QAAQ,QAAQ,cAAc,IAAI,OAAO;AAC/C,MAAI,CAAC,OAAO;AAEV,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,MAAM,SAAS,IAAI,KAAK,SAAS,QAAQ;AAClD,UAAM,iBAAiB,MAAM,MAAM,KAAK,IAAI;AAC5C,UAAM,aACJ,MAAM,MAAM,SAAS,IACjB,cAAc,MAAM,MAAM,CAAC,CAAC,8CAA8C,IAAI,WAC9E;AAEN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,UAAU,OAAO,uBAAuB,IAAI,4BAA4B,cAAc;AAAA,MAC/F;AAAA,MACA,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AASA,SAAS,kBAAkB,MAAkB,KAAwB;AACnE,MAAI,OAAO,SAAS,UAAU;AAC5B,QAAI,IAAI,IAAI;AACZ;AAAA,EACF;AACA,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,QAAI,aAAa,QAAQ,OAAO,KAAK,YAAY,UAAU;AACzD,UAAI,IAAI,KAAK,OAAO;AAAA,IACtB;AACA,QAAI,UAAU,QAAQ,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC9C,iBAAW,OAAO,KAAK,MAAM;AAC3B,YAAI,OAAO,QAAQ,UAAU;AAC3B,cAAI,IAAI,GAAG;AAAA,QACb,WACE,OACA,OAAO,QAAQ,YACf,aAAa,OACb,OAAQ,IAA6B,YAAY,UACjD;AACA,cAAI,IAAK,IAA4B,OAAO;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKA,SAAS,oBAAoB,QAAgB,UAA0C;AACrF,QAAM,UAAoB,CAAC;AAC3B,QAAM,cAAc,OAAO,YAAY;AAEvC,aAAW,MAAM,SAAS,KAAK,GAAG;AAChC,UAAM,UAAU,GAAG,YAAY;AAE/B,QAAI,QAAQ,SAAS,WAAW,KAAK,YAAY,SAAS,OAAO,GAAG;AAClE,cAAQ,KAAK,EAAE;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,QAAQ,MAAM,GAAG,CAAC;AAC3B;AAKA,SAAS,sBAAsB,SAAsB,SAAyC;AAC5F,MAAI,CAAC,QAAQ,gBAAiB,QAAO,CAAC;AAEtC,QAAM,aAA+B,CAAC;AACtC,QAAM,qBAAqB,oBAAI,IAAY;AAG3C,QAAM,QAAQ,YAAY,OAAO;AACjC,aAAW,QAAQ,OAAO;AACxB,eAAW,QAAQ,KAAK,UAAU,CAAC,GAAG;AACpC,wBAAkB,MAAM,kBAAkB;AAAA,IAC5C;AAAA,EACF;AAGA,aAAW,aAAa,oBAAoB;AAI1C,QAAI,cAAc,mBAAoB;AACtC,QAAI,CAAC,QAAQ,gBAAgB,IAAI,SAAS,GAAG;AAE3C,YAAM,UAAU,oBAAoB,WAAW,QAAQ,eAAe;AACtE,YAAM,aACJ,QAAQ,SAAS,IACb,qBAAqB,QAAQ,KAAK,IAAI,CAAC,KACvC,uBAAuB,SAAS;AAEtC,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,YAAY,SAAS;AAAA,QAC9B;AAAA,QACA,OAAO;AAAA,QACP,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,mBAAmB,SAAsB,SAA8C;AAC9F,QAAM,gBAAgB,QAAQ,IAAI;AAElC,MAAI,CAAC,eAAe,cAAc,cAAc,eAAe,QAAQ;AACrE,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AACzD,UAAM,YAAY,QAAQ,YAAY,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAC3D,UAAM,YACJ,QAAQ,YAAY,SAAS,IAAI,MAAM,QAAQ,YAAY,SAAS,CAAC,WAAW;AAElF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,QAAQ,cAAc,UAAU,uCAAuC,SAAS,GAAG,SAAS;AAAA,MACrG,YACE;AAAA,MACF,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAoBA,SAAS,kBAAkB,SAAsB,SAA8C;AAC7F,MAAI,CAAC,QAAQ,sBAAsB,QAAQ,mBAAmB,WAAW,GAAG;AAC1E,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,KAAK;AAG3B,MAAI;AACJ,MAAI,MAAM,0BAA0B;AAClC,kBAAc,MAAM;AAAA,EACtB,WAAW,MAAM,SAAS,UAAU;AAClC,kBAAc;AAAA,EAChB,WAAW,MAAM,SAAS,UAAU;AAClC,kBAAc;AAAA,EAChB,OAAO;AACL,kBAAc;AAAA,EAChB;AAEA,MAAI,gBAAgB,MAAO,QAAO;AAElC,QAAM,YAAY,QAAQ,mBAAmB,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAClE,QAAM,YACJ,QAAQ,mBAAmB,SAAS,IAChC,MAAM,QAAQ,mBAAmB,SAAS,CAAC,WAC3C;AAEN,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,gBAAgB,UAAU,UAAU;AAAA,IAC9C,SAAS,gEAAgE,SAAS,GAAG,SAAS;AAAA,IAC9F,YACE;AAAA,IACF,OAAO;AAAA,IACP,aAAa;AAAA,EACf;AACF;AAEO,SAAS,cAAc,SAAsB,UAAwB,CAAC,GAAqB;AAChG,QAAM,QAAQ,QAAQ,KAAK;AAE3B,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAA+B,CAAC;AACtC,QAAM,WAAW,MAAM,SAAS;AAGhC,QAAM,iBAAiB,QAAQ,SAAS,QAAQ;AAChD,MAAI,gBAAgB;AAClB,UAAM,iBAAiB,QAAQ,IAAI,MAAM;AACzC,QAAI,kBAAkB,mBAAmB,gBAAgB;AACvD,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,UAAU,cAAc,mCAAmC,cAAc;AAAA,QAClF,OAAO;AAAA,QACP,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,QAAQ,QAAQ;AAClB,UAAM,QAAQ,YAAY,OAAO;AACjC,UAAM,aAAa,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,MAAM;AAC5D,QAAI,CAAC,YAAY;AACf,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,SAAS,QAAQ,MAAM;AAAA,QAChC,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS,EAAE,MAAM,YAAqB,OAAO,EAAE,IAAI,QAAQ,OAAO,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,YAAY,QAAQ,UAAU,QAAQ,QAAQ;AAChD,UAAM,QAAQ,YAAY,OAAO;AACjC,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,MAAM;AACtD,QAAI,MAAM;AACR,YAAM,gBAAgB,KAAK,OAAO;AAAA,QAAI,CAAC,SACrC,OAAO,SAAS,WAAW,OAAO,aAAa,OAAO,KAAK,UAAU;AAAA,MACvE;AACA,YAAM,iBAAiB,QAAQ;AAC/B,YAAM,UACJ,cAAc,WAAW,eAAe,UACxC,cAAc,MAAM,CAAC,MAAM,MAAM,SAAS,eAAe,CAAC,CAAC;AAC7D,UAAI,CAAC,SAAS;AACZ,mBAAW,KAAK;AAAA,UACd,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,oBAAoB,QAAQ,MAAM,uCAAuC,cAAc,KAAK,IAAI,CAAC;AAAA,UAC1G,OAAO;AAAA,UACP,aAAa;AAAA,UACb,SAAS;AAAA,YACP,MAAM;AAAA,YACN,OAAO,EAAE,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,OAAO;AAAA,UACxD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY,QAAQ,aAAa;AACnC,UAAM,oBAAoB,uBAAuB,SAAS,QAAQ,MAAM;AACxE,UAAM,cAAc,qBAAqB,QAAQ,IAAI,QAAQ;AAC7D,QAAI,QAAQ,gBAAgB,aAAa;AACvC,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,gBAAgB,QAAQ,WAAW,qCAAqC,WAAW;AAAA,QAC5F,OAAO;AAAA,QACP,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,qBAAqB,4BAA4B,SAAS,OAAO;AACvE,MAAI,oBAAoB;AACtB,eAAW,KAAK,kBAAkB;AAAA,EACpC;AAGA,QAAM,oBAAoB,sBAAsB,SAAS,OAAO;AAChE,aAAW,KAAK,GAAG,iBAAiB;AAGpC,QAAM,yBAAyB,mBAAmB,SAAS,OAAO;AAClE,MAAI,wBAAwB;AAC1B,eAAW,KAAK,sBAAsB;AAAA,EACxC;AAMA,QAAM,wBAAwB,kBAAkB,SAAS,OAAO;AAChE,MAAI,uBAAuB;AACzB,eAAW,KAAK,qBAAqB;AAAA,EACvC;AAEA,QAAM,UAAU;AAGhB,MAAI,QAAQ,oBAAoB,OAAO;AAErC,WAAO,WAAW,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK;AAAA,EACnD;AACA,MAAI,QAAQ,oBAAoB,QAAQ;AAEtC,eAAW,KAAK,YAAY;AAC1B,UAAI,EAAE,UAAU,OAAO;AACrB,UAAE,WAAW;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,0BAA0B,OAAO;AAE3C,WAAO,WAAW,OAAO,CAAC,MAAM,EAAE,UAAU,WAAW;AAAA,EACzD;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,SAAuC;AAC1D,QAAM,QAAQ,aAAa,QAAQ,SAAS;AAC5C,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,IAAI,KAAK;AAAA,IACT,OAAO,KAAK,kBAAkB,QAAQ,UAAU,SAAS;AAAA,IACzD,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,EAClD,EAAE;AACJ;AAGA,SAAS,uBAAuB,SAAoB,QAAqC;AACvF,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,aAAa,QAAQ,SAAS;AAC5C,QAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AAC9C,MAAI,CAAC,MAAM,eAAe,QAAS,QAAO;AAE1C,QAAM,gBAA8C;AAAA,IAClD,SAAS;AAAA,IACT,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AACA,SAAO,cAAc,KAAK,cAAc,OAAO,KAAK;AACtD;;;ACraO,SAAS,YAAY,OAA2B;AACrD,MAAI,KAAK,KAAK,EAAG,QAAO,YAAY,KAAK;AACzC,MAAI,WAAW,KAAK,EAAG,QAAO,oBAAoB,KAAK;AACvD,MAAI,YAAY,KAAK,EAAG,QAAO,qBAAqB,KAAK;AACzD,MAAI,SAAS,KAAK,EAAG,QAAO,kBAAkB,KAAK;AAEnD,QAAM,IAAI,MAAM,gFAAgF;AAClG;AAEA,SAAS,kBAAkB,SAA6B;AACtD,QAAM,MAAM,SAAS,OAAO;AAC5B,QAAM,eAAe,QAAQ,UAAU,CAAC,GAAG,SAAS;AACpD,QAAM,QAAQ,QAAQ,UAAU,IAAI,CAAC,MAAM,WAAW;AAAA,IACpD,IAAI,KAAK;AAAA,IACT,OAAO,KAAK,OAAO,UAAU,UAAU,IAAI,MAAM,IAAI,KAAK,EAAE;AAAA,IAC5D,GAAI,KAAK,UAAU,eAAe,EAAE,gBAAgB,KAAK,MAAM,IAAI,CAAC;AAAA,IACpE,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,EAClD,EAAE;AACF,QAAM,UAA0B;AAAA,IAC9B,IAAI,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU,QAAQ,YAAY,CAAC;AAAA,IAC/B,aAAa,GAAG,QAAQ,SAAS;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,WAAW,wBAAwB,CAAC,OAAO,GAAG,QAAQ,YAAY,CAAC,CAAC;AAAA,IACpE,MAAM,UAAU,OAAO;AAAA,IACvB,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,EACpE;AACF;AAEA,SAAS,qBAAqB,SAAsC;AAClE,QAAM,eAAe,QAAQ,SAAS,CAAC;AACvC,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,QAAM,kBAAoC;AAAA,IACxC,OAAO,aAAa;AAAA,IACpB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,eAAe,QAAQ;AAAA,IACvB,aAAa,QAAQ;AAAA,EACvB;AAEA,QAAM,WAA6B,QAAQ,SAAS,IAAI,CAAC,YAAY;AACnE,UAAM,eAAe,QAAQ,UAAU,CAAC,GAAG,SAAS;AACpD,WAAO;AAAA,MACL,IAAI,QAAQ;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,QAAQ,YAAY,CAAC;AAAA,MAC/B,aAAa,GAAG,QAAQ,SAAS;AAAA,MACjC,OAAO,QAAQ,UAAU,IAAI,CAAC,MAAM,WAAW;AAAA,QAC7C,IAAI,KAAK;AAAA,QACT,OACE,UAAU,KAAK,QAAQ,OACnB,QAAQ,OACR,GAAG,QAAQ,IAAI,IAAI,KAAK,EAAE,GAAG,QAAQ,QAAQ,GAAG;AAAA,QACtD,GAAI,KAAK,UAAU,eAAe,EAAE,gBAAgB,KAAK,MAAM,IAAI,CAAC;AAAA,QACpE,QAAQ,KAAK;AAAA,QACb,GAAI,KAAK,UAAU,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,MAClD,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,QAAM,WAAW;AAAA,IACf,GAAI,QAAQ,mBAAmB,CAAC;AAAA,IAChC,GAAG,QAAQ,SAAS,QAAQ,CAAC,YAAY,QAAQ,YAAY,CAAC,CAAC;AAAA,EACjE;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,KAAK,SAAS,eAA0B;AAAA,IACxC,WAAW,wBAAwB,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,CAAC;AAAA,IACnE,MAAM;AAAA,MACJ,WAAW,aAAa;AAAA,MACxB,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,OAAO,aAAa,QAAQ,MAAM,IAAI;AAAA,IACxC;AAAA,IACA,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,EACpE;AACF;AAEA,SAAS,oBAAoB,SAAqC;AAChE,QAAM,WACJ,QAAQ,UAAU,YAAY,QAAQ,UAAU,SAAS,SAAS,IAC9D,QAAQ,UAAU,WAClB;AAAA,IACE;AAAA,MACE,IAAI,QAAQ,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,OAAO,QAAQ,UAAU,SAAS;AAAA,MAClC,UAAU,QAAQ,UAAU;AAAA,MAC5B,aAAa,GAAG,QAAQ,KAAK,SAAS;AAAA,MACtC,OAAO,QAAQ,UAAU,SAAS,CAAC;AAAA,IACrC;AAAA,EACF;AAEN,SAAO,YAAY;AAAA,IACjB,GAAG;AAAA,IACH,SAAS;AAAA,IACT,WAAW;AAAA,MACT;AAAA,MACA,QAAQ,UAAU;AAAA,MAClB,QAAQ,UAAU;AAAA,IACpB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YAAY,SAA+B;AAClD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,IACT,WAAW;AAAA,MACT,QAAQ,UAAU;AAAA,MAClB,QAAQ,UAAU;AAAA,MAClB,QAAQ,UAAU;AAAA,MAClB,QAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,wBACP,UACA,UACA,gBACA,OACkB;AAClB,QAAM,SAAkD,EAAE,GAAI,kBAAkB,CAAC,EAAG;AAEpF,aAAW,WAAW,UAAU;AAC9B,eAAW,QAAQ,QAAQ,OAAO;AAChC,UAAI,CAAC,KAAK,SAAS,OAAO,KAAK,KAAK,EAAG;AACvC,aAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ,IAAI,MAAM,KAAK,GAAG;AAAA,IAC5D;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,IACA,UAAU,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAAA,IAC/B;AAAA,EACF;AACF;AAEA,SAAS,SAAS,SAA8B;AAC9C,QAAM,QAAQ,QAAQ,MAAM,SAAS;AAErC,SAAO;AAAA,IACL,OAAO;AAAA,MACL,IAAI,QAAQ,MAAM;AAAA,MAClB,MAAM,QAAQ,MAAM;AAAA,MACpB,GAAI,QAAQ,MAAM,QAAQ,EAAE,OAAO,QAAQ,MAAM,MAAM,IAAI,CAAC;AAAA,IAC9D;AAAA,IACA,SAAS;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAU,QAAQ,SAAS,SAAS;AAAA,MACpC,aAAa,QAAQ,SAAS,eAAe;AAAA,IAC/C;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa;AAAA,IACf;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,gBAAgB,QAAQ,eAAe,kBAAkB;AAAA,IAC3D;AAAA,IACA,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,MAAM,gBAAgB,KAAK;AAAA,IAC7B;AAAA,IACA,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA,IACA,eAAe;AAAA,MACb,YAAY,QAAQ,eAAe,cAAc;AAAA,MACjD,eAAe;AAAA,MACf,UAAU;AAAA,IACZ;AAAA,IACA,aAAa,QAAQ,eAAe,CAAC,cAAc;AAAA,EACrD;AACF;AAEA,SAAS,UAAU,SAA+B;AAChD,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,IAClB,OAAO,aAAa,QAAQ,MAAM,IAAI;AAAA,EACxC;AACF;AAEA,SAAS,aAAa,MAAuC;AAC3D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,MAAM,UAAU,iBAAiB,SAAS,uBAAuB,OAAO;AAAA,IACnF,KAAK;AACH,aAAO,EAAE,MAAM,UAAU,iBAAiB,SAAS,uBAAuB,MAAM;AAAA,IAClF,KAAK;AAAA,IACL;AACE,aAAO,EAAE,MAAM,YAAY,iBAAiB,OAAO,uBAAuB,MAAM;AAAA,EACpF;AACF;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACzPA,IAAM,sBACJ;AAEK,SAAS,iBAAiB,OAA6C;AAC5E,MAAI,KAAK,KAAK,GAAG;AACf,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,mBAAmB;AACrC;;;ACZA,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAC9B,OAAO,SAAS;AAEhB,IAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,IAAM,eAAe,KAAK,WAAW,MAAM,UAAU,iBAAiB;AACtE,IAAM,eAAe,KAAK,WAAW,MAAM,UAAU,iBAAiB;AACtE,IAAM,eAAe,KAAK,WAAW,MAAM,UAAU,iBAAiB;AAEtE,IAAI,YAAwB;AAC5B,IAAM,iBAAiB,oBAAI,IAAwC;AAEnE,SAAS,SAAc;AACrB,MAAI,CAAC,WAAW;AACd,gBAAY,IAAI,IAAI,EAAE,WAAW,MAAM,QAAQ,OAAO,gBAAgB,MAAM,CAAC;AAAA,EAC/E;AACA,SAAO;AACT;AAEA,SAAS,aAAa,SAAgE;AACpF,MAAI,eAAe,IAAI,OAAO,EAAG,QAAO,eAAe,IAAI,OAAO;AAElE,QAAM,aACJ,YAAY,OAAO,eAAe,YAAY,OAAO,eAAe;AACtE,MAAI,CAAC,WAAW,UAAU,EAAG,QAAO;AAEpC,QAAM,SAAS,KAAK,MAAM,aAAa,YAAY,OAAO,CAAC;AAC3D,QAAM,MAAM,OAAO;AACnB,QAAM,WAAW,IAAI,QAAQ,MAAM;AACnC,iBAAe,IAAI,SAAS,QAAQ;AACpC,SAAO;AACT;AAEA,SAAS,oBAAoB,MAA4B;AACvD,MAAI,OAAO,SAAS,YAAY,SAAS,QAAQ,aAAa,MAAM;AAClE,UAAM,IAAK,KAAiC;AAC5C,QAAI,MAAM,WAAW,MAAM,QAAS,QAAO;AAAA,EAC7C;AACA,SAAO;AACT;AAOO,SAAS,gBAAgB,MAAiC;AAC/D,QAAM,UACJ,OAAO,SAAS,YAAY,SAAS,OAAQ,KAA+B,UAAU;AACxF,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,aAAa,IAAI;AAElC,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,sCAAsC,EAAE;AAAA,EAC1E;AAEA,QAAM,QAAQ,SAAS,IAAI;AAE3B,MAAI,OAAO;AACT,WAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,EAAE;AAAA,EACnC;AAEA,QAAM,UAAU,SAAS,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ;AAClD,UAAM,OAAO,IAAI,gBAAgB;AACjC,UAAM,MAAM,IAAI,WAAW;AAC3B,WAAO,GAAG,IAAI,KAAK,GAAG;AAAA,EACxB,CAAC;AAED,SAAO,EAAE,OAAO,OAAO,OAAO;AAChC;AAEO,SAAS,kCAAkC,MAAiC;AACjF,QAAM,UACJ,OAAO,SAAS,YAAY,SAAS,QAAS,KAA+B,YAAY,UACrF,OACA,oBAAoB,IAAI;AAC9B,QAAM,WAAW,aAAa,OAAO;AAErC,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,2BAA2B,OAAO,YAAY,EAAE;AAAA,EAClF;AAEA,QAAM,QAAQ,SAAS,IAAI;AAC3B,MAAI,OAAO;AACT,WAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,EAAE;AAAA,EACnC;AAEA,QAAM,UAAU,SAAS,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ;AAClD,UAAM,OAAO,IAAI,gBAAgB;AACjC,UAAM,MAAM,IAAI,WAAW;AAC3B,WAAO,GAAG,IAAI,KAAK,GAAG;AAAA,EACxB,CAAC;AAED,SAAO,EAAE,OAAO,OAAO,OAAO;AAChC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/density.ts","../src/types.ts","../src/guard.ts","../src/migrate.ts","../src/normalize.ts","../src/validate.ts"],"sourcesContent":["import type { Density, DensityLevel, SpatialTokenHints, SpatialTokens } from './types.js';\n\ninterface SpatialHints {\n density_bias?: number;\n content_gap_shift?: number;\n}\n\ninterface DensityRule {\n traits: string[];\n level: DensityLevel;\n gap: number;\n}\n\nconst RULES: DensityRule[] = [\n { traits: ['tactical', 'dense', 'data-dense', 'utilitarian'], level: 'compact', gap: 3 },\n { traits: ['luxurious', 'premium', 'editorial'], level: 'spacious', gap: 8 },\n { traits: ['playful', 'bouncy', 'expressive'], level: 'comfortable', gap: 5 },\n { traits: ['minimal', 'clean', 'airy'], level: 'spacious', gap: 6 },\n { traits: ['professional', 'modern', 'balanced'], level: 'comfortable', gap: 4 },\n];\n\nconst MIN_GAP = 2;\nconst MAX_GAP = 10;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\nexport function computeDensity(personality: string[], spatialHints?: SpatialHints): Density {\n const lower = personality.map((c) => c.toLowerCase());\n\n let level: DensityLevel = 'comfortable';\n let gap = 4;\n\n for (const rule of RULES) {\n if (rule.traits.some((t) => lower.includes(t))) {\n level = rule.level;\n gap = rule.gap;\n break;\n }\n }\n\n if (spatialHints?.density_bias) {\n gap += spatialHints.density_bias;\n }\n if (spatialHints?.content_gap_shift) {\n gap += spatialHints.content_gap_shift;\n }\n\n gap = clamp(gap, MIN_GAP, MAX_GAP);\n\n if (gap <= 3) level = 'compact';\n else if (gap >= 6) level = 'spacious';\n else level = 'comfortable';\n\n return { level, content_gap: String(gap) };\n}\n\n// --- Spatial Tokens ---\n\nconst DENSITY_SCALES: Record<DensityLevel, number> = {\n compact: 0.65,\n comfortable: 1.0,\n spacious: 1.4,\n};\n\nconst BASE_TOKENS = {\n '--d-section-py': 5,\n '--d-interactive-py': 0.5,\n '--d-interactive-px': 1,\n '--d-surface-p': 1.25,\n '--d-data-py': 0.625,\n '--d-control-py': 0.5,\n '--d-content-gap': 1,\n '--d-label-mb': 0.75,\n '--d-label-px': 0.75,\n '--d-section-gap': 1.5,\n '--d-annotation-mt': 0.5,\n} as const;\n\nfunction roundTo3(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n\nfunction toRemString(value: number): string {\n const rounded = roundTo3(value);\n return `${rounded}rem`;\n}\n\nexport function computeSpatialTokens(\n density: DensityLevel,\n spatialHints?: SpatialTokenHints,\n): SpatialTokens {\n const scale = DENSITY_SCALES[density];\n const biasMultiplier = 1 + (spatialHints?.density_bias ?? 0) / 10;\n\n const result = {} as SpatialTokens;\n\n for (const [key, base] of Object.entries(BASE_TOKENS)) {\n const tokenKey = key as keyof SpatialTokens;\n\n // --d-label-px is a visual anchor — never density-scaled\n if (tokenKey === '--d-label-px') {\n result[tokenKey] = toRemString(base);\n continue;\n }\n\n if (tokenKey === '--d-section-py' && spatialHints?.section_padding) {\n const pxMatch = spatialHints.section_padding.match(/^(\\d+(?:\\.\\d+)?)px$/);\n if (pxMatch) {\n const remValue = parseFloat(pxMatch[1]) / 16;\n result[tokenKey] = toRemString(remValue * scale * biasMultiplier);\n continue;\n }\n const remMatch = spatialHints.section_padding.match(/^(\\d+(?:\\.\\d+)?)rem$/);\n if (remMatch) {\n const remValue = parseFloat(remMatch[1]);\n result[tokenKey] = toRemString(remValue * scale * biasMultiplier);\n continue;\n }\n }\n\n // --d-label-mb can be overridden by theme's label_content_gap\n if (tokenKey === '--d-label-mb' && spatialHints?.label_content_gap) {\n const remMatch = spatialHints.label_content_gap.match(/^(\\d+(?:\\.\\d+)?)rem$/);\n if (remMatch) {\n const remValue = parseFloat(remMatch[1]);\n result[tokenKey] = toRemString(remValue * scale * biasMultiplier);\n continue;\n }\n }\n\n let computed = base * scale * biasMultiplier;\n\n if (tokenKey === '--d-content-gap' && spatialHints?.content_gap_shift) {\n computed += spatialHints.content_gap_shift * 0.25;\n }\n\n result[tokenKey] = toRemString(computed);\n }\n\n return result;\n}\n","/**\n * Essence v4 active contract types.\n *\n * Decantr V2 treats Essence v4 as the only active runtime contract. Older\n * Essence v2/v3 document shapes remain modeled only so `decantr migrate --to v4`\n * can upgrade existing projects.\n */\n\n// --- Theme ---\n\nexport type ThemeStyle =\n | 'auradecantism'\n | 'clean'\n | 'glassmorphism'\n | 'retro'\n | 'bioluminescent'\n | 'launchpad'\n | 'dopamine'\n | 'editorial'\n | 'liquid-glass'\n | 'prismatic';\n\nexport type ThemeMode = 'light' | 'dark' | 'auto';\nexport type ThemeShape = 'sharp' | 'rounded' | 'pill';\n\nexport interface Theme {\n id: string;\n mode: ThemeMode;\n shape?: ThemeShape;\n}\n\n// --- Platform ---\n\nexport type PlatformType = 'spa' | 'ssr' | 'static';\nexport type RoutingStrategy = 'hash' | 'history' | 'pathname';\n\nexport interface Platform {\n type: PlatformType;\n routing: RoutingStrategy;\n}\n\n// --- Structure ---\n\nexport type ShellType =\n | 'sidebar-main'\n | 'top-nav-main'\n | 'full-bleed'\n | 'dashboard'\n | 'stacked'\n | string;\n\nexport type LayoutItem = string | PatternRef | ColumnLayout;\n\nexport interface PatternRef {\n pattern: string;\n preset?: string;\n as?: string;\n}\n\nexport interface ColumnLayout {\n /**\n * Column entries. Each entry is either a pattern id string OR a\n * PatternRef object with `pattern`, optional `preset`, and optional\n * `as` alias. Mixing the two forms is permitted by the schema.\n * Consumers MUST normalize via `getColumnId` / `getColumnAlias` before\n * using as a Map key, joining into strings, or rendering — otherwise\n * objects produce `[object Object]` in serialized output.\n */\n cols: (string | PatternRef)[];\n at?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n span?: Record<string, number>;\n // AUTO: Multi-breakpoint grid — array of { at, cols } entries for cascading breakpoints\n breakpoints?: { at: string; cols: number }[];\n // AUTO: \"container\" uses container queries instead of viewport breakpoints\n responsive?: 'viewport' | 'container';\n}\n\n/** Extract the pattern id string from a column entry. */\nexport function getColumnId(col: string | PatternRef): string {\n return typeof col === 'string' ? col : col.pattern;\n}\n\n/** Extract the alias for a column entry (defaults to pattern id when no `as`). */\nexport function getColumnAlias(col: string | PatternRef): string {\n if (typeof col === 'string') return col;\n return col.as ?? col.pattern;\n}\n\n/** Extract the optional preset for a column entry, or undefined. */\nexport function getColumnPreset(col: string | PatternRef): string | undefined {\n if (typeof col === 'string') return undefined;\n return col.preset;\n}\n\nexport interface StructurePage {\n id: string;\n shell: ShellType;\n layout: LayoutItem[];\n surface?: string;\n}\n\n// --- Density ---\n\nexport type DensityLevel = 'compact' | 'comfortable' | 'spacious';\n\nexport interface Density {\n level: DensityLevel;\n content_gap: string;\n}\n\nexport interface SpatialTokens {\n '--d-section-py': string;\n '--d-interactive-py': string;\n '--d-interactive-px': string;\n '--d-surface-p': string;\n '--d-data-py': string;\n '--d-control-py': string;\n '--d-content-gap': string;\n '--d-label-mb': string;\n '--d-label-px': string;\n '--d-section-gap': string;\n '--d-annotation-mt': string;\n}\n\nexport interface SpatialTokenHints {\n section_padding?: string | null;\n density_bias?: number;\n content_gap_shift?: number;\n label_content_gap?: string | null;\n}\n\nexport interface ShellGuidance {\n section_label_treatment?: string;\n section_density?: DensityLevel;\n [key: string]: string | DensityLevel | undefined;\n}\n\n// --- Guard ---\n\nexport type GuardMode = 'creative' | 'guided' | 'strict';\n\nexport interface Guard {\n enforce_style?: boolean;\n mode: GuardMode;\n}\n\n// --- Impression ---\n\nexport interface Impression {\n vibe: string[];\n references: string[];\n density_intent: DensityLevel | string;\n layout_intent: ShellType | string;\n novel_elements: string[];\n}\n\n// --- Generator Target ---\n\nexport type GeneratorTarget = 'decantr' | 'react' | 'vue' | 'svelte' | string;\n\n// --- Accessibility ---\n\nexport type WcagLevel = 'none' | 'A' | 'AA' | 'AAA';\n\nexport type CvdPreference =\n | 'none'\n | 'auto'\n | 'deuteranopia'\n | 'protanopia'\n | 'tritanopia'\n | 'achromatopsia';\n\nexport interface Accessibility {\n wcag_level?: WcagLevel;\n cvd_preference?: CvdPreference;\n}\n\n// --- Essence (simple) ---\n\nexport interface Essence {\n $schema?: string;\n version: string;\n archetype: string;\n theme: Theme;\n personality: string[];\n platform: Platform;\n structure: StructurePage[];\n features: string[];\n density: Density;\n guard: Guard;\n target: GeneratorTarget;\n accessibility?: Accessibility;\n _impression?: Impression;\n}\n\n// --- Essence (sectioned) ---\n\nexport interface LegacyEssenceSection {\n id: string;\n path: string;\n archetype: string;\n theme: Theme;\n structure: StructurePage[];\n features?: string[];\n}\n\nexport interface SectionedEssence {\n $schema?: string;\n version: string;\n platform: Platform;\n personality: string[];\n sections: LegacyEssenceSection[];\n shared_features?: string[];\n density: Density;\n guard: Guard;\n target: GeneratorTarget;\n accessibility?: Accessibility;\n _impression?: Impression;\n}\n\n// --- Essence v4: DNA/Blueprint/Meta split ---\n\nexport interface EssenceDNA {\n theme: Theme;\n spacing: {\n base_unit: number;\n scale: string;\n density: DensityLevel;\n content_gap: string;\n };\n typography: {\n scale: string;\n heading_weight: number;\n body_weight: number;\n };\n color: {\n palette: string;\n accent_count: number;\n cvd_preference: CvdPreference | string;\n };\n radius: {\n philosophy: ThemeShape | string;\n base: number;\n };\n elevation: {\n system: string;\n max_levels: number;\n };\n motion: {\n preference: string;\n duration_scale: number;\n reduce_motion: boolean;\n timing?: string;\n durations?: Record<string, string>;\n };\n accessibility: {\n wcag_level: WcagLevel;\n focus_visible: boolean;\n skip_nav: boolean;\n };\n personality: string[];\n constraints?: {\n mode?: string;\n typography?: string;\n borders?: string;\n corners?: string;\n shadows?: string;\n effects?: Record<string, string>;\n };\n}\n\n/** Only density and mode may be overridden per-page. DNA axioms like wcag_level and theme.id are never overrideable. */\nexport interface DNAOverrides {\n density?: DensityLevel;\n mode?: ThemeMode;\n}\n\nexport interface BlueprintPage {\n id: string;\n route?: string;\n shell_override?: ShellType | null;\n layout: LayoutItem[];\n patterns?: PatternRef[];\n dna_overrides?: DNAOverrides;\n surface?: string;\n /**\n * Execution-level directives emitted into the page-pack contract.\n * Short imperative rules that cold LLMs should obey when implementing\n * this route. Belongs in the pack (not the narrative doc).\n */\n directives?: string[];\n}\n\nexport type ArchetypeRole = 'primary' | 'gateway' | 'public' | 'auxiliary';\n\nexport interface SectionNavigationItem {\n label: string;\n route: string;\n icon?: string;\n hotkey?: string;\n /** Regex or path prefix for \"active\" matching. Defaults to exact `route` match. */\n active_match?: string;\n badge?: string;\n}\n\nexport interface EssenceSection {\n id: string;\n role: ArchetypeRole;\n shell: ShellType | string;\n features: string[];\n description: string;\n pages: BlueprintPage[];\n dna_overrides?: DNAOverrides;\n /** Items rendered in the shell's primary navigation for this section. */\n navigation_items?: SectionNavigationItem[];\n /**\n * Execution-level directives emitted into the section-pack contract.\n * Short imperative rules every page in this section must obey.\n * Belongs in the pack (not the narrative doc).\n */\n directives?: string[];\n}\n\nexport interface RouteEntry {\n section: string;\n page: string;\n}\n\nexport interface EssenceBlueprint {\n shell?: ShellType | string;\n sections: EssenceSection[];\n /** Migration-only compatibility. Active v4 documents are sectioned-only. */\n pages?: BlueprintPage[];\n features: string[];\n routes?: Record<string, RouteEntry>;\n icon_style?: string;\n avatar_style?: string;\n}\n\nexport interface EssenceV4Guard {\n mode: GuardMode;\n dna_enforcement: 'error' | 'warn' | 'off';\n blueprint_enforcement: 'warn' | 'off';\n /**\n * Severity for the experiential interactions guard rule. When patterns\n * declare `interactions: [...]` but the source\n * tree is missing the canonical implementations, this controls whether\n * the violation is an error, warning, or ignored.\n *\n * Defaults: `creative` mode → 'off'; `guided` → 'warn'; `strict` → 'error'.\n * Authors can override per-essence.\n */\n interactions_enforcement?: 'error' | 'warn' | 'off';\n}\n\nexport interface EssenceMeta {\n archetype: string;\n target: GeneratorTarget;\n platform: Platform;\n guard: EssenceV4Guard;\n seo?: {\n schema_org?: string[];\n meta_priorities?: string[];\n };\n navigation?: {\n hotkeys?: Array<{\n key: string;\n route?: string;\n action?: string;\n label: string;\n semantics?: HotkeySemantics;\n }>;\n command_palette?: boolean | CommandPaletteContract;\n /** Default hotkey semantics applied to every hotkey unless overridden per-key. */\n hotkey_semantics?: HotkeySemantics;\n };\n}\n\nexport interface CommandPaletteContract {\n /** Platform-neutral hotkey (e.g., 'Cmd+K' → Cmd on Mac, Ctrl elsewhere). */\n trigger?: string;\n placeholder?: string;\n /** Preferred width as a CSS length (e.g., '640px' or '40rem'). */\n width?: string;\n /** Presentation mode. */\n styling?: 'modal' | 'sheet' | 'inline' | 'fullscreen';\n /** Seed command vocabulary. If omitted, LLMs may synthesize a minimal default from declared routes. */\n commands?: Array<{\n id: string;\n label: string;\n section?: string;\n hotkey?: string;\n action?: string;\n route?: string;\n }>;\n}\n\nexport interface HotkeySemantics {\n /** Max ms between keystrokes in a chord before it resets. Typical: 900. */\n chord_window_ms?: number;\n /** If true (default): hotkeys don't fire while focus is in an editable element. */\n input_guard?: boolean;\n /** If true (default): hotkeys don't fire when a modifier is held unless the key string declares it. */\n modifier_suppression?: boolean;\n /** If true: hotkey matching is case-sensitive. Default false — uppercase implies Shift. */\n match_case?: boolean;\n /**\n * If true (default): render the .d-hotkey-indicator corner badge when a chord\n * hotkey prefix is armed. If false: silent chord tracking (no visual feedback).\n * Recommended true for discoverability.\n */\n show_chord_indicator?: boolean;\n}\n\nexport interface EssenceV4 {\n $schema?: string;\n version: '4.0.0';\n dna: EssenceDNA;\n blueprint: EssenceBlueprint;\n meta: EssenceMeta;\n _impression?: Impression;\n}\n\nexport type LegacyEssenceV3 = Omit<EssenceV4, 'version'> & {\n version: '3.0.0' | '3.1.0';\n};\n\n// --- Active and migration unions ---\n\nexport type EssenceFile = EssenceV4;\nexport type LegacyEssenceFile = Essence | SectionedEssence | LegacyEssenceV3 | EssenceV4;\n\nexport function isV4(essence: unknown): essence is EssenceV4 {\n return (\n typeof essence === 'object' &&\n essence !== null &&\n (essence as { version?: unknown }).version === '4.0.0' &&\n 'dna' in essence &&\n 'blueprint' in essence\n );\n}\n\nexport function isLegacyV3(essence: unknown): essence is LegacyEssenceV3 {\n return (\n typeof essence === 'object' &&\n essence !== null &&\n ((essence as { version?: unknown }).version === '3.0.0' ||\n (essence as { version?: unknown }).version === '3.1.0') &&\n 'dna' in essence &&\n 'blueprint' in essence\n );\n}\n\n/** Flatten sections into a flat page list (for guards and backward compat). */\nexport function flattenPages(blueprint: EssenceBlueprint): BlueprintPage[] {\n if (blueprint.sections && blueprint.sections.length > 0) {\n return blueprint.sections.flatMap((s) =>\n s.pages.map((p) => ({\n ...p,\n shell_override:\n p.shell_override ?? (s.shell !== blueprint.shell ? (s.shell as ShellType) : undefined),\n })),\n );\n }\n return blueprint.pages ?? [];\n}\n\nexport function isSectioned(essence: unknown): essence is SectionedEssence {\n if (isV4(essence)) return false;\n return (\n typeof essence === 'object' &&\n essence !== null &&\n 'sections' in essence &&\n Array.isArray((essence as SectionedEssence).sections)\n );\n}\n\nexport function isSimple(essence: unknown): essence is Essence {\n if (isV4(essence)) return false;\n return (\n typeof essence === 'object' &&\n essence !== null &&\n 'archetype' in essence &&\n !('sections' in essence)\n );\n}\n","import type {\n DensityLevel,\n EssenceFile,\n EssenceV4,\n EssenceV4Guard,\n LayoutItem,\n StructurePage,\n} from './types.js';\nimport { flattenPages } from './types.js';\n\nexport interface AutoFix {\n type: 'add_page' | 'update_layout' | 'update_blueprint';\n patch: Record<string, unknown>;\n}\n\nexport interface GuardViolation {\n rule:\n | 'theme'\n | 'structure'\n | 'layout'\n | 'density'\n | 'theme-mode'\n | 'pattern-exists'\n | 'accessibility'\n /**\n * V4 C5. Experiential interactions guard rule. Fires when patterns\n * declare `interactions: [...]` but the source tree is missing the\n * canonical implementations. Severity controlled by\n * `meta.guard.interactions_enforcement` (defaults: creative=off,\n * guided=warn, strict=error).\n */\n | 'interactions';\n severity: 'error' | 'warning';\n message: string;\n suggestion?: string;\n layer?: 'dna' | 'blueprint';\n autoFixable?: boolean;\n autoFix?: AutoFix;\n}\n\nexport interface GuardContext {\n pageId?: string;\n theme?: string;\n /** @deprecated Use `theme` instead. */\n style?: string;\n layout?: string[];\n density_gap?: string;\n themeRegistry?: Map<string, { modes: string[] }>;\n patternRegistry?: Map<string, unknown>;\n a11y_issues?: string[];\n /**\n * V4 C5. Pre-computed list of declared interactions whose canonical\n * implementations are missing from the source tree. Produced by\n * `verifyInteractionsInSource` from @decantr/verifier; passed in here\n * so the guard rule can emit violations without owning the source-scan\n * logic. Mirrors the existing `a11y_issues` pattern.\n *\n * Each entry is a short descriptor like\n * `status-pulse (suggestion: Apply 'd-pulse' to the indicator)`.\n */\n interaction_issues?: string[];\n}\n\n/**\n * Check if the theme supports the specified mode.\n */\nfunction checkThemeModeCompatibility(\n essence: EssenceFile,\n context: GuardContext,\n): GuardViolation | null {\n if (!context.themeRegistry) return null;\n\n const themeId = essence.dna.theme?.id ?? null;\n const mode = essence.dna.theme?.mode ?? null;\n\n if (!themeId || !mode) return null;\n\n const theme = context.themeRegistry.get(themeId);\n if (!theme) {\n // Theme not found - separate validation\n return null;\n }\n\n if (!theme.modes.includes(mode) && mode !== 'auto') {\n const supportedModes = theme.modes.join(', ');\n const suggestion =\n theme.modes.length > 0\n ? `Use mode: \"${theme.modes[0]}\" instead, or choose a theme that supports ${mode} mode.`\n : undefined;\n\n return {\n rule: 'theme-mode',\n severity: 'error',\n message: `Theme \"${themeId}\" does not support \"${mode}\" mode. Supported modes: ${supportedModes}.`,\n suggestion,\n layer: 'dna' as const,\n autoFixable: false,\n };\n }\n\n return null;\n}\n\n/**\n * Collect all pattern IDs from a layout item, recursively handling nested structures.\n * Handles cols entries that are either string ids OR PatternRef objects\n * (the schema permits mixing). Without the object branch, PatternRef cols\n * silently dropped from the registry-existence check, masking missing\n * patterns.\n */\nfunction collectPatternIds(item: LayoutItem, ids: Set<string>): void {\n if (typeof item === 'string') {\n ids.add(item);\n return;\n }\n if (typeof item === 'object' && item !== null) {\n if ('pattern' in item && typeof item.pattern === 'string') {\n ids.add(item.pattern);\n }\n if ('cols' in item && Array.isArray(item.cols)) {\n for (const col of item.cols) {\n if (typeof col === 'string') {\n ids.add(col);\n } else if (\n col &&\n typeof col === 'object' &&\n 'pattern' in col &&\n typeof (col as { pattern: unknown }).pattern === 'string'\n ) {\n ids.add((col as { pattern: string }).pattern);\n }\n }\n }\n }\n}\n\n/**\n * Find similar pattern IDs in the registry for suggestion.\n */\nfunction findSimilarPatterns(target: string, registry: Map<string, unknown>): string[] {\n const similar: string[] = [];\n const targetLower = target.toLowerCase();\n\n for (const id of registry.keys()) {\n const idLower = id.toLowerCase();\n // Simple similarity: contains target or target contains id\n if (idLower.includes(targetLower) || targetLower.includes(idLower)) {\n similar.push(id);\n }\n }\n\n return similar.slice(0, 3); // Top 3 suggestions\n}\n\n/**\n * Check if all referenced patterns exist in the registry.\n */\nfunction checkPatternExistence(essence: EssenceFile, context: GuardContext): GuardViolation[] {\n if (!context.patternRegistry) return [];\n\n const violations: GuardViolation[] = [];\n const referencedPatterns = new Set<string>();\n\n // Collect all pattern references from structure\n const pages = getAllPages(essence);\n for (const page of pages) {\n for (const item of page.layout || []) {\n collectPatternIds(item, referencedPatterns);\n }\n }\n\n // Check each pattern exists\n for (const patternId of referencedPatterns) {\n // Brownfield observed contracts use this placeholder to satisfy the\n // layout schema without pretending an existing app route is a registry\n // pattern. It is intentionally not resolved through the registry.\n if (patternId === 'existing-surface') continue;\n if (!context.patternRegistry.has(patternId)) {\n // Find similar patterns for suggestion\n const similar = findSimilarPatterns(patternId, context.patternRegistry);\n const suggestion =\n similar.length > 0\n ? `Similar patterns: ${similar.join(', ')}`\n : `Run \"decantr search ${patternId}\" to find alternatives.`;\n\n violations.push({\n rule: 'pattern-exists',\n severity: 'warning',\n message: `Pattern \"${patternId}\" is referenced but does not exist in the registry.`,\n suggestion,\n layer: 'blueprint' as const,\n autoFixable: false,\n });\n }\n }\n\n return violations;\n}\n\n/**\n * Check accessibility compliance based on declared WCAG level.\n */\nfunction checkAccessibility(essence: EssenceFile, context: GuardContext): GuardViolation | null {\n const accessibility = essence.dna.accessibility;\n\n if (!accessibility?.wcag_level || accessibility.wcag_level === 'none') {\n return null;\n }\n\n if (context.a11y_issues && context.a11y_issues.length > 0) {\n const issueList = context.a11y_issues.slice(0, 3).join(', ');\n const moreCount =\n context.a11y_issues.length > 3 ? ` (+${context.a11y_issues.length - 3} more)` : '';\n\n return {\n rule: 'accessibility',\n severity: 'error',\n message: `WCAG ${accessibility.wcag_level} compliance required. Issues found: ${issueList}${moreCount}`,\n suggestion:\n 'Fix accessibility issues before proceeding. Run an accessibility audit for details.',\n layer: 'dna' as const,\n autoFixable: false,\n };\n }\n\n return null;\n}\n\n/**\n * V4 C5. Experiential interactions guard rule (8th rule). Patterns\n * declare runtime interactions in pattern.v2.json (e.g., status-pulse,\n * drag-nodes, hover-tooltip). When the source tree doesn't implement\n * those interactions, this rule emits a violation. Source scanning\n * happens in @decantr/verifier; pre-computed results land here as\n * `context.interaction_issues`.\n *\n * Severity is governed by `meta.guard.interactions_enforcement`:\n * - 'error' → emits as error (build fails)\n * - 'warn' → emits as warning (build passes, surfaces in CLI)\n * - 'off' → suppresses entirely\n *\n * Defaults when the field is omitted, derived from guard.mode:\n * - creative → 'off'\n * - guided → 'warn'\n * - strict → 'error'\n */\nfunction checkInteractions(essence: EssenceFile, context: GuardContext): GuardViolation | null {\n if (!context.interaction_issues || context.interaction_issues.length === 0) {\n return null;\n }\n\n const guard = essence.meta.guard;\n\n // Resolve enforcement: explicit field wins, otherwise mode-derived default.\n let enforcement: 'error' | 'warn' | 'off';\n if (guard.interactions_enforcement) {\n enforcement = guard.interactions_enforcement;\n } else if (guard.mode === 'strict') {\n enforcement = 'error';\n } else if (guard.mode === 'guided') {\n enforcement = 'warn';\n } else {\n enforcement = 'off';\n }\n\n if (enforcement === 'off') return null;\n\n const issueList = context.interaction_issues.slice(0, 3).join('; ');\n const moreCount =\n context.interaction_issues.length > 3\n ? ` (+${context.interaction_issues.length - 3} more)`\n : '';\n\n return {\n rule: 'interactions',\n severity: enforcement === 'error' ? 'error' : 'warning',\n message: `Declared pattern interactions are not implemented in source: ${issueList}${moreCount}`,\n suggestion:\n 'See \"Interaction Requirements\" in DECANTR.md for canonical implementations. Each declared interaction maps to a treatment class or handler pattern.',\n layer: 'blueprint' as const,\n autoFixable: false,\n };\n}\n\nexport function evaluateGuard(essence: EssenceFile, context: GuardContext = {}): GuardViolation[] {\n const guard = essence.meta.guard;\n\n if (guard.mode === 'creative') {\n return [];\n }\n\n const violations: GuardViolation[] = [];\n const isStrict = guard.mode === 'strict';\n\n // Rule 1: Theme guard\n const requestedTheme = context.theme ?? context.style;\n if (requestedTheme) {\n const essenceThemeId = essence.dna.theme.id;\n if (essenceThemeId && requestedTheme !== essenceThemeId) {\n violations.push({\n rule: 'theme',\n severity: 'error',\n message: `Theme \"${requestedTheme}\" does not match essence theme \"${essenceThemeId}\". Change the essence theme first.`,\n layer: 'dna' as const,\n autoFixable: false,\n });\n }\n }\n\n // Rule 2: Structure guard (enforced in both guided and strict)\n if (context.pageId) {\n const pages = getAllPages(essence);\n const pageExists = pages.some((p) => p.id === context.pageId);\n if (!pageExists) {\n violations.push({\n rule: 'structure',\n severity: 'warning',\n message: `Page \"${context.pageId}\" does not exist in essence structure. Add it to the essence first.`,\n layer: 'blueprint' as const,\n autoFixable: true,\n autoFix: { type: 'add_page' as const, patch: { id: context.pageId } },\n });\n }\n }\n\n // Rule 3: Layout guard (strict only)\n if (isStrict && context.pageId && context.layout) {\n const pages = getAllPages(essence);\n const page = pages.find((p) => p.id === context.pageId);\n if (page) {\n const essenceLayout = page.layout.map((item) =>\n typeof item === 'string' ? item : 'pattern' in item ? item.pattern : 'cols',\n );\n const proposedLayout = context.layout;\n const matches =\n essenceLayout.length === proposedLayout.length &&\n essenceLayout.every((item, i) => item === proposedLayout[i]);\n if (!matches) {\n violations.push({\n rule: 'layout',\n severity: 'warning',\n message: `Layout for page \"${context.pageId}\" deviates from essence. Expected: [${essenceLayout.join(', ')}].`,\n layer: 'blueprint' as const,\n autoFixable: true,\n autoFix: {\n type: 'update_layout' as const,\n patch: { page: context.pageId, layout: context.layout },\n },\n });\n }\n }\n }\n\n // Rule 4: Density guard (strict only)\n if (isStrict && context.density_gap) {\n const overriddenDensity = getPageDensityOverride(essence, context.pageId);\n const expectedGap = overriddenDensity ?? essence.dna.spacing.content_gap;\n if (context.density_gap !== expectedGap) {\n violations.push({\n rule: 'density',\n severity: 'warning',\n message: `Content gap \"${context.density_gap}\" does not match essence density \"${expectedGap}\".`,\n layer: 'dna' as const,\n autoFixable: false,\n });\n }\n }\n\n // Rule 6: Theme/mode compatibility (always checked when registry available)\n const themeModeViolation = checkThemeModeCompatibility(essence, context);\n if (themeModeViolation) {\n violations.push(themeModeViolation);\n }\n\n // Rule 7: Pattern existence (always checked when registry available)\n const patternViolations = checkPatternExistence(essence, context);\n violations.push(...patternViolations);\n\n // Rule 8: Accessibility (when wcag_level is set, guided and strict modes)\n const accessibilityViolation = checkAccessibility(essence, context);\n if (accessibilityViolation) {\n violations.push(accessibilityViolation);\n }\n\n // Rule 9: Experiential interactions (V4 C5). Only fires when caller\n // pre-computed `interaction_issues` from the source-tree scan; severity\n // governed by `meta.guard.interactions_enforcement` with mode-derived\n // defaults. See checkInteractions for the full resolution table.\n const interactionsViolation = checkInteractions(essence, context);\n if (interactionsViolation) {\n violations.push(interactionsViolation);\n }\n\n const v4Guard = guard as EssenceV4Guard;\n\n // DNA enforcement\n if (v4Guard.dna_enforcement === 'off') {\n // Remove all DNA-layer violations\n return violations.filter((v) => v.layer !== 'dna');\n }\n if (v4Guard.dna_enforcement === 'warn') {\n // Downgrade DNA-layer violations to warning severity\n for (const v of violations) {\n if (v.layer === 'dna') {\n v.severity = 'warning';\n }\n }\n }\n\n // Blueprint enforcement\n if (v4Guard.blueprint_enforcement === 'off') {\n // Remove all blueprint-layer violations\n return violations.filter((v) => v.layer !== 'blueprint');\n }\n\n return violations;\n}\n\nfunction getAllPages(essence: EssenceFile): StructurePage[] {\n const pages = flattenPages(essence.blueprint);\n return pages.map((page) => ({\n id: page.id,\n shell: page.shell_override ?? essence.blueprint.shell ?? '',\n layout: page.layout,\n ...(page.surface ? { surface: page.surface } : {}),\n }));\n}\n\n/** Get per-page density override from the v4 blueprint, if set. */\nfunction getPageDensityOverride(essence: EssenceV4, pageId?: string): string | undefined {\n if (!pageId) return undefined;\n const pages = flattenPages(essence.blueprint);\n const page = pages.find((p) => p.id === pageId);\n if (!page?.dna_overrides?.density) return undefined;\n // Map density level to a content_gap value\n const densityGapMap: Record<DensityLevel, string> = {\n compact: '2',\n comfortable: '4',\n spacious: '6',\n };\n return densityGapMap[page.dna_overrides.density] ?? undefined;\n}\n","import type {\n DensityLevel,\n Essence,\n EssenceBlueprint,\n EssenceDNA,\n EssenceMeta,\n EssenceSection,\n EssenceV4,\n GuardMode,\n LegacyEssenceV3,\n SectionedEssence,\n ThemeShape,\n} from './types.js';\nimport { isLegacyV3, isSectioned, isSimple, isV4 } from './types.js';\n\n/**\n * Explicit legacy-to-v4 migration path used by `decantr migrate --to v4`.\n * Active Decantr V2 commands do not call this implicitly.\n */\nexport function migrateToV4(input: unknown): EssenceV4 {\n if (isV4(input)) return normalizeV4(input);\n if (isLegacyV3(input)) return migrateLegacyV3ToV4(input);\n if (isSectioned(input)) return migrateSectionedToV4(input);\n if (isSimple(input)) return migrateSimpleToV4(input);\n\n throw new Error('Unknown essence format. Only Essence v2, v3.0, v3.1, and v4 can migrate to v4.');\n}\n\nfunction migrateSimpleToV4(essence: Essence): EssenceV4 {\n const dna = buildDNA(essence);\n const defaultShell = essence.structure[0]?.shell ?? 'top-nav-main';\n const pages = essence.structure.map((page, index) => ({\n id: page.id,\n route: page.id === 'home' || index === 0 ? '/' : `/${page.id}`,\n ...(page.shell !== defaultShell ? { shell_override: page.shell } : {}),\n layout: page.layout,\n ...(page.surface ? { surface: page.surface } : {}),\n }));\n const section: EssenceSection = {\n id: essence.archetype,\n role: 'primary',\n shell: defaultShell,\n features: essence.features ?? [],\n description: `${essence.archetype} primary section`,\n pages,\n };\n\n return {\n version: '4.0.0',\n dna,\n blueprint: buildSectionedBlueprint([section], essence.features ?? []),\n meta: buildMeta(essence),\n ...(essence._impression ? { _impression: essence._impression } : {}),\n };\n}\n\nfunction migrateSectionedToV4(essence: SectionedEssence): EssenceV4 {\n const firstSection = essence.sections[0];\n if (!firstSection) {\n throw new Error('Cannot migrate a sectioned essence with no sections.');\n }\n\n const syntheticSimple: Partial<Essence> = {\n theme: firstSection.theme,\n density: essence.density,\n guard: essence.guard,\n accessibility: essence.accessibility,\n personality: essence.personality,\n };\n\n const sections: EssenceSection[] = essence.sections.map((section) => {\n const defaultShell = section.structure[0]?.shell ?? 'top-nav-main';\n return {\n id: section.id,\n role: 'primary',\n shell: defaultShell,\n features: section.features ?? [],\n description: `${section.archetype} section`,\n pages: section.structure.map((page, index) => ({\n id: page.id,\n route:\n index === 0 && section.path\n ? section.path\n : `${section.path}/${page.id}`.replace(/\\/+/g, '/'),\n ...(page.shell !== defaultShell ? { shell_override: page.shell } : {}),\n layout: page.layout,\n ...(page.surface ? { surface: page.surface } : {}),\n })),\n };\n });\n\n const features = [\n ...(essence.shared_features ?? []),\n ...essence.sections.flatMap((section) => section.features ?? []),\n ];\n\n return {\n version: '4.0.0',\n dna: buildDNA(syntheticSimple as Essence),\n blueprint: buildSectionedBlueprint(sections, [...new Set(features)]),\n meta: {\n archetype: firstSection.archetype,\n target: essence.target,\n platform: essence.platform,\n guard: migrateGuard(essence.guard.mode),\n },\n ...(essence._impression ? { _impression: essence._impression } : {}),\n };\n}\n\nfunction migrateLegacyV3ToV4(essence: LegacyEssenceV3): EssenceV4 {\n const sections =\n essence.blueprint.sections && essence.blueprint.sections.length > 0\n ? essence.blueprint.sections\n : [\n {\n id: essence.meta.archetype,\n role: 'primary' as const,\n shell: essence.blueprint.shell ?? 'top-nav-main',\n features: essence.blueprint.features,\n description: `${essence.meta.archetype} primary section`,\n pages: essence.blueprint.pages ?? [],\n },\n ];\n\n return normalizeV4({\n ...essence,\n version: '4.0.0',\n blueprint: buildSectionedBlueprint(\n sections,\n essence.blueprint.features,\n essence.blueprint.routes,\n ),\n });\n}\n\nfunction normalizeV4(essence: EssenceV4): EssenceV4 {\n return {\n ...essence,\n version: '4.0.0',\n blueprint: buildSectionedBlueprint(\n essence.blueprint.sections,\n essence.blueprint.features,\n essence.blueprint.routes,\n essence.blueprint.shell,\n ),\n };\n}\n\nfunction buildSectionedBlueprint(\n sections: EssenceSection[],\n features: string[],\n existingRoutes?: EssenceBlueprint['routes'],\n shell?: string,\n): EssenceBlueprint {\n const routes: NonNullable<EssenceBlueprint['routes']> = { ...(existingRoutes ?? {}) };\n\n for (const section of sections) {\n for (const page of section.pages) {\n if (!page.route || routes[page.route]) continue;\n routes[page.route] = { section: section.id, page: page.id };\n }\n }\n\n return {\n ...(shell ? { shell } : {}),\n sections,\n features: [...new Set(features)],\n routes,\n };\n}\n\nfunction buildDNA(essence: Essence): EssenceDNA {\n const shape = essence.theme.shape ?? 'rounded';\n\n return {\n theme: {\n id: essence.theme.id,\n mode: essence.theme.mode,\n ...(essence.theme.shape ? { shape: essence.theme.shape } : {}),\n },\n spacing: {\n base_unit: 4,\n scale: 'linear',\n density: (essence.density?.level ?? 'comfortable') as DensityLevel,\n content_gap: essence.density?.content_gap ?? '_gap4',\n },\n typography: {\n scale: 'modular',\n heading_weight: 600,\n body_weight: 400,\n },\n color: {\n palette: 'semantic',\n accent_count: 1,\n cvd_preference: essence.accessibility?.cvd_preference ?? 'auto',\n },\n radius: {\n philosophy: shape,\n base: inferRadiusBase(shape),\n },\n elevation: {\n system: 'layered',\n max_levels: 3,\n },\n motion: {\n preference: 'subtle',\n duration_scale: 1,\n reduce_motion: true,\n },\n accessibility: {\n wcag_level: essence.accessibility?.wcag_level ?? 'AA',\n focus_visible: true,\n skip_nav: true,\n },\n personality: essence.personality ?? ['professional'],\n };\n}\n\nfunction buildMeta(essence: Essence): EssenceMeta {\n return {\n archetype: essence.archetype,\n target: essence.target,\n platform: essence.platform,\n guard: migrateGuard(essence.guard.mode),\n };\n}\n\nfunction migrateGuard(mode: GuardMode): EssenceMeta['guard'] {\n switch (mode) {\n case 'strict':\n return { mode: 'strict', dna_enforcement: 'error', blueprint_enforcement: 'warn' };\n case 'guided':\n return { mode: 'guided', dna_enforcement: 'error', blueprint_enforcement: 'off' };\n default:\n return { mode: 'creative', dna_enforcement: 'off', blueprint_enforcement: 'off' };\n }\n}\n\nfunction inferRadiusBase(shape: ThemeShape | string): number {\n switch (shape) {\n case 'pill':\n return 12;\n case 'rounded':\n return 8;\n case 'sharp':\n return 2;\n default:\n return 8;\n }\n}\n","import type { EssenceFile } from './types.js';\nimport { isV4 } from './types.js';\n\nconst V4_REQUIRED_MESSAGE =\n 'Active Decantr V2 workflows require Essence v4.0.0. Run `decantr migrate --to v4` for older essence files.';\n\nexport function normalizeEssence(input: Record<string, unknown>): EssenceFile {\n if (isV4(input)) {\n return input;\n }\n\n throw new Error(V4_REQUIRED_MESSAGE);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport Ajv from 'ajv';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst v2SchemaPath = join(__dirname, '..', 'schema', 'essence.v2.json');\nconst v3SchemaPath = join(__dirname, '..', 'schema', 'essence.v3.json');\nconst v4SchemaPath = join(__dirname, '..', 'schema', 'essence.v4.json');\n\nlet cachedAjv: Ajv | null = null;\nconst validatorCache = new Map<string, ReturnType<Ajv['compile']>>();\n\nfunction getAjv(): Ajv {\n if (!cachedAjv) {\n cachedAjv = new Ajv({ allErrors: true, strict: false, validateSchema: false });\n }\n return cachedAjv;\n}\n\nfunction getValidator(version: 'v2' | 'v3' | 'v4'): ReturnType<Ajv['compile']> | null {\n if (validatorCache.has(version)) return validatorCache.get(version)!;\n\n const schemaPath =\n version === 'v4' ? v4SchemaPath : version === 'v3' ? v3SchemaPath : v2SchemaPath;\n if (!existsSync(schemaPath)) return null;\n\n const schema = JSON.parse(readFileSync(schemaPath, 'utf-8'));\n const ajv = getAjv();\n const validate = ajv.compile(schema);\n validatorCache.set(version, validate);\n return validate;\n}\n\nfunction detectLegacyVersion(data: unknown): 'v2' | 'v3' {\n if (typeof data === 'object' && data !== null && 'version' in data) {\n const v = (data as Record<string, unknown>).version;\n if (v === '3.0.0' || v === '3.1.0') return 'v3';\n }\n return 'v2';\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nexport function validateEssence(data: unknown): ValidationResult {\n const version =\n typeof data === 'object' && data !== null ? (data as { version?: unknown }).version : undefined;\n if (version !== '4.0.0') {\n return {\n valid: false,\n errors: [\n 'Active Decantr V2 workflows require Essence v4.0.0. Run `decantr migrate --to v4` for older essence files.',\n ],\n };\n }\n\n const validate = getValidator('v4');\n\n if (!validate) {\n return { valid: false, errors: ['No schema available for v4 documents'] };\n }\n\n const valid = validate(data);\n\n if (valid) {\n return { valid: true, errors: [] };\n }\n\n const errors = (validate.errors ?? []).map((err) => {\n const path = err.instancePath || '/';\n const msg = err.message ?? 'unknown error';\n return `${path}: ${msg}`;\n });\n\n return { valid: false, errors };\n}\n\nexport function validateLegacyEssenceForMigration(data: unknown): ValidationResult {\n const version =\n typeof data === 'object' && data !== null && (data as { version?: unknown }).version === '4.0.0'\n ? 'v4'\n : detectLegacyVersion(data);\n const validate = getValidator(version);\n\n if (!validate) {\n return { valid: false, errors: [`No schema available for ${version} documents`] };\n }\n\n const valid = validate(data);\n if (valid) {\n return { valid: true, errors: [] };\n }\n\n const errors = (validate.errors ?? []).map((err) => {\n const path = err.instancePath || '/';\n const msg = err.message ?? 'unknown error';\n return `${path}: ${msg}`;\n });\n\n return { valid: false, errors };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
package/schema/essence.v4.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://decantr.ai/schemas/essence.v4.json",
|
|
4
4
|
"title": "Decantr Essence v4",
|
|
5
|
-
"description": "Decantr
|
|
5
|
+
"description": "Decantr Essence V4 active sectioned design contract",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["version", "dna", "blueprint", "meta"],
|
|
8
8
|
"additionalProperties": false,
|