spytial-core 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/integrated-demo-components.css +1 -1
- package/dist/components/integrated-demo-components.css.map +1 -1
- package/dist/components/integrated-demo-components.global.js +131 -131
- package/dist/components/integrated-demo-components.global.js.map +1 -1
- package/dist/components/react-component-integration.css +1 -1
- package/dist/components/react-component-integration.css.map +1 -1
- package/dist/components/react-component-integration.global.js +145 -145
- package/dist/components/react-component-integration.global.js.map +1 -1
- package/dist/components/spec-editor-demo-components.css +1 -1
- package/dist/components/spec-editor-demo-components.css.map +1 -1
- package/dist/components/spec-editor-demo-components.global.js +137 -137
- package/dist/components/spec-editor-demo-components.global.js.map +1 -1
- package/dist/react.css +141 -0
- package/dist/react.mjs +149 -21
- package/dist/react.mjs.map +1 -1
- package/dist/types/components/CndLayoutInterface.d.ts +7 -1
- package/dist/types/components/index.d.ts +1 -0
- package/dist/types/spec-editor/domain/layout-assistant.d.ts +63 -0
- package/dist/types/spec-editor/index.d.ts +3 -0
- package/dist/types/spec-editor/ui/SpecEditor.d.ts +11 -0
- package/dist/types/spec-editor/ui/SuggestionsPanel.d.ts +18 -0
- package/dist/types/spec-editor/ui/index.d.ts +2 -0
- package/package.json +1 -1
package/dist/react.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ErrorMessageModal/ErrorMessageModal.tsx","../src/components/ErrorMessageModal/ErrorMessageContainer.tsx","../src/layout/error-state.ts","../src/components/InstanceBuilder/InstanceBuilder.tsx","../src/components/ReplInterface/parsers/CoreParsers.ts","../src/data-instance/pyret/pyret-data-instance.ts","../src/components/ReplInterface/parsers/ExtensibleParsers.ts","../src/components/ReplInterface/ReplInterface.tsx","../src/components/ReplInterface/parsers/PyretExpressionParser.ts","../src/components/ReplInterface/parsers/PyretIdAllocationParser.ts","../src/components/ReplInterface/PyretReplInterface.tsx","../src/spec-editor/core/registry.ts","../src/spec-editor/core/id.ts","../src/spec-editor/core/yaml-codec.ts","../src/spec-editor/domain/domain-validation.ts","../src/spec-editor/core/diagnostics.ts","../src/spec-editor/core/spec-document.ts","../src/spec-editor/core/code-positioning.ts","../src/spec-editor/domain/domain-schema.ts","../src/spec-editor/domain/completions.ts","../src/spec-editor/ui/theme.ts","../src/spec-editor/ui/highlight.ts","../src/spec-editor/ui/use-anchored-popup.ts","../src/spec-editor/ui/SelectorField.tsx","../src/spec-editor/ui/FieldRenderer.tsx","../src/spec-editor/ui/CodeView.tsx","../src/spec-editor/ui/BuilderView.tsx","../src/spec-editor/ui/SpecEditor.tsx","../src/components/NoCodeView/shims.ts","../src/components/CndLayoutInterface.tsx","../src/components/ReplInterface/ReplWithVisualization.tsx","../src/components/ProjectionControls/ProjectionControls.tsx","../src/data-instance/projection-transform.ts","../src/components/ProjectionControls/ProjectionOrchestrator.tsx","../src/components/EvaluatorRepl/EvaluatorRepl.tsx","../src/components/RelationHighlighter/RelationHighlighter.tsx"],"names":["messages","sourceConstraints","diagramConstraints","useState","jsx","jsxs","t","args","atom","newId","useCallback","useMemo","useEffect","isRecord","yaml","align","Fragment","React","useRef","asString","asStringArray","topSeverity","useId","syntaxHighlighting","state","textInput"],"mappings":"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","file":"react.mjs","sourcesContent":["import React, { useMemo, useState } from 'react';\nimport './ErrorMessageModal.css';\nimport { ErrorMessages, SystemError, SelectorErrorDetail } from './index';\n\n/**\n * Props for ErrorMessageModal component\n * @public\n */\nexport interface ErrorMessageModalProps {\n /** Error object containing */\n systemError?: SystemError;\n /**\n * Optional id of a `webcola-cnd-graph` element. When provided, hovering a\n * conflicting constraint highlights the referenced nodes in that diagram\n * (via the graph's public `highlightNodes` / `clearNodeHighlights` API).\n */\n graphElementId?: string;\n}\n\n/** Constraint node with bidirectional relationships */\ntype ConstraintNode = {\n id: string;\n content: string;\n relatedIds: string[];\n};\n\n/** Highlight state tracking */\ntype HighlightState = {\n ids: string[];\n source: 'source' | 'diagram' | null;\n};\n\n/**\n * Modal component for displaying error messages in a structured format\n * Supports both constraint conflicts and parse errors\n * @public\n */\nexport const ErrorMessageModal: React.FC<ErrorMessageModalProps> = ({ systemError, graphElementId }: ErrorMessageModalProps) => {\n const [highlightState, setHighlightState] = useState<HighlightState>({ ids: [], source: null });\n const [collapsed, setCollapsed] = useState(false);\n\n /** Minimal shape of the graph element's node-highlighting API */\n type GraphHighlightElement = HTMLElement & {\n highlightNodes?: (nodeIds: string[]) => boolean;\n clearNodeHighlights?: () => boolean;\n };\n\n /**\n * Highlight the diagram nodes referenced inside a hovered constraint item.\n * Node references carry a `data-node-id` attribute (see formatNodeLabel), so\n * we read them straight from the rendered DOM rather than parsing text.\n */\n const highlightGraphNodesFrom = (el: HTMLElement) => {\n if (!graphElementId) return;\n const graph = document.getElementById(graphElementId) as GraphHighlightElement | null;\n if (!graph || typeof graph.highlightNodes !== 'function') return;\n const ids = Array.from(el.querySelectorAll('[data-node-id]'))\n .map(n => n.getAttribute('data-node-id'))\n .filter((id): id is string => !!id);\n if (ids.length > 0) graph.highlightNodes(Array.from(new Set(ids)));\n };\n\n /** Clear any diagram node highlights this modal applied */\n const clearGraphNodeHighlights = () => {\n if (!graphElementId) return;\n const graph = document.getElementById(graphElementId) as GraphHighlightElement | null;\n if (graph && typeof graph.clearNodeHighlights === 'function') graph.clearNodeHighlights();\n };\n\n /**\n * Scroll a hovered item's correspondence into view in the *other* column.\n * The two columns scroll independently, so this reveals the related item\n * without disturbing the column the cursor is over — hover a source\n * constraint and the diagram column scrolls to its correspondence.\n */\n const scrollRelatedIntoView = (el: HTMLElement, relatedIds: string[]) => {\n if (relatedIds.length === 0) return;\n const container = el.closest('.constraint-columns');\n const target = container?.querySelector(`[data-constraint-id=\"${relatedIds[0]}\"]`) as HTMLElement | null;\n // Feature-detect: scrollIntoView is absent in jsdom (tests) and some hosts\n if (target && typeof target.scrollIntoView === 'function') {\n target.scrollIntoView({ block: 'nearest' });\n }\n };\n\n /** Handle mouse enter for constraint highlighting */\n const handleMouseEnter = (e: React.MouseEvent<HTMLElement>, node: ConstraintNode, source: 'source' | 'diagram') => {\n setHighlightState({ ids: [node.id, ...node.relatedIds], source });\n highlightGraphNodesFrom(e.currentTarget);\n scrollRelatedIntoView(e.currentTarget, node.relatedIds);\n };\n\n /**\n * Clear highlighting on mouse leave\n */\n const handleMouseLeave = () => {\n setHighlightState({ ids: [], source: null });\n clearGraphNodeHighlights();\n };\n\n /** \n * Get CSS class for constraint highlighting \n */\n const getHighlightClass = (nodeId: string): string => {\n if (!highlightState.ids.includes(nodeId)) return '';\n return highlightState.source === 'source' ? 'highlight-source' : 'highlight-diagram';\n };\n\n // Validate systemError type\n const isOtherError = systemError && \n (systemError.type === 'parse-error' \n || systemError.type === 'general-error' \n || systemError.type === 'group-overlap-error'\n );\n const isPositionalError = systemError && (systemError.type === 'positional-error' || systemError.type === 'hidden-node-conflict') && systemError.messages;\n const isHiddenNodeError = systemError && systemError.type === 'hidden-node-conflict';\n const isSelectorError = systemError && systemError.type === 'selector-error' && systemError.errors?.length > 0;\n \n // If not a valid error, log error and return null\n if (!isOtherError && !isPositionalError && !isSelectorError) {\n console.error('Cannot display the following error:', systemError);\n return null;\n }\n\n /** Helper function to generate error header */\n const errorHeader = useMemo((): string => {\n const errorType = systemError.type;\n if (errorType === 'parse-error') {\n return `Parse Error ${systemError.source ? `(${systemError.source})` : ''}`;\n } else if (errorType === 'group-overlap-error') {\n return `Group Overlap Error ${systemError.source ? `(${systemError.source})` : ''}`;\n } else if (errorType === 'selector-error') {\n return `Selector Error${systemError.errors.length > 1 ? 's' : ''} (${systemError.errors.length})`;\n } else {\n return 'Error';\n }\n }, [systemError]);\n\n \n /** \n * Transform constraints map into structured data with bidirectional relationships \n */\n const constraintData = useMemo((): { sourceConstraints: ConstraintNode[]; diagramConstraints: ConstraintNode[] } => {\n const messages = isPositionalError ? systemError.messages : undefined;\n if (!messages) return { sourceConstraints: [], diagramConstraints: [] };\n\n function buildConstraintsMap(messages: ErrorMessages): Map<string, Set<string>> {\n const copy = new Map<string, Set<string>>();\n messages.minimalConflictingConstraints.forEach((value, key) => {\n if (!copy.has(key)) {\n copy.set(key, new Set());\n }\n value.forEach(val => copy.get(key)!.add(val));\n });\n\n // Add the source constraint itself\n if (!copy.has(messages.conflictingSourceConstraint)) {\n copy.set(messages.conflictingSourceConstraint, new Set([messages.conflictingConstraint]));\n } else {\n copy.get(messages.conflictingSourceConstraint)!.add(messages.conflictingConstraint);\n }\n\n return copy;\n }\n \n const constraintsMap = buildConstraintsMap(messages);\n const sourceConstraints: ConstraintNode[] = [];\n const diagramConstraints: ConstraintNode[] = [];\n const diagramMap = new Map<string, string>();\n \n // First pass to create diagram constraints with IDs\n [...constraintsMap.values()].forEach((constraints, groupIdx) => {\n [...constraints.values()].map((content, idx) => {\n const id = `diagram-${groupIdx}-${idx}`;\n diagramMap.set(content, id);\n diagramConstraints.push({ id, content, relatedIds: [] });\n });\n });\n \n // Second pass to create source constraints with relationships\n [...constraintsMap.entries()].forEach(([sourceContent, relatedContents], idx) => {\n const id = `source-${idx}`;\n const relatedIds = [...relatedContents.values()].map(content => diagramMap.get(content)!);\n \n sourceConstraints.push({ id, content: sourceContent, relatedIds });\n \n // Add back-references to diagram constraints\n relatedIds.forEach(relatedId => {\n const diagNode = diagramConstraints.find(d => d.id === relatedId);\n if (diagNode) diagNode.relatedIds.push(id);\n });\n });\n \n return { sourceConstraints, diagramConstraints };\n }, [systemError]);\n\n const { sourceConstraints, diagramConstraints } = constraintData;\n\n // Compute header and description based on error type\n const headerText = useMemo(() => {\n if (isSelectorError) return 'Selector Evaluation Error';\n if (isOtherError) return 'Error';\n if (isHiddenNodeError) return 'Hidden Node Conflict';\n return 'Could not satisfy all constraints';\n }, [isSelectorError, isOtherError, isHiddenNodeError]);\n\n const descriptionText = useMemo(() => {\n if (isSelectorError) return 'One or more selectors in your layout specification could not be evaluated.';\n if (isOtherError) return 'An error occurred while processing your data.';\n if (isHiddenNodeError) return 'Some constraints reference nodes that are hidden by a hideAtom directive. The conflicting constraints have been dropped from the layout.';\n return 'Your data causes the following visualization constraints to conflict.';\n }, [isSelectorError, isOtherError, isHiddenNodeError]);\n\n return (\n <div id=\"error-message-modal\" className=\"mt-3 d-flex flex-column overflow-x-auto p-3 rounded border border-danger border-2\">\n <div className=\"error-modal-header d-flex justify-content-between align-items-center\">\n <h4 className=\"mb-0\" style={{color: 'var(--bs-danger)'}}>{headerText}</h4>\n <button\n type=\"button\"\n className=\"error-modal-toggle\"\n aria-expanded={!collapsed}\n aria-label={collapsed ? 'Expand error details' : 'Collapse error details'}\n title={collapsed ? 'Expand error details' : 'Collapse error details'}\n onClick={() => setCollapsed(c => !c)}\n >\n {collapsed ? '▸' : '▾'}\n </button>\n </div>\n {!collapsed && (\n <>\n <p>{descriptionText}</p>\n {/* Parse/Generic/Group Error Card */}\n {isOtherError && (\n <>\n <div className=\"card error-card\">\n <div className=\"card-header bg-light\">\n <strong>\n { errorHeader }\n </strong>\n </div>\n <div className=\"card-body\">\n <code dangerouslySetInnerHTML={{ __html: systemError.message }}></code>\n </div>\n </div>\n </>\n )}\n\n {/* (Positional) Constraint Error Cards */}\n { isPositionalError && (\n <>\n <p id=\"hover-instructions\">Hover over the conflicting constraints to see the corresponding diagram elements that cannot be visualized. </p>\n <div className=\"constraint-relationship-table\">\n <div className=\"constraint-columns\">\n <div className=\"constraint-column\">\n <div className=\"constraint-column-header\">Source Constraints</div>\n <div className=\"constraint-column-body source-constraints-cell\">\n {sourceConstraints.map(node => (\n <div\n key={node.id}\n data-constraint-id={node.id}\n className={`constraint-item ${getHighlightClass(node.id)}`}\n onMouseEnter={(e) => handleMouseEnter(e, node, 'source')}\n onMouseLeave={handleMouseLeave}\n >\n <code dangerouslySetInnerHTML={{ __html: node.content }}></code>\n </div>\n ))}\n </div>\n </div>\n <div className=\"constraint-column\">\n <div className=\"constraint-column-header\">Diagram Elements</div>\n <div className=\"constraint-column-body diagram-constraints-cell\">\n {diagramConstraints.map(node => (\n <div\n key={node.id}\n data-constraint-id={node.id}\n className={`constraint-item ${getHighlightClass(node.id)}`}\n onMouseEnter={(e) => handleMouseEnter(e, node, 'diagram')}\n onMouseLeave={handleMouseLeave}\n >\n <code dangerouslySetInnerHTML={{ __html: node.content }}></code>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </>\n )}\n\n {/* Selector Error Cards */}\n {isSelectorError && (\n <>\n <div className=\"card error-card\">\n <div className=\"card-header bg-light\">\n <strong>{errorHeader}</strong>\n </div>\n <div className=\"card-body\">\n <p className=\"mb-2\">The following selectors failed to evaluate. Check your selector syntax.</p>\n <ul className=\"list-unstyled mb-0\">\n {systemError.errors.map((selectorError: SelectorErrorDetail, idx: number) => (\n <li key={idx} className=\"mb-2 p-2 bg-light rounded\">\n <div><strong>Selector:</strong> <code>{selectorError.selector}</code></div>\n <div><strong>Context:</strong> {selectorError.context}</div>\n <div className=\"text-danger\"><strong>Error:</strong> {selectorError.errorMessage}</div>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </>\n )}\n </>\n )}\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { ErrorMessageModal } from './ErrorMessageModal';\nimport { ErrorStateManager, type SystemError } from './ErrorStateManager';\n\n/**\n * Props for the ErrorMessageContainer component\n */\nexport interface ErrorMessageContainerProps {\n /** Error state manager instance */\n errorManager: ErrorStateManager;\n /** Additional CSS classes */\n className?: string;\n /**\n * Optional id of a `webcola-cnd-graph` element. When set, hovering a\n * conflicting constraint highlights the referenced nodes in that diagram.\n */\n graphElementId?: string;\n}\n\n/**\n * Container component that manages error message display\n * Handles both simple parse errors and complex constraint conflicts\n */\nexport const ErrorMessageContainer: React.FC<ErrorMessageContainerProps> = ({\n errorManager,\n className = '',\n graphElementId\n}) => {\n const [currentError, setCurrentError] = useState<SystemError | null>(\n errorManager.getCurrentError()\n );\n\n useEffect(() => {\n // Subscribe to error state changes\n const handleErrorChange = (error: SystemError | null) => {\n console.log('ErrorMessageContainer received error change:', error);\n setCurrentError(error);\n };\n errorManager.onErrorChange(handleErrorChange);\n console.log('ErrorMessageContainer subscribed to error changes');\n }, [errorManager]);\n\n console.log('ErrorMessageContainer rendering, currentError:', currentError);\n\n // Don't render anything if no error\n if (!currentError) {\n return null;\n }\n\n const containerClassName = `error-message-container ${className}`.trim();\n \n return (\n <div className={containerClassName}>\n <ErrorMessageModal\n systemError={currentError}\n graphElementId={graphElementId}\n />\n </div>\n );\n};\n\nexport default ErrorMessageContainer;","import type { ErrorMessages } from './constraint-types';\n\n/**\n * Error state shared between the layout engine and the (separately bundled)\n * error-modal UI. Lives in layout/ — not components/ — so that core modules\n * (e.g. layoutinstance.ts) can use these shapes without pulling any React\n * component code into the core bundle. The historical import path\n * `components/ErrorMessageModal/ErrorStateManager` re-exports everything here.\n */\n\n/**\n * Represents a single selector evaluation error.\n * Captures context about which selector failed and why.\n */\nexport interface SelectorErrorDetail {\n /** The selector expression that failed */\n selector: string;\n /** Context about where/why the selector was being evaluated (e.g., \"hideAtom selector\", \"attribute filter\") */\n context: string;\n /** The error message from the evaluation */\n errorMessage: string;\n}\n\n/**\n * Represents different types of errors that can occur in the system\n */\nexport type SystemError = {\n type: 'parse-error';\n message: string;\n source?: string;\n} | {\n type: 'positional-error';\n messages: ErrorMessages;\n} | {\n type: 'hidden-node-conflict';\n messages: ErrorMessages;\n} | {\n type: 'group-overlap-error'; // New type\n message: string;\n source?: string;\n} | {\n type: 'general-error';\n message: string;\n} | {\n type: 'selector-error';\n /** List of selector errors encountered during layout evaluation */\n errors: SelectorErrorDetail[];\n};\n\n/**\n * Minimal error state manager for handling different error types\n * Follows functional programming principles with immutable state\n */\nexport class ErrorStateManager {\n private currentError: SystemError | null = null;\n private errorCallbacks: ((error: SystemError | null) => void)[] = [];\n\n /**\n * Set the current error state\n * @param error - The error to set, or null to clear\n */\n public setError(error: SystemError | null): void {\n this.currentError = error;\n this.notifyCallbacks();\n }\n\n /**\n * Clear the current error state\n */\n public clearError(): void {\n this.currentError = null;\n this.notifyCallbacks();\n }\n\n /**\n * Get the current error state\n * @returns Current error or null if no error\n */\n public getCurrentError(): SystemError | null {\n return this.currentError;\n }\n\n /**\n * Subscribe to error state changes\n * @param callback - Function to call when error state changes\n */\n public onErrorChange(callback: (error: SystemError | null) => void): void {\n this.errorCallbacks.push(callback);\n }\n\n /**\n * Check if there's currently an error\n * @returns True if there's an active error\n */\n public hasError(): boolean {\n return this.currentError !== null;\n }\n\n /**\n * Notify all subscribed callbacks of error state change\n */\n private notifyCallbacks(): void {\n this.errorCallbacks.forEach(callback => callback(this.currentError));\n }\n}\n","import * as React from 'react';\nimport { useState, useCallback, useEffect } from 'react';\nimport { IAtom, IRelation, ITuple, IInputDataInstance } from '../../data-instance/interfaces';\nimport './InstanceBuilder.css';\n\n/**\n * Generate a unique atom ID based on existing atoms in the instance\n */\nfunction generateAtomId(instance: IInputDataInstance, typeName : string): string {\n const existingAtoms = instance.getAtoms();\n const existingIds = new Set(existingAtoms.map(atom => atom.id));\n \n let counter = 1;\n let candidateId = `${typeName}-${counter}`;\n \n while (existingIds.has(candidateId)) {\n counter++;\n candidateId = `${typeName}-${counter}`;\n }\n \n return candidateId;\n}\n\nexport interface InstanceBuilderProps {\n /** The data instance to build/modify - REQUIRED */\n instance: IInputDataInstance;\n /** Callback when the instance changes */\n onChange?: (instance: IInputDataInstance) => void;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** CSS class name for styling */\n className?: string;\n}\n\ninterface AtomForm {\n id: string;\n label: string;\n type: string;\n}\n\ninterface RelationForm {\n name: string;\n atomIds: string[]; // Changed from sourceId/targetId to support n-ary\n}\n\n/**\n * InstanceBuilder - A reusable React component for constructing IDataInstance objects\n * \n * Provides forms to add/remove atoms and relations, working directly with the provided instance.\n * The parent component is responsible for providing and managing the instance.\n */\nexport const InstanceBuilder: React.FC<InstanceBuilderProps> = ({\n instance,\n onChange,\n disabled = false,\n className = ''\n}) => {\n // Form state for adding atoms\n const [atomForm, setAtomForm] = useState<AtomForm>({\n id: '',\n label: '',\n type: 'Entity'\n });\n\n // Compute a suggested ID based on type and current atoms\n const suggestedId = generateAtomId(instance, atomForm.type.trim() || 'Entity');\n\n // Form state for adding relations - start with binary (2 atoms)\n const [relationForm, setRelationForm] = useState<RelationForm>({\n name: '',\n atomIds: ['', ''] // Start with binary relation\n });\n\n // Error state\n const [error, setError] = useState<string>('');\n\n // Get current atoms and relations from instance\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n\n // Notify parent when instance changes (optional callback)\n const notifyChange = useCallback(() => {\n if (onChange) {\n onChange(instance);\n }\n }, [instance, onChange]);\n\n /**\n * Add a new atom to the instance\n */\n const handleAddAtom = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n if (!atomForm.label.trim()) {\n setError('Atom label is required');\n return;\n }\n const typeInfo = atomForm.type.trim() || 'Entity';\n // Use user-provided ID if present, otherwise use suggested\n const id = atomForm.id.trim() || generateAtomId(instance, typeInfo);\n if (!id) {\n setError('Atom ID could not be generated');\n return;\n }\n // Check for duplicate ID\n if (instance.getAtoms().some(atom => atom.id === id)) {\n setError('Atom ID already exists');\n return;\n }\n try {\n const newAtom: IAtom = {\n id,\n label: atomForm.label.trim(),\n type: typeInfo\n };\n instance.addAtom(newAtom);\n setAtomForm({ id: '', label: '', type: 'Entity' });\n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add atom');\n }\n }, [atomForm, instance, notifyChange]);\n\n /**\n * Remove an atom from the instance\n */\n const handleRemoveAtom = useCallback((atomId: string) => {\n try {\n instance.removeAtom(atomId);\n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to remove atom');\n }\n }, [instance, notifyChange]);\n\n /**\n * Add a new atom position to the relation form\n */\n const handleAddAtomPosition = useCallback(() => {\n setRelationForm(prev => ({\n ...prev,\n atomIds: [...prev.atomIds, '']\n }));\n }, []);\n\n /**\n * Remove the last atom position from the relation form (minimum 2)\n */\n const handleRemoveAtomPosition = useCallback(() => {\n setRelationForm(prev => ({\n ...prev,\n atomIds: prev.atomIds.length > 2 ? prev.atomIds.slice(0, -1) : prev.atomIds\n }));\n }, []);\n\n /**\n * Update a specific atom ID in the relation form\n */\n const handleUpdateAtomId = useCallback((index: number, atomId: string) => {\n setRelationForm(prev => ({\n ...prev,\n atomIds: prev.atomIds.map((id, i) => i === index ? atomId : id)\n }));\n }, []);\n\n /**\n * Add a new relation tuple to the instance\n */\n const handleAddRelation = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n if (!relationForm.name.trim()) {\n setError('Relation name is required');\n return;\n }\n\n // Validate all atom positions are filled\n const cleanAtomIds = relationForm.atomIds.map(id => id.trim()).filter(id => id !== '');\n if (cleanAtomIds.length < 2) {\n setError('At least 2 atoms are required for a relation');\n return;\n }\n if (cleanAtomIds.length !== relationForm.atomIds.length) {\n setError('All atom positions must be selected');\n return;\n }\n\n try {\n const tuple: ITuple = {\n atoms: cleanAtomIds,\n types: cleanAtomIds.map(() => 'unknown') // Types will be inferred from actual atoms\n };\n\n instance.addRelationTuple(relationForm.name.trim(), tuple);\n setRelationForm({ name: '', atomIds: ['', ''] }); // Reset to binary\n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add relation');\n }\n }, [relationForm, instance, notifyChange]);\n\n /**\n * Remove a relation tuple from the instance\n */\n const handleRemoveRelationTuple = useCallback((relationId: string, tuple: ITuple) => {\n try {\n instance.removeRelationTuple(relationId, tuple);\n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to remove relation');\n }\n }, [instance, notifyChange]);\n\n /**\n * Clear all data from the instance\n */\n const handleClear = useCallback(() => {\n try {\n // Remove all atoms and relations from the current instance\n const atomIds = instance.getAtoms().map(atom => atom.id);\n atomIds.forEach(id => instance.removeAtom(id));\n \n const relationIds = instance.getRelations().map(rel => rel.id);\n relationIds.forEach(id => {\n const relation = instance.getRelations().find(r => r.id === id);\n if (relation) {\n relation.tuples.forEach(tuple => instance.removeRelationTuple(id, tuple));\n }\n });\n \n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to clear instance');\n }\n }, [instance, notifyChange]);\n\n // State for re-ify result\n const [reifyResult, setReifyResult] = useState<any>(null);\n\n // Handler for re-ify button\n const handleReify = useCallback(() => {\n // Debug: log the instance and its methods\n // eslint-disable-next-line no-console\n console.log('Instance in handleReify:', instance);\n // eslint-disable-next-line no-console\n console.log('typeof instance.reify:', typeof (instance as any).reify);\n if (typeof instance.reify === 'function') {\n try {\n const result = instance.reify();\n setReifyResult(result);\n } catch (err) {\n setReifyResult('Re-ify failed: ' + (err instanceof Error ? err.message : String(err)));\n }\n } else {\n setReifyResult('Re-ify not supported on this instance.');\n }\n }, [instance]);\n\n /**\n * Format tuple atoms for display with proper n-ary notation\n */\n const formatTupleDisplay = useCallback((tuple: ITuple): string => {\n if (tuple.atoms.length === 2) {\n return `${tuple.atoms[0]} → ${tuple.atoms[1]}`;\n }\n return `(${tuple.atoms.join(', ')})`;\n }, []);\n\n return (\n <div className={`instance-builder ${className}`}>\n <div className=\"instance-builder__header\">\n <h2>Instance Builder</h2>\n <div className=\"instance-builder__stats\">\n <span>{atoms.length} atoms</span>\n <span>{relations.reduce((sum, rel) => sum + rel.tuples.length, 0)} relations</span>\n </div>\n </div>\n\n {error && (\n <div className=\"instance-builder__error\">\n {error}\n <button \n type=\"button\" \n onClick={() => setError('')}\n aria-label=\"Clear error\"\n >\n ×\n </button>\n </div>\n )}\n\n <div className=\"instance-builder__content\">\n {/* Atom Management Section */}\n <section className=\"instance-builder__section\">\n <h3>Atoms</h3>\n \n {/* Add Atom Form */}\n <form onSubmit={handleAddAtom} className=\"instance-builder__form\">\n <div className=\"form-row\">\n <input\n type=\"text\"\n placeholder={`ID (suggested: ${suggestedId})`}\n value={atomForm.id}\n onChange={(e: any) => setAtomForm(prev => ({ ...prev, id: e.target.value }))}\n disabled={disabled}\n aria-label=\"Atom ID\"\n />\n <input\n type=\"text\"\n placeholder=\"Label\"\n value={atomForm.label}\n onChange={(e) => setAtomForm(prev => ({ ...prev, label: e.target.value }))}\n disabled={disabled}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Type\"\n value={atomForm.type}\n onChange={(e) => setAtomForm(prev => ({ ...prev, type: e.target.value }))}\n disabled={disabled}\n />\n <button type=\"submit\" disabled={disabled}>\n Add Atom\n </button>\n </div>\n {atomForm.id === '' && (\n <div style={{ fontSize: '0.85em', color: '#888', marginTop: 2 }}>\n Suggested ID: <code>{suggestedId}</code>\n </div>\n )}\n </form>\n\n {/* Atoms List */}\n <div className=\"instance-builder__list\">\n {atoms.length === 0 ? (\n <p className=\"empty-state\">No atoms yet. Add one above.</p>\n ) : (\n atoms.map((atom) => (\n <div key={atom.id} className=\"list-item\">\n <div className=\"item-info\">\n <strong>{atom.id}</strong>\n <span className=\"item-label\">{atom.label}</span>\n <span className=\"item-type\">{atom.type}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => handleRemoveAtom(atom.id)}\n disabled={disabled}\n className=\"remove-button\"\n aria-label={`Remove atom ${atom.id}`}\n >\n Remove\n </button>\n </div>\n ))\n )}\n </div>\n </section>\n\n {/* Relation Management Section */}\n <section className=\"instance-builder__section\">\n <h3>Relations (N-ary Support)</h3>\n \n {/* Add Relation Form */}\n <form onSubmit={handleAddRelation} className=\"instance-builder__form\">\n <div className=\"form-row\">\n <input\n type=\"text\"\n placeholder=\"Relation Name\"\n value={relationForm.name}\n onChange={(e) => setRelationForm(prev => ({ ...prev, name: e.target.value }))}\n disabled={disabled}\n required\n />\n </div>\n \n {/* Dynamic atom selectors for n-ary relations */}\n <div className=\"relation-atoms\">\n <div style={{ fontSize: '0.9em', color: '#666', marginBottom: 8 }}>\n Atoms (arity: {relationForm.atomIds.length}):\n </div>\n {relationForm.atomIds.map((atomId, index) => (\n <div key={index} className=\"atom-selector\">\n <label style={{ fontSize: '0.85em', color: '#666' }}>\n Position {index + 1}:\n </label>\n <select\n value={atomId}\n onChange={(e) => handleUpdateAtomId(index, e.target.value)}\n disabled={disabled}\n required\n >\n <option value=\"\">Select Atom</option>\n {atoms.map(atom => (\n <option key={atom.id} value={atom.id}>\n {atom.id} ({atom.label})\n </option>\n ))}\n </select>\n </div>\n ))}\n \n {/* Add/Remove atom position buttons */}\n <div className=\"arity-controls\" style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={handleAddAtomPosition}\n disabled={disabled}\n style={{ marginRight: 8 }}\n >\n + Add Position\n </button>\n {relationForm.atomIds.length > 2 && (\n <button\n type=\"button\"\n onClick={handleRemoveAtomPosition}\n disabled={disabled}\n >\n - Remove Position\n </button>\n )}\n </div>\n </div>\n \n <div className=\"form-row\" style={{ marginTop: 12 }}>\n <button type=\"submit\" disabled={disabled || relationForm.atomIds.some(id => !id.trim())}>\n Add Relation\n </button>\n </div>\n </form>\n\n {/* Relations List */}\n <div className=\"instance-builder__list\">\n {relations.length === 0 ? (\n <p className=\"empty-state\">No relations yet. Add one above.</p>\n ) : (\n relations.map((relation) => (\n <div key={relation.id} className=\"relation-group\">\n <h4>{relation.name}</h4>\n {relation.tuples.map((tuple, tupleIndex) => (\n <div key={tupleIndex} className=\"list-item\">\n <div className=\"item-info\">\n <span>{formatTupleDisplay(tuple)}</span>\n <span className=\"item-type\" style={{ fontSize: '0.8em', color: '#666' }}>\n arity: {tuple.atoms.length}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => handleRemoveRelationTuple(relation.id, tuple)}\n disabled={disabled}\n className=\"remove-button\"\n aria-label={`Remove relation ${relation.name} tuple`}\n >\n Remove\n </button>\n </div>\n ))}\n </div>\n ))\n )}\n </div>\n </section>\n\n {/* Actions Section */}\n <section className=\"instance-builder__actions\">\n <button\n type=\"button\"\n onClick={handleClear}\n disabled={disabled}\n className=\"clear-button\"\n >\n Clear All\n </button>\n <button\n type=\"button\"\n onClick={handleReify}\n disabled={disabled}\n className=\"reify-button\"\n style={{ marginLeft: 8 }}\n >\n Re-ify\n </button>\n </section>\n {/* Re-ify Result Display */}\n {reifyResult !== null && (\n <section className=\"instance-builder__reify-result\" style={{ marginTop: 12, background: '#f8f8f8', border: '1px solid #eee', borderRadius: 4, padding: 10 }}>\n <strong>Re-ify Result:</strong>\n <pre style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0 }}>\n {typeof reifyResult === 'string' ? reifyResult : JSON.stringify(reifyResult, null, 2)}\n </pre>\n </section>\n )}\n </div>\n </div>\n );\n};\n","import { IAtom, ITuple, IInputDataInstance } from '../../../data-instance/interfaces';\n\n/**\n * Result of executing a command\n */\nexport interface CommandResult {\n success: boolean;\n message: string;\n action?: 'add' | 'remove' | 'info' | 'help';\n /** Extracted CnD specification (if any) from expressions with _cndspec method */\n extractedCndSpec?: string;\n}\n\n/**\n * Base interface for command parsers\n */\nexport interface ICommandParser {\n /**\n * Parse and execute a command\n * Can return either a synchronous result or a Promise for async operations\n */\n execute(command: string, instance: IInputDataInstance): CommandResult | Promise<CommandResult>;\n \n /**\n * Get help text for this parser\n */\n getHelp(): string[];\n \n /**\n * Check if this parser can handle the given command\n */\n canHandle(command: string): boolean;\n \n /**\n * Get the priority of this parser (higher number = higher priority)\n * Used to resolve conflicts when multiple parsers claim they can handle a command\n */\n getPriority(): number;\n \n /**\n * Get the command patterns this parser recognizes\n * Used for better debugging and maintainability\n */\n getCommandPatterns(): string[];\n}\n\n/**\n * Parser for remove commands (sugar syntax)\n * Supports:\n * - remove ID (remove atom by ID)\n * - remove Label:Type (remove atom by label and type)\n * - remove source.relation=target (remove specific relation tuple)\n * - remove relation (remove entire relation)\n */\nexport class RemoveCommandParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n return trimmed.startsWith('remove ') && trimmed.length > 7;\n }\n \n getPriority(): number {\n return 200; // Higher priority than other parsers to handle remove commands first\n }\n \n getCommandPatterns(): string[] {\n return [\n 'remove ID',\n 'remove Label:Type',\n 'remove source.relation=target',\n 'remove relation',\n 'remove Atom.REL',\n 'remove edge_id'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n const args = trimmed.substring(7); // Remove \"remove \" prefix\n \n try {\n // Pattern 1: remove source.relation=target (specific relation tuple)\n if (args.includes('.') && args.includes('=')) {\n return this.handleRemoveRelationTuple(args, instance);\n }\n \n // Pattern 2: remove Atom.REL (all relations of type REL from Atom)\n if (args.includes('.') && !args.includes('=')) {\n return this.handleRemoveAtomRelation(args, instance);\n }\n \n // Pattern 3: remove Label:Type (atom by label and type)\n if (args.includes(':') && !args.includes('->')) {\n return this.handleRemoveAtomByLabelType(args, instance);\n }\n \n // Pattern 4: remove edge_id (remove specific edge by ID)\n if (this.looksLikeEdgeId(args, instance)) {\n return this.handleRemoveEdgeById(args, instance);\n }\n \n // Pattern 5: remove ID (atom by ID) or relation (entire relation by name)\n // Try atom first, then fallback to relation\n if (/^[^\\s:->().]+$/.test(args)) {\n // Try to find atom first\n const atoms = instance.getAtoms();\n const atomToRemove = atoms.find(a => a.id === args);\n \n if (atomToRemove) {\n return this.handleRemoveAtomById(args, instance);\n } else {\n // No atom found, try relation\n const relations = instance.getRelations();\n const relationToRemove = relations.find(r => r.name === args);\n \n if (relationToRemove) {\n return this.handleRemoveRelation(args, instance);\n } else {\n // Neither atom nor relation found\n return {\n success: false,\n message: `Atom or relation not found: ${args}`\n };\n }\n }\n }\n \n return {\n success: false,\n message: `Invalid remove syntax: ${args}`\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to remove'\n };\n }\n }\n\n private handleRemoveAtomById(id: string, instance: IInputDataInstance): CommandResult {\n const atoms = instance.getAtoms();\n const atomToRemove = atoms.find(a => a.id === id);\n \n if (!atomToRemove) {\n return {\n success: false,\n message: `Atom not found with ID: ${id}`\n };\n }\n \n instance.removeAtom(atomToRemove.id);\n \n return {\n success: true,\n message: `[${atomToRemove.id}] Removed atom: ${atomToRemove.label}:${atomToRemove.type}`,\n action: 'remove'\n };\n }\n\n private handleRemoveAtomByLabelType(args: string, instance: IInputDataInstance): CommandResult {\n const [label, type] = args.split(':');\n const atoms = instance.getAtoms();\n const atomToRemove = atoms.find(a => a.label === label.trim() && a.type === type.trim());\n \n if (!atomToRemove) {\n return {\n success: false,\n message: `Atom not found: ${args}`\n };\n }\n \n instance.removeAtom(atomToRemove.id);\n \n return {\n success: true,\n message: `[${atomToRemove.id}] Removed atom: ${atomToRemove.label}:${atomToRemove.type}`,\n action: 'remove'\n };\n }\n\n private handleRemoveRelationTuple(args: string, instance: IInputDataInstance): CommandResult {\n const match = args.match(/^([^.]+)\\.([^=]+)=(.+)$/);\n if (!match) {\n return {\n success: false,\n message: `Invalid relation format: ${args}`\n };\n }\n \n const sourceId = match[1].trim();\n const relationName = match[2].trim();\n const targetId = match[3].trim();\n \n const relation = instance.getRelations().find(r => r.name === relationName);\n if (!relation) {\n return {\n success: false,\n message: `Relation '${relationName}' not found`\n };\n }\n \n const tuple = relation.tuples.find(t => \n t.atoms.length === 2 && \n t.atoms[0] === sourceId && \n t.atoms[1] === targetId\n );\n \n if (!tuple) {\n return {\n success: false,\n message: `Tuple not found: ${sourceId}.${relationName}=${targetId}`\n };\n }\n \n instance.removeRelationTuple(relationName, tuple);\n \n return {\n success: true,\n message: `[${sourceId}.${relationName}=${targetId}] Removed tuple: ${relationName}(${sourceId}, ${targetId})`,\n action: 'remove'\n };\n }\n\n private handleRemoveRelation(relationName: string, instance: IInputDataInstance): CommandResult {\n const relation = instance.getRelations().find(r => r.name === relationName);\n if (!relation) {\n return {\n success: false,\n message: `Relation '${relationName}' not found`\n };\n }\n \n const tupleCount = relation.tuples.length;\n relation.tuples.slice().forEach(tuple => {\n instance.removeRelationTuple(relationName, tuple);\n });\n \n return {\n success: true,\n message: `[${relationName}] Removed relation '${relationName}' (${tupleCount} tuples)`,\n action: 'remove'\n };\n }\n\n private handleRemoveAtomRelation(args: string, instance: IInputDataInstance): CommandResult {\n // Pattern: Atom.REL - remove all relations of type REL from Atom\n const match = args.match(/^([^.]+)\\.([^.]+)$/);\n if (!match) {\n return {\n success: false,\n message: `Invalid atom.relation syntax: ${args}`\n };\n }\n \n const [, atomId, relationName] = match;\n \n // Find the atom\n const atom = instance.getAtoms().find(a => a.id === atomId);\n if (!atom) {\n return {\n success: false,\n message: `Atom '${atomId}' not found`\n };\n }\n \n // Find the relation\n const relation = instance.getRelations().find(r => r.name === relationName);\n if (!relation) {\n return {\n success: false,\n message: `Relation '${relationName}' not found`\n };\n }\n \n // Remove all tuples where the atom appears as the first element (source)\n const originalTupleCount = relation.tuples.length;\n const tuplesToRemove = relation.tuples.filter(tuple => tuple.atoms[0] === atomId);\n \n if (tuplesToRemove.length === 0) {\n return {\n success: false,\n message: `No ${relationName} relations found for atom '${atomId}'`\n };\n }\n \n // Remove the tuples\n tuplesToRemove.forEach(tuple => {\n instance.removeRelationTuple(relationName, tuple);\n });\n \n return {\n success: true,\n message: `[${atomId}.${relationName}] Removed ${tuplesToRemove.length} ${relationName} relations from '${atomId}'`,\n action: 'remove'\n };\n }\n\n private looksLikeEdgeId(args: string, instance: IInputDataInstance): boolean {\n // Check if args looks like an edge ID by examining existing relations\n // Edge IDs typically have format like: relationName:atom1->atom2\n return args.includes(':') && args.includes('->');\n }\n\n private handleRemoveEdgeById(edgeId: string, instance: IInputDataInstance): CommandResult {\n // Parse edge ID format: relationName:atom1->atom2->...\n const colonIndex = edgeId.indexOf(':');\n if (colonIndex === -1) {\n return {\n success: false,\n message: `Invalid edge ID format: ${edgeId}. Expected format: relationName:atom1->atom2`\n };\n }\n \n const relationName = edgeId.substring(0, colonIndex);\n const atomChain = edgeId.substring(colonIndex + 1);\n const atoms = atomChain.split('->');\n \n // Find the relation\n const relation = instance.getRelations().find(r => r.name === relationName);\n if (!relation) {\n return {\n success: false,\n message: `Relation '${relationName}' not found`\n };\n }\n \n // Find the specific tuple with matching atoms\n const targetTuple = relation.tuples.find(tuple => \n tuple.atoms.length === atoms.length &&\n tuple.atoms.every((atomId, index) => atomId === atoms[index])\n );\n \n if (!targetTuple) {\n return {\n success: false,\n message: `Edge '${edgeId}' not found`\n };\n }\n \n // Remove the tuple\n instance.removeRelationTuple(relationName, targetTuple);\n \n return {\n success: true,\n message: `[${edgeId}] Removed edge: ${relationName}(${atoms.join(', ')})`,\n action: 'remove'\n };\n }\n\n getHelp(): string[] {\n return [\n 'Remove Commands (sugar syntax):',\n ' remove ID - Remove atom by ID',\n ' remove Label:Type - Remove atom by label and type',\n ' remove source.relation=target - Remove specific relation tuple',\n ' remove Atom.REL - Remove all REL relations from Atom',\n ' remove edge_id - Remove specific edge by ID',\n ' remove relation - Remove entire relation',\n '',\n 'Examples:',\n ' remove alice - Remove atom with ID \"alice\"',\n ' remove Alice:Person - Remove Alice:Person atom',\n ' remove alice.friend=bob - Remove friend(alice, bob) tuple',\n ' remove alice.friend - Remove all friend relations from alice',\n ' remove friend:alice->bob - Remove edge by ID',\n ' remove friend - Remove entire friend relation'\n ];\n }\n}\n\n/**\n * Parser for atom commands (sugar syntax only)\n * Supports implicit syntax that gets desugared to internal add operations:\n * - Label:Type\n * - id=Label:Type (explicit ID)\n */\nexport class AtomCommandParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // Exclude remove commands (handled by RemoveCommandParser)\n if (trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Exclude explicit add commands - everything is sugar syntax\n if (trimmed.startsWith('add ')) {\n return false;\n }\n \n // Exclude utility commands\n const utilityCommands = ['help', 'info', 'status', 'list', 'clear', 'reify'];\n if (utilityCommands.includes(trimmed.toLowerCase())) {\n return false;\n }\n \n // Exclude Pyret list commands (they start with [list:)\n if (trimmed.startsWith('[list:')) {\n return false;\n }\n \n // Exclude dot notation relation commands (x.relation=y)\n if (trimmed.includes('.') && trimmed.includes('=')) {\n return false;\n }\n \n // Exclude constructor notation relation commands (name(x,y))\n if (trimmed.includes('(') && trimmed.includes(')')) {\n return false;\n }\n \n // Pattern 1: Label:Type (implicit add - sugar syntax)\n if (/^[^:]+:.+$/.test(trimmed) && !trimmed.includes('->')) {\n return true;\n }\n \n // Pattern 2: id=Label:Type (implicit add - sugar syntax)\n if (/^[^=]+=.+:.+$/.test(trimmed) && !trimmed.includes('->')) {\n return true;\n }\n \n return false;\n }\n \n getPriority(): number {\n return 100; // Standard priority for core commands\n }\n \n getCommandPatterns(): string[] {\n return [\n 'Label:Type',\n 'id=Label:Type'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n \n // All commands are now implicit \"add\" - sugar syntax gets desugared to internal add\n return this.handleAdd(trimmed, instance);\n }\n\n private handleAdd(args: string, instance: IInputDataInstance): CommandResult {\n try {\n // Parse: Label:Type or id=Label:Type\n const match = args.match(/^(?:([^=]+)=)?([^:]+):(.+)$/);\n if (!match) {\n return {\n success: false,\n message: 'Invalid syntax. Use: add Label:Type or add id=Label:Type'\n };\n }\n\n const [, explicitId, label, type] = match;\n const atomLabel = label.trim();\n const atomType = type.trim();\n\n if (!atomLabel || !atomType) {\n return {\n success: false,\n message: 'Label and type cannot be empty'\n };\n }\n\n // Generate ID: Use explicit ID if provided, otherwise try to use the label as the ID\n let atomId = explicitId?.trim() || this.generateAtomId(atomLabel, instance);\n\n const atom: IAtom = {\n id: atomId,\n label: atomLabel,\n type: atomType\n };\n\n instance.addAtom(atom);\n \n // Show ID on the left for easy referencing\n let message: string;\n if (explicitId?.trim()) {\n // Explicit ID provided: show ID prominently on the left\n message = `[${atomId}] Added atom: ${atomLabel}:${atomType}`;\n } else {\n // Generated ID: show ID prominently on the left\n message = `[${atomId}] Added atom: ${atomLabel}:${atomType}`;\n }\n \n return {\n success: true,\n message,\n action: 'add'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to add atom'\n };\n }\n }\n\n\n private generateAtomId(candidateId: string, instance: IInputDataInstance): string {\n const existingIds = new Set(instance.getAtoms().map(a => a.id));\n\n // If the candidate ID doesn't exist, return it as is\n if (!existingIds.has(candidateId)) {\n return candidateId;\n }\n\n // Append a number to the candidate ID until a unique ID is found\n let counter = 1;\n let uniqueId = `${candidateId}$${counter}`;\n while (existingIds.has(uniqueId)) {\n counter++;\n uniqueId = `${candidateId}$${counter}`;\n }\n\n return uniqueId;\n}\n\n getHelp(): string[] {\n return [\n 'Atom Commands (sugar syntax):',\n ' Label:Type - Add atom with generated ID',\n ' id=Label:Type - Add atom with explicit ID',\n '',\n 'Examples:',\n ' Alice:Person - Creates [Alice] Alice:Person',\n ' p1=Alice:Person - Creates [p1] Alice:Person', \n '',\n 'Note: IDs are shown in [brackets] for easy referencing',\n 'All syntax is sugar that gets desugared to internal operations'\n ];\n }\n}\n\n\n\n/**\n * Parser for batch/multiple commands in one line\n * Supports:\n * - Multiple atoms: add Alice:Person, Bob:Person, Charlie:Person\n * - Atoms + relations: add Alice:Person; add Bob:Person; add friends:Alice->Bob\n * - Mixed operations with semicolon separators\n */\nexport class BatchCommandParser implements ICommandParser {\n private atomParser = new AtomCommandParser();\n private dotRelationParser = new DotNotationRelationParser();\n\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // Look for comma-separated atoms: add Type1:Label1, Type2:Label2, ...\n if (this.isCommaSeperatedAtoms(trimmed)) {\n return true;\n }\n \n // Look for semicolon-separated commands: add Alice:Person; add Bob:Person; add friends:Alice->Bob\n if (trimmed.includes(';')) {\n const subCommands = trimmed.split(';').map(cmd => cmd.trim()).filter(cmd => cmd);\n // Check if at least one subcommand can be handled by existing parsers\n return subCommands.length >= 2 && \n subCommands.some(cmd => \n this.atomParser.canHandle(cmd) || this.dotRelationParser.canHandle(cmd)\n );\n }\n \n return false;\n }\n \n private isCommaSeperatedAtoms(command: string): boolean {\n // No more explicit add commands - disable comma-separated atoms feature\n // to maintain sugar-only syntax\n return false;\n }\n \n getPriority(): number {\n return 115; // Higher than individual parsers to catch batch commands first\n }\n \n getCommandPatterns(): string[] {\n return [\n 'Alice:Person; bob=Bob:Person; alice.friend=bob'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n \n try {\n // Handle semicolon-separated commands (sugar syntax only)\n if (trimmed.includes(';')) {\n return this.handleSemicolonSeperatedCommands(trimmed, instance);\n }\n \n return {\n success: false,\n message: 'Unable to parse batch command'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to execute batch command'\n };\n }\n }\n\n\n\n private handleSemicolonSeperatedCommands(command: string, instance: IInputDataInstance): CommandResult {\n const subCommands = command.split(';').map(cmd => cmd.trim()).filter(cmd => cmd);\n \n const results: string[] = [];\n const errors: string[] = [];\n let successCount = 0;\n let addCount = 0;\n let removeCount = 0;\n \n for (const subCommand of subCommands) {\n try {\n let result: CommandResult | null = null;\n \n // Try atom parser first\n if (this.atomParser.canHandle(subCommand)) {\n result = this.atomParser.execute(subCommand, instance);\n }\n // Then try dot notation relation parser\n else if (this.dotRelationParser.canHandle(subCommand)) {\n result = this.dotRelationParser.execute(subCommand, instance);\n }\n \n if (result) {\n if (result.success) {\n results.push(result.message);\n successCount++;\n if (result.action === 'add') addCount++;\n if (result.action === 'remove') removeCount++;\n } else {\n errors.push(`\"${subCommand}\": ${result.message}`);\n }\n } else {\n errors.push(`\"${subCommand}\": No parser can handle this command`);\n }\n } catch (error) {\n errors.push(`\"${subCommand}\": ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n \n const actionSummary = [];\n if (addCount > 0) actionSummary.push(`${addCount} added`);\n if (removeCount > 0) actionSummary.push(`${removeCount} removed`);\n \n if (successCount === subCommands.length) {\n return {\n success: true,\n message: `Batch command completed (${actionSummary.join(', ')}):\\n${results.join('\\n')}`,\n action: addCount > 0 ? 'add' : (removeCount > 0 ? 'remove' : 'info')\n };\n } else if (successCount > 0) {\n return {\n success: true,\n message: `Batch command partially completed (${successCount}/${subCommands.length} commands):\\n\\nSuccessful:\\n${results.join('\\n')}\\n\\nErrors:\\n${errors.join('\\n')}`,\n action: addCount > 0 ? 'add' : (removeCount > 0 ? 'remove' : 'info')\n };\n } else {\n return {\n success: false,\n message: `Batch command failed:\\n${errors.join('\\n')}`\n };\n }\n }\n\n getHelp(): string[] {\n return [\n 'Batch Commands (sugar syntax):',\n ' command1; command2; command3 - Execute multiple sugar commands',\n '',\n 'Examples:',\n ' Alice:Person; bob=Bob:Person; alice.friend=bob',\n ' 1:Number; 2:Number; 3:Number',\n '',\n 'Note: Semicolon-separated commands support any mix of atom/relation sugar syntax'\n ];\n }\n}\n\n/**\n * Parser for dot notation relation commands (Pyret style - sugar syntax only)\n * Supports:\n * - source.relation=target (binary relations only)\n */\nexport class DotNotationRelationParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // Exclude remove commands (handled by RemoveCommandParser)\n if (trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Exclude explicit add commands - everything is sugar syntax\n if (trimmed.startsWith('add ')) {\n return false;\n }\n \n // Handle implicit \"add\" with dot notation - sugar syntax\n if (trimmed.includes('.') && trimmed.includes('=')) {\n return /^[^.]+\\.[^=]+=.+$/.test(trimmed);\n }\n \n return false;\n }\n \n getPriority(): number {\n return 115; // Higher priority than standard relation parser due to specific dot notation\n }\n \n getCommandPatterns(): string[] {\n return [\n 'source.relation=target'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n \n // All commands are now implicit \"add\" - sugar syntax gets desugared to internal add\n return this.handleAdd(trimmed, instance);\n }\n\n private handleAdd(args: string, instance: IInputDataInstance): CommandResult {\n try {\n // Parse: source.relation=target\n const match = args.match(/^([^.]+)\\.([^=]+)=(.+)$/);\n if (!match) {\n return {\n success: false,\n message: 'Invalid syntax. Use: source.relation=target'\n };\n }\n\n const sourceId = match[1].trim();\n const relationName = match[2].trim();\n const targetId = match[3].trim();\n \n if (!sourceId || !relationName || !targetId) {\n return {\n success: false,\n message: 'Source, relation, and target cannot be empty'\n };\n }\n\n // Validate atoms exist\n const existingAtoms = instance.getAtoms();\n const existingAtomIds = new Set(existingAtoms.map(a => a.id));\n \n if (!existingAtomIds.has(sourceId)) {\n return {\n success: false,\n message: `Source atom '${sourceId}' does not exist`\n };\n }\n \n if (!existingAtomIds.has(targetId)) {\n return {\n success: false,\n message: `Target atom '${targetId}' does not exist`\n };\n }\n\n // Create tuple for binary relation\n const sourceAtom = existingAtoms.find(a => a.id === sourceId)!;\n const targetAtom = existingAtoms.find(a => a.id === targetId)!;\n \n const tuple: ITuple = {\n atoms: [sourceId, targetId],\n types: [sourceAtom.type, targetAtom.type]\n };\n\n instance.addRelationTuple(relationName, tuple);\n \n return {\n success: true,\n message: `[${sourceId}.${relationName}=${targetId}] Added relation: ${relationName}(${sourceId}, ${targetId})`,\n action: 'add'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to add relation'\n };\n }\n }\n\n\n\n getHelp(): string[] {\n return [\n 'Dot Notation Relation Commands (sugar syntax):',\n ' source.relation=target - Add binary relation',\n '',\n 'Examples:',\n ' alice.friend=bob - Creates friend(alice, bob)',\n ' alice.knows=charlie - Creates knows(alice, charlie)',\n '',\n 'Note: Atoms must exist before creating relations',\n 'All syntax is sugar that gets desugared to internal operations'\n ];\n }\n}","import { Graph } from 'graphlib';\nimport { IDataInstance, IInputDataInstance, IAtom, IRelation, ITuple, IType, DataInstanceEventType, DataInstanceEventListener, DataInstanceEvent } from '../interfaces';\n\n/**\n * Configuration options for primitive value idempotency in PyretDataInstance\n */\nexport interface PyretInstanceOptions {\n /** Whether to make string values idempotent (reuse atoms for same string values) */\n stringsIdempotent?: boolean;\n /** Whether to make number values idempotent (reuse atoms for same number values) */\n numbersIdempotent?: boolean;\n /** Whether to make boolean values idempotent (reuse atoms for same boolean values) */\n booleansIdempotent?: boolean;\n /** Whether to include function/method fields in parsing */\n showFunctions?: boolean;\n}\n\n/**\n * Result of evaluating a Pyret expression\n */\ninterface PyretEvaluationResult {\n /** The raw Pyret JS value (if successful) */\n result?: unknown;\n /** Exception information (if failed) */\n exn?: unknown;\n /** Whether the evaluation was successful */\n success?: boolean;\n}\n\n/** Global constructor cache entry with pattern and instantiation priority */\ninterface ConstructorCacheEntry {\n pattern: string[];\n instantiation: number;\n}\n\nexport function generateEdgeId(\n relation: IRelation,\n tuple: ITuple\n): string {\n\n const relationId = relation.id;\n const atoms = tuple.atoms;\n return `${relationId}:${atoms.join('->')}`;\n}\n\n/**\n * Pyret data instance implementation for parsing Pyret runtime objects\n * \n * Handles Pyret's object representation where:\n * - Objects have a `dict` property containing field values\n * - Objects have a `brands` property indicating their type\n * - All dict entries are treated as relations\n * - Pyret tables are parsed as semantic relations: each row becomes an n-ary tuple\n * - Non-table arrays are parsed as relations with Array atoms\n * - Nested arrays are supported with intermediate Array atoms\n * - Cycles are handled gracefully without infinite recursion\n * - Primitive idempotency is configurable via constructor options\n * \n * @example\n * ```typescript\n * // Tree data\n * const pyretData = {\n * dict: { value: 11, left: {...}, right: {...} },\n * brands: { \"$brandtnode989\": true }\n * };\n * const instance1 = new PyretDataInstance(pyretData);\n * \n * // Table data - creates semantic relational tuples\n * const tableData = {\n * dict: {\n * r: {\n * dict: {\n * \"_header-raw-array\": [\"origin\", \"destination\"],\n * \"_rows-raw-array\": [[\"PVD\", \"ORD\"], [\"ORD\", \"PVD\"]]\n * },\n * brands: { \"$brandtable168\": true }\n * }\n * }\n * };\n * const instance2 = new PyretDataInstance(tableData);\n * // Creates relation \"row\" with tuples: (PVD, ORD), (ORD, PVD)\n * \n * // Custom idempotency settings\n * const instance3 = new PyretDataInstance(pyretData, {\n * stringsIdempotent: false, // Different string instances won't be unified\n * numbersIdempotent: true, // Same numbers will be unified\n * booleansIdempotent: true // Same booleans will be unified\n * });\n * ```\n */\nexport class PyretDataInstance implements IInputDataInstance {\n\n private atoms = new Map<string, IAtom>();\n private relations = new Map<string, IRelation>();\n private types = new Map<string, IType>();\n private objectToAtomId = new WeakMap<object, string>();\n private atomCounter = 0;\n\n /** Map to keep track of label counts per type */\n private typeLabelCounters = new Map<string, number>();\n\n /** Map to store the original Pyret objects with their dict key order */\n private originalObjects = new Map<string, PyretObject>();\n\n /** Event listeners for data instance changes */\n private eventListeners = new Map<DataInstanceEventType, Set<DataInstanceEventListener>>();\n\n /** Configuration options for primitive handling */\n private readonly options: Required<PyretInstanceOptions>;\n\n /** Global map to store constructor patterns and field order for types across all instances */\n private static globalConstructorCache = new Map<string, ConstructorCacheEntry>();\n\n /** Global counter for instantiation priority - higher numbers mean newer/higher priority */\n private static instantiationCounter = 0;\n\n /** Optional external Pyret evaluator for enhanced features */\n private externalEvaluator: any | null = null;\n\n /*\n TODO: List handling\n - Pyret Tables are now parsed as semantic relations (each row becomes an n-ary tuple)\n - Non-table arrays are parsed as structural relations with Array atoms\n - Native Pyret Lists still show as (link (link (link (link )))) etc. and need special handling\n */\n\n\n /**\n * Creates a PyretDataInstance from a Pyret runtime object\n * \n * @param pyretData - The root Pyret object to parse, or null/undefined for an empty instance\n * @param options - Configuration options for primitive handling and other behaviors\n * @param externalEvaluator - Optional external Pyret evaluator for enhanced features\n */\n constructor(pyretData?: PyretObject | null, options: PyretInstanceOptions = {}, externalEvaluator?: any) {\n // Set default options with primitives idempotent by default\n this.options = {\n stringsIdempotent: options.stringsIdempotent ?? true,\n numbersIdempotent: options.numbersIdempotent ?? true,\n booleansIdempotent: options.booleansIdempotent ?? true,\n showFunctions: options.showFunctions ?? false,\n };\n \n this.externalEvaluator = externalEvaluator || null;\n this.initializeBuiltinTypes();\n if (pyretData) {\n this.parseObjectIteratively(pyretData);\n }\n }\n\n /**\n * Set an external Pyret evaluator for enhanced features\n * @param evaluator - External Pyret evaluator (e.g., window.__internalRepl)\n */\n setExternalEvaluator(evaluator: any): void {\n this.externalEvaluator = evaluator;\n }\n\n /**\n * Get the current external evaluator\n */\n getExternalEvaluator(): any | null {\n return this.externalEvaluator;\n }\n\n /**\n * Get the current primitive idempotency configuration\n */\n getOptions(): Required<PyretInstanceOptions> {\n return { ...this.options };\n }\n\n /**\n * Cache constructor field order for a type when we successfully parse an original object\n * This now uses a global cache with instantiation-based priority where newer patterns\n * can override older ones for the same constructor name\n */\n private cacheConstructorPattern(typeName: string, fieldOrder: string[]): void {\n if (fieldOrder.length === 0) return;\n\n const currentEntry = PyretDataInstance.globalConstructorCache.get(typeName);\n const newInstantiation = ++PyretDataInstance.instantiationCounter;\n\n // Always cache if no entry exists, or if we want to allow newer patterns to override\n // For now, we always update to give priority to newer constructor patterns\n if (!currentEntry || newInstantiation > currentEntry.instantiation) {\n PyretDataInstance.globalConstructorCache.set(typeName, {\n pattern: [...fieldOrder],\n instantiation: newInstantiation\n });\n }\n }\n\n /**\n * Get cached constructor pattern for a type from the global cache\n */\n private getCachedConstructorPattern(typeName: string): string[] | null {\n const entry = PyretDataInstance.globalConstructorCache.get(typeName);\n return entry ? entry.pattern : null;\n }\n\n /**\n * Get the global constructor cache (for debugging or advanced use cases)\n * Returns a map of type names to their patterns\n */\n static getGlobalConstructorCache(): Map<string, string[]> {\n const result = new Map<string, string[]>();\n for (const [typeName, entry] of PyretDataInstance.globalConstructorCache) {\n result.set(typeName, [...entry.pattern]);\n }\n return result;\n }\n\n /**\n * Get the global constructor cache with instantiation info (for debugging)\n * Returns the raw cache with instantiation numbers\n */\n static getGlobalConstructorCacheWithPriority(): Map<string, ConstructorCacheEntry> {\n return new Map(PyretDataInstance.globalConstructorCache);\n }\n\n /**\n * Clear the global constructor cache (for testing or reset scenarios)\n */\n static clearGlobalConstructorCache(): void {\n PyretDataInstance.globalConstructorCache.clear();\n }\n\n /**\n * Creates a PyretDataInstance from a Pyret expression.\n * \n * @param expr - The Pyret expression to evaluate.\n * @param options - Configuration options for primitive handling and other behaviors\n * @param externalEvaluator - External Pyret evaluator with a `run` method for enhanced features.\n * @returns A new PyretDataInstance created from the evaluated expression.\n * @throws {Error} If the expression cannot be evaluated or parsed.\n */\n static async fromExpression(\n expr: string, \n options: PyretInstanceOptions = {},\n externalEvaluator: { run: (code: string) => Promise<unknown> }\n ): Promise<PyretDataInstance> {\n // Evaluate the expression using the external evaluator\n const evaluationResult = await PyretDataInstance.evaluateExpression(expr, externalEvaluator);\n\n if (!evaluationResult.success) {\n throw new Error(`Failed to evaluate Pyret expression: ${PyretDataInstance.formatError(evaluationResult.exn)}`);\n }\n\n // Check if the result is a primitive value\n if (PyretDataInstance.isPrimitive(evaluationResult.result)) {\n // Create a new instance and add the primitive as an atom\n const instance = new PyretDataInstance(null, options, externalEvaluator);\n \n const atomType = typeof evaluationResult.result === 'string' ? 'String' :\n typeof evaluationResult.result === 'number' ? 'Number' : 'Boolean';\n \n const primitiveAtom = {\n id: `result_${evaluationResult.result}`,\n label: String(evaluationResult.result),\n type: atomType\n };\n \n instance.addAtom(primitiveAtom);\n return instance;\n }\n\n // For complex objects, create a PyretDataInstance directly from the result\n return new PyretDataInstance(evaluationResult.result as PyretObject, options, externalEvaluator);\n }\n\n /**\n * Evaluates a Pyret expression using an external evaluator\n * \n * @param expr - The Pyret expression to evaluate\n * @param externalEvaluator - External Pyret evaluator with a `run` method\n * @returns Promise resolving to evaluation result\n */\n private static async evaluateExpression(\n expr: string,\n externalEvaluator: { run: (code: string) => Promise<unknown> }\n ): Promise<PyretEvaluationResult> {\n try {\n const result = await externalEvaluator.run(expr);\n\n // Step 1: Look for \"exn\" key at any level - if found, it's a failure\n const exnValue = PyretDataInstance.findKeyAtAnyLevel(result, 'exn');\n if (exnValue !== undefined) {\n return {\n success: false,\n exn: exnValue,\n };\n }\n \n // Step 2: Look for \"answer\" key at any level - if found, process it\n const answerValue = PyretDataInstance.findKeyAtAnyLevel(result, 'answer');\n if (answerValue !== undefined) {\n return {\n success: true,\n result: answerValue,\n };\n }\n\n // Step 3: Check if the result is a primitive value directly\n if (PyretDataInstance.isPrimitive(result)) {\n return {\n success: true,\n result: result,\n };\n }\n\n // If we can't find an answer or exn, return failure\n return {\n success: false,\n exn: 'Unable to find answer or exn in evaluation result',\n };\n \n } catch (error) {\n return {\n success: false,\n exn: error instanceof Error ? error.message : 'Unknown evaluation error',\n };\n }\n }\n\n /**\n * Recursively searches for a key at any level in an object\n */\n private static findKeyAtAnyLevel(obj: unknown, keyName: string): unknown {\n if (!obj || typeof obj !== 'object') {\n return undefined;\n }\n \n // Check if this object has the key directly\n if (keyName in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[keyName];\n }\n \n // Recursively search in nested objects and arrays\n for (const value of Object.values(obj as Record<string, unknown>)) {\n if (value && typeof value === 'object') {\n const found = PyretDataInstance.findKeyAtAnyLevel(value, keyName);\n if (found !== undefined) {\n return found;\n }\n }\n }\n \n return undefined;\n }\n\n /**\n * Checks if a value is a primitive type (string, number, boolean)\n */\n private static isPrimitive(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n /**\n * Format Pyret evaluation errors for display\n */\n private static formatError(error: any): string {\n if (!error) {\n return 'Unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (typeof error === 'object' && error !== null) {\n // Try to extract useful error information from Pyret error objects\n const errorObj = error;\n\n if (errorObj.message) {\n return errorObj.message;\n }\n\n if (errorObj.toString && typeof errorObj.toString === 'function') {\n return errorObj.toString();\n }\n }\n\n return String(error);\n }\n\n /**\n * Try to rebuild constructor arguments from relations using cached patterns\n * Only uses patterns from previously seen constructor instances - no heuristics\n */\n private tryReconstructFromRelations(atom: IAtom, visited: Set<string>): string {\n // Get all relations where this atom is the source\n const relationMap = new Map<string, string[]>();\n this.relations.forEach(relation => {\n relation.tuples.forEach(tuple => {\n if (tuple.atoms.length >= 2 && tuple.atoms[0] === atom.id) {\n const relationName = relation.name;\n if (!relationMap.has(relationName)) {\n relationMap.set(relationName, []);\n }\n // Skip the source atom, collect target atoms\n relationMap.get(relationName)!.push(...tuple.atoms.slice(1));\n }\n });\n });\n\n if (relationMap.size === 0) {\n return atom.type; // No relations, just return the type name\n }\n\n // Try to use cached constructor pattern from previously seen instances\n const cachedPattern = this.getCachedConstructorPattern(atom.type);\n if (cachedPattern) {\n const args: string[] = [];\n for (const fieldName of cachedPattern) {\n const targetIds = relationMap.get(fieldName) || [];\n for (const targetId of targetIds) {\n args.push(this.reifyAtom(targetId, visited));\n }\n }\n if (args.length > 0) {\n return `${atom.type}(${args.join(', ')})`;\n }\n }\n\n // If no cached pattern, try to infer from other instances of the same type\n // Look for other atoms of the same type that have original objects\n const sameTypeAtoms = Array.from(this.atoms.values()).filter(a => a.type === atom.type);\n for (const sameTypeAtom of sameTypeAtoms) {\n const originalObj = this.originalObjects.get(sameTypeAtom.id);\n if (originalObj && originalObj.dict) {\n const orderedKeys = Object.keys(originalObj.dict);\n this.cacheConstructorPattern(atom.type, orderedKeys);\n\n // Now try again with the cached pattern\n const args: string[] = [];\n for (const fieldName of orderedKeys) {\n const targetIds = relationMap.get(fieldName) || [];\n for (const targetId of targetIds) {\n args.push(this.reifyAtom(targetId, visited));\n }\n }\n if (args.length > 0) {\n return `${atom.type}(${args.join(', ')})`;\n }\n break; // Only need to check one instance since constructors are nominal\n }\n }\n\n // Final fallback: use sorted field order but print an error\n console.error(`[PyretDataInstance] Could not determine constructor pattern for type '${atom.type}'. Falling back to sorted field order.`);\n\n const relationNames = Array.from(relationMap.keys()).sort(); // Sort for consistency\n const args: string[] = [];\n\n for (const relationName of relationNames) {\n const targetIds = relationMap.get(relationName) || [];\n for (const targetId of targetIds) {\n args.push(this.reifyAtom(targetId, visited));\n }\n }\n\n if (args.length > 0) {\n return `${atom.type}(${args.join(', ')})`;\n }\n\n return atom.type; // Last resort: just the type name\n }\n hasExternalEvaluator(): boolean {\n return this.externalEvaluator !== null;\n }\n addEventListener(type: DataInstanceEventType, listener: DataInstanceEventListener): void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener);\n }\n\n /**\n * Remove an event listener for data instance changes\n */\n removeEventListener(type: DataInstanceEventType, listener: DataInstanceEventListener): void {\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * Emit an event to all registered listeners\n */\n private emitEvent(event: DataInstanceEvent): void {\n const listeners = this.eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(event);\n } catch (error) {\n console.error('Error in data instance event listener:', error);\n }\n });\n }\n }\n\n /**\n * Adds an atom to the instance, updating types accordingly.\n * If the atom already exists, it is replaced.\n * @param atom - The atom to add\n */\n addAtom(atom: IAtom): void {\n this.atoms.set(atom.id, atom);\n this.ensureTypeExists(atom.type);\n const type = this.types.get(atom.type);\n if (type && !type.atoms.some(a => a.id === atom.id)) {\n type.atoms.push(atom);\n }\n\n // Emit event\n this.emitEvent({\n type: 'atomAdded',\n data: { atom }\n });\n }\n\n /**\n * Removes an atom by id, and removes it from all types and relations.\n * @param id - The atom id to remove\n */\n removeAtom(id: string): void {\n const removedAtom = this.atoms.get(id);\n this.atoms.delete(id);\n\n // Remove from types\n this.types.forEach(type => {\n type.atoms = type.atoms.filter(atom => atom.id !== id);\n });\n\n // Remove from all relation tuples\n this.relations.forEach(relation => {\n relation.tuples = relation.tuples.filter(tuple => !tuple.atoms.includes(id));\n });\n\n // Emit event if atom was found\n if (removedAtom) {\n this.emitEvent({\n type: 'atomRemoved',\n data: { atomId: id }\n });\n }\n }\n\n\n removeRelationTuple(relationId: string, t: ITuple): void {\n\n // How would we do this?\n const relation = this.relations.get(relationId);\n if (relation) {\n const oldLength = relation.tuples.length;\n relation.tuples = relation.tuples.filter(tuple =>\n !tuple.atoms.every((atomId, index) => atomId === t.atoms[index])\n );\n\n // Emit event if tuple was actually removed\n if (relation.tuples.length < oldLength) {\n this.emitEvent({\n type: 'relationTupleRemoved',\n data: { relationId, tuple: t }\n });\n }\n }\n }\n\n /**\n * Converts the current data instance back to Pyret constructor notation\n * \n * If an external evaluator is available, it may provide enhanced type information\n * for more accurate reification in the future.\n * \n * @returns A string representation of the data in Pyret constructor syntax\n * \n * @example\n * ```typescript\n * const pyretCode = instance.reify();\n * ```\n */\n reify(): string {\n let result = '';\n\n\n // TODO: This is still broken. Need to understand what is going on here!!\n\n // Find referenced atoms\n const referencedAtoms = new Set<string>();\n this.relations.forEach(relation => {\n relation.tuples.forEach(tuple => {\n for (let i = 1; i < tuple.atoms.length; i++) {\n referencedAtoms.add(tuple.atoms[i]);\n }\n });\n });\n\n // Identify root atoms (not referenced by others, including builtins)\n const rootAtoms = Array.from(this.atoms.values()).filter(atom => !referencedAtoms.has(atom.id));\n\n if (rootAtoms.length === 0) {\n return result + \"# No root atoms found\";\n }\n\n // If multiple roots, wrap in a Pyret set\n if (rootAtoms.length > 1) {\n const rootExpressions = rootAtoms.map(atom => this.reifyAtom(atom.id, new Set()));\n return result + `[list-set: ${rootExpressions.join(', ')}]`;\n }\n\n // If only one root atom, reify it directly\n return result + this.reifyAtom(rootAtoms[0].id, new Set());\n }\n\n /**\n * Recursively reifies a single atom and its relations, preserving constructor argument order\n * \n * @param atomId - The atom ID to reify\n * @param visited - Set of visited atom IDs to prevent infinite recursion\n * @returns Pyret constructor notation for this atom\n */\n private reifyAtom(atomId: string, visited: Set<string>): string {\n\n\n // TODO: I think this is broken -- it doesn't cache things correctly.\n\n if (visited.has(atomId)) {\n return `/* cycle: ${atomId} */`;\n }\n\n const atom = this.atoms.get(atomId);\n if (!atom) {\n return `/* missing atom: ${atomId} */`;\n }\n\n visited.add(atomId);\n\n // Handle primitive types\n if (this.isBuiltinType(atom.type)) {\n const result = this.reifyPrimitive(atom);\n visited.delete(atomId);\n return result;\n }\n\n // Get the original object to preserve key order\n const originalObject = this.originalObjects.get(atomId);\n\n if (!originalObject || !originalObject.dict) {\n // No original object available - try to reconstruct using cached patterns or heuristics\n visited.delete(atomId);\n return this.tryReconstructFromRelations(atom, visited);\n }\n\n // Use the original dict key order to maintain constructor argument order\n const orderedKeys = Object.keys(originalObject.dict);\n\n // Cache this constructor pattern for future use\n this.cacheConstructorPattern(atom.type, orderedKeys);\n\n // Check if this looks like a list (all keys are numeric)\n const isListLike = orderedKeys.every(key => /^\\d+$/.test(key));\n\n if (isListLike && orderedKeys.length > 0) {\n // Sort numeric keys and extract list items\n const sortedKeys = orderedKeys.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));\n const listItems = sortedKeys.map(key => {\n const targetAtomIds = this.getRelationTargets(atomId, key);\n return targetAtomIds.map(targetId => this.reifyAtom(targetId, visited));\n }).flat();\n\n visited.delete(atomId);\n return `[list: ${listItems.join(', ')}]`;\n }\n\n // Regular constructor notation with preserved argument order\n const args: string[] = [];\n\n for (const relationName of orderedKeys) {\n const targetAtomIds = this.getRelationTargets(atomId, relationName);\n for (const targetId of targetAtomIds) {\n args.push(this.reifyAtom(targetId, visited));\n }\n }\n\n visited.delete(atomId);\n\n if (args.length === 0) {\n return atom.type;\n }\n\n return `${atom.type}(${args.join(', ')})`;\n }\n\n /**\n * Reifies primitive values with appropriate Pyret syntax\n */\n private reifyPrimitive(atom: IAtom): string {\n switch (atom.type) {\n case 'String':\n return `\"${atom.label.replace(/\"/g, '\\\\\"')}\"`;\n case 'Number':\n return atom.label;\n case 'Boolean':\n return atom.label;\n default:\n return atom.label;\n }\n }\n\n /**\n * Parses Pyret objects iteratively to avoid stack overflow and handle cycles\n */\n private parseObjectIteratively(rootObject: PyretObject): void {\n const processingQueue: Array<{ obj: PyretObject; parentInfo?: { parentId: string; relationName: string } }> = [\n { obj: rootObject }\n ];\n\n while (processingQueue.length > 0) {\n const { obj, parentInfo } = processingQueue.shift()!;\n\n\n\n /** \n * \n * TODO: N-ary relations, etc for things like lists, tables, etc.\n * \n * \n */\n\n // Skip if we've already processed this object (cycle detection)\n if (this.objectToAtomId.has(obj)) {\n if (parentInfo) {\n const existingAtomId = this.objectToAtomId.get(obj)!;\n this.addRelationTuple(\n parentInfo.relationName,\n { atoms: [parentInfo.parentId, existingAtomId], types: ['PyretObject', 'PyretObject'] }\n );\n }\n continue;\n }\n\n const atomId = this.createAtomFromObject(obj);\n\n // Store the original object to preserve dict key order\n this.originalObjects.set(atomId, obj);\n\n // Cache constructor pattern for this type if it has a dict\n if (obj.dict && typeof obj.dict === 'object') {\n const type = this.extractType(obj);\n const fieldOrder = Object.keys(obj.dict);\n this.cacheConstructorPattern(type, fieldOrder);\n }\n\n // Add relation from parent if this is not the root object\n if (parentInfo) {\n this.addRelationTuple(\n parentInfo.relationName,\n { atoms: [parentInfo.parentId, atomId], types: ['PyretObject', 'PyretObject'] }\n );\n }\n\n // Process all dict entries as relations, but skip obvious function/method fields\n if (obj.dict && typeof obj.dict === 'object') {\n // Check if this is a Pyret table with semantic data\n const isPyretTable = this.isPyretTable(obj);\n \n if (isPyretTable) {\n // Handle Pyret tables specially: create semantic relational tuples\n this.processTableSemantics(atomId, obj);\n } else {\n // Process regular objects\n Object.entries(obj.dict).forEach(([relationName, fieldValue]) => {\n\n\n // Heuristic: skip fields that look like Pyret methods (object with only a 'name' property)\n if (\n !this.options.showFunctions &&\n fieldValue &&\n typeof fieldValue === 'object' &&\n 'meth' in fieldValue &&\n 'full_meth' in fieldValue\n ) {\n // skip this field\n return;\n }\n ////\n\n\n if (this.isAtomicValue(fieldValue)) {\n const valueAtomId = this.createAtomFromPrimitive(fieldValue);\n this.addRelationTuple(\n relationName,\n { atoms: [atomId, valueAtomId], types: ['PyretObject', 'PyretObject'] }\n );\n } else if (Array.isArray(fieldValue)) {\n // Handle arrays: create atoms/relations for each element\n this.processArrayField(atomId, relationName, fieldValue, processingQueue);\n } else if (this.isPyretObject(fieldValue)) {\n processingQueue.push({\n obj: fieldValue,\n parentInfo: { parentId: atomId, relationName }\n });\n }\n });\n }\n }\n }\n }\n\n /**\n * Processes an array field value by creating relations for each element\n * Handles both arrays of primitives and arrays of objects/nested arrays\n * \n * @param parentAtomId - The parent atom ID\n * @param relationName - The name of the relation\n * @param arrayValue - The array to process\n * @param processingQueue - The queue for objects that need further processing\n */\n private processArrayField(\n parentAtomId: string,\n relationName: string,\n arrayValue: unknown[],\n processingQueue: Array<{ obj: PyretObject; parentInfo?: { parentId: string; relationName: string } }>\n ): void {\n arrayValue.forEach((element, index) => {\n if (this.isAtomicValue(element)) {\n // Create an atom for the primitive value\n const elementAtomId = this.createAtomFromPrimitive(element);\n // Create a relation tuple from parent to this element\n this.addRelationTuple(\n relationName,\n { atoms: [parentAtomId, elementAtomId], types: ['PyretObject', 'PyretObject'] }\n );\n } else if (Array.isArray(element)) {\n // Nested array: create an intermediate atom to represent the array\n const arrayAtomId = this.generateAtomId('Array');\n const arrayAtom: IAtom = {\n id: arrayAtomId,\n type: 'Array',\n label: `Array[${index}]`\n };\n this.atoms.set(arrayAtomId, arrayAtom);\n this.ensureTypeExists('Array');\n \n // Create relation from parent to this array\n this.addRelationTuple(\n relationName,\n { atoms: [parentAtomId, arrayAtomId], types: ['PyretObject', 'PyretObject'] }\n );\n \n // Recursively process the nested array elements\n this.processArrayField(arrayAtomId, 'element', element, processingQueue);\n } else if (this.isPyretObject(element)) {\n // Pyret object in array: add to processing queue\n processingQueue.push({\n obj: element,\n parentInfo: { parentId: parentAtomId, relationName }\n });\n }\n });\n }\n\n /**\n * Checks if a Pyret object is a table with semantic data\n */\n private isPyretTable(obj: PyretObject): boolean {\n if (!obj.dict || typeof obj.dict !== 'object') {\n return false;\n }\n \n // Check if it has the table brand\n if (obj.brands && typeof obj.brands === 'object') {\n const hasBrandTable = Object.keys(obj.brands).some(key => key.includes('brandtable'));\n if (!hasBrandTable) {\n return false;\n }\n }\n \n // Check if it has _header-raw-array and _rows-raw-array\n return '_header-raw-array' in obj.dict && '_rows-raw-array' in obj.dict;\n }\n\n /**\n * Processes a Pyret table to create semantic relational tuples\n * Each row becomes a tuple in a relation\n */\n private processTableSemantics(tableAtomId: string, tableObj: PyretObject): void {\n const dict = tableObj.dict as Record<string, unknown>;\n const headerArray = dict['_header-raw-array'] as unknown[];\n const rowsArray = dict['_rows-raw-array'] as unknown[];\n \n if (!Array.isArray(headerArray) || !Array.isArray(rowsArray)) {\n // Fallback to regular processing if structure is unexpected\n return;\n }\n \n // Extract column names from header\n const columnNames = headerArray.filter(h => typeof h === 'string') as string[];\n \n if (columnNames.length === 0) {\n return;\n }\n \n // Use \"row\" as the relation name to represent table rows\n const relationName = 'row';\n \n // Process each row as a tuple\n rowsArray.forEach((row) => {\n if (!Array.isArray(row)) {\n return;\n }\n \n // Create atoms for each cell value and collect them as a tuple\n const tupleAtomIds: string[] = [];\n \n row.forEach((cellValue) => {\n if (this.isAtomicValue(cellValue)) {\n const atomId = this.createAtomFromPrimitive(cellValue);\n tupleAtomIds.push(atomId);\n }\n });\n \n // Only create the tuple if we have the expected number of values\n if (tupleAtomIds.length === columnNames.length && tupleAtomIds.length > 0) {\n // Create an n-ary tuple for this row\n this.addRelationTuple(\n relationName,\n { \n atoms: tupleAtomIds, \n types: tupleAtomIds.map(() => 'String') // Assuming string types for now\n }\n );\n }\n });\n }\n\n /**\n * Creates an atom from a Pyret object and stores the mapping\n */\n private createAtomFromObject(obj: PyretObject): string {\n const type = this.extractType(obj);\n const atomId = this.generateAtomId(type);\n\n const atom: IAtom = {\n id: atomId,\n type,\n label: this.extractLabel(obj)\n };\n\n this.atoms.set(atomId, atom);\n this.objectToAtomId.set(obj, atomId);\n this.ensureTypeExists(type);\n\n return atomId;\n }\n\n /**\n * Creates an atom from a primitive value, optionally reusing existing atoms based on configuration\n */\n private createAtomFromPrimitive(value: string | number | boolean | { n: number; d: number }): string {\n // Handle rational numbers\n let actualValue: string | number | boolean;\n if (this.isRationalNumber(value)) {\n actualValue = this.rationalToDecimal(value);\n } else {\n actualValue = value;\n }\n\n const type = this.mapPrimitiveType(actualValue);\n const label = String(actualValue);\n\n // Check idempotency settings for this type\n const shouldReuse = (type === 'String' && this.options.stringsIdempotent) ||\n (type === 'Number' && this.options.numbersIdempotent) ||\n (type === 'Boolean' && this.options.booleansIdempotent);\n\n if (shouldReuse) {\n // Check if we already have an atom for this value\n const existingAtom = Array.from(this.atoms.values())\n .find(atom => atom.label === label && atom.type === type);\n\n if (existingAtom) {\n return existingAtom.id;\n }\n }\n\n // Create a new atom\n const atomId = this.generateAtomId(type);\n const atom: IAtom = {\n id: atomId,\n type,\n label\n };\n\n this.atoms.set(atomId, atom);\n this.ensureTypeExists(type);\n\n return atomId;\n }\n\n /**\n * Maps JavaScript primitive types to Pyret-appropriate type names\n */\n private mapPrimitiveType(value: string | number | boolean): string {\n switch (typeof value) {\n case 'number': return 'Number';\n case 'string': return 'String';\n case 'boolean': return 'Boolean';\n default: return 'Value';\n }\n }\n\n\n /**\n * Extracts the most specific brand name from a Pyret brands object.\n * Returns the brand with the highest trailing number, with prefix and number removed.\n * If no brands have trailing numbers, returns the lexicographically last brand.\n *\n * @param brands - The brands object from a Pyret object\n * @returns The most specific brand name (without $brand and trailing number), or undefined if none found\n */\n private extractMostSpecificBrand(brands: Record<string, boolean>): string | undefined {\n let maxNum = -1;\n let result: string | undefined = undefined;\n let fallbackResult: string | undefined = undefined;\n\n for (const brand of Object.keys(brands)) {\n // Try pattern with trailing number\n const matchWithNumber = /^\\$brand([a-zA-Z_]+)(\\d+)$/.exec(brand);\n if (matchWithNumber) {\n const [, name, numStr] = matchWithNumber;\n const num = parseInt(numStr, 10);\n if (num > maxNum) {\n maxNum = num;\n result = name;\n }\n } else {\n // Try pattern without trailing number\n const matchWithoutNumber = /^\\$brand_?([a-zA-Z_]+)$/.exec(brand);\n if (matchWithoutNumber) {\n const [, name] = matchWithoutNumber;\n // Use as fallback if no numbered brands found\n if (!fallbackResult || name > fallbackResult) {\n fallbackResult = name;\n }\n }\n }\n }\n\n // Return numbered brand if found, otherwise fallback to non-numbered brand\n return result || fallbackResult;\n }\n\n /**\n * Extracts the type name from a Pyret object\n */\n private extractType(obj: PyretObject): string {\n // Check for explicit name first\n if (obj.$name && typeof obj.$name === 'string') {\n return obj.$name;\n }\n\n // Extract from brands\n if (obj.brands && typeof obj.brands === 'object') {\n const brand = this.extractMostSpecificBrand(obj.brands);\n if (brand) {\n return brand;\n }\n }\n\n return 'PyretObject';\n }\n\n /**\n * Extracts a display label from a Pyret object, using a per-type counter.\n * Labels will be of the form Type$<num>\n */\n private extractLabel(obj: PyretObject): string {\n if (obj.$name && typeof obj.$name === 'string') {\n return obj.$name;\n }\n\n const type = this.extractType(obj);\n\n // Increment the counter for this type\n const current = this.typeLabelCounters.get(type) ?? 0;\n const next = current + 1;\n this.typeLabelCounters.set(type, next);\n\n return `${type}$${next}`;\n }\n\n /**\n * Adds a tuple to a relation, creating the relation if it doesn't exist\n */\n addRelationTuple(relationId: string, tuple: ITuple): void {\n // const [sourceId, targetId] = tuple.atoms;\n\n const sourceId = tuple.atoms[0];\n const targetId = tuple.atoms[tuple.atoms.length - 1];\n const middleAtoms = tuple.atoms.slice(1, -1);\n\n const sourceAtom = this.atoms.get(sourceId);\n const targetAtom = this.atoms.get(targetId);\n\n if (!sourceAtom || !targetAtom) {\n console.warn(`Cannot create relation ${relationId}: missing atoms ${sourceId} or ${targetId}`);\n return;\n }\n\n let relation = this.relations.get(relationId);\n let name = relationId + (middleAtoms.length > 0 ? `[${middleAtoms.join(', ')}]` : '');\n if (!relation) {\n relation = {\n id: relationId,\n name: name,\n types: [sourceAtom.type, targetAtom.type],\n tuples: []\n };\n this.relations.set(relationId, relation);\n }\n\n // Check for duplicate tuples\n const isDuplicate = relation.tuples.some(t =>\n t.atoms[0] === sourceId && t.atoms[1] === targetId\n );\n\n if (!isDuplicate) {\n relation.tuples.push(tuple);\n\n // Emit event\n this.emitEvent({\n type: 'relationTupleAdded',\n data: { relationId, tuple }\n });\n }\n }\n\n /**\n * Ensures a type exists in the types map\n */\n private ensureTypeExists(typeName: string): void {\n if (!this.types.has(typeName)) {\n const type: IType = {\n id: typeName,\n types: [typeName, 'PyretObject'], // All types inherit from PyretObject\n atoms: [],\n isBuiltin: this.isBuiltinType(typeName)\n };\n this.types.set(typeName, type);\n }\n }\n\n /**\n * Initializes common builtin types\n */\n private initializeBuiltinTypes(): void {\n const builtinTypes = ['Number', 'String', 'Boolean', 'PyretObject'];\n\n builtinTypes.forEach(typeName => {\n const type: IType = {\n id: typeName,\n types: typeName === 'PyretObject' ? ['PyretObject'] : [typeName, 'PyretObject'], // All types inherit from PyretObject\n atoms: [],\n isBuiltin: true\n };\n this.types.set(typeName, type);\n });\n }\n\n /**\n * Checks if a type is a builtin type\n */\n private isBuiltinType(typeName: string): boolean {\n return ['Number', 'String', 'Boolean', 'PyretObject'].includes(typeName);\n }\n\n /**\n * Type guard for Pyret rational number objects\n * Pyret represents rational numbers as objects with 'n' (numerator) and 'd' (denominator) properties\n */\n private isRationalNumber(value: unknown): value is { n: number; d: number } {\n return typeof value === 'object' &&\n value !== null &&\n 'n' in value &&\n 'd' in value &&\n typeof (value as { n: unknown }).n === 'number' &&\n typeof (value as { d: unknown }).d === 'number';\n }\n\n /**\n * Converts a Pyret rational number object to a decimal number\n */\n private rationalToDecimal(rational: { n: number; d: number }): number {\n return rational.n / rational.d;\n }\n\n /**\n * Type guard for atomic values\n * Now includes Pyret rational numbers\n */\n private isAtomicValue(value: unknown): value is string | number | boolean | { n: number; d: number } {\n return typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n this.isRationalNumber(value);\n }\n\n /**\n * Type guard for Pyret objects\n */\n private isPyretObject(obj: unknown): obj is PyretObject {\n return typeof obj === 'object' &&\n obj !== null &&\n ('dict' in obj || 'brands' in obj || '$name' in obj);\n }\n\n /**\n * Generates a unique atom ID\n */\n private generateAtomId(type?: string): string {\n const prefix = type ? type.toLowerCase().substring(0, 3) : 'atom';\n return `${prefix}_${++this.atomCounter}`;\n }\n\n // IDataInstance implementation\n\n getAtoms(): readonly IAtom[] {\n return Array.from(this.atoms.values());\n }\n\n getRelations(): readonly IRelation[] {\n\n const values = this.relations.values();\n return Array.from(values);\n\n //return Array.from(this.relations.values());\n\n }\n\n getTypes(): readonly IType[] {\n // Update type atoms based on current atoms\n this.types.forEach(type => {\n type.atoms = this.getAtoms().filter(atom => atom.type === type.id);\n });\n\n return Array.from(this.types.values());\n }\n\n getAtomType(atomId: string): IType {\n const atom = this.atoms.get(atomId);\n if (!atom) {\n throw new Error(`Atom with id '${atomId}' not found`);\n }\n\n const type = this.types.get(atom.type);\n if (!type) {\n // Create the type on demand if it doesn't exist\n this.ensureTypeExists(atom.type);\n return this.types.get(atom.type)!;\n }\n\n return type;\n }\n\n /**\n * Generates a graphlib Graph representation of this data instance.\n * \n * This method creates a directed multigraph where:\n * - Each atom becomes a node with its label and type as metadata\n * - Each relation tuple becomes an edge between atoms\n * - Multi-atom tuples (arity > 2) are handled by connecting first to last atom\n * - Disconnected nodes can be optionally filtered out\n * \n * @param hideDisconnected - Whether to hide atoms with no relations\n * @param hideDisconnectedBuiltIns - Whether to hide disconnected built-in types\n * @returns A graphlib Graph object ready for layout algorithms\n * \n * @example\n * ```typescript\n * const graph = instance.generateGraph(true, true);\n * // Use with WebCola or other layout algorithms\n * const layout = new cola.Layout().nodes(graph.nodes()).edges(graph.edges());\n * ```\n */\n generateGraph(hideDisconnected = false, hideDisconnectedBuiltIns = false): Graph {\n const graph = new Graph({ directed: true, multigraph: true });\n\n // Add all atoms as nodes\n this.getAtoms().forEach(atom => {\n graph.setNode(atom.id, {\n label: atom.label\n });\n });\n\n // Add all relation tuples as edges\n this.getRelations().forEach(relation => {\n relation.tuples.forEach(tuple => {\n if (tuple.atoms.length >= 2) {\n const sourceId = tuple.atoms[0];\n const targetId = tuple.atoms[tuple.atoms.length - 1];\n \n // Create edge label that includes middle atom labels for higher-arity relations\n const middleAtoms = tuple.atoms.slice(1, -1);\n let edgeLabel = relation.name;\n \n if (middleAtoms.length > 0) {\n // Get labels for middle atoms instead of using IDs\n const middleLabels = middleAtoms.map(atomId => {\n const atom = this.atoms.get(atomId);\n return atom ? atom.label : atomId; // Fallback to ID if atom not found\n });\n edgeLabel = `${relation.name}[${middleLabels.join(', ')}]`;\n }\n\n // Generate a unique edge ID\n const edgeId = generateEdgeId(relation, tuple);\n \n graph.setEdge(sourceId, targetId, edgeLabel, edgeId);\n }\n });\n });\n\n // Handle disconnected node filtering\n if (hideDisconnected || hideDisconnectedBuiltIns) {\n const nodesToRemove: string[] = [];\n\n graph.nodes().forEach(nodeId => {\n const inEdges = graph.inEdges(nodeId) || [];\n const outEdges = graph.outEdges(nodeId) || [];\n const isDisconnected = inEdges.length === 0 && outEdges.length === 0;\n\n if (isDisconnected) {\n const atom = this.atoms.get(nodeId);\n if (atom) {\n const atomType = this.getAtomType(nodeId);\n const isBuiltin = atomType.isBuiltin;\n\n if (hideDisconnected || (isBuiltin && hideDisconnectedBuiltIns)) {\n nodesToRemove.push(nodeId);\n }\n }\n }\n });\n\n nodesToRemove.forEach(nodeId => graph.removeNode(nodeId));\n }\n\n return graph;\n }\n\n /**\n * Applies projections to filter the data instance\n */\n applyProjections(atomIds: string[]): PyretDataInstance {\n if (atomIds.length === 0) {\n return this;\n }\n\n // Create a new instance with filtered data\n const projected = Object.create(PyretDataInstance.prototype) as PyretDataInstance;\n projected.atoms = new Map([...this.atoms].filter(([id]) => atomIds.includes(id)));\n projected.relations = new Map();\n projected.types = new Map();\n projected.atomCounter = projected.atoms.size;\n\n // Filter relations to only include tuples where all atoms are in the projection\n this.relations.forEach((relation, name) => {\n const filteredTuples = relation.tuples.filter(tuple =>\n tuple.atoms.every(atomId => atomIds.includes(atomId))\n );\n if (filteredTuples.length > 0) {\n projected.relations.set(name, {\n ...relation,\n tuples: filteredTuples\n });\n }\n });\n\n // Filter types to only include atoms in the projection\n this.types.forEach((type, typeName) => {\n const filteredAtoms = type.atoms.filter(atom => atomIds.includes(atom.id));\n if (filteredAtoms.length > 0) {\n projected.types.set(typeName, {\n ...type,\n atoms: filteredAtoms\n });\n }\n });\n\n return projected;\n }\n\n /**\n * Gets target atom IDs for a specific relation from a source atom\n * \n * @param sourceAtomId - The source atom ID\n * @param relationName - The relation name\n * @returns Array of target atom IDs\n */\n private getRelationTargets(sourceAtomId: string, relationName: string): string[] {\n const targets: string[] = [];\n\n this.relations.forEach(relation => {\n if (relation.name === relationName) {\n relation.tuples.forEach(tuple => {\n if (tuple.atoms[0] === sourceAtomId && tuple.atoms.length >= 2) {\n targets.push(tuple.atoms[1]);\n }\n });\n }\n });\n\n return targets;\n }\n\n\n /**\n * Adds a PyretDataInstance to this instance, optionally unifying built-in types\n * \n * @param dataInstance - The PyretDataInstance to add\n * @param unifyBuiltIns - Whether to unify built-in atoms\n * @returns True if the instance was added successfully, false otherwise\n */\n addFromDataInstance(dataInstance: IDataInstance, unifyBuiltIns: boolean): boolean {\n // Must be a PyretDataInstance\n if (!(dataInstance instanceof PyretDataInstance)) {\n return false;\n }\n\n const pyretInstance = dataInstance as PyretDataInstance;\n const reIdMap = new Map<string, string>();\n\n // Add atoms\n pyretInstance.getAtoms().forEach(atom => {\n const isBuiltin = this.isBuiltinType(atom.type);\n\n if (unifyBuiltIns && isBuiltin) {\n // Use this instance's idempotency settings to decide whether to unify\n const shouldUnify = (atom.type === 'String' && this.options.stringsIdempotent) ||\n (atom.type === 'Number' && this.options.numbersIdempotent) ||\n (atom.type === 'Boolean' && this.options.booleansIdempotent);\n\n if (shouldUnify) {\n // Check if the built-in atom already exists\n const existingAtom = Array.from(this.atoms.values()).find(\n existing => existing.type === atom.type && existing.label === atom.label\n );\n\n if (existingAtom) {\n // Map the original atom ID to the existing atom ID\n reIdMap.set(atom.id, existingAtom.id);\n return; // Skip adding this atom\n }\n }\n }\n\n // Generate a new ID for the atom to avoid conflicts\n const newId = this.generateAtomId(atom.type);\n reIdMap.set(atom.id, newId);\n\n // Add the atom with the new ID\n const newAtom: IAtom = { ...atom, id: newId };\n this.addAtom(newAtom);\n\n // Preserve the original object mapping\n const originalObject = pyretInstance.originalObjects.get(atom.id);\n if (originalObject) {\n this.originalObjects.set(newId, originalObject);\n }\n });\n\n // Add types\n pyretInstance.getTypes().forEach(type => {\n if (!this.types.has(type.id)) {\n // Add the type if it doesn't exist\n this.types.set(type.id, {\n ...type,\n atoms: type.atoms.map(atom => ({\n ...atom,\n id: reIdMap.get(atom.id) || atom.id,\n })),\n });\n } else {\n // Merge atoms into the existing type\n const existingType = this.types.get(type.id)!;\n const newAtoms = type.atoms.map(atom => ({\n ...atom,\n id: reIdMap.get(atom.id) || atom.id,\n }));\n existingType.atoms.push(...newAtoms);\n }\n });\n\n // Add relations\n pyretInstance.getRelations().forEach(relation => {\n const newTuples: ITuple[] = relation.tuples.map(tuple => ({\n atoms: tuple.atoms.map(atomId => reIdMap.get(atomId) || atomId),\n types: tuple.types,\n }));\n\n const existingRelation = this.relations.get(relation.id);\n if (existingRelation) {\n // Merge tuples into the existing relation\n existingRelation.tuples.push(...newTuples);\n } else {\n // Add a new relation\n this.relations.set(relation.id, {\n ...relation,\n tuples: newTuples,\n });\n }\n });\n\n return true;\n }\n}\n\n/**\n * Type definitions for Pyret runtime objects\n */\nexport interface PyretObject {\n dict?: Record<string, unknown>;\n brands?: Record<string, boolean>;\n $name?: string;\n $loc?: unknown[];\n $mut_fields_mask?: unknown[];\n $arity?: number;\n $constructor?: unknown;\n [key: string]: unknown;\n}\n\n/**\n * Factory function to create PyretDataInstance from JSON string\n * \n * @param jsonString - JSON representation of a Pyret object\n * @param options - Configuration options for primitive handling and other behaviors\n * @returns New PyretDataInstance\n * \n * @example\n * ```typescript\n * const jsonData = '{\"dict\": {\"value\": 42}, \"brands\": {\"$brandleaf\": true}}';\n * const instance = createPyretDataInstance(jsonData, { stringsIdempotent: false });\n * ```\n */\nexport const createPyretDataInstance = (\n jsonString: string, \n options: PyretInstanceOptions = {}\n): PyretDataInstance => {\n try {\n const pyretData = JSON.parse(jsonString) as PyretObject;\n return new PyretDataInstance(pyretData, options);\n } catch (error) {\n throw new Error(`Failed to parse Pyret JSON: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n};\n\n/**\n * Type guard to check if an IInputDataInstance is a PyretDataInstance\n * \n * @param instance - IInputDataInstance to check\n * @returns True if the instance is a PyretDataInstance\n */\nexport const isPyretDataInstance = (instance: IInputDataInstance): instance is PyretDataInstance => {\n return instance instanceof PyretDataInstance;\n};","import { ICommandParser, CommandResult } from './CoreParsers';\nimport { IAtom, ITuple, IInputDataInstance } from '../../../data-instance/interfaces';\nimport { PyretDataInstance } from '../../../data-instance/pyret/pyret-data-instance';\n\n/**\n * Parser for Pyret-style list commands (sugar syntax)\n * Supports:\n * - [list: 1,2,3,4]:list_of_numbers\n * - [list: atom1,atom2,atom3]:atom_list\n */\nexport class PyretListParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // No more explicit add/remove - everything is sugar syntax\n if (trimmed.startsWith('add ') || trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Pattern: [list: ...]:type (sugar syntax)\n if (trimmed.startsWith('[list:') && trimmed.includes(']:')) {\n return true;\n }\n \n return false;\n }\n \n getPriority(): number {\n return 120; // Higher priority due to very specific [list: pattern\n }\n \n getCommandPatterns(): string[] {\n return [\n '[list: item1,item2,item3]:type',\n '[list: 1,2,3,4]:numbers'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n \n // All commands are now implicit \"add\" - sugar syntax gets desugared to internal operations\n return this.handleAdd(trimmed, instance);\n }\n\n private handleAdd(args: string, instance: IInputDataInstance): CommandResult {\n try {\n // Parse: [list: item1,item2,item3]:type\n // Expected format: add [list: 1,2,3,4]:numbers\n // Creates individual atoms for each item + a list atom + list relations\n const match = args.match(/^\\[list:\\s*([^\\]]+)\\]:(.+)$/);\n if (!match) {\n return {\n success: false,\n message: 'Invalid syntax. Use: add [list: item1,item2,item3]:type'\n };\n }\n\n const [, itemsStr, listTypeName] = match;\n const items = itemsStr.split(',').map(item => item.trim()).filter(item => item);\n const listType = listTypeName.trim();\n \n if (items.length === 0) {\n return {\n success: false,\n message: 'List cannot be empty'\n };\n }\n\n // Determine item type based on the list contents:\n // Case 1: All numeric items (e.g., \"1,2,3,4\") -> Number type\n // Case 2: All existing atom IDs (e.g., \"alice,bob\") -> Use existing atom type \n // Case 3: All quoted items (e.g., \"red\",\"green\",\"blue\") -> String type\n // Case 4: Mixed or new items -> Default to String type\n let itemType = 'String'; // default fallback\n const existingAtoms = instance.getAtoms();\n const existingAtomIds = new Set(existingAtoms.map(a => a.id));\n \n // Check if all items are numbers\n if (items.every(item => /^\\d+$/.test(item))) {\n itemType = 'Number';\n } \n // Check if all items are quoted strings\n else if (items.every(item => /^\".*\"$/.test(item))) {\n itemType = 'String';\n // Remove quotes from items for processing\n for (let i = 0; i < items.length; i++) {\n items[i] = items[i].slice(1, -1); // Remove first and last character (quotes)\n }\n }\n // Check if all items are existing atoms\n else if (items.every(item => existingAtomIds.has(item))) {\n // Use the type of the first atom as the item type\n const firstAtom = existingAtoms.find(a => a.id === items[0]);\n itemType = firstAtom?.type || 'Entity';\n }\n\n const results: string[] = [];\n const atomsAdded: string[] = [];\n\n // Step 1: Create individual atoms for each list item\n // - If item already exists as an atom, skip creation\n // - If item is new, create an atom with the determined itemType\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n \n if (!existingAtomIds.has(item)) {\n const atom: IAtom = {\n id: item,\n label: item,\n type: itemType\n };\n \n try {\n instance.addAtom(atom);\n atomsAdded.push(item);\n existingAtomIds.add(item);\n } catch (error) {\n // Item might already exist, that's ok - continue processing\n }\n }\n }\n\n // Step 2: Create the list atom that contains all items\n // The list ID is generated to be unique (e.g., \"numbers-1\", \"people-1\")\n const listId = this.generateListId(instance, listType);\n const listAtom: IAtom = {\n id: listId,\n label: `[${items.join(', ')}]`,\n type: listType\n };\n \n instance.addAtom(listAtom);\n atomsAdded.push(listId);\n\n // Step 3: Create Pyret-style list relations (first, rest, etc.)\n // This establishes the structural relationships for list traversal\n this.addListRelations(instance, listId, items);\n\n const addedCount = atomsAdded.length;\n const relationCount = items.length > 0 ? items.length : 0; // first + rest relations\n \n return {\n success: true,\n message: `Added Pyret list: ${listId} with ${items.length} items (${addedCount} atoms, ${relationCount} relations)`,\n action: 'add'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to add Pyret list'\n };\n }\n }\n\n\n\n private generateListId(instance: IInputDataInstance, typeName: string): string {\n const existingIds = new Set(instance.getAtoms().map(a => a.id));\n let counter = 1;\n let candidateId = `${typeName}-${counter}`;\n \n while (existingIds.has(candidateId)) {\n counter++;\n candidateId = `${typeName}-${counter}`;\n }\n \n return candidateId;\n }\n\n private addListRelations(instance: IInputDataInstance, listId: string, items: string[]): void {\n if (items.length === 0) return;\n\n // Create the linked list structure\n let currentRest = 'empty'; // Start with the Pyret `empty` as the end of the list\n\n for (let i = items.length - 1; i >= 0; i--) {\n const currentItem = items[i];\n\n // Create a `link` atom for the current item\n const linkId = `${listId}-link-${i + 1}`;\n const linkAtom: IAtom = {\n id: linkId,\n label: `link(${currentItem}, ${currentRest})`,\n type: 'link'\n };\n\n instance.addAtom(linkAtom);\n\n // Add the `link` relation: link(first, rest)\n const linkTuple: ITuple = {\n atoms: [currentItem, currentRest],\n types: ['Item', 'link']\n };\n\n try {\n instance.addRelationTuple('link', linkTuple);\n } catch (error) {\n // Relation might already exist\n }\n\n // Update the currentRest to point to the current link\n currentRest = linkId;\n }\n\n // Add the top-level list atom pointing to the first link\n const topLevelTuple: ITuple = {\n atoms: [listId, currentRest],\n types: ['List', 'link']\n };\n\n try {\n instance.addRelationTuple('link', topLevelTuple);\n } catch (error) {\n // Relation might already exist\n }\n }\n\n getHelp(): string[] {\n return [\n 'Pyret List Commands (sugar syntax):',\n ' [list: item1,item2,item3]:list_type - Add list with items',\n ' [list: 1,2,3,4]:numbers - Add number list',\n '',\n 'This automatically creates:',\n ' - Individual atoms for each item (if they don\\'t exist)',\n ' - A list atom containing all items',\n ' - first/rest relations for list structure',\n '',\n 'Examples:',\n ' [list: 1,2,3,4]:numberList - Creates numberList-1 as list ID',\n ' [list: alice,bob,charlie]:personList - Creates personList-1 as list ID',\n ' [list: red,green,blue]:colors - Creates colors-1 as list ID',\n '',\n 'Note: All syntax is sugar that gets desugared to internal operations.',\n 'The list type name is used as-is to generate unique list IDs (type-1, type-2, etc.)'\n ];\n }\n}\n\n/**\n * Info and help parser for utility commands\n */\nexport class InfoCommandParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim().toLowerCase();\n const utilityCommands = ['help', 'info', 'status', 'list', 'clear', 'reify', 'list-ids', 'list-edges'];\n return utilityCommands.includes(trimmed);\n }\n \n getPriority(): number {\n return 50; // Lower priority - utility commands should be fallback\n }\n \n getCommandPatterns(): string[] {\n return [\n 'help',\n 'info', \n 'status',\n 'list',\n 'list-ids',\n 'list-edges',\n 'clear',\n 'reify'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim().toLowerCase();\n \n switch (trimmed) {\n case 'help':\n return {\n success: true,\n message: this.getGeneralHelp(),\n action: 'help'\n };\n \n case 'info':\n case 'status':\n return this.getStatus(instance);\n \n case 'list':\n return this.listContents(instance);\n \n case 'list-ids':\n return this.listAtomIds(instance);\n \n case 'list-edges':\n return this.listEdgeIds(instance);\n \n case 'clear':\n return this.clearInstance(instance);\n \n case 'reify':\n return this.reifyInstance(instance);\n \n default:\n return {\n success: false,\n message: 'Unknown info command'\n };\n }\n }\n\n private listAtomIds(instance: IInputDataInstance): CommandResult {\n const atoms = instance.getAtoms();\n \n if (atoms.length === 0) {\n return {\n success: true,\n message: 'No atoms found in instance.',\n action: 'info'\n };\n }\n \n let message = 'Internal Atom IDs:\\n\\n';\n \n // Group atoms by type for better organization\n const atomsByType = atoms.reduce((acc, atom) => {\n if (!acc[atom.type]) {\n acc[atom.type] = [];\n }\n acc[atom.type].push(atom);\n return acc;\n }, {} as Record<string, typeof atoms>);\n \n Object.entries(atomsByType).forEach(([type, typeAtoms]) => {\n message += `${type}:\\n`;\n typeAtoms.forEach(atom => {\n message += ` ID: ${atom.id} Label: ${atom.label}\\n`;\n });\n message += '\\n';\n });\n \n message += `Total: ${atoms.length} atoms`;\n \n return {\n success: true,\n message,\n action: 'info'\n };\n }\n\n private listEdgeIds(instance: IInputDataInstance): CommandResult {\n const relations = instance.getRelations();\n \n if (relations.length === 0) {\n return {\n success: true,\n message: 'No relations/edges found in instance.',\n action: 'info'\n };\n }\n \n let message = 'Internal Edge IDs:\\n\\n';\n let totalEdges = 0;\n \n relations.forEach(relation => {\n if (relation.tuples.length > 0) {\n message += `Relation: ${relation.name}\\n`;\n relation.tuples.forEach((tuple, index) => {\n // Generate edge ID using the same format as PyretDataInstance\n const edgeId = `${relation.name}:${tuple.atoms.join('->')}`;\n message += ` Edge ID: ${edgeId}\\n`;\n message += ` Tuple: (${tuple.atoms.join(', ')})\\n`;\n totalEdges++;\n });\n message += '\\n';\n }\n });\n \n message += `Total: ${totalEdges} edges across ${relations.length} relations`;\n \n return {\n success: true,\n message,\n action: 'info'\n };\n }\n\n private getStatus(instance: IInputDataInstance): CommandResult {\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n const tupleCount = relations.reduce((sum, r) => sum + r.tuples.length, 0);\n \n const typeStats = atoms.reduce((acc, atom) => {\n acc[atom.type] = (acc[atom.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n \n const relationStats = relations.reduce((acc, rel) => {\n acc[rel.name] = rel.tuples.length;\n return acc;\n }, {} as Record<string, number>);\n \n let message = `Instance Status:\\n`;\n message += ` Atoms: ${atoms.length}\\n`;\n message += ` Relations: ${relations.length}\\n`;\n message += ` Tuples: ${tupleCount}\\n\\n`;\n \n if (Object.keys(typeStats).length > 0) {\n message += `Types:\\n`;\n Object.entries(typeStats).forEach(([type, count]) => {\n message += ` ${type}: ${count}\\n`;\n });\n message += '\\n';\n }\n \n if (Object.keys(relationStats).length > 0) {\n message += `Relations:\\n`;\n Object.entries(relationStats).forEach(([name, count]) => {\n message += ` ${name}: ${count} tuples\\n`;\n });\n }\n \n return {\n success: true,\n message,\n action: 'info'\n };\n }\n\n private listContents(instance: IInputDataInstance): CommandResult {\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n \n let message = 'Instance Contents:\\n\\n';\n \n if (atoms.length > 0) {\n message += 'Atoms:\\n';\n atoms.forEach(atom => {\n // Always show ID prominently on the left for easy referencing\n message += ` [${atom.id}] ${atom.label}:${atom.type}\\n`;\n });\n message += '\\n';\n }\n \n if (relations.length > 0) {\n message += 'Relations:\\n';\n relations.forEach(rel => {\n message += ` ${rel.name}:\\n`;\n rel.tuples.forEach(tuple => {\n message += ` (${tuple.atoms.join(', ')})\\n`;\n });\n });\n }\n \n if (atoms.length === 0 && relations.length === 0) {\n message += 'Empty instance - no atoms or relations defined.';\n }\n \n return {\n success: true,\n message,\n action: 'info'\n };\n }\n\n private clearInstance(instance: IInputDataInstance): CommandResult {\n try {\n // Remove all atoms (this should cascade to remove relations)\n const atomIds = instance.getAtoms().map(a => a.id);\n atomIds.forEach(id => instance.removeAtom(id));\n \n return {\n success: true,\n message: `Cleared instance (removed ${atomIds.length} atoms)`,\n action: 'remove'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to clear instance'\n };\n }\n }\n\n private reifyInstance(instance: IInputDataInstance): CommandResult {\n try {\n // Check if this is a PyretDataInstance with reify capability\n if (instance instanceof PyretDataInstance) {\n const reifiedCode = instance.reify();\n return {\n success: true,\n message: `Pyret Constructor Notation:\\n\\n${reifiedCode}`,\n action: 'info'\n };\n } else {\n // For other data instances, provide a generic representation\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n \n let result = 'Data Instance Structure:\\n\\n';\n \n if (atoms.length > 0) {\n result += 'Atoms:\\n';\n atoms.forEach(atom => {\n result += ` [${atom.id}] ${atom.label}:${atom.type}\\n`;\n });\n result += '\\n';\n }\n \n if (relations.length > 0) {\n result += 'Relations:\\n';\n relations.forEach(rel => {\n result += ` ${rel.name}:\\n`;\n rel.tuples.forEach(tuple => {\n result += ` (${tuple.atoms.join(', ')})\\n`;\n });\n });\n }\n \n return {\n success: true,\n message: result,\n action: 'info'\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to reify instance'\n };\n }\n }\n\n private getGeneralHelp(): string {\n return `REPL Interface Help:\n\nAvailable commands across all terminals:\n help - Show this help\n info - Show instance status \n status - Same as info\n list - List all atoms and relations\n list-ids - List internal atom IDs grouped by type\n list-edges - List internal edge IDs for all relations\n clear - Clear entire instance\n reify - Generate Pyret constructor notation (or generic representation)\n\nTerminal-specific commands vary by terminal type.\nClick the \"?\" button in each terminal header for specific help.`;\n }\n\n getHelp(): string[] {\n return [\n 'Utility Commands:',\n ' help - Show general help',\n ' info - Show instance status',\n ' status - Same as info',\n ' list - List all contents',\n ' list-ids - List internal atom IDs',\n ' list-edges - List internal edge IDs', \n ' clear - Clear entire instance',\n ' reify - Generate Pyret constructor notation'\n ];\n }\n}","import * as React from 'react';\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { IInputDataInstance } from '../../data-instance/interfaces';\nimport { ICommandParser, CommandResult, AtomCommandParser, RelationCommandParser, DotNotationRelationParser, BatchCommandParser, RemoveCommandParser } from './parsers/CoreParsers';\nimport { PyretListParser, InfoCommandParser } from './parsers/ExtensibleParsers';\nimport './ReplInterface.css';\n\n/**\n * Configuration for a terminal in the REPL interface\n */\nexport interface TerminalConfig {\n id: string;\n title: string;\n description: string;\n parsers: ICommandParser[];\n placeholder?: string;\n}\n\n/**\n * Props for the ReplInterface component\n */\nexport interface ReplInterfaceProps {\n /** The data instance to build/modify - REQUIRED */\n instance: IInputDataInstance;\n /** Callback when the instance changes */\n onChange?: (instance: IInputDataInstance) => void;\n /** Callback when CnD specification is extracted from an expression */\n onCndSpecExtracted?: (spec: string) => void;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** CSS class name for styling */\n className?: string;\n /** Custom terminal configurations (defaults to 3 standard terminals) */\n terminals?: TerminalConfig[];\n}\n\n/**\n * Output line for terminal display\n */\ninterface OutputLine {\n id: string;\n type: 'command' | 'success' | 'error' | 'info' | 'help';\n message: string;\n timestamp: Date;\n}\n\n/**\n * State for a single terminal\n */\ninterface TerminalState {\n input: string;\n output: OutputLine[];\n isExecuting: boolean;\n}\n\n/**\n * Default terminal configuration - unified terminal supporting all commands\n * Parsers are ordered by priority (higher priority first)\n */\nconst DEFAULT_TERMINALS: TerminalConfig[] = [\n {\n id: 'unified',\n title: '',\n description: 'Supports atoms, relations, and extensions in one terminal',\n parsers: [\n new RemoveCommandParser(), // Priority 200 - highest priority for remove commands\n new PyretListParser(), // Priority 120 - most specific pattern\n new BatchCommandParser(), // Priority 115 - multi-command patterns \n new DotNotationRelationParser(), // Priority 115 - dot notation relations\n new AtomCommandParser(), // Priority 100 - standard priority\n new InfoCommandParser() // Priority 50 - fallback utility commands\n ].sort((a, b) => b.getPriority() - a.getPriority()), // Sort by priority descending\n placeholder: ''\n }\n];\n\n/**\n * REPL-like interface for building data instances with command-line style input\n * \n * Provides a unified terminal that supports:\n * - Nodes: add/remove atoms with Label:Type syntax\n * - Edges: add/remove relations with name:atom->atom syntax \n * - Extensions: Language-specific commands (Pyret lists, etc.)\n * - Utility commands: help, info, list, clear\n * \n * The terminal supports:\n * - Command history with up/down arrows\n * - Help system\n * - Multi-line input\n * - Extensible parser system\n * - Auto-detection of command types\n */\nexport const ReplInterface: React.FC<ReplInterfaceProps> = ({\n instance,\n onChange,\n onCndSpecExtracted,\n disabled = false,\n className = '',\n terminals = DEFAULT_TERMINALS\n}) => {\n // State for each terminal\n const [terminalStates, setTerminalStates] = useState<Record<string, TerminalState>>(() => {\n const initialState: Record<string, TerminalState> = {};\n terminals.forEach(terminal => {\n initialState[terminal.id] = {\n input: '',\n output: [], // No welcome message - keep it minimal\n isExecuting: false\n };\n });\n return initialState;\n });\n\n // State for collapsible drawers\n const [drawersOpen, setDrawersOpen] = useState<Record<string, boolean>>({\n nodes: false,\n edges: false\n });\n\n // References to terminal output containers for auto-scrolling\n const outputRefs = useRef<Record<string, HTMLDivElement | null>>({});\n\n // Get current stats from instance\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n const tupleCount = relations.reduce((sum, rel) => sum + rel.tuples.length, 0);\n\n // Auto-scroll terminal output to bottom\n const scrollToBottom = useCallback((terminalId: string) => {\n const outputRef = outputRefs.current[terminalId];\n if (outputRef) {\n outputRef.scrollTop = outputRef.scrollHeight;\n }\n }, []);\n\n // Add output line to terminal\n const addOutputLine = useCallback((terminalId: string, line: Omit<OutputLine, 'id' | 'timestamp'>) => {\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n output: [\n ...prev[terminalId].output,\n {\n ...line,\n id: `${Date.now()}-${Math.random()}`,\n timestamp: new Date()\n }\n ]\n }\n }));\n \n // Scroll to bottom after state update\n setTimeout(() => scrollToBottom(terminalId), 0);\n }, [scrollToBottom]);\n\n // Notify parent when instance changes\n const notifyChange = useCallback(() => {\n if (onChange) {\n onChange(instance);\n }\n }, [instance, onChange]);\n\n // Toggle drawer function\n const toggleDrawer = useCallback((drawerName: string) => {\n setDrawersOpen(prev => ({\n ...prev,\n [drawerName]: !prev[drawerName]\n }));\n }, []);\n\n // Execute command in terminal\n const executeCommand = useCallback(async (terminalId: string, command: string) => {\n const terminal = terminals.find(t => t.id === terminalId);\n if (!terminal) return;\n\n const trimmedCommand = command.trim();\n if (!trimmedCommand) return;\n\n // Set executing state\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n isExecuting: true\n }\n }));\n\n // Add command to output\n addOutputLine(terminalId, {\n type: 'command',\n message: trimmedCommand\n });\n\n // Try to execute with each parser (they are already sorted by priority)\n let result: CommandResult | null = null;\n let handlingParser: ICommandParser | null = null;\n \n for (const parser of terminal.parsers) {\n if (parser.canHandle(trimmedCommand)) {\n handlingParser = parser;\n try {\n const executeResult = parser.execute(trimmedCommand, instance);\n // Handle both sync and async results\n result = await Promise.resolve(executeResult);\n break;\n } catch (error) {\n result = {\n success: false,\n message: error instanceof Error ? error.message : 'Execution failed'\n };\n break;\n }\n }\n }\n\n // If no parser handled it, provide helpful error with available patterns\n if (!result) {\n const availablePatterns = terminal.parsers\n .flatMap(parser => parser.getCommandPatterns())\n .slice(0, 8) // Limit to avoid overwhelming output\n .join('\\n ');\n \n result = {\n success: false,\n message: `Unknown command: ${trimmedCommand}\\n\\nAvailable patterns:\\n ${availablePatterns}\\n\\nType 'help' for detailed information.`\n };\n }\n\n // Add result to output - only add error messages, skip success confirmations\n if (!result.success || result.action === 'help' || result.action === 'info') {\n addOutputLine(terminalId, {\n type: result.success ? (result.action === 'help' ? 'help' : result.action === 'info' ? 'info' : 'success') : 'error',\n message: result.message\n });\n }\n\n // Clear executing state and input\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n input: '',\n isExecuting: false\n }\n }));\n\n // Notify parent of changes if command was successful and modified data\n if (result.success && (result.action === 'add' || result.action === 'remove')) {\n notifyChange();\n }\n\n // Notify parent if CnD specification was extracted\n if (result.success && result.extractedCndSpec && onCndSpecExtracted) {\n onCndSpecExtracted(result.extractedCndSpec);\n }\n }, [terminals, instance, addOutputLine, notifyChange, onCndSpecExtracted]);\n\n // Handle input change\n const handleInputChange = useCallback((terminalId: string, value: string) => {\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n input: value\n }\n }));\n }, []);\n\n // Handle execute button click\n const handleExecute = useCallback(async (terminalId: string) => {\n const state = terminalStates[terminalId];\n if (!state || state.isExecuting) return;\n\n const commands = state.input.split('\\n').map(cmd => cmd.trim()).filter(cmd => cmd);\n \n // Execute each command in sequence (await each one)\n for (const command of commands) {\n await executeCommand(terminalId, command);\n }\n }, [terminalStates, executeCommand]);\n\n // Handle key press in input\n const handleKeyPress = useCallback((e: React.KeyboardEvent, terminalId: string) => {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n handleExecute(terminalId);\n }\n }, [handleExecute]);\n\n // Clear terminal output\n const clearTerminal = useCallback((terminalId: string) => {\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n output: []\n }\n }));\n }, []);\n\n // Show help for terminal\n const showHelp = useCallback((terminalId: string) => {\n const terminal = terminals.find(t => t.id === terminalId);\n if (!terminal) return;\n\n let helpText = `${terminal.title} Help:\\n\\n`;\n \n terminal.parsers.forEach(parser => {\n const help = parser.getHelp();\n helpText += help.join('\\n') + '\\n\\n';\n });\n\n addOutputLine(terminalId, {\n type: 'help',\n message: helpText.trim()\n });\n }, [terminals, addOutputLine]);\n\n // Global clear all\n const clearAll = useCallback(() => {\n try {\n // Clear the instance\n const atomIds = instance.getAtoms().map(a => a.id);\n atomIds.forEach(id => instance.removeAtom(id));\n \n // Add success message to all terminals\n terminals.forEach(terminal => {\n addOutputLine(terminal.id, {\n type: 'success',\n message: `Instance cleared (removed ${atomIds.length} atoms)`\n });\n });\n \n notifyChange();\n } catch (error) {\n // Add error message to all terminals\n terminals.forEach(terminal => {\n addOutputLine(terminal.id, {\n type: 'error',\n message: error instanceof Error ? error.message : 'Failed to clear instance'\n });\n });\n }\n }, [instance, terminals, addOutputLine, notifyChange]);\n\n return (\n <div className={`repl-interface ${className}`}>\n <div className=\"repl-interface__main\">\n {/* Minimal header with simplified stats */}\n <div className=\"repl-interface__header\">\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n onClick={() => toggleDrawer('nodes')}\n style={{\n background: drawersOpen.nodes ? '#4ec9b0' : '#2d2d30',\n color: drawersOpen.nodes ? '#1e1e1e' : '#cccccc',\n border: '1px solid #3c3c3c',\n padding: '3px 6px',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '0.75rem'\n }}\n >\n {atoms.length}\n </button>\n <button\n onClick={() => toggleDrawer('edges')}\n style={{\n background: drawersOpen.edges ? '#4ec9b0' : '#2d2d30',\n color: drawersOpen.edges ? '#1e1e1e' : '#cccccc',\n border: '1px solid #3c3c3c',\n padding: '3px 6px',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '0.75rem'\n }}\n >\n {relations.length}\n </button>\n </div>\n </div>\n\n <div className=\"repl-interface__terminals\">\n {terminals.map(terminal => {\n const state = terminalStates[terminal.id];\n if (!state) return null;\n\n return (\n <div key={terminal.id} className=\"repl-terminal\">\n {/* Remove terminal header - keep it minimal */}\n <div \n className=\"repl-terminal__output\"\n ref={ref => { outputRefs.current[terminal.id] = ref; }}\n >\n {state.output.map(line => (\n <div key={line.id} className={`repl-output-line ${line.type}`}>\n {line.message.split('\\n').map((textLine, index) => (\n <div key={index}>{textLine}</div>\n ))}\n </div>\n ))}\n </div>\n\n <div className=\"repl-terminal__input\">\n <textarea\n value={state.input}\n onChange={(e) => handleInputChange(terminal.id, e.target.value)}\n onKeyDown={(e) => handleKeyPress(e, terminal.id)}\n placeholder={terminal.placeholder}\n disabled={disabled || state.isExecuting}\n rows={2}\n />\n \n <div className=\"repl-terminal__controls\">\n <button\n className=\"repl-interface__action-button danger\"\n onClick={clearAll}\n disabled={disabled}\n title=\"Clear all data\"\n style={{ marginRight: '4px', fontSize: '10px', padding: '2px 6px' }}\n >\n Clear\n </button>\n \n <button\n className=\"repl-interface__action-button\"\n onClick={() => showHelp('unified')}\n disabled={disabled}\n title=\"Show help\"\n style={{ marginRight: '4px', fontSize: '10px', padding: '2px 6px' }}\n >\n ?\n </button>\n \n <button\n className=\"repl-terminal__execute\"\n onClick={() => handleExecute(terminal.id)}\n disabled={disabled || state.isExecuting || !state.input.trim()}\n title=\"Execute commands (Ctrl+Enter)\"\n >\n {state.isExecuting ? '...' : '▶'}\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Simplified collapsible drawers - only show when opened */}\n {(drawersOpen.nodes || drawersOpen.edges) && (\n <div className=\"repl-interface__drawers\">\n {/* Nodes Drawer */}\n {drawersOpen.nodes && (\n <div className=\"repl-interface__drawer\">\n <div \n className=\"repl-interface__drawer-header\"\n onClick={() => toggleDrawer('nodes')}\n >\n <span>Atoms ({atoms.length})</span>\n <span className=\"repl-interface__drawer-toggle\">▼</span>\n </div>\n <div className=\"repl-interface__drawer-content\">\n {atoms.length === 0 ? (\n <div className=\"repl-interface__drawer-empty\">No atoms</div>\n ) : (\n atoms.map(atom => (\n <div key={atom.id} className=\"repl-interface__drawer-item\">\n <div className=\"repl-interface__drawer-item-content\">\n <div className=\"repl-interface__drawer-item-header\">\n {atom.label}:{atom.type}\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Edges Drawer */}\n {drawersOpen.edges && (\n <div className=\"repl-interface__drawer\">\n <div \n className=\"repl-interface__drawer-header\"\n onClick={() => toggleDrawer('edges')}\n >\n <span>Relations ({relations.length})</span>\n <span className=\"repl-interface__drawer-toggle\">▼</span>\n </div>\n <div className=\"repl-interface__drawer-content\">\n {relations.length === 0 ? (\n <div className=\"repl-interface__drawer-empty\">No relations</div>\n ) : (\n relations.map(relation => (\n <div key={relation.name} style={{ marginBottom: '6px' }}>\n <div className=\"repl-interface__drawer-item\">\n <div className=\"repl-interface__drawer-item-content\">\n <div className=\"repl-interface__drawer-item-header\">\n {relation.name} ({relation.tuples.length})\n </div>\n </div>\n </div>\n {relation.tuples.slice(0, 3).map((tuple, index) => (\n <div key={index} className=\"repl-interface__drawer-item\" \n style={{marginLeft: '8px', fontSize: '0.7rem'}}>\n <div className=\"repl-interface__drawer-item-content\">\n <div className=\"repl-interface__drawer-item-detail\">\n {tuple.atoms.join(' → ')}\n </div>\n </div>\n </div>\n ))}\n {relation.tuples.length > 3 && (\n <div style={{marginLeft: '8px', fontSize: '0.7rem', color: '#6a737d'}}>\n ... and {relation.tuples.length - 3} more\n </div>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};","import { ICommandParser, CommandResult } from './CoreParsers';\nimport { IInputDataInstance } from '../../../data-instance/interfaces';\nimport { PyretDataInstance } from '../../../data-instance/pyret/pyret-data-instance';\n\n/**\n * Interface for external Pyret evaluator (e.g., window.__internalRepl)\n */\nexport interface PyretEvaluator {\n /** \n * Run a Pyret expression and return the result\n * @param code - Pyret code to evaluate\n * @param sourceLocation - Optional source location identifier\n * @returns Promise that resolves to evaluation result\n */\n run(code: string, sourceLocation?: string): Promise<PyretEvaluationResult>;\n \n /**\n * Runtime utilities for checking result types\n */\n runtime: {\n isSuccessResult(result: PyretEvaluationResult): boolean;\n };\n}\n\n/**\n * Result of evaluating a Pyret expression\n */\nexport interface PyretEvaluationResult {\n /** The raw Pyret JS value (if successful) */\n result?: unknown;\n /** Exception information (if failed) */\n exn?: unknown;\n /** Whether the evaluation was successful */\n success?: boolean;\n}\n\n\n/**\n * \n * \n */\n\n/**\n * Parser for arbitrary Pyret expressions using an external Pyret evaluator\n * \n * This parser handles Pyret expressions that can be evaluated by an external\n * Pyret runtime (e.g., window.__internalRepl). It can parse and add complex\n * Pyret data structures, builtin types, and collections that would be difficult\n * to handle with simple parsers.\n * \n * Examples of supported expressions:\n * - edge(\"1\", \"b\", 3)\n * - [list: 1, 2, 3, 4]\n * - tree(node(1, empty, empty), node(2, empty, empty))\n * - table: name, age row: \"Alice\", 25 row: \"Bob\", 30 end\n */\nexport class PyretExpressionParser implements ICommandParser {\n private evaluator: PyretEvaluator | null;\n\n constructor(evaluator?: PyretEvaluator) {\n this.evaluator = evaluator || null;\n }\n\n /**\n * Update the external evaluator\n */\n setEvaluator(evaluator: PyretEvaluator | null): void {\n this.evaluator = evaluator;\n }\n\n\n /**\n * Recursively searches for a key at any level in an object\n */\n private findKeyAtAnyLevel(obj: unknown, keyName: string): unknown {\n if (!obj || typeof obj !== 'object') {\n return undefined;\n }\n \n // Check if this object has the key directly\n if (keyName in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[keyName];\n }\n \n // Recursively search in nested objects and arrays\n for (const value of Object.values(obj as Record<string, unknown>)) {\n if (value && typeof value === 'object') {\n const found = this.findKeyAtAnyLevel(value, keyName);\n if (found !== undefined) {\n return found;\n }\n }\n }\n \n return undefined;\n }\n\n /**\n * Checks if a value is a primitive type (string, number, boolean)\n */\n private isPrimitive(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n private async evaluateExpression(command: string): Promise<PyretEvaluationResult> {\n if (!this.evaluator) {\n throw new Error('No external Pyret evaluator available');\n }\n \n try {\n const result = await this.evaluator.run(command);\n\n // Step 1: Look for \"exn\" key at any level - if found, it's a failure\n const exnValue = this.findKeyAtAnyLevel(result, 'exn');\n if (exnValue !== undefined) {\n return {\n success: false,\n exn: exnValue,\n };\n }\n \n // Step 2: Look for \"answer\" key at any level - if found, process it\n const answerValue = this.findKeyAtAnyLevel(result, 'answer');\n if (answerValue !== undefined) {\n return {\n success: true,\n result: answerValue,\n };\n }\n\n // Step 3: Check if the result is a primitive value directly\n if (this.isPrimitive(result)) {\n return {\n success: true,\n result: result,\n };\n }\n\n // If we can't find an answer or exn, return failure\n return {\n success: false,\n exn: 'Unable to find answer or exn in evaluation result',\n };\n \n } catch (error) {\n return {\n success: false,\n exn: error instanceof Error ? error.message : 'Unknown evaluation error',\n };\n }\n }\n\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n\n // Handle reify command\n if (trimmed.toLowerCase() === 'reify') {\n return true;\n }\n\n // If the command is a string or number literal, we CAN handle it.\n if (/^['\"`].*['\"`]$/.test(trimmed) || /^\\d+(\\.\\d+)?$/.test(trimmed)) {\n return true;\n }\n \n // Only handle commands if we have an external evaluator\n if (!this.evaluator) {\n return false;\n }\n \n // TODO: Improve this heuristic with deeper Pyret syntax analysis\n // This is currently a hand-wavy heuristic that could be made more robust\n \n // Exclude remove commands (handled by RemoveCommandParser)\n if (trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Exclude utility commands\n const utilityCommands = ['help', 'info', 'status', 'list', 'clear'];\n if (utilityCommands.includes(trimmed.toLowerCase())) {\n return false;\n }\n \n // Exclude simple atom syntax (handled by AtomCommandParser)\n // But allow table syntax which also contains colons\n if (/^[^:]+:.+$/.test(trimmed) && !trimmed.includes('(') && !trimmed.includes('[') && \n !trimmed.includes('table:') && !trimmed.includes('row:')) {\n return false;\n }\n \n // Exclude simple dot notation (handled by DotNotationRelationParser) \n if (trimmed.includes('.') && trimmed.includes('=') && !trimmed.includes('(')) {\n return false;\n }\n \n // Handle expressions that look like Pyret code:\n // - Function calls: func(args)\n // - Constructors: Constructor(args) \n // - Lists: [list: items]\n // - Complex expressions with parentheses or brackets\n if (trimmed.includes('(') && trimmed.includes(')')) {\n return true;\n }\n \n if (trimmed.includes('[') && trimmed.includes(']')) {\n return true;\n }\n \n // Handle other Pyret-like expressions (tables, etc.)\n if (trimmed.includes('table:') || trimmed.includes('row:')) {\n return true;\n }\n \n return false;\n }\n \n getPriority(): number {\n return 90; // Lower priority than specific parsers, but higher than fallback\n }\n \n getCommandPatterns(): string[] {\n return [\n 'reify',\n '[list: 1, 2, 3, 4]',\n 'edge(\"id\", \"label\", weight)'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): Promise<CommandResult> {\n const trimmed = command.trim();\n\n // Handle reify command\n if (trimmed.toLowerCase() === 'reify') {\n return this.reifyInstance(instance).then(lines => ({\n success: true,\n message: lines.length > 0 ? lines.join('\\n') : 'No data to reify',\n action: 'info' as const\n }));\n }\n\n if (!this.evaluator) {\n return Promise.resolve({\n success: false,\n message: 'No external Pyret evaluator available. Cannot evaluate Pyret expressions.\\n\\nTo enable this feature, ensure window.__internalRepl is available.'\n });\n }\n\n // Return a promise that resolves with the actual result\n return this.evaluateExpression(trimmed)\n .then(async (evaluationResult) => {\n if (evaluationResult.success) {\n // Add the result to the instance\n const result = await this.addPyretResultToInstance(evaluationResult.result, instance, trimmed);\n return result;\n } else {\n return {\n success: false,\n message: `Evaluation failed: ${this.formatError(evaluationResult.exn)}`\n };\n }\n })\n .catch((error) => {\n return {\n success: false,\n message: `Unexpected error during evaluation: ${this.formatError(error)}`\n };\n });\n }\n\n /**\n * Re-ify data instance back to Pyret expressions using the external evaluator\n * This leverages the external evaluator for converting internal data back to Pyret form\n */\n async reifyInstance(instance: IInputDataInstance): Promise<string[]> {\n if (!this.evaluator) {\n return ['// No external Pyret evaluator available for reification'];\n }\n\n const reifyLines: string[] = [];\n \n try {\n // Re-ify atoms\n const atoms = instance.getAtoms();\n for (const atom of atoms) {\n // Convert atom to Pyret syntax based on type\n if (atom.type) {\n reifyLines.push(`${atom.label}:${atom.type}`);\n } else {\n reifyLines.push(atom.label);\n }\n }\n\n // Re-ify relations\n const relations = instance.getRelations();\n for (const relation of relations) {\n for (const tuple of relation.tuples) {\n if (tuple.atoms.length === 2) {\n // Binary relation - use dot notation\n reifyLines.push(`${tuple.atoms[0]}.${relation.name}=${tuple.atoms[1]}`);\n } else {\n // N-ary relation - use function-call syntax\n const args = tuple.atoms.map(a => `\"${a}\"`).join(', ');\n reifyLines.push(`${relation.name}(${args})`);\n }\n }\n }\n\n return reifyLines;\n } catch (error) {\n return [\n '// Error during reification:',\n `// ${error instanceof Error ? error.message : 'Unknown error'}`\n ];\n }\n }\n /**\n * Extract CnD specification from an expression by creating a faux expression and running it in the external evaluator\n */\n private async extractCndSpec(pyretResult: any, originalExpression: string): Promise<string | undefined> {\n try {\n // Only proceed if we have an evaluator\n if (!this.evaluator) {\n return undefined;\n }\n \n // Create a faux expression to call _cndspec on the result\n const cndSpecCode = `(${originalExpression})._cndspec()`;\n const specResult = await this.evaluateExpression(cndSpecCode);\n \n if (specResult.success && specResult.result) {\n // If result is a string, that's the CnD spec\n if (typeof specResult.result === 'string') {\n return specResult.result;\n }\n }\n \n\n } catch (error) {\n console.error('Error extracting CnD spec:', this.formatError(error));\n }\n // If error or no result, return undefined\n return undefined;\n }\n\n private async addPyretResultToInstance(\n pyretResult: any, \n instance: IInputDataInstance, \n originalExpression: string\n ): Promise<CommandResult> {\n try {\n // First, attempt to extract CnD specification if available\n const extractedCndSpec = await this.extractCndSpec(pyretResult, originalExpression);\n \n // Use PyretDataInstance.fromExpression for cleaner, more robust handling\n if (!this.evaluator) {\n throw new Error('No external Pyret evaluator available');\n }\n\n // Create a temporary instance from the expression using the improved static method\n const tempInstance = await PyretDataInstance.fromExpression(\n originalExpression, \n {\n\n\n \n }, // showFunctions\n this.evaluator\n );\n\n // Check if we have any data to add\n if (tempInstance.getAtoms().length === 0) {\n return {\n success: false,\n message: 'Pyret expression did not produce any data structures',\n extractedCndSpec\n };\n }\n\n // Use the built-in addFromDataInstance method for proper merging\n const success = (instance as any).addFromDataInstance?.(tempInstance, true);\n \n if (!success) {\n // Fallback for non-PyretDataInstance targets or if method doesn't exist\n return this.fallbackAddToInstance(tempInstance, instance, originalExpression, extractedCndSpec);\n }\n\n const atomCount = tempInstance.getAtoms().length;\n const relationCount = tempInstance.getRelations().reduce((sum, rel) => sum + rel.tuples.length, 0);\n\n const message = `Evaluated Pyret expression: ${originalExpression}\\nAdded ${atomCount} atoms and ${relationCount} relation tuples` +\n (extractedCndSpec ? '\\nExtracted CnD specification from result' : '');\n\n return {\n success: true,\n message,\n action: 'add',\n extractedCndSpec\n };\n\n } catch (error) {\n return {\n success: false,\n message: `Failed to convert Pyret result to data instance: ${this.formatError(error)}`\n };\n }\n }\n\n /**\n * Fallback method for adding data when addFromDataInstance is not available\n */\n private fallbackAddToInstance(\n tempInstance: PyretDataInstance, \n instance: IInputDataInstance, \n originalExpression: string, \n extractedCndSpec?: string\n ): CommandResult {\n let atomsAdded = 0;\n let relationsAdded = 0;\n\n // Add all atoms to the main instance\n for (const atom of tempInstance.getAtoms()) {\n try {\n // Generate unique ID if there's a conflict\n let uniqueId = atom.id;\n const existingIds = new Set(instance.getAtoms().map(a => a.id));\n let counter = 1;\n\n while (existingIds.has(uniqueId)) {\n uniqueId = `${atom.id}_${counter}`;\n counter++;\n }\n\n const atomToAdd = { ...atom, id: uniqueId };\n instance.addAtom(atomToAdd);\n atomsAdded++;\n } catch (error) {\n console.warn('Failed to add atom:', error);\n }\n }\n\n // Add all relation tuples to the main instance\n for (const relation of tempInstance.getRelations()) {\n for (const tuple of relation.tuples) {\n try {\n instance.addRelationTuple(relation.name, tuple);\n relationsAdded++;\n } catch (error) {\n console.warn('Failed to add relation tuple:', error);\n }\n }\n }\n\n const message = `Evaluated Pyret expression: ${originalExpression}\\nAdded ${atomsAdded} atoms and ${relationsAdded} relation tuples` +\n (extractedCndSpec ? '\\nExtracted CnD specification from result' : '');\n\n return {\n success: true,\n message,\n action: 'add',\n extractedCndSpec\n };\n }\n\n /**\n * Format Pyret evaluation errors for display\n */\n private formatError(error: any): string {\n if (!error) {\n return 'Unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (typeof error === 'object' && error !== null) {\n // Try to extract useful error information from Pyret error objects\n const errorObj = error;\n\n if (errorObj.message) {\n return errorObj.message;\n }\n\n if (errorObj.toString && typeof errorObj.toString === 'function') {\n return errorObj.toString();\n }\n }\n\n return String(error);\n }\n\n getHelp(): string[] {\n const baseHelp = [\n 'Pyret Expression Commands (requires external evaluator):',\n ' reify - Convert current data instance back to Pyret expressions',\n ' edge(\"id\", \"label\", weight) - Add edge data structure',\n ' [list: 1, 2, 3, 4] - Add Pyret list',\n ' tree(left, right) - Add tree data structure',\n ' table: col1, col2 row: val1, val2 end - Add table data structure',\n '',\n 'This parser can evaluate arbitrary Pyret expressions and convert',\n 'the results into atoms and relations in the data instance.',\n ];\n \n if (!this.evaluator) {\n return [\n ...baseHelp,\n '',\n '⚠️ External Pyret evaluator not available.',\n 'This parser requires window.__internalRepl or similar.',\n 'The \"reify\" command works without external evaluator.'\n ];\n }\n \n return [\n ...baseHelp,\n '',\n '✓ External Pyret evaluator is available.',\n 'You can use any valid Pyret expression.'\n ];\n }\n}","import { ICommandParser, CommandResult } from './CoreParsers';\nimport { IInputDataInstance, IAtom } from '../../../data-instance/interfaces';\nimport { PyretDataInstance } from '../../../data-instance/pyret/pyret-data-instance';\nimport { PyretEvaluator } from './PyretExpressionParser';\n\n/**\n * Parser for Pyret-style ID allocation syntax\n * \n * Supports:\n * - x = 1 (allocate ID 'x' to a primitive value)\n * - xz = Black(...) (allocate ID 'xz' to a constructor expression)\n * - alice = [list: 1, 2, 3] (allocate ID 'alice' to a list)\n * \n * This parser uses the external evaluator to infer proper types instead of\n * defaulting to generic types like \"1:Number\"\n */\nexport class PyretIdAllocationParser implements ICommandParser {\n private evaluator: PyretEvaluator | null;\n\n constructor(evaluator?: PyretEvaluator) {\n this.evaluator = evaluator || null;\n }\n\n /**\n * Update the external evaluator\n */\n setEvaluator(evaluator: PyretEvaluator | null): void {\n this.evaluator = evaluator;\n }\n\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // Must contain an assignment operator\n if (!trimmed.includes('=')) {\n return false;\n }\n \n // Exclude remove commands\n if (trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Exclude utility commands\n const utilityCommands = ['help', 'info', 'status', 'list', 'clear', 'reify'];\n if (utilityCommands.includes(trimmed.toLowerCase())) {\n return false;\n }\n \n // Exclude dot notation relations (handled by DotNotationRelationParser)\n // Only exclude if dot comes before equals (e.g., alice.friend=bob)\n if (trimmed.includes('.') && trimmed.includes('=')) {\n const dotIndex = trimmed.indexOf('.');\n const equalsIndex = trimmed.indexOf('=');\n if (dotIndex < equalsIndex) {\n return false; // This is dot notation relation like alice.friend=bob\n }\n }\n \n // Pattern: id = expression\n // Where id is a valid identifier and expression is a Pyret expression\n // Exclude comparison operators (==, !=, <=, >=, etc.)\n const assignmentMatch = trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*=(?!=)\\s*(.+)$/);\n if (!assignmentMatch) {\n return false;\n }\n \n const [, id, expression] = assignmentMatch;\n \n // Validate ID\n if (!this.isValidId(id)) {\n return false;\n }\n \n // Check if the expression looks like a Pyret expression or primitive\n return this.looksLikePyretExpression(expression);\n }\n \n getPriority(): number {\n return 110; // Higher priority than AtomCommandParser but lower than RemoveCommandParser\n }\n \n getCommandPatterns(): string[] {\n return [\n 'x = 1',\n 'alice = \"Alice\"',\n 'node = Black(...)',\n 'mylist = [list: 1, 2, 3]',\n 'tree = node(1, empty, empty)'\n ];\n }\n\n async execute(command: string, instance: IInputDataInstance): Promise<CommandResult> {\n const trimmed = command.trim();\n \n const assignmentMatch = trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*=(?!=)\\s*(.+)$/);\n if (!assignmentMatch) {\n return {\n success: false,\n message: 'Invalid assignment syntax. Use: id = expression'\n };\n }\n \n const [, assignedId, expression] = assignmentMatch;\n \n try {\n // Check if ID is already in use\n const existingAtom = instance.getAtoms().find(a => a.id === assignedId);\n if (existingAtom) {\n return {\n success: false,\n message: `ID '${assignedId}' is already in use. Use a different ID or remove the existing atom first.`\n };\n }\n \n if (this.isPrimitiveExpression(expression)) {\n // Handle primitive values directly\n return this.handlePrimitiveAssignment(assignedId, expression, instance);\n }\n \n if (!this.evaluator) {\n return {\n success: false,\n message: 'No external Pyret evaluator available. Cannot evaluate complex expressions.\\n\\nTo enable this feature, ensure window.__internalRepl is available.'\n };\n }\n \n // Use external evaluator for complex expressions\n return await this.handleComplexAssignment(assignedId, expression, instance);\n \n } catch (error) {\n return {\n success: false,\n message: `Failed to assign '${assignedId}': ${error instanceof Error ? error.message : 'Unknown error'}`\n };\n }\n }\n\n private isValidId(id: string): boolean {\n // Valid JavaScript identifier that doesn't conflict with keywords\n const reservedWords = ['add', 'remove', 'help', 'info', 'list', 'clear', 'reify'];\n return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(id) && !reservedWords.includes(id.toLowerCase());\n }\n\n private looksLikePyretExpression(expression: string): boolean {\n const trimmed = expression.trim();\n \n // Primitive values\n if (this.isPrimitiveExpression(trimmed)) {\n return true;\n }\n \n // Complex Pyret expressions\n return (\n // Function calls or constructors\n (trimmed.includes('(') && trimmed.includes(')')) ||\n // Lists or collections\n (trimmed.includes('[') && trimmed.includes(']')) ||\n // Tables\n trimmed.includes('table:') ||\n trimmed.includes('row:')\n );\n }\n\n private isPrimitiveExpression(expression: string): boolean {\n const trimmed = expression.trim();\n \n return (\n // Numbers (including floats)\n /^\\d+(\\.\\d+)?$/.test(trimmed) ||\n // Strings\n /^['\"`].*['\"`]$/.test(trimmed) ||\n // Booleans\n trimmed === 'true' || trimmed === 'false'\n );\n }\n\n private handlePrimitiveAssignment(assignedId: string, expression: string, instance: IInputDataInstance): CommandResult {\n const trimmed = expression.trim();\n let value: string | number | boolean;\n let type: string;\n \n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n // Number\n value = trimmed.includes('.') ? parseFloat(trimmed) : parseInt(trimmed);\n type = 'Number';\n } else if (/^['\"`](.*)['\"`]$/.test(trimmed)) {\n // String\n value = trimmed.slice(1, -1); // Remove quotes\n type = 'String';\n } else if (trimmed === 'true' || trimmed === 'false') {\n // Boolean\n value = trimmed === 'true';\n type = 'Boolean';\n } else {\n return {\n success: false,\n message: `Cannot parse primitive value: ${expression}`\n };\n }\n \n const atom: IAtom = {\n id: assignedId,\n label: String(value),\n type: type\n };\n \n instance.addAtom(atom);\n \n return {\n success: true,\n message: `[${assignedId}] Assigned ${assignedId} = ${value} (${type})`,\n action: 'add'\n };\n }\n\n private async handleComplexAssignment(assignedId: string, expression: string, instance: IInputDataInstance): Promise<CommandResult> {\n if (!this.evaluator) {\n throw new Error('External evaluator not available');\n }\n \n try {\n // Evaluate the expression\n const evaluationResult = await this.evaluator.run(expression);\n \n if (!this.evaluator.runtime.isSuccessResult(evaluationResult)) {\n return {\n success: false,\n message: `Failed to evaluate expression '${expression}': ${this.formatError(evaluationResult.exn)}`\n };\n }\n \n // Create a temporary PyretDataInstance from the result\n const tempInstance = await PyretDataInstance.fromExpression(\n expression,\n false, // showFunctions\n this.evaluator\n );\n \n if (tempInstance.getAtoms().length === 0) {\n return {\n success: false,\n message: `Expression '${expression}' did not produce any data structures`\n };\n }\n \n // Get the first (root) atom and assign the specified ID\n const rootAtoms = tempInstance.getAtoms();\n const rootAtom = rootAtoms[0];\n \n // Create new atom with assigned ID\n const assignedAtom: IAtom = {\n id: assignedId,\n label: rootAtom.label,\n type: rootAtom.type\n };\n \n instance.addAtom(assignedAtom);\n \n // If there are multiple atoms or relations, add them with updated references\n if (rootAtoms.length > 1 || tempInstance.getRelations().length > 0) {\n // Update all references from the original root atom ID to the assigned ID\n await this.mergeInstanceWithIdMapping(tempInstance, instance, rootAtom.id, assignedId);\n }\n \n const atomCount = rootAtoms.length;\n const relationCount = tempInstance.getRelations().reduce((sum, rel) => sum + rel.tuples.length, 0);\n \n return {\n success: true,\n message: `[${assignedId}] Assigned ${assignedId} = ${expression}\\nAdded ${atomCount} atoms and ${relationCount} relation tuples`,\n action: 'add'\n };\n \n } catch (error) {\n return {\n success: false,\n message: `Failed to evaluate and assign '${expression}': ${error instanceof Error ? error.message : 'Unknown error'}`\n };\n }\n }\n\n private async mergeInstanceWithIdMapping(\n sourceInstance: PyretDataInstance, \n targetInstance: IInputDataInstance, \n oldRootId: string, \n newRootId: string\n ): Promise<void> {\n // Create ID mapping\n const idMapping = new Map<string, string>();\n idMapping.set(oldRootId, newRootId);\n \n // Add remaining atoms (skip the root atom as it's already added)\n for (const atom of sourceInstance.getAtoms()) {\n if (atom.id === oldRootId) continue;\n \n // Generate unique ID for non-root atoms\n let uniqueId = atom.id;\n const existingIds = new Set(targetInstance.getAtoms().map(a => a.id));\n let counter = 1;\n \n while (existingIds.has(uniqueId)) {\n uniqueId = `${atom.id}_${counter}`;\n counter++;\n }\n \n idMapping.set(atom.id, uniqueId);\n \n const mappedAtom: IAtom = {\n id: uniqueId,\n label: atom.label,\n type: atom.type\n };\n \n targetInstance.addAtom(mappedAtom);\n }\n \n // Add relations with mapped IDs\n for (const relation of sourceInstance.getRelations()) {\n for (const tuple of relation.tuples) {\n const mappedAtoms = tuple.atoms.map(atomId => idMapping.get(atomId) || atomId);\n \n targetInstance.addRelationTuple(relation.name, {\n atoms: mappedAtoms\n });\n }\n }\n }\n\n private formatError(error: unknown): string {\n if (error && typeof error === 'object' && 'message' in error) {\n return String((error as any).message);\n }\n return String(error);\n }\n\n getHelp(): string[] {\n const baseHelp = [\n 'ID Allocation Commands (Pyret-style):',\n ' id = expression - Assign specific ID to expression result',\n '',\n 'Primitive Examples:',\n ' x = 1 - Assign ID \"x\" to number 1',\n ' name = \"Alice\" - Assign ID \"name\" to string \"Alice\"',\n ' flag = true - Assign ID \"flag\" to boolean true',\n ];\n \n if (this.evaluator) {\n baseHelp.push(\n '',\n 'Complex Examples (with external evaluator):',\n ' node = Black(1, 2) - Assign ID \"node\" to constructor result',\n ' mylist = [list: 1, 2, 3] - Assign ID \"mylist\" to list',\n ' tree = node(1, empty, empty) - Assign ID \"tree\" to tree structure'\n );\n } else {\n baseHelp.push(\n '',\n 'Note: Complex expressions require external Pyret evaluator',\n ' Only primitive values (numbers, strings, booleans) are supported'\n );\n }\n \n return baseHelp;\n }\n}","/**\n * Pyret-specific REPL interface component\n * \n * This component provides a REPL interface pre-configured for Pyret data instances.\n * It can be used as a standalone component or integrated into larger applications.\n * \n * \n * \n * \n * \n * // TODO:\n * - List functionality is not correct, but we can get there!\n * - Relations can be \n */\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { ReplInterface, ReplInterfaceProps, TerminalConfig } from './ReplInterface';\nimport { PyretDataInstance } from '../../data-instance/pyret/pyret-data-instance';\nimport { IInputDataInstance } from '../../data-instance/interfaces';\nimport { PyretEvaluator, PyretExpressionParser } from './parsers/PyretExpressionParser';\nimport { RemoveCommandParser, AtomCommandParser, DotNotationRelationParser } from './parsers/CoreParsers';\nimport { InfoCommandParser } from './parsers/ExtensibleParsers';\nimport { PyretIdAllocationParser } from './parsers/PyretIdAllocationParser';\n\nexport interface PyretReplInterfaceProps extends Omit<ReplInterfaceProps, 'instance'> {\n /** Initial Pyret data instance. If not provided, an empty instance will be created. */\n initialInstance?: PyretDataInstance;\n /** Callback fired when the instance changes */\n onChange?: (instance: PyretDataInstance) => void;\n /** Callback when CnD specification is extracted from an expression */\n onCndSpecExtracted?: (spec: string) => void;\n /** Optional external Pyret evaluator (e.g., window.__internalRepl) */\n externalEvaluator?: PyretEvaluator;\n}\n\n/**\n * Create an empty PyretDataInstance\n */\nfunction createEmptyPyretDataInstance(): PyretDataInstance {\n const emptyPyretObject = {\n dict: {},\n brands: {}\n };\n return new PyretDataInstance(emptyPyretObject);\n}\n\n/**\n * Pyret-specific REPL interface component that manages its own PyretDataInstance\n */\nexport const PyretReplInterface: React.FC<PyretReplInterfaceProps> = ({\n initialInstance,\n onChange,\n onCndSpecExtracted,\n externalEvaluator,\n ...replProps\n}) => {\n const [instance, setInstance] = useState<PyretDataInstance>(\n () => initialInstance || createEmptyPyretDataInstance()\n );\n\n // Create terminal configuration with PyretExpressionParser if evaluator is available\n const terminals = useMemo(() => {\n const pyretExpressionParser = new PyretExpressionParser(externalEvaluator);\n const pyretIdAllocationParser = new PyretIdAllocationParser(externalEvaluator);\n \n const baseTerminals: TerminalConfig[] = [\n {\n id: 'unified',\n title: externalEvaluator ? 'Full Pyret REPL' : 'Enhanced REPL',\n description: externalEvaluator \n ? 'Supports ID allocation (x=1), expression evaluation, and enhanced remove commands'\n : 'Supports ID allocation (x=1), enhanced remove commands, and basic operations',\n parsers: [\n new RemoveCommandParser(), // Priority 200 - highest priority for remove commands\n new DotNotationRelationParser(), // Priority 115 - dot notation relations\n pyretIdAllocationParser, // Priority 110 - ID allocation syntax (x=1)\n new AtomCommandParser(), // Priority 100 - standard atom commands (Label:Type)\n pyretExpressionParser, // Priority 90 - Pyret expressions (only if evaluator available)\n new InfoCommandParser() // Priority 50 - fallback utility commands\n ].filter(parser => {\n // Remove PyretExpressionParser if no external evaluator\n if (parser instanceof PyretExpressionParser && !externalEvaluator) {\n return false;\n }\n return true;\n }).sort((a, b) => b.getPriority() - a.getPriority()), // Sort by priority descending\n placeholder: 'x = 1\\nalice = \"Alice\"\\nremove alice.friend\\nlist-ids'\n }\n ];\n \n return baseTerminals;\n }, [externalEvaluator]);\n\n // Handle instance changes\n const handleInstanceChange = (updatedInstance: IInputDataInstance) => {\n if (updatedInstance instanceof PyretDataInstance) {\n setInstance(updatedInstance);\n onChange?.(updatedInstance);\n }\n };\n\n // Update instance when initialInstance prop changes\n useEffect(() => {\n if (initialInstance && initialInstance !== instance) {\n setInstance(initialInstance);\n }\n }, [initialInstance]);\n\n return (\n <ReplInterface\n instance={instance}\n onChange={handleInstanceChange}\n onCndSpecExtracted={onCndSpecExtracted}\n terminals={terminals}\n {...replProps}\n />\n );\n};\n\nexport default PyretReplInterface;","/**\n * Item definition registry for the Spytial spec editor.\n *\n * Each constraint/directive type is described by an `ItemDefinition` (fields,\n * defaults, one-line summary, optional validation, and optional YAML emission /\n * ingestion overrides for quirky shapes). The builder renders forms generically\n * from `FieldSpec[]`, and the YAML codec round-trips through `toYamlNode` /\n * `fromYamlNode` when present.\n *\n * The accepted/emitted YAML shapes here are pinned against the authoritative\n * layout-engine parser (`src/layout/layoutspec.ts`) so that anything this\n * registry round-trips also parses there. Notable shapes:\n *\n * constraints:\n * - orientation: { selector, directions: [...], hold? }\n * - cyclic: { selector, direction, hold? }\n * - align: { selector, direction, hold? }\n * - group: { selector, name, addEdge?: none|togroup|fromgroup | {points,lineStyle,textStyle}, textStyle?:{color}, hold? } (groupselector)\n * - group: { field, groupOn, addToGroup, selector?, hold? } (groupfield, deprecated)\n * - size: { selector, width, height }\n * - hideAtom: { selector }\n * directives:\n * - flag: <scalar string>\n * - attribute: { field, selector?, filter?, textStyle?:{size,color} }\n * - hideField: { field, selector?, filter? }\n * - icon: { path, selector?, showLabels? }\n * - atomStyle: { selector?, fillStyle?:{color}, borderStyle?:{color,width}, textStyle?:{size,color} }\n * - atomColor: { value, selector? } (deprecated → atomStyle)\n * - edgeStyle: { field, selector?, filter?, lineStyle?:{color,pattern,weight,highlight}, textStyle?:{size,color}, showLabel?, hidden? }\n * - edgeColor: { value, field, selector?, filter?, style?, weight?, showLabel?, hidden?, highlight? } (deprecated → edgeStyle)\n * - inferredEdge: { name, selector?, draw?, lineStyle?:{color,pattern,weight,highlight}, textStyle?:{size,color} }\n * - tag: { toTag, name, value, textStyle?:{size,color} }\n *\n * This module is framework-agnostic — no React.\n */\n\nimport type { Diagnostic, FieldSpec, ItemDefinition, ItemKind } from './types';\n\n// Defaults mirrored from src/components/NoCodeView/constants.ts so the new\n// editor produces the same starting values as the editor it replaces. We keep\n// local copies (rather than importing the React-adjacent module) to keep this\n// package free of any coupling to the old NoCodeView internals.\nexport const DEFAULT_NODE_WIDTH = 100;\nexport const DEFAULT_NODE_HEIGHT = 60;\nconst DEFAULT_COLOR = '#000000';\n\n// ---- small param helpers -------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asString(value: unknown): string {\n if (value === undefined || value === null) {\n return '';\n }\n return String(value);\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((v) => asString(v)).filter((v) => v.length > 0);\n }\n if (value === undefined || value === null || value === '') {\n return [];\n }\n return [asString(value)];\n}\n\nfunction missing(value: unknown): boolean {\n return value === undefined || value === null || value === '';\n}\n\nfunction fieldError(\n fieldKey: string,\n message: string,\n severity: Diagnostic['severity'] = 'error',\n): Diagnostic {\n return { severity, message, fieldKey, source: 'structure' };\n}\n\n// ---- enum option sets (mirror src/layout/layoutspec.ts) ------------------\n\nexport const ORIENTATION_DIRECTIONS = [\n 'above',\n 'below',\n 'left',\n 'right',\n 'directlyAbove',\n 'directlyBelow',\n 'directlyLeft',\n 'directlyRight',\n] as const;\n\nexport const CYCLIC_DIRECTIONS = ['clockwise', 'counterclockwise'] as const;\nexport const ALIGN_DIRECTIONS = ['horizontal', 'vertical'] as const;\nexport const EDGE_STYLES = ['solid', 'dashed', 'dotted'] as const;\n\n/**\n * Text-size tiers for a label line, relative to the node label. `large` renders\n * bigger than the label, `normal` (the engine default) smaller, `small` smaller\n * still. (Mirrors AttrTextSize in text-extent.ts.) Used as the `size` option in\n * the shared `textStyle` block ({@link TEXT_STYLE_FIELDS}). No field `default` is\n * set — an unset value is omitted from YAML and the engine treats it as `normal`,\n * so specs stay clean.\n */\nexport const TEXT_SIZE_OPTIONS = ['small', 'normal', 'large'] as const;\n\n/**\n * Shared `textStyle` block children — reused wherever a label is styled\n * (attribute, tag, edgeStyle, atomStyle, group). No defaults (sparse). Declared\n * here, ahead of the directive definitions, so every consumer can reference it.\n */\nconst TEXT_STYLE_FIELDS: readonly FieldSpec[] = [\n { key: 'size', kind: 'enum', options: TEXT_SIZE_OPTIONS, label: 'Size' },\n { key: 'color', kind: 'color', label: 'Color' },\n];\n\n/**\n * Direction of the optional edge a group-by-selector draws between the group\n * key and the group. `none` draws nothing; `togroup` points key → group;\n * `fromgroup` points group → key. (Mirrors GroupEdgeDirection in layoutspec.ts.)\n */\nexport const GROUP_EDGE_DIRECTIONS = ['none', 'togroup', 'fromgroup'] as const;\n\n/**\n * Normalise an `addEdge` value into a GROUP_EDGE_DIRECTIONS member. Tolerates\n * the legacy boolean flag (`true` → 'togroup') and the block form\n * (`{ points, lineStyle, textStyle }` → its `points`), so a hand-authored\n * styled connector keeps its direction when round-tripped through the Builder.\n */\nfunction normGroupEdge(value: unknown): (typeof GROUP_EDGE_DIRECTIONS)[number] {\n if (value && typeof value === 'object') value = (value as Record<string, unknown>).points;\n if (value === true || value === 'togroup') return 'togroup';\n if (value === 'fromgroup') return 'fromgroup';\n return 'none';\n}\n\n/**\n * The complete set of flags the engine recognizes (`layoutspec.ts` checks for\n * exactly these and silently ignores anything else). A closed set, so the\n * builder offers a choice instead of free text.\n */\nexport const FLAG_OPTIONS = [\n 'hideDisconnected',\n 'hideDisconnectedBuiltIns',\n] as const;\n\n// ---- definitions ---------------------------------------------------------\n\n/**\n * Orientation: directions describe the TARGET relative to the SOURCE of the\n * selector edge. `directions: [left]` on selector `parent` means the target end\n * of each `parent` tuple is drawn left of the source. Summaries read in that\n * direction. (Some prose in constraints.md says the opposite; the parser is\n * authoritative.)\n */\nconst orientation: ItemDefinition = {\n kind: 'constraint',\n type: 'orientation',\n label: 'Orientation',\n description: 'Specify the relative positioning of elements.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'binary',\n placeholder: 'e.g. parent',\n help: 'Binary selector; orientation applies from the source end to the target end of each tuple.',\n },\n {\n key: 'directions',\n kind: 'enum',\n label: 'Directions',\n required: true,\n multiple: true,\n options: ORIENTATION_DIRECTIONS,\n help: 'Where the target sits relative to the source.',\n },\n ],\n summary(params) {\n const dirs = asStringArray(params.directions);\n const selector = asString(params.selector);\n const dirText = dirs.length > 0 ? dirs.join(', ') : 'no directions';\n return selector ? `target ${dirText} of source · ${selector}` : `target ${dirText} of source`;\n },\n validate(params) {\n const out: Diagnostic[] = [];\n const dirs = asStringArray(params.directions);\n const has = (d: string): boolean => dirs.includes(d);\n if (has('above') && has('below')) {\n out.push(fieldError('directions', 'Cannot be both above and below.'));\n }\n if (has('left') && has('right')) {\n out.push(fieldError('directions', 'Cannot be both left and right.'));\n }\n return out;\n },\n};\n\nconst cyclic: ItemDefinition = {\n kind: 'constraint',\n type: 'cyclic',\n label: 'Cyclic',\n description: 'Arrange elements along the perimeter of a circle.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'binary',\n },\n {\n key: 'direction',\n kind: 'enum',\n label: 'Direction',\n options: CYCLIC_DIRECTIONS,\n default: 'clockwise',\n },\n ],\n summary(params) {\n const dir = asString(params.direction) || 'clockwise';\n const selector = asString(params.selector);\n return selector ? `${dir} · ${selector}` : dir;\n },\n};\n\nconst align: ItemDefinition = {\n kind: 'constraint',\n type: 'align',\n label: 'Align',\n description: 'Ensure elements are aligned horizontally or vertically.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'binary',\n },\n {\n key: 'direction',\n kind: 'enum',\n label: 'Direction',\n required: true,\n options: ALIGN_DIRECTIONS,\n default: 'horizontal',\n },\n ],\n summary(params) {\n const dir = asString(params.direction) || 'horizontal';\n const selector = asString(params.selector);\n return selector ? `${dir} · ${selector}` : dir;\n },\n};\n\n/**\n * Group by selector. Emits under the `group:` key. The authoritative parser\n * distinguishes byselector from byfield by the presence of `field`.\n */\nconst groupselector: ItemDefinition = {\n kind: 'constraint',\n type: 'groupselector',\n label: 'Group (by selector)',\n description: 'Group elements based on a selector.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'binary',\n },\n {\n key: 'name',\n kind: 'text',\n label: 'Group name',\n placeholder: 'e.g. cluster',\n },\n {\n key: 'addEdge',\n kind: 'enum',\n label: 'Add edge',\n options: GROUP_EDGE_DIRECTIONS,\n default: 'none',\n help: 'Draw an edge between the group key and the group: \"togroup\" points key → group, \"fromgroup\" points group → key, \"none\" draws nothing. (To style that connector, author addEdge as a block — { points, lineStyle, textStyle } — in YAML.)',\n },\n {\n key: 'textStyle',\n kind: 'group',\n label: 'Label text style',\n // Only `color` today — group labels auto-fit their box, so `size` is reserved.\n children: [{ key: 'color', kind: 'color', label: 'Color' }],\n },\n ],\n summary(params) {\n const selector = asString(params.selector);\n const name = asString(params.name);\n const base = name ? `group \"${name}\"` : 'group';\n return selector ? `${base} · ${selector}` : base;\n },\n toYamlNode(params) {\n const node: Record<string, unknown> = { selector: asString(params.selector) };\n if (!missing(params.name)) {\n node.name = asString(params.name);\n }\n const edge = normGroupEdge(params.addEdge);\n if (edge !== 'none') {\n node.addEdge = edge;\n }\n // The group's own label styling (sparse — drop empty leaves).\n if (isRecord(params.textStyle)) {\n const ts: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(params.textStyle)) {\n if (v !== undefined && v !== null && v !== '') ts[k] = v;\n }\n if (Object.keys(ts).length > 0) node.textStyle = ts;\n }\n if (params.hold !== undefined) {\n node.hold = params.hold;\n }\n return { group: node };\n },\n fromYamlNode(node) {\n if (!isRecord(node)) {\n return null;\n }\n const group = node.group;\n if (!isRecord(group) || group.field !== undefined) {\n return null; // not a byselector group\n }\n const params: Record<string, unknown> = {\n selector: asString(group.selector),\n addEdge: normGroupEdge(group.addEdge),\n };\n if (group.name !== undefined) {\n params.name = asString(group.name);\n }\n // Preserve the group's own label styling (whatever leaves were authored).\n if (isRecord(group.textStyle)) {\n params.textStyle = { ...group.textStyle };\n }\n if (group.hold !== undefined) {\n params.hold = group.hold;\n }\n return params;\n },\n};\n\n/**\n * Group by field — DEPRECATED. Parsed/rendered for back-compat but hidden from\n * the add menu. Prefer `groupselector` with a binary relation.\n */\nconst groupfield: ItemDefinition = {\n kind: 'constraint',\n type: 'groupfield',\n label: 'Group (by field)',\n description: 'Group elements based on a field. Deprecated — prefer Group (by selector).',\n deprecated: true,\n deprecatedInFavorOf: 'groupselector',\n fields: [\n {\n key: 'field',\n kind: 'relationName',\n label: 'Field',\n required: true,\n },\n {\n key: 'groupOn',\n kind: 'number',\n label: 'Group on (index)',\n required: true,\n default: 0,\n },\n {\n key: 'addToGroup',\n kind: 'number',\n label: 'Add to group (index)',\n required: true,\n default: 1,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n ],\n summary(params) {\n const field = asString(params.field);\n const base = field ? `group on \"${field}\"` : 'group on field';\n const selector = asString(params.selector);\n return selector ? `${base} · ${selector}` : base;\n },\n toYamlNode(params) {\n const node: Record<string, unknown> = {\n field: asString(params.field),\n groupOn: typeof params.groupOn === 'number' ? params.groupOn : Number(params.groupOn ?? 0),\n addToGroup:\n typeof params.addToGroup === 'number' ? params.addToGroup : Number(params.addToGroup ?? 1),\n };\n if (!missing(params.selector)) {\n node.selector = asString(params.selector);\n }\n if (params.hold !== undefined) {\n node.hold = params.hold;\n }\n return { group: node };\n },\n fromYamlNode(node) {\n if (!isRecord(node)) {\n return null;\n }\n const group = node.group;\n if (!isRecord(group) || group.field === undefined) {\n return null; // not a byfield group\n }\n const params: Record<string, unknown> = {\n field: asString(group.field),\n groupOn: typeof group.groupOn === 'number' ? group.groupOn : Number(group.groupOn ?? 0),\n addToGroup:\n typeof group.addToGroup === 'number' ? group.addToGroup : Number(group.addToGroup ?? 1),\n };\n if (group.selector !== undefined) {\n params.selector = asString(group.selector);\n }\n if (group.hold !== undefined) {\n params.hold = group.hold;\n }\n return params;\n },\n};\n\nconst size: ItemDefinition = {\n kind: 'constraint',\n type: 'size',\n label: 'Size',\n description: 'Set the width and height of elements matching the selector.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n {\n key: 'width',\n kind: 'number',\n label: 'Width',\n required: true,\n default: DEFAULT_NODE_WIDTH,\n },\n {\n key: 'height',\n kind: 'number',\n label: 'Height',\n required: true,\n default: DEFAULT_NODE_HEIGHT,\n },\n ],\n summary(params) {\n const w = missing(params.width) ? '?' : asString(params.width);\n const h = missing(params.height) ? '?' : asString(params.height);\n const selector = asString(params.selector);\n return selector ? `${w}×${h} · ${selector}` : `${w}×${h}`;\n },\n validate(params) {\n const out: Diagnostic[] = [];\n for (const key of ['width', 'height'] as const) {\n const value = params[key];\n if (typeof value === 'number' && (Number.isNaN(value) || value <= 0)) {\n out.push(fieldError(key, `${key} must be greater than 0.`));\n }\n }\n return out;\n },\n};\n\nconst hideAtom: ItemDefinition = {\n kind: 'constraint',\n type: 'hideAtom',\n label: 'Hide atom',\n description: 'Hide elements matching the selector from the visualization.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'unary',\n },\n ],\n summary(params) {\n const selector = asString(params.selector);\n return selector ? `hide · ${selector}` : 'hide';\n },\n};\n\n/**\n * Flag directive — quirky scalar YAML form: `- flag: hideDisconnectedBuiltIns`.\n * The param is stored under `flag`. The codec uses toYamlNode/fromYamlNode to\n * round-trip the scalar form.\n */\nconst flag: ItemDefinition = {\n kind: 'directive',\n type: 'flag',\n label: 'Flag',\n description: 'Toggle a built-in rendering flag, e.g. hideDisconnectedBuiltIns.',\n fields: [\n {\n key: 'flag',\n // Closed choice: the engine recognizes exactly FLAG_OPTIONS and ignores\n // anything else, so the builder offers the real ones instead of free\n // text. Unknown flags in hand-written YAML still parse and round-trip;\n // they surface a structural error naming the allowed values.\n kind: 'enum',\n options: FLAG_OPTIONS,\n label: 'Flag',\n required: true,\n default: 'hideDisconnected',\n help: 'hideDisconnected hides disconnected atoms; hideDisconnectedBuiltIns hides only disconnected built-in atoms.',\n },\n ],\n summary(params) {\n const value = asString(params.flag);\n return value || '(no flag)';\n },\n toYamlNode(params) {\n return { flag: asString(params.flag) };\n },\n fromYamlNode(node) {\n if (!isRecord(node)) {\n return null;\n }\n const value = node.flag;\n if (typeof value === 'string') {\n return { flag: value };\n }\n // Tolerate the rare mapping form `flag: { flag: x }`.\n if (isRecord(value) && typeof value.flag === 'string') {\n return { flag: value.flag };\n }\n return null;\n },\n};\n\nconst attribute: ItemDefinition = {\n kind: 'directive',\n type: 'attribute',\n label: 'Attribute',\n description: 'Render a field as an inline attribute on its source atom.',\n fields: [\n {\n key: 'field',\n kind: 'relationName',\n label: 'Field',\n required: true,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n {\n key: 'filter',\n kind: 'selector',\n label: 'Filter',\n selectorArity: 'binary',\n help: 'Optional n-ary selector — apply only to matching (source, target) tuples.',\n },\n // Shared text-style block (size + color), same shape edgeStyle/atomStyle use.\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n ],\n summary(params) {\n const field = asString(params.field);\n const selector = asString(params.selector);\n const base = field || '(no field)';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst hideField: ItemDefinition = {\n kind: 'directive',\n type: 'hideField',\n label: 'Hide field',\n description: 'Hide a relation/field from the visualization.',\n fields: [\n {\n key: 'field',\n kind: 'relationName',\n label: 'Field',\n required: true,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n {\n key: 'filter',\n kind: 'selector',\n label: 'Filter',\n selectorArity: 'binary',\n help: 'Optional n-ary selector — hide only matching (source, target) tuples.',\n },\n ],\n summary(params) {\n const field = asString(params.field);\n const selector = asString(params.selector);\n const base = field ? `hide ${field}` : 'hide field';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst icon: ItemDefinition = {\n kind: 'directive',\n type: 'icon',\n label: 'Icon',\n description: 'Render matching atoms with an icon.',\n fields: [\n {\n key: 'path',\n kind: 'text',\n label: 'Path / URL',\n required: true,\n placeholder: 'e.g. https://… or assets/foo.svg',\n },\n {\n key: 'showLabels',\n kind: 'boolean',\n label: 'Show labels',\n default: false,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n ],\n summary(params) {\n const path = asString(params.path);\n const selector = asString(params.selector);\n const base = path || '(no path)';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst atomColor: ItemDefinition = {\n kind: 'directive',\n type: 'atomColor',\n label: 'Atom color',\n description: 'Deprecated — use Atom style (atomStyle). Still parsed/rendered for back-compat (value → border color).',\n deprecated: true,\n deprecatedInFavorOf: 'atomStyle',\n fields: [\n {\n key: 'value',\n kind: 'color',\n label: 'Color',\n required: true,\n default: DEFAULT_COLOR,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n ],\n summary(params) {\n const color = asString(params.value);\n const selector = asString(params.selector);\n const base = color || '(no color)';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\n/**\n * Shared `lineStyle` block children — reused by edgeStyle, inferredEdge, and a\n * group's connector. No `default`s: style blocks must stay sparse (a seeded\n * default would emit as an authored value and break the resolver's compose /\n * collision rules).\n */\nconst LINE_STYLE_FIELDS: readonly FieldSpec[] = [\n { key: 'color', kind: 'color', label: 'Color' },\n { key: 'pattern', kind: 'enum', options: EDGE_STYLES, label: 'Pattern' },\n { key: 'weight', kind: 'number', label: 'Weight' },\n { key: 'highlight', kind: 'color', label: 'Highlight' },\n];\n\n/** Shared `fillStyle` block children — an atom's interior fill. No defaults (sparse). */\nconst FILL_STYLE_FIELDS: readonly FieldSpec[] = [\n { key: 'color', kind: 'color', label: 'Color' },\n];\n\n/** Shared `borderStyle` block children — an atom's outline color + width. No defaults (sparse). */\nconst BORDER_STYLE_FIELDS: readonly FieldSpec[] = [\n { key: 'color', kind: 'color', label: 'Color' },\n { key: 'width', kind: 'number', label: 'Width' },\n];\n\nconst edgeStyle: ItemDefinition = {\n kind: 'directive',\n type: 'edgeStyle',\n label: 'Edge style',\n description: 'Style the edges of a field/relation — line and label.',\n fields: [\n { key: 'field', kind: 'relationName', label: 'Field', required: true },\n { key: 'selector', kind: 'selector', label: 'Selector', selectorArity: 'unary' },\n { key: 'filter', kind: 'selector', label: 'Filter', selectorArity: 'binary' },\n { key: 'lineStyle', kind: 'group', label: 'Line style', children: LINE_STYLE_FIELDS },\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n { key: 'showLabel', kind: 'boolean', label: 'Show label' },\n { key: 'hidden', kind: 'boolean', label: 'Hidden' },\n ],\n summary(params) {\n const field = asString(params.field);\n const line = (params.lineStyle ?? {}) as Record<string, unknown>;\n const color = asString(line.color);\n const base = field ? (color ? `${field}: ${color}` : field) : color || 'edge';\n const selector = asString(params.selector);\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst atomStyle: ItemDefinition = {\n kind: 'directive',\n type: 'atomStyle',\n label: 'Atom style',\n description: 'Style matching atoms — fill, border, and label.',\n fields: [\n { key: 'selector', kind: 'selector', label: 'Selector', selectorArity: 'unary' },\n { key: 'fillStyle', kind: 'group', label: 'Fill style', children: FILL_STYLE_FIELDS },\n { key: 'borderStyle', kind: 'group', label: 'Border style', children: BORDER_STYLE_FIELDS },\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n ],\n summary(params) {\n const fill = (params.fillStyle ?? {}) as Record<string, unknown>;\n const border = (params.borderStyle ?? {}) as Record<string, unknown>;\n const color = asString(fill.color) || asString(border.color);\n const selector = asString(params.selector);\n const base = color || 'atom';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst edgeColor: ItemDefinition = {\n kind: 'directive',\n type: 'edgeColor',\n label: 'Edge color',\n description: 'Deprecated — use Edge style (edgeStyle). Still parsed/rendered for back-compat.',\n deprecated: true,\n deprecatedInFavorOf: 'edgeStyle',\n fields: [\n {\n key: 'field',\n kind: 'relationName',\n label: 'Field',\n required: true,\n },\n {\n key: 'value',\n kind: 'color',\n label: 'Color',\n required: true,\n default: DEFAULT_COLOR,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n {\n key: 'style',\n kind: 'enum',\n label: 'Style',\n options: EDGE_STYLES,\n },\n {\n key: 'weight',\n kind: 'number',\n label: 'Weight',\n },\n ],\n summary(params) {\n const field = asString(params.field);\n const color = asString(params.value);\n const base = field ? `${field}: ${color || 'edge'}` : color || 'edge';\n const selector = asString(params.selector);\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst inferredEdge: ItemDefinition = {\n kind: 'directive',\n type: 'inferredEdge',\n label: 'Inferred edge',\n description: 'Draw an inferred edge from a selector — line and label.',\n fields: [\n {\n key: 'name',\n kind: 'text',\n label: 'Name',\n required: true,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'binary',\n },\n {\n key: 'draw',\n kind: 'text',\n label: 'Draw',\n help: \"Endpoint interpretation: '<end> -> <end>', each end '_' (the atom itself) or a group constraint name (attach to that group's hull — a keyed group picks by the end's atom; a unary group is a single group and attaches directly). E.g. 'regions -> regions' or '_ -> regions'.\",\n },\n // Same shared blocks as edgeStyle. The engine still accepts the legacy flat\n // color/style/weight (deprecated + warned), so old specs keep working.\n { key: 'lineStyle', kind: 'group', label: 'Line style', children: LINE_STYLE_FIELDS },\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n ],\n summary(params) {\n const name = asString(params.name);\n const selector = asString(params.selector);\n const line = (params.lineStyle ?? {}) as Record<string, unknown>;\n const color = asString(line.color);\n const base = name || '(no name)';\n const withColor = color ? `${base}: ${color}` : base;\n return selector ? `${withColor} · ${selector}` : withColor;\n },\n};\n\nconst tag: ItemDefinition = {\n kind: 'directive',\n type: 'tag',\n label: 'Tag',\n description: 'Add computed attributes to nodes based on selector evaluation.',\n fields: [\n {\n key: 'toTag',\n kind: 'selector',\n label: 'To tag (selector)',\n required: true,\n selectorArity: 'unary',\n help: 'Selects which atoms get the tag.',\n },\n {\n key: 'name',\n kind: 'text',\n label: 'Name',\n required: true,\n help: 'The attribute name to display.',\n },\n {\n key: 'value',\n kind: 'selector',\n label: 'Value (selector)',\n required: true,\n help: 'Selector whose result becomes the attribute value.',\n },\n // Shared text-style block (size + color), same shape edgeStyle/atomStyle use.\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n ],\n summary(params) {\n const name = asString(params.name);\n const toTag = asString(params.toTag);\n const base = name || '(no name)';\n return toTag ? `${base} · ${toTag}` : base;\n },\n};\n\n// ---- registry assembly ---------------------------------------------------\n\nconst DEFINITIONS: readonly ItemDefinition[] = [\n // constraints\n orientation,\n cyclic,\n align,\n groupselector,\n groupfield,\n size,\n hideAtom,\n // directives\n flag,\n attribute,\n hideField,\n icon,\n atomStyle,\n atomColor,\n edgeStyle,\n edgeColor,\n inferredEdge,\n tag,\n];\n\nconst BY_TYPE = new Map<string, ItemDefinition>(DEFINITIONS.map((d) => [d.type, d]));\n\n/**\n * The YAML top-level key each registry type emits under. This is usually the\n * type itself, but the two grouping definitions (`groupselector`, `groupfield`)\n * both emit under `group:` and are disambiguated on ingestion by their\n * `fromYamlNode`. The codec uses this to map a parsed YAML key back to its\n * candidate definitions.\n */\nconst YAML_KEY_BY_TYPE: Readonly<Record<string, string>> = {\n groupselector: 'group',\n groupfield: 'group',\n};\n\nfunction yamlKeyForType(type: string): string {\n return YAML_KEY_BY_TYPE[type] ?? type;\n}\n\nconst CANDIDATES_BY_YAML_KEY = ((): Map<string, ItemDefinition[]> => {\n const map = new Map<string, ItemDefinition[]>();\n for (const def of DEFINITIONS) {\n const key = yamlKeyForType(def.type);\n const list = map.get(key);\n if (list) {\n list.push(def);\n } else {\n map.set(key, [def]);\n }\n }\n return map;\n})();\n\n/**\n * Candidate definitions that emit under a given YAML key, in registry order.\n * For `group` this returns `[groupselector, groupfield]`; for everything else a\n * single-element array (or empty if the key is unknown).\n */\nexport function getDefinitionsForYamlKey(yamlKey: string): readonly ItemDefinition[] {\n return CANDIDATES_BY_YAML_KEY.get(yamlKey) ?? [];\n}\n\n/** True iff some registry definition emits under this YAML key. */\nexport function isKnownYamlKey(yamlKey: string): boolean {\n return CANDIDATES_BY_YAML_KEY.has(yamlKey);\n}\n\n/**\n * YAML keys some definition emits under, deduplicated. With no `kind`, every\n * key (constraints + directives); with a `kind`, only keys some definition of\n * that kind emits under. The registry-derived source of truth for \"which\n * top-level keys are recognized\" — use this instead of hand-listing types,\n * which drifts as the registry grows.\n *\n * Note: `size`/`hideAtom` are registered as constraints, so they appear only\n * under `'constraint'` here even though the engine also reads them among\n * directives — callers that validate the directives section must allow them.\n */\nexport function getKnownYamlKeys(kind?: ItemKind): string[] {\n const keys: string[] = [];\n for (const [key, defs] of CANDIDATES_BY_YAML_KEY) {\n if (!kind || defs.some((d) => d.kind === kind)) {\n keys.push(key);\n }\n }\n return keys;\n}\n\n/** Look up an item definition by registry type key. */\nexport function getDefinition(type: string): ItemDefinition | undefined {\n return BY_TYPE.get(type);\n}\n\n/** True iff the registry knows about this type. */\nexport function isKnownType(type: string): boolean {\n return BY_TYPE.has(type);\n}\n\n/** All definitions (constraints + directives), in canonical order. */\nexport function getAllDefinitions(): readonly ItemDefinition[] {\n return DEFINITIONS;\n}\n\n/**\n * Definitions of a given kind. Pass `{ includeDeprecated: false }` (the default)\n * to hide deprecated entries from the add menu.\n */\nexport function getDefinitions(\n kind: ItemKind,\n options: { includeDeprecated?: boolean } = {},\n): readonly ItemDefinition[] {\n const includeDeprecated = options.includeDeprecated ?? false;\n return DEFINITIONS.filter(\n (d) => d.kind === kind && (includeDeprecated || !d.deprecated),\n );\n}\n\n/**\n * Build the default params for a type from its FieldSpec defaults. Fields with\n * no `default` are omitted (so required-but-empty fields surface as diagnostics\n * rather than silently emitting empty strings).\n */\nexport function defaultParamsFor(type: string): Record<string, unknown> {\n const def = BY_TYPE.get(type);\n if (!def) {\n return {};\n }\n const params: Record<string, unknown> = {};\n for (const field of def.fields) {\n if (field.default !== undefined) {\n params[field.key] = field.default;\n }\n }\n return params;\n}\n\n/** A field's spec by key, if any. */\nexport function getFieldSpec(type: string, key: string): FieldSpec | undefined {\n return BY_TYPE.get(type)?.fields.find((f) => f.key === key);\n}\n","/**\n * Stable id generation for SpecItems.\n *\n * `uuid` is not a runtime dependency in this repo, so we use the platform Web\n * Crypto API when available (browsers + modern Node) and fall back to a\n * timestamp+random scheme otherwise. This module is framework-agnostic.\n */\n\ninterface CryptoLike {\n randomUUID?: () => string;\n}\n\n/** Generate a reasonably-unique id for a SpecItem. */\nexport function newId(): string {\n const cryptoObj: CryptoLike | undefined = (\n globalThis as { crypto?: CryptoLike }\n ).crypto;\n if (cryptoObj && typeof cryptoObj.randomUUID === 'function') {\n return cryptoObj.randomUUID();\n }\n const timestamp = Date.now().toString(36);\n const rand = Math.random().toString(36).slice(2, 12);\n const rand2 = Math.random().toString(36).slice(2, 12);\n return `${timestamp}-${rand}-${rand2}`;\n}\n","/**\n * YAML codec for the Spytial spec editor.\n *\n * Responsibilities:\n * - Parse a CnD layout-spec YAML string into a `SpecDocumentState` (the model).\n * - Serialize a `SpecDocumentState` back to deterministic YAML.\n * - Preserve, across a round trip:\n * * per-item comments (preceding `#` lines and/or an inline comment on the\n * item's first line) → `SpecItem.comment`, re-emitted as a preceding\n * comment line;\n * * a header comment block before the first section → `headerComment`;\n * * unknown constraint/directive types → `SpecItem.raw`, re-emitted from the\n * parsed node (semantic, not byte-for-byte).\n *\n * Structural parsing/emission uses js-yaml (already a dependency). js-yaml drops\n * comments, so we layer a light line-scan over the raw text to recover them and\n * associate each with the item it precedes.\n *\n * This module is framework-agnostic — no React.\n */\n\nimport jsyaml from 'js-yaml';\n\nimport {\n getDefinition,\n getDefinitionsForYamlKey,\n isKnownYamlKey,\n} from './registry';\nimport type { SpecDocumentState, SpecItem } from './types';\nimport { newId } from './id';\n\n/** Thrown by `parseYamlToState` (and `SpecDocument.fromYaml`) on invalid YAML. */\nexport class SpecParseError extends Error {\n readonly line?: number;\n readonly column?: number;\n\n constructor(message: string, line?: number, column?: number) {\n super(message);\n this.name = 'SpecParseError';\n this.line = line;\n this.column = column;\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, SpecParseError.prototype);\n }\n}\n\n// ---- helpers -------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Normalize a YAML section (array, or single-key map fallback) to an array. */\nfunction normalizeSection(section: unknown): unknown[] {\n if (Array.isArray(section)) {\n return section;\n }\n if (isRecord(section)) {\n return Object.entries(section).map(([key, value]) => ({ [key]: value }));\n }\n return [];\n}\n\n/** Extract the `type` key of a single-entry node, e.g. `{ orientation: {...} }`. */\nfunction nodeType(node: unknown): string | undefined {\n if (typeof node === 'string') {\n // bare scalar with no key — not a typed node\n return undefined;\n }\n if (!isRecord(node)) {\n return undefined;\n }\n const keys = Object.keys(node);\n return keys.length > 0 ? keys[0] : undefined;\n}\n\n// ---- comment scanning ----------------------------------------------------\n\n/**\n * Scan the raw YAML for comments inside a section, associating each accumulated\n * comment block (and/or inline trailing comment) with the item it precedes.\n * Returns a map of zero-based item index within the section → comment text.\n *\n * An \"item\" starts at a line whose trimmed text begins with `- ` (a sequence\n * entry). Preceding `#` lines accumulate into that item's comment; an inline\n * `#` on the item's own first line is appended too.\n */\nfunction scanSectionComments(yamlStr: string, sectionName: string): Map<number, string> {\n const perItem = new Map<number, string>();\n const lines = yamlStr.split('\\n');\n let inSection = false;\n let pending = '';\n let itemIndex = -1;\n\n const flushInto = (idx: number): void => {\n if (pending) {\n perItem.set(idx, pending);\n pending = '';\n }\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (!inSection) {\n if (trimmed === `${sectionName}:`) {\n inSection = true;\n }\n continue;\n }\n\n // Leaving the section on a new unindented top-level key (not a list item,\n // not a comment, not blank).\n if (\n trimmed.length > 0 &&\n !trimmed.startsWith('#') &&\n !trimmed.startsWith('-') &&\n /^[A-Za-z_]/.test(line) && // unindented\n trimmed.endsWith(':')\n ) {\n break;\n }\n\n if (trimmed.startsWith('#')) {\n const text = trimmed.slice(1).trim();\n // Join consecutive comment lines with `\\n` (not a space) so a multi-line\n // item comment re-emits as one `#` line per line — matching how\n // scanHeaderComment and the emitter treat multi-line comments. (Joining\n // with a space silently merged the lines on the round trip.)\n pending = pending ? `${pending}\\n${text}` : text;\n continue;\n }\n\n if (trimmed.startsWith('-')) {\n itemIndex += 1;\n flushInto(itemIndex);\n // inline trailing comment on the item's first line\n const inline = extractInlineComment(line);\n if (inline) {\n const prev = perItem.get(itemIndex);\n // `\\n` join keeps each source comment line a distinct `#` line on\n // re-emit, consistent with the preceding-comment join above.\n perItem.set(itemIndex, prev ? `${prev}\\n${inline}` : inline);\n }\n }\n }\n\n return perItem;\n}\n\n/**\n * Best-effort extraction of an inline `# comment` from a line, ignoring `#`\n * that appears inside a quoted scalar. Returns the comment text without the\n * leading `#`, or undefined if none.\n *\n * YAML quoting is position-sensitive: a `'`/`\"` only *opens* a quoted scalar at\n * a value-start position (line start, or after `:`, `,`, `[`, `{` and optional\n * whitespace). A bare `'`/`\"` inside a *plain* scalar (e.g. `toTag: quote '\n * inside`) is just a character and must not toggle quote state — otherwise a\n * later `#` inside a genuinely quoted sibling value (`name: 'a: b # c'`) would\n * be mistaken for a comment. Single-quoted strings escape a quote as `''`;\n * double-quoted strings escape as `\\\"`.\n */\nfunction extractInlineComment(line: string): string | undefined {\n let i = 0;\n // Tracks whether the next non-space char is in value-start position (so a\n // quote there opens a quoted scalar). True at line start and right after a\n // structural `:`, `,`, `[`, `{`.\n let valueStart = true;\n\n while (i < line.length) {\n const ch = line[i];\n\n if (ch === ' ' || ch === '\\t') {\n i += 1;\n continue;\n }\n\n if ((ch === \"'\" || ch === '\"') && valueStart) {\n // Consume the quoted scalar so any `#` inside it is ignored.\n i = skipQuotedScalar(line, i, ch);\n valueStart = false;\n continue;\n }\n\n if (ch === '#') {\n // A comment must be preceded by whitespace (or be at line start). Inside a\n // plain scalar (valueStart === false and no preceding space) a `#` is a\n // literal character, not a comment.\n if (i === 0 || /\\s/.test(line[i - 1])) {\n return line.slice(i + 1).trim();\n }\n i += 1;\n continue;\n }\n\n // Structural characters reset to a value-start position; everything else is\n // part of a plain scalar (so embedded quotes don't open a string).\n valueStart = ch === ':' || ch === ',' || ch === '[' || ch === '{';\n i += 1;\n }\n return undefined;\n}\n\n/**\n * Given that `line[start]` is an opening quote `quote` (`'` or `\"`), return the\n * index just past the closing quote (or end of line if unterminated). Honors\n * YAML escaping: `''` inside single quotes, `\\\"`/`\\\\` inside double quotes.\n */\nfunction skipQuotedScalar(line: string, start: number, quote: string): number {\n let i = start + 1;\n while (i < line.length) {\n const ch = line[i];\n if (quote === \"'\") {\n if (ch === \"'\") {\n if (line[i + 1] === \"'\") {\n i += 2; // escaped quote ''\n continue;\n }\n return i + 1; // closing quote\n }\n } else {\n if (ch === '\\\\') {\n i += 2; // skip escaped char\n continue;\n }\n if (ch === '\"') {\n return i + 1; // closing quote\n }\n }\n i += 1;\n }\n return i; // unterminated; treat rest of line as the scalar\n}\n\n/**\n * Extract the header comment: leading `#`/blank lines before the first\n * top-level key (`constraints:` / `directives:` / any key). Returns the joined\n * comment text, or undefined.\n */\nfunction scanHeaderComment(yamlStr: string): string | undefined {\n const lines = yamlStr.split('\\n');\n const parts: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === '') {\n continue;\n }\n if (trimmed.startsWith('#')) {\n parts.push(trimmed.slice(1).trim());\n continue;\n }\n // First non-comment, non-blank line ends the header.\n break;\n }\n return parts.length > 0 ? parts.join('\\n') : undefined;\n}\n\n// ---- ingestion -----------------------------------------------------------\n\n/** Convert one parsed YAML node into a SpecItem of the given kind. */\nfunction nodeToItem(node: unknown, kind: SpecItem['kind']): SpecItem | null {\n // `node` is a single-key mapping, e.g. `{ orientation: {...} }` or the scalar\n // form `{ flag: 'x' }`. `yamlKey` is that key (e.g. `group`), which may map to\n // multiple registry types (groupselector/groupfield).\n const yamlKey = nodeType(node);\n if (yamlKey === undefined) {\n return null;\n }\n\n if (!isKnownYamlKey(yamlKey)) {\n // Unknown key: preserve verbatim via `raw`, re-emitted as-is on serialize.\n return { id: newId(), kind, type: yamlKey, params: {}, raw: node };\n }\n\n const candidates = getDefinitionsForYamlKey(yamlKey);\n\n // Try each candidate's custom ingestion (fromYamlNode) in registry order; the\n // first that accepts wins. This disambiguates `group` into groupselector vs\n // groupfield.\n for (const def of candidates) {\n if (!def.fromYamlNode) {\n continue;\n }\n const params = def.fromYamlNode(node);\n if (params !== null) {\n const item: SpecItem = { id: newId(), kind, type: def.type, params };\n // Preserve the raw inner body: fromYamlNode copies only recognized keys\n // into `params`, so keep the original around for the unknown-key check to\n // flag typos it would otherwise have dropped.\n const body = (node as Record<string, unknown>)[yamlKey];\n if (isRecord(body)) {\n item.sourceBody = body;\n }\n return item;\n }\n }\n\n // No custom ingestion accepted. Fall back to default ingestion against the\n // first candidate that has no fromYamlNode (the common single-type case).\n const plain = candidates.find((d) => !d.fromYamlNode);\n if (plain) {\n const body = (node as Record<string, unknown>)[yamlKey];\n const params = isRecord(body) ? { ...body } : {};\n return { id: newId(), kind, type: plain.type, params };\n }\n\n // Every candidate had a fromYamlNode and all rejected the shape — keep the\n // node verbatim so nothing is lost. Tag it with the first candidate's type.\n const fallbackType = candidates[0]?.type ?? yamlKey;\n return { id: newId(), kind, type: fallbackType, params: {}, raw: node };\n}\n\n/** Parse a CnD layout-spec YAML string into a SpecDocumentState. */\nexport function parseYamlToState(yamlStr: string): SpecDocumentState {\n let parsed: unknown;\n try {\n parsed = yamlStr.trim() === '' ? {} : jsyaml.load(yamlStr);\n } catch (error) {\n if (error instanceof jsyaml.YAMLException) {\n const line = error.mark?.line !== undefined ? error.mark.line + 1 : undefined;\n const column = error.mark?.column !== undefined ? error.mark.column + 1 : undefined;\n throw new SpecParseError(error.reason || error.message, line, column);\n }\n throw new SpecParseError((error as Error).message);\n }\n\n const root = isRecord(parsed) ? parsed : {};\n const constraintNodes = normalizeSection(root.constraints);\n const directiveNodes = normalizeSection(root.directives);\n\n const constraintComments = scanSectionComments(yamlStr, 'constraints');\n const directiveComments = scanSectionComments(yamlStr, 'directives');\n\n const constraints: SpecItem[] = [];\n constraintNodes.forEach((node, index) => {\n const item = nodeToItem(node, 'constraint');\n if (!item) {\n return;\n }\n const comment = constraintComments.get(index);\n if (comment) {\n item.comment = comment;\n }\n constraints.push(item);\n });\n\n const directives: SpecItem[] = [];\n directiveNodes.forEach((node, index) => {\n const item = nodeToItem(node, 'directive');\n if (!item) {\n return;\n }\n const comment = directiveComments.get(index);\n if (comment) {\n item.comment = comment;\n }\n directives.push(item);\n });\n\n const state: SpecDocumentState = { constraints, directives };\n const headerComment = scanHeaderComment(yamlStr);\n if (headerComment) {\n state.headerComment = headerComment;\n }\n\n // Preserve top-level sections the editor doesn't interpret (a host's\n // `projections:`/`temporal:` blocks, …) in document order, so a round trip\n // through the editor never deletes them.\n const otherSections = Object.entries(root)\n .filter(([key]) => key !== 'constraints' && key !== 'directives')\n .map(([key, value]) => ({ key, value }));\n if (otherSections.length > 0) {\n state.otherSections = otherSections;\n }\n return state;\n}\n\n// ---- emission ------------------------------------------------------------\n\n/** A plain object (a nested block) — not an array or primitive. */\nfunction isPlainRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/**\n * Sanitize params for emission: drop `undefined`, and recursively drop empty\n * nested blocks. Recursion keeps nested style blocks (lineStyle / textStyle / …)\n * sparse — an added-but-empty block, or one whose only leaves were cleared, is\n * omitted rather than emitted as `{}` or `key: null`.\n */\nfunction sanitizeParams(params: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (isPlainRecord(value)) {\n const nested = sanitizeParams(value);\n if (Object.keys(nested).length > 0) out[key] = nested;\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n/** Build the YAML node for a single item (used for both serialize and diffing). */\nfunction itemToYamlNode(item: SpecItem): unknown {\n if (item.raw !== undefined) {\n return item.raw;\n }\n const def = getDefinition(item.type);\n if (def?.toYamlNode) {\n return def.toYamlNode(item.params);\n }\n return { [item.type]: sanitizeParams(item.params) };\n}\n\n/**\n * Characters allowed in a flag value emitted verbatim as `- flag: <value>`.\n * This keeps YAML-significant characters (`:`, `#`, newlines, quotes,\n * leading `- `, …) out of the bare path.\n */\nconst SAFE_PLAIN_FLAG = /^[A-Za-z0-9_.-]+$/;\n\n/**\n * Whether a flag value can be emitted as a bare `- flag: value` scalar. Besides\n * containing no YAML-significant characters, the value must round-trip through\n * js-yaml as the *identical string* — this rejects values like `123`, `yes`,\n * `null`, or `.inf` that match the character pattern but would parse back as a\n * number/boolean/null (silently dropping the flag, since ingestion requires a\n * string). Anything that fails falls through to the generic, correctly-quoted\n * dump path.\n */\nfunction isBarePlainFlag(value: string): boolean {\n if (!SAFE_PLAIN_FLAG.test(value)) {\n return false;\n }\n try {\n return jsyaml.load(value) === value;\n } catch {\n return false;\n }\n}\n\n/** Emit one item node as indented YAML lines (without leading comment). */\nfunction emitItemLines(item: SpecItem): string[] {\n const node = itemToYamlNode(item);\n\n // Flag scalar special case: `- flag: value` rather than a flow map. Only take\n // the bare-scalar fast path for values that need no quoting AND that re-parse\n // as the same string; anything else falls through to the generic dump so the\n // value is escaped/quoted correctly.\n if (\n item.type === 'flag' &&\n isRecord(node) &&\n typeof node.flag === 'string' &&\n isBarePlainFlag(node.flag)\n ) {\n return [` - flag: ${node.flag}`];\n }\n\n // Default: dump the single-element sequence in flow style and re-indent.\n const dumped = jsyaml\n .dump([node], { flowLevel: 2, lineWidth: -1, sortKeys: false })\n .trimEnd();\n return dumped.split('\\n').map((line) => ` ${line}`);\n}\n\n/**\n * Emit a comment block (possibly multi-line) as indented `#` lines. Each line is\n * trimmed and blank lines dropped so emission is stable across a round trip\n * (the parser trims comment text on the way in).\n */\nfunction emitCommentLines(comment: string): string[] {\n return comment\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => ` # ${line}`);\n}\n\n/** Serialize a SpecDocumentState to deterministic, comment-preserving YAML. */\nexport function serializeStateToYaml(state: SpecDocumentState): string {\n const lines: string[] = [];\n\n if (state.headerComment) {\n const headerLines = state.headerComment\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (const line of headerLines) {\n lines.push(`# ${line}`);\n }\n if (headerLines.length > 0) {\n lines.push('');\n }\n }\n\n if (state.constraints.length > 0) {\n lines.push('constraints:');\n for (const item of state.constraints) {\n if (item.comment) {\n lines.push(...emitCommentLines(item.comment));\n }\n lines.push(...emitItemLines(item));\n }\n }\n\n if (state.directives.length > 0) {\n if (state.constraints.length > 0) {\n lines.push(''); // blank line between sections\n }\n lines.push('directives:');\n for (const item of state.directives) {\n if (item.comment) {\n lines.push(...emitCommentLines(item.comment));\n }\n lines.push(...emitItemLines(item));\n }\n }\n\n // Preserved uninterpreted sections come last, each dumped whole. Emission is\n // semantic, not byte-for-byte — same contract as unknown item nodes.\n for (const section of state.otherSections ?? []) {\n if (lines.length > 0) {\n lines.push('');\n }\n const dumped = jsyaml\n .dump({ [section.key]: section.value }, { lineWidth: -1, sortKeys: false })\n .trimEnd();\n lines.push(...dumped.split('\\n'));\n }\n\n return lines.length > 0 ? `${lines.join('\\n')}\\n` : '';\n}\n","/**\n * Domain validation for the Spytial spec editor (WP2).\n *\n * Given a `SpecDocumentState` and a `DomainSchema`, this layers domain-aware\n * diagnostics on top of the structural ones from `core/diagnostics.ts`:\n *\n * - `relationName` fields whose value is not a known relation → warning.\n * - `typeName` fields whose value is not a known type → warning.\n * - `selector` fields: identifiers in the expression that match no domain\n * type, relation, or atom → warning (per identifier).\n *\n * ALL domain diagnostics are WARNINGS: a spec may legitimately reference names\n * absent from the *current* instance (the same spec is reused across instances),\n * so a domain miss must never block editing.\n *\n * Identifier extraction (the conservative heuristic):\n * The CnD selector language is the Forge/Alloy relational-expression sublanguage\n * (see `completions.ts`). A full parse would require the `simple-graph-query`\n * ANTLR parser *and* a live instance; that is overkill for a lint and unsuitable\n * here (validation runs without an evaluator). Instead we tokenize defensively:\n * 1. Strip quoted strings and `//`/`--`/`#` comments.\n * 2. Pull identifier tokens (`[A-Za-z_][A-Za-z0-9_/]*`).\n * 3. Drop: language keywords, built-in values (univ/iden/none/Int/…),\n * pure-numeric tokens, and quantifier/let-bound variables.\n * 4. Flag the survivors that match NO domain name.\n * This errs toward NOT flagging (false negatives over false positives): anything\n * the tokenizer is unsure about is left alone. Known limitations are documented\n * on `extractSelectorIdentifiers`.\n *\n * This module is framework-agnostic — no React.\n */\n\nimport { getDefinition } from '../core/registry';\nimport type {\n Diagnostic,\n SpecDocumentState,\n SpecItem,\n FieldSpec,\n} from '../core/types';\nimport type { DomainSchema } from './domain-schema';\n\n// ---- selector lexical tables (mirror completions.ts / the Forge lexer) ----\n\n/**\n * Reserved words of the selector language that are never domain identifiers.\n * Superset of the expression-level Forge keywords plus the built-in values, so\n * the extractor never flags a keyword as an unknown name. Erring large here is\n * safe: an over-broad reserved set only causes false negatives (under-flagging).\n */\nconst SELECTOR_RESERVED: ReadonlySet<string> = new Set([\n // built-in values / constants\n 'univ',\n 'iden',\n 'none',\n 'Int',\n 'seq/Int',\n 'String',\n 'this',\n 'true',\n 'false',\n // quantifiers / multiplicities\n 'all',\n 'some',\n 'no',\n 'one',\n 'lone',\n 'set',\n 'sum',\n 'let',\n 'disj',\n 'two',\n // word-form logical / comparison operators\n 'in',\n 'and',\n 'or',\n 'not',\n 'implies',\n 'iff',\n 'else',\n 'ni',\n]);\n\n/**\n * Keywords that introduce bound variables: `all x, y : S | ...`, `some v : ...`,\n * `let a = expr | ...`. Variable names declared by these must not be flagged.\n */\nconst BINDER_KEYWORDS: ReadonlySet<string> = new Set([\n 'all',\n 'some',\n 'no',\n 'one',\n 'lone',\n 'set',\n 'sum',\n 'let',\n 'disj',\n]);\n\nconst IDENTIFIER_RE = /[A-Za-z_][A-Za-z0-9_/]*/g;\nconst PURE_NUMBER_RE = /^-?\\d+$/;\n\n/**\n * Strip string literals and line comments so their contents never produce\n * identifier tokens. Replaces removed spans with spaces to preserve offsets\n * loosely (offsets are not surfaced for selector diagnostics, but keeping the\n * shape avoids accidental token-merging across a removed span).\n */\nfunction stripStringsAndComments(input: string): string {\n let out = '';\n let i = 0;\n const n = input.length;\n while (i < n) {\n const ch = input[i];\n\n // line comments: // ... , -- ...\n // (NOTE: `#` is the cardinality operator in the selector language, NOT a\n // comment, so it must not start a comment here.)\n if (\n (ch === '/' && input[i + 1] === '/') ||\n (ch === '-' && input[i + 1] === '-')\n ) {\n while (i < n && input[i] !== '\\n') {\n out += ' ';\n i += 1;\n }\n continue;\n }\n\n // quoted strings: '...' or \"...\" (no escape handling needed for a lint)\n if (ch === '\"' || ch === \"'\") {\n const quote = ch;\n out += ' ';\n i += 1;\n while (i < n && input[i] !== quote) {\n out += ' ';\n i += 1;\n }\n if (i < n) {\n out += ' '; // closing quote\n i += 1;\n }\n continue;\n }\n\n out += ch;\n i += 1;\n }\n return out;\n}\n\n/**\n * Collect identifier names bound by quantifiers / `let`. Conservative: for each\n * binder keyword we capture identifiers appearing before the next `:`, `|`, or\n * `=` delimiter (the variable list of a quantifier decl, or the LHS of a `let`).\n * Names that happen to be domain types used as a quantifier *domain* (after the\n * `:`) are intentionally left out of the bound set — they SHOULD validate.\n */\nfunction collectBoundVariables(tokens: ReadonlyArray<Token>): Set<string> {\n const bound = new Set<string>();\n for (let i = 0; i < tokens.length; i += 1) {\n const t = tokens[i];\n if (t.kind !== 'word' || !BINDER_KEYWORDS.has(t.value)) {\n continue;\n }\n // Walk forward collecting identifier words until a decl delimiter.\n for (let j = i + 1; j < tokens.length; j += 1) {\n const u = tokens[j];\n if (u.kind === 'delim' && (u.value === ':' || u.value === '|' || u.value === '=')) {\n break;\n }\n if (u.kind === 'word' && !SELECTOR_RESERVED.has(u.value)) {\n bound.add(u.value);\n }\n }\n }\n return bound;\n}\n\ninterface Token {\n kind: 'word' | 'delim' | 'other';\n value: string;\n}\n\n/**\n * Tokenize into words (identifiers/keywords) and the decl delimiters we care\n * about (`:`, `|`, `=`). Everything else is collapsed to `other`.\n */\nfunction tokenize(input: string): Token[] {\n const cleaned = stripStringsAndComments(input);\n const tokens: Token[] = [];\n let i = 0;\n const n = cleaned.length;\n while (i < n) {\n const ch = cleaned[i];\n if (/[A-Za-z_]/.test(ch)) {\n IDENTIFIER_RE.lastIndex = i;\n const m = IDENTIFIER_RE.exec(cleaned);\n if (m && m.index === i) {\n tokens.push({ kind: 'word', value: m[0] });\n i += m[0].length;\n continue;\n }\n }\n if (ch === ':' || ch === '|' || ch === '=') {\n tokens.push({ kind: 'delim', value: ch });\n i += 1;\n continue;\n }\n tokens.push({ kind: 'other', value: ch });\n i += 1;\n }\n return tokens;\n}\n\n/**\n * Extract candidate domain identifiers from a selector expression: the\n * identifier tokens that are NOT reserved words, NOT pure numbers, and NOT\n * quantifier/let-bound variables.\n *\n * Returned in first-occurrence order, de-duplicated.\n *\n * Known limitations (intentional, biased toward NOT flagging):\n * - No scoping: a bound variable shadowing a real name suppresses flagging of\n * that name for the whole expression. Acceptable for a soft lint.\n * - `let` RHS / quantifier domains are still validated (they reference real\n * names), but a binder whose decl omits a `:`/`|`/`=` (malformed) may\n * over-collect names as \"bound\" — again only causing under-flagging.\n * - Qualified names like `seq/Int` are treated as single tokens; only the\n * fully-qualified form is checked against the domain.\n */\nexport function extractSelectorIdentifiers(selector: string): string[] {\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n return [];\n }\n const tokens = tokenize(selector);\n const bound = collectBoundVariables(tokens);\n\n const out: string[] = [];\n const seen = new Set<string>();\n for (const t of tokens) {\n if (t.kind !== 'word') {\n continue;\n }\n const name = t.value;\n if (SELECTOR_RESERVED.has(name)) {\n continue;\n }\n if (PURE_NUMBER_RE.test(name)) {\n continue;\n }\n if (bound.has(name)) {\n continue;\n }\n if (!seen.has(name)) {\n seen.add(name);\n out.push(name);\n }\n }\n return out;\n}\n\n// ---- domain name index ---------------------------------------------------\n\ninterface DomainIndex {\n types: ReadonlySet<string>;\n relations: ReadonlySet<string>;\n atoms: ReadonlySet<string>;\n}\n\nfunction buildIndex(domain: DomainSchema): DomainIndex {\n const types = new Set<string>();\n const relations = new Set<string>();\n const atoms = new Set<string>();\n for (const type of domain.types) {\n types.add(type.name);\n for (const atom of type.atoms) {\n atoms.add(atom);\n }\n }\n for (const rel of domain.relations) {\n relations.add(rel.name);\n }\n return { types, relations, atoms };\n}\n\nfunction isKnownName(index: DomainIndex, name: string): boolean {\n return (\n index.types.has(name) ||\n index.relations.has(name) ||\n index.atoms.has(name)\n );\n}\n\nfunction warn(\n message: string,\n itemId: string,\n fieldKey?: string,\n): Diagnostic {\n const d: Diagnostic = {\n severity: 'warning',\n message,\n itemId,\n source: 'domain',\n };\n if (fieldKey !== undefined) {\n d.fieldKey = fieldKey;\n }\n return d;\n}\n\n// ---- per-item / per-field validation -------------------------------------\n\nfunction fieldStringValue(item: SpecItem, field: FieldSpec): string | undefined {\n const raw = item.params[field.key];\n if (typeof raw !== 'string') {\n return undefined;\n }\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction validateItemAgainstDomain(\n item: SpecItem,\n index: DomainIndex,\n): Diagnostic[] {\n // Unknown/raw items have no editable fields to check.\n const def = getDefinition(item.type);\n if (!def) {\n return [];\n }\n\n const out: Diagnostic[] = [];\n for (const field of def.fields) {\n if (field.kind === 'relationName') {\n const value = fieldStringValue(item, field);\n if (value !== undefined && !index.relations.has(value)) {\n out.push(\n warn(\n `Relation \"${value}\" is not in this instance.`,\n item.id,\n field.key,\n ),\n );\n }\n } else if (field.kind === 'typeName') {\n const value = fieldStringValue(item, field);\n if (value !== undefined && !index.types.has(value)) {\n out.push(\n warn(\n `Type \"${value}\" is not in this instance.`,\n item.id,\n field.key,\n ),\n );\n }\n } else if (field.kind === 'selector') {\n const value = fieldStringValue(item, field);\n if (value !== undefined) {\n for (const ident of extractSelectorIdentifiers(value)) {\n if (!isKnownName(index, ident)) {\n out.push(\n warn(\n `\"${ident}\" is not a type, relation, or atom in this instance.`,\n item.id,\n field.key,\n ),\n );\n }\n }\n }\n }\n }\n return out;\n}\n\n/**\n * Validate a whole document against a domain schema. Returns only the\n * domain-source warnings; structural diagnostics are produced separately by\n * `core/diagnostics.validateState`. Both lists are concatenated by\n * `SpecDocument.validate(domain)`.\n */\nexport function validateAgainstDomain(\n state: SpecDocumentState,\n domain: DomainSchema,\n): Diagnostic[] {\n const index = buildIndex(domain);\n const out: Diagnostic[] = [];\n for (const item of state.constraints) {\n out.push(...validateItemAgainstDomain(item, index));\n }\n for (const item of state.directives) {\n out.push(...validateItemAgainstDomain(item, index));\n }\n return out;\n}\n","/**\n * Structural validation for the Spytial spec editor.\n *\n * `Diagnostic` itself is declared in `types.ts` (it is part of the pinned\n * contract). This module provides the structural validators that run over a\n * `SpecDocumentState`:\n * - missing required fields → error\n * - unknown enum values → error\n * - per-definition `validate()` results\n * - unknown item types → warning (preserved verbatim via `SpecItem.raw`)\n *\n * Domain validation (e.g. \"type Foo is not in this instance\") is layered on by\n * WP2's `validateAgainstDomain`; when a `DomainSchema` is supplied here, those\n * warnings are appended to the structural diagnostics. With no domain, only\n * structural diagnostics are produced (identical to before WP2).\n *\n * This module is framework-agnostic — no React.\n */\n\nimport { getDefinition } from './registry';\nimport type { Diagnostic, ItemDefinition, SpecDocumentState, SpecItem } from './types';\nimport type { DomainSchema } from '../domain/domain-schema';\nimport { validateAgainstDomain } from '../domain/domain-validation';\n\nfunction isEmpty(value: unknown): boolean {\n if (value === undefined || value === null) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n return false;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n// ---- unknown-key detection ----------------------------------------------\n//\n// The registry (`def.fields`, with nested `children`) is the source of truth\n// for which keys a type accepts. A key in `item.params` that no field backs is\n// almost always a typo (`showLabel` for `showLabels`, `colour` for `color`) or\n// stray junk — the engine parser silently ignores it, so without this the\n// mistake renders as a quiet no-op. We surface it as a *warning* (the diagram\n// still renders) with a \"did you mean\" when a real field is a near-miss.\n\n/**\n * Keys the engine accepts on a *constraint* that are deliberately not builder\n * fields, so they must not be flagged: `hold: never` negates any constraint\n * (read by `parseConstraints`), but exposing it as a field would clutter every\n * constraint form.\n */\nconst CONSTRAINT_STRUCTURAL_KEYS: readonly string[] = ['hold'];\n\n/**\n * Per-type keys the engine accepts but the registry does not expose as builder\n * fields, so the unknown-key check must not report them as typos:\n * - `inferredEdge` still parses the deprecated flat `color`/`style`/`weight`/\n * `highlight` (its own deprecation warning covers them).\n * - `edgeColor` is the deprecated flat form; `edgeColorToEdgeStyleRule` reads\n * these extras beyond the fields the registry lists.\n *\n * NOTE: this mirrors the engine parser (`layoutspec.ts` + the style-spec\n * parsers). If a directive gains an inner key there, add it here (or as a real\n * registry field) or valid specs will draw a spurious warning.\n */\nconst EXTRA_ACCEPTED_KEYS_BY_TYPE: Readonly<Record<string, readonly string[]>> = {\n inferredEdge: ['color', 'style', 'weight', 'highlight'],\n edgeColor: ['highlight', 'showLabel', 'hidden', 'filter'],\n};\n\n/** Levenshtein edit distance (case-insensitive at the call site). */\nfunction editDistance(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const prev = new Array<number>(n + 1);\n const curr = new Array<number>(n + 1);\n for (let j = 0; j <= n; j++) prev[j] = j;\n for (let i = 1; i <= m; i++) {\n curr[0] = i;\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);\n }\n for (let j = 0; j <= n; j++) prev[j] = curr[j];\n }\n return prev[n];\n}\n\n/**\n * The known key closest to `key`, or undefined when nothing is a near-miss.\n * \"Near\" is an edit distance of at most 2 that is also strictly less than the\n * typo's length, so short foreign keys don't get an absurd suggestion.\n */\nfunction closestKey(key: string, known: readonly string[]): string | undefined {\n let best: string | undefined;\n let bestDist = Infinity;\n const lower = key.toLowerCase();\n for (const candidate of known) {\n const d = editDistance(lower, candidate.toLowerCase());\n if (d < bestDist) {\n bestDist = d;\n best = candidate;\n }\n }\n return best !== undefined && bestDist <= 2 && bestDist < key.length ? best : undefined;\n}\n\n/**\n * Build the \"unknown field\" diagnostic for `key`, appending a `did you mean`\n * when a field is a near-miss, else the list of valid keys.\n * `suggestable` is the set of builder-field keys (what we advertise); it may be\n * narrower than the set that suppresses the warning (which also allows `hold`\n * and deprecated inline keys).\n */\nfunction unknownKeyDiagnostic(\n key: string,\n suggestable: readonly string[],\n context: string,\n itemId: string,\n fieldKey: string = key,\n): Diagnostic {\n const suggestion = closestKey(key, suggestable);\n const hint = suggestion\n ? ` Did you mean \"${suggestion}\"?`\n : suggestable.length > 0\n ? ` Known fields: ${suggestable.join(', ')}.`\n : '';\n return {\n severity: 'warning',\n code: 'unknown-key',\n message: `Unknown field \"${key}\" in ${context}.${hint}`,\n itemId,\n fieldKey,\n source: 'structure',\n };\n}\n\n/**\n * Flag params keys not backed by a field on `def` — at the top level and one\n * level down inside each declared `group` block (lineStyle / textStyle / …).\n * Only `group` fields are recursed into; other block-shaped values (e.g. a\n * group's `addEdge` written in its block form) are left alone by design.\n */\nfunction checkUnknownKeys(item: SpecItem, def: ItemDefinition): Diagnostic[] {\n const out: Diagnostic[] = [];\n\n const fieldKeys = def.fields.map((f) => f.key);\n const allowed = new Set<string>(fieldKeys);\n if (item.kind === 'constraint') {\n for (const k of CONSTRAINT_STRUCTURAL_KEYS) allowed.add(k);\n }\n for (const k of EXTRA_ACCEPTED_KEYS_BY_TYPE[item.type] ?? []) allowed.add(k);\n\n // Prefer the raw parsed body when present: a custom `fromYamlNode` (group /\n // flag) copies only recognized keys into `params`, so a typo like `naem` would\n // otherwise be dropped before it reaches this check. `sourceBody` preserves the\n // original keys for exactly this; it falls back to `params` for builder-built\n // items (which only ever hold known fields).\n const topLevel = isRecord(item.sourceBody) ? item.sourceBody : item.params;\n for (const key of Object.keys(topLevel)) {\n if (allowed.has(key)) continue;\n out.push(unknownKeyDiagnostic(key, fieldKeys, def.label, item.id));\n }\n\n for (const field of def.fields) {\n if (field.kind !== 'group' || !field.children) continue;\n const block = item.params[field.key];\n if (!isRecord(block)) continue;\n const childKeys = field.children.map((c) => c.key);\n const allowedChildren = new Set(childKeys);\n for (const key of Object.keys(block)) {\n if (allowedChildren.has(key)) continue;\n // Route with a parent-qualified key (`fillStyle.width`) so the diagnostic\n // can't collide with a same-named field in a sibling block (e.g.\n // `borderStyle.width`) — the renderer filters nested diagnostics by an\n // exact `fieldKey`. The message still names the child key and its block.\n out.push(\n unknownKeyDiagnostic(key, childKeys, field.label, item.id, `${field.key}.${key}`),\n );\n }\n }\n\n return out;\n}\n\n/** Validate a single item structurally against its registry definition. */\nexport function validateItem(item: SpecItem): Diagnostic[] {\n const out: Diagnostic[] = [];\n\n // Unknown type (preserved as raw): a non-blocking warning.\n if (item.raw !== undefined && getDefinition(item.type) === undefined) {\n out.push({\n severity: 'warning',\n code: 'unknown-type',\n message: `Unknown ${item.kind} type \"${item.type}\". It is preserved as-is but the builder cannot edit it.`,\n itemId: item.id,\n source: 'structure',\n });\n return out;\n }\n\n const def = getDefinition(item.type);\n if (!def) {\n out.push({\n severity: 'warning',\n code: 'unknown-type',\n message: `Unknown ${item.kind} type \"${item.type}\".`,\n itemId: item.id,\n source: 'structure',\n });\n return out;\n }\n\n // Deprecated type: still parses and renders, but nudge toward its replacement.\n // A distinct `code` so consumers can treat it apart from typo-style warnings.\n if (def.deprecated) {\n const replacement = def.deprecatedInFavorOf\n ? ` Use \"${def.deprecatedInFavorOf}\" instead.`\n : '';\n out.push({\n severity: 'warning',\n code: 'deprecated',\n message: `\"${def.label}\" is deprecated.${replacement}`,\n itemId: item.id,\n source: 'structure',\n });\n }\n\n for (const field of def.fields) {\n const value = item.params[field.key];\n\n if (field.required && isEmpty(value)) {\n out.push({\n severity: 'error',\n code: 'missing-required',\n message: `Missing required field \"${field.label}\".`,\n itemId: item.id,\n fieldKey: field.key,\n source: 'structure',\n });\n continue;\n }\n\n if (field.kind === 'enum' && field.options && !isEmpty(value)) {\n const allowed = new Set(field.options);\n const values = field.multiple\n ? Array.isArray(value)\n ? value.map((v) => String(v))\n : [String(value)]\n : [String(value)];\n for (const v of values) {\n if (!allowed.has(v)) {\n out.push({\n severity: 'error',\n code: 'invalid-value',\n message: `Invalid value \"${v}\" for \"${field.label}\". Allowed: ${field.options.join(', ')}.`,\n itemId: item.id,\n fieldKey: field.key,\n source: 'structure',\n });\n }\n }\n }\n }\n\n out.push(...checkUnknownKeys(item, def));\n\n if (def.validate) {\n for (const d of def.validate(item.params)) {\n // Attach the item id if the definition didn't already (definitions only\n // know about field keys, not item ids).\n out.push(d.itemId ? d : { ...d, itemId: item.id });\n }\n }\n\n return out;\n}\n\n/**\n * Cross-item check mirroring `parseLayoutSpec`'s parse-time rejection: two\n * cyclic constraints over the same selector with different directions make\n * the engine THROW (\"Inconsistent cyclic constraint…\"). Surfacing it here\n * turns that hard failure into an editable diagnostic on the offending rows.\n */\nfunction validateCyclicConsistency(\n constraints: SpecDocumentState['constraints'],\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n const bySelector = new Map<string, { direction: string; itemId: string }>();\n for (const item of constraints) {\n if (item.type !== 'cyclic') continue;\n const selector = String(item.params.selector ?? '');\n const direction = String(item.params.direction ?? '');\n if (!selector || !direction) continue; // missing-field checks cover these\n const seen = bySelector.get(selector);\n if (seen && seen.direction !== direction) {\n out.push({\n severity: 'error',\n message: `Inconsistent cyclic directions for selector \"${selector}\" (${seen.direction} vs ${direction}) — the layout engine rejects this spec.`,\n itemId: item.id,\n fieldKey: 'direction',\n source: 'structure',\n });\n } else if (!seen) {\n bySelector.set(selector, { direction, itemId: item.id });\n }\n }\n return out;\n}\n\n/**\n * Run structural validation across a whole document. When a `domain` is\n * supplied, WP2's domain warnings are appended after the structural\n * diagnostics.\n */\nexport function validateState(\n state: SpecDocumentState,\n domain?: DomainSchema,\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n for (const item of state.constraints) {\n out.push(...validateItem(item));\n }\n for (const item of state.directives) {\n out.push(...validateItem(item));\n }\n out.push(...validateCyclicConsistency(state.constraints));\n if (domain) {\n out.push(...validateAgainstDomain(state, domain));\n }\n return out;\n}\n","/**\n * SpecDocument — the single source of truth for the Spytial spec editor.\n *\n * Holds the parsed spec (constraints, directives, preserved comments/unknown\n * nodes) and exposes mutation methods that each record exactly one undo step,\n * a full undo/redo history stack, change events via `subscribe`, and\n * round-trippable YAML via `toYaml`/`fromYaml`/`replaceFromYaml`.\n *\n * Invariants:\n * - Every mutation that changes state pushes the prior state onto the undo\n * stack and clears the redo stack.\n * - `replaceFromYaml` throws `SpecParseError` (with line/column) on bad YAML\n * WITHOUT mutating state.\n * - `getState()` returns a frozen snapshot; callers cannot mutate internals.\n * - Round-trip: `SpecDocument.fromYaml(doc.toYaml())` is semantically identical\n * (params, comments, unknown nodes).\n *\n * This module is framework-agnostic — no React.\n */\n\nimport {\n defaultParamsFor,\n getDefinition,\n} from './registry';\nimport {\n parseYamlToState,\n serializeStateToYaml,\n SpecParseError,\n} from './yaml-codec';\nimport { validateState } from './diagnostics';\nimport { newId } from './id';\nimport type {\n Diagnostic,\n ItemKind,\n SpecDocumentState,\n SpecItem,\n} from './types';\nimport type { DomainSchema } from '../domain/domain-schema';\n\nexport { SpecParseError } from './yaml-codec';\n\ntype Listener = (state: SpecDocumentState) => void;\n\n/**\n * Normalize a comment to its round-trip-stable form: trim each line, drop\n * blank lines, and return undefined for an empty result. The YAML codec emits\n * one `# <line>` per line and trims on parse, so storing the trimmed form keeps\n * `fromYaml(toYaml(doc))` byte-stable.\n */\nfunction normalizeComment(comment: string | undefined): string | undefined {\n if (comment === undefined) {\n return undefined;\n }\n const lines = comment\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n return lines.length > 0 ? lines.join('\\n') : undefined;\n}\n\n// ---- deep clone (state is plain JSON-ish data: strings/numbers/bools/arrays/maps) ----\n\nfunction cloneItem(item: SpecItem): SpecItem {\n return {\n id: item.id,\n kind: item.kind,\n type: item.type,\n params: cloneValue(item.params) as Record<string, unknown>,\n ...(item.comment !== undefined ? { comment: item.comment } : {}),\n ...(item.raw !== undefined ? { raw: cloneValue(item.raw) } : {}),\n };\n}\n\nfunction cloneValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((v) => cloneValue(v));\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = cloneValue(v);\n }\n return out;\n }\n return value;\n}\n\nfunction cloneState(state: SpecDocumentState): SpecDocumentState {\n return {\n constraints: state.constraints.map(cloneItem),\n directives: state.directives.map(cloneItem),\n ...(state.headerComment !== undefined ? { headerComment: state.headerComment } : {}),\n ...(state.otherSections !== undefined\n ? {\n otherSections: state.otherSections.map((section) => ({\n key: section.key,\n value: cloneValue(section.value),\n })),\n }\n : {}),\n };\n}\n\nfunction freezeState(state: SpecDocumentState): Readonly<SpecDocumentState> {\n state.constraints.forEach((i) => {\n Object.freeze(i.params);\n Object.freeze(i);\n });\n state.directives.forEach((i) => {\n Object.freeze(i.params);\n Object.freeze(i);\n });\n Object.freeze(state.constraints);\n Object.freeze(state.directives);\n if (state.otherSections !== undefined) {\n state.otherSections.forEach((section) => Object.freeze(section));\n Object.freeze(state.otherSections);\n }\n return Object.freeze(state);\n}\n\nexport class SpecDocument {\n private state: SpecDocumentState;\n private readonly undoStack: SpecDocumentState[] = [];\n private readonly redoStack: SpecDocumentState[] = [];\n private readonly listeners = new Set<Listener>();\n /** cached frozen view of `state`, invalidated on every mutation */\n private frozen?: Readonly<SpecDocumentState>;\n\n constructor(state?: SpecDocumentState) {\n this.state = state ? cloneState(state) : { constraints: [], directives: [] };\n }\n\n /** Parse YAML into a new document. Throws `SpecParseError` with line info. */\n static fromYaml(yaml: string): SpecDocument {\n const state = parseYamlToState(yaml);\n return new SpecDocument(state);\n }\n\n /** Deterministic, comment-preserving YAML for the current state. */\n toYaml(): string {\n return serializeStateToYaml(this.state);\n }\n\n /** A frozen snapshot of the current state (safe to hand to React). */\n getState(): Readonly<SpecDocumentState> {\n if (!this.frozen) {\n this.frozen = freezeState(cloneState(this.state));\n }\n return this.frozen;\n }\n\n // ---- mutations (each records one undo step) ----------------------------\n\n /** Add a new item of `type` (params seeded from FieldSpec defaults). */\n addItem(kind: ItemKind, type: string): SpecItem {\n const def = getDefinition(type);\n if (!def) {\n throw new Error(`Cannot add unknown ${kind} type \"${type}\".`);\n }\n if (def.kind !== kind) {\n throw new Error(\n `Type \"${type}\" is a ${def.kind}, not a ${kind}.`,\n );\n }\n this.pushUndo();\n const item: SpecItem = {\n id: newId(),\n kind,\n type,\n params: defaultParamsFor(type),\n };\n if (kind === 'constraint') {\n this.state.constraints.push(item);\n } else {\n this.state.directives.push(item);\n }\n this.commit();\n return cloneItem(item);\n }\n\n /**\n * Patch an item's params/comment/type. `params` is shallow-merged into the\n * existing params (set a key to `undefined` to remove it). Changing `type`\n * does NOT reset params — the caller is responsible for supplying compatible\n * params (the builder reseeds defaults on type change at the UI layer).\n */\n updateItem(\n id: string,\n patch: Partial<Pick<SpecItem, 'params' | 'comment' | 'type'>>,\n ): void {\n const found = this.find(id);\n if (!found) {\n return;\n }\n this.pushUndo();\n const { item } = found;\n if (patch.type !== undefined) {\n item.type = patch.type;\n }\n if (patch.params !== undefined) {\n const merged: Record<string, unknown> = { ...item.params };\n for (const [key, value] of Object.entries(patch.params)) {\n if (value === undefined) {\n delete merged[key];\n } else {\n merged[key] = value;\n }\n }\n item.params = merged;\n }\n if ('comment' in patch) {\n // Normalize so the stored comment matches what survives a YAML round trip\n // (the codec trims each comment line on parse). Empty -> no comment.\n const normalized = normalizeComment(patch.comment);\n if (normalized === undefined) {\n delete item.comment;\n } else {\n item.comment = normalized;\n }\n }\n this.commit();\n }\n\n /**\n * Duplicate an item in place: a deep params/comment copy with a fresh id,\n * inserted directly after the original. ONE undo step — composing\n * addItem + updateItem + moveItem at the UI layer recorded three, so a\n * single Undo after Duplicate left a half-reverted copy behind (PR review\n * finding). Returns the clone, or null if the id is unknown.\n */\n duplicateItem(id: string): SpecItem | null {\n const found = this.find(id);\n if (!found) {\n return null;\n }\n this.pushUndo();\n const copy: SpecItem = { ...cloneItem(found.item), id: newId() };\n const list =\n found.kind === 'constraint' ? this.state.constraints : this.state.directives;\n list.splice(found.index + 1, 0, copy);\n this.commit();\n return cloneItem(copy);\n }\n\n /** Remove an item by id. No-op if not found. */\n removeItem(id: string): void {\n const found = this.find(id);\n if (!found) {\n return;\n }\n this.pushUndo();\n const list =\n found.kind === 'constraint' ? this.state.constraints : this.state.directives;\n list.splice(found.index, 1);\n this.commit();\n }\n\n /**\n * Move an item to `toIndex` within its own section (constraints or\n * directives). `toIndex` is clamped to a valid range.\n */\n moveItem(id: string, toIndex: number): void {\n const found = this.find(id);\n if (!found) {\n return;\n }\n const list =\n found.kind === 'constraint' ? this.state.constraints : this.state.directives;\n const clamped = Math.max(0, Math.min(toIndex, list.length - 1));\n if (clamped === found.index) {\n return; // no-op move records no undo step\n }\n this.pushUndo();\n const [item] = list.splice(found.index, 1);\n list.splice(clamped, 0, item);\n this.commit();\n }\n\n /**\n * Replace the entire document from YAML (code-view edits). Throws\n * `SpecParseError` on parse error WITHOUT mutating state. On success this is\n * a single undo step.\n */\n replaceFromYaml(yaml: string): void {\n const next = parseYamlToState(yaml); // throws before any mutation\n this.pushUndo();\n this.state = next;\n this.commit();\n }\n\n // ---- history -----------------------------------------------------------\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n undo(): void {\n const prev = this.undoStack.pop();\n if (!prev) {\n return;\n }\n this.redoStack.push(cloneState(this.state));\n this.state = prev;\n this.commit();\n }\n\n redo(): void {\n const next = this.redoStack.pop();\n if (!next) {\n return;\n }\n this.undoStack.push(cloneState(this.state));\n this.state = next;\n this.commit();\n }\n\n // ---- validation --------------------------------------------------------\n\n /** Structural (+ domain, in WP2) diagnostics for the current state. */\n validate(domain?: DomainSchema): Diagnostic[] {\n return validateState(this.state, domain);\n }\n\n // ---- events ------------------------------------------------------------\n\n /** Subscribe to state changes. Returns an unsubscribe function. */\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n // ---- internals ---------------------------------------------------------\n\n private pushUndo(): void {\n this.undoStack.push(cloneState(this.state));\n this.redoStack.length = 0;\n }\n\n private commit(): void {\n this.frozen = undefined;\n const snapshot = this.getState();\n for (const listener of this.listeners) {\n listener(snapshot);\n }\n }\n\n private find(\n id: string,\n ): { item: SpecItem; index: number; kind: ItemKind } | undefined {\n const ci = this.state.constraints.findIndex((i) => i.id === id);\n if (ci !== -1) {\n return { item: this.state.constraints[ci], index: ci, kind: 'constraint' };\n }\n const di = this.state.directives.findIndex((i) => i.id === id);\n if (di !== -1) {\n return { item: this.state.directives[di], index: di, kind: 'directive' };\n }\n return undefined;\n }\n}\n","/**\n * Position resolution for code-view diagnostics.\n *\n * Structural diagnostics ({@link Diagnostic}) are anchored to a `SpecItem`\n * (`itemId`) and optionally a field (`fieldKey`) — not to a text location. To\n * draw an editor squiggle under the offending token, the code view needs a\n * character range. This module re-parses the code-view YAML with a\n * position-aware parser (`yaml`, a.k.a. eemeli/yaml, whose nodes expose a source\n * `range`) and walks `(itemId → section+index, fieldKey)` to the matching key\n * node, recording its `[from, to]` offsets.\n *\n * The authoritative model still parses through `parseYamlToState` (js-yaml);\n * this is a *second*, read-only parse used only to locate tokens for the editor.\n * The two agree on structure/order for any YAML that parses, which is the only\n * case where structural diagnostics exist.\n *\n * Framework-agnostic — no React, no CodeMirror. The returned offsets are what a\n * CodeMirror lint source (or any editor) needs.\n */\n\nimport { parseDocument, isMap, isScalar, isSeq } from 'yaml';\nimport type { Diagnostic, SpecDocumentState } from './types';\nimport { parseYamlToState, SpecParseError } from './yaml-codec';\nimport { validateState } from './diagnostics';\nimport type { DomainSchema } from '../domain/domain-schema';\n\n/**\n * A diagnostic annotated with a character range into the code-view text, when\n * one could be resolved. `from`/`to` are absent for diagnostics that couldn't be\n * located (an editor squiggles the ones with a range and may still list the\n * rest).\n */\nexport interface PositionedDiagnostic extends Diagnostic {\n /** inclusive start offset into the YAML text. */\n from?: number;\n /** exclusive end offset into the YAML text. */\n to?: number;\n}\n\ntype Section = 'constraints' | 'directives';\ntype Loc = { section: Section; index: number };\n\n/** offsets[i] = char offset at which (0-based) line i starts. */\nfunction lineStartOffsets(text: string): number[] {\n const offsets = [0];\n for (let i = 0; i < text.length; i++) {\n if (text[i] === '\\n') offsets.push(i + 1);\n }\n return offsets;\n}\n\n/** Convert a 1-based line/column (our `Diagnostic` convention) to an offset. */\nfunction lineColToOffset(line: number, column: number, starts: number[], len: number): number {\n const li = Math.min(Math.max(line - 1, 0), starts.length - 1);\n return Math.min(starts[li] + Math.max(column - 1, 0), len);\n}\n\n/** Range of the first key of a single-entry item map, e.g. the `icon` in `{icon: …}`. */\nfunction itemTypeKeyRange(itemNode: unknown): [number, number] | null {\n if (isMap(itemNode) && itemNode.items.length > 0) {\n const key = itemNode.items[0].key;\n if (isScalar(key) && key.range) return [key.range[0], key.range[1]];\n }\n return null;\n}\n\n/**\n * Find the range of the key `key` within `node`, preferring a direct child over\n * a nested one (so `color` resolves to the item's own `color` before any\n * `lineStyle.color`). Returns the key scalar's `[from, to]`.\n */\nfunction findKeyRange(node: unknown, key: string): [number, number] | null {\n if (isMap(node)) {\n for (const pair of node.items) {\n if (isScalar(pair.key) && String(pair.key.value) === key && pair.key.range) {\n return [pair.key.range[0], pair.key.range[1]];\n }\n }\n for (const pair of node.items) {\n const nested = findKeyRange(pair.value, key);\n if (nested) return nested;\n }\n } else if (isSeq(node)) {\n for (const item of node.items) {\n const nested = findKeyRange(item, key);\n if (nested) return nested;\n }\n }\n return null;\n}\n\n/**\n * Find the range of a key reached by a dotted `path` (`['fillStyle', 'width']`),\n * descending into each segment's value. A single-segment path is an unqualified\n * key → {@link findKeyRange}'s recursive search. A parent-qualified path lets a\n * nested unknown key resolve to the exact token *in its own block*, not a\n * same-named key in a sibling block (e.g. `fillStyle.width` vs `borderStyle.width`).\n */\nfunction findKeyByPath(node: unknown, path: string[]): [number, number] | null {\n if (path.length === 0) return null;\n if (path.length === 1) return findKeyRange(node, path[0]);\n const [head, ...rest] = path;\n if (isMap(node)) {\n for (const pair of node.items) {\n if (isScalar(pair.key) && String(pair.key.value) === head) {\n const found = findKeyByPath(pair.value, rest);\n if (found) return found;\n }\n }\n // `head` isn't at this level — an item wraps its body under a type key, so\n // descend one level with the full path.\n for (const pair of node.items) {\n const found = findKeyByPath(pair.value, path);\n if (found) return found;\n }\n } else if (isSeq(node)) {\n for (const item of node.items) {\n const found = findKeyByPath(item, path);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Resolve a `[from, to]` range for one diagnostic, or null if it can't be\n * located. Order of preference: the specific field key, then the item's type\n * key, then a line/column already on the diagnostic.\n */\nfunction resolveRange(\n d: Diagnostic,\n locById: Map<string, Loc>,\n doc: ReturnType<typeof parseDocument> | null,\n starts: number[],\n len: number,\n): [number, number] | null {\n if (d.itemId && doc) {\n const loc = locById.get(d.itemId);\n if (loc) {\n const seq = doc.get(loc.section);\n if (isSeq(seq)) {\n const itemNode = seq.items[loc.index];\n if (itemNode !== undefined) {\n if (d.fieldKey) {\n const fieldRange = findKeyByPath(itemNode, d.fieldKey.split('.'));\n if (fieldRange) return fieldRange;\n }\n const typeRange = itemTypeKeyRange(itemNode);\n if (typeRange) return typeRange;\n }\n }\n }\n }\n\n if (d.line !== undefined) {\n const from = lineColToOffset(d.line, d.column ?? 1, starts, len);\n // A short, visible marker: to end of the token/line start region.\n return [from, Math.min(from + 1, len)];\n }\n\n return null;\n}\n\n/**\n * Annotate diagnostics with `[from, to]` character ranges against `yamlText`.\n * Every input diagnostic is returned in order; those that resolve to a token\n * gain `from`/`to`, the rest are passed through unchanged (an editor squiggles\n * the located ones and can still list the others).\n */\nexport function positionDiagnostics(\n yamlText: string,\n state: SpecDocumentState,\n diagnostics: readonly Diagnostic[],\n): PositionedDiagnostic[] {\n const locById = new Map<string, Loc>();\n state.constraints.forEach((it, i) => locById.set(it.id, { section: 'constraints', index: i }));\n state.directives.forEach((it, i) => locById.set(it.id, { section: 'directives', index: i }));\n\n let doc: ReturnType<typeof parseDocument> | null = null;\n try {\n doc = parseDocument(yamlText);\n } catch {\n doc = null;\n }\n\n const starts = lineStartOffsets(yamlText);\n const len = yamlText.length;\n\n return diagnostics.map((d) => {\n const range = resolveRange(d, locById, doc, starts, len);\n if (!range) return { ...d };\n // Clamp defensively so an editor never gets an out-of-bounds range.\n const from = Math.max(0, Math.min(range[0], len));\n const to = Math.max(from, Math.min(range[1], len));\n return { ...d, from, to };\n });\n}\n\n/**\n * Lint a YAML string for the code editor: parse it, validate the result, and\n * resolve each diagnostic to a character range — all from the SAME text, so the\n * diagnostics' item ids always match the state used to position them.\n *\n * This is deliberately self-contained rather than reusing the editor's debounced\n * model: the code view must reflect the diagnostics of the text as typed, and\n * item ids are regenerated on every parse (so a diagnostic computed against one\n * parse can't be positioned against a later one). On a syntax error it returns a\n * single positioned error; otherwise the structural (+ domain) warnings/errors.\n */\nexport function lintYaml(yamlText: string, domain?: DomainSchema): PositionedDiagnostic[] {\n if (yamlText.trim() === '') return [];\n\n let state: SpecDocumentState;\n try {\n state = parseYamlToState(yamlText);\n } catch (error) {\n const err = error as SpecParseError;\n const diag: Diagnostic = {\n severity: 'error',\n code: 'yaml-syntax',\n source: 'yaml',\n message: `YAML syntax error: ${err.message}`,\n ...(err.line !== undefined ? { line: err.line } : {}),\n ...(err.column !== undefined ? { column: err.column } : {}),\n };\n return positionDiagnostics(yamlText, { constraints: [], directives: [] }, [diag]);\n }\n\n const diagnostics = validateState(state, domain).filter(\n (d) => d.severity === 'error' || d.severity === 'warning',\n );\n return positionDiagnostics(yamlText, state, diagnostics);\n}\n","/**\n * Domain awareness contracts + extraction (WP2).\n *\n * `DomainSchema` is the editor's distilled, framework-agnostic view of the host\n * data instance: the user-facing types (sigs) with their atoms, and the\n * relations (fields) with their arity / type signature. The UI uses it to power\n * dropdowns and completions; `domain-validation.ts` uses it to warn about\n * spec items that reference names absent from the current instance.\n *\n * `extractDomainSchema(instance)` is the adapter from a live\n * `IInputDataInstance` (e.g. an `AlloyDataInstance`). It is best-effort and\n * MUST NEVER throw — a malformed or partial instance degrades to an emptier\n * schema rather than crashing the editor.\n *\n * This module is framework-agnostic — no React. The type shape here is the\n * binding contract from `docs/SPEC_EDITOR_REDESIGN.md`.\n */\n\nimport type {\n IInputDataInstance,\n IType,\n IRelation,\n} from '../../data-instance/interfaces';\n\nexport interface DomainRelation {\n name: string;\n arity?: number;\n /** type signature when known, e.g. ['Node', 'Node'] */\n typeSignature?: readonly string[];\n}\n\nexport interface DomainSchema {\n types: ReadonlyArray<{ name: string; atoms: readonly string[] }>;\n relations: readonly DomainRelation[];\n}\n\n/** A schema with no types and no relations — the safe degenerate result. */\nconst EMPTY_SCHEMA: DomainSchema = { types: [], relations: [] };\n\n/**\n * Built-in/internal type names that are always part of the selector language\n * rather than user domain types. These are never surfaced as domain types\n * (they are offered via selector keyword completions instead), and selectors\n * referencing them are never flagged by domain validation.\n */\nconst SELECTOR_BUILTIN_TYPES: ReadonlySet<string> = new Set([\n 'univ',\n 'Int',\n 'seq/Int',\n 'iden',\n 'none',\n 'String',\n]);\n\nfunction isBuiltinType(type: IType): boolean {\n // The instance API marks Alloy built-ins (univ/Int/seq/Int) via `isBuiltin`.\n // We honour that flag AND the name-based fallback above, because a few hosts\n // (and the programmatic build path) may not set the flag on built-ins.\n if (type.isBuiltin === true) {\n return true;\n }\n return SELECTOR_BUILTIN_TYPES.has(type.id);\n}\n\n/**\n * Is every type in this relation's signature a built-in/internal type?\n *\n * Alloy emits an internal `no-field-guard` relation over `[univ, univ]`; such\n * all-built-in-signature relations are housekeeping, not user fields, so we\n * drop them. A real user field always touches at least one user sig.\n */\nfunction isInternalRelation(signature: readonly string[]): boolean {\n if (signature.length === 0) {\n return false;\n }\n return signature.every((t) => SELECTOR_BUILTIN_TYPES.has(t));\n}\n\nfunction extractTypes(instance: IInputDataInstance): DomainSchema['types'] {\n let rawTypes: readonly IType[];\n try {\n rawTypes = instance.getTypes();\n } catch {\n return [];\n }\n if (!Array.isArray(rawTypes)) {\n return [];\n }\n\n const out: Array<{ name: string; atoms: string[] }> = [];\n const seen = new Set<string>();\n\n for (const type of rawTypes) {\n try {\n if (!type || typeof type.id !== 'string' || type.id.length === 0) {\n continue;\n }\n if (isBuiltinType(type)) {\n continue;\n }\n if (seen.has(type.id)) {\n continue;\n }\n seen.add(type.id);\n\n const atoms: string[] = [];\n const atomSeen = new Set<string>();\n if (Array.isArray(type.atoms)) {\n for (const atom of type.atoms) {\n // Prefer the human label, fall back to the id.\n const name =\n atom && typeof atom.label === 'string' && atom.label.length > 0\n ? atom.label\n : atom && typeof atom.id === 'string'\n ? atom.id\n : undefined;\n if (name !== undefined && !atomSeen.has(name)) {\n atomSeen.add(name);\n atoms.push(name);\n }\n }\n }\n out.push({ name: type.id, atoms });\n } catch {\n // Skip a single malformed type rather than failing the whole extraction.\n continue;\n }\n }\n return out;\n}\n\nfunction extractRelations(instance: IInputDataInstance): DomainRelation[] {\n let rawRelations: readonly IRelation[];\n try {\n rawRelations = instance.getRelations();\n } catch {\n return [];\n }\n if (!Array.isArray(rawRelations)) {\n return [];\n }\n\n const out: DomainRelation[] = [];\n const seen = new Set<string>();\n\n for (const relation of rawRelations) {\n try {\n // `name` is the bare field name used in selectors (the qualified\n // `Sig<:field` form lives in `id`, which selectors do not use).\n const name =\n relation && typeof relation.name === 'string' && relation.name.length > 0\n ? relation.name\n : undefined;\n if (name === undefined) {\n continue;\n }\n\n const signature = Array.isArray(relation.types)\n ? relation.types.filter((t: unknown): t is string => typeof t === 'string')\n : [];\n\n if (isInternalRelation(signature)) {\n continue;\n }\n\n // Dedupe on (name + signature): two distinct fields can share a bare name\n // (e.g. two `Next` fields from separate orderings) and both are useful,\n // but an exact (name, signature) duplicate is noise.\n const key = `${name}\u0000${signature.join('\u0000')}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n const rel: DomainRelation = { name };\n if (signature.length > 0) {\n rel.arity = signature.length;\n rel.typeSignature = signature;\n }\n out.push(rel);\n } catch {\n continue;\n }\n }\n return out;\n}\n\n/**\n * Adapter from the live instance. Never throws; returns a best-effort schema.\n *\n * Policy (decisions of record, see also `docs/SPEC_EDITOR_REDESIGN.md` WP2):\n * - Built-in types flagged by the instance (`isBuiltin`) — and the well-known\n * selector built-ins univ/Int/seq/Int/iden/none/String — are EXCLUDED from\n * `types`. They are reachable through selector keyword completions and are\n * never flagged by domain validation, so dropping them keeps type dropdowns\n * focused on user sigs.\n * - Relations whose entire type signature is built-in (e.g. Alloy's internal\n * `no-field-guard` over `[univ, univ]`) are EXCLUDED as housekeeping.\n * - `DomainRelation.arity`/`typeSignature` are derived from `relation.types`\n * (the type signature; length = arity) when present.\n * - Types and relations are de-duplicated; per-item failures are swallowed.\n */\nexport function extractDomainSchema(\n instance: IInputDataInstance | null | undefined,\n): DomainSchema {\n if (instance === null || instance === undefined) {\n return EMPTY_SCHEMA;\n }\n try {\n return {\n types: extractTypes(instance),\n relations: extractRelations(instance),\n };\n } catch {\n // Belt-and-braces: the per-section helpers already swallow their own\n // errors, but never let a surprise throw escape this adapter.\n return EMPTY_SCHEMA;\n }\n}\n","/**\n * Built-in completion provider for selector fields (WP2).\n *\n * The CnD selector language is the Forge/Alloy relational-expression sublanguage\n * evaluated by `simple-graph-query` (see `src/evaluators/data/sgq-evaluator.ts`).\n * The keyword/operator set below is derived from that grammar's lexer\n * (`simple-graph-query/dist/forge-antlr/ForgeLexer.d.ts`) restricted to the\n * tokens that can appear inside a *selector expression* (module/declaration\n * tokens like `sig`, `pred`, `run`, `check` are intentionally excluded), cross\n * checked against the old highlighter's keyword set in\n * `src/components/NoCodeView/Selectors/SelectorInput.tsx`.\n *\n * Three entry points:\n * - `getSelectorKeywordCompletions()` — language keywords/operators/snippets,\n * independent of any instance.\n * - `getDomainCompletions(domain)` — types/relations/atoms from a DomainSchema.\n * - `createBuiltinCompletionSource(domain?)` — a merged, prefix-filtered\n * `(prefix) => Completion[]` the UI calls on each keystroke; this is also\n * what an integrator merges with `assistant.complete()` results.\n *\n * This module is framework-agnostic — no React.\n */\n\nimport type { Completion } from './assistant';\nimport type { DomainSchema } from './domain-schema';\n\n/**\n * Maximum number of atom completions emitted from a domain. Instances can hold\n * thousands of atoms; offering all of them would flood the popup and slow\n * filtering. The cap keeps the built-in source responsive; an integrator that\n * needs more can supply an `assistant.complete()` that returns instance-aware\n * results. Tunable; logged-friendly constant for easy discovery.\n */\nexport const MAX_ATOM_COMPLETIONS = 200;\n\n// ---- selector-language keyword/operator/snippet tables -------------------\n\n/**\n * Built-in atom/relation constants of the selector language. These are valid\n * selector references that are NOT user domain types, so they live here (and\n * are exempt from domain validation).\n */\nconst BUILTIN_VALUES: readonly string[] = [\n 'univ', // the universal set\n 'none', // the empty set\n 'iden', // the identity relation\n 'Int', // built-in integers\n];\n\n/**\n * Quantifier / multiplicity keywords usable inside selector expressions\n * (`all x : S | ...`, `some S`, `lone f`, `set ...`, etc.). Derived from the\n * Forge lexer's ALL/SOME/ONE/LONE/NO/SET/SUM/LET/DISJ tokens.\n */\nconst QUANTIFIER_KEYWORDS: readonly string[] = [\n 'all',\n 'some',\n 'no',\n 'one',\n 'lone',\n 'set',\n 'sum',\n 'let',\n 'disj',\n];\n\n/**\n * Word-form logical / comparison operators (Forge AND/OR/NOT/IN/IFF/IMP/ELSE\n * and the `not in` form). Symbolic operators are offered separately as\n * snippets so the popup can show a hint.\n */\nconst OPERATOR_KEYWORDS: readonly string[] = [\n 'in',\n 'and',\n 'or',\n 'not',\n 'implies',\n 'iff',\n 'else',\n];\n\n/**\n * Symbolic operators offered as snippets (insert the operator, show a hint).\n * Mirrors the highlighter's operator set: join/product/closure/union/etc.\n */\nconst OPERATOR_SNIPPETS: ReadonlyArray<{ insert: string; detail: string }> = [\n { insert: '.', detail: 'join' },\n { insert: '->', detail: 'product' },\n { insert: '+', detail: 'union' },\n { insert: '&', detail: 'intersection' },\n { insert: '-', detail: 'difference' },\n { insert: '~', detail: 'transpose' },\n { insert: '^', detail: 'transitive closure' },\n { insert: '*', detail: 'reflexive-transitive closure' },\n { insert: '#', detail: 'cardinality' },\n];\n\nlet cachedKeywordCompletions: Completion[] | undefined;\n\n/**\n * Selector-language keyword/operator/snippet completions. Independent of any\n * instance; cached after first build (the list is constant).\n */\nexport function getSelectorKeywordCompletions(): Completion[] {\n if (cachedKeywordCompletions) {\n // Return a copy so callers can freely sort/mutate their working list.\n return cachedKeywordCompletions.map((c) => ({ ...c }));\n }\n\n const out: Completion[] = [];\n\n for (const value of BUILTIN_VALUES) {\n out.push({ label: value, kind: 'keyword', detail: 'built-in' });\n }\n for (const kw of QUANTIFIER_KEYWORDS) {\n out.push({ label: kw, kind: 'keyword', detail: 'quantifier' });\n }\n for (const kw of OPERATOR_KEYWORDS) {\n out.push({ label: kw, kind: 'keyword', detail: 'operator' });\n }\n for (const op of OPERATOR_SNIPPETS) {\n out.push({\n label: op.insert,\n insertText: op.insert,\n kind: 'snippet',\n detail: op.detail,\n });\n }\n\n cachedKeywordCompletions = out;\n return out.map((c) => ({ ...c }));\n}\n\n// ---- domain completions --------------------------------------------------\n\n/**\n * Completions for the types, relations, and atoms in a `DomainSchema`. Atoms\n * are capped at `MAX_ATOM_COMPLETIONS` to keep the popup responsive on large\n * instances; the cap is applied across the whole schema (not per type).\n */\nexport function getDomainCompletions(domain: DomainSchema): Completion[] {\n const out: Completion[] = [];\n\n for (const type of domain.types) {\n out.push({\n label: type.name,\n kind: 'type',\n detail: 'type',\n });\n }\n\n for (const relation of domain.relations) {\n out.push({\n label: relation.name,\n kind: 'relation',\n detail:\n relation.arity !== undefined\n ? `relation · arity ${relation.arity}`\n : 'relation',\n });\n }\n\n // Atoms, capped. Iterate types in order and stop once the cap is reached so\n // the offered atoms are deterministic. Skip atoms whose name collides with a\n // type name (the type completion already covers it).\n const typeNames = new Set(domain.types.map((t) => t.name));\n const atomSeen = new Set<string>();\n let atomCount = 0;\n for (const type of domain.types) {\n if (atomCount >= MAX_ATOM_COMPLETIONS) {\n break;\n }\n for (const atom of type.atoms) {\n if (atomCount >= MAX_ATOM_COMPLETIONS) {\n break;\n }\n if (atomSeen.has(atom) || typeNames.has(atom)) {\n continue;\n }\n atomSeen.add(atom);\n out.push({ label: atom, kind: 'atom', detail: `atom · ${type.name}` });\n atomCount += 1;\n }\n }\n\n return out;\n}\n\n// ---- merged, prefix-filtered source --------------------------------------\n\n/** Rank: 0 = case-insensitive prefix match, 1 = substring match, 2 = no match. */\nfunction matchRank(label: string, prefix: string): number {\n if (prefix.length === 0) {\n return 0;\n }\n const haystack = label.toLowerCase();\n const needle = prefix.toLowerCase();\n if (haystack.startsWith(needle)) {\n return 0;\n }\n if (haystack.includes(needle)) {\n return 1;\n }\n return 2;\n}\n\n/**\n * Priority of a completion kind when two entries match equally well. Domain\n * entries (types/relations/atoms) sort before language keywords/snippets, per\n * the design (\"keywords after domain entries on equal match quality\").\n */\nfunction kindPriority(kind: Completion['kind']): number {\n switch (kind) {\n case 'type':\n return 0;\n case 'relation':\n return 1;\n case 'atom':\n return 2;\n case 'keyword':\n return 3;\n case 'snippet':\n return 4;\n default:\n return 5;\n }\n}\n\n/** Dedupe key for a completion: label + insertText (so `-` op vs `-` differ if needed). */\nfunction dedupeKey(c: Completion): string {\n return `${c.label}\u0000${c.insertText ?? c.label}`;\n}\n\n/**\n * Build the built-in completion source: a `(prefix) => Completion[]` that merges\n * domain completions (when a schema is present) with selector keywords, filters\n * by prefix (case-insensitive prefix match, then substring as a fallback),\n * dedupes, and orders domain entries before keywords on equal match quality.\n *\n * This is the function the UI layer calls; the WP4 integrator merges its result\n * with `assistant.complete()` output (see `mergeCompletions`).\n */\nexport function createBuiltinCompletionSource(\n domain?: DomainSchema,\n): (prefix: string) => Completion[] {\n // Pre-compute the unfiltered, deduped pool once per source so each keystroke\n // only filters + sorts.\n const pool: Completion[] = [];\n if (domain) {\n pool.push(...getDomainCompletions(domain));\n }\n pool.push(...getSelectorKeywordCompletions());\n\n const deduped = dedupeCompletions(pool);\n\n return (prefix: string): Completion[] => {\n const scored: Array<{ c: Completion; rank: number; idx: number }> = [];\n deduped.forEach((c, idx) => {\n const rank = matchRank(c.label, prefix);\n if (rank < 2) {\n scored.push({ c, rank, idx });\n }\n });\n\n scored.sort((a, b) => {\n if (a.rank !== b.rank) {\n return a.rank - b.rank;\n }\n const pa = kindPriority(a.c.kind);\n const pb = kindPriority(b.c.kind);\n if (pa !== pb) {\n return pa - pb;\n }\n // Stable-ish: shorter labels first, then original order.\n if (a.c.label.length !== b.c.label.length) {\n return a.c.label.length - b.c.label.length;\n }\n return a.idx - b.idx;\n });\n\n return scored.map((s) => s.c);\n };\n}\n\n/**\n * Merge and dedupe completion lists, preserving first-seen order. Useful for the\n * UI layer to fold `assistant.complete()` results into the built-in source's\n * output (assistant results passed first win on ties). Pure helper.\n */\nexport function mergeCompletions(\n ...lists: ReadonlyArray<readonly Completion[]>\n): Completion[] {\n const flat: Completion[] = [];\n for (const list of lists) {\n for (const c of list) {\n flat.push(c);\n }\n }\n return dedupeCompletions(flat);\n}\n\n/** Dedupe completions on (label, insertText), preserving first-seen order. */\nfunction dedupeCompletions(list: readonly Completion[]): Completion[] {\n const seen = new Set<string>();\n const out: Completion[] = [];\n for (const c of list) {\n const key = dedupeKey(c);\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n out.push(c);\n }\n return out;\n}\n","/**\n * Theme tokens for the Spytial spec editor (HOOK 1 in\n * `docs/SPEC_EDITOR_REDESIGN.md`).\n *\n * Every visual knob is a token. Tokens become `--spytial-ed-*` CSS custom\n * properties via {@link themeToCssVars}; `spec-editor.css` keys all colors,\n * fonts and sizes off those variables with fallbacks equal to {@link lightTheme},\n * so the editor is fully styled with no theme prop. A `theme` prop maps the\n * tokens onto inline custom properties on the editor root, overriding the\n * fallbacks.\n */\n\n/** Every visual knob is a token; tokens become `--spytial-ed-*` custom properties. */\nexport interface SpecEditorTheme {\n accent?: string;\n accentText?: string;\n surface?: string;\n surfaceRaised?: string;\n border?: string;\n text?: string;\n textMuted?: string;\n danger?: string;\n warning?: string;\n success?: string;\n fontFamily?: string;\n monoFontFamily?: string;\n /** base, rem/px */\n fontSize?: string;\n /** base unit */\n radius?: string;\n /** base unit */\n spacing?: string;\n // syntax tokens for selector/yaml highlighting\n synKeyword?: string;\n synType?: string;\n synRelation?: string;\n synOperator?: string;\n synString?: string;\n synComment?: string;\n}\n\n/**\n * Default light palette — \"drafting table\": warm paper surfaces, near-black\n * ink, and a single vermillion accent used the way a draftsman uses a red\n * pencil (focus, active states, the ✨ affordance). Section labels and\n * summaries lean on the mono stack, giving the editor the feel of a technical\n * instrument rather than a generic web form.\n *\n * These exact string values are the CSS fallbacks baked into `spec-editor.css`,\n * so changing one here means changing the matching `var(..., <fallback>)` there.\n */\nexport const lightTheme: Required<SpecEditorTheme> = {\n accent: '#b5431a',\n accentText: '#fdf6ec',\n surface: '#faf8f2',\n surfaceRaised: '#f1ecdf',\n border: '#d9d2c0',\n text: '#221d14',\n textMuted: '#6e6553',\n danger: '#a32014',\n warning: '#8a6200',\n success: '#2f6c43',\n fontFamily:\n \"'Avenir Next', 'Avenir', 'Seravek', 'Segoe UI Variable', 'Segoe UI', 'Trebuchet MS', sans-serif\",\n monoFontFamily:\n \"ui-monospace, 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace\",\n fontSize: '14px',\n radius: '2px',\n spacing: '8px',\n synKeyword: '#6d28a8',\n synType: '#0e6b6b',\n synRelation: '#1f4f9e',\n synOperator: '#b5431a',\n synString: '#7a5901',\n synComment: '#8a8170',\n};\n\n/**\n * Default dark palette — \"instrument panel\": deep blue-black slate with warm\n * chalk text and an oscilloscope-amber accent. Same token shape as\n * {@link lightTheme}; syntax colors are lifted for dark backgrounds.\n */\nexport const darkTheme: Required<SpecEditorTheme> = {\n accent: '#e08a3c',\n accentText: '#16100a',\n surface: '#12161e',\n surfaceRaised: '#1a202b',\n border: '#2d3645',\n text: '#e7e2d3',\n textMuted: '#94865f',\n danger: '#e06c5d',\n warning: '#d4a843',\n success: '#5fb98a',\n fontFamily:\n \"'Avenir Next', 'Avenir', 'Seravek', 'Segoe UI Variable', 'Segoe UI', 'Trebuchet MS', sans-serif\",\n monoFontFamily:\n \"ui-monospace, 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace\",\n fontSize: '14px',\n radius: '2px',\n spacing: '8px',\n synKeyword: '#b48ee0',\n synType: '#5fb3a1',\n synRelation: '#7ba3e8',\n synOperator: '#e08a3c',\n synString: '#cfa75e',\n synComment: '#6e7889',\n};\n\n/**\n * Maps theme token keys to their `--spytial-ed-*` custom-property names.\n *\n * camelCase tokens become kebab-case suffixes (`synKeyword` →\n * `--spytial-ed-syn-keyword`, `accentText` → `--spytial-ed-accent-text`).\n */\nconst TOKEN_TO_CSS_VAR: Record<keyof SpecEditorTheme, string> = {\n accent: '--spytial-ed-accent',\n accentText: '--spytial-ed-accent-text',\n surface: '--spytial-ed-surface',\n surfaceRaised: '--spytial-ed-surface-raised',\n border: '--spytial-ed-border',\n text: '--spytial-ed-text',\n textMuted: '--spytial-ed-text-muted',\n danger: '--spytial-ed-danger',\n warning: '--spytial-ed-warning',\n success: '--spytial-ed-success',\n fontFamily: '--spytial-ed-font-family',\n monoFontFamily: '--spytial-ed-mono-font-family',\n fontSize: '--spytial-ed-font-size',\n radius: '--spytial-ed-radius',\n spacing: '--spytial-ed-spacing',\n synKeyword: '--spytial-ed-syn-keyword',\n synType: '--spytial-ed-syn-type',\n synRelation: '--spytial-ed-syn-relation',\n synOperator: '--spytial-ed-syn-operator',\n synString: '--spytial-ed-syn-string',\n synComment: '--spytial-ed-syn-comment',\n};\n\n/**\n * Converts a (possibly partial) theme to a map of `--spytial-ed-*` custom\n * properties. Only tokens actually present on `theme` are emitted, so the rest\n * fall back to the values baked into `spec-editor.css`. The result is suitable\n * for spreading into a React `style` prop on the editor root.\n */\nexport function themeToCssVars(theme: SpecEditorTheme): Record<string, string> {\n const vars: Record<string, string> = {};\n (Object.keys(TOKEN_TO_CSS_VAR) as Array<keyof SpecEditorTheme>).forEach(\n (token) => {\n const value = theme[token];\n if (value !== undefined && value !== null) {\n vars[TOKEN_TO_CSS_VAR[token]] = value;\n }\n }\n );\n return vars;\n}\n\n// ─── Named theme registry (mirrors `webcola-cnd-graph`'s theme model) ──────\n\n/**\n * A theme input: either a token object, or the NAME of a registered theme —\n * the same convention as `webcola-cnd-graph`'s `theme` attribute, so hosts\n * that already theme the graph by name can theme the editor the same way.\n */\nexport type SpecEditorThemeInput = SpecEditorTheme | string;\n\n/**\n * Registry of named themes, seeded with the built-ins. Like\n * `webcola-cnd-graph`'s registry: hosts add their own with\n * {@link registerSpecEditorThemes} (reusing a built-in name overrides it).\n */\nconst themeRegistry = new Map<string, SpecEditorTheme>([\n ['light', lightTheme],\n ['dark', darkTheme],\n]);\n\n/**\n * Register one or more custom named themes (or override a built-in by reusing\n * its name). Module-level, so registration applies to every editor instance —\n * matching `WebColaCnDGraph.registerThemes` semantics.\n */\nexport function registerSpecEditorThemes(\n themes: Record<string, SpecEditorTheme>,\n): void {\n for (const [name, theme] of Object.entries(themes)) {\n themeRegistry.set(name, theme);\n }\n}\n\n/**\n * Resolves a theme input to a token object: objects pass through, names are\n * looked up in the registry. Unknown names and `undefined` resolve to\n * `undefined` — i.e. the CSS fallbacks, which ARE the light theme (the same\n * \"absence means light\" rule the graph uses).\n */\nexport function resolveSpecEditorTheme(\n input: SpecEditorThemeInput | undefined,\n): SpecEditorTheme | undefined {\n if (input === undefined) return undefined;\n if (typeof input === 'string') return themeRegistry.get(input);\n return input;\n}\n","/**\n * Tokenizer for CnD selector expressions, used by {@link SelectorField}'s\n * highlight overlay.\n *\n * CnD selectors are Alloy/Forge-relational expressions evaluated by\n * `simple-graph-query` (joins, set ops, quantifiers, the `univ`/`none`/`iden`\n * constants, etc.). The token classes mirror the old highlighter at\n * `src/components/NoCodeView/Selectors/SelectorInput.tsx` (`highlightSelector`)\n * and the keyword/operator set accepted by the Forge grammar bundled with\n * `simple-graph-query`.\n *\n * Tokens carry source offsets so the overlay can rebuild the exact text. The\n * tokenizer never drops characters: concatenating `tokens[i].text` reproduces\n * the input verbatim, which is what keeps the mirror overlay aligned with the\n * textarea. Rendering maps each {@link TokenKind} to a span class colored by a\n * `--spytial-ed-syn-*` variable; the overlay builds those spans via React, so\n * user text is never interpolated into `innerHTML`.\n */\n\nexport type TokenKind =\n | 'keyword'\n | 'operator'\n | 'string'\n | 'number'\n | 'identifier'\n | 'comment'\n | 'whitespace'\n | 'punctuation';\n\nexport interface Token {\n kind: TokenKind;\n text: string;\n /** inclusive start offset into the source string */\n start: number;\n /** exclusive end offset into the source string */\n end: number;\n}\n\n/**\n * Selector-language keywords (quantifiers, logical ops, relational constants).\n * Derived from the Forge grammar accepted by `simple-graph-query` plus the\n * wildcard/constant set the old highlighter recognised (`univ`/`none`/`iden`).\n */\nconst KEYWORDS = new Set<string>([\n // relational constants / wildcards\n 'univ',\n 'none',\n 'iden',\n // quantifiers + multiplicities\n 'all',\n 'some',\n 'no',\n 'one',\n 'lone',\n 'set',\n 'sum',\n 'let',\n 'disj',\n 'count',\n // logical connectives\n 'and',\n 'or',\n 'not',\n 'implies',\n 'else',\n 'in',\n]);\n\n/**\n * Multi-character operators, longest first so the matcher is greedy\n * (e.g. `->` before `-`, `<:`/`:>` before `<`/`>`/`:`).\n */\nconst MULTI_CHAR_OPERATORS = ['->', '<:', ':>', '<=', '>=', '=<', '=>', '!='];\n\n/** Single-character relational / set operators. */\nconst SINGLE_CHAR_OPERATORS = new Set<string>([\n '+',\n '-',\n '&',\n '~',\n '*',\n '^',\n '.',\n '<',\n '>',\n '=',\n '!',\n '#',\n]);\n\n/** Grouping punctuation, kept distinct so it can be styled neutrally. */\nconst PUNCTUATION = new Set<string>(['(', ')', '[', ']', '{', '}', ',', ':', ';']);\n\nconst IDENT_START = /[A-Za-z_$]/;\nconst IDENT_CONTINUE = /[A-Za-z0-9_$]/;\nconst DIGIT = /[0-9]/;\nconst WHITESPACE = /\\s/;\n\n/**\n * Tokenizes a CnD selector expression into a flat, gap-free token list.\n *\n * Guarantees:\n * - Concatenating `tokens[i].text` reproduces `input` exactly.\n * - Offsets are monotonic and non-overlapping (`tokens[i].end === tokens[i+1].start`).\n * - Never throws; unrecognised characters become single-char `punctuation`\n * tokens rather than being dropped.\n */\nexport function tokenizeSelector(input: string): Token[] {\n const tokens: Token[] = [];\n const n = input.length;\n let i = 0;\n\n const push = (kind: TokenKind, start: number, end: number): void => {\n tokens.push({ kind, text: input.slice(start, end), start, end });\n };\n\n while (i < n) {\n const ch = input[i];\n\n // Whitespace run.\n if (WHITESPACE.test(ch)) {\n const start = i;\n while (i < n && WHITESPACE.test(input[i])) i++;\n push('whitespace', start, i);\n continue;\n }\n\n // Line comment: `--` (Alloy) or `//`, to end of line.\n if (\n (ch === '-' && input[i + 1] === '-') ||\n (ch === '/' && input[i + 1] === '/')\n ) {\n const start = i;\n i += 2;\n while (i < n && input[i] !== '\\n') i++;\n push('comment', start, i);\n continue;\n }\n\n // String literal (single or double quoted). Honors backslash escapes;\n // an unterminated string runs to end-of-line so the rest of the line is\n // not mis-highlighted.\n if (ch === '\"' || ch === \"'\") {\n const quote = ch;\n const start = i;\n i++;\n while (i < n && input[i] !== quote && input[i] !== '\\n') {\n if (input[i] === '\\\\' && i + 1 < n) i += 2;\n else i++;\n }\n if (i < n && input[i] === quote) i++; // closing quote\n push('string', start, i);\n continue;\n }\n\n // Number (integer or decimal).\n if (DIGIT.test(ch)) {\n const start = i;\n while (i < n && DIGIT.test(input[i])) i++;\n if (i < n && input[i] === '.' && i + 1 < n && DIGIT.test(input[i + 1])) {\n i++; // dot\n while (i < n && DIGIT.test(input[i])) i++;\n }\n push('number', start, i);\n continue;\n }\n\n // Identifier or keyword.\n if (IDENT_START.test(ch)) {\n const start = i;\n i++;\n while (i < n && IDENT_CONTINUE.test(input[i])) i++;\n const word = input.slice(start, i);\n push(KEYWORDS.has(word) ? 'keyword' : 'identifier', start, i);\n continue;\n }\n\n // Multi-character operators (greedy, longest first).\n const two = input.slice(i, i + 2);\n if (MULTI_CHAR_OPERATORS.includes(two)) {\n push('operator', i, i + 2);\n i += 2;\n continue;\n }\n\n // Single-character operators.\n if (SINGLE_CHAR_OPERATORS.has(ch)) {\n push('operator', i, i + 1);\n i++;\n continue;\n }\n\n // Grouping punctuation and anything else: one char, never dropped.\n push('punctuation', i, i + 1);\n i++;\n }\n\n return tokens;\n}\n\n/**\n * Maps a token kind to the `spytial-ed-syn-*` span class used by the overlay.\n * Whitespace and neutral punctuation get no class (rendered as plain text).\n */\nexport function tokenClassName(kind: TokenKind): string | undefined {\n switch (kind) {\n case 'keyword':\n return 'spytial-ed-syn-keyword';\n case 'operator':\n return 'spytial-ed-syn-operator';\n case 'string':\n return 'spytial-ed-syn-string';\n case 'number':\n return 'spytial-ed-syn-number';\n case 'identifier':\n return 'spytial-ed-syn-identifier';\n case 'comment':\n return 'spytial-ed-syn-comment';\n case 'whitespace':\n case 'punctuation':\n default:\n return undefined;\n }\n}\n\n// Re-export the punctuation set as a predicate so callers (and tests) can\n// reason about which characters are treated as grouping symbols without\n// re-deriving the table.\n/** True if `ch` is treated as grouping punctuation by the tokenizer. */\nexport function isPunctuation(ch: string): boolean {\n return PUNCTUATION.has(ch);\n}\n","/**\n * Viewport-anchored popup positioning.\n *\n * The editor is embedded in host pages whose containers routinely clip\n * absolutely-positioned children (fixed-height sidebars with `overflow:\n * hidden`/`auto` — e.g. the demo pages' layout panel). Menus and listboxes\n * therefore use `position: fixed` with coordinates computed from the trigger's\n * bounding rect, so they render above any host clipping context.\n *\n * The hook flips the popup above the anchor when there is more room there than\n * below, constrains `maxHeight` to the available space, and recomputes on\n * window resize and on any ancestor scroll (capture-phase listener). Note:\n * `position: fixed` resolves against a transformed ancestor if one exists —\n * host pages with `transform` on a wrapping element would offset the popup —\n * but no demo or known integration does this; it's the standard trade-off of\n * non-portal fixed positioning.\n */\n\nimport { useLayoutEffect, useState } from 'react';\nimport type React from 'react';\n\nexport interface AnchoredPopupOptions {\n /**\n * Horizontal alignment relative to the anchor:\n * - `'start'`: popup's left edge aligns with the anchor's left edge,\n * - `'end'`: popup's right edge aligns with the anchor's right edge,\n * - `'stretch'`: popup spans exactly the anchor's width.\n */\n align?: 'start' | 'end' | 'stretch';\n /** gap in px between anchor and popup (default 2). */\n gap?: number;\n /**\n * Expected popup height in px, used only to decide whether to flip above\n * the anchor (default 280).\n */\n estimatedHeight?: number;\n}\n\n/**\n * Returns a `style` object (fixed positioning + maxHeight) for a popup\n * anchored to `anchorRef`, or `{}` while closed. Spread it onto the popup\n * element; the element's stylesheet rule should declare `position: fixed`.\n */\nexport function useAnchoredPopup(\n open: boolean,\n anchorRef: React.RefObject<HTMLElement | null>,\n options?: AnchoredPopupOptions,\n): React.CSSProperties {\n const { align = 'start', gap = 2, estimatedHeight = 280 } = options ?? {};\n const [style, setStyle] = useState<React.CSSProperties>({});\n\n useLayoutEffect(() => {\n if (!open) {\n setStyle({});\n return;\n }\n\n const compute = (): void => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n const rect = anchor.getBoundingClientRect();\n const viewportW =\n window.innerWidth || document.documentElement.clientWidth;\n const viewportH =\n window.innerHeight || document.documentElement.clientHeight;\n\n const spaceBelow = viewportH - rect.bottom - gap;\n const spaceAbove = rect.top - gap;\n const flipUp = spaceBelow < estimatedHeight && spaceAbove > spaceBelow;\n\n const next: React.CSSProperties = {\n // jsdom reports all-zero rects; the resulting 0-coordinates are inert\n // there (no layout), and real browsers always have a real rect.\n maxHeight: Math.max(120, (flipUp ? spaceAbove : spaceBelow) - 8),\n };\n\n if (flipUp) {\n next.bottom = viewportH - rect.top + gap;\n } else {\n next.top = rect.bottom + gap;\n }\n\n if (align === 'end') {\n next.right = Math.max(8, viewportW - rect.right);\n } else if (align === 'stretch') {\n next.left = rect.left;\n next.width = rect.width;\n } else {\n next.left = rect.left;\n }\n\n setStyle(next);\n };\n\n compute();\n window.addEventListener('resize', compute);\n // capture-phase so scrolls of ANY ancestor (host sidebars, the editor's\n // own scroll areas) reposition the popup rather than leaving it stranded.\n document.addEventListener('scroll', compute, true);\n return () => {\n window.removeEventListener('resize', compute);\n document.removeEventListener('scroll', compute, true);\n };\n }, [open, anchorRef, align, gap, estimatedHeight]);\n\n return style;\n}\n","/**\n * {@link SelectorField} — a controlled, single-expression CnD selector input\n * with syntax highlighting, ARIA-combobox autocomplete, an optional synthesis\n * (✨) affordance, and inline diagnostics.\n *\n * This component is intentionally domain-agnostic: it knows nothing about\n * `DomainSchema` or `SelectorAssistant`. Completion and synthesis are plain\n * props (`complete`, `synthesize`); WP4 composes the real sources (built-in\n * domain completions + the assistant hook) and passes them down.\n *\n * Highlighting uses the standard mirror-overlay technique: a `<pre aria-hidden>`\n * renders highlighted tokens behind a `<textarea>` whose own text is\n * transparent (but whose caret is visible). The two share identical font,\n * padding and box metrics, and the mirror's scroll position is synced to the\n * textarea on BOTH input and scroll — this is the fix for the scroll-desync bug\n * that got the old highlighter disabled.\n */\n\nimport React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { Completion } from '../domain/assistant';\nimport type { Diagnostic } from '../core/types';\nimport { tokenizeSelector, tokenClassName } from './highlight';\nimport { useAnchoredPopup } from './use-anchored-popup';\n\n/** Result shape of the synthesis hook. */\nexport interface SynthesisResult {\n value: string;\n explanation?: string;\n}\n\nexport interface SelectorFieldProps {\n /** controlled value */\n value: string;\n /** fired with the next value on every edit / accept */\n onChange(value: string): void;\n placeholder?: string;\n disabled?: boolean;\n /** accessible name; ignored if `aria-labelledby` is set */\n 'aria-label'?: string;\n /** id of an external label element */\n 'aria-labelledby'?: string;\n /** drives placeholder/help hint text only */\n selectorArity?: 'unary' | 'binary';\n /**\n * Completion source. Returns sync or async completions for the identifier\n * prefix at the caret. The component does not know where these come from.\n */\n complete?: (prefix: string) => Completion[] | Promise<Completion[]>;\n /**\n * Synthesis hook. When present a ✨ button appears; clicking opens an inline\n * popover that turns a natural-language request into a selector.\n */\n synthesize?: (request: string) => Promise<SynthesisResult>;\n /** field-scoped diagnostics (already filtered by the caller). */\n diagnostics?: Diagnostic[];\n /**\n * Render the syntax-highlight mirror overlay (default true). The escape\n * hatch for hosts where the overlay misaligns (exotic fonts/zoom): when\n * false the textarea renders its own visible text and no mirror exists.\n */\n highlight?: boolean;\n /** extra class on the root, for callers that need to hook styles. */\n className?: string;\n}\n\nconst COMPLETE_DEBOUNCE_MS = 150;\n\n/** Word characters that make up a selector identifier (for prefix extraction). */\nconst IDENT_CHAR = /[A-Za-z0-9_$]/;\n\n/** Highest diagnostic severity present, for the border/underline color. */\nfunction topSeverity(\n diagnostics: readonly Diagnostic[] | undefined\n): Diagnostic['severity'] | undefined {\n if (!diagnostics || diagnostics.length === 0) return undefined;\n if (diagnostics.some((d) => d.severity === 'error')) return 'error';\n if (diagnostics.some((d) => d.severity === 'warning')) return 'warning';\n return 'info';\n}\n\n/**\n * Finds the identifier prefix ending at `caret` and the offset where it starts.\n * Returns an empty prefix when the caret is not on a word.\n */\nfunction identifierPrefixAt(\n text: string,\n caret: number\n): { prefix: string; start: number } {\n let start = caret;\n while (start > 0 && IDENT_CHAR.test(text[start - 1])) start--;\n return { prefix: text.slice(start, caret), start };\n}\n\n/** Renders the highlighted mirror content as React spans (no innerHTML). */\nconst HighlightedMirror: React.FC<{ value: string }> = ({ value }) => {\n // A trailing newline must be padded so the mirror's last line keeps height,\n // matching textarea rendering.\n const tokens = useMemo(() => tokenizeSelector(value), [value]);\n return (\n <>\n {tokens.map((tok, idx) => {\n const cls = tokenClassName(tok.kind);\n return cls ? (\n <span key={idx} className={cls}>\n {tok.text}\n </span>\n ) : (\n <React.Fragment key={idx}>{tok.text}</React.Fragment>\n );\n })}\n {/* keep height when value ends in a newline */}\n {value.endsWith('\\n') ? '' : null}\n </>\n );\n};\n\nexport const SelectorField: React.FC<SelectorFieldProps> = ({\n value,\n onChange,\n placeholder,\n disabled = false,\n selectorArity,\n complete,\n synthesize,\n diagnostics,\n highlight = true,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const mirrorRef = useRef<HTMLPreElement | null>(null);\n\n const baseId = useId();\n const listboxId = `${baseId}-listbox`;\n const optionId = (i: number): string => `${baseId}-opt-${i}`;\n const diagId = `${baseId}-diag`;\n\n // ── Autocomplete state ────────────────────────────────────────────────\n const [open, setOpen] = useState(false);\n const [items, setItems] = useState<Completion[]>([]);\n const [active, setActive] = useState(0);\n // Token that increments per request so stale async responses can be dropped.\n const requestSeq = useRef(0);\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Offset where the current identifier prefix begins (for replace-on-accept).\n const prefixStart = useRef(0);\n\n // ── Synthesis popover state ───────────────────────────────────────────\n const [synOpen, setSynOpen] = useState(false);\n const [synRequest, setSynRequest] = useState('');\n const [synLoading, setSynLoading] = useState(false);\n const [synError, setSynError] = useState<string | null>(null);\n const [synResult, setSynResult] = useState<SynthesisResult | null>(null);\n const synInputRef = useRef<HTMLInputElement | null>(null);\n\n const severity = topSeverity(diagnostics);\n\n // Keep the mirror scrolled in lockstep with the textarea. Called on every\n // input AND on every scroll — the dual binding is the desync fix.\n const syncScroll = useCallback(() => {\n const ta = textareaRef.current;\n const mirror = mirrorRef.current;\n if (!ta || !mirror) return;\n mirror.scrollTop = ta.scrollTop;\n mirror.scrollLeft = ta.scrollLeft;\n }, []);\n\n // Auto-grow the textarea to fit its content (single-expression, grows down).\n //\n // Measurement safety: right at mount (e.g. a freshly added row that opens\n // expanded) the textarea can be measured before its container has laid out,\n // with a near-zero content width — the value/placeholder then wraps into a\n // 1-2px column and scrollHeight reports hundreds of px, which would stick as\n // a giant inline height. Two guards: an empty value never sets an inline\n // height at all (CSS min-height rules one line), and a degenerate width\n // defers the measurement to the next frame (bounded retries).\n const growRetries = useRef(0);\n const autoGrow = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n if (ta.value === '') {\n ta.style.height = '';\n growRetries.current = 0;\n return;\n }\n if (ta.clientWidth < 60) {\n if (growRetries.current < 10) {\n growRetries.current += 1;\n requestAnimationFrame(autoGrow);\n }\n return;\n }\n growRetries.current = 0;\n ta.style.height = 'auto';\n ta.style.height = `${ta.scrollHeight}px`;\n }, []);\n\n useEffect(() => {\n autoGrow();\n syncScroll();\n }, [value, autoGrow, syncScroll]);\n\n // ── Completion fetching (debounced, stale-drop, never-throw) ───────────\n const runComplete = useCallback(\n (text: string, caret: number) => {\n if (!complete) return;\n const { prefix, start } = identifierPrefixAt(text, caret);\n prefixStart.current = start;\n\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n const seq = ++requestSeq.current;\n debounceTimer.current = setTimeout(() => {\n let result: Completion[] | Promise<Completion[]>;\n try {\n result = complete(prefix);\n } catch {\n return; // never crash on a throwing source\n }\n Promise.resolve(result)\n .then((completions) => {\n // Drop stale responses.\n if (seq !== requestSeq.current) return;\n if (!completions || completions.length === 0) {\n setItems([]);\n setOpen(false);\n return;\n }\n setItems(completions);\n setActive(0);\n setOpen(true);\n })\n .catch(() => {\n // Never crash on a rejected promise; just leave the popup closed.\n if (seq !== requestSeq.current) return;\n setItems([]);\n setOpen(false);\n });\n }, COMPLETE_DEBOUNCE_MS);\n },\n [complete]\n );\n\n const closeAutocomplete = useCallback(() => {\n requestSeq.current++; // invalidate any in-flight response\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n setOpen(false);\n setItems([]);\n }, []);\n\n const acceptCompletion = useCallback(\n (item: Completion) => {\n const ta = textareaRef.current;\n const caret = ta ? ta.selectionStart : value.length;\n const insert = item.insertText ?? item.label;\n const next =\n value.slice(0, prefixStart.current) + insert + value.slice(caret);\n onChange(next);\n closeAutocomplete();\n // Restore caret just after the inserted text on the next frame.\n const nextCaret = prefixStart.current + insert.length;\n requestAnimationFrame(() => {\n const node = textareaRef.current;\n if (node) {\n node.focus();\n node.setSelectionRange(nextCaret, nextCaret);\n }\n });\n },\n [value, onChange, closeAutocomplete]\n );\n\n const handleInput = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const text = e.target.value;\n onChange(text);\n runComplete(text, e.target.selectionStart);\n },\n [onChange, runComplete]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Ctrl+Space (or Cmd+Space) explicitly requests completions.\n if (e.code === 'Space' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n const ta = textareaRef.current;\n if (ta) runComplete(ta.value, ta.selectionStart);\n return;\n }\n\n if (!open || items.length === 0) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setActive((a) => (a + 1) % items.length);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setActive((a) => (a - 1 + items.length) % items.length);\n break;\n case 'Enter':\n case 'Tab':\n e.preventDefault();\n acceptCompletion(items[active]);\n break;\n case 'Escape':\n e.preventDefault();\n closeAutocomplete();\n break;\n default:\n break;\n }\n },\n [open, items, active, acceptCompletion, closeAutocomplete, runComplete]\n );\n\n // Close the popup when focus leaves the field entirely.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n // If focus moves into our own listbox (e.g. mouse-down on an option),\n // don't close before the click registers.\n const next = e.relatedTarget as Node | null;\n if (next && mirrorRef.current?.parentElement?.contains(next)) return;\n closeAutocomplete();\n },\n [closeAutocomplete]\n );\n\n // ── Synthesis popover handlers ────────────────────────────────────────\n const openSynthesis = useCallback(() => {\n setSynOpen(true);\n setSynError(null);\n setSynResult(null);\n requestAnimationFrame(() => synInputRef.current?.focus());\n }, []);\n\n const closeSynthesis = useCallback(() => {\n setSynOpen(false);\n setSynLoading(false);\n setSynError(null);\n setSynResult(null);\n setSynRequest('');\n }, []);\n\n const runSynthesis = useCallback(async () => {\n if (!synthesize || synLoading) return;\n const request = synRequest.trim();\n if (!request) return;\n setSynLoading(true);\n setSynError(null);\n setSynResult(null);\n try {\n const result = await synthesize(request);\n setSynResult(result);\n } catch (err) {\n setSynError(\n err instanceof Error ? err.message : 'Synthesis failed. Try again.'\n );\n } finally {\n setSynLoading(false);\n }\n }, [synthesize, synLoading, synRequest]);\n\n const acceptSynthesis = useCallback(() => {\n if (!synResult) return;\n onChange(synResult.value);\n closeSynthesis();\n requestAnimationFrame(() => textareaRef.current?.focus());\n }, [synResult, onChange, closeSynthesis]);\n\n // Clean up timers on unmount.\n useEffect(\n () => () => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n },\n []\n );\n\n const hint =\n placeholder ??\n (selectorArity === 'binary'\n ? 'binary selector, e.g. parent'\n : selectorArity === 'unary'\n ? 'unary selector, e.g. Node'\n : 'selector expression');\n\n const describedBy = diagnostics && diagnostics.length > 0 ? diagId : undefined;\n\n // Viewport-fixed listbox position (spans the textarea's width, flips up when\n // cramped) so host containers with overflow clipping can't cut it off.\n const autocompleteStyle = useAnchoredPopup(open && items.length > 0, textareaRef, {\n align: 'stretch',\n estimatedHeight: 224,\n });\n\n return (\n <div\n className={`spytial-ed-selector${\n severity ? ` spytial-ed-selector--${severity}` : ''\n }${className ? ` ${className}` : ''}`}\n >\n <div\n className={`spytial-ed-selector-input-wrap${\n synthesize ? ' spytial-ed-selector-input-wrap--with-synth' : ''\n }`}\n >\n {/* Highlight mirror, behind the textarea (omitted when the host has\n disabled highlighting — the escape hatch for overlay misalignment). */}\n {highlight ? (\n <pre\n ref={mirrorRef}\n className=\"spytial-ed-selector-mirror\"\n aria-hidden=\"true\"\n >\n <HighlightedMirror value={value} />\n </pre>\n ) : null}\n\n {/*\n ARIA editable combobox (APG 1.2). The combobox role lives on the\n editable element itself, so it legitimately supports `aria-expanded`,\n `aria-autocomplete` and `aria-activedescendant`, and the accessible\n name comes from `aria-label`/`aria-labelledby`. A <textarea> is used\n (not <input>) so the field can grow vertically and wrap long lines.\n */}\n <textarea\n ref={textareaRef}\n className={`spytial-ed-selector-textarea${\n highlight ? '' : ' spytial-ed-selector-textarea--plain'\n }`}\n value={value}\n onChange={handleInput}\n onScroll={syncScroll}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n placeholder={hint}\n disabled={disabled}\n rows={1}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n wrap=\"soft\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && items.length > 0 ? optionId(active) : undefined\n }\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={describedBy}\n aria-invalid={severity === 'error' || undefined}\n />\n\n {synthesize ? (\n <button\n type=\"button\"\n className=\"spytial-ed-selector-synth-btn\"\n onClick={openSynthesis}\n disabled={disabled}\n aria-label=\"Generate selector from a description\"\n aria-haspopup=\"dialog\"\n aria-expanded={synOpen}\n title=\"Generate selector from a description\"\n >\n <span aria-hidden=\"true\">✨</span>\n </button>\n ) : null}\n\n {/* Autocomplete listbox. */}\n {open && items.length > 0 ? (\n <ul\n className=\"spytial-ed-autocomplete\"\n style={autocompleteStyle}\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Selector completions\"\n >\n {items.map((item, i) => (\n <li\n key={`${item.label}-${i}`}\n id={optionId(i)}\n role=\"option\"\n aria-selected={i === active}\n className={`spytial-ed-autocomplete-item${\n i === active ? ' spytial-ed-autocomplete-item--active' : ''\n }`}\n // mousedown (not click) so it fires before textarea blur.\n onMouseDown={(e) => {\n e.preventDefault();\n acceptCompletion(item);\n }}\n onMouseEnter={() => setActive(i)}\n >\n <span\n className={`spytial-ed-autocomplete-kind spytial-ed-kind-${item.kind}`}\n aria-hidden=\"true\"\n />\n <span className=\"spytial-ed-autocomplete-label\">\n {item.label}\n </span>\n {item.detail ? (\n <span className=\"spytial-ed-autocomplete-detail\">\n {item.detail}\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n\n {/* Synthesis popover. */}\n {synOpen ? (\n <div\n className=\"spytial-ed-synth-popover\"\n role=\"dialog\"\n aria-label=\"Generate selector\"\n >\n <div className=\"spytial-ed-synth-row\">\n <input\n ref={synInputRef}\n type=\"text\"\n className=\"spytial-ed-synth-input\"\n value={synRequest}\n placeholder=\"Describe the selector you want…\"\n disabled={synLoading}\n aria-label=\"Selector description\"\n onChange={(e) => setSynRequest(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void runSynthesis();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n closeSynthesis();\n }\n }}\n />\n <button\n type=\"button\"\n className=\"spytial-ed-synth-generate\"\n onClick={() => void runSynthesis()}\n disabled={synLoading || synRequest.trim().length === 0}\n >\n {synLoading ? 'Generating…' : 'Generate'}\n </button>\n </div>\n\n {synError ? (\n <div className=\"spytial-ed-synth-error\" role=\"alert\">\n {synError}\n </div>\n ) : null}\n\n {synResult ? (\n <div className=\"spytial-ed-synth-result\">\n <pre className=\"spytial-ed-synth-preview\" aria-label=\"Proposed selector\">\n <HighlightedMirror value={synResult.value} />\n </pre>\n {synResult.explanation ? (\n <p className=\"spytial-ed-synth-explanation\">\n {synResult.explanation}\n </p>\n ) : null}\n <div className=\"spytial-ed-synth-actions\">\n <button\n type=\"button\"\n className=\"spytial-ed-synth-accept\"\n onClick={acceptSynthesis}\n >\n Accept\n </button>\n <button\n type=\"button\"\n className=\"spytial-ed-synth-dismiss\"\n onClick={closeSynthesis}\n >\n Dismiss\n </button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n\n {/* Inline diagnostics. */}\n {diagnostics && diagnostics.length > 0 ? (\n <ul className=\"spytial-ed-diagnostics\" id={diagId}>\n {diagnostics.map((d, i) => (\n <li\n key={i}\n className={`spytial-ed-diagnostic spytial-ed-diagnostic--${d.severity}`}\n >\n <span\n className=\"spytial-ed-diagnostic-dot\"\n aria-hidden=\"true\"\n />\n <span className=\"spytial-ed-diagnostic-msg\">{d.message}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n};\n","/**\n * {@link FieldRenderer} — a generic, schema-driven form renderer for the spec\n * editor. Given a `FieldSpec[]`, a values map and an `onChange(key, value)`\n * callback, it renders one row per field, dispatching on {@link FieldKind}:\n *\n * - `selector` → {@link SelectorField}\n * - `relationName` /\n * `typeName` → combo box (text input + datalist of known names)\n * - `enum` → segmented pill buttons (multi-select pills when `multiple`)\n * - `number` → number input\n * - `color` → color swatch input\n * - `boolean` → switch\n * - `text` → text input\n *\n * The renderer is domain-agnostic. Domain names for `relationName`/`typeName`\n * combo boxes come from the `options` prop; per-field selector props (the\n * completion + synthesis sources) come from an optional `selectorProps`\n * callback that WP4 supplies. With neither, every field still renders and edits.\n */\n\nimport React, { useId } from 'react';\nimport type { Diagnostic, FieldSpec } from '../core/types';\nimport { SelectorField } from './SelectorField';\nimport type { SelectorFieldProps } from './SelectorField';\n\n/** Domain names available for the combo-box field kinds. */\nexport interface FieldRendererOptions {\n relationNames?: readonly string[];\n typeNames?: readonly string[];\n}\n\n/** Per-field selector wiring, forwarded into {@link SelectorField}. */\nexport type SelectorFieldExtras = Pick<\n SelectorFieldProps,\n 'complete' | 'synthesize' | 'highlight'\n>;\n\nexport interface FieldRendererProps {\n fields: readonly FieldSpec[];\n values: Record<string, unknown>;\n onChange(key: string, value: unknown): void;\n /** all diagnostics for the item; the renderer buckets them per field. */\n diagnostics?: readonly Diagnostic[];\n /** domain names for combo-box fields. */\n options?: FieldRendererOptions;\n /** optional per-field selector wiring (completion/synthesis). */\n selectorProps?: (field: FieldSpec) => SelectorFieldExtras | undefined;\n disabled?: boolean;\n className?: string;\n}\n\n/** Coerce an unknown stored value to a string for text-like inputs. */\nfunction asString(value: unknown): string {\n if (value === undefined || value === null) return '';\n return String(value);\n}\n\n/** Coerce an unknown stored value to an array of strings (multi-enum). */\nfunction asStringArray(value: unknown): string[] {\n if (Array.isArray(value)) return value.map((v) => String(v));\n if (value === undefined || value === null || value === '') return [];\n return [String(value)];\n}\n\n/** Whether a value is a plain object (a nested block). */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nconst fieldDiagnostics = (\n diagnostics: readonly Diagnostic[] | undefined,\n key: string\n): Diagnostic[] =>\n (diagnostics ?? []).filter((d) => d.fieldKey === key);\n\nconst topSeverity = (\n ds: readonly Diagnostic[]\n): Diagnostic['severity'] | undefined => {\n if (ds.length === 0) return undefined;\n if (ds.some((d) => d.severity === 'error')) return 'error';\n if (ds.some((d) => d.severity === 'warning')) return 'warning';\n return 'info';\n};\n\n/** Inline diagnostic list, shared by non-selector fields. */\nconst FieldDiagnostics: React.FC<{ diagnostics: Diagnostic[]; id: string }> = ({\n diagnostics,\n id,\n}) =>\n diagnostics.length > 0 ? (\n <ul className=\"spytial-ed-diagnostics\" id={id}>\n {diagnostics.map((d, i) => (\n <li\n key={i}\n className={`spytial-ed-diagnostic spytial-ed-diagnostic--${d.severity}`}\n >\n <span className=\"spytial-ed-diagnostic-dot\" aria-hidden=\"true\" />\n <span className=\"spytial-ed-diagnostic-msg\">{d.message}</span>\n </li>\n ))}\n </ul>\n ) : null;\n\nexport const FieldRenderer: React.FC<FieldRendererProps> = ({\n fields,\n values,\n onChange,\n diagnostics,\n options,\n selectorProps,\n disabled = false,\n className,\n}) => {\n const groupId = useId();\n\n return (\n <div className={`spytial-ed-fields${className ? ` ${className}` : ''}`}>\n {fields.map((field) => {\n // Nested blocks render as their own sub-fieldset (or an \"add\" chip),\n // outside the standard label+control row.\n if (field.kind === 'group') {\n return (\n <GroupField\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={onChange}\n options={options}\n selectorProps={selectorProps}\n diagnostics={diagnostics}\n disabled={disabled}\n />\n );\n }\n const fieldId = `${groupId}-${field.key}`;\n const labelId = `${fieldId}-label`;\n const diagId = `${fieldId}-diag`;\n const ds = fieldDiagnostics(diagnostics, field.key);\n const severity = topSeverity(ds);\n const value = values[field.key];\n\n return (\n <div\n key={field.key}\n className={`spytial-ed-field spytial-ed-field--${field.kind}${\n severity ? ` spytial-ed-field--${severity}` : ''\n }`}\n >\n <label\n id={labelId}\n htmlFor={field.kind === 'selector' ? undefined : fieldId}\n className=\"spytial-ed-field-label\"\n title={field.help}\n >\n {field.label}\n {field.required ? (\n <span\n className=\"spytial-ed-field-required\"\n aria-hidden=\"true\"\n title=\"required\"\n >\n {' '}\n *\n </span>\n ) : null}\n </label>\n\n <div className=\"spytial-ed-field-control\">\n {renderControl(field, value, {\n fieldId,\n labelId,\n diagId,\n hasDiagnostics: ds.length > 0,\n disabled,\n onChange,\n options,\n selectorProps,\n diagnostics: ds,\n })}\n\n {/* Selector renders its own diagnostics inline; others here. */}\n {field.kind === 'selector' ? null : (\n <FieldDiagnostics diagnostics={ds} id={diagId} />\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\n/**\n * A `group` field — a nested style block (lineStyle / textStyle / …). When the\n * block is absent and optional, renders a progressive-disclosure \"+ Label\" chip;\n * when present, a labeled sub-fieldset of the block's children (recursing through\n * {@link FieldRenderer}) with a remove control. Children are kept sparse: a\n * cleared leaf is dropped, and an emptied block is removed on emit by the codec.\n */\nfunction GroupField({\n field,\n value,\n onChange,\n options,\n selectorProps,\n diagnostics,\n disabled,\n}: {\n field: FieldSpec;\n value: unknown;\n onChange: (key: string, value: unknown) => void;\n options?: FieldRendererOptions;\n selectorProps?: (field: FieldSpec) => SelectorFieldExtras | undefined;\n diagnostics?: readonly Diagnostic[];\n disabled: boolean;\n}): React.ReactElement {\n const groupValue = isRecord(value) ? value : undefined;\n const removable = !field.required;\n\n if (groupValue === undefined) {\n return (\n <button\n type=\"button\"\n className=\"spytial-ed-group-add\"\n onClick={() => onChange(field.key, {})}\n disabled={disabled}\n title={field.help}\n >\n + {field.label}\n </button>\n );\n }\n\n const setChild = (childKey: string, childVal: unknown) => {\n const next: Record<string, unknown> = { ...groupValue };\n const empty =\n childVal === undefined ||\n childVal === '' ||\n (Array.isArray(childVal) && childVal.length === 0);\n if (empty) delete next[childKey];\n else next[childKey] = childVal;\n onChange(field.key, next);\n };\n\n return (\n <fieldset className=\"spytial-ed-group\">\n <legend className=\"spytial-ed-group-legend\">\n <span>{field.label}</span>\n {removable ? (\n <button\n type=\"button\"\n className=\"spytial-ed-group-remove\"\n onClick={() => onChange(field.key, undefined)}\n disabled={disabled}\n aria-label={`Remove ${field.label}`}\n title={`Remove ${field.label}`}\n >\n ×\n </button>\n ) : null}\n </legend>\n <FieldRenderer\n fields={field.children ?? []}\n values={groupValue}\n onChange={setChild}\n options={options}\n selectorProps={selectorProps}\n diagnostics={diagnostics}\n disabled={disabled}\n />\n </fieldset>\n );\n}\n\ninterface ControlCtx {\n fieldId: string;\n labelId: string;\n diagId: string;\n hasDiagnostics: boolean;\n disabled: boolean;\n onChange: (key: string, value: unknown) => void;\n options?: FieldRendererOptions;\n selectorProps?: (field: FieldSpec) => SelectorFieldExtras | undefined;\n diagnostics: Diagnostic[];\n}\n\nfunction renderControl(\n field: FieldSpec,\n value: unknown,\n ctx: ControlCtx\n): React.ReactNode {\n const {\n fieldId,\n labelId,\n diagId,\n hasDiagnostics,\n disabled,\n onChange,\n options,\n selectorProps,\n diagnostics,\n } = ctx;\n const describedBy = hasDiagnostics ? diagId : undefined;\n\n switch (field.kind) {\n case 'selector': {\n const extras = selectorProps?.(field) ?? {};\n return (\n <SelectorField\n value={asString(value)}\n onChange={(v) => onChange(field.key, v)}\n placeholder={field.placeholder}\n disabled={disabled}\n selectorArity={field.selectorArity}\n aria-labelledby={labelId}\n diagnostics={diagnostics}\n complete={extras.complete}\n synthesize={extras.synthesize}\n highlight={extras.highlight}\n />\n );\n }\n\n case 'relationName':\n case 'typeName': {\n const names =\n field.kind === 'relationName'\n ? options?.relationNames\n : options?.typeNames;\n const listId = `${fieldId}-list`;\n const hasOptions = !!names && names.length > 0;\n return (\n <>\n <input\n id={fieldId}\n type=\"text\"\n className=\"spytial-ed-input spytial-ed-combo\"\n value={asString(value)}\n placeholder={field.placeholder}\n disabled={disabled}\n list={hasOptions ? listId : undefined}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n aria-describedby={describedBy}\n aria-invalid={\n diagnostics.some((d) => d.severity === 'error') || undefined\n }\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n {hasOptions ? (\n <datalist id={listId}>\n {names!.map((n) => (\n <option key={n} value={n} />\n ))}\n </datalist>\n ) : null}\n </>\n );\n }\n\n case 'enum': {\n const opts = field.options ?? [];\n if (field.multiple) {\n const selected = asStringArray(value);\n return (\n <div\n className=\"spytial-ed-pills\"\n role=\"group\"\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n >\n {opts.map((opt) => {\n const isOn = selected.includes(opt);\n return (\n <button\n key={opt}\n type=\"button\"\n className={`spytial-ed-pill${\n isOn ? ' spytial-ed-pill--active' : ''\n }`}\n aria-pressed={isOn}\n disabled={disabled}\n onClick={() => {\n const next = isOn\n ? selected.filter((s) => s !== opt)\n : [...selected, opt];\n onChange(field.key, next);\n }}\n >\n {opt}\n </button>\n );\n })}\n </div>\n );\n }\n // single-select segmented control\n const current = asString(value);\n return (\n <div\n className=\"spytial-ed-pills\"\n role=\"radiogroup\"\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n >\n {opts.map((opt) => {\n const isOn = current === opt;\n return (\n <button\n key={opt}\n type=\"button\"\n className={`spytial-ed-pill${\n isOn ? ' spytial-ed-pill--active' : ''\n }`}\n role=\"radio\"\n aria-checked={isOn}\n disabled={disabled}\n onClick={() => onChange(field.key, opt)}\n >\n {opt}\n </button>\n );\n })}\n </div>\n );\n }\n\n case 'number': {\n const raw = value;\n const display =\n raw === undefined || raw === null || raw === '' ? '' : String(raw);\n return (\n <input\n id={fieldId}\n type=\"number\"\n className=\"spytial-ed-input spytial-ed-input--number\"\n value={display}\n placeholder={field.placeholder}\n disabled={disabled}\n aria-describedby={describedBy}\n aria-invalid={\n diagnostics.some((d) => d.severity === 'error') || undefined\n }\n onChange={(e) => {\n const v = e.target.value;\n // Emit a number when parseable, empty string when cleared.\n onChange(field.key, v === '' ? '' : Number(v));\n }}\n />\n );\n }\n\n case 'color': {\n const colorVal = asString(value) || '#000000';\n return (\n <div className=\"spytial-ed-color\">\n <input\n id={fieldId}\n type=\"color\"\n className=\"spytial-ed-color-swatch\"\n value={normalizeColor(colorVal)}\n disabled={disabled}\n aria-describedby={describedBy}\n aria-label={`${field.label} color`}\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n <input\n type=\"text\"\n className=\"spytial-ed-input spytial-ed-color-text\"\n value={asString(value)}\n placeholder={field.placeholder ?? '#rrggbb'}\n disabled={disabled}\n spellCheck={false}\n aria-label={`${field.label} hex value`}\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n </div>\n );\n }\n\n case 'boolean': {\n const checked = value === true || value === 'true';\n return (\n <button\n id={fieldId}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-describedby={describedBy}\n className={`spytial-ed-switch${\n checked ? ' spytial-ed-switch--on' : ''\n }`}\n disabled={disabled}\n onClick={() => onChange(field.key, !checked)}\n >\n <span className=\"spytial-ed-switch-thumb\" aria-hidden=\"true\" />\n </button>\n );\n }\n\n case 'text':\n default:\n return (\n <input\n id={fieldId}\n type=\"text\"\n className=\"spytial-ed-input\"\n value={asString(value)}\n placeholder={field.placeholder}\n disabled={disabled}\n aria-describedby={describedBy}\n aria-invalid={\n diagnostics.some((d) => d.severity === 'error') || undefined\n }\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n );\n }\n}\n\n/** Native `<input type=color>` only accepts `#rrggbb`; coerce best-effort. */\nfunction normalizeColor(value: string): string {\n const v = value.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(v)) return v;\n if (/^#[0-9a-fA-F]{3}$/.test(v)) {\n return `#${v[1]}${v[1]}${v[2]}${v[2]}${v[3]}${v[3]}`;\n }\n return '#000000';\n}\n","/**\n * {@link CodeView} — the raw-YAML editing surface of the spec editor.\n *\n * A CodeMirror 6 editor (not a textarea): CodeMirror owns the text rendering, so\n * syntax highlighting is real (no transparent-text mirror to keep in sync) and\n * diagnostics are drawn as IDE-style squiggly underlines you can hover to read.\n * The value is controlled by {@link SpecEditor}: typing fires `onChange(text)`\n * immediately, and the parent attempts a debounced parse. A parse error never\n * clobbers the model — the parent keeps the last good state and passes the\n * diagnostics down here as {@link PositionedDiagnostic}s (already resolved to\n * character ranges by `positionDiagnostics`), which we hand to `@codemirror/lint`.\n *\n * Highlighting uses `@codemirror/lang-yaml` themed through the same\n * `--spytial-ed-syn-*` CSS variables the rest of the editor uses, so it tracks\n * light/dark automatically. A persistent diagnostics list is kept below the\n * editor for accessibility and for any diagnostic that couldn't be positioned.\n */\n\nimport React, { useEffect, useId, useMemo, useRef } from 'react';\nimport { EditorState, Compartment } from '@codemirror/state';\nimport { EditorView, keymap, lineNumbers } from '@codemirror/view';\nimport { defaultKeymap, history, historyKeymap } from '@codemirror/commands';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { yaml } from '@codemirror/lang-yaml';\nimport { lintGutter, setDiagnostics, type Diagnostic as CmDiagnostic } from '@codemirror/lint';\nimport { tags as t } from '@lezer/highlight';\nimport type { Diagnostic } from '../core/types';\nimport type { PositionedDiagnostic } from '../core/code-positioning';\n\nexport interface CodeViewProps {\n /** controlled YAML text */\n value: string;\n /** fired with the next text on every edit */\n onChange(value: string): void;\n /**\n * Diagnostics for the current text, pre-resolved to character ranges. Those\n * with a range become editor squiggles; all appear in the list below.\n */\n diagnostics?: readonly PositionedDiagnostic[];\n /**\n * True when the text differs from the applied model (a parse error is keeping\n * the model on its last good state). Drives the \"unapplied edits\" notice.\n */\n hasUnappliedEdits?: boolean;\n /** render a line-number gutter (default true). */\n showLineNumbers?: boolean;\n /** syntax-highlight the YAML (default true). */\n syntaxHighlighting?: boolean;\n disabled?: boolean;\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Stable severity ranking for sorting the diagnostics list (errors first). */\nconst SEVERITY_ORDER: Record<Diagnostic['severity'], number> = {\n error: 0,\n warning: 1,\n info: 2,\n};\n\n/**\n * YAML token colors, mapped onto the editor's `--spytial-ed-syn-*` variables so\n * the highlight tracks the active (light/dark) theme. Keys carry the \"keyword\"\n * color, matching the old hand-rolled tokenizer's palette.\n */\nconst yamlHighlightStyle = HighlightStyle.define([\n { tag: t.comment, color: 'var(--spytial-ed-syn-comment, #8a8170)', fontStyle: 'italic' },\n { tag: [t.string, t.special(t.string)], color: 'var(--spytial-ed-syn-string, #7a5901)' },\n { tag: [t.number, t.bool, t.null], color: 'var(--spytial-ed-syn-number, #7a5901)' },\n {\n tag: [t.propertyName, t.definition(t.propertyName), t.keyword, t.atom],\n color: 'var(--spytial-ed-syn-keyword, #6d28a8)',\n },\n { tag: [t.punctuation, t.separator], color: 'var(--spytial-ed-text-muted, #6e6553)' },\n]);\n\n/** Editor chrome themed through the shared spec-editor CSS variables. */\nconst editorTheme = EditorView.theme({\n '&': {\n fontSize: '0.85em',\n color: 'var(--spytial-ed-text, #221d14)',\n backgroundColor: 'var(--spytial-ed-surface, #faf8f2)',\n border: '1px solid var(--spytial-ed-border, #d9d2c0)',\n borderRadius: 'var(--spytial-ed-radius, 2px)',\n minHeight: '12rem',\n },\n '&.cm-focused': { outline: '2px solid var(--spytial-ed-accent, #b5431a)', outlineOffset: '-1px' },\n '.cm-scroller': {\n fontFamily: 'var(--spytial-ed-mono-font-family, ui-monospace, monospace)',\n lineHeight: '1.5',\n overflow: 'auto',\n },\n '.cm-content': { padding: '0.5em 0', caretColor: 'var(--spytial-ed-accent, #b5431a)' },\n '.cm-cursor, .cm-dropCursor': { borderLeftColor: 'var(--spytial-ed-accent, #b5431a)' },\n '.cm-gutters': {\n backgroundColor: 'var(--spytial-ed-surface-raised, #f1ecdf)',\n color: 'var(--spytial-ed-text-muted, #6e6553)',\n border: 'none',\n borderInlineEnd: '1px solid var(--spytial-ed-border, #d9d2c0)',\n },\n '.cm-lineNumbers .cm-gutterElement': { padding: '0 0.5em 0 0.6em' },\n '&.cm-editor .cm-selectionBackground, & .cm-selectionBackground, & .cm-content ::selection': {\n backgroundColor: 'color-mix(in srgb, var(--spytial-ed-accent, #b5431a) 22%, transparent)',\n },\n '.cm-tooltip': {\n border: '1px solid var(--spytial-ed-border, #d9d2c0)',\n backgroundColor: 'var(--spytial-ed-surface-raised, #f1ecdf)',\n color: 'var(--spytial-ed-text, #221d14)',\n borderRadius: 'var(--spytial-ed-radius, 2px)',\n fontSize: '0.85em',\n },\n});\n\n/** Map our severity onto CodeMirror's (identical vocabulary for these three). */\nfunction cmSeverity(s: Diagnostic['severity']): CmDiagnostic['severity'] {\n return s; // 'error' | 'warning' | 'info' all exist in CodeMirror's union\n}\n\n/** Positioned diagnostics → CodeMirror lint diagnostics (only the ranged ones). */\nfunction toCmDiagnostics(\n diagnostics: readonly PositionedDiagnostic[] | undefined,\n docLength: number,\n): CmDiagnostic[] {\n if (!diagnostics) return [];\n const out: CmDiagnostic[] = [];\n for (const d of diagnostics) {\n if (d.from === undefined || d.to === undefined) continue;\n const from = Math.max(0, Math.min(d.from, docLength));\n const to = Math.max(from, Math.min(d.to, docLength));\n out.push({\n from,\n to,\n severity: cmSeverity(d.severity),\n message: d.message,\n // `code` (e.g. 'deprecated') surfaces as the source label in the tooltip.\n source: d.code,\n });\n }\n // CodeMirror expects diagnostics sorted by `from`.\n out.sort((a, b) => a.from - b.from);\n return out;\n}\n\nexport const CodeView: React.FC<CodeViewProps> = ({\n value,\n onChange,\n diagnostics,\n hasUnappliedEdits = false,\n showLineNumbers = true,\n syntaxHighlighting: highlight = true,\n disabled = false,\n 'aria-label': ariaLabel = 'Layout specification YAML',\n className,\n}) => {\n const hostRef = useRef<HTMLDivElement | null>(null);\n const viewRef = useRef<EditorView | null>(null);\n // Always-current callback, so the persistent editor never calls a stale one.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n // Reconfigurable editable/read-only state (driven by `disabled`).\n const editableRef = useRef(new Compartment());\n const baseId = useId();\n const diagId = `${baseId}-diag`;\n\n // Create the editor once; subsequent prop changes are pushed via the effects\n // below (the EditorView persists across React renders).\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const extensions = [\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n ...(showLineNumbers ? [lineNumbers()] : []),\n ...(highlight ? [yaml(), syntaxHighlighting(yamlHighlightStyle)] : []),\n lintGutter(),\n editorTheme,\n editableRef.current.of([\n EditorView.editable.of(!disabled),\n EditorState.readOnly.of(disabled),\n ]),\n EditorView.contentAttributes.of({ 'aria-label': ariaLabel, 'aria-describedby': diagId }),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onChangeRef.current(update.state.doc.toString());\n }\n }),\n ];\n\n const view = new EditorView({\n state: EditorState.create({ doc: value, extensions }),\n parent: host,\n });\n viewRef.current = view;\n\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // Mount once. `value`/`diagnostics`/`disabled` are synced by the effects\n // below; the other inputs are construction-time options.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Push external value changes into the editor (guarding the typing feedback\n // loop: when the user types, onChange updates `value`, which arrives here\n // already equal to the doc, so no transaction is dispatched).\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n const current = view.state.doc.toString();\n if (current !== value) {\n view.dispatch({ changes: { from: 0, to: current.length, insert: value } });\n }\n }, [value]);\n\n // Push diagnostics into the lint layer (squiggles + hover tooltips).\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch(setDiagnostics(view.state, toCmDiagnostics(diagnostics, view.state.doc.length)));\n }, [diagnostics]);\n\n // Reconfigure editable / read-only when `disabled` changes.\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: editableRef.current.reconfigure([\n EditorView.editable.of(!disabled),\n EditorState.readOnly.of(disabled),\n ]),\n });\n }, [disabled]);\n\n const sorted = useMemo(() => {\n if (!diagnostics || diagnostics.length === 0) return [];\n return [...diagnostics].sort((a, b) => {\n const sev = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];\n if (sev !== 0) return sev;\n return (a.line ?? Infinity) - (b.line ?? Infinity);\n });\n }, [diagnostics]);\n\n return (\n <div className={`spytial-ed-code${className ? ` ${className}` : ''}`}>\n {hasUnappliedEdits ? (\n <div className=\"spytial-ed-code-notice\" role=\"status\">\n Text has unapplied edits — fix the error below to update the builder.\n </div>\n ) : null}\n\n <div\n ref={hostRef}\n className={`spytial-ed-code-cm${disabled ? ' spytial-ed-code-cm--disabled' : ''}`}\n />\n\n {sorted.length > 0 ? (\n <ul className=\"spytial-ed-code-diagnostics\" id={diagId}>\n {sorted.map((d, i) => (\n <li\n key={i}\n className={`spytial-ed-diagnostic spytial-ed-diagnostic--${d.severity}`}\n >\n <span className=\"spytial-ed-diagnostic-dot\" aria-hidden=\"true\" />\n {d.line !== undefined ? (\n <span className=\"spytial-ed-code-diagnostic-loc\">\n {d.column !== undefined\n ? `Ln ${d.line}, Col ${d.column}`\n : `Ln ${d.line}`}\n </span>\n ) : null}\n <span className=\"spytial-ed-diagnostic-msg\">{d.message}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n};\n","/**\n * {@link BuilderView} — the compact, schema-driven row list of the spec editor.\n *\n * Each constraint/directive is a single compact row: a kind badge, the type\n * label, a live `summary(params)`, a diagnostic dot when the item has issues,\n * and an overflow menu (duplicate · delete · move up/down · add comment).\n * Clicking a row expands it inline (accordion: exactly one open at a time, Esc\n * collapses) into the generated form rendered by {@link FieldRenderer} from the\n * registry definition, plus a \"negate\" toggle for types that support `hold` and\n * a free-text comment input.\n *\n * \"Add constraint\" / \"Add directive\" buttons open searchable menus built from\n * the registry (deprecated types hidden). Reordering is keyboard-accessible via\n * the overflow menu's move up/down items.\n *\n * Unknown-type items (those carrying `SpecItem.raw`) render as a read-only row\n * labelled with their YAML key and a \"preserved as written\" note — they survive\n * round-trips untouched.\n *\n * This component is domain-blind about completion/synthesis: the parent passes a\n * `selectorProps(item, field)` callback that composes the real sources.\n */\n\nimport React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n Diagnostic,\n FieldSpec,\n ItemKind,\n SpecItem,\n} from '../core/types';\nimport {\n getDefinition,\n getDefinitions,\n} from '../core/registry';\nimport { FieldRenderer } from './FieldRenderer';\nimport type {\n FieldRendererOptions,\n SelectorFieldExtras,\n} from './FieldRenderer';\nimport { useAnchoredPopup } from './use-anchored-popup';\n\n/** Types that round-trip a `hold: never` negation toggle. */\nconst NEGATABLE_TYPES: ReadonlySet<string> = new Set([\n 'orientation',\n 'cyclic',\n 'align',\n 'groupselector',\n 'groupfield',\n]);\n\nexport interface BuilderViewProps {\n constraints: readonly SpecItem[];\n directives: readonly SpecItem[];\n /** all diagnostics; the view buckets them per item/field. */\n diagnostics?: readonly Diagnostic[];\n /** domain names for combo-box fields. */\n options?: FieldRendererOptions;\n /** per (item, field) selector wiring (completion/synthesis). */\n selectorProps?: (item: SpecItem, field: FieldSpec) => SelectorFieldExtras | undefined;\n /**\n * Add an item. Return the created {@link SpecItem} and the builder\n * auto-expands its row (a fresh constraint/directive opens ready to edit,\n * not minimized); return nothing and the row starts collapsed.\n */\n onAddItem(kind: ItemKind, type: string): SpecItem | void;\n onUpdateParam(id: string, key: string, value: unknown): void;\n onUpdateComment(id: string, comment: string): void;\n /** toggle the `hold: never` negation for a negatable item. */\n onToggleNegate(id: string, negated: boolean): void;\n onDuplicate(id: string): void;\n onRemove(id: string): void;\n onMove(id: string, direction: -1 | 1): void;\n disabled?: boolean;\n className?: string;\n}\n\nexport const BuilderView: React.FC<BuilderViewProps> = ({\n constraints,\n directives,\n diagnostics,\n options,\n selectorProps,\n onAddItem,\n onUpdateParam,\n onUpdateComment,\n onToggleNegate,\n onDuplicate,\n onRemove,\n onMove,\n disabled = false,\n className,\n}) => {\n // Exactly one expanded row at a time (accordion).\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n const toggleExpand = useCallback((id: string) => {\n setExpandedId((cur) => (cur === id ? null : id));\n }, []);\n\n // Collapse the currently expanded row. The id arg lets callers reason about\n // which row collapsed (focus return is handled in the Row itself).\n const collapse = useCallback((_id?: string) => setExpandedId(null), []);\n\n // Adding opens the new row's form immediately (not minimized): the parent\n // returns the created item and we expand it.\n const handleAddItem = useCallback(\n (kind: ItemKind, type: string) => {\n const created = onAddItem(kind, type);\n if (created && typeof created === 'object' && 'id' in created) {\n setExpandedId(created.id);\n }\n return created;\n },\n [onAddItem],\n );\n\n const empty = constraints.length === 0 && directives.length === 0;\n\n return (\n <div className={`spytial-ed-builder${className ? ` ${className}` : ''}`}>\n <Section\n title=\"Constraints\"\n kind=\"constraint\"\n items={constraints}\n diagnostics={diagnostics}\n options={options}\n selectorProps={selectorProps}\n expandedId={expandedId}\n onToggleExpand={toggleExpand}\n onCollapse={collapse}\n onAddItem={handleAddItem}\n onUpdateParam={onUpdateParam}\n onUpdateComment={onUpdateComment}\n onToggleNegate={onToggleNegate}\n onDuplicate={onDuplicate}\n onRemove={onRemove}\n onMove={onMove}\n disabled={disabled}\n />\n\n <Section\n title=\"Directives\"\n kind=\"directive\"\n items={directives}\n diagnostics={diagnostics}\n options={options}\n selectorProps={selectorProps}\n expandedId={expandedId}\n onToggleExpand={toggleExpand}\n onCollapse={collapse}\n onAddItem={handleAddItem}\n onUpdateParam={onUpdateParam}\n onUpdateComment={onUpdateComment}\n onToggleNegate={onToggleNegate}\n onDuplicate={onDuplicate}\n onRemove={onRemove}\n onMove={onMove}\n disabled={disabled}\n />\n\n {empty ? (\n <p className=\"spytial-ed-builder-empty\">\n No constraints or directives yet — add one to start shaping the layout.\n </p>\n ) : null}\n </div>\n );\n};\n\n// ---- section (constraints / directives) ----------------------------------\n\ninterface SectionProps {\n title: string;\n kind: ItemKind;\n items: readonly SpecItem[];\n diagnostics?: readonly Diagnostic[];\n options?: FieldRendererOptions;\n selectorProps?: (item: SpecItem, field: FieldSpec) => SelectorFieldExtras | undefined;\n expandedId: string | null;\n onToggleExpand(id: string): void;\n onCollapse(id?: string): void;\n onAddItem(kind: ItemKind, type: string): void;\n onUpdateParam(id: string, key: string, value: unknown): void;\n onUpdateComment(id: string, comment: string): void;\n onToggleNegate(id: string, negated: boolean): void;\n onDuplicate(id: string): void;\n onRemove(id: string): void;\n onMove(id: string, direction: -1 | 1): void;\n disabled: boolean;\n}\n\nconst Section: React.FC<SectionProps> = ({\n title,\n kind,\n items,\n diagnostics,\n options,\n selectorProps,\n expandedId,\n onToggleExpand,\n onCollapse,\n onAddItem,\n onUpdateParam,\n onUpdateComment,\n onToggleNegate,\n onDuplicate,\n onRemove,\n onMove,\n disabled,\n}) => {\n const listLabel = `${title} List`;\n\n // Focus management (APG accordion): keep a live map of each row's toggle\n // button plus a ref to the \"Add\" button, so after deleting a row we can land\n // focus on a sensible neighbour instead of dropping it to <body>.\n const toggleRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n const addBtnRef = useRef<HTMLButtonElement | null>(null);\n // Set to the id of the toggle to focus once the post-delete re-render lands;\n // `'__add__'` is a sentinel meaning \"focus the Add button\".\n const pendingFocusId = useRef<string | null>(null);\n\n const registerToggle = useCallback(\n (id: string, el: HTMLButtonElement | null): void => {\n if (el) {\n toggleRefs.current.set(id, el);\n } else {\n toggleRefs.current.delete(id);\n }\n },\n [],\n );\n\n const handleRemove = useCallback(\n (id: string): void => {\n // Decide the focus target BEFORE removal, from the current ordering:\n // next row's toggle, else previous row's toggle, else the Add button.\n const idx = items.findIndex((it) => it.id === id);\n const next = items[idx + 1];\n const prev = items[idx - 1];\n pendingFocusId.current = next?.id ?? prev?.id ?? '__add__';\n onRemove(id);\n },\n [items, onRemove],\n );\n\n // After the list re-renders (post-delete), move focus to the chosen target.\n useEffect(() => {\n const target = pendingFocusId.current;\n if (target === null) return;\n pendingFocusId.current = null;\n if (target === '__add__') {\n addBtnRef.current?.focus();\n return;\n }\n toggleRefs.current.get(target)?.focus();\n }, [items]);\n\n return (\n <section className=\"spytial-ed-section\" aria-label={title}>\n <div className=\"spytial-ed-section-head\">\n <h3 className=\"spytial-ed-section-title\">{title}</h3>\n <AddMenu\n kind={kind}\n onAdd={onAddItem}\n disabled={disabled}\n triggerRef={addBtnRef}\n />\n </div>\n\n <ul className=\"spytial-ed-rows\" aria-label={listLabel}>\n {items.map((item, index) => (\n <Row\n key={item.id}\n item={item}\n index={index}\n count={items.length}\n diagnostics={diagnostics}\n options={options}\n selectorProps={selectorProps}\n expanded={expandedId === item.id}\n onToggleExpand={onToggleExpand}\n onCollapse={onCollapse}\n registerToggle={registerToggle}\n onUpdateParam={onUpdateParam}\n onUpdateComment={onUpdateComment}\n onToggleNegate={onToggleNegate}\n onDuplicate={onDuplicate}\n onRemove={handleRemove}\n onMove={onMove}\n disabled={disabled}\n />\n ))}\n </ul>\n </section>\n );\n};\n\n// ---- a single row --------------------------------------------------------\n\ninterface RowProps {\n item: SpecItem;\n index: number;\n count: number;\n diagnostics?: readonly Diagnostic[];\n options?: FieldRendererOptions;\n selectorProps?: (item: SpecItem, field: FieldSpec) => SelectorFieldExtras | undefined;\n expanded: boolean;\n onToggleExpand(id: string): void;\n /** collapse the row and return focus to its toggle (Esc / APG accordion). */\n onCollapse(id: string): void;\n /** register/unregister this row's toggle button for focus management. */\n registerToggle(id: string, el: HTMLButtonElement | null): void;\n onUpdateParam(id: string, key: string, value: unknown): void;\n onUpdateComment(id: string, comment: string): void;\n onToggleNegate(id: string, negated: boolean): void;\n onDuplicate(id: string): void;\n onRemove(id: string): void;\n onMove(id: string, direction: -1 | 1): void;\n disabled: boolean;\n}\n\nconst Row: React.FC<RowProps> = ({\n item,\n index,\n count,\n diagnostics,\n options,\n selectorProps,\n expanded,\n onToggleExpand,\n onCollapse,\n registerToggle,\n onUpdateParam,\n onUpdateComment,\n onToggleNegate,\n onDuplicate,\n onRemove,\n onMove,\n disabled,\n}) => {\n const baseId = useId();\n const panelId = `${baseId}-panel`;\n const def = getDefinition(item.type);\n\n // Register the toggle button so the section can return focus to it (on Esc)\n // or to a sibling (after delete), per the APG accordion focus guidance.\n const toggleRef = useRef<HTMLButtonElement | null>(null);\n const itemId = item.id;\n useEffect(() => {\n registerToggle(itemId, toggleRef.current);\n return () => registerToggle(itemId, null);\n }, [itemId, registerToggle]);\n\n const itemDiagnostics = useMemo(\n () => (diagnostics ?? []).filter((d) => d.itemId === item.id),\n [diagnostics, item.id],\n );\n const severity = topSeverity(itemDiagnostics);\n\n // Unknown / unregistered types render read-only (\"preserved as written\").\n if (!def) {\n return (\n <li className=\"spytial-ed-row spytial-ed-row--unknown\">\n <div className=\"spytial-ed-row-main\">\n <span className=\"spytial-ed-badge spytial-ed-badge--unknown\">\n {item.kind === 'constraint' ? 'C' : 'D'}\n </span>\n <span className=\"spytial-ed-row-type\">{item.type}</span>\n <span className=\"spytial-ed-row-summary spytial-ed-row-summary--muted\">\n preserved as written\n </span>\n </div>\n </li>\n );\n }\n\n const summary = (() => {\n try {\n return def.summary(item.params);\n } catch {\n return '';\n }\n })();\n\n const negatable = NEGATABLE_TYPES.has(item.type);\n const negated = item.params.hold === 'never';\n\n return (\n <li\n className={`spytial-ed-row${expanded ? ' spytial-ed-row--expanded' : ''}${\n severity ? ` spytial-ed-row--${severity}` : ''\n }`}\n >\n <div className=\"spytial-ed-row-main\">\n <button\n ref={toggleRef}\n type=\"button\"\n className=\"spytial-ed-row-toggle\"\n aria-expanded={expanded}\n aria-controls={panelId}\n disabled={disabled}\n onClick={() => onToggleExpand(item.id)}\n >\n <span\n className={`spytial-ed-badge spytial-ed-badge--${item.kind}`}\n aria-hidden=\"true\"\n >\n {item.kind === 'constraint' ? 'C' : 'D'}\n </span>\n <span className=\"spytial-ed-row-type\">{def.label}</span>\n {negated ? (\n <span\n className=\"spytial-ed-row-negated\"\n role=\"img\"\n aria-label=\"should not hold\"\n title=\"should not hold (hold: never)\"\n >\n ¬\n </span>\n ) : null}\n <span className=\"spytial-ed-row-summary\">{summary}</span>\n {severity ? (\n <span\n className={`spytial-ed-row-dot spytial-ed-row-dot--${severity}`}\n role=\"img\"\n aria-label={`${severity}: ${itemDiagnostics.length} issue${\n itemDiagnostics.length === 1 ? '' : 's'\n }`}\n />\n ) : null}\n </button>\n\n <OverflowMenu\n item={item}\n index={index}\n count={count}\n disabled={disabled}\n onDuplicate={onDuplicate}\n onRemove={onRemove}\n onMove={onMove}\n onAddComment={() => onToggleExpand(item.id)}\n />\n </div>\n\n {expanded ? (\n <div\n className=\"spytial-ed-row-panel\"\n id={panelId}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n // Collapse and return focus to this row's toggle (APG accordion).\n onCollapse(item.id);\n toggleRef.current?.focus();\n }\n }}\n >\n <FieldRenderer\n fields={visibleFields(def.fields)}\n values={item.params}\n diagnostics={itemDiagnostics}\n options={options}\n disabled={disabled}\n onChange={(key, value) => onUpdateParam(item.id, key, value)}\n selectorProps={\n selectorProps\n ? (field) => selectorProps(item, field)\n : undefined\n }\n />\n\n {negatable ? (\n <div className=\"spytial-ed-field spytial-ed-field--hold\">\n <span\n className=\"spytial-ed-field-label\"\n id={`${baseId}-hold-label`}\n title=\"Whether this constraint must hold, or must NOT hold (hold: never), in the layout.\"\n >\n Condition\n </span>\n <div className=\"spytial-ed-field-control\">\n <div\n className=\"spytial-ed-pills\"\n role=\"radiogroup\"\n aria-labelledby={`${baseId}-hold-label`}\n >\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={!negated}\n className={`spytial-ed-pill${!negated ? ' spytial-ed-pill--active' : ''}`}\n disabled={disabled}\n onClick={() => onToggleNegate(item.id, false)}\n >\n Should hold\n </button>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={negated}\n className={`spytial-ed-pill${negated ? ' spytial-ed-pill--active spytial-ed-pill--negated' : ''}`}\n disabled={disabled}\n onClick={() => onToggleNegate(item.id, true)}\n >\n Should not hold\n </button>\n </div>\n </div>\n </div>\n ) : null}\n\n <div className=\"spytial-ed-field spytial-ed-field--text\">\n <label\n className=\"spytial-ed-field-label\"\n htmlFor={`${baseId}-comment`}\n >\n Comment\n </label>\n <div className=\"spytial-ed-field-control\">\n <input\n id={`${baseId}-comment`}\n type=\"text\"\n className=\"spytial-ed-input\"\n value={item.comment ?? ''}\n placeholder=\"Optional note (round-trips as a YAML comment)\"\n disabled={disabled}\n onChange={(e) => onUpdateComment(item.id, e.target.value)}\n />\n </div>\n </div>\n </div>\n ) : null}\n </li>\n );\n};\n\n// ---- overflow menu -------------------------------------------------------\n\ninterface OverflowMenuProps {\n item: SpecItem;\n index: number;\n count: number;\n disabled: boolean;\n onDuplicate(id: string): void;\n onRemove(id: string): void;\n onMove(id: string, direction: -1 | 1): void;\n onAddComment(): void;\n}\n\nconst OverflowMenu: React.FC<OverflowMenuProps> = ({\n item,\n index,\n count,\n disabled,\n onDuplicate,\n onRemove,\n onMove,\n onAddComment,\n}) => {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement | null>(null);\n const btnRef = useRef<HTMLButtonElement | null>(null);\n // Fixed positioning so host containers with overflow clipping (demo\n // sidebars) can't cut the menu off; flips above the button when cramped.\n const menuStyle = useAnchoredPopup(open, btnRef, {\n align: 'end',\n estimatedHeight: 220,\n });\n const label = getDefinition(item.type)?.label ?? item.type;\n\n useEffect(() => {\n if (!open) return;\n const onDocMouseDown = (e: MouseEvent): void => {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onDocMouseDown);\n return () => document.removeEventListener('mousedown', onDocMouseDown);\n }, [open]);\n\n const close = useCallback(() => setOpen(false), []);\n\n const run = useCallback(\n (fn: () => void) => {\n fn();\n close();\n },\n [close],\n );\n\n return (\n <div className=\"spytial-ed-overflow\" ref={wrapRef}>\n <button\n ref={btnRef}\n type=\"button\"\n className=\"spytial-ed-overflow-btn\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={`Actions for ${label}`}\n disabled={disabled}\n onClick={() => setOpen((o) => !o)}\n >\n <span aria-hidden=\"true\">⋯</span>\n </button>\n\n {open ? (\n <ul\n className=\"spytial-ed-overflow-menu\"\n style={menuStyle}\n role=\"menu\"\n aria-label={`Actions for ${label}`}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n close();\n }\n }}\n >\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item\"\n onClick={() => run(onAddComment)}\n >\n Add comment\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item\"\n onClick={() => run(() => onDuplicate(item.id))}\n >\n Duplicate\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item\"\n disabled={index === 0}\n onClick={() => run(() => onMove(item.id, -1))}\n >\n Move up\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item\"\n disabled={index >= count - 1}\n onClick={() => run(() => onMove(item.id, 1))}\n >\n Move down\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item spytial-ed-overflow-item--danger\"\n aria-label={`Remove ${label} ${item.kind}`}\n onClick={() => run(() => onRemove(item.id))}\n >\n Delete\n </button>\n </li>\n </ul>\n ) : null}\n </div>\n );\n};\n\n// ---- add menu (searchable) -----------------------------------------------\n\ninterface AddMenuProps {\n kind: ItemKind;\n onAdd(kind: ItemKind, type: string): void;\n disabled: boolean;\n /** ref to the trigger button, for post-delete focus fallback. */\n triggerRef?: React.Ref<HTMLButtonElement>;\n}\n\nconst AddMenu: React.FC<AddMenuProps> = ({ kind, onAdd, disabled, triggerRef }) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const wrapRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Local trigger ref for popup anchoring, merged with the external ref the\n // section uses for focus management.\n const btnRef = useRef<HTMLButtonElement | null>(null);\n const setTriggerRef = useCallback(\n (el: HTMLButtonElement | null): void => {\n btnRef.current = el;\n if (typeof triggerRef === 'function') {\n triggerRef(el);\n } else if (triggerRef && typeof triggerRef === 'object') {\n (triggerRef as React.MutableRefObject<HTMLButtonElement | null>).current = el;\n }\n },\n [triggerRef],\n );\n\n // Fixed positioning so the menu can't be clipped by host containers (the\n // original absolute menu rendered BELOW a short sidebar and was invisible).\n const menuStyle = useAnchoredPopup(open, btnRef, {\n align: 'end',\n estimatedHeight: 320,\n });\n\n // Deprecated types are hidden from the add menu (getDefinitions default).\n const defs = useMemo(() => getDefinitions(kind), [kind]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return defs;\n return defs.filter(\n (d) =>\n d.label.toLowerCase().includes(q) ||\n d.type.toLowerCase().includes(q) ||\n (d.description ?? '').toLowerCase().includes(q),\n );\n }, [defs, query]);\n\n useEffect(() => {\n if (!open) return;\n requestAnimationFrame(() => inputRef.current?.focus());\n const onDocMouseDown = (e: MouseEvent): void => {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onDocMouseDown);\n return () => document.removeEventListener('mousedown', onDocMouseDown);\n }, [open]);\n\n const close = useCallback(() => {\n setOpen(false);\n setQuery('');\n }, []);\n\n const choose = useCallback(\n (type: string) => {\n onAdd(kind, type);\n close();\n },\n [onAdd, kind, close],\n );\n\n const label = kind === 'constraint' ? 'Add constraint' : 'Add directive';\n\n return (\n <div className=\"spytial-ed-add\" ref={wrapRef}>\n <button\n ref={setTriggerRef}\n type=\"button\"\n className=\"spytial-ed-add-btn\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((o) => !o)}\n >\n + {label}\n </button>\n\n {open ? (\n <div\n className=\"spytial-ed-add-menu\"\n style={menuStyle}\n role=\"menu\"\n aria-label={label}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n }\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n className=\"spytial-ed-add-search\"\n value={query}\n placeholder=\"Search types…\"\n aria-label={`Search ${kind} types`}\n onChange={(e) => setQuery(e.target.value)}\n />\n <ul className=\"spytial-ed-add-list\">\n {filtered.length === 0 ? (\n <li className=\"spytial-ed-add-empty\">No matching types.</li>\n ) : (\n filtered.map((d) => (\n <li key={d.type} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-add-item\"\n onClick={() => choose(d.type)}\n >\n <span className=\"spytial-ed-add-item-label\">{d.label}</span>\n {d.description ? (\n <span className=\"spytial-ed-add-item-desc\">\n {d.description}\n </span>\n ) : null}\n </button>\n </li>\n ))\n )}\n </ul>\n </div>\n ) : null}\n </div>\n );\n};\n\n// ---- helpers -------------------------------------------------------------\n\n/** Hide the internal `hold` param from the form — surfaced as a Negate toggle. */\nfunction visibleFields(fields: readonly FieldSpec[]): FieldSpec[] {\n return fields.filter((f) => f.key !== 'hold');\n}\n\nfunction topSeverity(\n ds: readonly Diagnostic[],\n): Diagnostic['severity'] | undefined {\n if (ds.length === 0) return undefined;\n if (ds.some((d) => d.severity === 'error')) return 'error';\n if (ds.some((d) => d.severity === 'warning')) return 'warning';\n return 'info';\n}\n","/**\n * {@link SpecEditor} — the public Spytial spec-editor component.\n *\n * Owns a single {@link SpecDocument} (the source of truth) and projects it into\n * two live views: the {@link BuilderView} (compact schema-driven rows) and the\n * {@link CodeView} (raw YAML). The view toggle is purely visual; no conversion\n * happens on toggle.\n *\n * Sync semantics (see `docs/SPEC_EDITOR_REDESIGN.md`):\n * - Builder mutations → document mutation → `toYaml()` → `onChange` synchronously.\n * - Code-view edits → `onChange(text)` immediately (controlled), plus a\n * debounced `replaceFromYaml`. On a `SpecParseError` the model is untouched,\n * the parse diagnostic is shown inline, and the builder toggle shows a \"text\n * has unapplied edits\" badge until the text parses again.\n * - External `value` changes (prop differs from both the last emitted text and\n * the current model YAML) replace the model, guarded by try/catch.\n *\n * Domain awareness: `domain` is `props.domain ?? extractDomainSchema(instance)`,\n * memoized. It flows to the field combo-box options, the built-in completion\n * source, `document.validate(domain)`, and the assistant context.\n *\n * Selector assistance: per (item, field) we compose built-in domain completions\n * with `assistant.complete()`; `assistant.synthesize` powers the ✨ affordance;\n * `assistant.review()` results are merged into the field diagnostics (debounced,\n * stale-dropped, failures swallowed).\n */\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport './spec-editor.css';\nimport { SpecDocument, SpecParseError } from '../core/spec-document';\nimport type {\n Diagnostic,\n FieldSpec,\n ItemKind,\n SpecItem,\n} from '../core/types';\nimport { getDefinition } from '../core/registry';\nimport { extractDomainSchema } from '../domain/domain-schema';\nimport type { DomainSchema } from '../domain/domain-schema';\nimport {\n createBuiltinCompletionSource,\n mergeCompletions,\n} from '../domain/completions';\nimport type { Completion, SelectorAssistant, SelectorAssistContext } from '../domain/assistant';\nimport type { IInputDataInstance } from '../../data-instance/interfaces';\nimport {\n SpecEditorThemeInput,\n resolveSpecEditorTheme,\n themeToCssVars,\n} from './theme';\nimport { BuilderView } from './BuilderView';\nimport { CodeView } from './CodeView';\nimport { lintYaml } from '../core/code-positioning';\nimport type { SelectorFieldExtras } from './FieldRenderer';\n\nexport interface SpecEditorProps {\n /** controlled YAML value */\n value: string;\n onChange(value: string): void;\n /** domain awareness: pass either the live instance or a precomputed schema */\n instance?: IInputDataInstance;\n /** wins over instance if both given */\n domain?: DomainSchema;\n /**\n * Hooks. `theme` accepts either a token object or the NAME of a registered\n * theme (`'light'`, `'dark'`, or anything added via\n * `registerSpecEditorThemes`) — the same by-name convention as\n * `webcola-cnd-graph`'s `theme` attribute.\n */\n theme?: SpecEditorThemeInput;\n selectorAssistant?: SelectorAssistant;\n /** appearance */\n density?: 'compact' | 'comfortable';\n /**\n * Syntax highlighting in the code view and selector fields (default true).\n * Both use a mirror-overlay technique (highlighted <pre> behind a\n * transparent-text textarea); this is the escape hatch if a host's fonts or\n * zoom ever misalign the overlay — flipping it off renders plain visible\n * text with no mirror.\n */\n syntaxHighlighting?: boolean;\n defaultView?: 'builder' | 'code';\n /**\n * Optional controlled view. When provided, the editor renders this view and\n * notifies `onViewChange` instead of owning view state internally. (Used by\n * the back-compat `CndLayoutInterface` wrapper to keep `isNoCodeView` working;\n * standalone consumers can ignore it and use `defaultView`.)\n */\n view?: 'builder' | 'code';\n onViewChange?(view: 'builder' | 'code'): void;\n className?: string;\n disabled?: boolean;\n 'aria-label'?: string;\n /** notified whenever validation state changes */\n onDiagnostics?(diagnostics: Diagnostic[]): void;\n}\n\nconst PARSE_DEBOUNCE_MS = 300;\nconst REVIEW_DEBOUNCE_MS = 400;\n\nexport const SpecEditor: React.FC<SpecEditorProps> = ({\n value,\n onChange,\n instance,\n domain: domainProp,\n theme,\n selectorAssistant,\n density = 'compact',\n syntaxHighlighting = true,\n defaultView = 'builder',\n view: controlledView,\n onViewChange,\n className,\n disabled = false,\n 'aria-label': ariaLabel = 'Layout specification editor',\n onDiagnostics,\n}) => {\n // ── Document (source of truth) ────────────────────────────────────────\n // Created once from the initial value; never recreated on re-render. If the\n // INITIAL value is unparseable we keep an empty document but carry the parse\n // diagnostic forward (PR review finding: silently rendering an empty builder\n // for a broken initial spec left the user with no explanation), seeding the\n // parseError state below so the diagnostic + \"unapplied edits\" badge show\n // from the first render.\n const initRef = useRef<{ doc: SpecDocument; error: Diagnostic | null } | null>(\n null,\n );\n if (initRef.current === null) {\n initRef.current = initDocFromYaml(value);\n }\n const doc = initRef.current.doc;\n\n // Bump to force re-render on any document change (builder/undo/redo/parse).\n const [, forceRender] = useReducer((n: number) => n + 1, 0);\n\n // Last YAML text we emitted via onChange, so external-change detection can\n // distinguish a prop echo from a genuine external edit.\n const lastEmitted = useRef<string>(value);\n\n // Generation token bumped by every model mutation (builder emit, external\n // replace). A debounced code-view parse captures the current value when\n // scheduled and aborts if a mutation has bumped it since — otherwise a stale\n // parse could clobber a newer builder edit (see Finding 2 in the redesign).\n const mutationSeq = useRef(0);\n\n const [internalView, setInternalView] = useState<'builder' | 'code'>(\n defaultView,\n );\n const view = controlledView ?? internalView;\n // Holds the debounced code-view parse timer and its payload; declared here\n // so a view toggle can flush a pending parse (defined fully where code-view\n // editing lives).\n const parseTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingParse = useRef<{ text: string; seq: number } | null>(null);\n const flushParseRef = useRef<() => void>(() => {});\n const setView = useCallback(\n (next: 'builder' | 'code') => {\n // Apply (not discard) any pending debounced parse before switching views,\n // so a code edit made just before toggling is reflected in the builder.\n // The generation-token guard inside the flush still drops parses that a\n // newer builder/external mutation has superseded.\n flushParseRef.current();\n if (controlledView === undefined) {\n setInternalView(next);\n }\n onViewChange?.(next);\n },\n [controlledView, onViewChange],\n );\n // The parse diagnostic + \"unapplied edits\" state for the code view. Seeded\n // with the initial value's parse error, if any (see initRef above).\n const [parseError, setParseError] = useState<Diagnostic | null>(\n () => initRef.current?.error ?? null,\n );\n\n // ── Domain ─────────────────────────────────────────────────────────────\n const domain = useMemo<DomainSchema | undefined>(() => {\n if (domainProp) return domainProp;\n if (instance) return extractDomainSchema(instance);\n return undefined;\n }, [domainProp, instance]);\n\n const builtinComplete = useMemo(\n () => createBuiltinCompletionSource(domain),\n [domain],\n );\n\n const relationNames = useMemo(\n () => domain?.relations.map((r) => r.name) ?? [],\n [domain],\n );\n const typeNames = useMemo(\n () => domain?.types.map((t) => t.name) ?? [],\n [domain],\n );\n\n // ── Emit helper: regenerate YAML from the model and notify the host ──────\n const emit = useCallback(() => {\n const yaml = doc.toYaml();\n lastEmitted.current = yaml;\n // Invalidate any in-flight debounced code-view parse: this builder mutation\n // is now the latest edit, so a pending stale parse must not overwrite it.\n mutationSeq.current += 1;\n // A successful builder edit means the model and text now agree.\n setParseError(null);\n onChange(yaml);\n }, [doc, onChange]);\n\n // ── Assistant-review diagnostics (debounced, per item+field) ────────────\n const [reviewDiagnostics, setReviewDiagnostics] = useState<\n readonly Diagnostic[]\n >([]);\n const reviewSeq = useRef(0);\n const reviewTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // ── Combined diagnostics (structure + domain + assistant review) ─────────\n const structuralDomain = useMemo(\n () => doc.validate(domain),\n // Re-validate on every model change. `value` is included as a coarse model\n // change signal (each emit/parse threads through the controlled value), so\n // structural diagnostics refresh after builder edits and external changes.\n [doc, domain, value],\n );\n\n const allDiagnostics = useMemo(\n () => [...structuralDomain, ...reviewDiagnostics],\n [structuralDomain, reviewDiagnostics],\n );\n\n // Notify the host when validation state changes (string-keyed dedupe).\n const lastDiagKey = useRef<string>('');\n useEffect(() => {\n if (!onDiagnostics) return;\n const key = diagnosticsKey(allDiagnostics);\n if (key === lastDiagKey.current) return;\n lastDiagKey.current = key;\n onDiagnostics(allDiagnostics);\n }, [allDiagnostics, onDiagnostics]);\n\n // ── External value-change handling ───────────────────────────────────────\n // When the controlled prop diverges from both the last text we emitted and\n // the current model YAML, treat it as an external edit and replace the model.\n useEffect(() => {\n if (value === lastEmitted.current) return;\n let modelYaml: string;\n try {\n modelYaml = doc.toYaml();\n } catch {\n modelYaml = '';\n }\n if (value === modelYaml) {\n lastEmitted.current = value;\n return;\n }\n try {\n doc.replaceFromYaml(value);\n lastEmitted.current = value;\n // An external replace is also a model mutation — invalidate any pending\n // debounced code-view parse so it can't overwrite this newer state.\n mutationSeq.current += 1;\n setParseError(null);\n forceRender();\n } catch (err) {\n // Keep the model; surface the parse error in the code view.\n setParseError(toParseDiagnostic(err));\n }\n // `doc` is a stable ref; we intentionally key only on the controlled value.\n }, [value, doc]);\n\n // ── Subscribe to document changes (covers undo/redo + internal mutations) ─\n useEffect(() => {\n const unsub = doc.subscribe(() => forceRender());\n return unsub;\n }, [doc]);\n\n // ── Code-view editing (debounced parse) ─────────────────────────────────\n // Applies the pending code-view text to the model. Called by the debounce\n // timer and synchronously by `setView` so a toggle right after typing never\n // discards the edit. The generation check still aborts parses that a newer\n // builder/undo/external mutation has superseded (Finding 2).\n const flushParse = useCallback(() => {\n if (parseTimer.current) {\n clearTimeout(parseTimer.current);\n parseTimer.current = null;\n }\n const pending = pendingParse.current;\n pendingParse.current = null;\n if (!pending) return;\n if (mutationSeq.current !== pending.seq) return; // superseded\n try {\n doc.replaceFromYaml(pending.text);\n setParseError(null);\n forceRender();\n } catch (err) {\n // Model untouched; show the diagnostic + \"unapplied edits\" badge.\n setParseError(toParseDiagnostic(err));\n }\n }, [doc]);\n flushParseRef.current = flushParse;\n\n const handleCodeChange = useCallback(\n (text: string) => {\n if (disabled) return;\n lastEmitted.current = text;\n onChange(text); // controlled text updates immediately\n if (parseTimer.current) clearTimeout(parseTimer.current);\n // Capture the mutation generation at schedule time (checked in flush).\n pendingParse.current = { text, seq: mutationSeq.current };\n parseTimer.current = setTimeout(flushParse, PARSE_DEBOUNCE_MS);\n },\n [disabled, onChange, flushParse],\n );\n\n useEffect(\n () => () => {\n if (parseTimer.current) clearTimeout(parseTimer.current);\n if (reviewTimer.current) clearTimeout(reviewTimer.current);\n },\n [],\n );\n\n // ── Builder mutations ───────────────────────────────────────────────────\n const handleAddItem = useCallback(\n (kind: ItemKind, type: string) => {\n if (disabled) return undefined;\n const item = doc.addItem(kind, type);\n emit();\n // Returned so the builder can auto-expand the freshly added row.\n return item;\n },\n [disabled, doc, emit],\n );\n\n const handleUpdateParam = useCallback(\n (id: string, key: string, val: unknown) => {\n if (disabled) return;\n // Empty string clears a param so it round-trips out of the YAML.\n const patchValue = val === '' ? undefined : val;\n doc.updateItem(id, { params: { [key]: patchValue } });\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleUpdateComment = useCallback(\n (id: string, comment: string) => {\n if (disabled) return;\n doc.updateItem(id, { comment });\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleToggleNegate = useCallback(\n (id: string, negated: boolean) => {\n if (disabled) return;\n doc.updateItem(id, { params: { hold: negated ? 'never' : undefined } });\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleDuplicate = useCallback(\n (id: string) => {\n if (disabled) return;\n // Single document-level mutation = single undo step (the previous\n // addItem + updateItem + moveItem composition recorded three).\n const created = doc.duplicateItem(id);\n if (!created) return;\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleRemove = useCallback(\n (id: string) => {\n if (disabled) return;\n doc.removeItem(id);\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleMove = useCallback(\n (id: string, direction: -1 | 1) => {\n if (disabled) return;\n const state = doc.getState();\n const list = state.constraints.some((i) => i.id === id)\n ? state.constraints\n : state.directives;\n const index = list.findIndex((i) => i.id === id);\n if (index === -1) return;\n doc.moveItem(id, index + direction);\n emit();\n },\n [disabled, doc, emit],\n );\n\n // ── Undo / redo ──────────────────────────────────────────────────────────\n const handleUndo = useCallback(() => {\n if (disabled || !doc.canUndo()) return;\n doc.undo();\n emit();\n }, [disabled, doc, emit]);\n\n const handleRedo = useCallback(() => {\n if (disabled || !doc.canRedo()) return;\n doc.redo();\n emit();\n }, [disabled, doc, emit]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod || e.key.toLowerCase() !== 'z') return;\n e.preventDefault();\n if (e.shiftKey) {\n handleRedo();\n } else {\n handleUndo();\n }\n },\n [handleUndo, handleRedo],\n );\n\n // ── Selector wiring (per item + field) ──────────────────────────────────\n const selectorProps = useCallback(\n (item: SpecItem, field: FieldSpec): SelectorFieldExtras | undefined => {\n if (field.kind !== 'selector') return undefined;\n\n const ctxBase: Omit<SelectorAssistContext, 'currentValue'> = {\n itemKind: item.kind,\n itemType: item.type,\n fieldKey: field.key,\n domain,\n specYaml: lastEmitted.current,\n };\n\n const complete = (prefix: string): Completion[] | Promise<Completion[]> => {\n const builtinResults = builtinComplete(prefix);\n const assistantComplete = selectorAssistant?.complete;\n if (!assistantComplete) {\n return builtinResults;\n }\n const ctx: SelectorAssistContext = {\n ...ctxBase,\n currentValue: String(item.params[field.key] ?? ''),\n };\n let assistantOut: Completion[] | Promise<Completion[]>;\n try {\n assistantOut = assistantComplete(ctx, prefix) ?? [];\n } catch {\n return builtinResults;\n }\n return Promise.resolve(assistantOut)\n .then((res) => mergeCompletions(res ?? [], builtinResults))\n .catch(() => builtinResults);\n };\n\n const extras: SelectorFieldExtras = {\n complete,\n highlight: syntaxHighlighting,\n };\n\n if (selectorAssistant?.synthesize) {\n const synthFn = selectorAssistant.synthesize;\n extras.synthesize = (request: string) => {\n const ctx: SelectorAssistContext = {\n ...ctxBase,\n currentValue: String(item.params[field.key] ?? ''),\n };\n return synthFn(ctx, request);\n };\n }\n\n return extras;\n },\n [domain, builtinComplete, selectorAssistant, syntaxHighlighting],\n );\n\n // ── Assistant review (debounced over the whole model) ───────────────────\n useEffect(() => {\n const review = selectorAssistant?.review;\n if (!review) {\n setReviewDiagnostics([]);\n return;\n }\n if (reviewTimer.current) clearTimeout(reviewTimer.current);\n const seq = ++reviewSeq.current;\n reviewTimer.current = setTimeout(() => {\n const state = doc.getState();\n const items = [...state.constraints, ...state.directives];\n const tasks: Array<Promise<Diagnostic[]>> = [];\n for (const item of items) {\n const def = getDefinition(item.type);\n if (!def) continue;\n for (const field of def.fields) {\n if (field.kind !== 'selector') continue;\n const current = String(item.params[field.key] ?? '');\n if (current.trim() === '') continue;\n const ctx: SelectorAssistContext = {\n itemKind: item.kind,\n itemType: item.type,\n fieldKey: field.key,\n currentValue: current,\n domain,\n specYaml: lastEmitted.current,\n };\n tasks.push(\n Promise.resolve()\n .then(() => review(ctx, current))\n .then((ds) =>\n (ds ?? []).map((d) => ({\n ...d,\n itemId: item.id,\n fieldKey: field.key,\n source: 'assistant' as const,\n })),\n )\n .catch(() => [] as Diagnostic[]),\n );\n }\n }\n Promise.all(tasks)\n .then((groups) => {\n if (seq !== reviewSeq.current) return; // stale\n setReviewDiagnostics(groups.flat());\n })\n .catch(() => {\n if (seq !== reviewSeq.current) return;\n setReviewDiagnostics([]);\n });\n }, REVIEW_DEBOUNCE_MS);\n // Re-review when the assistant/domain change or the model changes (`value`\n // is the coarse model-change signal). `doc` is a stable ref.\n }, [selectorAssistant, domain, value, doc]);\n\n // ── Render ───────────────────────────────────────────────────────────────\n const state = doc.getState();\n const hasUnappliedEdits = parseError !== null;\n const rootClass = [\n 'spytial-ed',\n density === 'compact' ? 'spytial-ed--compact' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Lint the code-view text itself — parse + validate + position all from the\n // same `value`, so diagnostics' item ids match the state used to place them.\n // (Deliberately independent of the debounced model, whose ids drift on each\n // re-parse and whose text may lag during unapplied edits.)\n const codeDiagnostics = useMemo(() => lintYaml(value, domain), [value, domain]);\n\n const resolvedTheme = resolveSpecEditorTheme(theme);\n\n return (\n <section\n className={rootClass}\n style={resolvedTheme ? themeToCssVars(resolvedTheme) : undefined}\n aria-label={ariaLabel}\n onKeyDown={handleKeyDown}\n >\n <div className=\"spytial-ed-toolbar\">\n <div\n className=\"spytial-ed-viewtoggle\"\n role=\"tablist\"\n aria-label=\"Editor view\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={view === 'builder'}\n className={`spytial-ed-viewtoggle-btn${\n view === 'builder' ? ' spytial-ed-viewtoggle-btn--active' : ''\n }`}\n disabled={disabled}\n onClick={() => setView('builder')}\n >\n Builder\n {hasUnappliedEdits ? (\n <span\n className=\"spytial-ed-diagnostic-badge spytial-ed-diagnostic-badge--warning\"\n title=\"Text has unapplied edits\"\n aria-label=\"Text has unapplied edits\"\n >\n !\n </span>\n ) : null}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={view === 'code'}\n className={`spytial-ed-viewtoggle-btn${\n view === 'code' ? ' spytial-ed-viewtoggle-btn--active' : ''\n }`}\n disabled={disabled}\n onClick={() => setView('code')}\n >\n Code\n </button>\n </div>\n\n <div className=\"spytial-ed-history\">\n <button\n type=\"button\"\n className=\"spytial-ed-history-btn\"\n aria-label=\"Undo\"\n title=\"Undo (Cmd/Ctrl+Z)\"\n disabled={disabled || !doc.canUndo()}\n onClick={handleUndo}\n >\n <span aria-hidden=\"true\">↶</span>\n </button>\n <button\n type=\"button\"\n className=\"spytial-ed-history-btn\"\n aria-label=\"Redo\"\n title=\"Redo (Shift+Cmd/Ctrl+Z)\"\n disabled={disabled || !doc.canRedo()}\n onClick={handleRedo}\n >\n <span aria-hidden=\"true\">↷</span>\n </button>\n </div>\n </div>\n\n <div className=\"spytial-ed-body\">\n {view === 'builder' ? (\n <BuilderView\n constraints={state.constraints}\n directives={state.directives}\n diagnostics={allDiagnostics}\n options={{ relationNames, typeNames }}\n selectorProps={selectorProps}\n onAddItem={handleAddItem}\n onUpdateParam={handleUpdateParam}\n onUpdateComment={handleUpdateComment}\n onToggleNegate={handleToggleNegate}\n onDuplicate={handleDuplicate}\n onRemove={handleRemove}\n onMove={handleMove}\n disabled={disabled}\n />\n ) : (\n <CodeView\n value={value}\n onChange={handleCodeChange}\n diagnostics={codeDiagnostics}\n hasUnappliedEdits={hasUnappliedEdits}\n syntaxHighlighting={syntaxHighlighting}\n disabled={disabled}\n />\n )}\n </div>\n </section>\n );\n};\n\n// ---- helpers --------------------------------------------------------------\n\n/**\n * Build a document from YAML. On parse error, falls back to an empty document\n * but RETURNS the diagnostic so the editor can surface it from first render\n * instead of silently showing an empty builder.\n */\nfunction initDocFromYaml(yaml: string): {\n doc: SpecDocument;\n error: Diagnostic | null;\n} {\n try {\n return { doc: SpecDocument.fromYaml(yaml), error: null };\n } catch (err) {\n return { doc: new SpecDocument(), error: toParseDiagnostic(err) };\n }\n}\n\n/** Turn an unknown thrown value into a YAML parse diagnostic. */\nfunction toParseDiagnostic(err: unknown): Diagnostic {\n if (err instanceof SpecParseError) {\n return {\n severity: 'error',\n message: err.message,\n source: 'yaml',\n ...(err.line !== undefined ? { line: err.line } : {}),\n ...(err.column !== undefined ? { column: err.column } : {}),\n };\n }\n return {\n severity: 'error',\n message: err instanceof Error ? err.message : String(err),\n source: 'yaml',\n };\n}\n\n/** Stable key for a diagnostics array, for change detection. */\nfunction diagnosticsKey(ds: readonly Diagnostic[]): string {\n return ds\n .map(\n (d) =>\n `${d.severity}|${d.source}|${d.itemId ?? ''}|${d.fieldKey ?? ''}|${\n d.line ?? ''\n }|${d.column ?? ''}|${d.message}`,\n )\n .join('\\n');\n}\n","/**\n * Back-compat shims for the legacy `NoCodeView` data API.\n *\n * The old Structured Builder (the 27 hand-built selector components, the\n * `NoCodeView`/`CodeView` React surfaces, the `ConstraintCard`/`DirectiveCard`\n * widgets, the selector hooks and CSS) has been replaced by the schema-driven\n * Spytial spec editor in `src/spec-editor/`. The functions below preserve the\n * legacy import surface so existing callers keep compiling, by re-expressing\n * each one on top of the new core:\n *\n * - `parseLayoutSpecToData(yaml)` → `parseYamlToState` mapped to the legacy\n * `{ id, type, params, comment }` `ConstraintData`/`DirectiveData` shapes.\n * - `generateLayoutSpecYaml(c, d)` → the legacy data shapes mapped back to\n * `SpecItem[]` and serialized via `serializeStateToYaml`.\n * - `validateYaml` / `validateSpytialSpec` → unchanged behaviour (js-yaml\n * syntax check + structural key/type warnings + a final `parseLayoutSpec`).\n * - `highlightSelector` → the legacy pure HTML-highlighting helper, kept\n * verbatim (it has no UI dependency and retains its own test coverage).\n *\n * Document state is owned by the new `SpecEditor`; these shims are convenience\n * adapters for callers that have not migrated yet.\n */\n\nimport jsyaml from 'js-yaml';\nimport { parseLayoutSpec } from '../../layout/layoutspec';\nimport {\n parseYamlToState,\n serializeStateToYaml,\n newId,\n isKnownType,\n getKnownYamlKeys,\n} from '../../spec-editor';\nimport type { SpecItem, SpecDocumentState } from '../../spec-editor';\nimport type { ConstraintData, DirectiveData } from './interfaces';\nimport type { ConstraintType, DirectiveType } from './types';\n\n// ---- parse: YAML → legacy data shapes ------------------------------------\n\n/** Map a core `SpecItem` to the legacy flat data shape. */\nfunction itemToData<T extends ConstraintData | DirectiveData>(item: SpecItem): T {\n return {\n id: item.id,\n type: item.type as ConstraintType & DirectiveType,\n params: { ...item.params },\n ...(item.comment !== undefined ? { comment: item.comment } : {}),\n } as T;\n}\n\n/**\n * Parse a CnD layout spec YAML string into the legacy structured data shapes.\n *\n * Backed by the new codec (`parseYamlToState`), which preserves comments and\n * unknown nodes. Items keep the section the YAML places them in (the old\n * directive→constraint migration for `hideAtom`/`size` is no longer applied;\n * the spec editor renders those wherever they appear).\n *\n * @param yamlString - the YAML spec to parse\n * @returns the constraints and directives as legacy data objects\n * @public\n */\nexport function parseLayoutSpecToData(yamlString: string): {\n constraints: ConstraintData[];\n directives: DirectiveData[];\n} {\n const state = parseYamlToState(yamlString);\n return {\n constraints: state.constraints.map((i) => itemToData<ConstraintData>(i)),\n directives: state.directives.map((i) => itemToData<DirectiveData>(i)),\n };\n}\n\n// ---- serialize: legacy data shapes → YAML --------------------------------\n\n/** Map a legacy data object back to a core `SpecItem`. */\nfunction dataToItem(\n data: ConstraintData | DirectiveData,\n kind: SpecItem['kind'],\n): SpecItem {\n const item: SpecItem = {\n id: data.id || newId(),\n kind,\n type: data.type,\n params: { ...(data.params ?? {}) },\n };\n if (data.comment !== undefined) {\n item.comment = data.comment;\n }\n // Unknown types (not in the registry) carry their raw node so the codec\n // re-emits them verbatim under their own key.\n if (!isKnownType(data.type)) {\n item.raw = { [data.type]: { ...(data.params ?? {}) } };\n }\n return item;\n}\n\n/**\n * Generate a CnD layout spec YAML string from the legacy structured data\n * shapes. Backed by the new codec's `serializeStateToYaml`, so comments\n * round-trip and grouping types emit under the shared `group:` key.\n *\n * @param constraints - constraint data objects\n * @param directives - directive data objects\n * @returns the YAML spec\n * @public\n */\nexport function generateLayoutSpecYaml(\n constraints: ConstraintData[],\n directives: DirectiveData[],\n): string {\n const state: SpecDocumentState = {\n constraints: (constraints ?? []).map((c) => dataToItem(c, 'constraint')),\n directives: (directives ?? []).map((d) => dataToItem(d, 'directive')),\n };\n return serializeStateToYaml(state);\n}\n\n// ---- validation (unchanged behaviour) ------------------------------------\n\n/**\n * Validate YAML syntax. Returns an error message (with line/column when\n * available) if invalid, or `null` if the YAML parses.\n *\n * @param yamlString - YAML to validate\n * @public\n */\nexport function validateYaml(yamlString: string): string | null {\n if (!yamlString || !yamlString.trim()) {\n return null; // empty is valid\n }\n try {\n jsyaml.load(yamlString);\n return null;\n } catch (error) {\n if (error instanceof jsyaml.YAMLException) {\n const line = error.mark?.line !== undefined ? error.mark.line + 1 : undefined;\n const column =\n error.mark?.column !== undefined ? error.mark.column + 1 : undefined;\n const position = line && column ? ` (line ${line}, column ${column})` : '';\n return `YAML syntax error${position}: ${error.reason || error.message}`;\n }\n return `Invalid YAML: ${(error as Error).message}`;\n }\n}\n\n/** Result of Spytial spec validation. */\nexport interface SpytialValidationResult {\n /** whether the spec is valid */\n isValid: boolean;\n /** error message if the spec has errors (will prevent parsing) */\n error: string | null;\n /** warning messages for unrecognized elements (won't prevent parsing) */\n warnings: string[];\n}\n\n/**\n * Recognized constraint/directive keys are derived from the registry\n * (`getKnownYamlKeys`) rather than hand-listed here, so this check can't drift\n * as the registry grows — the reason a stale list previously false-warned on\n * the current `atomStyle`/`edgeStyle` directives. The check stays section-aware:\n * a known key in the wrong section (e.g. `edgeStyle` under `constraints`) is\n * still flagged, because `parseLayoutSpec` drops it there.\n */\n\n/** Keys valid in the `constraints:` section. */\nconst CONSTRAINT_SECTION_KEYS = getKnownYamlKeys('constraint');\n/**\n * Keys valid in the `directives:` section. `size`/`hideAtom` are registered as\n * constraints but the engine also reads them among directives, so they are\n * valid in both sections.\n */\nconst DIRECTIVE_SECTION_KEYS = [...getKnownYamlKeys('directive'), 'size', 'hideAtom'];\n\n/** Known top-level keys in a Spytial spec. */\nconst KNOWN_TOP_LEVEL_KEYS = ['constraints', 'directives'];\n\n/**\n * Validate a Spytial spec YAML string and return detailed results: YAML syntax\n * is checked first, then unrecognized top-level keys and constraint/directive\n * types are flagged as warnings, then the spec is parsed with the authoritative\n * `parseLayoutSpec` to surface structural errors.\n *\n * @param yamlString - YAML to validate\n * @public\n */\nexport function validateSpytialSpec(yamlString: string): SpytialValidationResult {\n const result: SpytialValidationResult = {\n isValid: true,\n error: null,\n warnings: [],\n };\n\n if (!yamlString || !yamlString.trim()) {\n return result; // empty is valid\n }\n\n let parsed: unknown;\n try {\n parsed = jsyaml.load(yamlString);\n } catch (error) {\n if (error instanceof jsyaml.YAMLException) {\n const line = error.mark?.line !== undefined ? error.mark.line + 1 : undefined;\n const column =\n error.mark?.column !== undefined ? error.mark.column + 1 : undefined;\n const position = line && column ? ` (line ${line}, column ${column})` : '';\n result.isValid = false;\n result.error = `YAML syntax error${position}: ${error.reason || error.message}`;\n } else {\n result.isValid = false;\n result.error = `Invalid YAML: ${(error as Error).message}`;\n }\n return result;\n }\n\n if (parsed && typeof parsed === 'object') {\n const obj = parsed as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (!KNOWN_TOP_LEVEL_KEYS.includes(key)) {\n result.warnings.push(\n `Unrecognized top-level key: \"${key}\". Expected: ${KNOWN_TOP_LEVEL_KEYS.join(', ')}`,\n );\n }\n }\n\n if (Array.isArray(obj.constraints)) {\n obj.constraints.forEach((constraint, i) => {\n if (constraint && typeof constraint === 'object') {\n const constraintType = Object.keys(constraint as object)[0];\n if (constraintType && !CONSTRAINT_SECTION_KEYS.includes(constraintType)) {\n result.warnings.push(\n `Unrecognized constraint type at index ${i}: \"${constraintType}\". Known types: ${CONSTRAINT_SECTION_KEYS.join(', ')}`,\n );\n }\n }\n });\n }\n\n if (Array.isArray(obj.directives)) {\n obj.directives.forEach((directive, i) => {\n if (directive && typeof directive === 'object') {\n const directiveType = Object.keys(directive as object)[0];\n if (directiveType && !DIRECTIVE_SECTION_KEYS.includes(directiveType)) {\n result.warnings.push(\n `Unrecognized directive type at index ${i}: \"${directiveType}\". Known types: ${DIRECTIVE_SECTION_KEYS.join(', ')}`,\n );\n }\n }\n });\n }\n }\n\n try {\n parseLayoutSpec(yamlString);\n } catch (error) {\n result.isValid = false;\n result.error = `Spytial spec error: ${(error as Error).message}`;\n return result;\n }\n\n return result;\n}\n\n// ---- highlightSelector (legacy pure helper, kept verbatim) ----------------\n\n/**\n * Highlights selector syntax with Alloy-esque coloring, returning an HTML\n * string of `<span>`-wrapped tokens. Pure and dependency-free; retained for\n * tooltips/previews and its existing test coverage.\n *\n * Recognizes operators (`->`, `+`, `&`, `-`, `~`, `*`, `^`, `.`), wildcards\n * (`_`, `univ`, `none`, `iden`), parentheses/brackets, capitalized identifiers\n * (sigs/atoms), lowercase identifiers (fields) and numeric literals.\n *\n * @param selector - the selector string to highlight\n * @returns HTML string with span elements for syntax highlighting\n * @public\n */\nexport function highlightSelector(selector: string): string {\n if (!selector) return '';\n\n const tokenPattern =\n /(->|[+&~*^.-]|[()[\\]]|_\\b|univ\\b|none\\b|iden\\b|[A-Z][a-zA-Z0-9_]*|[a-z][a-zA-Z0-9_]*|[0-9]+|\\s+|.)/g;\n\n const tokens = Array.from(selector.matchAll(tokenPattern), (m) => m[0]);\n\n const highlighted = tokens.map((token) => {\n const escaped = token\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\n if (/^\\s+$/.test(token)) {\n return escaped;\n }\n if (token === '->' || token === '.') {\n return `<span class=\"selector-join\">${escaped}</span>`;\n }\n if (/^[+&\\-~*^]$/.test(token)) {\n return `<span class=\"selector-operator\">${escaped}</span>`;\n }\n if (/^[()[\\]]$/.test(token)) {\n return `<span class=\"selector-paren\">${escaped}</span>`;\n }\n if (/^(_|univ|none|iden)$/.test(token)) {\n return `<span class=\"selector-wildcard\">${escaped}</span>`;\n }\n if (/^[A-Z][a-zA-Z0-9_]*$/.test(token)) {\n return `<span class=\"selector-sig\">${escaped}</span>`;\n }\n if (/^[a-z][a-zA-Z0-9_]*$/.test(token)) {\n return `<span class=\"selector-field\">${escaped}</span>`;\n }\n if (/^[0-9]+$/.test(token)) {\n return `<span class=\"selector-number\">${escaped}</span>`;\n }\n return escaped;\n });\n\n return highlighted.join('');\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { SpecEditor } from '../spec-editor';\nimport type {\n SpecEditorProps,\n Diagnostic,\n DomainSchema,\n SelectorAssistant,\n SpecEditorThemeInput,\n} from '../spec-editor';\nimport { parseLayoutSpecToData } from './NoCodeView/shims';\nimport type { ConstraintData, DirectiveData } from './NoCodeView/interfaces';\nimport type { IInputDataInstance } from '../data-instance/interfaces';\n\n/**\n * Props for the CND Layout Interface.\n *\n * `CndLayoutInterface` is now a thin back-compat wrapper over the schema-driven\n * {@link SpecEditor}. The legacy props (`yamlValue`, `isNoCodeView`,\n * `onViewChange`, and the `constraints`/`setConstraints`/`directives`/\n * `setDirectives` quartet) still work, but the document inside `SpecEditor` is\n * the source of truth — the constraint/directive callbacks are deprecated and\n * kept loosely in sync on a best-effort basis. New code should pass `value` +\n * `instance` (and any other {@link SpecEditorProps}) directly.\n *\n * @public\n */\nexport interface CndLayoutInterfaceProps {\n /** Current YAML value (legacy name for `value`). */\n yamlValue?: string;\n /** Current YAML value (alias for `yamlValue`; `value` wins if both given). */\n value?: string;\n /** Callback when the YAML value changes. */\n onChange: (value: string) => void;\n\n /** Whether to show the Structured Builder (true) vs Code view (false). */\n isNoCodeView?: boolean;\n /** Callback when the view mode changes. */\n onViewChange?: (isNoCodeView: boolean) => void;\n\n /**\n * @deprecated The document owns this state now. Kept loosely in sync via a\n * best-effort callback so legacy wrappers keep functioning.\n */\n constraints?: ConstraintData[];\n /** @deprecated see {@link CndLayoutInterfaceProps.constraints} */\n setConstraints?: (updater: (prev: ConstraintData[]) => ConstraintData[]) => void;\n /** @deprecated see {@link CndLayoutInterfaceProps.constraints} */\n directives?: DirectiveData[];\n /** @deprecated see {@link CndLayoutInterfaceProps.constraints} */\n setDirectives?: (updater: (prev: DirectiveData[]) => DirectiveData[]) => void;\n\n /** Domain awareness: the live data instance (extracts a schema). */\n instance?: IInputDataInstance;\n /** Domain awareness: a precomputed schema (wins over `instance`). */\n domain?: DomainSchema;\n /** Theme: token object or a registered theme name (e.g. 'dark'). */\n theme?: SpecEditorThemeInput;\n /** Selector-writing assistant hook. */\n selectorAssistant?: SelectorAssistant;\n /** Row density. */\n density?: 'compact' | 'comfortable';\n /** Syntax highlighting in code view + selector fields (default true). */\n syntaxHighlighting?: boolean;\n /** Notified whenever validation state changes. */\n onDiagnostics?: (diagnostics: Diagnostic[]) => void;\n\n /** Additional CSS class name. */\n className?: string;\n /** Whether the component is disabled. */\n disabled?: boolean;\n /** ARIA label for accessibility. */\n 'aria-label'?: string;\n}\n\n/**\n * CND Layout Interface — a thin back-compat wrapper over {@link SpecEditor}.\n *\n * Provides the historical prop surface (controlled `yamlValue`, an\n * `isNoCodeView` view toggle, and the deprecated constraint/directive\n * callbacks) while delegating all editing to the new spec editor. Builder and\n * Code views stay live and lossless; comments and unknown nodes round-trip.\n *\n * @example\n * ```tsx\n * <CndLayoutInterface\n * value={yamlValue}\n * onChange={setYamlValue}\n * instance={dataInstance}\n * />\n * ```\n *\n * @public\n */\nconst CndLayoutInterface: React.FC<CndLayoutInterfaceProps> = ({\n yamlValue,\n value,\n onChange,\n isNoCodeView,\n onViewChange,\n constraints,\n setConstraints,\n directives,\n setDirectives,\n instance,\n domain,\n theme,\n selectorAssistant,\n density,\n syntaxHighlighting,\n onDiagnostics,\n className,\n disabled = false,\n 'aria-label': ariaLabel = 'CND Layout Specification Interface',\n}) => {\n const currentValue = value ?? yamlValue ?? '';\n\n // Map the legacy boolean view flag to the SpecEditor view names. When\n // `isNoCodeView` is undefined the editor falls back to its own default view.\n const view: 'builder' | 'code' | undefined =\n isNoCodeView === undefined ? undefined : isNoCodeView ? 'builder' : 'code';\n\n const handleViewChange = useCallback(\n (next: 'builder' | 'code') => {\n onViewChange?.(next === 'builder');\n },\n [onViewChange],\n );\n\n /**\n * Keep the deprecated constraint/directive callbacks loosely in sync. The\n * document is the source of truth; on every YAML change we best-effort parse\n * it into the legacy data shapes and push them through the legacy setters so\n * old wrappers that read those arrays keep functioning.\n */\n const handleChange = useCallback(\n (nextYaml: string) => {\n onChange(nextYaml);\n if (setConstraints || setDirectives) {\n try {\n const parsed = parseLayoutSpecToData(nextYaml);\n setConstraints?.(() => parsed.constraints);\n setDirectives?.(() => parsed.directives);\n } catch {\n // Invalid intermediate YAML: leave the legacy arrays untouched.\n }\n }\n },\n [onChange, setConstraints, setDirectives],\n );\n\n const editorProps: SpecEditorProps = useMemo(() => {\n const props: SpecEditorProps = {\n value: currentValue,\n onChange: handleChange,\n defaultView: 'builder',\n disabled,\n 'aria-label': ariaLabel,\n };\n if (view !== undefined) {\n props.view = view;\n props.onViewChange = handleViewChange;\n }\n if (instance !== undefined) props.instance = instance;\n if (domain !== undefined) props.domain = domain;\n if (theme !== undefined) props.theme = theme;\n if (selectorAssistant !== undefined) props.selectorAssistant = selectorAssistant;\n if (density !== undefined) props.density = density;\n if (syntaxHighlighting !== undefined)\n props.syntaxHighlighting = syntaxHighlighting;\n if (onDiagnostics !== undefined) props.onDiagnostics = onDiagnostics;\n if (className !== undefined) props.className = className;\n return props;\n }, [\n currentValue,\n handleChange,\n view,\n handleViewChange,\n instance,\n domain,\n theme,\n selectorAssistant,\n density,\n syntaxHighlighting,\n onDiagnostics,\n className,\n disabled,\n ariaLabel,\n ]);\n\n // `constraints`/`directives` are read-only deprecated inputs; referenced here\n // only to acknowledge them (the document owns the real state).\n void constraints;\n void directives;\n\n return <SpecEditor {...editorProps} />;\n};\n\n/**\n * Named export for tree-shaking (no default export), per spytial-core guidelines.\n */\nexport { CndLayoutInterface };\n","import React, { useState, useEffect } from 'react';\nimport { ReplInterface } from './ReplInterface';\nimport { CndLayoutInterface } from '../CndLayoutInterface';\nimport { IInputDataInstance } from '../../data-instance/interfaces';\n\nexport interface ReplWithVisualizationProps {\n /** Data instance to work with */\n instance: IInputDataInstance;\n /** Callback when instance changes */\n onChange?: (instance: IInputDataInstance) => void;\n /** Initial CND layout specification */\n initialCndSpec?: string;\n /** Whether to show the CND layout interface */\n showLayoutInterface?: boolean;\n /** Custom styling for the container */\n style?: React.CSSProperties;\n /** Height of the REPL interface (default: 300px) */\n replHeight?: string;\n /** Height of the visualization area (default: 400px) */\n visualizationHeight?: string;\n}\n\n/**\n * Combined REPL and Visualization Component\n * \n * This component provides an integrated solution that combines:\n * - ReplInterface for command-line style data entry\n * - CndLayoutInterface for layout specification\n * - Real-time visualization updates\n * \n * Perfect for demos, tutorials, and rapid prototyping.\n * \n * @example\n * ```tsx\n * import { ReplWithVisualization, JSONDataInstance } from 'spytial-core';\n * \n * const instance = new JSONDataInstance({ atoms: [], relations: [] });\n * \n * <ReplWithVisualization \n * instance={instance}\n * onChange={(updated) => console.log('Updated:', updated)}\n * showLayoutInterface={true}\n * />\n * ```\n */\nexport const ReplWithVisualization: React.FC<ReplWithVisualizationProps> = ({\n instance,\n onChange,\n initialCndSpec = '',\n showLayoutInterface = true,\n style,\n replHeight = '300px',\n visualizationHeight = '400px'\n}) => {\n const [currentInstance, setCurrentInstance] = useState(instance);\n const [cndSpec, setCndSpec] = useState(initialCndSpec);\n\n // Update internal state when instance prop changes\n useEffect(() => {\n setCurrentInstance(instance);\n }, [instance]);\n\n const handleInstanceChange = (updatedInstance: IInputDataInstance) => {\n setCurrentInstance(updatedInstance);\n onChange?.(updatedInstance);\n };\n\n const handleCndSpecChange = (newSpec: string) => {\n setCndSpec(newSpec);\n };\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: '#f8f9fa',\n border: '1px solid #dee2e6',\n borderRadius: '8px',\n overflow: 'hidden',\n ...style\n };\n\n const sectionStyle: React.CSSProperties = {\n padding: '16px',\n borderBottom: '1px solid #dee2e6'\n };\n\n const headerStyle: React.CSSProperties = {\n margin: '0 0 12px 0',\n fontSize: '14px',\n fontWeight: 'bold',\n color: '#495057'\n };\n\n return (\n <div style={containerStyle}>\n {/* REPL Interface Section */}\n <div style={{ ...sectionStyle, height: replHeight, minHeight: '250px' }}>\n <h3 style={headerStyle}>Command Interface</h3>\n <div style={{ height: `calc(${replHeight} - 40px)` }}>\n <ReplInterface \n instance={currentInstance}\n onChange={handleInstanceChange}\n />\n </div>\n </div>\n\n {/* Layout Interface Section (Optional) */}\n {showLayoutInterface && (\n <div style={{ ...sectionStyle, height: '200px', minHeight: '150px' }}>\n <h3 style={headerStyle}>Layout Specification</h3>\n <div style={{ height: 'calc(200px - 40px)' }}>\n <CndLayoutInterface \n instance={currentInstance}\n value={cndSpec}\n onChange={handleCndSpecChange}\n />\n </div>\n </div>\n )}\n\n {/* Visualization Area */}\n <div style={{ \n ...sectionStyle, \n height: visualizationHeight,\n minHeight: '300px',\n borderBottom: 'none',\n flex: 1\n }}>\n <h3 style={headerStyle}>Visualization</h3>\n <div style={{ \n height: `calc(${visualizationHeight} - 40px)`,\n backgroundColor: 'white',\n border: '1px solid #ccc',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#6c757d'\n }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>📊</div>\n <div>\n Visualization area ready for webcola-cnd-graph integration\n </div>\n <div style={{ marginTop: '8px', fontSize: '12px' }}>\n Current data: {currentInstance.getAtoms().length} atoms, {currentInstance.getRelations().length} relations\n </div>\n {cndSpec && (\n <div style={{ marginTop: '8px', fontSize: '12px', color: '#28a745' }}>\n CND spec: {cndSpec.length} characters\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ReplWithVisualization;","import React from 'react';\nimport './ProjectionControls.css';\n\n/**\n * Data structure for a single projection choice\n */\nexport interface ProjectionChoice {\n /** The type being projected */\n type: string;\n /** The currently selected atom to project on */\n projectedAtom: string;\n /** All available atoms for this type */\n atoms: string[];\n}\n\n/**\n * Props for the ProjectionControls component\n */\nexport interface ProjectionControlsProps {\n /** Projection data from layout generation */\n projectionData: ProjectionChoice[];\n /** Callback when a projection selection changes */\n onProjectionChange: (type: string, atomId: string) => void;\n /** Additional CSS class name */\n className?: string;\n /** Whether the controls are disabled */\n disabled?: boolean;\n}\n\n/**\n * ProjectionControls component\n * \n * Displays dropdown selectors for each projected type in a Forge/Alloy instance.\n * Allows users to dynamically select which specific atom to project on for each\n * projected signature.\n * \n * This component is specifically designed for Forge/Alloy contexts where projection\n * is a common operation. It examines the projected types and creates interactive\n * selectors for them.\n * \n * @example\n * ```tsx\n * const projectionData = [\n * { type: 'State', projectedAtom: 'State0', atoms: ['State0', 'State1', 'State2'] },\n * { type: 'Process', projectedAtom: 'P1', atoms: ['P1', 'P2'] }\n * ];\n * \n * <ProjectionControls\n * projectionData={projectionData}\n * onProjectionChange={(type, atomId) => {\n * console.log(`Changed ${type} projection to ${atomId}`);\n * // Update projections and regenerate layout\n * }}\n * />\n * ```\n * \n * @public\n */\nexport const ProjectionControls: React.FC<ProjectionControlsProps> = ({\n projectionData,\n onProjectionChange,\n className = '',\n disabled = false\n}) => {\n // Don't render if there are no projections\n if (!projectionData || projectionData.length === 0) {\n return null;\n }\n\n return (\n <div \n className={`projection-controls ${className}`}\n role=\"region\"\n aria-label=\"Projection Controls\"\n >\n <div className=\"projection-controls__header\">\n <h3 className=\"projection-controls__title\">Projections</h3>\n <p className=\"projection-controls__description\">\n Select which atom to project for each type\n </p>\n </div>\n \n <div className=\"projection-controls__list\">\n {projectionData.map((projection) => (\n <div \n key={projection.type} \n className=\"projection-controls__item\"\n >\n <label \n htmlFor={`projection-${projection.type}`}\n className=\"projection-controls__label\"\n >\n {projection.type}\n </label>\n \n <select\n id={`projection-${projection.type}`}\n className=\"projection-controls__select\"\n value={projection.projectedAtom}\n onChange={(e) => onProjectionChange(projection.type, e.target.value)}\n disabled={disabled || projection.atoms.length === 0}\n aria-label={`Select atom to project for ${projection.type}`}\n >\n {projection.atoms.length === 0 ? (\n <option value=\"\">No atoms available</option>\n ) : (\n projection.atoms.map((atom) => (\n <option key={atom} value={atom}>\n {atom}\n </option>\n ))\n )}\n </select>\n </div>\n ))}\n </div>\n </div>\n );\n};\n","/**\n * Projection Transform Module\n * \n * Provides a standalone, pre-layout data instance transformation that applies\n * projections to an IDataInstance. Projections are a form of metaprogramming:\n * they rewrite the datum itself by removing projected atoms and collapsing\n * relation arities, producing a new IDataInstance that downstream consumers\n * (layout, export, analysis) can operate on naively.\n * \n * This module is intentionally decoupled from the layout engine. Projections\n * are a semantic transformation on the model, not a visual/constraint concern.\n * \n * @module projection-transform\n */\n\nimport { IDataInstance, IType } from './interfaces';\n\n/**\n * A projection specifying which type (sig) to project over,\n * and optionally how to order the atoms of that type.\n */\nexport interface Projection {\n /** The type/sig name to project over */\n sig: string;\n /** \n * Optional ordering specification for atoms of this type.\n * When provided with an evaluator via ProjectionTransformOptions,\n * atoms are topologically sorted according to the tuples returned\n * by evaluating this selector.\n */\n orderBy?: string;\n}\n\n/**\n * The result of selecting a specific atom for a projected type.\n * Used to populate projection UI controls (dropdowns).\n */\nexport interface ProjectionChoice {\n /** The projected type/sig name */\n type: string;\n /** The currently selected atom ID for this type */\n projectedAtom: string;\n /** All available atoms for this type, in display order */\n atoms: string[];\n}\n\n/**\n * Options for configuring projection transform behavior.\n */\nexport interface ProjectionTransformOptions {\n /**\n * Optional evaluator function for `orderBy` selectors.\n * When a Projection has an `orderBy` field, this function\n * is called with the selector string and should return an array of\n * [from, to] tuple pairs defining a partial order on atoms.\n * \n * If not provided, orderBy fields are ignored and atoms are\n * sorted lexicographically.\n */\n evaluateOrderBy?: (selector: string) => string[][];\n\n /**\n * Optional error handler for orderBy evaluation failures.\n * If not provided, errors are silently caught and atoms fall back\n * to lexicographic ordering.\n */\n onOrderByError?: (selector: string, error: unknown) => void;\n}\n\n/**\n * The result of applying a projection transform to a data instance.\n */\nexport interface ProjectionTransformResult {\n /** The transformed data instance with projections applied */\n instance: IDataInstance;\n /** The projection choices made, for populating UI controls */\n choices: ProjectionChoice[];\n}\n\n\n/**\n * Applies projections to a data instance, producing a new\n * IDataInstance with projected types/atoms removed and relation arities\n * reduced accordingly.\n * \n * This is the core pre-layout transformation step. It:\n * 1. Resolves which atoms belong to each projected sig (including subtypes)\n * 2. Orders atoms per sig (via orderBy or lexicographic fallback)\n * 3. Selects the active atom per sig (from user selections or defaults to first)\n * 4. Delegates to IDataInstance.applyProjections() for the actual data rewrite\n * \n * **Evaluation-order dependency:** The `evaluateOrderBy` callback is invoked\n * *before* `instance.applyProjections()` is called, so it evaluates against the\n * **original, un-projected** data instance. This is intentional — the ordering\n * relation (e.g., `next: Time → Time`) involves atoms of the projected type,\n * which are removed by projection. The caller must therefore initialise the\n * evaluator with the original instance, not the projected one:\n *\n * ```\n * evaluator.initialize({ sourceData: originalInstance }) // ← full data\n * applyProjectionTransform(originalInstance, ...) // ← orderBy runs here\n * layoutInstance.generateLayout(projectedInstance) // ← layout on projected\n * ```\n *\n * Layout selectors evaluated later (step 3) still work correctly: atom IDs\n * returned by the evaluator that no longer exist in the projected graph are\n * silently filtered out during node matching.\n *\n * @param instance - The source data instance to project\n * @param projections - The projections (which sigs to project over)\n * @param selections - User selections mapping type/sig name → chosen atom ID.\n * This object is mutated to fill in defaults for unset projections.\n * @param options - Optional configuration (orderBy evaluator, error handler)\n * @returns The projected data instance and the finalized projection choices\n * \n * @example\n * ```typescript\n * import { applyProjectionTransform } from 'spytial-core';\n * \n * const result = applyProjectionTransform(\n * dataInstance,\n * [{ sig: 'State', orderBy: 'next' }],\n * { State: 'State0' },\n * { evaluateOrderBy: (sel) => evaluator.evaluate(sel).selectedTwoples() }\n * );\n * \n * // result.instance is the projected IDataInstance\n * // result.choices has the dropdown metadata\n * ```\n */\nexport function applyProjectionTransform(\n instance: IDataInstance,\n projections: Projection[],\n selections: Record<string, string>,\n options: ProjectionTransformOptions = {}\n): ProjectionTransformResult {\n const projectedSigs = projections.map(d => d.sig);\n \n if (projectedSigs.length === 0) {\n return { instance, choices: [] };\n }\n\n const allTypes = instance.getTypes();\n\n // For each projected sig, collect atoms from all types that include\n // this sig in their type hierarchy (handles abstract sigs / subtypes)\n const atomsPerType: Record<string, string[]> = {};\n\n for (const projection of projections) {\n const sig = projection.sig;\n\n // Validate that the sig exists in the type hierarchy.\n // Check both `t.types` (which lists the full hierarchy, e.g. [\"Node\",\"univ\"])\n // and `t.id` (the type's own identifier) for a match.\n const sigExists = allTypes.some(t => t.id === sig || t.types.includes(sig));\n if (!sigExists) {\n throw new Error(`Projected type '${sig}' not found in data instance`);\n }\n\n // Find all types that include this sig (subtypes/descendants)\n const matchingTypes = allTypes.filter(t => t.id === sig || t.types.includes(sig));\n\n // Collect all atoms, deduplicating (parent sigs may include subsig atoms)\n const atomSet = new Set<string>();\n for (const type of matchingTypes) {\n for (const atom of type.atoms) {\n atomSet.add(atom.id);\n }\n }\n\n let atoms = [...atomSet];\n\n // Apply orderBy sorting if an evaluator is provided\n if (projection.orderBy && options.evaluateOrderBy) {\n try {\n const orderTuples = options.evaluateOrderBy(projection.orderBy);\n atoms = topologicalSortWithCycleBreaking(atoms, orderTuples);\n } catch (error) {\n if (options.onOrderByError) {\n options.onOrderByError(projection.orderBy, error);\n }\n // Fallback to lexicographic sort\n atoms.sort((a, b) => a.localeCompare(b));\n }\n } else {\n // Default: sort lexicographically by atom ID\n atoms.sort((a, b) => a.localeCompare(b));\n }\n\n atomsPerType[sig] = atoms;\n }\n\n // Select which atom to project for each sig\n const projectedAtomIds: string[] = [];\n\n for (const [typeId, atomIds] of Object.entries(atomsPerType)) {\n if (atomIds.length > 0) {\n if (selections[typeId]) {\n projectedAtomIds.push(selections[typeId]);\n } else {\n // Default to first atom; mutate selections so caller sees the default\n const defaultAtom = atomIds[0];\n selections[typeId] = defaultAtom;\n projectedAtomIds.push(defaultAtom);\n }\n }\n }\n\n // Build projection choices for UI consumption\n const choices: ProjectionChoice[] = Object.entries(selections)\n .filter(([typeId]) => projectedSigs.includes(typeId))\n .map(([typeId, atomId]) => ({\n type: typeId,\n projectedAtom: atomId,\n atoms: atomsPerType[typeId] || []\n }));\n\n // Apply the actual data transformation\n const projectedInstance = instance.applyProjections(projectedAtomIds);\n\n return { instance: projectedInstance, choices };\n}\n\n\n/**\n * Topological sort with cycle breaking via Kahn's algorithm.\n * \n * Given a set of atoms and a partial order defined by [from, to] tuples,\n * produces a total ordering that respects the partial order where possible.\n * Cycles are broken by preferring the lexicographically smallest node.\n * \n * @param atoms - The atoms to sort\n * @param tuples - Pairs [from, to] defining the partial order (from < to)\n * @returns Sorted array of atom IDs\n */\nexport function topologicalSortWithCycleBreaking(atoms: string[], tuples: string[][]): string[] {\n const atomSet = new Set(atoms);\n\n // Build adjacency list and in-degree count\n const adjacency = new Map<string, Set<string>>();\n const inDegree = new Map<string, number>();\n\n for (const atom of atoms) {\n adjacency.set(atom, new Set());\n inDegree.set(atom, 0);\n }\n\n for (const tuple of tuples) {\n if (tuple.length >= 2) {\n const from = tuple[0];\n const to = tuple[1];\n\n if (atomSet.has(from) && atomSet.has(to) && from !== to) {\n const neighbors = adjacency.get(from)!;\n if (!neighbors.has(to)) {\n neighbors.add(to);\n inDegree.set(to, (inDegree.get(to) || 0) + 1);\n }\n }\n }\n }\n\n // Kahn's algorithm with cycle breaking\n const result: string[] = [];\n const remaining = new Set(atoms);\n\n while (remaining.size > 0) {\n const ready: string[] = [];\n for (const atom of remaining) {\n if ((inDegree.get(atom) || 0) === 0) {\n ready.push(atom);\n }\n }\n\n if (ready.length === 0) {\n // Cycle detected — break by picking lexicographically smallest\n const sorted = [...remaining].sort((a, b) => a.localeCompare(b));\n ready.push(sorted[0]);\n }\n\n ready.sort((a, b) => a.localeCompare(b));\n\n const node = ready[0];\n result.push(node);\n remaining.delete(node);\n\n const neighbors = adjacency.get(node) || new Set();\n for (const neighbor of neighbors) {\n if (remaining.has(neighbor)) {\n inDegree.set(neighbor, (inDegree.get(neighbor) || 1) - 1);\n }\n }\n }\n\n return result;\n}\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { ProjectionChoice } from './ProjectionControls';\nimport './ProjectionOrchestrator.css';\nimport {\n applyProjectionTransform,\n Projection,\n ProjectionTransformResult,\n} from '../../data-instance/projection-transform';\nimport { IDataInstance } from '../../data-instance/interfaces';\nimport IEvaluator from '../../evaluators/interfaces';\n\n/**\n * Result emitted by ProjectionOrchestrator whenever projections change.\n * Contains everything the caller needs to run layout on the projected data.\n */\nexport interface ProjectionOrchestratorResult {\n /** The projected data instance — pass this to `LayoutInstance.generateLayout()` */\n instance: IDataInstance;\n /** Projection choices for external consumption / serialisation */\n choices: ProjectionChoice[];\n}\n\n/**\n * Props for the ProjectionOrchestrator component.\n */\nexport interface ProjectionOrchestratorProps {\n /**\n * The **original, un-projected** data instance.\n * The orchestrator applies projection transforms to this instance.\n */\n instance: IDataInstance | null;\n\n /**\n * Optional evaluator, initialised against `instance`.\n * Required for `orderBy` support — if omitted, `orderBy` is ignored\n * and atoms fall back to lexicographic sorting.\n */\n evaluator?: IEvaluator | null;\n\n /**\n * Callback fired whenever the projected instance changes.\n * Called on instance change, projection add/remove, or atom selection change.\n * The caller should use `result.instance` for layout generation.\n */\n onProjectionChange: (result: ProjectionOrchestratorResult) => void;\n\n /** Additional CSS class name */\n className?: string;\n\n /** Whether the controls are disabled */\n disabled?: boolean;\n}\n\n/**\n * ProjectionOrchestrator\n *\n * A simplified, self-contained projection UI.\n *\n * **Step 1 — Add a projection:** Type any type/sig name (including built-in\n * types like `Int`) into the text box and press Enter or click Add.\n *\n * **Step 2 — Pick an atom:** Once a type is added, a dropdown appears listing\n * every atom of that type. Selecting a different atom re-projects the\n * instance and fires `onProjectionChange`.\n *\n * The component runs `applyProjectionTransform` internally and emits the\n * projected `IDataInstance` — the caller just passes it to `generateLayout()`.\n *\n * @public\n */\nexport const ProjectionOrchestrator: React.FC<ProjectionOrchestratorProps> = ({\n instance,\n evaluator,\n onProjectionChange,\n className = '',\n disabled = false,\n}) => {\n // ── State ──────────────────────────────────────────────────────────\n const [projections, setProjections] = useState<Projection[]>([]);\n const [selections, setSelections] = useState<Record<string, string>>({});\n const [choices, setChoices] = useState<ProjectionChoice[]>([]);\n const [inputValue, setInputValue] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n // Ref to avoid stale closures in the onProjectionChange callback.\n const onChangeRef = useRef(onProjectionChange);\n useEffect(() => {\n onChangeRef.current = onProjectionChange;\n }, [onProjectionChange]);\n\n // ── Core: run projection transform ─────────────────────────────────\n const runTransform = useCallback(\n (\n inst: IDataInstance | null,\n dirs: Projection[],\n sels: Record<string, string>,\n ): ProjectionTransformResult | null => {\n if (!inst || dirs.length === 0) {\n return null;\n }\n\n try {\n return applyProjectionTransform(inst, dirs, sels, {\n evaluateOrderBy: evaluator?.isReady()\n ? (sel) => evaluator.evaluate(sel).selectedTwoples()\n : undefined,\n onOrderByError: (sel, err) => {\n console.warn(`ProjectionOrchestrator: orderBy error for \"${sel}\":`, err);\n },\n });\n } catch (err) {\n console.error('ProjectionOrchestrator: projection transform failed:', err);\n return null;\n }\n },\n [evaluator],\n );\n\n // ── Effect: re-run projection when inputs change ───────────────────\n useEffect(() => {\n if (!instance) {\n setChoices([]);\n return;\n }\n\n if (projections.length === 0) {\n // No projections active — emit the original instance unchanged.\n setChoices([]);\n onChangeRef.current({ instance, choices: [] });\n return;\n }\n\n const selsCopy = { ...selections };\n const result = runTransform(instance, projections, selsCopy);\n if (result) {\n setChoices(result.choices);\n // Sync defaults that applyProjectionTransform may have filled in.\n setSelections(selsCopy);\n setError(null);\n onChangeRef.current({ instance: result.instance, choices: result.choices });\n } else {\n // Transform failed — fallback to un-projected\n setChoices([]);\n setError('Projection transform failed — showing un-projected data.');\n onChangeRef.current({ instance, choices: [] });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [instance, projections, JSON.stringify(selections), runTransform]);\n\n // ── Handlers ───────────────────────────────────────────────────────\n const handleAddProjection = useCallback(() => {\n const sig = inputValue.trim();\n if (!sig) return;\n\n // Prevent duplicates\n if (projections.some((p) => p.sig === sig)) {\n setError(`Already projecting over \"${sig}\".`);\n return;\n }\n\n setError(null);\n setProjections((prev) => [...prev, { sig }]);\n setInputValue('');\n }, [inputValue, projections]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddProjection();\n }\n },\n [handleAddProjection],\n );\n\n const handleRemoveProjection = useCallback((sig: string) => {\n setProjections((prev) => prev.filter((d) => d.sig !== sig));\n setSelections((prev) => {\n const next = { ...prev };\n delete next[sig];\n return next;\n });\n setError(null);\n }, []);\n\n const handleAtomChange = useCallback(\n (type: string, atomId: string) => {\n setSelections((prev) => ({ ...prev, [type]: atomId }));\n },\n [],\n );\n\n // ── Render ─────────────────────────────────────────────────────────\n if (!instance) return null;\n\n return (\n <div\n className={`projection-orchestrator ${className}`}\n role=\"region\"\n aria-label=\"Projection Orchestrator\"\n >\n {/* ── Add new projection (free-text) ─────────────── */}\n <div className=\"projection-orchestrator__add\">\n <label\n htmlFor=\"projection-orchestrator-add\"\n className=\"projection-controls__label\"\n >\n Project over:\n </label>\n <input\n id=\"projection-orchestrator-add\"\n className=\"projection-controls__input\"\n type=\"text\"\n placeholder=\"Type name (e.g. State, Node, Int)\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n autoComplete=\"off\"\n />\n <button\n type=\"button\"\n className=\"projection-orchestrator__add-btn\"\n onClick={handleAddProjection}\n disabled={disabled || !inputValue.trim()}\n >\n Add\n </button>\n </div>\n\n {/* ── Error banner ─────────────────────────────────── */}\n {error && (\n <div className=\"projection-orchestrator__error\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* ── Active projections ───────────────────────────── */}\n {projections.length > 0 && (\n <div className=\"projection-orchestrator__list\">\n {projections.map((d) => {\n const choice = choices.find((c) => c.type === d.sig);\n return (\n <div key={d.sig} className=\"projection-orchestrator__row\">\n {/* Type tag with remove button */}\n <span className=\"projection-orchestrator__tag\">\n {d.sig}\n <button\n type=\"button\"\n className=\"projection-orchestrator__remove-btn\"\n onClick={() => handleRemoveProjection(d.sig)}\n disabled={disabled}\n aria-label={`Remove projection on ${d.sig}`}\n >\n ×\n </button>\n </span>\n\n {/* Atom selector */}\n {choice && choice.atoms.length > 0 ? (\n <select\n className=\"projection-controls__select\"\n value={choice.projectedAtom}\n onChange={(e) => handleAtomChange(d.sig, e.target.value)}\n disabled={disabled}\n aria-label={`Select atom for ${d.sig}`}\n >\n {choice.atoms.map((atom) => (\n <option key={atom} value={atom}>\n {atom}\n </option>\n ))}\n </select>\n ) : choice ? (\n <span className=\"projection-orchestrator__no-atoms\">\n No atoms\n </span>\n ) : null}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react'\nimport { IEvaluator } from '../../evaluators'\nimport \"./EvaluatorRepl.css\"\n\ninterface EvaluatorReplProps {\n // IEvaluator instance\n evaluator: IEvaluator\n // Instance index for the evaluator\n instanceNumber: number\n}\n\ntype EvaluatorExecution = [string, string]\n\nexport const EvaluatorRepl: React.FC<EvaluatorReplProps> = ({ evaluator, instanceNumber }) => {\n const [textInput, setTextInput] = React.useState('');\n const [evaluatorOutput, setEvaluatorOutput] = React.useState<EvaluatorExecution[]>([]);\n\n React.useEffect(() => {\n // Clear input and output when evaluator or instance number changes\n setTextInput('');\n setEvaluatorOutput([]);\n }, [evaluator, instanceNumber]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n // Evaluate the input expression\n const output = evaluator.evaluate(textInput, { instanceIndex: instanceNumber });\n setEvaluatorOutput(prev => [[textInput, output.prettyPrint()], ...prev]);\n setTextInput(''); // Clear input after evaluation\n }\n }\n\n return (\n <div id=\"evaluator-repl-container\">\n <input \n className=\"code-input\"\n id=\"evaluator-input\" \n type=\"text\" \n placeholder=\"Enter expression to evaluate...\" \n value={textInput} \n onChange={(e) => setTextInput(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n <div id=\"repl-output\">\n {evaluatorOutput.map(([textInput, output], index) => (\n <React.Fragment key={index}>\n <p className=\"repl-output-line\">{`> ${textInput}`}</p>\n <p className=\"repl-output-line\">{output}</p>\n </React.Fragment>\n ))}\n </div>\n </div>\n )\n}","import React, { useEffect, useRef, useState } from 'react';\nimport './RelationHighlighter.css';\n\ninterface RelationHighlighterProps {\n /** ID of the webcola-cnd-graph HTML element */\n graphElementId: string;\n}\n\n// Type for the webcola-cnd-graph element with its public API\ninterface WebColaGraphElement extends HTMLElement {\n highlightRelation(relationName: string): boolean;\n clearHighlightRelation(relationName: string): boolean;\n getAllRelations(): string[];\n}\n\n// Type for the relations-available custom event\ninterface RelationsAvailableEvent extends CustomEvent {\n detail: {\n relations: string[];\n count: number;\n timestamp: number;\n graphId: string;\n };\n}\n\n/**\n * Component that provides an interactive list of relations for highlighting in a WebCola graph.\n * Listens to the graph's custom events and provides hover-based relation highlighting.\n */\nexport const RelationHighlighter: React.FC<RelationHighlighterProps> = ({ \n graphElementId \n}) => {\n // State for available relations and collapsible container\n const [relations, setRelations] = useState<string[]>([]);\n const [isCollapsed, setIsCollapsed] = useState(true);\n \n // Ref to the webcola-cnd-graph element\n const graphElementRef = useRef<WebColaGraphElement | null>(null);\n\n useEffect(() => {\n // Get reference to the webcola-cnd-graph element\n const element = document.getElementById(graphElementId) as WebColaGraphElement | null;\n graphElementRef.current = element;\n \n if (!graphElementRef.current) {\n console.warn(`RelationHighlighter: Element with id \"${graphElementId}\" not found`);\n return;\n }\n\n // Event handler for relations-available custom event\n const handleRelationsAvailable = (event: unknown) => {\n const customEvent = event as RelationsAvailableEvent;\n const { relations: availableRelations } = customEvent.detail;\n setRelations(availableRelations || []);\n };\n\n // Attach event listener\n graphElementRef.current.addEventListener('relations-available', handleRelationsAvailable);\n\n // Cleanup function to remove event listener\n return () => {\n if (graphElementRef.current) {\n graphElementRef.current.removeEventListener('relations-available', handleRelationsAvailable);\n }\n };\n }, [graphElementId]);\n\n /**\n * Handle mouse enter on relation item - only highlight if within content area\n * Prevents highlighting when hovering over scrollbars\n */\n const handleRelationHover = (event: React.MouseEvent<HTMLLIElement>, relationName: string) => {\n const currentTarget = event.currentTarget;\n const parentList = currentTarget.parentElement;\n \n if (!parentList) return;\n \n // Get mouse position relative to the parent list\n const rect = parentList.getBoundingClientRect();\n const mouseX = event.clientX - rect.left;\n const mouseY = event.clientY - rect.top;\n \n // Only highlight if mouse is within the scrollable content area\n // clientWidth/clientHeight exclude scrollbars\n if (mouseX >= 0 && mouseX <= parentList.clientWidth && \n mouseY >= 0 && mouseY <= parentList.clientHeight) {\n \n if (graphElementRef.current && typeof graphElementRef.current.highlightRelation === 'function') {\n graphElementRef.current.highlightRelation(relationName);\n }\n }\n };\n\n /**\n * Handle mouse leave on relation item - only clear if mouse leaves the entire list area\n * Prevents clearing when moving to scrollbars within the list\n */\n const handleRelationLeave = (relationName: string) => {\n // Clear highlighting when mouse truly leaves the list area\n if (graphElementRef.current && typeof graphElementRef.current.clearHighlightRelation === 'function') {\n graphElementRef.current.clearHighlightRelation(relationName);\n }\n };\n\n // Toggle collapsible container\n const toggleCollapsed = () => {\n setIsCollapsed(prev => !prev);\n };\n\n return (\n <div className=\"relation-highlighter\">\n {/* Collapsible header */}\n <div className=\"relation-highlighter-header\" onClick={toggleCollapsed}>\n <h3 className=\"relation-highlighter-title\">\n Relations ({relations.length})\n </h3>\n <button \n className={`collapse-toggle ${isCollapsed ? 'collapsed' : ''}`}\n aria-label={isCollapsed ? 'Expand relations' : 'Collapse relations'}\n >\n ▼\n </button>\n </div>\n\n {/* Collapsible content */}\n <div className={`relation-highlighter-content ${isCollapsed ? 'collapsed' : ''}`}>\n {relations.length === 0 ? (\n <p className=\"no-relations\">No relations available</p>\n ) : (\n <ul className=\"relation-list\">\n {relations.map((relation) => (\n <li \n key={relation}\n className=\"relation-item\"\n onMouseEnter={(event) => handleRelationHover(event, relation)}\n onMouseLeave={() => handleRelationLeave(relation)}\n >\n {relation}\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n};"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/ErrorMessageModal/ErrorMessageModal.tsx","../src/components/ErrorMessageModal/ErrorMessageContainer.tsx","../src/layout/error-state.ts","../src/components/InstanceBuilder/InstanceBuilder.tsx","../src/components/ReplInterface/parsers/CoreParsers.ts","../src/data-instance/pyret/pyret-data-instance.ts","../src/components/ReplInterface/parsers/ExtensibleParsers.ts","../src/components/ReplInterface/ReplInterface.tsx","../src/components/ReplInterface/parsers/PyretExpressionParser.ts","../src/components/ReplInterface/parsers/PyretIdAllocationParser.ts","../src/components/ReplInterface/PyretReplInterface.tsx","../src/spec-editor/core/registry.ts","../src/spec-editor/core/id.ts","../src/spec-editor/core/yaml-codec.ts","../src/spec-editor/domain/domain-validation.ts","../src/spec-editor/core/diagnostics.ts","../src/spec-editor/core/spec-document.ts","../src/spec-editor/core/code-positioning.ts","../src/spec-editor/domain/domain-schema.ts","../src/spec-editor/domain/completions.ts","../src/spec-editor/ui/theme.ts","../src/spec-editor/ui/highlight.ts","../src/spec-editor/ui/use-anchored-popup.ts","../src/spec-editor/ui/SelectorField.tsx","../src/spec-editor/ui/FieldRenderer.tsx","../src/spec-editor/ui/CodeView.tsx","../src/spec-editor/ui/BuilderView.tsx","../src/spec-editor/ui/SuggestionsPanel.tsx","../src/spec-editor/ui/SpecEditor.tsx","../src/components/NoCodeView/shims.ts","../src/components/CndLayoutInterface.tsx","../src/components/ReplInterface/ReplWithVisualization.tsx","../src/components/ProjectionControls/ProjectionControls.tsx","../src/data-instance/projection-transform.ts","../src/components/ProjectionControls/ProjectionOrchestrator.tsx","../src/components/EvaluatorRepl/EvaluatorRepl.tsx","../src/components/RelationHighlighter/RelationHighlighter.tsx"],"names":["messages","sourceConstraints","diagramConstraints","useState","jsx","jsxs","t","args","atom","newId","useCallback","useMemo","useEffect","isRecord","yaml","align","Fragment","React","useRef","asString","asStringArray","topSeverity","useId","syntaxHighlighting","state","textInput"],"mappings":"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","file":"react.mjs","sourcesContent":["import React, { useMemo, useState } from 'react';\nimport './ErrorMessageModal.css';\nimport { ErrorMessages, SystemError, SelectorErrorDetail } from './index';\n\n/**\n * Props for ErrorMessageModal component\n * @public\n */\nexport interface ErrorMessageModalProps {\n /** Error object containing */\n systemError?: SystemError;\n /**\n * Optional id of a `webcola-cnd-graph` element. When provided, hovering a\n * conflicting constraint highlights the referenced nodes in that diagram\n * (via the graph's public `highlightNodes` / `clearNodeHighlights` API).\n */\n graphElementId?: string;\n}\n\n/** Constraint node with bidirectional relationships */\ntype ConstraintNode = {\n id: string;\n content: string;\n relatedIds: string[];\n};\n\n/** Highlight state tracking */\ntype HighlightState = {\n ids: string[];\n source: 'source' | 'diagram' | null;\n};\n\n/**\n * Modal component for displaying error messages in a structured format\n * Supports both constraint conflicts and parse errors\n * @public\n */\nexport const ErrorMessageModal: React.FC<ErrorMessageModalProps> = ({ systemError, graphElementId }: ErrorMessageModalProps) => {\n const [highlightState, setHighlightState] = useState<HighlightState>({ ids: [], source: null });\n const [collapsed, setCollapsed] = useState(false);\n\n /** Minimal shape of the graph element's node-highlighting API */\n type GraphHighlightElement = HTMLElement & {\n highlightNodes?: (nodeIds: string[]) => boolean;\n clearNodeHighlights?: () => boolean;\n };\n\n /**\n * Highlight the diagram nodes referenced inside a hovered constraint item.\n * Node references carry a `data-node-id` attribute (see formatNodeLabel), so\n * we read them straight from the rendered DOM rather than parsing text.\n */\n const highlightGraphNodesFrom = (el: HTMLElement) => {\n if (!graphElementId) return;\n const graph = document.getElementById(graphElementId) as GraphHighlightElement | null;\n if (!graph || typeof graph.highlightNodes !== 'function') return;\n const ids = Array.from(el.querySelectorAll('[data-node-id]'))\n .map(n => n.getAttribute('data-node-id'))\n .filter((id): id is string => !!id);\n if (ids.length > 0) graph.highlightNodes(Array.from(new Set(ids)));\n };\n\n /** Clear any diagram node highlights this modal applied */\n const clearGraphNodeHighlights = () => {\n if (!graphElementId) return;\n const graph = document.getElementById(graphElementId) as GraphHighlightElement | null;\n if (graph && typeof graph.clearNodeHighlights === 'function') graph.clearNodeHighlights();\n };\n\n /**\n * Scroll a hovered item's correspondence into view in the *other* column.\n * The two columns scroll independently, so this reveals the related item\n * without disturbing the column the cursor is over — hover a source\n * constraint and the diagram column scrolls to its correspondence.\n */\n const scrollRelatedIntoView = (el: HTMLElement, relatedIds: string[]) => {\n if (relatedIds.length === 0) return;\n const container = el.closest('.constraint-columns');\n const target = container?.querySelector(`[data-constraint-id=\"${relatedIds[0]}\"]`) as HTMLElement | null;\n // Feature-detect: scrollIntoView is absent in jsdom (tests) and some hosts\n if (target && typeof target.scrollIntoView === 'function') {\n target.scrollIntoView({ block: 'nearest' });\n }\n };\n\n /** Handle mouse enter for constraint highlighting */\n const handleMouseEnter = (e: React.MouseEvent<HTMLElement>, node: ConstraintNode, source: 'source' | 'diagram') => {\n setHighlightState({ ids: [node.id, ...node.relatedIds], source });\n highlightGraphNodesFrom(e.currentTarget);\n scrollRelatedIntoView(e.currentTarget, node.relatedIds);\n };\n\n /**\n * Clear highlighting on mouse leave\n */\n const handleMouseLeave = () => {\n setHighlightState({ ids: [], source: null });\n clearGraphNodeHighlights();\n };\n\n /** \n * Get CSS class for constraint highlighting \n */\n const getHighlightClass = (nodeId: string): string => {\n if (!highlightState.ids.includes(nodeId)) return '';\n return highlightState.source === 'source' ? 'highlight-source' : 'highlight-diagram';\n };\n\n // Validate systemError type\n const isOtherError = systemError && \n (systemError.type === 'parse-error' \n || systemError.type === 'general-error' \n || systemError.type === 'group-overlap-error'\n );\n const isPositionalError = systemError && (systemError.type === 'positional-error' || systemError.type === 'hidden-node-conflict') && systemError.messages;\n const isHiddenNodeError = systemError && systemError.type === 'hidden-node-conflict';\n const isSelectorError = systemError && systemError.type === 'selector-error' && systemError.errors?.length > 0;\n \n // If not a valid error, log error and return null\n if (!isOtherError && !isPositionalError && !isSelectorError) {\n console.error('Cannot display the following error:', systemError);\n return null;\n }\n\n /** Helper function to generate error header */\n const errorHeader = useMemo((): string => {\n const errorType = systemError.type;\n if (errorType === 'parse-error') {\n return `Parse Error ${systemError.source ? `(${systemError.source})` : ''}`;\n } else if (errorType === 'group-overlap-error') {\n return `Group Overlap Error ${systemError.source ? `(${systemError.source})` : ''}`;\n } else if (errorType === 'selector-error') {\n return `Selector Error${systemError.errors.length > 1 ? 's' : ''} (${systemError.errors.length})`;\n } else {\n return 'Error';\n }\n }, [systemError]);\n\n \n /** \n * Transform constraints map into structured data with bidirectional relationships \n */\n const constraintData = useMemo((): { sourceConstraints: ConstraintNode[]; diagramConstraints: ConstraintNode[] } => {\n const messages = isPositionalError ? systemError.messages : undefined;\n if (!messages) return { sourceConstraints: [], diagramConstraints: [] };\n\n function buildConstraintsMap(messages: ErrorMessages): Map<string, Set<string>> {\n const copy = new Map<string, Set<string>>();\n messages.minimalConflictingConstraints.forEach((value, key) => {\n if (!copy.has(key)) {\n copy.set(key, new Set());\n }\n value.forEach(val => copy.get(key)!.add(val));\n });\n\n // Add the source constraint itself\n if (!copy.has(messages.conflictingSourceConstraint)) {\n copy.set(messages.conflictingSourceConstraint, new Set([messages.conflictingConstraint]));\n } else {\n copy.get(messages.conflictingSourceConstraint)!.add(messages.conflictingConstraint);\n }\n\n return copy;\n }\n \n const constraintsMap = buildConstraintsMap(messages);\n const sourceConstraints: ConstraintNode[] = [];\n const diagramConstraints: ConstraintNode[] = [];\n const diagramMap = new Map<string, string>();\n \n // First pass to create diagram constraints with IDs\n [...constraintsMap.values()].forEach((constraints, groupIdx) => {\n [...constraints.values()].map((content, idx) => {\n const id = `diagram-${groupIdx}-${idx}`;\n diagramMap.set(content, id);\n diagramConstraints.push({ id, content, relatedIds: [] });\n });\n });\n \n // Second pass to create source constraints with relationships\n [...constraintsMap.entries()].forEach(([sourceContent, relatedContents], idx) => {\n const id = `source-${idx}`;\n const relatedIds = [...relatedContents.values()].map(content => diagramMap.get(content)!);\n \n sourceConstraints.push({ id, content: sourceContent, relatedIds });\n \n // Add back-references to diagram constraints\n relatedIds.forEach(relatedId => {\n const diagNode = diagramConstraints.find(d => d.id === relatedId);\n if (diagNode) diagNode.relatedIds.push(id);\n });\n });\n \n return { sourceConstraints, diagramConstraints };\n }, [systemError]);\n\n const { sourceConstraints, diagramConstraints } = constraintData;\n\n // Compute header and description based on error type\n const headerText = useMemo(() => {\n if (isSelectorError) return 'Selector Evaluation Error';\n if (isOtherError) return 'Error';\n if (isHiddenNodeError) return 'Hidden Node Conflict';\n return 'Could not satisfy all constraints';\n }, [isSelectorError, isOtherError, isHiddenNodeError]);\n\n const descriptionText = useMemo(() => {\n if (isSelectorError) return 'One or more selectors in your layout specification could not be evaluated.';\n if (isOtherError) return 'An error occurred while processing your data.';\n if (isHiddenNodeError) return 'Some constraints reference nodes that are hidden by a hideAtom directive. The conflicting constraints have been dropped from the layout.';\n return 'Your data causes the following visualization constraints to conflict.';\n }, [isSelectorError, isOtherError, isHiddenNodeError]);\n\n return (\n <div id=\"error-message-modal\" className=\"mt-3 d-flex flex-column overflow-x-auto p-3 rounded border border-danger border-2\">\n <div className=\"error-modal-header d-flex justify-content-between align-items-center\">\n <h4 className=\"mb-0\" style={{color: 'var(--bs-danger)'}}>{headerText}</h4>\n <button\n type=\"button\"\n className=\"error-modal-toggle\"\n aria-expanded={!collapsed}\n aria-label={collapsed ? 'Expand error details' : 'Collapse error details'}\n title={collapsed ? 'Expand error details' : 'Collapse error details'}\n onClick={() => setCollapsed(c => !c)}\n >\n {collapsed ? '▸' : '▾'}\n </button>\n </div>\n {!collapsed && (\n <>\n <p>{descriptionText}</p>\n {/* Parse/Generic/Group Error Card */}\n {isOtherError && (\n <>\n <div className=\"card error-card\">\n <div className=\"card-header bg-light\">\n <strong>\n { errorHeader }\n </strong>\n </div>\n <div className=\"card-body\">\n <code dangerouslySetInnerHTML={{ __html: systemError.message }}></code>\n </div>\n </div>\n </>\n )}\n\n {/* (Positional) Constraint Error Cards */}\n { isPositionalError && (\n <>\n <p id=\"hover-instructions\">Hover over the conflicting constraints to see the corresponding diagram elements that cannot be visualized. </p>\n <div className=\"constraint-relationship-table\">\n <div className=\"constraint-columns\">\n <div className=\"constraint-column\">\n <div className=\"constraint-column-header\">Source Constraints</div>\n <div className=\"constraint-column-body source-constraints-cell\">\n {sourceConstraints.map(node => (\n <div\n key={node.id}\n data-constraint-id={node.id}\n className={`constraint-item ${getHighlightClass(node.id)}`}\n onMouseEnter={(e) => handleMouseEnter(e, node, 'source')}\n onMouseLeave={handleMouseLeave}\n >\n <code dangerouslySetInnerHTML={{ __html: node.content }}></code>\n </div>\n ))}\n </div>\n </div>\n <div className=\"constraint-column\">\n <div className=\"constraint-column-header\">Diagram Elements</div>\n <div className=\"constraint-column-body diagram-constraints-cell\">\n {diagramConstraints.map(node => (\n <div\n key={node.id}\n data-constraint-id={node.id}\n className={`constraint-item ${getHighlightClass(node.id)}`}\n onMouseEnter={(e) => handleMouseEnter(e, node, 'diagram')}\n onMouseLeave={handleMouseLeave}\n >\n <code dangerouslySetInnerHTML={{ __html: node.content }}></code>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </>\n )}\n\n {/* Selector Error Cards */}\n {isSelectorError && (\n <>\n <div className=\"card error-card\">\n <div className=\"card-header bg-light\">\n <strong>{errorHeader}</strong>\n </div>\n <div className=\"card-body\">\n <p className=\"mb-2\">The following selectors failed to evaluate. Check your selector syntax.</p>\n <ul className=\"list-unstyled mb-0\">\n {systemError.errors.map((selectorError: SelectorErrorDetail, idx: number) => (\n <li key={idx} className=\"mb-2 p-2 bg-light rounded\">\n <div><strong>Selector:</strong> <code>{selectorError.selector}</code></div>\n <div><strong>Context:</strong> {selectorError.context}</div>\n <div className=\"text-danger\"><strong>Error:</strong> {selectorError.errorMessage}</div>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </>\n )}\n </>\n )}\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { ErrorMessageModal } from './ErrorMessageModal';\nimport { ErrorStateManager, type SystemError } from './ErrorStateManager';\n\n/**\n * Props for the ErrorMessageContainer component\n */\nexport interface ErrorMessageContainerProps {\n /** Error state manager instance */\n errorManager: ErrorStateManager;\n /** Additional CSS classes */\n className?: string;\n /**\n * Optional id of a `webcola-cnd-graph` element. When set, hovering a\n * conflicting constraint highlights the referenced nodes in that diagram.\n */\n graphElementId?: string;\n}\n\n/**\n * Container component that manages error message display\n * Handles both simple parse errors and complex constraint conflicts\n */\nexport const ErrorMessageContainer: React.FC<ErrorMessageContainerProps> = ({\n errorManager,\n className = '',\n graphElementId\n}) => {\n const [currentError, setCurrentError] = useState<SystemError | null>(\n errorManager.getCurrentError()\n );\n\n useEffect(() => {\n // Subscribe to error state changes\n const handleErrorChange = (error: SystemError | null) => {\n console.log('ErrorMessageContainer received error change:', error);\n setCurrentError(error);\n };\n errorManager.onErrorChange(handleErrorChange);\n console.log('ErrorMessageContainer subscribed to error changes');\n }, [errorManager]);\n\n console.log('ErrorMessageContainer rendering, currentError:', currentError);\n\n // Don't render anything if no error\n if (!currentError) {\n return null;\n }\n\n const containerClassName = `error-message-container ${className}`.trim();\n \n return (\n <div className={containerClassName}>\n <ErrorMessageModal\n systemError={currentError}\n graphElementId={graphElementId}\n />\n </div>\n );\n};\n\nexport default ErrorMessageContainer;","import type { ErrorMessages } from './constraint-types';\n\n/**\n * Error state shared between the layout engine and the (separately bundled)\n * error-modal UI. Lives in layout/ — not components/ — so that core modules\n * (e.g. layoutinstance.ts) can use these shapes without pulling any React\n * component code into the core bundle. The historical import path\n * `components/ErrorMessageModal/ErrorStateManager` re-exports everything here.\n */\n\n/**\n * Represents a single selector evaluation error.\n * Captures context about which selector failed and why.\n */\nexport interface SelectorErrorDetail {\n /** The selector expression that failed */\n selector: string;\n /** Context about where/why the selector was being evaluated (e.g., \"hideAtom selector\", \"attribute filter\") */\n context: string;\n /** The error message from the evaluation */\n errorMessage: string;\n}\n\n/**\n * Represents different types of errors that can occur in the system\n */\nexport type SystemError = {\n type: 'parse-error';\n message: string;\n source?: string;\n} | {\n type: 'positional-error';\n messages: ErrorMessages;\n} | {\n type: 'hidden-node-conflict';\n messages: ErrorMessages;\n} | {\n type: 'group-overlap-error'; // New type\n message: string;\n source?: string;\n} | {\n type: 'general-error';\n message: string;\n} | {\n type: 'selector-error';\n /** List of selector errors encountered during layout evaluation */\n errors: SelectorErrorDetail[];\n};\n\n/**\n * Minimal error state manager for handling different error types\n * Follows functional programming principles with immutable state\n */\nexport class ErrorStateManager {\n private currentError: SystemError | null = null;\n private errorCallbacks: ((error: SystemError | null) => void)[] = [];\n\n /**\n * Set the current error state\n * @param error - The error to set, or null to clear\n */\n public setError(error: SystemError | null): void {\n this.currentError = error;\n this.notifyCallbacks();\n }\n\n /**\n * Clear the current error state\n */\n public clearError(): void {\n this.currentError = null;\n this.notifyCallbacks();\n }\n\n /**\n * Get the current error state\n * @returns Current error or null if no error\n */\n public getCurrentError(): SystemError | null {\n return this.currentError;\n }\n\n /**\n * Subscribe to error state changes\n * @param callback - Function to call when error state changes\n */\n public onErrorChange(callback: (error: SystemError | null) => void): void {\n this.errorCallbacks.push(callback);\n }\n\n /**\n * Check if there's currently an error\n * @returns True if there's an active error\n */\n public hasError(): boolean {\n return this.currentError !== null;\n }\n\n /**\n * Notify all subscribed callbacks of error state change\n */\n private notifyCallbacks(): void {\n this.errorCallbacks.forEach(callback => callback(this.currentError));\n }\n}\n","import * as React from 'react';\nimport { useState, useCallback, useEffect } from 'react';\nimport { IAtom, IRelation, ITuple, IInputDataInstance } from '../../data-instance/interfaces';\nimport './InstanceBuilder.css';\n\n/**\n * Generate a unique atom ID based on existing atoms in the instance\n */\nfunction generateAtomId(instance: IInputDataInstance, typeName : string): string {\n const existingAtoms = instance.getAtoms();\n const existingIds = new Set(existingAtoms.map(atom => atom.id));\n \n let counter = 1;\n let candidateId = `${typeName}-${counter}`;\n \n while (existingIds.has(candidateId)) {\n counter++;\n candidateId = `${typeName}-${counter}`;\n }\n \n return candidateId;\n}\n\nexport interface InstanceBuilderProps {\n /** The data instance to build/modify - REQUIRED */\n instance: IInputDataInstance;\n /** Callback when the instance changes */\n onChange?: (instance: IInputDataInstance) => void;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** CSS class name for styling */\n className?: string;\n}\n\ninterface AtomForm {\n id: string;\n label: string;\n type: string;\n}\n\ninterface RelationForm {\n name: string;\n atomIds: string[]; // Changed from sourceId/targetId to support n-ary\n}\n\n/**\n * InstanceBuilder - A reusable React component for constructing IDataInstance objects\n * \n * Provides forms to add/remove atoms and relations, working directly with the provided instance.\n * The parent component is responsible for providing and managing the instance.\n */\nexport const InstanceBuilder: React.FC<InstanceBuilderProps> = ({\n instance,\n onChange,\n disabled = false,\n className = ''\n}) => {\n // Form state for adding atoms\n const [atomForm, setAtomForm] = useState<AtomForm>({\n id: '',\n label: '',\n type: 'Entity'\n });\n\n // Compute a suggested ID based on type and current atoms\n const suggestedId = generateAtomId(instance, atomForm.type.trim() || 'Entity');\n\n // Form state for adding relations - start with binary (2 atoms)\n const [relationForm, setRelationForm] = useState<RelationForm>({\n name: '',\n atomIds: ['', ''] // Start with binary relation\n });\n\n // Error state\n const [error, setError] = useState<string>('');\n\n // Get current atoms and relations from instance\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n\n // Notify parent when instance changes (optional callback)\n const notifyChange = useCallback(() => {\n if (onChange) {\n onChange(instance);\n }\n }, [instance, onChange]);\n\n /**\n * Add a new atom to the instance\n */\n const handleAddAtom = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n if (!atomForm.label.trim()) {\n setError('Atom label is required');\n return;\n }\n const typeInfo = atomForm.type.trim() || 'Entity';\n // Use user-provided ID if present, otherwise use suggested\n const id = atomForm.id.trim() || generateAtomId(instance, typeInfo);\n if (!id) {\n setError('Atom ID could not be generated');\n return;\n }\n // Check for duplicate ID\n if (instance.getAtoms().some(atom => atom.id === id)) {\n setError('Atom ID already exists');\n return;\n }\n try {\n const newAtom: IAtom = {\n id,\n label: atomForm.label.trim(),\n type: typeInfo\n };\n instance.addAtom(newAtom);\n setAtomForm({ id: '', label: '', type: 'Entity' });\n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add atom');\n }\n }, [atomForm, instance, notifyChange]);\n\n /**\n * Remove an atom from the instance\n */\n const handleRemoveAtom = useCallback((atomId: string) => {\n try {\n instance.removeAtom(atomId);\n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to remove atom');\n }\n }, [instance, notifyChange]);\n\n /**\n * Add a new atom position to the relation form\n */\n const handleAddAtomPosition = useCallback(() => {\n setRelationForm(prev => ({\n ...prev,\n atomIds: [...prev.atomIds, '']\n }));\n }, []);\n\n /**\n * Remove the last atom position from the relation form (minimum 2)\n */\n const handleRemoveAtomPosition = useCallback(() => {\n setRelationForm(prev => ({\n ...prev,\n atomIds: prev.atomIds.length > 2 ? prev.atomIds.slice(0, -1) : prev.atomIds\n }));\n }, []);\n\n /**\n * Update a specific atom ID in the relation form\n */\n const handleUpdateAtomId = useCallback((index: number, atomId: string) => {\n setRelationForm(prev => ({\n ...prev,\n atomIds: prev.atomIds.map((id, i) => i === index ? atomId : id)\n }));\n }, []);\n\n /**\n * Add a new relation tuple to the instance\n */\n const handleAddRelation = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n if (!relationForm.name.trim()) {\n setError('Relation name is required');\n return;\n }\n\n // Validate all atom positions are filled\n const cleanAtomIds = relationForm.atomIds.map(id => id.trim()).filter(id => id !== '');\n if (cleanAtomIds.length < 2) {\n setError('At least 2 atoms are required for a relation');\n return;\n }\n if (cleanAtomIds.length !== relationForm.atomIds.length) {\n setError('All atom positions must be selected');\n return;\n }\n\n try {\n const tuple: ITuple = {\n atoms: cleanAtomIds,\n types: cleanAtomIds.map(() => 'unknown') // Types will be inferred from actual atoms\n };\n\n instance.addRelationTuple(relationForm.name.trim(), tuple);\n setRelationForm({ name: '', atomIds: ['', ''] }); // Reset to binary\n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add relation');\n }\n }, [relationForm, instance, notifyChange]);\n\n /**\n * Remove a relation tuple from the instance\n */\n const handleRemoveRelationTuple = useCallback((relationId: string, tuple: ITuple) => {\n try {\n instance.removeRelationTuple(relationId, tuple);\n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to remove relation');\n }\n }, [instance, notifyChange]);\n\n /**\n * Clear all data from the instance\n */\n const handleClear = useCallback(() => {\n try {\n // Remove all atoms and relations from the current instance\n const atomIds = instance.getAtoms().map(atom => atom.id);\n atomIds.forEach(id => instance.removeAtom(id));\n \n const relationIds = instance.getRelations().map(rel => rel.id);\n relationIds.forEach(id => {\n const relation = instance.getRelations().find(r => r.id === id);\n if (relation) {\n relation.tuples.forEach(tuple => instance.removeRelationTuple(id, tuple));\n }\n });\n \n setError('');\n notifyChange();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to clear instance');\n }\n }, [instance, notifyChange]);\n\n // State for re-ify result\n const [reifyResult, setReifyResult] = useState<any>(null);\n\n // Handler for re-ify button\n const handleReify = useCallback(() => {\n // Debug: log the instance and its methods\n // eslint-disable-next-line no-console\n console.log('Instance in handleReify:', instance);\n // eslint-disable-next-line no-console\n console.log('typeof instance.reify:', typeof (instance as any).reify);\n if (typeof instance.reify === 'function') {\n try {\n const result = instance.reify();\n setReifyResult(result);\n } catch (err) {\n setReifyResult('Re-ify failed: ' + (err instanceof Error ? err.message : String(err)));\n }\n } else {\n setReifyResult('Re-ify not supported on this instance.');\n }\n }, [instance]);\n\n /**\n * Format tuple atoms for display with proper n-ary notation\n */\n const formatTupleDisplay = useCallback((tuple: ITuple): string => {\n if (tuple.atoms.length === 2) {\n return `${tuple.atoms[0]} → ${tuple.atoms[1]}`;\n }\n return `(${tuple.atoms.join(', ')})`;\n }, []);\n\n return (\n <div className={`instance-builder ${className}`}>\n <div className=\"instance-builder__header\">\n <h2>Instance Builder</h2>\n <div className=\"instance-builder__stats\">\n <span>{atoms.length} atoms</span>\n <span>{relations.reduce((sum, rel) => sum + rel.tuples.length, 0)} relations</span>\n </div>\n </div>\n\n {error && (\n <div className=\"instance-builder__error\">\n {error}\n <button \n type=\"button\" \n onClick={() => setError('')}\n aria-label=\"Clear error\"\n >\n ×\n </button>\n </div>\n )}\n\n <div className=\"instance-builder__content\">\n {/* Atom Management Section */}\n <section className=\"instance-builder__section\">\n <h3>Atoms</h3>\n \n {/* Add Atom Form */}\n <form onSubmit={handleAddAtom} className=\"instance-builder__form\">\n <div className=\"form-row\">\n <input\n type=\"text\"\n placeholder={`ID (suggested: ${suggestedId})`}\n value={atomForm.id}\n onChange={(e: any) => setAtomForm(prev => ({ ...prev, id: e.target.value }))}\n disabled={disabled}\n aria-label=\"Atom ID\"\n />\n <input\n type=\"text\"\n placeholder=\"Label\"\n value={atomForm.label}\n onChange={(e) => setAtomForm(prev => ({ ...prev, label: e.target.value }))}\n disabled={disabled}\n required\n />\n <input\n type=\"text\"\n placeholder=\"Type\"\n value={atomForm.type}\n onChange={(e) => setAtomForm(prev => ({ ...prev, type: e.target.value }))}\n disabled={disabled}\n />\n <button type=\"submit\" disabled={disabled}>\n Add Atom\n </button>\n </div>\n {atomForm.id === '' && (\n <div style={{ fontSize: '0.85em', color: '#888', marginTop: 2 }}>\n Suggested ID: <code>{suggestedId}</code>\n </div>\n )}\n </form>\n\n {/* Atoms List */}\n <div className=\"instance-builder__list\">\n {atoms.length === 0 ? (\n <p className=\"empty-state\">No atoms yet. Add one above.</p>\n ) : (\n atoms.map((atom) => (\n <div key={atom.id} className=\"list-item\">\n <div className=\"item-info\">\n <strong>{atom.id}</strong>\n <span className=\"item-label\">{atom.label}</span>\n <span className=\"item-type\">{atom.type}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => handleRemoveAtom(atom.id)}\n disabled={disabled}\n className=\"remove-button\"\n aria-label={`Remove atom ${atom.id}`}\n >\n Remove\n </button>\n </div>\n ))\n )}\n </div>\n </section>\n\n {/* Relation Management Section */}\n <section className=\"instance-builder__section\">\n <h3>Relations (N-ary Support)</h3>\n \n {/* Add Relation Form */}\n <form onSubmit={handleAddRelation} className=\"instance-builder__form\">\n <div className=\"form-row\">\n <input\n type=\"text\"\n placeholder=\"Relation Name\"\n value={relationForm.name}\n onChange={(e) => setRelationForm(prev => ({ ...prev, name: e.target.value }))}\n disabled={disabled}\n required\n />\n </div>\n \n {/* Dynamic atom selectors for n-ary relations */}\n <div className=\"relation-atoms\">\n <div style={{ fontSize: '0.9em', color: '#666', marginBottom: 8 }}>\n Atoms (arity: {relationForm.atomIds.length}):\n </div>\n {relationForm.atomIds.map((atomId, index) => (\n <div key={index} className=\"atom-selector\">\n <label style={{ fontSize: '0.85em', color: '#666' }}>\n Position {index + 1}:\n </label>\n <select\n value={atomId}\n onChange={(e) => handleUpdateAtomId(index, e.target.value)}\n disabled={disabled}\n required\n >\n <option value=\"\">Select Atom</option>\n {atoms.map(atom => (\n <option key={atom.id} value={atom.id}>\n {atom.id} ({atom.label})\n </option>\n ))}\n </select>\n </div>\n ))}\n \n {/* Add/Remove atom position buttons */}\n <div className=\"arity-controls\" style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={handleAddAtomPosition}\n disabled={disabled}\n style={{ marginRight: 8 }}\n >\n + Add Position\n </button>\n {relationForm.atomIds.length > 2 && (\n <button\n type=\"button\"\n onClick={handleRemoveAtomPosition}\n disabled={disabled}\n >\n - Remove Position\n </button>\n )}\n </div>\n </div>\n \n <div className=\"form-row\" style={{ marginTop: 12 }}>\n <button type=\"submit\" disabled={disabled || relationForm.atomIds.some(id => !id.trim())}>\n Add Relation\n </button>\n </div>\n </form>\n\n {/* Relations List */}\n <div className=\"instance-builder__list\">\n {relations.length === 0 ? (\n <p className=\"empty-state\">No relations yet. Add one above.</p>\n ) : (\n relations.map((relation) => (\n <div key={relation.id} className=\"relation-group\">\n <h4>{relation.name}</h4>\n {relation.tuples.map((tuple, tupleIndex) => (\n <div key={tupleIndex} className=\"list-item\">\n <div className=\"item-info\">\n <span>{formatTupleDisplay(tuple)}</span>\n <span className=\"item-type\" style={{ fontSize: '0.8em', color: '#666' }}>\n arity: {tuple.atoms.length}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => handleRemoveRelationTuple(relation.id, tuple)}\n disabled={disabled}\n className=\"remove-button\"\n aria-label={`Remove relation ${relation.name} tuple`}\n >\n Remove\n </button>\n </div>\n ))}\n </div>\n ))\n )}\n </div>\n </section>\n\n {/* Actions Section */}\n <section className=\"instance-builder__actions\">\n <button\n type=\"button\"\n onClick={handleClear}\n disabled={disabled}\n className=\"clear-button\"\n >\n Clear All\n </button>\n <button\n type=\"button\"\n onClick={handleReify}\n disabled={disabled}\n className=\"reify-button\"\n style={{ marginLeft: 8 }}\n >\n Re-ify\n </button>\n </section>\n {/* Re-ify Result Display */}\n {reifyResult !== null && (\n <section className=\"instance-builder__reify-result\" style={{ marginTop: 12, background: '#f8f8f8', border: '1px solid #eee', borderRadius: 4, padding: 10 }}>\n <strong>Re-ify Result:</strong>\n <pre style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0 }}>\n {typeof reifyResult === 'string' ? reifyResult : JSON.stringify(reifyResult, null, 2)}\n </pre>\n </section>\n )}\n </div>\n </div>\n );\n};\n","import { IAtom, ITuple, IInputDataInstance } from '../../../data-instance/interfaces';\n\n/**\n * Result of executing a command\n */\nexport interface CommandResult {\n success: boolean;\n message: string;\n action?: 'add' | 'remove' | 'info' | 'help';\n /** Extracted CnD specification (if any) from expressions with _cndspec method */\n extractedCndSpec?: string;\n}\n\n/**\n * Base interface for command parsers\n */\nexport interface ICommandParser {\n /**\n * Parse and execute a command\n * Can return either a synchronous result or a Promise for async operations\n */\n execute(command: string, instance: IInputDataInstance): CommandResult | Promise<CommandResult>;\n \n /**\n * Get help text for this parser\n */\n getHelp(): string[];\n \n /**\n * Check if this parser can handle the given command\n */\n canHandle(command: string): boolean;\n \n /**\n * Get the priority of this parser (higher number = higher priority)\n * Used to resolve conflicts when multiple parsers claim they can handle a command\n */\n getPriority(): number;\n \n /**\n * Get the command patterns this parser recognizes\n * Used for better debugging and maintainability\n */\n getCommandPatterns(): string[];\n}\n\n/**\n * Parser for remove commands (sugar syntax)\n * Supports:\n * - remove ID (remove atom by ID)\n * - remove Label:Type (remove atom by label and type)\n * - remove source.relation=target (remove specific relation tuple)\n * - remove relation (remove entire relation)\n */\nexport class RemoveCommandParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n return trimmed.startsWith('remove ') && trimmed.length > 7;\n }\n \n getPriority(): number {\n return 200; // Higher priority than other parsers to handle remove commands first\n }\n \n getCommandPatterns(): string[] {\n return [\n 'remove ID',\n 'remove Label:Type',\n 'remove source.relation=target',\n 'remove relation',\n 'remove Atom.REL',\n 'remove edge_id'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n const args = trimmed.substring(7); // Remove \"remove \" prefix\n \n try {\n // Pattern 1: remove source.relation=target (specific relation tuple)\n if (args.includes('.') && args.includes('=')) {\n return this.handleRemoveRelationTuple(args, instance);\n }\n \n // Pattern 2: remove Atom.REL (all relations of type REL from Atom)\n if (args.includes('.') && !args.includes('=')) {\n return this.handleRemoveAtomRelation(args, instance);\n }\n \n // Pattern 3: remove Label:Type (atom by label and type)\n if (args.includes(':') && !args.includes('->')) {\n return this.handleRemoveAtomByLabelType(args, instance);\n }\n \n // Pattern 4: remove edge_id (remove specific edge by ID)\n if (this.looksLikeEdgeId(args, instance)) {\n return this.handleRemoveEdgeById(args, instance);\n }\n \n // Pattern 5: remove ID (atom by ID) or relation (entire relation by name)\n // Try atom first, then fallback to relation\n if (/^[^\\s:->().]+$/.test(args)) {\n // Try to find atom first\n const atoms = instance.getAtoms();\n const atomToRemove = atoms.find(a => a.id === args);\n \n if (atomToRemove) {\n return this.handleRemoveAtomById(args, instance);\n } else {\n // No atom found, try relation\n const relations = instance.getRelations();\n const relationToRemove = relations.find(r => r.name === args);\n \n if (relationToRemove) {\n return this.handleRemoveRelation(args, instance);\n } else {\n // Neither atom nor relation found\n return {\n success: false,\n message: `Atom or relation not found: ${args}`\n };\n }\n }\n }\n \n return {\n success: false,\n message: `Invalid remove syntax: ${args}`\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to remove'\n };\n }\n }\n\n private handleRemoveAtomById(id: string, instance: IInputDataInstance): CommandResult {\n const atoms = instance.getAtoms();\n const atomToRemove = atoms.find(a => a.id === id);\n \n if (!atomToRemove) {\n return {\n success: false,\n message: `Atom not found with ID: ${id}`\n };\n }\n \n instance.removeAtom(atomToRemove.id);\n \n return {\n success: true,\n message: `[${atomToRemove.id}] Removed atom: ${atomToRemove.label}:${atomToRemove.type}`,\n action: 'remove'\n };\n }\n\n private handleRemoveAtomByLabelType(args: string, instance: IInputDataInstance): CommandResult {\n const [label, type] = args.split(':');\n const atoms = instance.getAtoms();\n const atomToRemove = atoms.find(a => a.label === label.trim() && a.type === type.trim());\n \n if (!atomToRemove) {\n return {\n success: false,\n message: `Atom not found: ${args}`\n };\n }\n \n instance.removeAtom(atomToRemove.id);\n \n return {\n success: true,\n message: `[${atomToRemove.id}] Removed atom: ${atomToRemove.label}:${atomToRemove.type}`,\n action: 'remove'\n };\n }\n\n private handleRemoveRelationTuple(args: string, instance: IInputDataInstance): CommandResult {\n const match = args.match(/^([^.]+)\\.([^=]+)=(.+)$/);\n if (!match) {\n return {\n success: false,\n message: `Invalid relation format: ${args}`\n };\n }\n \n const sourceId = match[1].trim();\n const relationName = match[2].trim();\n const targetId = match[3].trim();\n \n const relation = instance.getRelations().find(r => r.name === relationName);\n if (!relation) {\n return {\n success: false,\n message: `Relation '${relationName}' not found`\n };\n }\n \n const tuple = relation.tuples.find(t => \n t.atoms.length === 2 && \n t.atoms[0] === sourceId && \n t.atoms[1] === targetId\n );\n \n if (!tuple) {\n return {\n success: false,\n message: `Tuple not found: ${sourceId}.${relationName}=${targetId}`\n };\n }\n \n instance.removeRelationTuple(relationName, tuple);\n \n return {\n success: true,\n message: `[${sourceId}.${relationName}=${targetId}] Removed tuple: ${relationName}(${sourceId}, ${targetId})`,\n action: 'remove'\n };\n }\n\n private handleRemoveRelation(relationName: string, instance: IInputDataInstance): CommandResult {\n const relation = instance.getRelations().find(r => r.name === relationName);\n if (!relation) {\n return {\n success: false,\n message: `Relation '${relationName}' not found`\n };\n }\n \n const tupleCount = relation.tuples.length;\n relation.tuples.slice().forEach(tuple => {\n instance.removeRelationTuple(relationName, tuple);\n });\n \n return {\n success: true,\n message: `[${relationName}] Removed relation '${relationName}' (${tupleCount} tuples)`,\n action: 'remove'\n };\n }\n\n private handleRemoveAtomRelation(args: string, instance: IInputDataInstance): CommandResult {\n // Pattern: Atom.REL - remove all relations of type REL from Atom\n const match = args.match(/^([^.]+)\\.([^.]+)$/);\n if (!match) {\n return {\n success: false,\n message: `Invalid atom.relation syntax: ${args}`\n };\n }\n \n const [, atomId, relationName] = match;\n \n // Find the atom\n const atom = instance.getAtoms().find(a => a.id === atomId);\n if (!atom) {\n return {\n success: false,\n message: `Atom '${atomId}' not found`\n };\n }\n \n // Find the relation\n const relation = instance.getRelations().find(r => r.name === relationName);\n if (!relation) {\n return {\n success: false,\n message: `Relation '${relationName}' not found`\n };\n }\n \n // Remove all tuples where the atom appears as the first element (source)\n const originalTupleCount = relation.tuples.length;\n const tuplesToRemove = relation.tuples.filter(tuple => tuple.atoms[0] === atomId);\n \n if (tuplesToRemove.length === 0) {\n return {\n success: false,\n message: `No ${relationName} relations found for atom '${atomId}'`\n };\n }\n \n // Remove the tuples\n tuplesToRemove.forEach(tuple => {\n instance.removeRelationTuple(relationName, tuple);\n });\n \n return {\n success: true,\n message: `[${atomId}.${relationName}] Removed ${tuplesToRemove.length} ${relationName} relations from '${atomId}'`,\n action: 'remove'\n };\n }\n\n private looksLikeEdgeId(args: string, instance: IInputDataInstance): boolean {\n // Check if args looks like an edge ID by examining existing relations\n // Edge IDs typically have format like: relationName:atom1->atom2\n return args.includes(':') && args.includes('->');\n }\n\n private handleRemoveEdgeById(edgeId: string, instance: IInputDataInstance): CommandResult {\n // Parse edge ID format: relationName:atom1->atom2->...\n const colonIndex = edgeId.indexOf(':');\n if (colonIndex === -1) {\n return {\n success: false,\n message: `Invalid edge ID format: ${edgeId}. Expected format: relationName:atom1->atom2`\n };\n }\n \n const relationName = edgeId.substring(0, colonIndex);\n const atomChain = edgeId.substring(colonIndex + 1);\n const atoms = atomChain.split('->');\n \n // Find the relation\n const relation = instance.getRelations().find(r => r.name === relationName);\n if (!relation) {\n return {\n success: false,\n message: `Relation '${relationName}' not found`\n };\n }\n \n // Find the specific tuple with matching atoms\n const targetTuple = relation.tuples.find(tuple => \n tuple.atoms.length === atoms.length &&\n tuple.atoms.every((atomId, index) => atomId === atoms[index])\n );\n \n if (!targetTuple) {\n return {\n success: false,\n message: `Edge '${edgeId}' not found`\n };\n }\n \n // Remove the tuple\n instance.removeRelationTuple(relationName, targetTuple);\n \n return {\n success: true,\n message: `[${edgeId}] Removed edge: ${relationName}(${atoms.join(', ')})`,\n action: 'remove'\n };\n }\n\n getHelp(): string[] {\n return [\n 'Remove Commands (sugar syntax):',\n ' remove ID - Remove atom by ID',\n ' remove Label:Type - Remove atom by label and type',\n ' remove source.relation=target - Remove specific relation tuple',\n ' remove Atom.REL - Remove all REL relations from Atom',\n ' remove edge_id - Remove specific edge by ID',\n ' remove relation - Remove entire relation',\n '',\n 'Examples:',\n ' remove alice - Remove atom with ID \"alice\"',\n ' remove Alice:Person - Remove Alice:Person atom',\n ' remove alice.friend=bob - Remove friend(alice, bob) tuple',\n ' remove alice.friend - Remove all friend relations from alice',\n ' remove friend:alice->bob - Remove edge by ID',\n ' remove friend - Remove entire friend relation'\n ];\n }\n}\n\n/**\n * Parser for atom commands (sugar syntax only)\n * Supports implicit syntax that gets desugared to internal add operations:\n * - Label:Type\n * - id=Label:Type (explicit ID)\n */\nexport class AtomCommandParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // Exclude remove commands (handled by RemoveCommandParser)\n if (trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Exclude explicit add commands - everything is sugar syntax\n if (trimmed.startsWith('add ')) {\n return false;\n }\n \n // Exclude utility commands\n const utilityCommands = ['help', 'info', 'status', 'list', 'clear', 'reify'];\n if (utilityCommands.includes(trimmed.toLowerCase())) {\n return false;\n }\n \n // Exclude Pyret list commands (they start with [list:)\n if (trimmed.startsWith('[list:')) {\n return false;\n }\n \n // Exclude dot notation relation commands (x.relation=y)\n if (trimmed.includes('.') && trimmed.includes('=')) {\n return false;\n }\n \n // Exclude constructor notation relation commands (name(x,y))\n if (trimmed.includes('(') && trimmed.includes(')')) {\n return false;\n }\n \n // Pattern 1: Label:Type (implicit add - sugar syntax)\n if (/^[^:]+:.+$/.test(trimmed) && !trimmed.includes('->')) {\n return true;\n }\n \n // Pattern 2: id=Label:Type (implicit add - sugar syntax)\n if (/^[^=]+=.+:.+$/.test(trimmed) && !trimmed.includes('->')) {\n return true;\n }\n \n return false;\n }\n \n getPriority(): number {\n return 100; // Standard priority for core commands\n }\n \n getCommandPatterns(): string[] {\n return [\n 'Label:Type',\n 'id=Label:Type'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n \n // All commands are now implicit \"add\" - sugar syntax gets desugared to internal add\n return this.handleAdd(trimmed, instance);\n }\n\n private handleAdd(args: string, instance: IInputDataInstance): CommandResult {\n try {\n // Parse: Label:Type or id=Label:Type\n const match = args.match(/^(?:([^=]+)=)?([^:]+):(.+)$/);\n if (!match) {\n return {\n success: false,\n message: 'Invalid syntax. Use: add Label:Type or add id=Label:Type'\n };\n }\n\n const [, explicitId, label, type] = match;\n const atomLabel = label.trim();\n const atomType = type.trim();\n\n if (!atomLabel || !atomType) {\n return {\n success: false,\n message: 'Label and type cannot be empty'\n };\n }\n\n // Generate ID: Use explicit ID if provided, otherwise try to use the label as the ID\n let atomId = explicitId?.trim() || this.generateAtomId(atomLabel, instance);\n\n const atom: IAtom = {\n id: atomId,\n label: atomLabel,\n type: atomType\n };\n\n instance.addAtom(atom);\n \n // Show ID on the left for easy referencing\n let message: string;\n if (explicitId?.trim()) {\n // Explicit ID provided: show ID prominently on the left\n message = `[${atomId}] Added atom: ${atomLabel}:${atomType}`;\n } else {\n // Generated ID: show ID prominently on the left\n message = `[${atomId}] Added atom: ${atomLabel}:${atomType}`;\n }\n \n return {\n success: true,\n message,\n action: 'add'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to add atom'\n };\n }\n }\n\n\n private generateAtomId(candidateId: string, instance: IInputDataInstance): string {\n const existingIds = new Set(instance.getAtoms().map(a => a.id));\n\n // If the candidate ID doesn't exist, return it as is\n if (!existingIds.has(candidateId)) {\n return candidateId;\n }\n\n // Append a number to the candidate ID until a unique ID is found\n let counter = 1;\n let uniqueId = `${candidateId}$${counter}`;\n while (existingIds.has(uniqueId)) {\n counter++;\n uniqueId = `${candidateId}$${counter}`;\n }\n\n return uniqueId;\n}\n\n getHelp(): string[] {\n return [\n 'Atom Commands (sugar syntax):',\n ' Label:Type - Add atom with generated ID',\n ' id=Label:Type - Add atom with explicit ID',\n '',\n 'Examples:',\n ' Alice:Person - Creates [Alice] Alice:Person',\n ' p1=Alice:Person - Creates [p1] Alice:Person', \n '',\n 'Note: IDs are shown in [brackets] for easy referencing',\n 'All syntax is sugar that gets desugared to internal operations'\n ];\n }\n}\n\n\n\n/**\n * Parser for batch/multiple commands in one line\n * Supports:\n * - Multiple atoms: add Alice:Person, Bob:Person, Charlie:Person\n * - Atoms + relations: add Alice:Person; add Bob:Person; add friends:Alice->Bob\n * - Mixed operations with semicolon separators\n */\nexport class BatchCommandParser implements ICommandParser {\n private atomParser = new AtomCommandParser();\n private dotRelationParser = new DotNotationRelationParser();\n\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // Look for comma-separated atoms: add Type1:Label1, Type2:Label2, ...\n if (this.isCommaSeperatedAtoms(trimmed)) {\n return true;\n }\n \n // Look for semicolon-separated commands: add Alice:Person; add Bob:Person; add friends:Alice->Bob\n if (trimmed.includes(';')) {\n const subCommands = trimmed.split(';').map(cmd => cmd.trim()).filter(cmd => cmd);\n // Check if at least one subcommand can be handled by existing parsers\n return subCommands.length >= 2 && \n subCommands.some(cmd => \n this.atomParser.canHandle(cmd) || this.dotRelationParser.canHandle(cmd)\n );\n }\n \n return false;\n }\n \n private isCommaSeperatedAtoms(command: string): boolean {\n // No more explicit add commands - disable comma-separated atoms feature\n // to maintain sugar-only syntax\n return false;\n }\n \n getPriority(): number {\n return 115; // Higher than individual parsers to catch batch commands first\n }\n \n getCommandPatterns(): string[] {\n return [\n 'Alice:Person; bob=Bob:Person; alice.friend=bob'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n \n try {\n // Handle semicolon-separated commands (sugar syntax only)\n if (trimmed.includes(';')) {\n return this.handleSemicolonSeperatedCommands(trimmed, instance);\n }\n \n return {\n success: false,\n message: 'Unable to parse batch command'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to execute batch command'\n };\n }\n }\n\n\n\n private handleSemicolonSeperatedCommands(command: string, instance: IInputDataInstance): CommandResult {\n const subCommands = command.split(';').map(cmd => cmd.trim()).filter(cmd => cmd);\n \n const results: string[] = [];\n const errors: string[] = [];\n let successCount = 0;\n let addCount = 0;\n let removeCount = 0;\n \n for (const subCommand of subCommands) {\n try {\n let result: CommandResult | null = null;\n \n // Try atom parser first\n if (this.atomParser.canHandle(subCommand)) {\n result = this.atomParser.execute(subCommand, instance);\n }\n // Then try dot notation relation parser\n else if (this.dotRelationParser.canHandle(subCommand)) {\n result = this.dotRelationParser.execute(subCommand, instance);\n }\n \n if (result) {\n if (result.success) {\n results.push(result.message);\n successCount++;\n if (result.action === 'add') addCount++;\n if (result.action === 'remove') removeCount++;\n } else {\n errors.push(`\"${subCommand}\": ${result.message}`);\n }\n } else {\n errors.push(`\"${subCommand}\": No parser can handle this command`);\n }\n } catch (error) {\n errors.push(`\"${subCommand}\": ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n \n const actionSummary = [];\n if (addCount > 0) actionSummary.push(`${addCount} added`);\n if (removeCount > 0) actionSummary.push(`${removeCount} removed`);\n \n if (successCount === subCommands.length) {\n return {\n success: true,\n message: `Batch command completed (${actionSummary.join(', ')}):\\n${results.join('\\n')}`,\n action: addCount > 0 ? 'add' : (removeCount > 0 ? 'remove' : 'info')\n };\n } else if (successCount > 0) {\n return {\n success: true,\n message: `Batch command partially completed (${successCount}/${subCommands.length} commands):\\n\\nSuccessful:\\n${results.join('\\n')}\\n\\nErrors:\\n${errors.join('\\n')}`,\n action: addCount > 0 ? 'add' : (removeCount > 0 ? 'remove' : 'info')\n };\n } else {\n return {\n success: false,\n message: `Batch command failed:\\n${errors.join('\\n')}`\n };\n }\n }\n\n getHelp(): string[] {\n return [\n 'Batch Commands (sugar syntax):',\n ' command1; command2; command3 - Execute multiple sugar commands',\n '',\n 'Examples:',\n ' Alice:Person; bob=Bob:Person; alice.friend=bob',\n ' 1:Number; 2:Number; 3:Number',\n '',\n 'Note: Semicolon-separated commands support any mix of atom/relation sugar syntax'\n ];\n }\n}\n\n/**\n * Parser for dot notation relation commands (Pyret style - sugar syntax only)\n * Supports:\n * - source.relation=target (binary relations only)\n */\nexport class DotNotationRelationParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // Exclude remove commands (handled by RemoveCommandParser)\n if (trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Exclude explicit add commands - everything is sugar syntax\n if (trimmed.startsWith('add ')) {\n return false;\n }\n \n // Handle implicit \"add\" with dot notation - sugar syntax\n if (trimmed.includes('.') && trimmed.includes('=')) {\n return /^[^.]+\\.[^=]+=.+$/.test(trimmed);\n }\n \n return false;\n }\n \n getPriority(): number {\n return 115; // Higher priority than standard relation parser due to specific dot notation\n }\n \n getCommandPatterns(): string[] {\n return [\n 'source.relation=target'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n \n // All commands are now implicit \"add\" - sugar syntax gets desugared to internal add\n return this.handleAdd(trimmed, instance);\n }\n\n private handleAdd(args: string, instance: IInputDataInstance): CommandResult {\n try {\n // Parse: source.relation=target\n const match = args.match(/^([^.]+)\\.([^=]+)=(.+)$/);\n if (!match) {\n return {\n success: false,\n message: 'Invalid syntax. Use: source.relation=target'\n };\n }\n\n const sourceId = match[1].trim();\n const relationName = match[2].trim();\n const targetId = match[3].trim();\n \n if (!sourceId || !relationName || !targetId) {\n return {\n success: false,\n message: 'Source, relation, and target cannot be empty'\n };\n }\n\n // Validate atoms exist\n const existingAtoms = instance.getAtoms();\n const existingAtomIds = new Set(existingAtoms.map(a => a.id));\n \n if (!existingAtomIds.has(sourceId)) {\n return {\n success: false,\n message: `Source atom '${sourceId}' does not exist`\n };\n }\n \n if (!existingAtomIds.has(targetId)) {\n return {\n success: false,\n message: `Target atom '${targetId}' does not exist`\n };\n }\n\n // Create tuple for binary relation\n const sourceAtom = existingAtoms.find(a => a.id === sourceId)!;\n const targetAtom = existingAtoms.find(a => a.id === targetId)!;\n \n const tuple: ITuple = {\n atoms: [sourceId, targetId],\n types: [sourceAtom.type, targetAtom.type]\n };\n\n instance.addRelationTuple(relationName, tuple);\n \n return {\n success: true,\n message: `[${sourceId}.${relationName}=${targetId}] Added relation: ${relationName}(${sourceId}, ${targetId})`,\n action: 'add'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to add relation'\n };\n }\n }\n\n\n\n getHelp(): string[] {\n return [\n 'Dot Notation Relation Commands (sugar syntax):',\n ' source.relation=target - Add binary relation',\n '',\n 'Examples:',\n ' alice.friend=bob - Creates friend(alice, bob)',\n ' alice.knows=charlie - Creates knows(alice, charlie)',\n '',\n 'Note: Atoms must exist before creating relations',\n 'All syntax is sugar that gets desugared to internal operations'\n ];\n }\n}","import { Graph } from 'graphlib';\nimport { IDataInstance, IInputDataInstance, IAtom, IRelation, ITuple, IType, DataInstanceEventType, DataInstanceEventListener, DataInstanceEvent } from '../interfaces';\n\n/**\n * Configuration options for primitive value idempotency in PyretDataInstance\n */\nexport interface PyretInstanceOptions {\n /** Whether to make string values idempotent (reuse atoms for same string values) */\n stringsIdempotent?: boolean;\n /** Whether to make number values idempotent (reuse atoms for same number values) */\n numbersIdempotent?: boolean;\n /** Whether to make boolean values idempotent (reuse atoms for same boolean values) */\n booleansIdempotent?: boolean;\n /** Whether to include function/method fields in parsing */\n showFunctions?: boolean;\n}\n\n/**\n * Result of evaluating a Pyret expression\n */\ninterface PyretEvaluationResult {\n /** The raw Pyret JS value (if successful) */\n result?: unknown;\n /** Exception information (if failed) */\n exn?: unknown;\n /** Whether the evaluation was successful */\n success?: boolean;\n}\n\n/** Global constructor cache entry with pattern and instantiation priority */\ninterface ConstructorCacheEntry {\n pattern: string[];\n instantiation: number;\n}\n\nexport function generateEdgeId(\n relation: IRelation,\n tuple: ITuple\n): string {\n\n const relationId = relation.id;\n const atoms = tuple.atoms;\n return `${relationId}:${atoms.join('->')}`;\n}\n\n/**\n * Pyret data instance implementation for parsing Pyret runtime objects\n * \n * Handles Pyret's object representation where:\n * - Objects have a `dict` property containing field values\n * - Objects have a `brands` property indicating their type\n * - All dict entries are treated as relations\n * - Pyret tables are parsed as semantic relations: each row becomes an n-ary tuple\n * - Non-table arrays are parsed as relations with Array atoms\n * - Nested arrays are supported with intermediate Array atoms\n * - Cycles are handled gracefully without infinite recursion\n * - Primitive idempotency is configurable via constructor options\n * \n * @example\n * ```typescript\n * // Tree data\n * const pyretData = {\n * dict: { value: 11, left: {...}, right: {...} },\n * brands: { \"$brandtnode989\": true }\n * };\n * const instance1 = new PyretDataInstance(pyretData);\n * \n * // Table data - creates semantic relational tuples\n * const tableData = {\n * dict: {\n * r: {\n * dict: {\n * \"_header-raw-array\": [\"origin\", \"destination\"],\n * \"_rows-raw-array\": [[\"PVD\", \"ORD\"], [\"ORD\", \"PVD\"]]\n * },\n * brands: { \"$brandtable168\": true }\n * }\n * }\n * };\n * const instance2 = new PyretDataInstance(tableData);\n * // Creates relation \"row\" with tuples: (PVD, ORD), (ORD, PVD)\n * \n * // Custom idempotency settings\n * const instance3 = new PyretDataInstance(pyretData, {\n * stringsIdempotent: false, // Different string instances won't be unified\n * numbersIdempotent: true, // Same numbers will be unified\n * booleansIdempotent: true // Same booleans will be unified\n * });\n * ```\n */\nexport class PyretDataInstance implements IInputDataInstance {\n\n private atoms = new Map<string, IAtom>();\n private relations = new Map<string, IRelation>();\n private types = new Map<string, IType>();\n private objectToAtomId = new WeakMap<object, string>();\n private atomCounter = 0;\n\n /** Map to keep track of label counts per type */\n private typeLabelCounters = new Map<string, number>();\n\n /** Map to store the original Pyret objects with their dict key order */\n private originalObjects = new Map<string, PyretObject>();\n\n /** Event listeners for data instance changes */\n private eventListeners = new Map<DataInstanceEventType, Set<DataInstanceEventListener>>();\n\n /** Configuration options for primitive handling */\n private readonly options: Required<PyretInstanceOptions>;\n\n /** Global map to store constructor patterns and field order for types across all instances */\n private static globalConstructorCache = new Map<string, ConstructorCacheEntry>();\n\n /** Global counter for instantiation priority - higher numbers mean newer/higher priority */\n private static instantiationCounter = 0;\n\n /** Optional external Pyret evaluator for enhanced features */\n private externalEvaluator: any | null = null;\n\n /*\n TODO: List handling\n - Pyret Tables are now parsed as semantic relations (each row becomes an n-ary tuple)\n - Non-table arrays are parsed as structural relations with Array atoms\n - Native Pyret Lists still show as (link (link (link (link )))) etc. and need special handling\n */\n\n\n /**\n * Creates a PyretDataInstance from a Pyret runtime object\n * \n * @param pyretData - The root Pyret object to parse, or null/undefined for an empty instance\n * @param options - Configuration options for primitive handling and other behaviors\n * @param externalEvaluator - Optional external Pyret evaluator for enhanced features\n */\n constructor(pyretData?: PyretObject | null, options: PyretInstanceOptions = {}, externalEvaluator?: any) {\n // Set default options with primitives idempotent by default\n this.options = {\n stringsIdempotent: options.stringsIdempotent ?? true,\n numbersIdempotent: options.numbersIdempotent ?? true,\n booleansIdempotent: options.booleansIdempotent ?? true,\n showFunctions: options.showFunctions ?? false,\n };\n \n this.externalEvaluator = externalEvaluator || null;\n this.initializeBuiltinTypes();\n if (pyretData) {\n this.parseObjectIteratively(pyretData);\n }\n }\n\n /**\n * Set an external Pyret evaluator for enhanced features\n * @param evaluator - External Pyret evaluator (e.g., window.__internalRepl)\n */\n setExternalEvaluator(evaluator: any): void {\n this.externalEvaluator = evaluator;\n }\n\n /**\n * Get the current external evaluator\n */\n getExternalEvaluator(): any | null {\n return this.externalEvaluator;\n }\n\n /**\n * Get the current primitive idempotency configuration\n */\n getOptions(): Required<PyretInstanceOptions> {\n return { ...this.options };\n }\n\n /**\n * Cache constructor field order for a type when we successfully parse an original object\n * This now uses a global cache with instantiation-based priority where newer patterns\n * can override older ones for the same constructor name\n */\n private cacheConstructorPattern(typeName: string, fieldOrder: string[]): void {\n if (fieldOrder.length === 0) return;\n\n const currentEntry = PyretDataInstance.globalConstructorCache.get(typeName);\n const newInstantiation = ++PyretDataInstance.instantiationCounter;\n\n // Always cache if no entry exists, or if we want to allow newer patterns to override\n // For now, we always update to give priority to newer constructor patterns\n if (!currentEntry || newInstantiation > currentEntry.instantiation) {\n PyretDataInstance.globalConstructorCache.set(typeName, {\n pattern: [...fieldOrder],\n instantiation: newInstantiation\n });\n }\n }\n\n /**\n * Get cached constructor pattern for a type from the global cache\n */\n private getCachedConstructorPattern(typeName: string): string[] | null {\n const entry = PyretDataInstance.globalConstructorCache.get(typeName);\n return entry ? entry.pattern : null;\n }\n\n /**\n * Get the global constructor cache (for debugging or advanced use cases)\n * Returns a map of type names to their patterns\n */\n static getGlobalConstructorCache(): Map<string, string[]> {\n const result = new Map<string, string[]>();\n for (const [typeName, entry] of PyretDataInstance.globalConstructorCache) {\n result.set(typeName, [...entry.pattern]);\n }\n return result;\n }\n\n /**\n * Get the global constructor cache with instantiation info (for debugging)\n * Returns the raw cache with instantiation numbers\n */\n static getGlobalConstructorCacheWithPriority(): Map<string, ConstructorCacheEntry> {\n return new Map(PyretDataInstance.globalConstructorCache);\n }\n\n /**\n * Clear the global constructor cache (for testing or reset scenarios)\n */\n static clearGlobalConstructorCache(): void {\n PyretDataInstance.globalConstructorCache.clear();\n }\n\n /**\n * Creates a PyretDataInstance from a Pyret expression.\n * \n * @param expr - The Pyret expression to evaluate.\n * @param options - Configuration options for primitive handling and other behaviors\n * @param externalEvaluator - External Pyret evaluator with a `run` method for enhanced features.\n * @returns A new PyretDataInstance created from the evaluated expression.\n * @throws {Error} If the expression cannot be evaluated or parsed.\n */\n static async fromExpression(\n expr: string, \n options: PyretInstanceOptions = {},\n externalEvaluator: { run: (code: string) => Promise<unknown> }\n ): Promise<PyretDataInstance> {\n // Evaluate the expression using the external evaluator\n const evaluationResult = await PyretDataInstance.evaluateExpression(expr, externalEvaluator);\n\n if (!evaluationResult.success) {\n throw new Error(`Failed to evaluate Pyret expression: ${PyretDataInstance.formatError(evaluationResult.exn)}`);\n }\n\n // Check if the result is a primitive value\n if (PyretDataInstance.isPrimitive(evaluationResult.result)) {\n // Create a new instance and add the primitive as an atom\n const instance = new PyretDataInstance(null, options, externalEvaluator);\n \n const atomType = typeof evaluationResult.result === 'string' ? 'String' :\n typeof evaluationResult.result === 'number' ? 'Number' : 'Boolean';\n \n const primitiveAtom = {\n id: `result_${evaluationResult.result}`,\n label: String(evaluationResult.result),\n type: atomType\n };\n \n instance.addAtom(primitiveAtom);\n return instance;\n }\n\n // For complex objects, create a PyretDataInstance directly from the result\n return new PyretDataInstance(evaluationResult.result as PyretObject, options, externalEvaluator);\n }\n\n /**\n * Evaluates a Pyret expression using an external evaluator\n * \n * @param expr - The Pyret expression to evaluate\n * @param externalEvaluator - External Pyret evaluator with a `run` method\n * @returns Promise resolving to evaluation result\n */\n private static async evaluateExpression(\n expr: string,\n externalEvaluator: { run: (code: string) => Promise<unknown> }\n ): Promise<PyretEvaluationResult> {\n try {\n const result = await externalEvaluator.run(expr);\n\n // Step 1: Look for \"exn\" key at any level - if found, it's a failure\n const exnValue = PyretDataInstance.findKeyAtAnyLevel(result, 'exn');\n if (exnValue !== undefined) {\n return {\n success: false,\n exn: exnValue,\n };\n }\n \n // Step 2: Look for \"answer\" key at any level - if found, process it\n const answerValue = PyretDataInstance.findKeyAtAnyLevel(result, 'answer');\n if (answerValue !== undefined) {\n return {\n success: true,\n result: answerValue,\n };\n }\n\n // Step 3: Check if the result is a primitive value directly\n if (PyretDataInstance.isPrimitive(result)) {\n return {\n success: true,\n result: result,\n };\n }\n\n // If we can't find an answer or exn, return failure\n return {\n success: false,\n exn: 'Unable to find answer or exn in evaluation result',\n };\n \n } catch (error) {\n return {\n success: false,\n exn: error instanceof Error ? error.message : 'Unknown evaluation error',\n };\n }\n }\n\n /**\n * Recursively searches for a key at any level in an object\n */\n private static findKeyAtAnyLevel(obj: unknown, keyName: string): unknown {\n if (!obj || typeof obj !== 'object') {\n return undefined;\n }\n \n // Check if this object has the key directly\n if (keyName in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[keyName];\n }\n \n // Recursively search in nested objects and arrays\n for (const value of Object.values(obj as Record<string, unknown>)) {\n if (value && typeof value === 'object') {\n const found = PyretDataInstance.findKeyAtAnyLevel(value, keyName);\n if (found !== undefined) {\n return found;\n }\n }\n }\n \n return undefined;\n }\n\n /**\n * Checks if a value is a primitive type (string, number, boolean)\n */\n private static isPrimitive(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n /**\n * Format Pyret evaluation errors for display\n */\n private static formatError(error: any): string {\n if (!error) {\n return 'Unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (typeof error === 'object' && error !== null) {\n // Try to extract useful error information from Pyret error objects\n const errorObj = error;\n\n if (errorObj.message) {\n return errorObj.message;\n }\n\n if (errorObj.toString && typeof errorObj.toString === 'function') {\n return errorObj.toString();\n }\n }\n\n return String(error);\n }\n\n /**\n * Try to rebuild constructor arguments from relations using cached patterns\n * Only uses patterns from previously seen constructor instances - no heuristics\n */\n private tryReconstructFromRelations(atom: IAtom, visited: Set<string>): string {\n // Get all relations where this atom is the source\n const relationMap = new Map<string, string[]>();\n this.relations.forEach(relation => {\n relation.tuples.forEach(tuple => {\n if (tuple.atoms.length >= 2 && tuple.atoms[0] === atom.id) {\n const relationName = relation.name;\n if (!relationMap.has(relationName)) {\n relationMap.set(relationName, []);\n }\n // Skip the source atom, collect target atoms\n relationMap.get(relationName)!.push(...tuple.atoms.slice(1));\n }\n });\n });\n\n if (relationMap.size === 0) {\n return atom.type; // No relations, just return the type name\n }\n\n // Try to use cached constructor pattern from previously seen instances\n const cachedPattern = this.getCachedConstructorPattern(atom.type);\n if (cachedPattern) {\n const args: string[] = [];\n for (const fieldName of cachedPattern) {\n const targetIds = relationMap.get(fieldName) || [];\n for (const targetId of targetIds) {\n args.push(this.reifyAtom(targetId, visited));\n }\n }\n if (args.length > 0) {\n return `${atom.type}(${args.join(', ')})`;\n }\n }\n\n // If no cached pattern, try to infer from other instances of the same type\n // Look for other atoms of the same type that have original objects\n const sameTypeAtoms = Array.from(this.atoms.values()).filter(a => a.type === atom.type);\n for (const sameTypeAtom of sameTypeAtoms) {\n const originalObj = this.originalObjects.get(sameTypeAtom.id);\n if (originalObj && originalObj.dict) {\n const orderedKeys = Object.keys(originalObj.dict);\n this.cacheConstructorPattern(atom.type, orderedKeys);\n\n // Now try again with the cached pattern\n const args: string[] = [];\n for (const fieldName of orderedKeys) {\n const targetIds = relationMap.get(fieldName) || [];\n for (const targetId of targetIds) {\n args.push(this.reifyAtom(targetId, visited));\n }\n }\n if (args.length > 0) {\n return `${atom.type}(${args.join(', ')})`;\n }\n break; // Only need to check one instance since constructors are nominal\n }\n }\n\n // Final fallback: use sorted field order but print an error\n console.error(`[PyretDataInstance] Could not determine constructor pattern for type '${atom.type}'. Falling back to sorted field order.`);\n\n const relationNames = Array.from(relationMap.keys()).sort(); // Sort for consistency\n const args: string[] = [];\n\n for (const relationName of relationNames) {\n const targetIds = relationMap.get(relationName) || [];\n for (const targetId of targetIds) {\n args.push(this.reifyAtom(targetId, visited));\n }\n }\n\n if (args.length > 0) {\n return `${atom.type}(${args.join(', ')})`;\n }\n\n return atom.type; // Last resort: just the type name\n }\n hasExternalEvaluator(): boolean {\n return this.externalEvaluator !== null;\n }\n addEventListener(type: DataInstanceEventType, listener: DataInstanceEventListener): void {\n if (!this.eventListeners.has(type)) {\n this.eventListeners.set(type, new Set());\n }\n this.eventListeners.get(type)!.add(listener);\n }\n\n /**\n * Remove an event listener for data instance changes\n */\n removeEventListener(type: DataInstanceEventType, listener: DataInstanceEventListener): void {\n const listeners = this.eventListeners.get(type);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * Emit an event to all registered listeners\n */\n private emitEvent(event: DataInstanceEvent): void {\n const listeners = this.eventListeners.get(event.type);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(event);\n } catch (error) {\n console.error('Error in data instance event listener:', error);\n }\n });\n }\n }\n\n /**\n * Adds an atom to the instance, updating types accordingly.\n * If the atom already exists, it is replaced.\n * @param atom - The atom to add\n */\n addAtom(atom: IAtom): void {\n this.atoms.set(atom.id, atom);\n this.ensureTypeExists(atom.type);\n const type = this.types.get(atom.type);\n if (type && !type.atoms.some(a => a.id === atom.id)) {\n type.atoms.push(atom);\n }\n\n // Emit event\n this.emitEvent({\n type: 'atomAdded',\n data: { atom }\n });\n }\n\n /**\n * Removes an atom by id, and removes it from all types and relations.\n * @param id - The atom id to remove\n */\n removeAtom(id: string): void {\n const removedAtom = this.atoms.get(id);\n this.atoms.delete(id);\n\n // Remove from types\n this.types.forEach(type => {\n type.atoms = type.atoms.filter(atom => atom.id !== id);\n });\n\n // Remove from all relation tuples\n this.relations.forEach(relation => {\n relation.tuples = relation.tuples.filter(tuple => !tuple.atoms.includes(id));\n });\n\n // Emit event if atom was found\n if (removedAtom) {\n this.emitEvent({\n type: 'atomRemoved',\n data: { atomId: id }\n });\n }\n }\n\n\n removeRelationTuple(relationId: string, t: ITuple): void {\n\n // How would we do this?\n const relation = this.relations.get(relationId);\n if (relation) {\n const oldLength = relation.tuples.length;\n relation.tuples = relation.tuples.filter(tuple =>\n !tuple.atoms.every((atomId, index) => atomId === t.atoms[index])\n );\n\n // Emit event if tuple was actually removed\n if (relation.tuples.length < oldLength) {\n this.emitEvent({\n type: 'relationTupleRemoved',\n data: { relationId, tuple: t }\n });\n }\n }\n }\n\n /**\n * Converts the current data instance back to Pyret constructor notation\n * \n * If an external evaluator is available, it may provide enhanced type information\n * for more accurate reification in the future.\n * \n * @returns A string representation of the data in Pyret constructor syntax\n * \n * @example\n * ```typescript\n * const pyretCode = instance.reify();\n * ```\n */\n reify(): string {\n let result = '';\n\n\n // TODO: This is still broken. Need to understand what is going on here!!\n\n // Find referenced atoms\n const referencedAtoms = new Set<string>();\n this.relations.forEach(relation => {\n relation.tuples.forEach(tuple => {\n for (let i = 1; i < tuple.atoms.length; i++) {\n referencedAtoms.add(tuple.atoms[i]);\n }\n });\n });\n\n // Identify root atoms (not referenced by others, including builtins)\n const rootAtoms = Array.from(this.atoms.values()).filter(atom => !referencedAtoms.has(atom.id));\n\n if (rootAtoms.length === 0) {\n return result + \"# No root atoms found\";\n }\n\n // If multiple roots, wrap in a Pyret set\n if (rootAtoms.length > 1) {\n const rootExpressions = rootAtoms.map(atom => this.reifyAtom(atom.id, new Set()));\n return result + `[list-set: ${rootExpressions.join(', ')}]`;\n }\n\n // If only one root atom, reify it directly\n return result + this.reifyAtom(rootAtoms[0].id, new Set());\n }\n\n /**\n * Recursively reifies a single atom and its relations, preserving constructor argument order\n * \n * @param atomId - The atom ID to reify\n * @param visited - Set of visited atom IDs to prevent infinite recursion\n * @returns Pyret constructor notation for this atom\n */\n private reifyAtom(atomId: string, visited: Set<string>): string {\n\n\n // TODO: I think this is broken -- it doesn't cache things correctly.\n\n if (visited.has(atomId)) {\n return `/* cycle: ${atomId} */`;\n }\n\n const atom = this.atoms.get(atomId);\n if (!atom) {\n return `/* missing atom: ${atomId} */`;\n }\n\n visited.add(atomId);\n\n // Handle primitive types\n if (this.isBuiltinType(atom.type)) {\n const result = this.reifyPrimitive(atom);\n visited.delete(atomId);\n return result;\n }\n\n // Get the original object to preserve key order\n const originalObject = this.originalObjects.get(atomId);\n\n if (!originalObject || !originalObject.dict) {\n // No original object available - try to reconstruct using cached patterns or heuristics\n visited.delete(atomId);\n return this.tryReconstructFromRelations(atom, visited);\n }\n\n // Use the original dict key order to maintain constructor argument order\n const orderedKeys = Object.keys(originalObject.dict);\n\n // Cache this constructor pattern for future use\n this.cacheConstructorPattern(atom.type, orderedKeys);\n\n // Check if this looks like a list (all keys are numeric)\n const isListLike = orderedKeys.every(key => /^\\d+$/.test(key));\n\n if (isListLike && orderedKeys.length > 0) {\n // Sort numeric keys and extract list items\n const sortedKeys = orderedKeys.sort((a, b) => parseInt(a, 10) - parseInt(b, 10));\n const listItems = sortedKeys.map(key => {\n const targetAtomIds = this.getRelationTargets(atomId, key);\n return targetAtomIds.map(targetId => this.reifyAtom(targetId, visited));\n }).flat();\n\n visited.delete(atomId);\n return `[list: ${listItems.join(', ')}]`;\n }\n\n // Regular constructor notation with preserved argument order\n const args: string[] = [];\n\n for (const relationName of orderedKeys) {\n const targetAtomIds = this.getRelationTargets(atomId, relationName);\n for (const targetId of targetAtomIds) {\n args.push(this.reifyAtom(targetId, visited));\n }\n }\n\n visited.delete(atomId);\n\n if (args.length === 0) {\n return atom.type;\n }\n\n return `${atom.type}(${args.join(', ')})`;\n }\n\n /**\n * Reifies primitive values with appropriate Pyret syntax\n */\n private reifyPrimitive(atom: IAtom): string {\n switch (atom.type) {\n case 'String':\n return `\"${atom.label.replace(/\"/g, '\\\\\"')}\"`;\n case 'Number':\n return atom.label;\n case 'Boolean':\n return atom.label;\n default:\n return atom.label;\n }\n }\n\n /**\n * Parses Pyret objects iteratively to avoid stack overflow and handle cycles\n */\n private parseObjectIteratively(rootObject: PyretObject): void {\n const processingQueue: Array<{ obj: PyretObject; parentInfo?: { parentId: string; relationName: string } }> = [\n { obj: rootObject }\n ];\n\n while (processingQueue.length > 0) {\n const { obj, parentInfo } = processingQueue.shift()!;\n\n\n\n /** \n * \n * TODO: N-ary relations, etc for things like lists, tables, etc.\n * \n * \n */\n\n // Skip if we've already processed this object (cycle detection)\n if (this.objectToAtomId.has(obj)) {\n if (parentInfo) {\n const existingAtomId = this.objectToAtomId.get(obj)!;\n this.addRelationTuple(\n parentInfo.relationName,\n { atoms: [parentInfo.parentId, existingAtomId], types: ['PyretObject', 'PyretObject'] }\n );\n }\n continue;\n }\n\n const atomId = this.createAtomFromObject(obj);\n\n // Store the original object to preserve dict key order\n this.originalObjects.set(atomId, obj);\n\n // Cache constructor pattern for this type if it has a dict\n if (obj.dict && typeof obj.dict === 'object') {\n const type = this.extractType(obj);\n const fieldOrder = Object.keys(obj.dict);\n this.cacheConstructorPattern(type, fieldOrder);\n }\n\n // Add relation from parent if this is not the root object\n if (parentInfo) {\n this.addRelationTuple(\n parentInfo.relationName,\n { atoms: [parentInfo.parentId, atomId], types: ['PyretObject', 'PyretObject'] }\n );\n }\n\n // Process all dict entries as relations, but skip obvious function/method fields\n if (obj.dict && typeof obj.dict === 'object') {\n // Check if this is a Pyret table with semantic data\n const isPyretTable = this.isPyretTable(obj);\n \n if (isPyretTable) {\n // Handle Pyret tables specially: create semantic relational tuples\n this.processTableSemantics(atomId, obj);\n } else {\n // Process regular objects\n Object.entries(obj.dict).forEach(([relationName, fieldValue]) => {\n\n\n // Heuristic: skip fields that look like Pyret methods (object with only a 'name' property)\n if (\n !this.options.showFunctions &&\n fieldValue &&\n typeof fieldValue === 'object' &&\n 'meth' in fieldValue &&\n 'full_meth' in fieldValue\n ) {\n // skip this field\n return;\n }\n ////\n\n\n if (this.isAtomicValue(fieldValue)) {\n const valueAtomId = this.createAtomFromPrimitive(fieldValue);\n this.addRelationTuple(\n relationName,\n { atoms: [atomId, valueAtomId], types: ['PyretObject', 'PyretObject'] }\n );\n } else if (Array.isArray(fieldValue)) {\n // Handle arrays: create atoms/relations for each element\n this.processArrayField(atomId, relationName, fieldValue, processingQueue);\n } else if (this.isPyretObject(fieldValue)) {\n processingQueue.push({\n obj: fieldValue,\n parentInfo: { parentId: atomId, relationName }\n });\n }\n });\n }\n }\n }\n }\n\n /**\n * Processes an array field value by creating relations for each element\n * Handles both arrays of primitives and arrays of objects/nested arrays\n * \n * @param parentAtomId - The parent atom ID\n * @param relationName - The name of the relation\n * @param arrayValue - The array to process\n * @param processingQueue - The queue for objects that need further processing\n */\n private processArrayField(\n parentAtomId: string,\n relationName: string,\n arrayValue: unknown[],\n processingQueue: Array<{ obj: PyretObject; parentInfo?: { parentId: string; relationName: string } }>\n ): void {\n arrayValue.forEach((element, index) => {\n if (this.isAtomicValue(element)) {\n // Create an atom for the primitive value\n const elementAtomId = this.createAtomFromPrimitive(element);\n // Create a relation tuple from parent to this element\n this.addRelationTuple(\n relationName,\n { atoms: [parentAtomId, elementAtomId], types: ['PyretObject', 'PyretObject'] }\n );\n } else if (Array.isArray(element)) {\n // Nested array: create an intermediate atom to represent the array\n const arrayAtomId = this.generateAtomId('Array');\n const arrayAtom: IAtom = {\n id: arrayAtomId,\n type: 'Array',\n label: `Array[${index}]`\n };\n this.atoms.set(arrayAtomId, arrayAtom);\n this.ensureTypeExists('Array');\n \n // Create relation from parent to this array\n this.addRelationTuple(\n relationName,\n { atoms: [parentAtomId, arrayAtomId], types: ['PyretObject', 'PyretObject'] }\n );\n \n // Recursively process the nested array elements\n this.processArrayField(arrayAtomId, 'element', element, processingQueue);\n } else if (this.isPyretObject(element)) {\n // Pyret object in array: add to processing queue\n processingQueue.push({\n obj: element,\n parentInfo: { parentId: parentAtomId, relationName }\n });\n }\n });\n }\n\n /**\n * Checks if a Pyret object is a table with semantic data\n */\n private isPyretTable(obj: PyretObject): boolean {\n if (!obj.dict || typeof obj.dict !== 'object') {\n return false;\n }\n \n // Check if it has the table brand\n if (obj.brands && typeof obj.brands === 'object') {\n const hasBrandTable = Object.keys(obj.brands).some(key => key.includes('brandtable'));\n if (!hasBrandTable) {\n return false;\n }\n }\n \n // Check if it has _header-raw-array and _rows-raw-array\n return '_header-raw-array' in obj.dict && '_rows-raw-array' in obj.dict;\n }\n\n /**\n * Processes a Pyret table to create semantic relational tuples\n * Each row becomes a tuple in a relation\n */\n private processTableSemantics(tableAtomId: string, tableObj: PyretObject): void {\n const dict = tableObj.dict as Record<string, unknown>;\n const headerArray = dict['_header-raw-array'] as unknown[];\n const rowsArray = dict['_rows-raw-array'] as unknown[];\n \n if (!Array.isArray(headerArray) || !Array.isArray(rowsArray)) {\n // Fallback to regular processing if structure is unexpected\n return;\n }\n \n // Extract column names from header\n const columnNames = headerArray.filter(h => typeof h === 'string') as string[];\n \n if (columnNames.length === 0) {\n return;\n }\n \n // Use \"row\" as the relation name to represent table rows\n const relationName = 'row';\n \n // Process each row as a tuple\n rowsArray.forEach((row) => {\n if (!Array.isArray(row)) {\n return;\n }\n \n // Create atoms for each cell value and collect them as a tuple\n const tupleAtomIds: string[] = [];\n \n row.forEach((cellValue) => {\n if (this.isAtomicValue(cellValue)) {\n const atomId = this.createAtomFromPrimitive(cellValue);\n tupleAtomIds.push(atomId);\n }\n });\n \n // Only create the tuple if we have the expected number of values\n if (tupleAtomIds.length === columnNames.length && tupleAtomIds.length > 0) {\n // Create an n-ary tuple for this row\n this.addRelationTuple(\n relationName,\n { \n atoms: tupleAtomIds, \n types: tupleAtomIds.map(() => 'String') // Assuming string types for now\n }\n );\n }\n });\n }\n\n /**\n * Creates an atom from a Pyret object and stores the mapping\n */\n private createAtomFromObject(obj: PyretObject): string {\n const type = this.extractType(obj);\n const atomId = this.generateAtomId(type);\n\n const atom: IAtom = {\n id: atomId,\n type,\n label: this.extractLabel(obj)\n };\n\n this.atoms.set(atomId, atom);\n this.objectToAtomId.set(obj, atomId);\n this.ensureTypeExists(type);\n\n return atomId;\n }\n\n /**\n * Creates an atom from a primitive value, optionally reusing existing atoms based on configuration\n */\n private createAtomFromPrimitive(value: string | number | boolean | { n: number; d: number }): string {\n // Handle rational numbers\n let actualValue: string | number | boolean;\n if (this.isRationalNumber(value)) {\n actualValue = this.rationalToDecimal(value);\n } else {\n actualValue = value;\n }\n\n const type = this.mapPrimitiveType(actualValue);\n const label = String(actualValue);\n\n // Check idempotency settings for this type\n const shouldReuse = (type === 'String' && this.options.stringsIdempotent) ||\n (type === 'Number' && this.options.numbersIdempotent) ||\n (type === 'Boolean' && this.options.booleansIdempotent);\n\n if (shouldReuse) {\n // Check if we already have an atom for this value\n const existingAtom = Array.from(this.atoms.values())\n .find(atom => atom.label === label && atom.type === type);\n\n if (existingAtom) {\n return existingAtom.id;\n }\n }\n\n // Create a new atom\n const atomId = this.generateAtomId(type);\n const atom: IAtom = {\n id: atomId,\n type,\n label\n };\n\n this.atoms.set(atomId, atom);\n this.ensureTypeExists(type);\n\n return atomId;\n }\n\n /**\n * Maps JavaScript primitive types to Pyret-appropriate type names\n */\n private mapPrimitiveType(value: string | number | boolean): string {\n switch (typeof value) {\n case 'number': return 'Number';\n case 'string': return 'String';\n case 'boolean': return 'Boolean';\n default: return 'Value';\n }\n }\n\n\n /**\n * Extracts the most specific brand name from a Pyret brands object.\n * Returns the brand with the highest trailing number, with prefix and number removed.\n * If no brands have trailing numbers, returns the lexicographically last brand.\n *\n * @param brands - The brands object from a Pyret object\n * @returns The most specific brand name (without $brand and trailing number), or undefined if none found\n */\n private extractMostSpecificBrand(brands: Record<string, boolean>): string | undefined {\n let maxNum = -1;\n let result: string | undefined = undefined;\n let fallbackResult: string | undefined = undefined;\n\n for (const brand of Object.keys(brands)) {\n // Try pattern with trailing number\n const matchWithNumber = /^\\$brand([a-zA-Z_]+)(\\d+)$/.exec(brand);\n if (matchWithNumber) {\n const [, name, numStr] = matchWithNumber;\n const num = parseInt(numStr, 10);\n if (num > maxNum) {\n maxNum = num;\n result = name;\n }\n } else {\n // Try pattern without trailing number\n const matchWithoutNumber = /^\\$brand_?([a-zA-Z_]+)$/.exec(brand);\n if (matchWithoutNumber) {\n const [, name] = matchWithoutNumber;\n // Use as fallback if no numbered brands found\n if (!fallbackResult || name > fallbackResult) {\n fallbackResult = name;\n }\n }\n }\n }\n\n // Return numbered brand if found, otherwise fallback to non-numbered brand\n return result || fallbackResult;\n }\n\n /**\n * Extracts the type name from a Pyret object\n */\n private extractType(obj: PyretObject): string {\n // Check for explicit name first\n if (obj.$name && typeof obj.$name === 'string') {\n return obj.$name;\n }\n\n // Extract from brands\n if (obj.brands && typeof obj.brands === 'object') {\n const brand = this.extractMostSpecificBrand(obj.brands);\n if (brand) {\n return brand;\n }\n }\n\n return 'PyretObject';\n }\n\n /**\n * Extracts a display label from a Pyret object, using a per-type counter.\n * Labels will be of the form Type$<num>\n */\n private extractLabel(obj: PyretObject): string {\n if (obj.$name && typeof obj.$name === 'string') {\n return obj.$name;\n }\n\n const type = this.extractType(obj);\n\n // Increment the counter for this type\n const current = this.typeLabelCounters.get(type) ?? 0;\n const next = current + 1;\n this.typeLabelCounters.set(type, next);\n\n return `${type}$${next}`;\n }\n\n /**\n * Adds a tuple to a relation, creating the relation if it doesn't exist\n */\n addRelationTuple(relationId: string, tuple: ITuple): void {\n // const [sourceId, targetId] = tuple.atoms;\n\n const sourceId = tuple.atoms[0];\n const targetId = tuple.atoms[tuple.atoms.length - 1];\n const middleAtoms = tuple.atoms.slice(1, -1);\n\n const sourceAtom = this.atoms.get(sourceId);\n const targetAtom = this.atoms.get(targetId);\n\n if (!sourceAtom || !targetAtom) {\n console.warn(`Cannot create relation ${relationId}: missing atoms ${sourceId} or ${targetId}`);\n return;\n }\n\n let relation = this.relations.get(relationId);\n let name = relationId + (middleAtoms.length > 0 ? `[${middleAtoms.join(', ')}]` : '');\n if (!relation) {\n relation = {\n id: relationId,\n name: name,\n types: [sourceAtom.type, targetAtom.type],\n tuples: []\n };\n this.relations.set(relationId, relation);\n }\n\n // Check for duplicate tuples\n const isDuplicate = relation.tuples.some(t =>\n t.atoms[0] === sourceId && t.atoms[1] === targetId\n );\n\n if (!isDuplicate) {\n relation.tuples.push(tuple);\n\n // Emit event\n this.emitEvent({\n type: 'relationTupleAdded',\n data: { relationId, tuple }\n });\n }\n }\n\n /**\n * Ensures a type exists in the types map\n */\n private ensureTypeExists(typeName: string): void {\n if (!this.types.has(typeName)) {\n const type: IType = {\n id: typeName,\n types: [typeName, 'PyretObject'], // All types inherit from PyretObject\n atoms: [],\n isBuiltin: this.isBuiltinType(typeName)\n };\n this.types.set(typeName, type);\n }\n }\n\n /**\n * Initializes common builtin types\n */\n private initializeBuiltinTypes(): void {\n const builtinTypes = ['Number', 'String', 'Boolean', 'PyretObject'];\n\n builtinTypes.forEach(typeName => {\n const type: IType = {\n id: typeName,\n types: typeName === 'PyretObject' ? ['PyretObject'] : [typeName, 'PyretObject'], // All types inherit from PyretObject\n atoms: [],\n isBuiltin: true\n };\n this.types.set(typeName, type);\n });\n }\n\n /**\n * Checks if a type is a builtin type\n */\n private isBuiltinType(typeName: string): boolean {\n return ['Number', 'String', 'Boolean', 'PyretObject'].includes(typeName);\n }\n\n /**\n * Type guard for Pyret rational number objects\n * Pyret represents rational numbers as objects with 'n' (numerator) and 'd' (denominator) properties\n */\n private isRationalNumber(value: unknown): value is { n: number; d: number } {\n return typeof value === 'object' &&\n value !== null &&\n 'n' in value &&\n 'd' in value &&\n typeof (value as { n: unknown }).n === 'number' &&\n typeof (value as { d: unknown }).d === 'number';\n }\n\n /**\n * Converts a Pyret rational number object to a decimal number\n */\n private rationalToDecimal(rational: { n: number; d: number }): number {\n return rational.n / rational.d;\n }\n\n /**\n * Type guard for atomic values\n * Now includes Pyret rational numbers\n */\n private isAtomicValue(value: unknown): value is string | number | boolean | { n: number; d: number } {\n return typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n this.isRationalNumber(value);\n }\n\n /**\n * Type guard for Pyret objects\n */\n private isPyretObject(obj: unknown): obj is PyretObject {\n return typeof obj === 'object' &&\n obj !== null &&\n ('dict' in obj || 'brands' in obj || '$name' in obj);\n }\n\n /**\n * Generates a unique atom ID\n */\n private generateAtomId(type?: string): string {\n const prefix = type ? type.toLowerCase().substring(0, 3) : 'atom';\n return `${prefix}_${++this.atomCounter}`;\n }\n\n // IDataInstance implementation\n\n getAtoms(): readonly IAtom[] {\n return Array.from(this.atoms.values());\n }\n\n getRelations(): readonly IRelation[] {\n\n const values = this.relations.values();\n return Array.from(values);\n\n //return Array.from(this.relations.values());\n\n }\n\n getTypes(): readonly IType[] {\n // Update type atoms based on current atoms\n this.types.forEach(type => {\n type.atoms = this.getAtoms().filter(atom => atom.type === type.id);\n });\n\n return Array.from(this.types.values());\n }\n\n getAtomType(atomId: string): IType {\n const atom = this.atoms.get(atomId);\n if (!atom) {\n throw new Error(`Atom with id '${atomId}' not found`);\n }\n\n const type = this.types.get(atom.type);\n if (!type) {\n // Create the type on demand if it doesn't exist\n this.ensureTypeExists(atom.type);\n return this.types.get(atom.type)!;\n }\n\n return type;\n }\n\n /**\n * Generates a graphlib Graph representation of this data instance.\n * \n * This method creates a directed multigraph where:\n * - Each atom becomes a node with its label and type as metadata\n * - Each relation tuple becomes an edge between atoms\n * - Multi-atom tuples (arity > 2) are handled by connecting first to last atom\n * - Disconnected nodes can be optionally filtered out\n * \n * @param hideDisconnected - Whether to hide atoms with no relations\n * @param hideDisconnectedBuiltIns - Whether to hide disconnected built-in types\n * @returns A graphlib Graph object ready for layout algorithms\n * \n * @example\n * ```typescript\n * const graph = instance.generateGraph(true, true);\n * // Use with WebCola or other layout algorithms\n * const layout = new cola.Layout().nodes(graph.nodes()).edges(graph.edges());\n * ```\n */\n generateGraph(hideDisconnected = false, hideDisconnectedBuiltIns = false): Graph {\n const graph = new Graph({ directed: true, multigraph: true });\n\n // Add all atoms as nodes\n this.getAtoms().forEach(atom => {\n graph.setNode(atom.id, {\n label: atom.label\n });\n });\n\n // Add all relation tuples as edges\n this.getRelations().forEach(relation => {\n relation.tuples.forEach(tuple => {\n if (tuple.atoms.length >= 2) {\n const sourceId = tuple.atoms[0];\n const targetId = tuple.atoms[tuple.atoms.length - 1];\n \n // Create edge label that includes middle atom labels for higher-arity relations\n const middleAtoms = tuple.atoms.slice(1, -1);\n let edgeLabel = relation.name;\n \n if (middleAtoms.length > 0) {\n // Get labels for middle atoms instead of using IDs\n const middleLabels = middleAtoms.map(atomId => {\n const atom = this.atoms.get(atomId);\n return atom ? atom.label : atomId; // Fallback to ID if atom not found\n });\n edgeLabel = `${relation.name}[${middleLabels.join(', ')}]`;\n }\n\n // Generate a unique edge ID\n const edgeId = generateEdgeId(relation, tuple);\n \n graph.setEdge(sourceId, targetId, edgeLabel, edgeId);\n }\n });\n });\n\n // Handle disconnected node filtering\n if (hideDisconnected || hideDisconnectedBuiltIns) {\n const nodesToRemove: string[] = [];\n\n graph.nodes().forEach(nodeId => {\n const inEdges = graph.inEdges(nodeId) || [];\n const outEdges = graph.outEdges(nodeId) || [];\n const isDisconnected = inEdges.length === 0 && outEdges.length === 0;\n\n if (isDisconnected) {\n const atom = this.atoms.get(nodeId);\n if (atom) {\n const atomType = this.getAtomType(nodeId);\n const isBuiltin = atomType.isBuiltin;\n\n if (hideDisconnected || (isBuiltin && hideDisconnectedBuiltIns)) {\n nodesToRemove.push(nodeId);\n }\n }\n }\n });\n\n nodesToRemove.forEach(nodeId => graph.removeNode(nodeId));\n }\n\n return graph;\n }\n\n /**\n * Applies projections to filter the data instance\n */\n applyProjections(atomIds: string[]): PyretDataInstance {\n if (atomIds.length === 0) {\n return this;\n }\n\n // Create a new instance with filtered data\n const projected = Object.create(PyretDataInstance.prototype) as PyretDataInstance;\n projected.atoms = new Map([...this.atoms].filter(([id]) => atomIds.includes(id)));\n projected.relations = new Map();\n projected.types = new Map();\n projected.atomCounter = projected.atoms.size;\n\n // Filter relations to only include tuples where all atoms are in the projection\n this.relations.forEach((relation, name) => {\n const filteredTuples = relation.tuples.filter(tuple =>\n tuple.atoms.every(atomId => atomIds.includes(atomId))\n );\n if (filteredTuples.length > 0) {\n projected.relations.set(name, {\n ...relation,\n tuples: filteredTuples\n });\n }\n });\n\n // Filter types to only include atoms in the projection\n this.types.forEach((type, typeName) => {\n const filteredAtoms = type.atoms.filter(atom => atomIds.includes(atom.id));\n if (filteredAtoms.length > 0) {\n projected.types.set(typeName, {\n ...type,\n atoms: filteredAtoms\n });\n }\n });\n\n return projected;\n }\n\n /**\n * Gets target atom IDs for a specific relation from a source atom\n * \n * @param sourceAtomId - The source atom ID\n * @param relationName - The relation name\n * @returns Array of target atom IDs\n */\n private getRelationTargets(sourceAtomId: string, relationName: string): string[] {\n const targets: string[] = [];\n\n this.relations.forEach(relation => {\n if (relation.name === relationName) {\n relation.tuples.forEach(tuple => {\n if (tuple.atoms[0] === sourceAtomId && tuple.atoms.length >= 2) {\n targets.push(tuple.atoms[1]);\n }\n });\n }\n });\n\n return targets;\n }\n\n\n /**\n * Adds a PyretDataInstance to this instance, optionally unifying built-in types\n * \n * @param dataInstance - The PyretDataInstance to add\n * @param unifyBuiltIns - Whether to unify built-in atoms\n * @returns True if the instance was added successfully, false otherwise\n */\n addFromDataInstance(dataInstance: IDataInstance, unifyBuiltIns: boolean): boolean {\n // Must be a PyretDataInstance\n if (!(dataInstance instanceof PyretDataInstance)) {\n return false;\n }\n\n const pyretInstance = dataInstance as PyretDataInstance;\n const reIdMap = new Map<string, string>();\n\n // Add atoms\n pyretInstance.getAtoms().forEach(atom => {\n const isBuiltin = this.isBuiltinType(atom.type);\n\n if (unifyBuiltIns && isBuiltin) {\n // Use this instance's idempotency settings to decide whether to unify\n const shouldUnify = (atom.type === 'String' && this.options.stringsIdempotent) ||\n (atom.type === 'Number' && this.options.numbersIdempotent) ||\n (atom.type === 'Boolean' && this.options.booleansIdempotent);\n\n if (shouldUnify) {\n // Check if the built-in atom already exists\n const existingAtom = Array.from(this.atoms.values()).find(\n existing => existing.type === atom.type && existing.label === atom.label\n );\n\n if (existingAtom) {\n // Map the original atom ID to the existing atom ID\n reIdMap.set(atom.id, existingAtom.id);\n return; // Skip adding this atom\n }\n }\n }\n\n // Generate a new ID for the atom to avoid conflicts\n const newId = this.generateAtomId(atom.type);\n reIdMap.set(atom.id, newId);\n\n // Add the atom with the new ID\n const newAtom: IAtom = { ...atom, id: newId };\n this.addAtom(newAtom);\n\n // Preserve the original object mapping\n const originalObject = pyretInstance.originalObjects.get(atom.id);\n if (originalObject) {\n this.originalObjects.set(newId, originalObject);\n }\n });\n\n // Add types\n pyretInstance.getTypes().forEach(type => {\n if (!this.types.has(type.id)) {\n // Add the type if it doesn't exist\n this.types.set(type.id, {\n ...type,\n atoms: type.atoms.map(atom => ({\n ...atom,\n id: reIdMap.get(atom.id) || atom.id,\n })),\n });\n } else {\n // Merge atoms into the existing type\n const existingType = this.types.get(type.id)!;\n const newAtoms = type.atoms.map(atom => ({\n ...atom,\n id: reIdMap.get(atom.id) || atom.id,\n }));\n existingType.atoms.push(...newAtoms);\n }\n });\n\n // Add relations\n pyretInstance.getRelations().forEach(relation => {\n const newTuples: ITuple[] = relation.tuples.map(tuple => ({\n atoms: tuple.atoms.map(atomId => reIdMap.get(atomId) || atomId),\n types: tuple.types,\n }));\n\n const existingRelation = this.relations.get(relation.id);\n if (existingRelation) {\n // Merge tuples into the existing relation\n existingRelation.tuples.push(...newTuples);\n } else {\n // Add a new relation\n this.relations.set(relation.id, {\n ...relation,\n tuples: newTuples,\n });\n }\n });\n\n return true;\n }\n}\n\n/**\n * Type definitions for Pyret runtime objects\n */\nexport interface PyretObject {\n dict?: Record<string, unknown>;\n brands?: Record<string, boolean>;\n $name?: string;\n $loc?: unknown[];\n $mut_fields_mask?: unknown[];\n $arity?: number;\n $constructor?: unknown;\n [key: string]: unknown;\n}\n\n/**\n * Factory function to create PyretDataInstance from JSON string\n * \n * @param jsonString - JSON representation of a Pyret object\n * @param options - Configuration options for primitive handling and other behaviors\n * @returns New PyretDataInstance\n * \n * @example\n * ```typescript\n * const jsonData = '{\"dict\": {\"value\": 42}, \"brands\": {\"$brandleaf\": true}}';\n * const instance = createPyretDataInstance(jsonData, { stringsIdempotent: false });\n * ```\n */\nexport const createPyretDataInstance = (\n jsonString: string, \n options: PyretInstanceOptions = {}\n): PyretDataInstance => {\n try {\n const pyretData = JSON.parse(jsonString) as PyretObject;\n return new PyretDataInstance(pyretData, options);\n } catch (error) {\n throw new Error(`Failed to parse Pyret JSON: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n};\n\n/**\n * Type guard to check if an IInputDataInstance is a PyretDataInstance\n * \n * @param instance - IInputDataInstance to check\n * @returns True if the instance is a PyretDataInstance\n */\nexport const isPyretDataInstance = (instance: IInputDataInstance): instance is PyretDataInstance => {\n return instance instanceof PyretDataInstance;\n};","import { ICommandParser, CommandResult } from './CoreParsers';\nimport { IAtom, ITuple, IInputDataInstance } from '../../../data-instance/interfaces';\nimport { PyretDataInstance } from '../../../data-instance/pyret/pyret-data-instance';\n\n/**\n * Parser for Pyret-style list commands (sugar syntax)\n * Supports:\n * - [list: 1,2,3,4]:list_of_numbers\n * - [list: atom1,atom2,atom3]:atom_list\n */\nexport class PyretListParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // No more explicit add/remove - everything is sugar syntax\n if (trimmed.startsWith('add ') || trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Pattern: [list: ...]:type (sugar syntax)\n if (trimmed.startsWith('[list:') && trimmed.includes(']:')) {\n return true;\n }\n \n return false;\n }\n \n getPriority(): number {\n return 120; // Higher priority due to very specific [list: pattern\n }\n \n getCommandPatterns(): string[] {\n return [\n '[list: item1,item2,item3]:type',\n '[list: 1,2,3,4]:numbers'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim();\n \n // All commands are now implicit \"add\" - sugar syntax gets desugared to internal operations\n return this.handleAdd(trimmed, instance);\n }\n\n private handleAdd(args: string, instance: IInputDataInstance): CommandResult {\n try {\n // Parse: [list: item1,item2,item3]:type\n // Expected format: add [list: 1,2,3,4]:numbers\n // Creates individual atoms for each item + a list atom + list relations\n const match = args.match(/^\\[list:\\s*([^\\]]+)\\]:(.+)$/);\n if (!match) {\n return {\n success: false,\n message: 'Invalid syntax. Use: add [list: item1,item2,item3]:type'\n };\n }\n\n const [, itemsStr, listTypeName] = match;\n const items = itemsStr.split(',').map(item => item.trim()).filter(item => item);\n const listType = listTypeName.trim();\n \n if (items.length === 0) {\n return {\n success: false,\n message: 'List cannot be empty'\n };\n }\n\n // Determine item type based on the list contents:\n // Case 1: All numeric items (e.g., \"1,2,3,4\") -> Number type\n // Case 2: All existing atom IDs (e.g., \"alice,bob\") -> Use existing atom type \n // Case 3: All quoted items (e.g., \"red\",\"green\",\"blue\") -> String type\n // Case 4: Mixed or new items -> Default to String type\n let itemType = 'String'; // default fallback\n const existingAtoms = instance.getAtoms();\n const existingAtomIds = new Set(existingAtoms.map(a => a.id));\n \n // Check if all items are numbers\n if (items.every(item => /^\\d+$/.test(item))) {\n itemType = 'Number';\n } \n // Check if all items are quoted strings\n else if (items.every(item => /^\".*\"$/.test(item))) {\n itemType = 'String';\n // Remove quotes from items for processing\n for (let i = 0; i < items.length; i++) {\n items[i] = items[i].slice(1, -1); // Remove first and last character (quotes)\n }\n }\n // Check if all items are existing atoms\n else if (items.every(item => existingAtomIds.has(item))) {\n // Use the type of the first atom as the item type\n const firstAtom = existingAtoms.find(a => a.id === items[0]);\n itemType = firstAtom?.type || 'Entity';\n }\n\n const results: string[] = [];\n const atomsAdded: string[] = [];\n\n // Step 1: Create individual atoms for each list item\n // - If item already exists as an atom, skip creation\n // - If item is new, create an atom with the determined itemType\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n \n if (!existingAtomIds.has(item)) {\n const atom: IAtom = {\n id: item,\n label: item,\n type: itemType\n };\n \n try {\n instance.addAtom(atom);\n atomsAdded.push(item);\n existingAtomIds.add(item);\n } catch (error) {\n // Item might already exist, that's ok - continue processing\n }\n }\n }\n\n // Step 2: Create the list atom that contains all items\n // The list ID is generated to be unique (e.g., \"numbers-1\", \"people-1\")\n const listId = this.generateListId(instance, listType);\n const listAtom: IAtom = {\n id: listId,\n label: `[${items.join(', ')}]`,\n type: listType\n };\n \n instance.addAtom(listAtom);\n atomsAdded.push(listId);\n\n // Step 3: Create Pyret-style list relations (first, rest, etc.)\n // This establishes the structural relationships for list traversal\n this.addListRelations(instance, listId, items);\n\n const addedCount = atomsAdded.length;\n const relationCount = items.length > 0 ? items.length : 0; // first + rest relations\n \n return {\n success: true,\n message: `Added Pyret list: ${listId} with ${items.length} items (${addedCount} atoms, ${relationCount} relations)`,\n action: 'add'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to add Pyret list'\n };\n }\n }\n\n\n\n private generateListId(instance: IInputDataInstance, typeName: string): string {\n const existingIds = new Set(instance.getAtoms().map(a => a.id));\n let counter = 1;\n let candidateId = `${typeName}-${counter}`;\n \n while (existingIds.has(candidateId)) {\n counter++;\n candidateId = `${typeName}-${counter}`;\n }\n \n return candidateId;\n }\n\n private addListRelations(instance: IInputDataInstance, listId: string, items: string[]): void {\n if (items.length === 0) return;\n\n // Create the linked list structure\n let currentRest = 'empty'; // Start with the Pyret `empty` as the end of the list\n\n for (let i = items.length - 1; i >= 0; i--) {\n const currentItem = items[i];\n\n // Create a `link` atom for the current item\n const linkId = `${listId}-link-${i + 1}`;\n const linkAtom: IAtom = {\n id: linkId,\n label: `link(${currentItem}, ${currentRest})`,\n type: 'link'\n };\n\n instance.addAtom(linkAtom);\n\n // Add the `link` relation: link(first, rest)\n const linkTuple: ITuple = {\n atoms: [currentItem, currentRest],\n types: ['Item', 'link']\n };\n\n try {\n instance.addRelationTuple('link', linkTuple);\n } catch (error) {\n // Relation might already exist\n }\n\n // Update the currentRest to point to the current link\n currentRest = linkId;\n }\n\n // Add the top-level list atom pointing to the first link\n const topLevelTuple: ITuple = {\n atoms: [listId, currentRest],\n types: ['List', 'link']\n };\n\n try {\n instance.addRelationTuple('link', topLevelTuple);\n } catch (error) {\n // Relation might already exist\n }\n }\n\n getHelp(): string[] {\n return [\n 'Pyret List Commands (sugar syntax):',\n ' [list: item1,item2,item3]:list_type - Add list with items',\n ' [list: 1,2,3,4]:numbers - Add number list',\n '',\n 'This automatically creates:',\n ' - Individual atoms for each item (if they don\\'t exist)',\n ' - A list atom containing all items',\n ' - first/rest relations for list structure',\n '',\n 'Examples:',\n ' [list: 1,2,3,4]:numberList - Creates numberList-1 as list ID',\n ' [list: alice,bob,charlie]:personList - Creates personList-1 as list ID',\n ' [list: red,green,blue]:colors - Creates colors-1 as list ID',\n '',\n 'Note: All syntax is sugar that gets desugared to internal operations.',\n 'The list type name is used as-is to generate unique list IDs (type-1, type-2, etc.)'\n ];\n }\n}\n\n/**\n * Info and help parser for utility commands\n */\nexport class InfoCommandParser implements ICommandParser {\n canHandle(command: string): boolean {\n const trimmed = command.trim().toLowerCase();\n const utilityCommands = ['help', 'info', 'status', 'list', 'clear', 'reify', 'list-ids', 'list-edges'];\n return utilityCommands.includes(trimmed);\n }\n \n getPriority(): number {\n return 50; // Lower priority - utility commands should be fallback\n }\n \n getCommandPatterns(): string[] {\n return [\n 'help',\n 'info', \n 'status',\n 'list',\n 'list-ids',\n 'list-edges',\n 'clear',\n 'reify'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): CommandResult {\n const trimmed = command.trim().toLowerCase();\n \n switch (trimmed) {\n case 'help':\n return {\n success: true,\n message: this.getGeneralHelp(),\n action: 'help'\n };\n \n case 'info':\n case 'status':\n return this.getStatus(instance);\n \n case 'list':\n return this.listContents(instance);\n \n case 'list-ids':\n return this.listAtomIds(instance);\n \n case 'list-edges':\n return this.listEdgeIds(instance);\n \n case 'clear':\n return this.clearInstance(instance);\n \n case 'reify':\n return this.reifyInstance(instance);\n \n default:\n return {\n success: false,\n message: 'Unknown info command'\n };\n }\n }\n\n private listAtomIds(instance: IInputDataInstance): CommandResult {\n const atoms = instance.getAtoms();\n \n if (atoms.length === 0) {\n return {\n success: true,\n message: 'No atoms found in instance.',\n action: 'info'\n };\n }\n \n let message = 'Internal Atom IDs:\\n\\n';\n \n // Group atoms by type for better organization\n const atomsByType = atoms.reduce((acc, atom) => {\n if (!acc[atom.type]) {\n acc[atom.type] = [];\n }\n acc[atom.type].push(atom);\n return acc;\n }, {} as Record<string, typeof atoms>);\n \n Object.entries(atomsByType).forEach(([type, typeAtoms]) => {\n message += `${type}:\\n`;\n typeAtoms.forEach(atom => {\n message += ` ID: ${atom.id} Label: ${atom.label}\\n`;\n });\n message += '\\n';\n });\n \n message += `Total: ${atoms.length} atoms`;\n \n return {\n success: true,\n message,\n action: 'info'\n };\n }\n\n private listEdgeIds(instance: IInputDataInstance): CommandResult {\n const relations = instance.getRelations();\n \n if (relations.length === 0) {\n return {\n success: true,\n message: 'No relations/edges found in instance.',\n action: 'info'\n };\n }\n \n let message = 'Internal Edge IDs:\\n\\n';\n let totalEdges = 0;\n \n relations.forEach(relation => {\n if (relation.tuples.length > 0) {\n message += `Relation: ${relation.name}\\n`;\n relation.tuples.forEach((tuple, index) => {\n // Generate edge ID using the same format as PyretDataInstance\n const edgeId = `${relation.name}:${tuple.atoms.join('->')}`;\n message += ` Edge ID: ${edgeId}\\n`;\n message += ` Tuple: (${tuple.atoms.join(', ')})\\n`;\n totalEdges++;\n });\n message += '\\n';\n }\n });\n \n message += `Total: ${totalEdges} edges across ${relations.length} relations`;\n \n return {\n success: true,\n message,\n action: 'info'\n };\n }\n\n private getStatus(instance: IInputDataInstance): CommandResult {\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n const tupleCount = relations.reduce((sum, r) => sum + r.tuples.length, 0);\n \n const typeStats = atoms.reduce((acc, atom) => {\n acc[atom.type] = (acc[atom.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n \n const relationStats = relations.reduce((acc, rel) => {\n acc[rel.name] = rel.tuples.length;\n return acc;\n }, {} as Record<string, number>);\n \n let message = `Instance Status:\\n`;\n message += ` Atoms: ${atoms.length}\\n`;\n message += ` Relations: ${relations.length}\\n`;\n message += ` Tuples: ${tupleCount}\\n\\n`;\n \n if (Object.keys(typeStats).length > 0) {\n message += `Types:\\n`;\n Object.entries(typeStats).forEach(([type, count]) => {\n message += ` ${type}: ${count}\\n`;\n });\n message += '\\n';\n }\n \n if (Object.keys(relationStats).length > 0) {\n message += `Relations:\\n`;\n Object.entries(relationStats).forEach(([name, count]) => {\n message += ` ${name}: ${count} tuples\\n`;\n });\n }\n \n return {\n success: true,\n message,\n action: 'info'\n };\n }\n\n private listContents(instance: IInputDataInstance): CommandResult {\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n \n let message = 'Instance Contents:\\n\\n';\n \n if (atoms.length > 0) {\n message += 'Atoms:\\n';\n atoms.forEach(atom => {\n // Always show ID prominently on the left for easy referencing\n message += ` [${atom.id}] ${atom.label}:${atom.type}\\n`;\n });\n message += '\\n';\n }\n \n if (relations.length > 0) {\n message += 'Relations:\\n';\n relations.forEach(rel => {\n message += ` ${rel.name}:\\n`;\n rel.tuples.forEach(tuple => {\n message += ` (${tuple.atoms.join(', ')})\\n`;\n });\n });\n }\n \n if (atoms.length === 0 && relations.length === 0) {\n message += 'Empty instance - no atoms or relations defined.';\n }\n \n return {\n success: true,\n message,\n action: 'info'\n };\n }\n\n private clearInstance(instance: IInputDataInstance): CommandResult {\n try {\n // Remove all atoms (this should cascade to remove relations)\n const atomIds = instance.getAtoms().map(a => a.id);\n atomIds.forEach(id => instance.removeAtom(id));\n \n return {\n success: true,\n message: `Cleared instance (removed ${atomIds.length} atoms)`,\n action: 'remove'\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to clear instance'\n };\n }\n }\n\n private reifyInstance(instance: IInputDataInstance): CommandResult {\n try {\n // Check if this is a PyretDataInstance with reify capability\n if (instance instanceof PyretDataInstance) {\n const reifiedCode = instance.reify();\n return {\n success: true,\n message: `Pyret Constructor Notation:\\n\\n${reifiedCode}`,\n action: 'info'\n };\n } else {\n // For other data instances, provide a generic representation\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n \n let result = 'Data Instance Structure:\\n\\n';\n \n if (atoms.length > 0) {\n result += 'Atoms:\\n';\n atoms.forEach(atom => {\n result += ` [${atom.id}] ${atom.label}:${atom.type}\\n`;\n });\n result += '\\n';\n }\n \n if (relations.length > 0) {\n result += 'Relations:\\n';\n relations.forEach(rel => {\n result += ` ${rel.name}:\\n`;\n rel.tuples.forEach(tuple => {\n result += ` (${tuple.atoms.join(', ')})\\n`;\n });\n });\n }\n \n return {\n success: true,\n message: result,\n action: 'info'\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Failed to reify instance'\n };\n }\n }\n\n private getGeneralHelp(): string {\n return `REPL Interface Help:\n\nAvailable commands across all terminals:\n help - Show this help\n info - Show instance status \n status - Same as info\n list - List all atoms and relations\n list-ids - List internal atom IDs grouped by type\n list-edges - List internal edge IDs for all relations\n clear - Clear entire instance\n reify - Generate Pyret constructor notation (or generic representation)\n\nTerminal-specific commands vary by terminal type.\nClick the \"?\" button in each terminal header for specific help.`;\n }\n\n getHelp(): string[] {\n return [\n 'Utility Commands:',\n ' help - Show general help',\n ' info - Show instance status',\n ' status - Same as info',\n ' list - List all contents',\n ' list-ids - List internal atom IDs',\n ' list-edges - List internal edge IDs', \n ' clear - Clear entire instance',\n ' reify - Generate Pyret constructor notation'\n ];\n }\n}","import * as React from 'react';\nimport { useState, useCallback, useRef, useEffect } from 'react';\nimport { IInputDataInstance } from '../../data-instance/interfaces';\nimport { ICommandParser, CommandResult, AtomCommandParser, RelationCommandParser, DotNotationRelationParser, BatchCommandParser, RemoveCommandParser } from './parsers/CoreParsers';\nimport { PyretListParser, InfoCommandParser } from './parsers/ExtensibleParsers';\nimport './ReplInterface.css';\n\n/**\n * Configuration for a terminal in the REPL interface\n */\nexport interface TerminalConfig {\n id: string;\n title: string;\n description: string;\n parsers: ICommandParser[];\n placeholder?: string;\n}\n\n/**\n * Props for the ReplInterface component\n */\nexport interface ReplInterfaceProps {\n /** The data instance to build/modify - REQUIRED */\n instance: IInputDataInstance;\n /** Callback when the instance changes */\n onChange?: (instance: IInputDataInstance) => void;\n /** Callback when CnD specification is extracted from an expression */\n onCndSpecExtracted?: (spec: string) => void;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** CSS class name for styling */\n className?: string;\n /** Custom terminal configurations (defaults to 3 standard terminals) */\n terminals?: TerminalConfig[];\n}\n\n/**\n * Output line for terminal display\n */\ninterface OutputLine {\n id: string;\n type: 'command' | 'success' | 'error' | 'info' | 'help';\n message: string;\n timestamp: Date;\n}\n\n/**\n * State for a single terminal\n */\ninterface TerminalState {\n input: string;\n output: OutputLine[];\n isExecuting: boolean;\n}\n\n/**\n * Default terminal configuration - unified terminal supporting all commands\n * Parsers are ordered by priority (higher priority first)\n */\nconst DEFAULT_TERMINALS: TerminalConfig[] = [\n {\n id: 'unified',\n title: '',\n description: 'Supports atoms, relations, and extensions in one terminal',\n parsers: [\n new RemoveCommandParser(), // Priority 200 - highest priority for remove commands\n new PyretListParser(), // Priority 120 - most specific pattern\n new BatchCommandParser(), // Priority 115 - multi-command patterns \n new DotNotationRelationParser(), // Priority 115 - dot notation relations\n new AtomCommandParser(), // Priority 100 - standard priority\n new InfoCommandParser() // Priority 50 - fallback utility commands\n ].sort((a, b) => b.getPriority() - a.getPriority()), // Sort by priority descending\n placeholder: ''\n }\n];\n\n/**\n * REPL-like interface for building data instances with command-line style input\n * \n * Provides a unified terminal that supports:\n * - Nodes: add/remove atoms with Label:Type syntax\n * - Edges: add/remove relations with name:atom->atom syntax \n * - Extensions: Language-specific commands (Pyret lists, etc.)\n * - Utility commands: help, info, list, clear\n * \n * The terminal supports:\n * - Command history with up/down arrows\n * - Help system\n * - Multi-line input\n * - Extensible parser system\n * - Auto-detection of command types\n */\nexport const ReplInterface: React.FC<ReplInterfaceProps> = ({\n instance,\n onChange,\n onCndSpecExtracted,\n disabled = false,\n className = '',\n terminals = DEFAULT_TERMINALS\n}) => {\n // State for each terminal\n const [terminalStates, setTerminalStates] = useState<Record<string, TerminalState>>(() => {\n const initialState: Record<string, TerminalState> = {};\n terminals.forEach(terminal => {\n initialState[terminal.id] = {\n input: '',\n output: [], // No welcome message - keep it minimal\n isExecuting: false\n };\n });\n return initialState;\n });\n\n // State for collapsible drawers\n const [drawersOpen, setDrawersOpen] = useState<Record<string, boolean>>({\n nodes: false,\n edges: false\n });\n\n // References to terminal output containers for auto-scrolling\n const outputRefs = useRef<Record<string, HTMLDivElement | null>>({});\n\n // Get current stats from instance\n const atoms = instance.getAtoms();\n const relations = instance.getRelations();\n const tupleCount = relations.reduce((sum, rel) => sum + rel.tuples.length, 0);\n\n // Auto-scroll terminal output to bottom\n const scrollToBottom = useCallback((terminalId: string) => {\n const outputRef = outputRefs.current[terminalId];\n if (outputRef) {\n outputRef.scrollTop = outputRef.scrollHeight;\n }\n }, []);\n\n // Add output line to terminal\n const addOutputLine = useCallback((terminalId: string, line: Omit<OutputLine, 'id' | 'timestamp'>) => {\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n output: [\n ...prev[terminalId].output,\n {\n ...line,\n id: `${Date.now()}-${Math.random()}`,\n timestamp: new Date()\n }\n ]\n }\n }));\n \n // Scroll to bottom after state update\n setTimeout(() => scrollToBottom(terminalId), 0);\n }, [scrollToBottom]);\n\n // Notify parent when instance changes\n const notifyChange = useCallback(() => {\n if (onChange) {\n onChange(instance);\n }\n }, [instance, onChange]);\n\n // Toggle drawer function\n const toggleDrawer = useCallback((drawerName: string) => {\n setDrawersOpen(prev => ({\n ...prev,\n [drawerName]: !prev[drawerName]\n }));\n }, []);\n\n // Execute command in terminal\n const executeCommand = useCallback(async (terminalId: string, command: string) => {\n const terminal = terminals.find(t => t.id === terminalId);\n if (!terminal) return;\n\n const trimmedCommand = command.trim();\n if (!trimmedCommand) return;\n\n // Set executing state\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n isExecuting: true\n }\n }));\n\n // Add command to output\n addOutputLine(terminalId, {\n type: 'command',\n message: trimmedCommand\n });\n\n // Try to execute with each parser (they are already sorted by priority)\n let result: CommandResult | null = null;\n let handlingParser: ICommandParser | null = null;\n \n for (const parser of terminal.parsers) {\n if (parser.canHandle(trimmedCommand)) {\n handlingParser = parser;\n try {\n const executeResult = parser.execute(trimmedCommand, instance);\n // Handle both sync and async results\n result = await Promise.resolve(executeResult);\n break;\n } catch (error) {\n result = {\n success: false,\n message: error instanceof Error ? error.message : 'Execution failed'\n };\n break;\n }\n }\n }\n\n // If no parser handled it, provide helpful error with available patterns\n if (!result) {\n const availablePatterns = terminal.parsers\n .flatMap(parser => parser.getCommandPatterns())\n .slice(0, 8) // Limit to avoid overwhelming output\n .join('\\n ');\n \n result = {\n success: false,\n message: `Unknown command: ${trimmedCommand}\\n\\nAvailable patterns:\\n ${availablePatterns}\\n\\nType 'help' for detailed information.`\n };\n }\n\n // Add result to output - only add error messages, skip success confirmations\n if (!result.success || result.action === 'help' || result.action === 'info') {\n addOutputLine(terminalId, {\n type: result.success ? (result.action === 'help' ? 'help' : result.action === 'info' ? 'info' : 'success') : 'error',\n message: result.message\n });\n }\n\n // Clear executing state and input\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n input: '',\n isExecuting: false\n }\n }));\n\n // Notify parent of changes if command was successful and modified data\n if (result.success && (result.action === 'add' || result.action === 'remove')) {\n notifyChange();\n }\n\n // Notify parent if CnD specification was extracted\n if (result.success && result.extractedCndSpec && onCndSpecExtracted) {\n onCndSpecExtracted(result.extractedCndSpec);\n }\n }, [terminals, instance, addOutputLine, notifyChange, onCndSpecExtracted]);\n\n // Handle input change\n const handleInputChange = useCallback((terminalId: string, value: string) => {\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n input: value\n }\n }));\n }, []);\n\n // Handle execute button click\n const handleExecute = useCallback(async (terminalId: string) => {\n const state = terminalStates[terminalId];\n if (!state || state.isExecuting) return;\n\n const commands = state.input.split('\\n').map(cmd => cmd.trim()).filter(cmd => cmd);\n \n // Execute each command in sequence (await each one)\n for (const command of commands) {\n await executeCommand(terminalId, command);\n }\n }, [terminalStates, executeCommand]);\n\n // Handle key press in input\n const handleKeyPress = useCallback((e: React.KeyboardEvent, terminalId: string) => {\n if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n handleExecute(terminalId);\n }\n }, [handleExecute]);\n\n // Clear terminal output\n const clearTerminal = useCallback((terminalId: string) => {\n setTerminalStates(prev => ({\n ...prev,\n [terminalId]: {\n ...prev[terminalId],\n output: []\n }\n }));\n }, []);\n\n // Show help for terminal\n const showHelp = useCallback((terminalId: string) => {\n const terminal = terminals.find(t => t.id === terminalId);\n if (!terminal) return;\n\n let helpText = `${terminal.title} Help:\\n\\n`;\n \n terminal.parsers.forEach(parser => {\n const help = parser.getHelp();\n helpText += help.join('\\n') + '\\n\\n';\n });\n\n addOutputLine(terminalId, {\n type: 'help',\n message: helpText.trim()\n });\n }, [terminals, addOutputLine]);\n\n // Global clear all\n const clearAll = useCallback(() => {\n try {\n // Clear the instance\n const atomIds = instance.getAtoms().map(a => a.id);\n atomIds.forEach(id => instance.removeAtom(id));\n \n // Add success message to all terminals\n terminals.forEach(terminal => {\n addOutputLine(terminal.id, {\n type: 'success',\n message: `Instance cleared (removed ${atomIds.length} atoms)`\n });\n });\n \n notifyChange();\n } catch (error) {\n // Add error message to all terminals\n terminals.forEach(terminal => {\n addOutputLine(terminal.id, {\n type: 'error',\n message: error instanceof Error ? error.message : 'Failed to clear instance'\n });\n });\n }\n }, [instance, terminals, addOutputLine, notifyChange]);\n\n return (\n <div className={`repl-interface ${className}`}>\n <div className=\"repl-interface__main\">\n {/* Minimal header with simplified stats */}\n <div className=\"repl-interface__header\">\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n onClick={() => toggleDrawer('nodes')}\n style={{\n background: drawersOpen.nodes ? '#4ec9b0' : '#2d2d30',\n color: drawersOpen.nodes ? '#1e1e1e' : '#cccccc',\n border: '1px solid #3c3c3c',\n padding: '3px 6px',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '0.75rem'\n }}\n >\n {atoms.length}\n </button>\n <button\n onClick={() => toggleDrawer('edges')}\n style={{\n background: drawersOpen.edges ? '#4ec9b0' : '#2d2d30',\n color: drawersOpen.edges ? '#1e1e1e' : '#cccccc',\n border: '1px solid #3c3c3c',\n padding: '3px 6px',\n borderRadius: '3px',\n cursor: 'pointer',\n fontSize: '0.75rem'\n }}\n >\n {relations.length}\n </button>\n </div>\n </div>\n\n <div className=\"repl-interface__terminals\">\n {terminals.map(terminal => {\n const state = terminalStates[terminal.id];\n if (!state) return null;\n\n return (\n <div key={terminal.id} className=\"repl-terminal\">\n {/* Remove terminal header - keep it minimal */}\n <div \n className=\"repl-terminal__output\"\n ref={ref => { outputRefs.current[terminal.id] = ref; }}\n >\n {state.output.map(line => (\n <div key={line.id} className={`repl-output-line ${line.type}`}>\n {line.message.split('\\n').map((textLine, index) => (\n <div key={index}>{textLine}</div>\n ))}\n </div>\n ))}\n </div>\n\n <div className=\"repl-terminal__input\">\n <textarea\n value={state.input}\n onChange={(e) => handleInputChange(terminal.id, e.target.value)}\n onKeyDown={(e) => handleKeyPress(e, terminal.id)}\n placeholder={terminal.placeholder}\n disabled={disabled || state.isExecuting}\n rows={2}\n />\n \n <div className=\"repl-terminal__controls\">\n <button\n className=\"repl-interface__action-button danger\"\n onClick={clearAll}\n disabled={disabled}\n title=\"Clear all data\"\n style={{ marginRight: '4px', fontSize: '10px', padding: '2px 6px' }}\n >\n Clear\n </button>\n \n <button\n className=\"repl-interface__action-button\"\n onClick={() => showHelp('unified')}\n disabled={disabled}\n title=\"Show help\"\n style={{ marginRight: '4px', fontSize: '10px', padding: '2px 6px' }}\n >\n ?\n </button>\n \n <button\n className=\"repl-terminal__execute\"\n onClick={() => handleExecute(terminal.id)}\n disabled={disabled || state.isExecuting || !state.input.trim()}\n title=\"Execute commands (Ctrl+Enter)\"\n >\n {state.isExecuting ? '...' : '▶'}\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Simplified collapsible drawers - only show when opened */}\n {(drawersOpen.nodes || drawersOpen.edges) && (\n <div className=\"repl-interface__drawers\">\n {/* Nodes Drawer */}\n {drawersOpen.nodes && (\n <div className=\"repl-interface__drawer\">\n <div \n className=\"repl-interface__drawer-header\"\n onClick={() => toggleDrawer('nodes')}\n >\n <span>Atoms ({atoms.length})</span>\n <span className=\"repl-interface__drawer-toggle\">▼</span>\n </div>\n <div className=\"repl-interface__drawer-content\">\n {atoms.length === 0 ? (\n <div className=\"repl-interface__drawer-empty\">No atoms</div>\n ) : (\n atoms.map(atom => (\n <div key={atom.id} className=\"repl-interface__drawer-item\">\n <div className=\"repl-interface__drawer-item-content\">\n <div className=\"repl-interface__drawer-item-header\">\n {atom.label}:{atom.type}\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n )}\n\n {/* Edges Drawer */}\n {drawersOpen.edges && (\n <div className=\"repl-interface__drawer\">\n <div \n className=\"repl-interface__drawer-header\"\n onClick={() => toggleDrawer('edges')}\n >\n <span>Relations ({relations.length})</span>\n <span className=\"repl-interface__drawer-toggle\">▼</span>\n </div>\n <div className=\"repl-interface__drawer-content\">\n {relations.length === 0 ? (\n <div className=\"repl-interface__drawer-empty\">No relations</div>\n ) : (\n relations.map(relation => (\n <div key={relation.name} style={{ marginBottom: '6px' }}>\n <div className=\"repl-interface__drawer-item\">\n <div className=\"repl-interface__drawer-item-content\">\n <div className=\"repl-interface__drawer-item-header\">\n {relation.name} ({relation.tuples.length})\n </div>\n </div>\n </div>\n {relation.tuples.slice(0, 3).map((tuple, index) => (\n <div key={index} className=\"repl-interface__drawer-item\" \n style={{marginLeft: '8px', fontSize: '0.7rem'}}>\n <div className=\"repl-interface__drawer-item-content\">\n <div className=\"repl-interface__drawer-item-detail\">\n {tuple.atoms.join(' → ')}\n </div>\n </div>\n </div>\n ))}\n {relation.tuples.length > 3 && (\n <div style={{marginLeft: '8px', fontSize: '0.7rem', color: '#6a737d'}}>\n ... and {relation.tuples.length - 3} more\n </div>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n};","import { ICommandParser, CommandResult } from './CoreParsers';\nimport { IInputDataInstance } from '../../../data-instance/interfaces';\nimport { PyretDataInstance } from '../../../data-instance/pyret/pyret-data-instance';\n\n/**\n * Interface for external Pyret evaluator (e.g., window.__internalRepl)\n */\nexport interface PyretEvaluator {\n /** \n * Run a Pyret expression and return the result\n * @param code - Pyret code to evaluate\n * @param sourceLocation - Optional source location identifier\n * @returns Promise that resolves to evaluation result\n */\n run(code: string, sourceLocation?: string): Promise<PyretEvaluationResult>;\n \n /**\n * Runtime utilities for checking result types\n */\n runtime: {\n isSuccessResult(result: PyretEvaluationResult): boolean;\n };\n}\n\n/**\n * Result of evaluating a Pyret expression\n */\nexport interface PyretEvaluationResult {\n /** The raw Pyret JS value (if successful) */\n result?: unknown;\n /** Exception information (if failed) */\n exn?: unknown;\n /** Whether the evaluation was successful */\n success?: boolean;\n}\n\n\n/**\n * \n * \n */\n\n/**\n * Parser for arbitrary Pyret expressions using an external Pyret evaluator\n * \n * This parser handles Pyret expressions that can be evaluated by an external\n * Pyret runtime (e.g., window.__internalRepl). It can parse and add complex\n * Pyret data structures, builtin types, and collections that would be difficult\n * to handle with simple parsers.\n * \n * Examples of supported expressions:\n * - edge(\"1\", \"b\", 3)\n * - [list: 1, 2, 3, 4]\n * - tree(node(1, empty, empty), node(2, empty, empty))\n * - table: name, age row: \"Alice\", 25 row: \"Bob\", 30 end\n */\nexport class PyretExpressionParser implements ICommandParser {\n private evaluator: PyretEvaluator | null;\n\n constructor(evaluator?: PyretEvaluator) {\n this.evaluator = evaluator || null;\n }\n\n /**\n * Update the external evaluator\n */\n setEvaluator(evaluator: PyretEvaluator | null): void {\n this.evaluator = evaluator;\n }\n\n\n /**\n * Recursively searches for a key at any level in an object\n */\n private findKeyAtAnyLevel(obj: unknown, keyName: string): unknown {\n if (!obj || typeof obj !== 'object') {\n return undefined;\n }\n \n // Check if this object has the key directly\n if (keyName in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[keyName];\n }\n \n // Recursively search in nested objects and arrays\n for (const value of Object.values(obj as Record<string, unknown>)) {\n if (value && typeof value === 'object') {\n const found = this.findKeyAtAnyLevel(value, keyName);\n if (found !== undefined) {\n return found;\n }\n }\n }\n \n return undefined;\n }\n\n /**\n * Checks if a value is a primitive type (string, number, boolean)\n */\n private isPrimitive(value: unknown): value is string | number | boolean {\n return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';\n }\n\n private async evaluateExpression(command: string): Promise<PyretEvaluationResult> {\n if (!this.evaluator) {\n throw new Error('No external Pyret evaluator available');\n }\n \n try {\n const result = await this.evaluator.run(command);\n\n // Step 1: Look for \"exn\" key at any level - if found, it's a failure\n const exnValue = this.findKeyAtAnyLevel(result, 'exn');\n if (exnValue !== undefined) {\n return {\n success: false,\n exn: exnValue,\n };\n }\n \n // Step 2: Look for \"answer\" key at any level - if found, process it\n const answerValue = this.findKeyAtAnyLevel(result, 'answer');\n if (answerValue !== undefined) {\n return {\n success: true,\n result: answerValue,\n };\n }\n\n // Step 3: Check if the result is a primitive value directly\n if (this.isPrimitive(result)) {\n return {\n success: true,\n result: result,\n };\n }\n\n // If we can't find an answer or exn, return failure\n return {\n success: false,\n exn: 'Unable to find answer or exn in evaluation result',\n };\n \n } catch (error) {\n return {\n success: false,\n exn: error instanceof Error ? error.message : 'Unknown evaluation error',\n };\n }\n }\n\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n\n // Handle reify command\n if (trimmed.toLowerCase() === 'reify') {\n return true;\n }\n\n // If the command is a string or number literal, we CAN handle it.\n if (/^['\"`].*['\"`]$/.test(trimmed) || /^\\d+(\\.\\d+)?$/.test(trimmed)) {\n return true;\n }\n \n // Only handle commands if we have an external evaluator\n if (!this.evaluator) {\n return false;\n }\n \n // TODO: Improve this heuristic with deeper Pyret syntax analysis\n // This is currently a hand-wavy heuristic that could be made more robust\n \n // Exclude remove commands (handled by RemoveCommandParser)\n if (trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Exclude utility commands\n const utilityCommands = ['help', 'info', 'status', 'list', 'clear'];\n if (utilityCommands.includes(trimmed.toLowerCase())) {\n return false;\n }\n \n // Exclude simple atom syntax (handled by AtomCommandParser)\n // But allow table syntax which also contains colons\n if (/^[^:]+:.+$/.test(trimmed) && !trimmed.includes('(') && !trimmed.includes('[') && \n !trimmed.includes('table:') && !trimmed.includes('row:')) {\n return false;\n }\n \n // Exclude simple dot notation (handled by DotNotationRelationParser) \n if (trimmed.includes('.') && trimmed.includes('=') && !trimmed.includes('(')) {\n return false;\n }\n \n // Handle expressions that look like Pyret code:\n // - Function calls: func(args)\n // - Constructors: Constructor(args) \n // - Lists: [list: items]\n // - Complex expressions with parentheses or brackets\n if (trimmed.includes('(') && trimmed.includes(')')) {\n return true;\n }\n \n if (trimmed.includes('[') && trimmed.includes(']')) {\n return true;\n }\n \n // Handle other Pyret-like expressions (tables, etc.)\n if (trimmed.includes('table:') || trimmed.includes('row:')) {\n return true;\n }\n \n return false;\n }\n \n getPriority(): number {\n return 90; // Lower priority than specific parsers, but higher than fallback\n }\n \n getCommandPatterns(): string[] {\n return [\n 'reify',\n '[list: 1, 2, 3, 4]',\n 'edge(\"id\", \"label\", weight)'\n ];\n }\n\n execute(command: string, instance: IInputDataInstance): Promise<CommandResult> {\n const trimmed = command.trim();\n\n // Handle reify command\n if (trimmed.toLowerCase() === 'reify') {\n return this.reifyInstance(instance).then(lines => ({\n success: true,\n message: lines.length > 0 ? lines.join('\\n') : 'No data to reify',\n action: 'info' as const\n }));\n }\n\n if (!this.evaluator) {\n return Promise.resolve({\n success: false,\n message: 'No external Pyret evaluator available. Cannot evaluate Pyret expressions.\\n\\nTo enable this feature, ensure window.__internalRepl is available.'\n });\n }\n\n // Return a promise that resolves with the actual result\n return this.evaluateExpression(trimmed)\n .then(async (evaluationResult) => {\n if (evaluationResult.success) {\n // Add the result to the instance\n const result = await this.addPyretResultToInstance(evaluationResult.result, instance, trimmed);\n return result;\n } else {\n return {\n success: false,\n message: `Evaluation failed: ${this.formatError(evaluationResult.exn)}`\n };\n }\n })\n .catch((error) => {\n return {\n success: false,\n message: `Unexpected error during evaluation: ${this.formatError(error)}`\n };\n });\n }\n\n /**\n * Re-ify data instance back to Pyret expressions using the external evaluator\n * This leverages the external evaluator for converting internal data back to Pyret form\n */\n async reifyInstance(instance: IInputDataInstance): Promise<string[]> {\n if (!this.evaluator) {\n return ['// No external Pyret evaluator available for reification'];\n }\n\n const reifyLines: string[] = [];\n \n try {\n // Re-ify atoms\n const atoms = instance.getAtoms();\n for (const atom of atoms) {\n // Convert atom to Pyret syntax based on type\n if (atom.type) {\n reifyLines.push(`${atom.label}:${atom.type}`);\n } else {\n reifyLines.push(atom.label);\n }\n }\n\n // Re-ify relations\n const relations = instance.getRelations();\n for (const relation of relations) {\n for (const tuple of relation.tuples) {\n if (tuple.atoms.length === 2) {\n // Binary relation - use dot notation\n reifyLines.push(`${tuple.atoms[0]}.${relation.name}=${tuple.atoms[1]}`);\n } else {\n // N-ary relation - use function-call syntax\n const args = tuple.atoms.map(a => `\"${a}\"`).join(', ');\n reifyLines.push(`${relation.name}(${args})`);\n }\n }\n }\n\n return reifyLines;\n } catch (error) {\n return [\n '// Error during reification:',\n `// ${error instanceof Error ? error.message : 'Unknown error'}`\n ];\n }\n }\n /**\n * Extract CnD specification from an expression by creating a faux expression and running it in the external evaluator\n */\n private async extractCndSpec(pyretResult: any, originalExpression: string): Promise<string | undefined> {\n try {\n // Only proceed if we have an evaluator\n if (!this.evaluator) {\n return undefined;\n }\n \n // Create a faux expression to call _cndspec on the result\n const cndSpecCode = `(${originalExpression})._cndspec()`;\n const specResult = await this.evaluateExpression(cndSpecCode);\n \n if (specResult.success && specResult.result) {\n // If result is a string, that's the CnD spec\n if (typeof specResult.result === 'string') {\n return specResult.result;\n }\n }\n \n\n } catch (error) {\n console.error('Error extracting CnD spec:', this.formatError(error));\n }\n // If error or no result, return undefined\n return undefined;\n }\n\n private async addPyretResultToInstance(\n pyretResult: any, \n instance: IInputDataInstance, \n originalExpression: string\n ): Promise<CommandResult> {\n try {\n // First, attempt to extract CnD specification if available\n const extractedCndSpec = await this.extractCndSpec(pyretResult, originalExpression);\n \n // Use PyretDataInstance.fromExpression for cleaner, more robust handling\n if (!this.evaluator) {\n throw new Error('No external Pyret evaluator available');\n }\n\n // Create a temporary instance from the expression using the improved static method\n const tempInstance = await PyretDataInstance.fromExpression(\n originalExpression, \n {\n\n\n \n }, // showFunctions\n this.evaluator\n );\n\n // Check if we have any data to add\n if (tempInstance.getAtoms().length === 0) {\n return {\n success: false,\n message: 'Pyret expression did not produce any data structures',\n extractedCndSpec\n };\n }\n\n // Use the built-in addFromDataInstance method for proper merging\n const success = (instance as any).addFromDataInstance?.(tempInstance, true);\n \n if (!success) {\n // Fallback for non-PyretDataInstance targets or if method doesn't exist\n return this.fallbackAddToInstance(tempInstance, instance, originalExpression, extractedCndSpec);\n }\n\n const atomCount = tempInstance.getAtoms().length;\n const relationCount = tempInstance.getRelations().reduce((sum, rel) => sum + rel.tuples.length, 0);\n\n const message = `Evaluated Pyret expression: ${originalExpression}\\nAdded ${atomCount} atoms and ${relationCount} relation tuples` +\n (extractedCndSpec ? '\\nExtracted CnD specification from result' : '');\n\n return {\n success: true,\n message,\n action: 'add',\n extractedCndSpec\n };\n\n } catch (error) {\n return {\n success: false,\n message: `Failed to convert Pyret result to data instance: ${this.formatError(error)}`\n };\n }\n }\n\n /**\n * Fallback method for adding data when addFromDataInstance is not available\n */\n private fallbackAddToInstance(\n tempInstance: PyretDataInstance, \n instance: IInputDataInstance, \n originalExpression: string, \n extractedCndSpec?: string\n ): CommandResult {\n let atomsAdded = 0;\n let relationsAdded = 0;\n\n // Add all atoms to the main instance\n for (const atom of tempInstance.getAtoms()) {\n try {\n // Generate unique ID if there's a conflict\n let uniqueId = atom.id;\n const existingIds = new Set(instance.getAtoms().map(a => a.id));\n let counter = 1;\n\n while (existingIds.has(uniqueId)) {\n uniqueId = `${atom.id}_${counter}`;\n counter++;\n }\n\n const atomToAdd = { ...atom, id: uniqueId };\n instance.addAtom(atomToAdd);\n atomsAdded++;\n } catch (error) {\n console.warn('Failed to add atom:', error);\n }\n }\n\n // Add all relation tuples to the main instance\n for (const relation of tempInstance.getRelations()) {\n for (const tuple of relation.tuples) {\n try {\n instance.addRelationTuple(relation.name, tuple);\n relationsAdded++;\n } catch (error) {\n console.warn('Failed to add relation tuple:', error);\n }\n }\n }\n\n const message = `Evaluated Pyret expression: ${originalExpression}\\nAdded ${atomsAdded} atoms and ${relationsAdded} relation tuples` +\n (extractedCndSpec ? '\\nExtracted CnD specification from result' : '');\n\n return {\n success: true,\n message,\n action: 'add',\n extractedCndSpec\n };\n }\n\n /**\n * Format Pyret evaluation errors for display\n */\n private formatError(error: any): string {\n if (!error) {\n return 'Unknown error';\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (typeof error === 'object' && error !== null) {\n // Try to extract useful error information from Pyret error objects\n const errorObj = error;\n\n if (errorObj.message) {\n return errorObj.message;\n }\n\n if (errorObj.toString && typeof errorObj.toString === 'function') {\n return errorObj.toString();\n }\n }\n\n return String(error);\n }\n\n getHelp(): string[] {\n const baseHelp = [\n 'Pyret Expression Commands (requires external evaluator):',\n ' reify - Convert current data instance back to Pyret expressions',\n ' edge(\"id\", \"label\", weight) - Add edge data structure',\n ' [list: 1, 2, 3, 4] - Add Pyret list',\n ' tree(left, right) - Add tree data structure',\n ' table: col1, col2 row: val1, val2 end - Add table data structure',\n '',\n 'This parser can evaluate arbitrary Pyret expressions and convert',\n 'the results into atoms and relations in the data instance.',\n ];\n \n if (!this.evaluator) {\n return [\n ...baseHelp,\n '',\n '⚠️ External Pyret evaluator not available.',\n 'This parser requires window.__internalRepl or similar.',\n 'The \"reify\" command works without external evaluator.'\n ];\n }\n \n return [\n ...baseHelp,\n '',\n '✓ External Pyret evaluator is available.',\n 'You can use any valid Pyret expression.'\n ];\n }\n}","import { ICommandParser, CommandResult } from './CoreParsers';\nimport { IInputDataInstance, IAtom } from '../../../data-instance/interfaces';\nimport { PyretDataInstance } from '../../../data-instance/pyret/pyret-data-instance';\nimport { PyretEvaluator } from './PyretExpressionParser';\n\n/**\n * Parser for Pyret-style ID allocation syntax\n * \n * Supports:\n * - x = 1 (allocate ID 'x' to a primitive value)\n * - xz = Black(...) (allocate ID 'xz' to a constructor expression)\n * - alice = [list: 1, 2, 3] (allocate ID 'alice' to a list)\n * \n * This parser uses the external evaluator to infer proper types instead of\n * defaulting to generic types like \"1:Number\"\n */\nexport class PyretIdAllocationParser implements ICommandParser {\n private evaluator: PyretEvaluator | null;\n\n constructor(evaluator?: PyretEvaluator) {\n this.evaluator = evaluator || null;\n }\n\n /**\n * Update the external evaluator\n */\n setEvaluator(evaluator: PyretEvaluator | null): void {\n this.evaluator = evaluator;\n }\n\n canHandle(command: string): boolean {\n const trimmed = command.trim();\n \n // Must contain an assignment operator\n if (!trimmed.includes('=')) {\n return false;\n }\n \n // Exclude remove commands\n if (trimmed.startsWith('remove ')) {\n return false;\n }\n \n // Exclude utility commands\n const utilityCommands = ['help', 'info', 'status', 'list', 'clear', 'reify'];\n if (utilityCommands.includes(trimmed.toLowerCase())) {\n return false;\n }\n \n // Exclude dot notation relations (handled by DotNotationRelationParser)\n // Only exclude if dot comes before equals (e.g., alice.friend=bob)\n if (trimmed.includes('.') && trimmed.includes('=')) {\n const dotIndex = trimmed.indexOf('.');\n const equalsIndex = trimmed.indexOf('=');\n if (dotIndex < equalsIndex) {\n return false; // This is dot notation relation like alice.friend=bob\n }\n }\n \n // Pattern: id = expression\n // Where id is a valid identifier and expression is a Pyret expression\n // Exclude comparison operators (==, !=, <=, >=, etc.)\n const assignmentMatch = trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*=(?!=)\\s*(.+)$/);\n if (!assignmentMatch) {\n return false;\n }\n \n const [, id, expression] = assignmentMatch;\n \n // Validate ID\n if (!this.isValidId(id)) {\n return false;\n }\n \n // Check if the expression looks like a Pyret expression or primitive\n return this.looksLikePyretExpression(expression);\n }\n \n getPriority(): number {\n return 110; // Higher priority than AtomCommandParser but lower than RemoveCommandParser\n }\n \n getCommandPatterns(): string[] {\n return [\n 'x = 1',\n 'alice = \"Alice\"',\n 'node = Black(...)',\n 'mylist = [list: 1, 2, 3]',\n 'tree = node(1, empty, empty)'\n ];\n }\n\n async execute(command: string, instance: IInputDataInstance): Promise<CommandResult> {\n const trimmed = command.trim();\n \n const assignmentMatch = trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*=(?!=)\\s*(.+)$/);\n if (!assignmentMatch) {\n return {\n success: false,\n message: 'Invalid assignment syntax. Use: id = expression'\n };\n }\n \n const [, assignedId, expression] = assignmentMatch;\n \n try {\n // Check if ID is already in use\n const existingAtom = instance.getAtoms().find(a => a.id === assignedId);\n if (existingAtom) {\n return {\n success: false,\n message: `ID '${assignedId}' is already in use. Use a different ID or remove the existing atom first.`\n };\n }\n \n if (this.isPrimitiveExpression(expression)) {\n // Handle primitive values directly\n return this.handlePrimitiveAssignment(assignedId, expression, instance);\n }\n \n if (!this.evaluator) {\n return {\n success: false,\n message: 'No external Pyret evaluator available. Cannot evaluate complex expressions.\\n\\nTo enable this feature, ensure window.__internalRepl is available.'\n };\n }\n \n // Use external evaluator for complex expressions\n return await this.handleComplexAssignment(assignedId, expression, instance);\n \n } catch (error) {\n return {\n success: false,\n message: `Failed to assign '${assignedId}': ${error instanceof Error ? error.message : 'Unknown error'}`\n };\n }\n }\n\n private isValidId(id: string): boolean {\n // Valid JavaScript identifier that doesn't conflict with keywords\n const reservedWords = ['add', 'remove', 'help', 'info', 'list', 'clear', 'reify'];\n return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(id) && !reservedWords.includes(id.toLowerCase());\n }\n\n private looksLikePyretExpression(expression: string): boolean {\n const trimmed = expression.trim();\n \n // Primitive values\n if (this.isPrimitiveExpression(trimmed)) {\n return true;\n }\n \n // Complex Pyret expressions\n return (\n // Function calls or constructors\n (trimmed.includes('(') && trimmed.includes(')')) ||\n // Lists or collections\n (trimmed.includes('[') && trimmed.includes(']')) ||\n // Tables\n trimmed.includes('table:') ||\n trimmed.includes('row:')\n );\n }\n\n private isPrimitiveExpression(expression: string): boolean {\n const trimmed = expression.trim();\n \n return (\n // Numbers (including floats)\n /^\\d+(\\.\\d+)?$/.test(trimmed) ||\n // Strings\n /^['\"`].*['\"`]$/.test(trimmed) ||\n // Booleans\n trimmed === 'true' || trimmed === 'false'\n );\n }\n\n private handlePrimitiveAssignment(assignedId: string, expression: string, instance: IInputDataInstance): CommandResult {\n const trimmed = expression.trim();\n let value: string | number | boolean;\n let type: string;\n \n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) {\n // Number\n value = trimmed.includes('.') ? parseFloat(trimmed) : parseInt(trimmed);\n type = 'Number';\n } else if (/^['\"`](.*)['\"`]$/.test(trimmed)) {\n // String\n value = trimmed.slice(1, -1); // Remove quotes\n type = 'String';\n } else if (trimmed === 'true' || trimmed === 'false') {\n // Boolean\n value = trimmed === 'true';\n type = 'Boolean';\n } else {\n return {\n success: false,\n message: `Cannot parse primitive value: ${expression}`\n };\n }\n \n const atom: IAtom = {\n id: assignedId,\n label: String(value),\n type: type\n };\n \n instance.addAtom(atom);\n \n return {\n success: true,\n message: `[${assignedId}] Assigned ${assignedId} = ${value} (${type})`,\n action: 'add'\n };\n }\n\n private async handleComplexAssignment(assignedId: string, expression: string, instance: IInputDataInstance): Promise<CommandResult> {\n if (!this.evaluator) {\n throw new Error('External evaluator not available');\n }\n \n try {\n // Evaluate the expression\n const evaluationResult = await this.evaluator.run(expression);\n \n if (!this.evaluator.runtime.isSuccessResult(evaluationResult)) {\n return {\n success: false,\n message: `Failed to evaluate expression '${expression}': ${this.formatError(evaluationResult.exn)}`\n };\n }\n \n // Create a temporary PyretDataInstance from the result\n const tempInstance = await PyretDataInstance.fromExpression(\n expression,\n false, // showFunctions\n this.evaluator\n );\n \n if (tempInstance.getAtoms().length === 0) {\n return {\n success: false,\n message: `Expression '${expression}' did not produce any data structures`\n };\n }\n \n // Get the first (root) atom and assign the specified ID\n const rootAtoms = tempInstance.getAtoms();\n const rootAtom = rootAtoms[0];\n \n // Create new atom with assigned ID\n const assignedAtom: IAtom = {\n id: assignedId,\n label: rootAtom.label,\n type: rootAtom.type\n };\n \n instance.addAtom(assignedAtom);\n \n // If there are multiple atoms or relations, add them with updated references\n if (rootAtoms.length > 1 || tempInstance.getRelations().length > 0) {\n // Update all references from the original root atom ID to the assigned ID\n await this.mergeInstanceWithIdMapping(tempInstance, instance, rootAtom.id, assignedId);\n }\n \n const atomCount = rootAtoms.length;\n const relationCount = tempInstance.getRelations().reduce((sum, rel) => sum + rel.tuples.length, 0);\n \n return {\n success: true,\n message: `[${assignedId}] Assigned ${assignedId} = ${expression}\\nAdded ${atomCount} atoms and ${relationCount} relation tuples`,\n action: 'add'\n };\n \n } catch (error) {\n return {\n success: false,\n message: `Failed to evaluate and assign '${expression}': ${error instanceof Error ? error.message : 'Unknown error'}`\n };\n }\n }\n\n private async mergeInstanceWithIdMapping(\n sourceInstance: PyretDataInstance, \n targetInstance: IInputDataInstance, \n oldRootId: string, \n newRootId: string\n ): Promise<void> {\n // Create ID mapping\n const idMapping = new Map<string, string>();\n idMapping.set(oldRootId, newRootId);\n \n // Add remaining atoms (skip the root atom as it's already added)\n for (const atom of sourceInstance.getAtoms()) {\n if (atom.id === oldRootId) continue;\n \n // Generate unique ID for non-root atoms\n let uniqueId = atom.id;\n const existingIds = new Set(targetInstance.getAtoms().map(a => a.id));\n let counter = 1;\n \n while (existingIds.has(uniqueId)) {\n uniqueId = `${atom.id}_${counter}`;\n counter++;\n }\n \n idMapping.set(atom.id, uniqueId);\n \n const mappedAtom: IAtom = {\n id: uniqueId,\n label: atom.label,\n type: atom.type\n };\n \n targetInstance.addAtom(mappedAtom);\n }\n \n // Add relations with mapped IDs\n for (const relation of sourceInstance.getRelations()) {\n for (const tuple of relation.tuples) {\n const mappedAtoms = tuple.atoms.map(atomId => idMapping.get(atomId) || atomId);\n \n targetInstance.addRelationTuple(relation.name, {\n atoms: mappedAtoms\n });\n }\n }\n }\n\n private formatError(error: unknown): string {\n if (error && typeof error === 'object' && 'message' in error) {\n return String((error as any).message);\n }\n return String(error);\n }\n\n getHelp(): string[] {\n const baseHelp = [\n 'ID Allocation Commands (Pyret-style):',\n ' id = expression - Assign specific ID to expression result',\n '',\n 'Primitive Examples:',\n ' x = 1 - Assign ID \"x\" to number 1',\n ' name = \"Alice\" - Assign ID \"name\" to string \"Alice\"',\n ' flag = true - Assign ID \"flag\" to boolean true',\n ];\n \n if (this.evaluator) {\n baseHelp.push(\n '',\n 'Complex Examples (with external evaluator):',\n ' node = Black(1, 2) - Assign ID \"node\" to constructor result',\n ' mylist = [list: 1, 2, 3] - Assign ID \"mylist\" to list',\n ' tree = node(1, empty, empty) - Assign ID \"tree\" to tree structure'\n );\n } else {\n baseHelp.push(\n '',\n 'Note: Complex expressions require external Pyret evaluator',\n ' Only primitive values (numbers, strings, booleans) are supported'\n );\n }\n \n return baseHelp;\n }\n}","/**\n * Pyret-specific REPL interface component\n * \n * This component provides a REPL interface pre-configured for Pyret data instances.\n * It can be used as a standalone component or integrated into larger applications.\n * \n * \n * \n * \n * \n * // TODO:\n * - List functionality is not correct, but we can get there!\n * - Relations can be \n */\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { ReplInterface, ReplInterfaceProps, TerminalConfig } from './ReplInterface';\nimport { PyretDataInstance } from '../../data-instance/pyret/pyret-data-instance';\nimport { IInputDataInstance } from '../../data-instance/interfaces';\nimport { PyretEvaluator, PyretExpressionParser } from './parsers/PyretExpressionParser';\nimport { RemoveCommandParser, AtomCommandParser, DotNotationRelationParser } from './parsers/CoreParsers';\nimport { InfoCommandParser } from './parsers/ExtensibleParsers';\nimport { PyretIdAllocationParser } from './parsers/PyretIdAllocationParser';\n\nexport interface PyretReplInterfaceProps extends Omit<ReplInterfaceProps, 'instance'> {\n /** Initial Pyret data instance. If not provided, an empty instance will be created. */\n initialInstance?: PyretDataInstance;\n /** Callback fired when the instance changes */\n onChange?: (instance: PyretDataInstance) => void;\n /** Callback when CnD specification is extracted from an expression */\n onCndSpecExtracted?: (spec: string) => void;\n /** Optional external Pyret evaluator (e.g., window.__internalRepl) */\n externalEvaluator?: PyretEvaluator;\n}\n\n/**\n * Create an empty PyretDataInstance\n */\nfunction createEmptyPyretDataInstance(): PyretDataInstance {\n const emptyPyretObject = {\n dict: {},\n brands: {}\n };\n return new PyretDataInstance(emptyPyretObject);\n}\n\n/**\n * Pyret-specific REPL interface component that manages its own PyretDataInstance\n */\nexport const PyretReplInterface: React.FC<PyretReplInterfaceProps> = ({\n initialInstance,\n onChange,\n onCndSpecExtracted,\n externalEvaluator,\n ...replProps\n}) => {\n const [instance, setInstance] = useState<PyretDataInstance>(\n () => initialInstance || createEmptyPyretDataInstance()\n );\n\n // Create terminal configuration with PyretExpressionParser if evaluator is available\n const terminals = useMemo(() => {\n const pyretExpressionParser = new PyretExpressionParser(externalEvaluator);\n const pyretIdAllocationParser = new PyretIdAllocationParser(externalEvaluator);\n \n const baseTerminals: TerminalConfig[] = [\n {\n id: 'unified',\n title: externalEvaluator ? 'Full Pyret REPL' : 'Enhanced REPL',\n description: externalEvaluator \n ? 'Supports ID allocation (x=1), expression evaluation, and enhanced remove commands'\n : 'Supports ID allocation (x=1), enhanced remove commands, and basic operations',\n parsers: [\n new RemoveCommandParser(), // Priority 200 - highest priority for remove commands\n new DotNotationRelationParser(), // Priority 115 - dot notation relations\n pyretIdAllocationParser, // Priority 110 - ID allocation syntax (x=1)\n new AtomCommandParser(), // Priority 100 - standard atom commands (Label:Type)\n pyretExpressionParser, // Priority 90 - Pyret expressions (only if evaluator available)\n new InfoCommandParser() // Priority 50 - fallback utility commands\n ].filter(parser => {\n // Remove PyretExpressionParser if no external evaluator\n if (parser instanceof PyretExpressionParser && !externalEvaluator) {\n return false;\n }\n return true;\n }).sort((a, b) => b.getPriority() - a.getPriority()), // Sort by priority descending\n placeholder: 'x = 1\\nalice = \"Alice\"\\nremove alice.friend\\nlist-ids'\n }\n ];\n \n return baseTerminals;\n }, [externalEvaluator]);\n\n // Handle instance changes\n const handleInstanceChange = (updatedInstance: IInputDataInstance) => {\n if (updatedInstance instanceof PyretDataInstance) {\n setInstance(updatedInstance);\n onChange?.(updatedInstance);\n }\n };\n\n // Update instance when initialInstance prop changes\n useEffect(() => {\n if (initialInstance && initialInstance !== instance) {\n setInstance(initialInstance);\n }\n }, [initialInstance]);\n\n return (\n <ReplInterface\n instance={instance}\n onChange={handleInstanceChange}\n onCndSpecExtracted={onCndSpecExtracted}\n terminals={terminals}\n {...replProps}\n />\n );\n};\n\nexport default PyretReplInterface;","/**\n * Item definition registry for the Spytial spec editor.\n *\n * Each constraint/directive type is described by an `ItemDefinition` (fields,\n * defaults, one-line summary, optional validation, and optional YAML emission /\n * ingestion overrides for quirky shapes). The builder renders forms generically\n * from `FieldSpec[]`, and the YAML codec round-trips through `toYamlNode` /\n * `fromYamlNode` when present.\n *\n * The accepted/emitted YAML shapes here are pinned against the authoritative\n * layout-engine parser (`src/layout/layoutspec.ts`) so that anything this\n * registry round-trips also parses there. Notable shapes:\n *\n * constraints:\n * - orientation: { selector, directions: [...], hold? }\n * - cyclic: { selector, direction, hold? }\n * - align: { selector, direction, hold? }\n * - group: { selector, name, addEdge?: none|togroup|fromgroup | {points,lineStyle,textStyle}, textStyle?:{color}, hold? } (groupselector)\n * - group: { field, groupOn, addToGroup, selector?, hold? } (groupfield, deprecated)\n * - size: { selector, width, height }\n * - hideAtom: { selector }\n * directives:\n * - flag: <scalar string>\n * - attribute: { field, selector?, filter?, textStyle?:{size,color} }\n * - hideField: { field, selector?, filter? }\n * - icon: { path, selector?, showLabels? }\n * - atomStyle: { selector?, fillStyle?:{color}, borderStyle?:{color,width}, textStyle?:{size,color} }\n * - atomColor: { value, selector? } (deprecated → atomStyle)\n * - edgeStyle: { field, selector?, filter?, lineStyle?:{color,pattern,weight,highlight}, textStyle?:{size,color}, showLabel?, hidden? }\n * - edgeColor: { value, field, selector?, filter?, style?, weight?, showLabel?, hidden?, highlight? } (deprecated → edgeStyle)\n * - inferredEdge: { name, selector?, draw?, lineStyle?:{color,pattern,weight,highlight}, textStyle?:{size,color} }\n * - tag: { toTag, name, value, textStyle?:{size,color} }\n *\n * This module is framework-agnostic — no React.\n */\n\nimport type { Diagnostic, FieldSpec, ItemDefinition, ItemKind } from './types';\n\n// Defaults mirrored from src/components/NoCodeView/constants.ts so the new\n// editor produces the same starting values as the editor it replaces. We keep\n// local copies (rather than importing the React-adjacent module) to keep this\n// package free of any coupling to the old NoCodeView internals.\nexport const DEFAULT_NODE_WIDTH = 100;\nexport const DEFAULT_NODE_HEIGHT = 60;\nconst DEFAULT_COLOR = '#000000';\n\n// ---- small param helpers -------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asString(value: unknown): string {\n if (value === undefined || value === null) {\n return '';\n }\n return String(value);\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((v) => asString(v)).filter((v) => v.length > 0);\n }\n if (value === undefined || value === null || value === '') {\n return [];\n }\n return [asString(value)];\n}\n\nfunction missing(value: unknown): boolean {\n return value === undefined || value === null || value === '';\n}\n\nfunction fieldError(\n fieldKey: string,\n message: string,\n severity: Diagnostic['severity'] = 'error',\n): Diagnostic {\n return { severity, message, fieldKey, source: 'structure' };\n}\n\n// ---- enum option sets (mirror src/layout/layoutspec.ts) ------------------\n\nexport const ORIENTATION_DIRECTIONS = [\n 'above',\n 'below',\n 'left',\n 'right',\n 'directlyAbove',\n 'directlyBelow',\n 'directlyLeft',\n 'directlyRight',\n] as const;\n\nexport const CYCLIC_DIRECTIONS = ['clockwise', 'counterclockwise'] as const;\nexport const ALIGN_DIRECTIONS = ['horizontal', 'vertical'] as const;\nexport const EDGE_STYLES = ['solid', 'dashed', 'dotted'] as const;\n\n/**\n * Text-size tiers for a label line, relative to the node label. `large` renders\n * bigger than the label, `normal` (the engine default) smaller, `small` smaller\n * still. (Mirrors AttrTextSize in text-extent.ts.) Used as the `size` option in\n * the shared `textStyle` block ({@link TEXT_STYLE_FIELDS}). No field `default` is\n * set — an unset value is omitted from YAML and the engine treats it as `normal`,\n * so specs stay clean.\n */\nexport const TEXT_SIZE_OPTIONS = ['small', 'normal', 'large'] as const;\n\n/**\n * Shared `textStyle` block children — reused wherever a label is styled\n * (attribute, tag, edgeStyle, atomStyle, group). No defaults (sparse). Declared\n * here, ahead of the directive definitions, so every consumer can reference it.\n */\nconst TEXT_STYLE_FIELDS: readonly FieldSpec[] = [\n { key: 'size', kind: 'enum', options: TEXT_SIZE_OPTIONS, label: 'Size' },\n { key: 'color', kind: 'color', label: 'Color' },\n];\n\n/**\n * Direction of the optional edge a group-by-selector draws between the group\n * key and the group. `none` draws nothing; `togroup` points key → group;\n * `fromgroup` points group → key. (Mirrors GroupEdgeDirection in layoutspec.ts.)\n */\nexport const GROUP_EDGE_DIRECTIONS = ['none', 'togroup', 'fromgroup'] as const;\n\n/**\n * Normalise an `addEdge` value into a GROUP_EDGE_DIRECTIONS member. Tolerates\n * the legacy boolean flag (`true` → 'togroup') and the block form\n * (`{ points, lineStyle, textStyle }` → its `points`), so a hand-authored\n * styled connector keeps its direction when round-tripped through the Builder.\n */\nfunction normGroupEdge(value: unknown): (typeof GROUP_EDGE_DIRECTIONS)[number] {\n if (value && typeof value === 'object') value = (value as Record<string, unknown>).points;\n if (value === true || value === 'togroup') return 'togroup';\n if (value === 'fromgroup') return 'fromgroup';\n return 'none';\n}\n\n/**\n * The complete set of flags the engine recognizes (`layoutspec.ts` checks for\n * exactly these and silently ignores anything else). A closed set, so the\n * builder offers a choice instead of free text.\n */\nexport const FLAG_OPTIONS = [\n 'hideDisconnected',\n 'hideDisconnectedBuiltIns',\n] as const;\n\n// ---- definitions ---------------------------------------------------------\n\n/**\n * Orientation: directions describe the TARGET relative to the SOURCE of the\n * selector edge. `directions: [left]` on selector `parent` means the target end\n * of each `parent` tuple is drawn left of the source. Summaries read in that\n * direction. (Some prose in constraints.md says the opposite; the parser is\n * authoritative.)\n */\nconst orientation: ItemDefinition = {\n kind: 'constraint',\n type: 'orientation',\n label: 'Orientation',\n description: 'Specify the relative positioning of elements.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'binary',\n placeholder: 'e.g. parent',\n help: 'Binary selector; orientation applies from the source end to the target end of each tuple.',\n },\n {\n key: 'directions',\n kind: 'enum',\n label: 'Directions',\n required: true,\n multiple: true,\n options: ORIENTATION_DIRECTIONS,\n help: 'Where the target sits relative to the source.',\n },\n ],\n summary(params) {\n const dirs = asStringArray(params.directions);\n const selector = asString(params.selector);\n const dirText = dirs.length > 0 ? dirs.join(', ') : 'no directions';\n return selector ? `target ${dirText} of source · ${selector}` : `target ${dirText} of source`;\n },\n validate(params) {\n const out: Diagnostic[] = [];\n const dirs = asStringArray(params.directions);\n const has = (d: string): boolean => dirs.includes(d);\n if (has('above') && has('below')) {\n out.push(fieldError('directions', 'Cannot be both above and below.'));\n }\n if (has('left') && has('right')) {\n out.push(fieldError('directions', 'Cannot be both left and right.'));\n }\n return out;\n },\n};\n\nconst cyclic: ItemDefinition = {\n kind: 'constraint',\n type: 'cyclic',\n label: 'Cyclic',\n description: 'Arrange elements along the perimeter of a circle.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'binary',\n },\n {\n key: 'direction',\n kind: 'enum',\n label: 'Direction',\n options: CYCLIC_DIRECTIONS,\n default: 'clockwise',\n },\n ],\n summary(params) {\n const dir = asString(params.direction) || 'clockwise';\n const selector = asString(params.selector);\n return selector ? `${dir} · ${selector}` : dir;\n },\n};\n\nconst align: ItemDefinition = {\n kind: 'constraint',\n type: 'align',\n label: 'Align',\n description: 'Ensure elements are aligned horizontally or vertically.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'binary',\n },\n {\n key: 'direction',\n kind: 'enum',\n label: 'Direction',\n required: true,\n options: ALIGN_DIRECTIONS,\n default: 'horizontal',\n },\n ],\n summary(params) {\n const dir = asString(params.direction) || 'horizontal';\n const selector = asString(params.selector);\n return selector ? `${dir} · ${selector}` : dir;\n },\n};\n\n/**\n * Group by selector. Emits under the `group:` key. The authoritative parser\n * distinguishes byselector from byfield by the presence of `field`.\n */\nconst groupselector: ItemDefinition = {\n kind: 'constraint',\n type: 'groupselector',\n label: 'Group (by selector)',\n description: 'Group elements based on a selector.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'binary',\n },\n {\n key: 'name',\n kind: 'text',\n label: 'Group name',\n placeholder: 'e.g. cluster',\n },\n {\n key: 'addEdge',\n kind: 'enum',\n label: 'Add edge',\n options: GROUP_EDGE_DIRECTIONS,\n default: 'none',\n help: 'Draw an edge between the group key and the group: \"togroup\" points key → group, \"fromgroup\" points group → key, \"none\" draws nothing. (To style that connector, author addEdge as a block — { points, lineStyle, textStyle } — in YAML.)',\n },\n {\n key: 'textStyle',\n kind: 'group',\n label: 'Label text style',\n // Only `color` today — group labels auto-fit their box, so `size` is reserved.\n children: [{ key: 'color', kind: 'color', label: 'Color' }],\n },\n ],\n summary(params) {\n const selector = asString(params.selector);\n const name = asString(params.name);\n const base = name ? `group \"${name}\"` : 'group';\n return selector ? `${base} · ${selector}` : base;\n },\n toYamlNode(params) {\n const node: Record<string, unknown> = { selector: asString(params.selector) };\n if (!missing(params.name)) {\n node.name = asString(params.name);\n }\n const edge = normGroupEdge(params.addEdge);\n if (edge !== 'none') {\n node.addEdge = edge;\n }\n // The group's own label styling (sparse — drop empty leaves).\n if (isRecord(params.textStyle)) {\n const ts: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(params.textStyle)) {\n if (v !== undefined && v !== null && v !== '') ts[k] = v;\n }\n if (Object.keys(ts).length > 0) node.textStyle = ts;\n }\n if (params.hold !== undefined) {\n node.hold = params.hold;\n }\n return { group: node };\n },\n fromYamlNode(node) {\n if (!isRecord(node)) {\n return null;\n }\n const group = node.group;\n if (!isRecord(group) || group.field !== undefined) {\n return null; // not a byselector group\n }\n const params: Record<string, unknown> = {\n selector: asString(group.selector),\n addEdge: normGroupEdge(group.addEdge),\n };\n if (group.name !== undefined) {\n params.name = asString(group.name);\n }\n // Preserve the group's own label styling (whatever leaves were authored).\n if (isRecord(group.textStyle)) {\n params.textStyle = { ...group.textStyle };\n }\n if (group.hold !== undefined) {\n params.hold = group.hold;\n }\n return params;\n },\n};\n\n/**\n * Group by field — DEPRECATED. Parsed/rendered for back-compat but hidden from\n * the add menu. Prefer `groupselector` with a binary relation.\n */\nconst groupfield: ItemDefinition = {\n kind: 'constraint',\n type: 'groupfield',\n label: 'Group (by field)',\n description: 'Group elements based on a field. Deprecated — prefer Group (by selector).',\n deprecated: true,\n deprecatedInFavorOf: 'groupselector',\n fields: [\n {\n key: 'field',\n kind: 'relationName',\n label: 'Field',\n required: true,\n },\n {\n key: 'groupOn',\n kind: 'number',\n label: 'Group on (index)',\n required: true,\n default: 0,\n },\n {\n key: 'addToGroup',\n kind: 'number',\n label: 'Add to group (index)',\n required: true,\n default: 1,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n ],\n summary(params) {\n const field = asString(params.field);\n const base = field ? `group on \"${field}\"` : 'group on field';\n const selector = asString(params.selector);\n return selector ? `${base} · ${selector}` : base;\n },\n toYamlNode(params) {\n const node: Record<string, unknown> = {\n field: asString(params.field),\n groupOn: typeof params.groupOn === 'number' ? params.groupOn : Number(params.groupOn ?? 0),\n addToGroup:\n typeof params.addToGroup === 'number' ? params.addToGroup : Number(params.addToGroup ?? 1),\n };\n if (!missing(params.selector)) {\n node.selector = asString(params.selector);\n }\n if (params.hold !== undefined) {\n node.hold = params.hold;\n }\n return { group: node };\n },\n fromYamlNode(node) {\n if (!isRecord(node)) {\n return null;\n }\n const group = node.group;\n if (!isRecord(group) || group.field === undefined) {\n return null; // not a byfield group\n }\n const params: Record<string, unknown> = {\n field: asString(group.field),\n groupOn: typeof group.groupOn === 'number' ? group.groupOn : Number(group.groupOn ?? 0),\n addToGroup:\n typeof group.addToGroup === 'number' ? group.addToGroup : Number(group.addToGroup ?? 1),\n };\n if (group.selector !== undefined) {\n params.selector = asString(group.selector);\n }\n if (group.hold !== undefined) {\n params.hold = group.hold;\n }\n return params;\n },\n};\n\nconst size: ItemDefinition = {\n kind: 'constraint',\n type: 'size',\n label: 'Size',\n description: 'Set the width and height of elements matching the selector.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n {\n key: 'width',\n kind: 'number',\n label: 'Width',\n required: true,\n default: DEFAULT_NODE_WIDTH,\n },\n {\n key: 'height',\n kind: 'number',\n label: 'Height',\n required: true,\n default: DEFAULT_NODE_HEIGHT,\n },\n ],\n summary(params) {\n const w = missing(params.width) ? '?' : asString(params.width);\n const h = missing(params.height) ? '?' : asString(params.height);\n const selector = asString(params.selector);\n return selector ? `${w}×${h} · ${selector}` : `${w}×${h}`;\n },\n validate(params) {\n const out: Diagnostic[] = [];\n for (const key of ['width', 'height'] as const) {\n const value = params[key];\n if (typeof value === 'number' && (Number.isNaN(value) || value <= 0)) {\n out.push(fieldError(key, `${key} must be greater than 0.`));\n }\n }\n return out;\n },\n};\n\nconst hideAtom: ItemDefinition = {\n kind: 'constraint',\n type: 'hideAtom',\n label: 'Hide atom',\n description: 'Hide elements matching the selector from the visualization.',\n fields: [\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n required: true,\n selectorArity: 'unary',\n },\n ],\n summary(params) {\n const selector = asString(params.selector);\n return selector ? `hide · ${selector}` : 'hide';\n },\n};\n\n/**\n * Flag directive — quirky scalar YAML form: `- flag: hideDisconnectedBuiltIns`.\n * The param is stored under `flag`. The codec uses toYamlNode/fromYamlNode to\n * round-trip the scalar form.\n */\nconst flag: ItemDefinition = {\n kind: 'directive',\n type: 'flag',\n label: 'Flag',\n description: 'Toggle a built-in rendering flag, e.g. hideDisconnectedBuiltIns.',\n fields: [\n {\n key: 'flag',\n // Closed choice: the engine recognizes exactly FLAG_OPTIONS and ignores\n // anything else, so the builder offers the real ones instead of free\n // text. Unknown flags in hand-written YAML still parse and round-trip;\n // they surface a structural error naming the allowed values.\n kind: 'enum',\n options: FLAG_OPTIONS,\n label: 'Flag',\n required: true,\n default: 'hideDisconnected',\n help: 'hideDisconnected hides disconnected atoms; hideDisconnectedBuiltIns hides only disconnected built-in atoms.',\n },\n ],\n summary(params) {\n const value = asString(params.flag);\n return value || '(no flag)';\n },\n toYamlNode(params) {\n return { flag: asString(params.flag) };\n },\n fromYamlNode(node) {\n if (!isRecord(node)) {\n return null;\n }\n const value = node.flag;\n if (typeof value === 'string') {\n return { flag: value };\n }\n // Tolerate the rare mapping form `flag: { flag: x }`.\n if (isRecord(value) && typeof value.flag === 'string') {\n return { flag: value.flag };\n }\n return null;\n },\n};\n\nconst attribute: ItemDefinition = {\n kind: 'directive',\n type: 'attribute',\n label: 'Attribute',\n description: 'Render a field as an inline attribute on its source atom.',\n fields: [\n {\n key: 'field',\n kind: 'relationName',\n label: 'Field',\n required: true,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n {\n key: 'filter',\n kind: 'selector',\n label: 'Filter',\n selectorArity: 'binary',\n help: 'Optional n-ary selector — apply only to matching (source, target) tuples.',\n },\n // Shared text-style block (size + color), same shape edgeStyle/atomStyle use.\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n ],\n summary(params) {\n const field = asString(params.field);\n const selector = asString(params.selector);\n const base = field || '(no field)';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst hideField: ItemDefinition = {\n kind: 'directive',\n type: 'hideField',\n label: 'Hide field',\n description: 'Hide a relation/field from the visualization.',\n fields: [\n {\n key: 'field',\n kind: 'relationName',\n label: 'Field',\n required: true,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n {\n key: 'filter',\n kind: 'selector',\n label: 'Filter',\n selectorArity: 'binary',\n help: 'Optional n-ary selector — hide only matching (source, target) tuples.',\n },\n ],\n summary(params) {\n const field = asString(params.field);\n const selector = asString(params.selector);\n const base = field ? `hide ${field}` : 'hide field';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst icon: ItemDefinition = {\n kind: 'directive',\n type: 'icon',\n label: 'Icon',\n description: 'Render matching atoms with an icon.',\n fields: [\n {\n key: 'path',\n kind: 'text',\n label: 'Path / URL',\n required: true,\n placeholder: 'e.g. https://… or assets/foo.svg',\n },\n {\n key: 'showLabels',\n kind: 'boolean',\n label: 'Show labels',\n default: false,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n ],\n summary(params) {\n const path = asString(params.path);\n const selector = asString(params.selector);\n const base = path || '(no path)';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst atomColor: ItemDefinition = {\n kind: 'directive',\n type: 'atomColor',\n label: 'Atom color',\n description: 'Deprecated — use Atom style (atomStyle). Still parsed/rendered for back-compat (value → border color).',\n deprecated: true,\n deprecatedInFavorOf: 'atomStyle',\n fields: [\n {\n key: 'value',\n kind: 'color',\n label: 'Color',\n required: true,\n default: DEFAULT_COLOR,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n ],\n summary(params) {\n const color = asString(params.value);\n const selector = asString(params.selector);\n const base = color || '(no color)';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\n/**\n * Shared `lineStyle` block children — reused by edgeStyle, inferredEdge, and a\n * group's connector. No `default`s: style blocks must stay sparse (a seeded\n * default would emit as an authored value and break the resolver's compose /\n * collision rules).\n */\nconst LINE_STYLE_FIELDS: readonly FieldSpec[] = [\n { key: 'color', kind: 'color', label: 'Color' },\n { key: 'pattern', kind: 'enum', options: EDGE_STYLES, label: 'Pattern' },\n { key: 'weight', kind: 'number', label: 'Weight' },\n { key: 'highlight', kind: 'color', label: 'Highlight' },\n];\n\n/** Shared `fillStyle` block children — an atom's interior fill. No defaults (sparse). */\nconst FILL_STYLE_FIELDS: readonly FieldSpec[] = [\n { key: 'color', kind: 'color', label: 'Color' },\n];\n\n/** Shared `borderStyle` block children — an atom's outline color + width. No defaults (sparse). */\nconst BORDER_STYLE_FIELDS: readonly FieldSpec[] = [\n { key: 'color', kind: 'color', label: 'Color' },\n { key: 'width', kind: 'number', label: 'Width' },\n];\n\nconst edgeStyle: ItemDefinition = {\n kind: 'directive',\n type: 'edgeStyle',\n label: 'Edge style',\n description: 'Style the edges of a field/relation — line and label.',\n fields: [\n { key: 'field', kind: 'relationName', label: 'Field', required: true },\n { key: 'selector', kind: 'selector', label: 'Selector', selectorArity: 'unary' },\n { key: 'filter', kind: 'selector', label: 'Filter', selectorArity: 'binary' },\n { key: 'lineStyle', kind: 'group', label: 'Line style', children: LINE_STYLE_FIELDS },\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n { key: 'showLabel', kind: 'boolean', label: 'Show label' },\n { key: 'hidden', kind: 'boolean', label: 'Hidden' },\n ],\n summary(params) {\n const field = asString(params.field);\n const line = (params.lineStyle ?? {}) as Record<string, unknown>;\n const color = asString(line.color);\n const base = field ? (color ? `${field}: ${color}` : field) : color || 'edge';\n const selector = asString(params.selector);\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst atomStyle: ItemDefinition = {\n kind: 'directive',\n type: 'atomStyle',\n label: 'Atom style',\n description: 'Style matching atoms — fill, border, and label.',\n fields: [\n { key: 'selector', kind: 'selector', label: 'Selector', selectorArity: 'unary' },\n { key: 'fillStyle', kind: 'group', label: 'Fill style', children: FILL_STYLE_FIELDS },\n { key: 'borderStyle', kind: 'group', label: 'Border style', children: BORDER_STYLE_FIELDS },\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n ],\n summary(params) {\n const fill = (params.fillStyle ?? {}) as Record<string, unknown>;\n const border = (params.borderStyle ?? {}) as Record<string, unknown>;\n const color = asString(fill.color) || asString(border.color);\n const selector = asString(params.selector);\n const base = color || 'atom';\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst edgeColor: ItemDefinition = {\n kind: 'directive',\n type: 'edgeColor',\n label: 'Edge color',\n description: 'Deprecated — use Edge style (edgeStyle). Still parsed/rendered for back-compat.',\n deprecated: true,\n deprecatedInFavorOf: 'edgeStyle',\n fields: [\n {\n key: 'field',\n kind: 'relationName',\n label: 'Field',\n required: true,\n },\n {\n key: 'value',\n kind: 'color',\n label: 'Color',\n required: true,\n default: DEFAULT_COLOR,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'unary',\n },\n {\n key: 'style',\n kind: 'enum',\n label: 'Style',\n options: EDGE_STYLES,\n },\n {\n key: 'weight',\n kind: 'number',\n label: 'Weight',\n },\n ],\n summary(params) {\n const field = asString(params.field);\n const color = asString(params.value);\n const base = field ? `${field}: ${color || 'edge'}` : color || 'edge';\n const selector = asString(params.selector);\n return selector ? `${base} · ${selector}` : base;\n },\n};\n\nconst inferredEdge: ItemDefinition = {\n kind: 'directive',\n type: 'inferredEdge',\n label: 'Inferred edge',\n description: 'Draw an inferred edge from a selector — line and label.',\n fields: [\n {\n key: 'name',\n kind: 'text',\n label: 'Name',\n required: true,\n },\n {\n key: 'selector',\n kind: 'selector',\n label: 'Selector',\n selectorArity: 'binary',\n },\n {\n key: 'draw',\n kind: 'text',\n label: 'Draw',\n help: \"Endpoint interpretation: '<end> -> <end>', each end '_' (the atom itself) or a group constraint name (attach to that group's hull — a keyed group picks by the end's atom; a unary group is a single group and attaches directly). E.g. 'regions -> regions' or '_ -> regions'.\",\n },\n // Same shared blocks as edgeStyle. The engine still accepts the legacy flat\n // color/style/weight (deprecated + warned), so old specs keep working.\n { key: 'lineStyle', kind: 'group', label: 'Line style', children: LINE_STYLE_FIELDS },\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n ],\n summary(params) {\n const name = asString(params.name);\n const selector = asString(params.selector);\n const line = (params.lineStyle ?? {}) as Record<string, unknown>;\n const color = asString(line.color);\n const base = name || '(no name)';\n const withColor = color ? `${base}: ${color}` : base;\n return selector ? `${withColor} · ${selector}` : withColor;\n },\n};\n\nconst tag: ItemDefinition = {\n kind: 'directive',\n type: 'tag',\n label: 'Tag',\n description: 'Add computed attributes to nodes based on selector evaluation.',\n fields: [\n {\n key: 'toTag',\n kind: 'selector',\n label: 'To tag (selector)',\n required: true,\n selectorArity: 'unary',\n help: 'Selects which atoms get the tag.',\n },\n {\n key: 'name',\n kind: 'text',\n label: 'Name',\n required: true,\n help: 'The attribute name to display.',\n },\n {\n key: 'value',\n kind: 'selector',\n label: 'Value (selector)',\n required: true,\n help: 'Selector whose result becomes the attribute value.',\n },\n // Shared text-style block (size + color), same shape edgeStyle/atomStyle use.\n { key: 'textStyle', kind: 'group', label: 'Text style', children: TEXT_STYLE_FIELDS },\n ],\n summary(params) {\n const name = asString(params.name);\n const toTag = asString(params.toTag);\n const base = name || '(no name)';\n return toTag ? `${base} · ${toTag}` : base;\n },\n};\n\n// ---- registry assembly ---------------------------------------------------\n\nconst DEFINITIONS: readonly ItemDefinition[] = [\n // constraints\n orientation,\n cyclic,\n align,\n groupselector,\n groupfield,\n size,\n hideAtom,\n // directives\n flag,\n attribute,\n hideField,\n icon,\n atomStyle,\n atomColor,\n edgeStyle,\n edgeColor,\n inferredEdge,\n tag,\n];\n\nconst BY_TYPE = new Map<string, ItemDefinition>(DEFINITIONS.map((d) => [d.type, d]));\n\n/**\n * The YAML top-level key each registry type emits under. This is usually the\n * type itself, but the two grouping definitions (`groupselector`, `groupfield`)\n * both emit under `group:` and are disambiguated on ingestion by their\n * `fromYamlNode`. The codec uses this to map a parsed YAML key back to its\n * candidate definitions.\n */\nconst YAML_KEY_BY_TYPE: Readonly<Record<string, string>> = {\n groupselector: 'group',\n groupfield: 'group',\n};\n\nfunction yamlKeyForType(type: string): string {\n return YAML_KEY_BY_TYPE[type] ?? type;\n}\n\nconst CANDIDATES_BY_YAML_KEY = ((): Map<string, ItemDefinition[]> => {\n const map = new Map<string, ItemDefinition[]>();\n for (const def of DEFINITIONS) {\n const key = yamlKeyForType(def.type);\n const list = map.get(key);\n if (list) {\n list.push(def);\n } else {\n map.set(key, [def]);\n }\n }\n return map;\n})();\n\n/**\n * Candidate definitions that emit under a given YAML key, in registry order.\n * For `group` this returns `[groupselector, groupfield]`; for everything else a\n * single-element array (or empty if the key is unknown).\n */\nexport function getDefinitionsForYamlKey(yamlKey: string): readonly ItemDefinition[] {\n return CANDIDATES_BY_YAML_KEY.get(yamlKey) ?? [];\n}\n\n/** True iff some registry definition emits under this YAML key. */\nexport function isKnownYamlKey(yamlKey: string): boolean {\n return CANDIDATES_BY_YAML_KEY.has(yamlKey);\n}\n\n/**\n * YAML keys some definition emits under, deduplicated. With no `kind`, every\n * key (constraints + directives); with a `kind`, only keys some definition of\n * that kind emits under. The registry-derived source of truth for \"which\n * top-level keys are recognized\" — use this instead of hand-listing types,\n * which drifts as the registry grows.\n *\n * Note: `size`/`hideAtom` are registered as constraints, so they appear only\n * under `'constraint'` here even though the engine also reads them among\n * directives — callers that validate the directives section must allow them.\n */\nexport function getKnownYamlKeys(kind?: ItemKind): string[] {\n const keys: string[] = [];\n for (const [key, defs] of CANDIDATES_BY_YAML_KEY) {\n if (!kind || defs.some((d) => d.kind === kind)) {\n keys.push(key);\n }\n }\n return keys;\n}\n\n/** Look up an item definition by registry type key. */\nexport function getDefinition(type: string): ItemDefinition | undefined {\n return BY_TYPE.get(type);\n}\n\n/** True iff the registry knows about this type. */\nexport function isKnownType(type: string): boolean {\n return BY_TYPE.has(type);\n}\n\n/** All definitions (constraints + directives), in canonical order. */\nexport function getAllDefinitions(): readonly ItemDefinition[] {\n return DEFINITIONS;\n}\n\n/**\n * Definitions of a given kind. Pass `{ includeDeprecated: false }` (the default)\n * to hide deprecated entries from the add menu.\n */\nexport function getDefinitions(\n kind: ItemKind,\n options: { includeDeprecated?: boolean } = {},\n): readonly ItemDefinition[] {\n const includeDeprecated = options.includeDeprecated ?? false;\n return DEFINITIONS.filter(\n (d) => d.kind === kind && (includeDeprecated || !d.deprecated),\n );\n}\n\n/**\n * Build the default params for a type from its FieldSpec defaults. Fields with\n * no `default` are omitted (so required-but-empty fields surface as diagnostics\n * rather than silently emitting empty strings).\n */\nexport function defaultParamsFor(type: string): Record<string, unknown> {\n const def = BY_TYPE.get(type);\n if (!def) {\n return {};\n }\n const params: Record<string, unknown> = {};\n for (const field of def.fields) {\n if (field.default !== undefined) {\n params[field.key] = field.default;\n }\n }\n return params;\n}\n\n/** A field's spec by key, if any. */\nexport function getFieldSpec(type: string, key: string): FieldSpec | undefined {\n return BY_TYPE.get(type)?.fields.find((f) => f.key === key);\n}\n","/**\n * Stable id generation for SpecItems.\n *\n * `uuid` is not a runtime dependency in this repo, so we use the platform Web\n * Crypto API when available (browsers + modern Node) and fall back to a\n * timestamp+random scheme otherwise. This module is framework-agnostic.\n */\n\ninterface CryptoLike {\n randomUUID?: () => string;\n}\n\n/** Generate a reasonably-unique id for a SpecItem. */\nexport function newId(): string {\n const cryptoObj: CryptoLike | undefined = (\n globalThis as { crypto?: CryptoLike }\n ).crypto;\n if (cryptoObj && typeof cryptoObj.randomUUID === 'function') {\n return cryptoObj.randomUUID();\n }\n const timestamp = Date.now().toString(36);\n const rand = Math.random().toString(36).slice(2, 12);\n const rand2 = Math.random().toString(36).slice(2, 12);\n return `${timestamp}-${rand}-${rand2}`;\n}\n","/**\n * YAML codec for the Spytial spec editor.\n *\n * Responsibilities:\n * - Parse a CnD layout-spec YAML string into a `SpecDocumentState` (the model).\n * - Serialize a `SpecDocumentState` back to deterministic YAML.\n * - Preserve, across a round trip:\n * * per-item comments (preceding `#` lines and/or an inline comment on the\n * item's first line) → `SpecItem.comment`, re-emitted as a preceding\n * comment line;\n * * a header comment block before the first section → `headerComment`;\n * * unknown constraint/directive types → `SpecItem.raw`, re-emitted from the\n * parsed node (semantic, not byte-for-byte).\n *\n * Structural parsing/emission uses js-yaml (already a dependency). js-yaml drops\n * comments, so we layer a light line-scan over the raw text to recover them and\n * associate each with the item it precedes.\n *\n * This module is framework-agnostic — no React.\n */\n\nimport jsyaml from 'js-yaml';\n\nimport {\n getDefinition,\n getDefinitionsForYamlKey,\n isKnownYamlKey,\n} from './registry';\nimport type { SpecDocumentState, SpecItem } from './types';\nimport { newId } from './id';\n\n/** Thrown by `parseYamlToState` (and `SpecDocument.fromYaml`) on invalid YAML. */\nexport class SpecParseError extends Error {\n readonly line?: number;\n readonly column?: number;\n\n constructor(message: string, line?: number, column?: number) {\n super(message);\n this.name = 'SpecParseError';\n this.line = line;\n this.column = column;\n // Restore prototype chain for instanceof across transpilation targets.\n Object.setPrototypeOf(this, SpecParseError.prototype);\n }\n}\n\n// ---- helpers -------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Normalize a YAML section (array, or single-key map fallback) to an array. */\nfunction normalizeSection(section: unknown): unknown[] {\n if (Array.isArray(section)) {\n return section;\n }\n if (isRecord(section)) {\n return Object.entries(section).map(([key, value]) => ({ [key]: value }));\n }\n return [];\n}\n\n/** Extract the `type` key of a single-entry node, e.g. `{ orientation: {...} }`. */\nfunction nodeType(node: unknown): string | undefined {\n if (typeof node === 'string') {\n // bare scalar with no key — not a typed node\n return undefined;\n }\n if (!isRecord(node)) {\n return undefined;\n }\n const keys = Object.keys(node);\n return keys.length > 0 ? keys[0] : undefined;\n}\n\n// ---- comment scanning ----------------------------------------------------\n\n/**\n * Scan the raw YAML for comments inside a section, associating each accumulated\n * comment block (and/or inline trailing comment) with the item it precedes.\n * Returns a map of zero-based item index within the section → comment text.\n *\n * An \"item\" starts at a line whose trimmed text begins with `- ` (a sequence\n * entry). Preceding `#` lines accumulate into that item's comment; an inline\n * `#` on the item's own first line is appended too.\n */\nfunction scanSectionComments(yamlStr: string, sectionName: string): Map<number, string> {\n const perItem = new Map<number, string>();\n const lines = yamlStr.split('\\n');\n let inSection = false;\n let pending = '';\n let itemIndex = -1;\n\n const flushInto = (idx: number): void => {\n if (pending) {\n perItem.set(idx, pending);\n pending = '';\n }\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (!inSection) {\n if (trimmed === `${sectionName}:`) {\n inSection = true;\n }\n continue;\n }\n\n // Leaving the section on a new unindented top-level key (not a list item,\n // not a comment, not blank).\n if (\n trimmed.length > 0 &&\n !trimmed.startsWith('#') &&\n !trimmed.startsWith('-') &&\n /^[A-Za-z_]/.test(line) && // unindented\n trimmed.endsWith(':')\n ) {\n break;\n }\n\n if (trimmed.startsWith('#')) {\n const text = trimmed.slice(1).trim();\n // Join consecutive comment lines with `\\n` (not a space) so a multi-line\n // item comment re-emits as one `#` line per line — matching how\n // scanHeaderComment and the emitter treat multi-line comments. (Joining\n // with a space silently merged the lines on the round trip.)\n pending = pending ? `${pending}\\n${text}` : text;\n continue;\n }\n\n if (trimmed.startsWith('-')) {\n itemIndex += 1;\n flushInto(itemIndex);\n // inline trailing comment on the item's first line\n const inline = extractInlineComment(line);\n if (inline) {\n const prev = perItem.get(itemIndex);\n // `\\n` join keeps each source comment line a distinct `#` line on\n // re-emit, consistent with the preceding-comment join above.\n perItem.set(itemIndex, prev ? `${prev}\\n${inline}` : inline);\n }\n }\n }\n\n return perItem;\n}\n\n/**\n * Best-effort extraction of an inline `# comment` from a line, ignoring `#`\n * that appears inside a quoted scalar. Returns the comment text without the\n * leading `#`, or undefined if none.\n *\n * YAML quoting is position-sensitive: a `'`/`\"` only *opens* a quoted scalar at\n * a value-start position (line start, or after `:`, `,`, `[`, `{` and optional\n * whitespace). A bare `'`/`\"` inside a *plain* scalar (e.g. `toTag: quote '\n * inside`) is just a character and must not toggle quote state — otherwise a\n * later `#` inside a genuinely quoted sibling value (`name: 'a: b # c'`) would\n * be mistaken for a comment. Single-quoted strings escape a quote as `''`;\n * double-quoted strings escape as `\\\"`.\n */\nfunction extractInlineComment(line: string): string | undefined {\n let i = 0;\n // Tracks whether the next non-space char is in value-start position (so a\n // quote there opens a quoted scalar). True at line start and right after a\n // structural `:`, `,`, `[`, `{`.\n let valueStart = true;\n\n while (i < line.length) {\n const ch = line[i];\n\n if (ch === ' ' || ch === '\\t') {\n i += 1;\n continue;\n }\n\n if ((ch === \"'\" || ch === '\"') && valueStart) {\n // Consume the quoted scalar so any `#` inside it is ignored.\n i = skipQuotedScalar(line, i, ch);\n valueStart = false;\n continue;\n }\n\n if (ch === '#') {\n // A comment must be preceded by whitespace (or be at line start). Inside a\n // plain scalar (valueStart === false and no preceding space) a `#` is a\n // literal character, not a comment.\n if (i === 0 || /\\s/.test(line[i - 1])) {\n return line.slice(i + 1).trim();\n }\n i += 1;\n continue;\n }\n\n // Structural characters reset to a value-start position; everything else is\n // part of a plain scalar (so embedded quotes don't open a string).\n valueStart = ch === ':' || ch === ',' || ch === '[' || ch === '{';\n i += 1;\n }\n return undefined;\n}\n\n/**\n * Given that `line[start]` is an opening quote `quote` (`'` or `\"`), return the\n * index just past the closing quote (or end of line if unterminated). Honors\n * YAML escaping: `''` inside single quotes, `\\\"`/`\\\\` inside double quotes.\n */\nfunction skipQuotedScalar(line: string, start: number, quote: string): number {\n let i = start + 1;\n while (i < line.length) {\n const ch = line[i];\n if (quote === \"'\") {\n if (ch === \"'\") {\n if (line[i + 1] === \"'\") {\n i += 2; // escaped quote ''\n continue;\n }\n return i + 1; // closing quote\n }\n } else {\n if (ch === '\\\\') {\n i += 2; // skip escaped char\n continue;\n }\n if (ch === '\"') {\n return i + 1; // closing quote\n }\n }\n i += 1;\n }\n return i; // unterminated; treat rest of line as the scalar\n}\n\n/**\n * Extract the header comment: leading `#`/blank lines before the first\n * top-level key (`constraints:` / `directives:` / any key). Returns the joined\n * comment text, or undefined.\n */\nfunction scanHeaderComment(yamlStr: string): string | undefined {\n const lines = yamlStr.split('\\n');\n const parts: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed === '') {\n continue;\n }\n if (trimmed.startsWith('#')) {\n parts.push(trimmed.slice(1).trim());\n continue;\n }\n // First non-comment, non-blank line ends the header.\n break;\n }\n return parts.length > 0 ? parts.join('\\n') : undefined;\n}\n\n// ---- ingestion -----------------------------------------------------------\n\n/** Convert one parsed YAML node into a SpecItem of the given kind. */\nfunction nodeToItem(node: unknown, kind: SpecItem['kind']): SpecItem | null {\n // `node` is a single-key mapping, e.g. `{ orientation: {...} }` or the scalar\n // form `{ flag: 'x' }`. `yamlKey` is that key (e.g. `group`), which may map to\n // multiple registry types (groupselector/groupfield).\n const yamlKey = nodeType(node);\n if (yamlKey === undefined) {\n return null;\n }\n\n if (!isKnownYamlKey(yamlKey)) {\n // Unknown key: preserve verbatim via `raw`, re-emitted as-is on serialize.\n return { id: newId(), kind, type: yamlKey, params: {}, raw: node };\n }\n\n const candidates = getDefinitionsForYamlKey(yamlKey);\n\n // Try each candidate's custom ingestion (fromYamlNode) in registry order; the\n // first that accepts wins. This disambiguates `group` into groupselector vs\n // groupfield.\n for (const def of candidates) {\n if (!def.fromYamlNode) {\n continue;\n }\n const params = def.fromYamlNode(node);\n if (params !== null) {\n const item: SpecItem = { id: newId(), kind, type: def.type, params };\n // Preserve the raw inner body: fromYamlNode copies only recognized keys\n // into `params`, so keep the original around for the unknown-key check to\n // flag typos it would otherwise have dropped.\n const body = (node as Record<string, unknown>)[yamlKey];\n if (isRecord(body)) {\n item.sourceBody = body;\n }\n return item;\n }\n }\n\n // No custom ingestion accepted. Fall back to default ingestion against the\n // first candidate that has no fromYamlNode (the common single-type case).\n const plain = candidates.find((d) => !d.fromYamlNode);\n if (plain) {\n const body = (node as Record<string, unknown>)[yamlKey];\n const params = isRecord(body) ? { ...body } : {};\n return { id: newId(), kind, type: plain.type, params };\n }\n\n // Every candidate had a fromYamlNode and all rejected the shape — keep the\n // node verbatim so nothing is lost. Tag it with the first candidate's type.\n const fallbackType = candidates[0]?.type ?? yamlKey;\n return { id: newId(), kind, type: fallbackType, params: {}, raw: node };\n}\n\n/** Parse a CnD layout-spec YAML string into a SpecDocumentState. */\nexport function parseYamlToState(yamlStr: string): SpecDocumentState {\n let parsed: unknown;\n try {\n parsed = yamlStr.trim() === '' ? {} : jsyaml.load(yamlStr);\n } catch (error) {\n if (error instanceof jsyaml.YAMLException) {\n const line = error.mark?.line !== undefined ? error.mark.line + 1 : undefined;\n const column = error.mark?.column !== undefined ? error.mark.column + 1 : undefined;\n throw new SpecParseError(error.reason || error.message, line, column);\n }\n throw new SpecParseError((error as Error).message);\n }\n\n const root = isRecord(parsed) ? parsed : {};\n const constraintNodes = normalizeSection(root.constraints);\n const directiveNodes = normalizeSection(root.directives);\n\n const constraintComments = scanSectionComments(yamlStr, 'constraints');\n const directiveComments = scanSectionComments(yamlStr, 'directives');\n\n const constraints: SpecItem[] = [];\n constraintNodes.forEach((node, index) => {\n const item = nodeToItem(node, 'constraint');\n if (!item) {\n return;\n }\n const comment = constraintComments.get(index);\n if (comment) {\n item.comment = comment;\n }\n constraints.push(item);\n });\n\n const directives: SpecItem[] = [];\n directiveNodes.forEach((node, index) => {\n const item = nodeToItem(node, 'directive');\n if (!item) {\n return;\n }\n const comment = directiveComments.get(index);\n if (comment) {\n item.comment = comment;\n }\n directives.push(item);\n });\n\n const state: SpecDocumentState = { constraints, directives };\n const headerComment = scanHeaderComment(yamlStr);\n if (headerComment) {\n state.headerComment = headerComment;\n }\n\n // Preserve top-level sections the editor doesn't interpret (a host's\n // `projections:`/`temporal:` blocks, …) in document order, so a round trip\n // through the editor never deletes them.\n const otherSections = Object.entries(root)\n .filter(([key]) => key !== 'constraints' && key !== 'directives')\n .map(([key, value]) => ({ key, value }));\n if (otherSections.length > 0) {\n state.otherSections = otherSections;\n }\n return state;\n}\n\n// ---- emission ------------------------------------------------------------\n\n/** A plain object (a nested block) — not an array or primitive. */\nfunction isPlainRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/**\n * Sanitize params for emission: drop `undefined`, and recursively drop empty\n * nested blocks. Recursion keeps nested style blocks (lineStyle / textStyle / …)\n * sparse — an added-but-empty block, or one whose only leaves were cleared, is\n * omitted rather than emitted as `{}` or `key: null`.\n */\nfunction sanitizeParams(params: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (value === undefined) continue;\n if (isPlainRecord(value)) {\n const nested = sanitizeParams(value);\n if (Object.keys(nested).length > 0) out[key] = nested;\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n/** Build the YAML node for a single item (used for both serialize and diffing). */\nfunction itemToYamlNode(item: SpecItem): unknown {\n if (item.raw !== undefined) {\n return item.raw;\n }\n const def = getDefinition(item.type);\n if (def?.toYamlNode) {\n return def.toYamlNode(item.params);\n }\n return { [item.type]: sanitizeParams(item.params) };\n}\n\n/**\n * Characters allowed in a flag value emitted verbatim as `- flag: <value>`.\n * This keeps YAML-significant characters (`:`, `#`, newlines, quotes,\n * leading `- `, …) out of the bare path.\n */\nconst SAFE_PLAIN_FLAG = /^[A-Za-z0-9_.-]+$/;\n\n/**\n * Whether a flag value can be emitted as a bare `- flag: value` scalar. Besides\n * containing no YAML-significant characters, the value must round-trip through\n * js-yaml as the *identical string* — this rejects values like `123`, `yes`,\n * `null`, or `.inf` that match the character pattern but would parse back as a\n * number/boolean/null (silently dropping the flag, since ingestion requires a\n * string). Anything that fails falls through to the generic, correctly-quoted\n * dump path.\n */\nfunction isBarePlainFlag(value: string): boolean {\n if (!SAFE_PLAIN_FLAG.test(value)) {\n return false;\n }\n try {\n return jsyaml.load(value) === value;\n } catch {\n return false;\n }\n}\n\n/** Emit one item node as indented YAML lines (without leading comment). */\nfunction emitItemLines(item: SpecItem): string[] {\n const node = itemToYamlNode(item);\n\n // Flag scalar special case: `- flag: value` rather than a flow map. Only take\n // the bare-scalar fast path for values that need no quoting AND that re-parse\n // as the same string; anything else falls through to the generic dump so the\n // value is escaped/quoted correctly.\n if (\n item.type === 'flag' &&\n isRecord(node) &&\n typeof node.flag === 'string' &&\n isBarePlainFlag(node.flag)\n ) {\n return [` - flag: ${node.flag}`];\n }\n\n // Default: dump the single-element sequence in flow style and re-indent.\n const dumped = jsyaml\n .dump([node], { flowLevel: 2, lineWidth: -1, sortKeys: false })\n .trimEnd();\n return dumped.split('\\n').map((line) => ` ${line}`);\n}\n\n/**\n * Emit a comment block (possibly multi-line) as indented `#` lines. Each line is\n * trimmed and blank lines dropped so emission is stable across a round trip\n * (the parser trims comment text on the way in).\n */\nfunction emitCommentLines(comment: string): string[] {\n return comment\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .map((line) => ` # ${line}`);\n}\n\n/** Serialize a SpecDocumentState to deterministic, comment-preserving YAML. */\nexport function serializeStateToYaml(state: SpecDocumentState): string {\n const lines: string[] = [];\n\n if (state.headerComment) {\n const headerLines = state.headerComment\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n for (const line of headerLines) {\n lines.push(`# ${line}`);\n }\n if (headerLines.length > 0) {\n lines.push('');\n }\n }\n\n if (state.constraints.length > 0) {\n lines.push('constraints:');\n for (const item of state.constraints) {\n if (item.comment) {\n lines.push(...emitCommentLines(item.comment));\n }\n lines.push(...emitItemLines(item));\n }\n }\n\n if (state.directives.length > 0) {\n if (state.constraints.length > 0) {\n lines.push(''); // blank line between sections\n }\n lines.push('directives:');\n for (const item of state.directives) {\n if (item.comment) {\n lines.push(...emitCommentLines(item.comment));\n }\n lines.push(...emitItemLines(item));\n }\n }\n\n // Preserved uninterpreted sections come last, each dumped whole. Emission is\n // semantic, not byte-for-byte — same contract as unknown item nodes.\n for (const section of state.otherSections ?? []) {\n if (lines.length > 0) {\n lines.push('');\n }\n const dumped = jsyaml\n .dump({ [section.key]: section.value }, { lineWidth: -1, sortKeys: false })\n .trimEnd();\n lines.push(...dumped.split('\\n'));\n }\n\n return lines.length > 0 ? `${lines.join('\\n')}\\n` : '';\n}\n","/**\n * Domain validation for the Spytial spec editor (WP2).\n *\n * Given a `SpecDocumentState` and a `DomainSchema`, this layers domain-aware\n * diagnostics on top of the structural ones from `core/diagnostics.ts`:\n *\n * - `relationName` fields whose value is not a known relation → warning.\n * - `typeName` fields whose value is not a known type → warning.\n * - `selector` fields: identifiers in the expression that match no domain\n * type, relation, or atom → warning (per identifier).\n *\n * ALL domain diagnostics are WARNINGS: a spec may legitimately reference names\n * absent from the *current* instance (the same spec is reused across instances),\n * so a domain miss must never block editing.\n *\n * Identifier extraction (the conservative heuristic):\n * The CnD selector language is the Forge/Alloy relational-expression sublanguage\n * (see `completions.ts`). A full parse would require the `simple-graph-query`\n * ANTLR parser *and* a live instance; that is overkill for a lint and unsuitable\n * here (validation runs without an evaluator). Instead we tokenize defensively:\n * 1. Strip quoted strings and `//`/`--`/`#` comments.\n * 2. Pull identifier tokens (`[A-Za-z_][A-Za-z0-9_/]*`).\n * 3. Drop: language keywords, built-in values (univ/iden/none/Int/…),\n * pure-numeric tokens, and quantifier/let-bound variables.\n * 4. Flag the survivors that match NO domain name.\n * This errs toward NOT flagging (false negatives over false positives): anything\n * the tokenizer is unsure about is left alone. Known limitations are documented\n * on `extractSelectorIdentifiers`.\n *\n * This module is framework-agnostic — no React.\n */\n\nimport { getDefinition } from '../core/registry';\nimport type {\n Diagnostic,\n SpecDocumentState,\n SpecItem,\n FieldSpec,\n} from '../core/types';\nimport type { DomainSchema } from './domain-schema';\n\n// ---- selector lexical tables (mirror completions.ts / the Forge lexer) ----\n\n/**\n * Reserved words of the selector language that are never domain identifiers.\n * Superset of the expression-level Forge keywords plus the built-in values, so\n * the extractor never flags a keyword as an unknown name. Erring large here is\n * safe: an over-broad reserved set only causes false negatives (under-flagging).\n */\nconst SELECTOR_RESERVED: ReadonlySet<string> = new Set([\n // built-in values / constants\n 'univ',\n 'iden',\n 'none',\n 'Int',\n 'seq/Int',\n 'String',\n 'this',\n 'true',\n 'false',\n // quantifiers / multiplicities\n 'all',\n 'some',\n 'no',\n 'one',\n 'lone',\n 'set',\n 'sum',\n 'let',\n 'disj',\n 'two',\n // word-form logical / comparison operators\n 'in',\n 'and',\n 'or',\n 'not',\n 'implies',\n 'iff',\n 'else',\n 'ni',\n]);\n\n/**\n * Keywords that introduce bound variables: `all x, y : S | ...`, `some v : ...`,\n * `let a = expr | ...`. Variable names declared by these must not be flagged.\n */\nconst BINDER_KEYWORDS: ReadonlySet<string> = new Set([\n 'all',\n 'some',\n 'no',\n 'one',\n 'lone',\n 'set',\n 'sum',\n 'let',\n 'disj',\n]);\n\nconst IDENTIFIER_RE = /[A-Za-z_][A-Za-z0-9_/]*/g;\nconst PURE_NUMBER_RE = /^-?\\d+$/;\n\n/**\n * Strip string literals and line comments so their contents never produce\n * identifier tokens. Replaces removed spans with spaces to preserve offsets\n * loosely (offsets are not surfaced for selector diagnostics, but keeping the\n * shape avoids accidental token-merging across a removed span).\n */\nfunction stripStringsAndComments(input: string): string {\n let out = '';\n let i = 0;\n const n = input.length;\n while (i < n) {\n const ch = input[i];\n\n // line comments: // ... , -- ...\n // (NOTE: `#` is the cardinality operator in the selector language, NOT a\n // comment, so it must not start a comment here.)\n if (\n (ch === '/' && input[i + 1] === '/') ||\n (ch === '-' && input[i + 1] === '-')\n ) {\n while (i < n && input[i] !== '\\n') {\n out += ' ';\n i += 1;\n }\n continue;\n }\n\n // quoted strings: '...' or \"...\" (no escape handling needed for a lint)\n if (ch === '\"' || ch === \"'\") {\n const quote = ch;\n out += ' ';\n i += 1;\n while (i < n && input[i] !== quote) {\n out += ' ';\n i += 1;\n }\n if (i < n) {\n out += ' '; // closing quote\n i += 1;\n }\n continue;\n }\n\n out += ch;\n i += 1;\n }\n return out;\n}\n\n/**\n * Collect identifier names bound by quantifiers / `let`. Conservative: for each\n * binder keyword we capture identifiers appearing before the next `:`, `|`, or\n * `=` delimiter (the variable list of a quantifier decl, or the LHS of a `let`).\n * Names that happen to be domain types used as a quantifier *domain* (after the\n * `:`) are intentionally left out of the bound set — they SHOULD validate.\n */\nfunction collectBoundVariables(tokens: ReadonlyArray<Token>): Set<string> {\n const bound = new Set<string>();\n for (let i = 0; i < tokens.length; i += 1) {\n const t = tokens[i];\n if (t.kind !== 'word' || !BINDER_KEYWORDS.has(t.value)) {\n continue;\n }\n // Walk forward collecting identifier words until a decl delimiter.\n for (let j = i + 1; j < tokens.length; j += 1) {\n const u = tokens[j];\n if (u.kind === 'delim' && (u.value === ':' || u.value === '|' || u.value === '=')) {\n break;\n }\n if (u.kind === 'word' && !SELECTOR_RESERVED.has(u.value)) {\n bound.add(u.value);\n }\n }\n }\n return bound;\n}\n\ninterface Token {\n kind: 'word' | 'delim' | 'other';\n value: string;\n}\n\n/**\n * Tokenize into words (identifiers/keywords) and the decl delimiters we care\n * about (`:`, `|`, `=`). Everything else is collapsed to `other`.\n */\nfunction tokenize(input: string): Token[] {\n const cleaned = stripStringsAndComments(input);\n const tokens: Token[] = [];\n let i = 0;\n const n = cleaned.length;\n while (i < n) {\n const ch = cleaned[i];\n if (/[A-Za-z_]/.test(ch)) {\n IDENTIFIER_RE.lastIndex = i;\n const m = IDENTIFIER_RE.exec(cleaned);\n if (m && m.index === i) {\n tokens.push({ kind: 'word', value: m[0] });\n i += m[0].length;\n continue;\n }\n }\n if (ch === ':' || ch === '|' || ch === '=') {\n tokens.push({ kind: 'delim', value: ch });\n i += 1;\n continue;\n }\n tokens.push({ kind: 'other', value: ch });\n i += 1;\n }\n return tokens;\n}\n\n/**\n * Extract candidate domain identifiers from a selector expression: the\n * identifier tokens that are NOT reserved words, NOT pure numbers, and NOT\n * quantifier/let-bound variables.\n *\n * Returned in first-occurrence order, de-duplicated.\n *\n * Known limitations (intentional, biased toward NOT flagging):\n * - No scoping: a bound variable shadowing a real name suppresses flagging of\n * that name for the whole expression. Acceptable for a soft lint.\n * - `let` RHS / quantifier domains are still validated (they reference real\n * names), but a binder whose decl omits a `:`/`|`/`=` (malformed) may\n * over-collect names as \"bound\" — again only causing under-flagging.\n * - Qualified names like `seq/Int` are treated as single tokens; only the\n * fully-qualified form is checked against the domain.\n */\nexport function extractSelectorIdentifiers(selector: string): string[] {\n if (typeof selector !== 'string' || selector.trim().length === 0) {\n return [];\n }\n const tokens = tokenize(selector);\n const bound = collectBoundVariables(tokens);\n\n const out: string[] = [];\n const seen = new Set<string>();\n for (const t of tokens) {\n if (t.kind !== 'word') {\n continue;\n }\n const name = t.value;\n if (SELECTOR_RESERVED.has(name)) {\n continue;\n }\n if (PURE_NUMBER_RE.test(name)) {\n continue;\n }\n if (bound.has(name)) {\n continue;\n }\n if (!seen.has(name)) {\n seen.add(name);\n out.push(name);\n }\n }\n return out;\n}\n\n// ---- domain name index ---------------------------------------------------\n\ninterface DomainIndex {\n types: ReadonlySet<string>;\n relations: ReadonlySet<string>;\n atoms: ReadonlySet<string>;\n}\n\nfunction buildIndex(domain: DomainSchema): DomainIndex {\n const types = new Set<string>();\n const relations = new Set<string>();\n const atoms = new Set<string>();\n for (const type of domain.types) {\n types.add(type.name);\n for (const atom of type.atoms) {\n atoms.add(atom);\n }\n }\n for (const rel of domain.relations) {\n relations.add(rel.name);\n }\n return { types, relations, atoms };\n}\n\nfunction isKnownName(index: DomainIndex, name: string): boolean {\n return (\n index.types.has(name) ||\n index.relations.has(name) ||\n index.atoms.has(name)\n );\n}\n\nfunction warn(\n message: string,\n itemId: string,\n fieldKey?: string,\n): Diagnostic {\n const d: Diagnostic = {\n severity: 'warning',\n message,\n itemId,\n source: 'domain',\n };\n if (fieldKey !== undefined) {\n d.fieldKey = fieldKey;\n }\n return d;\n}\n\n// ---- per-item / per-field validation -------------------------------------\n\nfunction fieldStringValue(item: SpecItem, field: FieldSpec): string | undefined {\n const raw = item.params[field.key];\n if (typeof raw !== 'string') {\n return undefined;\n }\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction validateItemAgainstDomain(\n item: SpecItem,\n index: DomainIndex,\n): Diagnostic[] {\n // Unknown/raw items have no editable fields to check.\n const def = getDefinition(item.type);\n if (!def) {\n return [];\n }\n\n const out: Diagnostic[] = [];\n for (const field of def.fields) {\n if (field.kind === 'relationName') {\n const value = fieldStringValue(item, field);\n if (value !== undefined && !index.relations.has(value)) {\n out.push(\n warn(\n `Relation \"${value}\" is not in this instance.`,\n item.id,\n field.key,\n ),\n );\n }\n } else if (field.kind === 'typeName') {\n const value = fieldStringValue(item, field);\n if (value !== undefined && !index.types.has(value)) {\n out.push(\n warn(\n `Type \"${value}\" is not in this instance.`,\n item.id,\n field.key,\n ),\n );\n }\n } else if (field.kind === 'selector') {\n const value = fieldStringValue(item, field);\n if (value !== undefined) {\n for (const ident of extractSelectorIdentifiers(value)) {\n if (!isKnownName(index, ident)) {\n out.push(\n warn(\n `\"${ident}\" is not a type, relation, or atom in this instance.`,\n item.id,\n field.key,\n ),\n );\n }\n }\n }\n }\n }\n return out;\n}\n\n/**\n * Validate a whole document against a domain schema. Returns only the\n * domain-source warnings; structural diagnostics are produced separately by\n * `core/diagnostics.validateState`. Both lists are concatenated by\n * `SpecDocument.validate(domain)`.\n */\nexport function validateAgainstDomain(\n state: SpecDocumentState,\n domain: DomainSchema,\n): Diagnostic[] {\n const index = buildIndex(domain);\n const out: Diagnostic[] = [];\n for (const item of state.constraints) {\n out.push(...validateItemAgainstDomain(item, index));\n }\n for (const item of state.directives) {\n out.push(...validateItemAgainstDomain(item, index));\n }\n return out;\n}\n","/**\n * Structural validation for the Spytial spec editor.\n *\n * `Diagnostic` itself is declared in `types.ts` (it is part of the pinned\n * contract). This module provides the structural validators that run over a\n * `SpecDocumentState`:\n * - missing required fields → error\n * - unknown enum values → error\n * - per-definition `validate()` results\n * - unknown item types → warning (preserved verbatim via `SpecItem.raw`)\n *\n * Domain validation (e.g. \"type Foo is not in this instance\") is layered on by\n * WP2's `validateAgainstDomain`; when a `DomainSchema` is supplied here, those\n * warnings are appended to the structural diagnostics. With no domain, only\n * structural diagnostics are produced (identical to before WP2).\n *\n * This module is framework-agnostic — no React.\n */\n\nimport { getDefinition } from './registry';\nimport type { Diagnostic, ItemDefinition, SpecDocumentState, SpecItem } from './types';\nimport type { DomainSchema } from '../domain/domain-schema';\nimport { validateAgainstDomain } from '../domain/domain-validation';\n\nfunction isEmpty(value: unknown): boolean {\n if (value === undefined || value === null) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n return false;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n// ---- unknown-key detection ----------------------------------------------\n//\n// The registry (`def.fields`, with nested `children`) is the source of truth\n// for which keys a type accepts. A key in `item.params` that no field backs is\n// almost always a typo (`showLabel` for `showLabels`, `colour` for `color`) or\n// stray junk — the engine parser silently ignores it, so without this the\n// mistake renders as a quiet no-op. We surface it as a *warning* (the diagram\n// still renders) with a \"did you mean\" when a real field is a near-miss.\n\n/**\n * Keys the engine accepts on a *constraint* that are deliberately not builder\n * fields, so they must not be flagged: `hold: never` negates any constraint\n * (read by `parseConstraints`), but exposing it as a field would clutter every\n * constraint form.\n */\nconst CONSTRAINT_STRUCTURAL_KEYS: readonly string[] = ['hold'];\n\n/**\n * Per-type keys the engine accepts but the registry does not expose as builder\n * fields, so the unknown-key check must not report them as typos:\n * - `inferredEdge` still parses the deprecated flat `color`/`style`/`weight`/\n * `highlight` (its own deprecation warning covers them).\n * - `edgeColor` is the deprecated flat form; `edgeColorToEdgeStyleRule` reads\n * these extras beyond the fields the registry lists.\n *\n * NOTE: this mirrors the engine parser (`layoutspec.ts` + the style-spec\n * parsers). If a directive gains an inner key there, add it here (or as a real\n * registry field) or valid specs will draw a spurious warning.\n */\nconst EXTRA_ACCEPTED_KEYS_BY_TYPE: Readonly<Record<string, readonly string[]>> = {\n inferredEdge: ['color', 'style', 'weight', 'highlight'],\n edgeColor: ['highlight', 'showLabel', 'hidden', 'filter'],\n};\n\n/** Levenshtein edit distance (case-insensitive at the call site). */\nfunction editDistance(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const prev = new Array<number>(n + 1);\n const curr = new Array<number>(n + 1);\n for (let j = 0; j <= n; j++) prev[j] = j;\n for (let i = 1; i <= m; i++) {\n curr[0] = i;\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[j] = Math.min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + cost);\n }\n for (let j = 0; j <= n; j++) prev[j] = curr[j];\n }\n return prev[n];\n}\n\n/**\n * The known key closest to `key`, or undefined when nothing is a near-miss.\n * \"Near\" is an edit distance of at most 2 that is also strictly less than the\n * typo's length, so short foreign keys don't get an absurd suggestion.\n */\nfunction closestKey(key: string, known: readonly string[]): string | undefined {\n let best: string | undefined;\n let bestDist = Infinity;\n const lower = key.toLowerCase();\n for (const candidate of known) {\n const d = editDistance(lower, candidate.toLowerCase());\n if (d < bestDist) {\n bestDist = d;\n best = candidate;\n }\n }\n return best !== undefined && bestDist <= 2 && bestDist < key.length ? best : undefined;\n}\n\n/**\n * Build the \"unknown field\" diagnostic for `key`, appending a `did you mean`\n * when a field is a near-miss, else the list of valid keys.\n * `suggestable` is the set of builder-field keys (what we advertise); it may be\n * narrower than the set that suppresses the warning (which also allows `hold`\n * and deprecated inline keys).\n */\nfunction unknownKeyDiagnostic(\n key: string,\n suggestable: readonly string[],\n context: string,\n itemId: string,\n fieldKey: string = key,\n): Diagnostic {\n const suggestion = closestKey(key, suggestable);\n const hint = suggestion\n ? ` Did you mean \"${suggestion}\"?`\n : suggestable.length > 0\n ? ` Known fields: ${suggestable.join(', ')}.`\n : '';\n return {\n severity: 'warning',\n code: 'unknown-key',\n message: `Unknown field \"${key}\" in ${context}.${hint}`,\n itemId,\n fieldKey,\n source: 'structure',\n };\n}\n\n/**\n * Flag params keys not backed by a field on `def` — at the top level and one\n * level down inside each declared `group` block (lineStyle / textStyle / …).\n * Only `group` fields are recursed into; other block-shaped values (e.g. a\n * group's `addEdge` written in its block form) are left alone by design.\n */\nfunction checkUnknownKeys(item: SpecItem, def: ItemDefinition): Diagnostic[] {\n const out: Diagnostic[] = [];\n\n const fieldKeys = def.fields.map((f) => f.key);\n const allowed = new Set<string>(fieldKeys);\n if (item.kind === 'constraint') {\n for (const k of CONSTRAINT_STRUCTURAL_KEYS) allowed.add(k);\n }\n for (const k of EXTRA_ACCEPTED_KEYS_BY_TYPE[item.type] ?? []) allowed.add(k);\n\n // Prefer the raw parsed body when present: a custom `fromYamlNode` (group /\n // flag) copies only recognized keys into `params`, so a typo like `naem` would\n // otherwise be dropped before it reaches this check. `sourceBody` preserves the\n // original keys for exactly this; it falls back to `params` for builder-built\n // items (which only ever hold known fields).\n const topLevel = isRecord(item.sourceBody) ? item.sourceBody : item.params;\n for (const key of Object.keys(topLevel)) {\n if (allowed.has(key)) continue;\n out.push(unknownKeyDiagnostic(key, fieldKeys, def.label, item.id));\n }\n\n for (const field of def.fields) {\n if (field.kind !== 'group' || !field.children) continue;\n const block = item.params[field.key];\n if (!isRecord(block)) continue;\n const childKeys = field.children.map((c) => c.key);\n const allowedChildren = new Set(childKeys);\n for (const key of Object.keys(block)) {\n if (allowedChildren.has(key)) continue;\n // Route with a parent-qualified key (`fillStyle.width`) so the diagnostic\n // can't collide with a same-named field in a sibling block (e.g.\n // `borderStyle.width`) — the renderer filters nested diagnostics by an\n // exact `fieldKey`. The message still names the child key and its block.\n out.push(\n unknownKeyDiagnostic(key, childKeys, field.label, item.id, `${field.key}.${key}`),\n );\n }\n }\n\n return out;\n}\n\n/** Validate a single item structurally against its registry definition. */\nexport function validateItem(item: SpecItem): Diagnostic[] {\n const out: Diagnostic[] = [];\n\n // Unknown type (preserved as raw): a non-blocking warning.\n if (item.raw !== undefined && getDefinition(item.type) === undefined) {\n out.push({\n severity: 'warning',\n code: 'unknown-type',\n message: `Unknown ${item.kind} type \"${item.type}\". It is preserved as-is but the builder cannot edit it.`,\n itemId: item.id,\n source: 'structure',\n });\n return out;\n }\n\n const def = getDefinition(item.type);\n if (!def) {\n out.push({\n severity: 'warning',\n code: 'unknown-type',\n message: `Unknown ${item.kind} type \"${item.type}\".`,\n itemId: item.id,\n source: 'structure',\n });\n return out;\n }\n\n // Deprecated type: still parses and renders, but nudge toward its replacement.\n // A distinct `code` so consumers can treat it apart from typo-style warnings.\n if (def.deprecated) {\n const replacement = def.deprecatedInFavorOf\n ? ` Use \"${def.deprecatedInFavorOf}\" instead.`\n : '';\n out.push({\n severity: 'warning',\n code: 'deprecated',\n message: `\"${def.label}\" is deprecated.${replacement}`,\n itemId: item.id,\n source: 'structure',\n });\n }\n\n for (const field of def.fields) {\n const value = item.params[field.key];\n\n if (field.required && isEmpty(value)) {\n out.push({\n severity: 'error',\n code: 'missing-required',\n message: `Missing required field \"${field.label}\".`,\n itemId: item.id,\n fieldKey: field.key,\n source: 'structure',\n });\n continue;\n }\n\n if (field.kind === 'enum' && field.options && !isEmpty(value)) {\n const allowed = new Set(field.options);\n const values = field.multiple\n ? Array.isArray(value)\n ? value.map((v) => String(v))\n : [String(value)]\n : [String(value)];\n for (const v of values) {\n if (!allowed.has(v)) {\n out.push({\n severity: 'error',\n code: 'invalid-value',\n message: `Invalid value \"${v}\" for \"${field.label}\". Allowed: ${field.options.join(', ')}.`,\n itemId: item.id,\n fieldKey: field.key,\n source: 'structure',\n });\n }\n }\n }\n }\n\n out.push(...checkUnknownKeys(item, def));\n\n if (def.validate) {\n for (const d of def.validate(item.params)) {\n // Attach the item id if the definition didn't already (definitions only\n // know about field keys, not item ids).\n out.push(d.itemId ? d : { ...d, itemId: item.id });\n }\n }\n\n return out;\n}\n\n/**\n * Cross-item check mirroring `parseLayoutSpec`'s parse-time rejection: two\n * cyclic constraints over the same selector with different directions make\n * the engine THROW (\"Inconsistent cyclic constraint…\"). Surfacing it here\n * turns that hard failure into an editable diagnostic on the offending rows.\n */\nfunction validateCyclicConsistency(\n constraints: SpecDocumentState['constraints'],\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n const bySelector = new Map<string, { direction: string; itemId: string }>();\n for (const item of constraints) {\n if (item.type !== 'cyclic') continue;\n const selector = String(item.params.selector ?? '');\n const direction = String(item.params.direction ?? '');\n if (!selector || !direction) continue; // missing-field checks cover these\n const seen = bySelector.get(selector);\n if (seen && seen.direction !== direction) {\n out.push({\n severity: 'error',\n message: `Inconsistent cyclic directions for selector \"${selector}\" (${seen.direction} vs ${direction}) — the layout engine rejects this spec.`,\n itemId: item.id,\n fieldKey: 'direction',\n source: 'structure',\n });\n } else if (!seen) {\n bySelector.set(selector, { direction, itemId: item.id });\n }\n }\n return out;\n}\n\n/**\n * Run structural validation across a whole document. When a `domain` is\n * supplied, WP2's domain warnings are appended after the structural\n * diagnostics.\n */\nexport function validateState(\n state: SpecDocumentState,\n domain?: DomainSchema,\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n for (const item of state.constraints) {\n out.push(...validateItem(item));\n }\n for (const item of state.directives) {\n out.push(...validateItem(item));\n }\n out.push(...validateCyclicConsistency(state.constraints));\n if (domain) {\n out.push(...validateAgainstDomain(state, domain));\n }\n return out;\n}\n","/**\n * SpecDocument — the single source of truth for the Spytial spec editor.\n *\n * Holds the parsed spec (constraints, directives, preserved comments/unknown\n * nodes) and exposes mutation methods that each record exactly one undo step,\n * a full undo/redo history stack, change events via `subscribe`, and\n * round-trippable YAML via `toYaml`/`fromYaml`/`replaceFromYaml`.\n *\n * Invariants:\n * - Every mutation that changes state pushes the prior state onto the undo\n * stack and clears the redo stack.\n * - `replaceFromYaml` throws `SpecParseError` (with line/column) on bad YAML\n * WITHOUT mutating state.\n * - `getState()` returns a frozen snapshot; callers cannot mutate internals.\n * - Round-trip: `SpecDocument.fromYaml(doc.toYaml())` is semantically identical\n * (params, comments, unknown nodes).\n *\n * This module is framework-agnostic — no React.\n */\n\nimport {\n defaultParamsFor,\n getDefinition,\n} from './registry';\nimport {\n parseYamlToState,\n serializeStateToYaml,\n SpecParseError,\n} from './yaml-codec';\nimport { validateState } from './diagnostics';\nimport { newId } from './id';\nimport type {\n Diagnostic,\n ItemKind,\n SpecDocumentState,\n SpecItem,\n} from './types';\nimport type { DomainSchema } from '../domain/domain-schema';\n\nexport { SpecParseError } from './yaml-codec';\n\ntype Listener = (state: SpecDocumentState) => void;\n\n/**\n * Normalize a comment to its round-trip-stable form: trim each line, drop\n * blank lines, and return undefined for an empty result. The YAML codec emits\n * one `# <line>` per line and trims on parse, so storing the trimmed form keeps\n * `fromYaml(toYaml(doc))` byte-stable.\n */\nfunction normalizeComment(comment: string | undefined): string | undefined {\n if (comment === undefined) {\n return undefined;\n }\n const lines = comment\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n return lines.length > 0 ? lines.join('\\n') : undefined;\n}\n\n// ---- deep clone (state is plain JSON-ish data: strings/numbers/bools/arrays/maps) ----\n\nfunction cloneItem(item: SpecItem): SpecItem {\n return {\n id: item.id,\n kind: item.kind,\n type: item.type,\n params: cloneValue(item.params) as Record<string, unknown>,\n ...(item.comment !== undefined ? { comment: item.comment } : {}),\n ...(item.raw !== undefined ? { raw: cloneValue(item.raw) } : {}),\n };\n}\n\nfunction cloneValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((v) => cloneValue(v));\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = cloneValue(v);\n }\n return out;\n }\n return value;\n}\n\nfunction cloneState(state: SpecDocumentState): SpecDocumentState {\n return {\n constraints: state.constraints.map(cloneItem),\n directives: state.directives.map(cloneItem),\n ...(state.headerComment !== undefined ? { headerComment: state.headerComment } : {}),\n ...(state.otherSections !== undefined\n ? {\n otherSections: state.otherSections.map((section) => ({\n key: section.key,\n value: cloneValue(section.value),\n })),\n }\n : {}),\n };\n}\n\nfunction freezeState(state: SpecDocumentState): Readonly<SpecDocumentState> {\n state.constraints.forEach((i) => {\n Object.freeze(i.params);\n Object.freeze(i);\n });\n state.directives.forEach((i) => {\n Object.freeze(i.params);\n Object.freeze(i);\n });\n Object.freeze(state.constraints);\n Object.freeze(state.directives);\n if (state.otherSections !== undefined) {\n state.otherSections.forEach((section) => Object.freeze(section));\n Object.freeze(state.otherSections);\n }\n return Object.freeze(state);\n}\n\nexport class SpecDocument {\n private state: SpecDocumentState;\n private readonly undoStack: SpecDocumentState[] = [];\n private readonly redoStack: SpecDocumentState[] = [];\n private readonly listeners = new Set<Listener>();\n /** cached frozen view of `state`, invalidated on every mutation */\n private frozen?: Readonly<SpecDocumentState>;\n\n constructor(state?: SpecDocumentState) {\n this.state = state ? cloneState(state) : { constraints: [], directives: [] };\n }\n\n /** Parse YAML into a new document. Throws `SpecParseError` with line info. */\n static fromYaml(yaml: string): SpecDocument {\n const state = parseYamlToState(yaml);\n return new SpecDocument(state);\n }\n\n /** Deterministic, comment-preserving YAML for the current state. */\n toYaml(): string {\n return serializeStateToYaml(this.state);\n }\n\n /** A frozen snapshot of the current state (safe to hand to React). */\n getState(): Readonly<SpecDocumentState> {\n if (!this.frozen) {\n this.frozen = freezeState(cloneState(this.state));\n }\n return this.frozen;\n }\n\n // ---- mutations (each records one undo step) ----------------------------\n\n /** Add a new item of `type` (params seeded from FieldSpec defaults). */\n addItem(kind: ItemKind, type: string): SpecItem {\n const def = getDefinition(type);\n if (!def) {\n throw new Error(`Cannot add unknown ${kind} type \"${type}\".`);\n }\n if (def.kind !== kind) {\n throw new Error(\n `Type \"${type}\" is a ${def.kind}, not a ${kind}.`,\n );\n }\n this.pushUndo();\n const item: SpecItem = {\n id: newId(),\n kind,\n type,\n params: defaultParamsFor(type),\n };\n if (kind === 'constraint') {\n this.state.constraints.push(item);\n } else {\n this.state.directives.push(item);\n }\n this.commit();\n return cloneItem(item);\n }\n\n /**\n * Patch an item's params/comment/type. `params` is shallow-merged into the\n * existing params (set a key to `undefined` to remove it). Changing `type`\n * does NOT reset params — the caller is responsible for supplying compatible\n * params (the builder reseeds defaults on type change at the UI layer).\n */\n updateItem(\n id: string,\n patch: Partial<Pick<SpecItem, 'params' | 'comment' | 'type'>>,\n ): void {\n const found = this.find(id);\n if (!found) {\n return;\n }\n this.pushUndo();\n const { item } = found;\n if (patch.type !== undefined) {\n item.type = patch.type;\n }\n if (patch.params !== undefined) {\n const merged: Record<string, unknown> = { ...item.params };\n for (const [key, value] of Object.entries(patch.params)) {\n if (value === undefined) {\n delete merged[key];\n } else {\n merged[key] = value;\n }\n }\n item.params = merged;\n }\n if ('comment' in patch) {\n // Normalize so the stored comment matches what survives a YAML round trip\n // (the codec trims each comment line on parse). Empty -> no comment.\n const normalized = normalizeComment(patch.comment);\n if (normalized === undefined) {\n delete item.comment;\n } else {\n item.comment = normalized;\n }\n }\n this.commit();\n }\n\n /**\n * Duplicate an item in place: a deep params/comment copy with a fresh id,\n * inserted directly after the original. ONE undo step — composing\n * addItem + updateItem + moveItem at the UI layer recorded three, so a\n * single Undo after Duplicate left a half-reverted copy behind (PR review\n * finding). Returns the clone, or null if the id is unknown.\n */\n duplicateItem(id: string): SpecItem | null {\n const found = this.find(id);\n if (!found) {\n return null;\n }\n this.pushUndo();\n const copy: SpecItem = { ...cloneItem(found.item), id: newId() };\n const list =\n found.kind === 'constraint' ? this.state.constraints : this.state.directives;\n list.splice(found.index + 1, 0, copy);\n this.commit();\n return cloneItem(copy);\n }\n\n /** Remove an item by id. No-op if not found. */\n removeItem(id: string): void {\n const found = this.find(id);\n if (!found) {\n return;\n }\n this.pushUndo();\n const list =\n found.kind === 'constraint' ? this.state.constraints : this.state.directives;\n list.splice(found.index, 1);\n this.commit();\n }\n\n /**\n * Move an item to `toIndex` within its own section (constraints or\n * directives). `toIndex` is clamped to a valid range.\n */\n moveItem(id: string, toIndex: number): void {\n const found = this.find(id);\n if (!found) {\n return;\n }\n const list =\n found.kind === 'constraint' ? this.state.constraints : this.state.directives;\n const clamped = Math.max(0, Math.min(toIndex, list.length - 1));\n if (clamped === found.index) {\n return; // no-op move records no undo step\n }\n this.pushUndo();\n const [item] = list.splice(found.index, 1);\n list.splice(clamped, 0, item);\n this.commit();\n }\n\n /**\n * Replace the entire document from YAML (code-view edits). Throws\n * `SpecParseError` on parse error WITHOUT mutating state. On success this is\n * a single undo step.\n */\n replaceFromYaml(yaml: string): void {\n const next = parseYamlToState(yaml); // throws before any mutation\n this.pushUndo();\n this.state = next;\n this.commit();\n }\n\n // ---- history -----------------------------------------------------------\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n undo(): void {\n const prev = this.undoStack.pop();\n if (!prev) {\n return;\n }\n this.redoStack.push(cloneState(this.state));\n this.state = prev;\n this.commit();\n }\n\n redo(): void {\n const next = this.redoStack.pop();\n if (!next) {\n return;\n }\n this.undoStack.push(cloneState(this.state));\n this.state = next;\n this.commit();\n }\n\n // ---- validation --------------------------------------------------------\n\n /** Structural (+ domain, in WP2) diagnostics for the current state. */\n validate(domain?: DomainSchema): Diagnostic[] {\n return validateState(this.state, domain);\n }\n\n // ---- events ------------------------------------------------------------\n\n /** Subscribe to state changes. Returns an unsubscribe function. */\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n // ---- internals ---------------------------------------------------------\n\n private pushUndo(): void {\n this.undoStack.push(cloneState(this.state));\n this.redoStack.length = 0;\n }\n\n private commit(): void {\n this.frozen = undefined;\n const snapshot = this.getState();\n for (const listener of this.listeners) {\n listener(snapshot);\n }\n }\n\n private find(\n id: string,\n ): { item: SpecItem; index: number; kind: ItemKind } | undefined {\n const ci = this.state.constraints.findIndex((i) => i.id === id);\n if (ci !== -1) {\n return { item: this.state.constraints[ci], index: ci, kind: 'constraint' };\n }\n const di = this.state.directives.findIndex((i) => i.id === id);\n if (di !== -1) {\n return { item: this.state.directives[di], index: di, kind: 'directive' };\n }\n return undefined;\n }\n}\n","/**\n * Position resolution for code-view diagnostics.\n *\n * Structural diagnostics ({@link Diagnostic}) are anchored to a `SpecItem`\n * (`itemId`) and optionally a field (`fieldKey`) — not to a text location. To\n * draw an editor squiggle under the offending token, the code view needs a\n * character range. This module re-parses the code-view YAML with a\n * position-aware parser (`yaml`, a.k.a. eemeli/yaml, whose nodes expose a source\n * `range`) and walks `(itemId → section+index, fieldKey)` to the matching key\n * node, recording its `[from, to]` offsets.\n *\n * The authoritative model still parses through `parseYamlToState` (js-yaml);\n * this is a *second*, read-only parse used only to locate tokens for the editor.\n * The two agree on structure/order for any YAML that parses, which is the only\n * case where structural diagnostics exist.\n *\n * Framework-agnostic — no React, no CodeMirror. The returned offsets are what a\n * CodeMirror lint source (or any editor) needs.\n */\n\nimport { parseDocument, isMap, isScalar, isSeq } from 'yaml';\nimport type { Diagnostic, SpecDocumentState } from './types';\nimport { parseYamlToState, SpecParseError } from './yaml-codec';\nimport { validateState } from './diagnostics';\nimport type { DomainSchema } from '../domain/domain-schema';\n\n/**\n * A diagnostic annotated with a character range into the code-view text, when\n * one could be resolved. `from`/`to` are absent for diagnostics that couldn't be\n * located (an editor squiggles the ones with a range and may still list the\n * rest).\n */\nexport interface PositionedDiagnostic extends Diagnostic {\n /** inclusive start offset into the YAML text. */\n from?: number;\n /** exclusive end offset into the YAML text. */\n to?: number;\n}\n\ntype Section = 'constraints' | 'directives';\ntype Loc = { section: Section; index: number };\n\n/** offsets[i] = char offset at which (0-based) line i starts. */\nfunction lineStartOffsets(text: string): number[] {\n const offsets = [0];\n for (let i = 0; i < text.length; i++) {\n if (text[i] === '\\n') offsets.push(i + 1);\n }\n return offsets;\n}\n\n/** Convert a 1-based line/column (our `Diagnostic` convention) to an offset. */\nfunction lineColToOffset(line: number, column: number, starts: number[], len: number): number {\n const li = Math.min(Math.max(line - 1, 0), starts.length - 1);\n return Math.min(starts[li] + Math.max(column - 1, 0), len);\n}\n\n/** Range of the first key of a single-entry item map, e.g. the `icon` in `{icon: …}`. */\nfunction itemTypeKeyRange(itemNode: unknown): [number, number] | null {\n if (isMap(itemNode) && itemNode.items.length > 0) {\n const key = itemNode.items[0].key;\n if (isScalar(key) && key.range) return [key.range[0], key.range[1]];\n }\n return null;\n}\n\n/**\n * Find the range of the key `key` within `node`, preferring a direct child over\n * a nested one (so `color` resolves to the item's own `color` before any\n * `lineStyle.color`). Returns the key scalar's `[from, to]`.\n */\nfunction findKeyRange(node: unknown, key: string): [number, number] | null {\n if (isMap(node)) {\n for (const pair of node.items) {\n if (isScalar(pair.key) && String(pair.key.value) === key && pair.key.range) {\n return [pair.key.range[0], pair.key.range[1]];\n }\n }\n for (const pair of node.items) {\n const nested = findKeyRange(pair.value, key);\n if (nested) return nested;\n }\n } else if (isSeq(node)) {\n for (const item of node.items) {\n const nested = findKeyRange(item, key);\n if (nested) return nested;\n }\n }\n return null;\n}\n\n/**\n * Find the range of a key reached by a dotted `path` (`['fillStyle', 'width']`),\n * descending into each segment's value. A single-segment path is an unqualified\n * key → {@link findKeyRange}'s recursive search. A parent-qualified path lets a\n * nested unknown key resolve to the exact token *in its own block*, not a\n * same-named key in a sibling block (e.g. `fillStyle.width` vs `borderStyle.width`).\n */\nfunction findKeyByPath(node: unknown, path: string[]): [number, number] | null {\n if (path.length === 0) return null;\n if (path.length === 1) return findKeyRange(node, path[0]);\n const [head, ...rest] = path;\n if (isMap(node)) {\n for (const pair of node.items) {\n if (isScalar(pair.key) && String(pair.key.value) === head) {\n const found = findKeyByPath(pair.value, rest);\n if (found) return found;\n }\n }\n // `head` isn't at this level — an item wraps its body under a type key, so\n // descend one level with the full path.\n for (const pair of node.items) {\n const found = findKeyByPath(pair.value, path);\n if (found) return found;\n }\n } else if (isSeq(node)) {\n for (const item of node.items) {\n const found = findKeyByPath(item, path);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Resolve a `[from, to]` range for one diagnostic, or null if it can't be\n * located. Order of preference: the specific field key, then the item's type\n * key, then a line/column already on the diagnostic.\n */\nfunction resolveRange(\n d: Diagnostic,\n locById: Map<string, Loc>,\n doc: ReturnType<typeof parseDocument> | null,\n starts: number[],\n len: number,\n): [number, number] | null {\n if (d.itemId && doc) {\n const loc = locById.get(d.itemId);\n if (loc) {\n const seq = doc.get(loc.section);\n if (isSeq(seq)) {\n const itemNode = seq.items[loc.index];\n if (itemNode !== undefined) {\n if (d.fieldKey) {\n const fieldRange = findKeyByPath(itemNode, d.fieldKey.split('.'));\n if (fieldRange) return fieldRange;\n }\n const typeRange = itemTypeKeyRange(itemNode);\n if (typeRange) return typeRange;\n }\n }\n }\n }\n\n if (d.line !== undefined) {\n const from = lineColToOffset(d.line, d.column ?? 1, starts, len);\n // A short, visible marker: to end of the token/line start region.\n return [from, Math.min(from + 1, len)];\n }\n\n return null;\n}\n\n/**\n * Annotate diagnostics with `[from, to]` character ranges against `yamlText`.\n * Every input diagnostic is returned in order; those that resolve to a token\n * gain `from`/`to`, the rest are passed through unchanged (an editor squiggles\n * the located ones and can still list the others).\n */\nexport function positionDiagnostics(\n yamlText: string,\n state: SpecDocumentState,\n diagnostics: readonly Diagnostic[],\n): PositionedDiagnostic[] {\n const locById = new Map<string, Loc>();\n state.constraints.forEach((it, i) => locById.set(it.id, { section: 'constraints', index: i }));\n state.directives.forEach((it, i) => locById.set(it.id, { section: 'directives', index: i }));\n\n let doc: ReturnType<typeof parseDocument> | null = null;\n try {\n doc = parseDocument(yamlText);\n } catch {\n doc = null;\n }\n\n const starts = lineStartOffsets(yamlText);\n const len = yamlText.length;\n\n return diagnostics.map((d) => {\n const range = resolveRange(d, locById, doc, starts, len);\n if (!range) return { ...d };\n // Clamp defensively so an editor never gets an out-of-bounds range.\n const from = Math.max(0, Math.min(range[0], len));\n const to = Math.max(from, Math.min(range[1], len));\n return { ...d, from, to };\n });\n}\n\n/**\n * Lint a YAML string for the code editor: parse it, validate the result, and\n * resolve each diagnostic to a character range — all from the SAME text, so the\n * diagnostics' item ids always match the state used to position them.\n *\n * This is deliberately self-contained rather than reusing the editor's debounced\n * model: the code view must reflect the diagnostics of the text as typed, and\n * item ids are regenerated on every parse (so a diagnostic computed against one\n * parse can't be positioned against a later one). On a syntax error it returns a\n * single positioned error; otherwise the structural (+ domain) warnings/errors.\n */\nexport function lintYaml(yamlText: string, domain?: DomainSchema): PositionedDiagnostic[] {\n if (yamlText.trim() === '') return [];\n\n let state: SpecDocumentState;\n try {\n state = parseYamlToState(yamlText);\n } catch (error) {\n const err = error as SpecParseError;\n const diag: Diagnostic = {\n severity: 'error',\n code: 'yaml-syntax',\n source: 'yaml',\n message: `YAML syntax error: ${err.message}`,\n ...(err.line !== undefined ? { line: err.line } : {}),\n ...(err.column !== undefined ? { column: err.column } : {}),\n };\n return positionDiagnostics(yamlText, { constraints: [], directives: [] }, [diag]);\n }\n\n const diagnostics = validateState(state, domain).filter(\n (d) => d.severity === 'error' || d.severity === 'warning',\n );\n return positionDiagnostics(yamlText, state, diagnostics);\n}\n","/**\n * Domain awareness contracts + extraction (WP2).\n *\n * `DomainSchema` is the editor's distilled, framework-agnostic view of the host\n * data instance: the user-facing types (sigs) with their atoms, and the\n * relations (fields) with their arity / type signature. The UI uses it to power\n * dropdowns and completions; `domain-validation.ts` uses it to warn about\n * spec items that reference names absent from the current instance.\n *\n * `extractDomainSchema(instance)` is the adapter from a live\n * `IInputDataInstance` (e.g. an `AlloyDataInstance`). It is best-effort and\n * MUST NEVER throw — a malformed or partial instance degrades to an emptier\n * schema rather than crashing the editor.\n *\n * This module is framework-agnostic — no React. The type shape here is the\n * binding contract from `docs/SPEC_EDITOR_REDESIGN.md`.\n */\n\nimport type {\n IInputDataInstance,\n IType,\n IRelation,\n} from '../../data-instance/interfaces';\n\nexport interface DomainRelation {\n name: string;\n arity?: number;\n /** type signature when known, e.g. ['Node', 'Node'] */\n typeSignature?: readonly string[];\n}\n\nexport interface DomainSchema {\n types: ReadonlyArray<{ name: string; atoms: readonly string[] }>;\n relations: readonly DomainRelation[];\n}\n\n/** A schema with no types and no relations — the safe degenerate result. */\nconst EMPTY_SCHEMA: DomainSchema = { types: [], relations: [] };\n\n/**\n * Built-in/internal type names that are always part of the selector language\n * rather than user domain types. These are never surfaced as domain types\n * (they are offered via selector keyword completions instead), and selectors\n * referencing them are never flagged by domain validation.\n */\nconst SELECTOR_BUILTIN_TYPES: ReadonlySet<string> = new Set([\n 'univ',\n 'Int',\n 'seq/Int',\n 'iden',\n 'none',\n 'String',\n]);\n\nfunction isBuiltinType(type: IType): boolean {\n // The instance API marks Alloy built-ins (univ/Int/seq/Int) via `isBuiltin`.\n // We honour that flag AND the name-based fallback above, because a few hosts\n // (and the programmatic build path) may not set the flag on built-ins.\n if (type.isBuiltin === true) {\n return true;\n }\n return SELECTOR_BUILTIN_TYPES.has(type.id);\n}\n\n/**\n * Is every type in this relation's signature a built-in/internal type?\n *\n * Alloy emits an internal `no-field-guard` relation over `[univ, univ]`; such\n * all-built-in-signature relations are housekeeping, not user fields, so we\n * drop them. A real user field always touches at least one user sig.\n */\nfunction isInternalRelation(signature: readonly string[]): boolean {\n if (signature.length === 0) {\n return false;\n }\n return signature.every((t) => SELECTOR_BUILTIN_TYPES.has(t));\n}\n\nfunction extractTypes(instance: IInputDataInstance): DomainSchema['types'] {\n let rawTypes: readonly IType[];\n try {\n rawTypes = instance.getTypes();\n } catch {\n return [];\n }\n if (!Array.isArray(rawTypes)) {\n return [];\n }\n\n const out: Array<{ name: string; atoms: string[] }> = [];\n const seen = new Set<string>();\n\n for (const type of rawTypes) {\n try {\n if (!type || typeof type.id !== 'string' || type.id.length === 0) {\n continue;\n }\n if (isBuiltinType(type)) {\n continue;\n }\n if (seen.has(type.id)) {\n continue;\n }\n seen.add(type.id);\n\n const atoms: string[] = [];\n const atomSeen = new Set<string>();\n if (Array.isArray(type.atoms)) {\n for (const atom of type.atoms) {\n // Prefer the human label, fall back to the id.\n const name =\n atom && typeof atom.label === 'string' && atom.label.length > 0\n ? atom.label\n : atom && typeof atom.id === 'string'\n ? atom.id\n : undefined;\n if (name !== undefined && !atomSeen.has(name)) {\n atomSeen.add(name);\n atoms.push(name);\n }\n }\n }\n out.push({ name: type.id, atoms });\n } catch {\n // Skip a single malformed type rather than failing the whole extraction.\n continue;\n }\n }\n return out;\n}\n\nfunction extractRelations(instance: IInputDataInstance): DomainRelation[] {\n let rawRelations: readonly IRelation[];\n try {\n rawRelations = instance.getRelations();\n } catch {\n return [];\n }\n if (!Array.isArray(rawRelations)) {\n return [];\n }\n\n const out: DomainRelation[] = [];\n const seen = new Set<string>();\n\n for (const relation of rawRelations) {\n try {\n // `name` is the bare field name used in selectors (the qualified\n // `Sig<:field` form lives in `id`, which selectors do not use).\n const name =\n relation && typeof relation.name === 'string' && relation.name.length > 0\n ? relation.name\n : undefined;\n if (name === undefined) {\n continue;\n }\n\n const signature = Array.isArray(relation.types)\n ? relation.types.filter((t: unknown): t is string => typeof t === 'string')\n : [];\n\n if (isInternalRelation(signature)) {\n continue;\n }\n\n // Dedupe on (name + signature): two distinct fields can share a bare name\n // (e.g. two `Next` fields from separate orderings) and both are useful,\n // but an exact (name, signature) duplicate is noise.\n const key = `${name}\u0000${signature.join('\u0000')}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n const rel: DomainRelation = { name };\n if (signature.length > 0) {\n rel.arity = signature.length;\n rel.typeSignature = signature;\n }\n out.push(rel);\n } catch {\n continue;\n }\n }\n return out;\n}\n\n/**\n * Adapter from the live instance. Never throws; returns a best-effort schema.\n *\n * Policy (decisions of record, see also `docs/SPEC_EDITOR_REDESIGN.md` WP2):\n * - Built-in types flagged by the instance (`isBuiltin`) — and the well-known\n * selector built-ins univ/Int/seq/Int/iden/none/String — are EXCLUDED from\n * `types`. They are reachable through selector keyword completions and are\n * never flagged by domain validation, so dropping them keeps type dropdowns\n * focused on user sigs.\n * - Relations whose entire type signature is built-in (e.g. Alloy's internal\n * `no-field-guard` over `[univ, univ]`) are EXCLUDED as housekeeping.\n * - `DomainRelation.arity`/`typeSignature` are derived from `relation.types`\n * (the type signature; length = arity) when present.\n * - Types and relations are de-duplicated; per-item failures are swallowed.\n */\nexport function extractDomainSchema(\n instance: IInputDataInstance | null | undefined,\n): DomainSchema {\n if (instance === null || instance === undefined) {\n return EMPTY_SCHEMA;\n }\n try {\n return {\n types: extractTypes(instance),\n relations: extractRelations(instance),\n };\n } catch {\n // Belt-and-braces: the per-section helpers already swallow their own\n // errors, but never let a surprise throw escape this adapter.\n return EMPTY_SCHEMA;\n }\n}\n","/**\n * Built-in completion provider for selector fields (WP2).\n *\n * The CnD selector language is the Forge/Alloy relational-expression sublanguage\n * evaluated by `simple-graph-query` (see `src/evaluators/data/sgq-evaluator.ts`).\n * The keyword/operator set below is derived from that grammar's lexer\n * (`simple-graph-query/dist/forge-antlr/ForgeLexer.d.ts`) restricted to the\n * tokens that can appear inside a *selector expression* (module/declaration\n * tokens like `sig`, `pred`, `run`, `check` are intentionally excluded), cross\n * checked against the old highlighter's keyword set in\n * `src/components/NoCodeView/Selectors/SelectorInput.tsx`.\n *\n * Three entry points:\n * - `getSelectorKeywordCompletions()` — language keywords/operators/snippets,\n * independent of any instance.\n * - `getDomainCompletions(domain)` — types/relations/atoms from a DomainSchema.\n * - `createBuiltinCompletionSource(domain?)` — a merged, prefix-filtered\n * `(prefix) => Completion[]` the UI calls on each keystroke; this is also\n * what an integrator merges with `assistant.complete()` results.\n *\n * This module is framework-agnostic — no React.\n */\n\nimport type { Completion } from './assistant';\nimport type { DomainSchema } from './domain-schema';\n\n/**\n * Maximum number of atom completions emitted from a domain. Instances can hold\n * thousands of atoms; offering all of them would flood the popup and slow\n * filtering. The cap keeps the built-in source responsive; an integrator that\n * needs more can supply an `assistant.complete()` that returns instance-aware\n * results. Tunable; logged-friendly constant for easy discovery.\n */\nexport const MAX_ATOM_COMPLETIONS = 200;\n\n// ---- selector-language keyword/operator/snippet tables -------------------\n\n/**\n * Built-in atom/relation constants of the selector language. These are valid\n * selector references that are NOT user domain types, so they live here (and\n * are exempt from domain validation).\n */\nconst BUILTIN_VALUES: readonly string[] = [\n 'univ', // the universal set\n 'none', // the empty set\n 'iden', // the identity relation\n 'Int', // built-in integers\n];\n\n/**\n * Quantifier / multiplicity keywords usable inside selector expressions\n * (`all x : S | ...`, `some S`, `lone f`, `set ...`, etc.). Derived from the\n * Forge lexer's ALL/SOME/ONE/LONE/NO/SET/SUM/LET/DISJ tokens.\n */\nconst QUANTIFIER_KEYWORDS: readonly string[] = [\n 'all',\n 'some',\n 'no',\n 'one',\n 'lone',\n 'set',\n 'sum',\n 'let',\n 'disj',\n];\n\n/**\n * Word-form logical / comparison operators (Forge AND/OR/NOT/IN/IFF/IMP/ELSE\n * and the `not in` form). Symbolic operators are offered separately as\n * snippets so the popup can show a hint.\n */\nconst OPERATOR_KEYWORDS: readonly string[] = [\n 'in',\n 'and',\n 'or',\n 'not',\n 'implies',\n 'iff',\n 'else',\n];\n\n/**\n * Symbolic operators offered as snippets (insert the operator, show a hint).\n * Mirrors the highlighter's operator set: join/product/closure/union/etc.\n */\nconst OPERATOR_SNIPPETS: ReadonlyArray<{ insert: string; detail: string }> = [\n { insert: '.', detail: 'join' },\n { insert: '->', detail: 'product' },\n { insert: '+', detail: 'union' },\n { insert: '&', detail: 'intersection' },\n { insert: '-', detail: 'difference' },\n { insert: '~', detail: 'transpose' },\n { insert: '^', detail: 'transitive closure' },\n { insert: '*', detail: 'reflexive-transitive closure' },\n { insert: '#', detail: 'cardinality' },\n];\n\nlet cachedKeywordCompletions: Completion[] | undefined;\n\n/**\n * Selector-language keyword/operator/snippet completions. Independent of any\n * instance; cached after first build (the list is constant).\n */\nexport function getSelectorKeywordCompletions(): Completion[] {\n if (cachedKeywordCompletions) {\n // Return a copy so callers can freely sort/mutate their working list.\n return cachedKeywordCompletions.map((c) => ({ ...c }));\n }\n\n const out: Completion[] = [];\n\n for (const value of BUILTIN_VALUES) {\n out.push({ label: value, kind: 'keyword', detail: 'built-in' });\n }\n for (const kw of QUANTIFIER_KEYWORDS) {\n out.push({ label: kw, kind: 'keyword', detail: 'quantifier' });\n }\n for (const kw of OPERATOR_KEYWORDS) {\n out.push({ label: kw, kind: 'keyword', detail: 'operator' });\n }\n for (const op of OPERATOR_SNIPPETS) {\n out.push({\n label: op.insert,\n insertText: op.insert,\n kind: 'snippet',\n detail: op.detail,\n });\n }\n\n cachedKeywordCompletions = out;\n return out.map((c) => ({ ...c }));\n}\n\n// ---- domain completions --------------------------------------------------\n\n/**\n * Completions for the types, relations, and atoms in a `DomainSchema`. Atoms\n * are capped at `MAX_ATOM_COMPLETIONS` to keep the popup responsive on large\n * instances; the cap is applied across the whole schema (not per type).\n */\nexport function getDomainCompletions(domain: DomainSchema): Completion[] {\n const out: Completion[] = [];\n\n for (const type of domain.types) {\n out.push({\n label: type.name,\n kind: 'type',\n detail: 'type',\n });\n }\n\n for (const relation of domain.relations) {\n out.push({\n label: relation.name,\n kind: 'relation',\n detail:\n relation.arity !== undefined\n ? `relation · arity ${relation.arity}`\n : 'relation',\n });\n }\n\n // Atoms, capped. Iterate types in order and stop once the cap is reached so\n // the offered atoms are deterministic. Skip atoms whose name collides with a\n // type name (the type completion already covers it).\n const typeNames = new Set(domain.types.map((t) => t.name));\n const atomSeen = new Set<string>();\n let atomCount = 0;\n for (const type of domain.types) {\n if (atomCount >= MAX_ATOM_COMPLETIONS) {\n break;\n }\n for (const atom of type.atoms) {\n if (atomCount >= MAX_ATOM_COMPLETIONS) {\n break;\n }\n if (atomSeen.has(atom) || typeNames.has(atom)) {\n continue;\n }\n atomSeen.add(atom);\n out.push({ label: atom, kind: 'atom', detail: `atom · ${type.name}` });\n atomCount += 1;\n }\n }\n\n return out;\n}\n\n// ---- merged, prefix-filtered source --------------------------------------\n\n/** Rank: 0 = case-insensitive prefix match, 1 = substring match, 2 = no match. */\nfunction matchRank(label: string, prefix: string): number {\n if (prefix.length === 0) {\n return 0;\n }\n const haystack = label.toLowerCase();\n const needle = prefix.toLowerCase();\n if (haystack.startsWith(needle)) {\n return 0;\n }\n if (haystack.includes(needle)) {\n return 1;\n }\n return 2;\n}\n\n/**\n * Priority of a completion kind when two entries match equally well. Domain\n * entries (types/relations/atoms) sort before language keywords/snippets, per\n * the design (\"keywords after domain entries on equal match quality\").\n */\nfunction kindPriority(kind: Completion['kind']): number {\n switch (kind) {\n case 'type':\n return 0;\n case 'relation':\n return 1;\n case 'atom':\n return 2;\n case 'keyword':\n return 3;\n case 'snippet':\n return 4;\n default:\n return 5;\n }\n}\n\n/** Dedupe key for a completion: label + insertText (so `-` op vs `-` differ if needed). */\nfunction dedupeKey(c: Completion): string {\n return `${c.label}\u0000${c.insertText ?? c.label}`;\n}\n\n/**\n * Build the built-in completion source: a `(prefix) => Completion[]` that merges\n * domain completions (when a schema is present) with selector keywords, filters\n * by prefix (case-insensitive prefix match, then substring as a fallback),\n * dedupes, and orders domain entries before keywords on equal match quality.\n *\n * This is the function the UI layer calls; the WP4 integrator merges its result\n * with `assistant.complete()` output (see `mergeCompletions`).\n */\nexport function createBuiltinCompletionSource(\n domain?: DomainSchema,\n): (prefix: string) => Completion[] {\n // Pre-compute the unfiltered, deduped pool once per source so each keystroke\n // only filters + sorts.\n const pool: Completion[] = [];\n if (domain) {\n pool.push(...getDomainCompletions(domain));\n }\n pool.push(...getSelectorKeywordCompletions());\n\n const deduped = dedupeCompletions(pool);\n\n return (prefix: string): Completion[] => {\n const scored: Array<{ c: Completion; rank: number; idx: number }> = [];\n deduped.forEach((c, idx) => {\n const rank = matchRank(c.label, prefix);\n if (rank < 2) {\n scored.push({ c, rank, idx });\n }\n });\n\n scored.sort((a, b) => {\n if (a.rank !== b.rank) {\n return a.rank - b.rank;\n }\n const pa = kindPriority(a.c.kind);\n const pb = kindPriority(b.c.kind);\n if (pa !== pb) {\n return pa - pb;\n }\n // Stable-ish: shorter labels first, then original order.\n if (a.c.label.length !== b.c.label.length) {\n return a.c.label.length - b.c.label.length;\n }\n return a.idx - b.idx;\n });\n\n return scored.map((s) => s.c);\n };\n}\n\n/**\n * Merge and dedupe completion lists, preserving first-seen order. Useful for the\n * UI layer to fold `assistant.complete()` results into the built-in source's\n * output (assistant results passed first win on ties). Pure helper.\n */\nexport function mergeCompletions(\n ...lists: ReadonlyArray<readonly Completion[]>\n): Completion[] {\n const flat: Completion[] = [];\n for (const list of lists) {\n for (const c of list) {\n flat.push(c);\n }\n }\n return dedupeCompletions(flat);\n}\n\n/** Dedupe completions on (label, insertText), preserving first-seen order. */\nfunction dedupeCompletions(list: readonly Completion[]): Completion[] {\n const seen = new Set<string>();\n const out: Completion[] = [];\n for (const c of list) {\n const key = dedupeKey(c);\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n out.push(c);\n }\n return out;\n}\n","/**\n * Theme tokens for the Spytial spec editor (HOOK 1 in\n * `docs/SPEC_EDITOR_REDESIGN.md`).\n *\n * Every visual knob is a token. Tokens become `--spytial-ed-*` CSS custom\n * properties via {@link themeToCssVars}; `spec-editor.css` keys all colors,\n * fonts and sizes off those variables with fallbacks equal to {@link lightTheme},\n * so the editor is fully styled with no theme prop. A `theme` prop maps the\n * tokens onto inline custom properties on the editor root, overriding the\n * fallbacks.\n */\n\n/** Every visual knob is a token; tokens become `--spytial-ed-*` custom properties. */\nexport interface SpecEditorTheme {\n accent?: string;\n accentText?: string;\n surface?: string;\n surfaceRaised?: string;\n border?: string;\n text?: string;\n textMuted?: string;\n danger?: string;\n warning?: string;\n success?: string;\n fontFamily?: string;\n monoFontFamily?: string;\n /** base, rem/px */\n fontSize?: string;\n /** base unit */\n radius?: string;\n /** base unit */\n spacing?: string;\n // syntax tokens for selector/yaml highlighting\n synKeyword?: string;\n synType?: string;\n synRelation?: string;\n synOperator?: string;\n synString?: string;\n synComment?: string;\n}\n\n/**\n * Default light palette — \"drafting table\": warm paper surfaces, near-black\n * ink, and a single vermillion accent used the way a draftsman uses a red\n * pencil (focus, active states, the ✨ affordance). Section labels and\n * summaries lean on the mono stack, giving the editor the feel of a technical\n * instrument rather than a generic web form.\n *\n * These exact string values are the CSS fallbacks baked into `spec-editor.css`,\n * so changing one here means changing the matching `var(..., <fallback>)` there.\n */\nexport const lightTheme: Required<SpecEditorTheme> = {\n accent: '#b5431a',\n accentText: '#fdf6ec',\n surface: '#faf8f2',\n surfaceRaised: '#f1ecdf',\n border: '#d9d2c0',\n text: '#221d14',\n textMuted: '#6e6553',\n danger: '#a32014',\n warning: '#8a6200',\n success: '#2f6c43',\n fontFamily:\n \"'Avenir Next', 'Avenir', 'Seravek', 'Segoe UI Variable', 'Segoe UI', 'Trebuchet MS', sans-serif\",\n monoFontFamily:\n \"ui-monospace, 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace\",\n fontSize: '14px',\n radius: '2px',\n spacing: '8px',\n synKeyword: '#6d28a8',\n synType: '#0e6b6b',\n synRelation: '#1f4f9e',\n synOperator: '#b5431a',\n synString: '#7a5901',\n synComment: '#8a8170',\n};\n\n/**\n * Default dark palette — \"instrument panel\": deep blue-black slate with warm\n * chalk text and an oscilloscope-amber accent. Same token shape as\n * {@link lightTheme}; syntax colors are lifted for dark backgrounds.\n */\nexport const darkTheme: Required<SpecEditorTheme> = {\n accent: '#e08a3c',\n accentText: '#16100a',\n surface: '#12161e',\n surfaceRaised: '#1a202b',\n border: '#2d3645',\n text: '#e7e2d3',\n textMuted: '#94865f',\n danger: '#e06c5d',\n warning: '#d4a843',\n success: '#5fb98a',\n fontFamily:\n \"'Avenir Next', 'Avenir', 'Seravek', 'Segoe UI Variable', 'Segoe UI', 'Trebuchet MS', sans-serif\",\n monoFontFamily:\n \"ui-monospace, 'Cascadia Code', 'JetBrains Mono', 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace\",\n fontSize: '14px',\n radius: '2px',\n spacing: '8px',\n synKeyword: '#b48ee0',\n synType: '#5fb3a1',\n synRelation: '#7ba3e8',\n synOperator: '#e08a3c',\n synString: '#cfa75e',\n synComment: '#6e7889',\n};\n\n/**\n * Maps theme token keys to their `--spytial-ed-*` custom-property names.\n *\n * camelCase tokens become kebab-case suffixes (`synKeyword` →\n * `--spytial-ed-syn-keyword`, `accentText` → `--spytial-ed-accent-text`).\n */\nconst TOKEN_TO_CSS_VAR: Record<keyof SpecEditorTheme, string> = {\n accent: '--spytial-ed-accent',\n accentText: '--spytial-ed-accent-text',\n surface: '--spytial-ed-surface',\n surfaceRaised: '--spytial-ed-surface-raised',\n border: '--spytial-ed-border',\n text: '--spytial-ed-text',\n textMuted: '--spytial-ed-text-muted',\n danger: '--spytial-ed-danger',\n warning: '--spytial-ed-warning',\n success: '--spytial-ed-success',\n fontFamily: '--spytial-ed-font-family',\n monoFontFamily: '--spytial-ed-mono-font-family',\n fontSize: '--spytial-ed-font-size',\n radius: '--spytial-ed-radius',\n spacing: '--spytial-ed-spacing',\n synKeyword: '--spytial-ed-syn-keyword',\n synType: '--spytial-ed-syn-type',\n synRelation: '--spytial-ed-syn-relation',\n synOperator: '--spytial-ed-syn-operator',\n synString: '--spytial-ed-syn-string',\n synComment: '--spytial-ed-syn-comment',\n};\n\n/**\n * Converts a (possibly partial) theme to a map of `--spytial-ed-*` custom\n * properties. Only tokens actually present on `theme` are emitted, so the rest\n * fall back to the values baked into `spec-editor.css`. The result is suitable\n * for spreading into a React `style` prop on the editor root.\n */\nexport function themeToCssVars(theme: SpecEditorTheme): Record<string, string> {\n const vars: Record<string, string> = {};\n (Object.keys(TOKEN_TO_CSS_VAR) as Array<keyof SpecEditorTheme>).forEach(\n (token) => {\n const value = theme[token];\n if (value !== undefined && value !== null) {\n vars[TOKEN_TO_CSS_VAR[token]] = value;\n }\n }\n );\n return vars;\n}\n\n// ─── Named theme registry (mirrors `webcola-cnd-graph`'s theme model) ──────\n\n/**\n * A theme input: either a token object, or the NAME of a registered theme —\n * the same convention as `webcola-cnd-graph`'s `theme` attribute, so hosts\n * that already theme the graph by name can theme the editor the same way.\n */\nexport type SpecEditorThemeInput = SpecEditorTheme | string;\n\n/**\n * Registry of named themes, seeded with the built-ins. Like\n * `webcola-cnd-graph`'s registry: hosts add their own with\n * {@link registerSpecEditorThemes} (reusing a built-in name overrides it).\n */\nconst themeRegistry = new Map<string, SpecEditorTheme>([\n ['light', lightTheme],\n ['dark', darkTheme],\n]);\n\n/**\n * Register one or more custom named themes (or override a built-in by reusing\n * its name). Module-level, so registration applies to every editor instance —\n * matching `WebColaCnDGraph.registerThemes` semantics.\n */\nexport function registerSpecEditorThemes(\n themes: Record<string, SpecEditorTheme>,\n): void {\n for (const [name, theme] of Object.entries(themes)) {\n themeRegistry.set(name, theme);\n }\n}\n\n/**\n * Resolves a theme input to a token object: objects pass through, names are\n * looked up in the registry. Unknown names and `undefined` resolve to\n * `undefined` — i.e. the CSS fallbacks, which ARE the light theme (the same\n * \"absence means light\" rule the graph uses).\n */\nexport function resolveSpecEditorTheme(\n input: SpecEditorThemeInput | undefined,\n): SpecEditorTheme | undefined {\n if (input === undefined) return undefined;\n if (typeof input === 'string') return themeRegistry.get(input);\n return input;\n}\n","/**\n * Tokenizer for CnD selector expressions, used by {@link SelectorField}'s\n * highlight overlay.\n *\n * CnD selectors are Alloy/Forge-relational expressions evaluated by\n * `simple-graph-query` (joins, set ops, quantifiers, the `univ`/`none`/`iden`\n * constants, etc.). The token classes mirror the old highlighter at\n * `src/components/NoCodeView/Selectors/SelectorInput.tsx` (`highlightSelector`)\n * and the keyword/operator set accepted by the Forge grammar bundled with\n * `simple-graph-query`.\n *\n * Tokens carry source offsets so the overlay can rebuild the exact text. The\n * tokenizer never drops characters: concatenating `tokens[i].text` reproduces\n * the input verbatim, which is what keeps the mirror overlay aligned with the\n * textarea. Rendering maps each {@link TokenKind} to a span class colored by a\n * `--spytial-ed-syn-*` variable; the overlay builds those spans via React, so\n * user text is never interpolated into `innerHTML`.\n */\n\nexport type TokenKind =\n | 'keyword'\n | 'operator'\n | 'string'\n | 'number'\n | 'identifier'\n | 'comment'\n | 'whitespace'\n | 'punctuation';\n\nexport interface Token {\n kind: TokenKind;\n text: string;\n /** inclusive start offset into the source string */\n start: number;\n /** exclusive end offset into the source string */\n end: number;\n}\n\n/**\n * Selector-language keywords (quantifiers, logical ops, relational constants).\n * Derived from the Forge grammar accepted by `simple-graph-query` plus the\n * wildcard/constant set the old highlighter recognised (`univ`/`none`/`iden`).\n */\nconst KEYWORDS = new Set<string>([\n // relational constants / wildcards\n 'univ',\n 'none',\n 'iden',\n // quantifiers + multiplicities\n 'all',\n 'some',\n 'no',\n 'one',\n 'lone',\n 'set',\n 'sum',\n 'let',\n 'disj',\n 'count',\n // logical connectives\n 'and',\n 'or',\n 'not',\n 'implies',\n 'else',\n 'in',\n]);\n\n/**\n * Multi-character operators, longest first so the matcher is greedy\n * (e.g. `->` before `-`, `<:`/`:>` before `<`/`>`/`:`).\n */\nconst MULTI_CHAR_OPERATORS = ['->', '<:', ':>', '<=', '>=', '=<', '=>', '!='];\n\n/** Single-character relational / set operators. */\nconst SINGLE_CHAR_OPERATORS = new Set<string>([\n '+',\n '-',\n '&',\n '~',\n '*',\n '^',\n '.',\n '<',\n '>',\n '=',\n '!',\n '#',\n]);\n\n/** Grouping punctuation, kept distinct so it can be styled neutrally. */\nconst PUNCTUATION = new Set<string>(['(', ')', '[', ']', '{', '}', ',', ':', ';']);\n\nconst IDENT_START = /[A-Za-z_$]/;\nconst IDENT_CONTINUE = /[A-Za-z0-9_$]/;\nconst DIGIT = /[0-9]/;\nconst WHITESPACE = /\\s/;\n\n/**\n * Tokenizes a CnD selector expression into a flat, gap-free token list.\n *\n * Guarantees:\n * - Concatenating `tokens[i].text` reproduces `input` exactly.\n * - Offsets are monotonic and non-overlapping (`tokens[i].end === tokens[i+1].start`).\n * - Never throws; unrecognised characters become single-char `punctuation`\n * tokens rather than being dropped.\n */\nexport function tokenizeSelector(input: string): Token[] {\n const tokens: Token[] = [];\n const n = input.length;\n let i = 0;\n\n const push = (kind: TokenKind, start: number, end: number): void => {\n tokens.push({ kind, text: input.slice(start, end), start, end });\n };\n\n while (i < n) {\n const ch = input[i];\n\n // Whitespace run.\n if (WHITESPACE.test(ch)) {\n const start = i;\n while (i < n && WHITESPACE.test(input[i])) i++;\n push('whitespace', start, i);\n continue;\n }\n\n // Line comment: `--` (Alloy) or `//`, to end of line.\n if (\n (ch === '-' && input[i + 1] === '-') ||\n (ch === '/' && input[i + 1] === '/')\n ) {\n const start = i;\n i += 2;\n while (i < n && input[i] !== '\\n') i++;\n push('comment', start, i);\n continue;\n }\n\n // String literal (single or double quoted). Honors backslash escapes;\n // an unterminated string runs to end-of-line so the rest of the line is\n // not mis-highlighted.\n if (ch === '\"' || ch === \"'\") {\n const quote = ch;\n const start = i;\n i++;\n while (i < n && input[i] !== quote && input[i] !== '\\n') {\n if (input[i] === '\\\\' && i + 1 < n) i += 2;\n else i++;\n }\n if (i < n && input[i] === quote) i++; // closing quote\n push('string', start, i);\n continue;\n }\n\n // Number (integer or decimal).\n if (DIGIT.test(ch)) {\n const start = i;\n while (i < n && DIGIT.test(input[i])) i++;\n if (i < n && input[i] === '.' && i + 1 < n && DIGIT.test(input[i + 1])) {\n i++; // dot\n while (i < n && DIGIT.test(input[i])) i++;\n }\n push('number', start, i);\n continue;\n }\n\n // Identifier or keyword.\n if (IDENT_START.test(ch)) {\n const start = i;\n i++;\n while (i < n && IDENT_CONTINUE.test(input[i])) i++;\n const word = input.slice(start, i);\n push(KEYWORDS.has(word) ? 'keyword' : 'identifier', start, i);\n continue;\n }\n\n // Multi-character operators (greedy, longest first).\n const two = input.slice(i, i + 2);\n if (MULTI_CHAR_OPERATORS.includes(two)) {\n push('operator', i, i + 2);\n i += 2;\n continue;\n }\n\n // Single-character operators.\n if (SINGLE_CHAR_OPERATORS.has(ch)) {\n push('operator', i, i + 1);\n i++;\n continue;\n }\n\n // Grouping punctuation and anything else: one char, never dropped.\n push('punctuation', i, i + 1);\n i++;\n }\n\n return tokens;\n}\n\n/**\n * Maps a token kind to the `spytial-ed-syn-*` span class used by the overlay.\n * Whitespace and neutral punctuation get no class (rendered as plain text).\n */\nexport function tokenClassName(kind: TokenKind): string | undefined {\n switch (kind) {\n case 'keyword':\n return 'spytial-ed-syn-keyword';\n case 'operator':\n return 'spytial-ed-syn-operator';\n case 'string':\n return 'spytial-ed-syn-string';\n case 'number':\n return 'spytial-ed-syn-number';\n case 'identifier':\n return 'spytial-ed-syn-identifier';\n case 'comment':\n return 'spytial-ed-syn-comment';\n case 'whitespace':\n case 'punctuation':\n default:\n return undefined;\n }\n}\n\n// Re-export the punctuation set as a predicate so callers (and tests) can\n// reason about which characters are treated as grouping symbols without\n// re-deriving the table.\n/** True if `ch` is treated as grouping punctuation by the tokenizer. */\nexport function isPunctuation(ch: string): boolean {\n return PUNCTUATION.has(ch);\n}\n","/**\n * Viewport-anchored popup positioning.\n *\n * The editor is embedded in host pages whose containers routinely clip\n * absolutely-positioned children (fixed-height sidebars with `overflow:\n * hidden`/`auto` — e.g. the demo pages' layout panel). Menus and listboxes\n * therefore use `position: fixed` with coordinates computed from the trigger's\n * bounding rect, so they render above any host clipping context.\n *\n * The hook flips the popup above the anchor when there is more room there than\n * below, constrains `maxHeight` to the available space, and recomputes on\n * window resize and on any ancestor scroll (capture-phase listener). Note:\n * `position: fixed` resolves against a transformed ancestor if one exists —\n * host pages with `transform` on a wrapping element would offset the popup —\n * but no demo or known integration does this; it's the standard trade-off of\n * non-portal fixed positioning.\n */\n\nimport { useLayoutEffect, useState } from 'react';\nimport type React from 'react';\n\nexport interface AnchoredPopupOptions {\n /**\n * Horizontal alignment relative to the anchor:\n * - `'start'`: popup's left edge aligns with the anchor's left edge,\n * - `'end'`: popup's right edge aligns with the anchor's right edge,\n * - `'stretch'`: popup spans exactly the anchor's width.\n */\n align?: 'start' | 'end' | 'stretch';\n /** gap in px between anchor and popup (default 2). */\n gap?: number;\n /**\n * Expected popup height in px, used only to decide whether to flip above\n * the anchor (default 280).\n */\n estimatedHeight?: number;\n}\n\n/**\n * Returns a `style` object (fixed positioning + maxHeight) for a popup\n * anchored to `anchorRef`, or `{}` while closed. Spread it onto the popup\n * element; the element's stylesheet rule should declare `position: fixed`.\n */\nexport function useAnchoredPopup(\n open: boolean,\n anchorRef: React.RefObject<HTMLElement | null>,\n options?: AnchoredPopupOptions,\n): React.CSSProperties {\n const { align = 'start', gap = 2, estimatedHeight = 280 } = options ?? {};\n const [style, setStyle] = useState<React.CSSProperties>({});\n\n useLayoutEffect(() => {\n if (!open) {\n setStyle({});\n return;\n }\n\n const compute = (): void => {\n const anchor = anchorRef.current;\n if (!anchor) return;\n const rect = anchor.getBoundingClientRect();\n const viewportW =\n window.innerWidth || document.documentElement.clientWidth;\n const viewportH =\n window.innerHeight || document.documentElement.clientHeight;\n\n const spaceBelow = viewportH - rect.bottom - gap;\n const spaceAbove = rect.top - gap;\n const flipUp = spaceBelow < estimatedHeight && spaceAbove > spaceBelow;\n\n const next: React.CSSProperties = {\n // jsdom reports all-zero rects; the resulting 0-coordinates are inert\n // there (no layout), and real browsers always have a real rect.\n maxHeight: Math.max(120, (flipUp ? spaceAbove : spaceBelow) - 8),\n };\n\n if (flipUp) {\n next.bottom = viewportH - rect.top + gap;\n } else {\n next.top = rect.bottom + gap;\n }\n\n if (align === 'end') {\n next.right = Math.max(8, viewportW - rect.right);\n } else if (align === 'stretch') {\n next.left = rect.left;\n next.width = rect.width;\n } else {\n next.left = rect.left;\n }\n\n setStyle(next);\n };\n\n compute();\n window.addEventListener('resize', compute);\n // capture-phase so scrolls of ANY ancestor (host sidebars, the editor's\n // own scroll areas) reposition the popup rather than leaving it stranded.\n document.addEventListener('scroll', compute, true);\n return () => {\n window.removeEventListener('resize', compute);\n document.removeEventListener('scroll', compute, true);\n };\n }, [open, anchorRef, align, gap, estimatedHeight]);\n\n return style;\n}\n","/**\n * {@link SelectorField} — a controlled, single-expression CnD selector input\n * with syntax highlighting, ARIA-combobox autocomplete, an optional synthesis\n * (✨) affordance, and inline diagnostics.\n *\n * This component is intentionally domain-agnostic: it knows nothing about\n * `DomainSchema` or `SelectorAssistant`. Completion and synthesis are plain\n * props (`complete`, `synthesize`); WP4 composes the real sources (built-in\n * domain completions + the assistant hook) and passes them down.\n *\n * Highlighting uses the standard mirror-overlay technique: a `<pre aria-hidden>`\n * renders highlighted tokens behind a `<textarea>` whose own text is\n * transparent (but whose caret is visible). The two share identical font,\n * padding and box metrics, and the mirror's scroll position is synced to the\n * textarea on BOTH input and scroll — this is the fix for the scroll-desync bug\n * that got the old highlighter disabled.\n */\n\nimport React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { Completion } from '../domain/assistant';\nimport type { Diagnostic } from '../core/types';\nimport { tokenizeSelector, tokenClassName } from './highlight';\nimport { useAnchoredPopup } from './use-anchored-popup';\n\n/** Result shape of the synthesis hook. */\nexport interface SynthesisResult {\n value: string;\n explanation?: string;\n}\n\nexport interface SelectorFieldProps {\n /** controlled value */\n value: string;\n /** fired with the next value on every edit / accept */\n onChange(value: string): void;\n placeholder?: string;\n disabled?: boolean;\n /** accessible name; ignored if `aria-labelledby` is set */\n 'aria-label'?: string;\n /** id of an external label element */\n 'aria-labelledby'?: string;\n /** drives placeholder/help hint text only */\n selectorArity?: 'unary' | 'binary';\n /**\n * Completion source. Returns sync or async completions for the identifier\n * prefix at the caret. The component does not know where these come from.\n */\n complete?: (prefix: string) => Completion[] | Promise<Completion[]>;\n /**\n * Synthesis hook. When present a ✨ button appears; clicking opens an inline\n * popover that turns a natural-language request into a selector.\n */\n synthesize?: (request: string) => Promise<SynthesisResult>;\n /** field-scoped diagnostics (already filtered by the caller). */\n diagnostics?: Diagnostic[];\n /**\n * Render the syntax-highlight mirror overlay (default true). The escape\n * hatch for hosts where the overlay misaligns (exotic fonts/zoom): when\n * false the textarea renders its own visible text and no mirror exists.\n */\n highlight?: boolean;\n /** extra class on the root, for callers that need to hook styles. */\n className?: string;\n}\n\nconst COMPLETE_DEBOUNCE_MS = 150;\n\n/** Word characters that make up a selector identifier (for prefix extraction). */\nconst IDENT_CHAR = /[A-Za-z0-9_$]/;\n\n/** Highest diagnostic severity present, for the border/underline color. */\nfunction topSeverity(\n diagnostics: readonly Diagnostic[] | undefined\n): Diagnostic['severity'] | undefined {\n if (!diagnostics || diagnostics.length === 0) return undefined;\n if (diagnostics.some((d) => d.severity === 'error')) return 'error';\n if (diagnostics.some((d) => d.severity === 'warning')) return 'warning';\n return 'info';\n}\n\n/**\n * Finds the identifier prefix ending at `caret` and the offset where it starts.\n * Returns an empty prefix when the caret is not on a word.\n */\nfunction identifierPrefixAt(\n text: string,\n caret: number\n): { prefix: string; start: number } {\n let start = caret;\n while (start > 0 && IDENT_CHAR.test(text[start - 1])) start--;\n return { prefix: text.slice(start, caret), start };\n}\n\n/** Renders the highlighted mirror content as React spans (no innerHTML). */\nconst HighlightedMirror: React.FC<{ value: string }> = ({ value }) => {\n // A trailing newline must be padded so the mirror's last line keeps height,\n // matching textarea rendering.\n const tokens = useMemo(() => tokenizeSelector(value), [value]);\n return (\n <>\n {tokens.map((tok, idx) => {\n const cls = tokenClassName(tok.kind);\n return cls ? (\n <span key={idx} className={cls}>\n {tok.text}\n </span>\n ) : (\n <React.Fragment key={idx}>{tok.text}</React.Fragment>\n );\n })}\n {/* keep height when value ends in a newline */}\n {value.endsWith('\\n') ? '' : null}\n </>\n );\n};\n\nexport const SelectorField: React.FC<SelectorFieldProps> = ({\n value,\n onChange,\n placeholder,\n disabled = false,\n selectorArity,\n complete,\n synthesize,\n diagnostics,\n highlight = true,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const mirrorRef = useRef<HTMLPreElement | null>(null);\n\n const baseId = useId();\n const listboxId = `${baseId}-listbox`;\n const optionId = (i: number): string => `${baseId}-opt-${i}`;\n const diagId = `${baseId}-diag`;\n\n // ── Autocomplete state ────────────────────────────────────────────────\n const [open, setOpen] = useState(false);\n const [items, setItems] = useState<Completion[]>([]);\n const [active, setActive] = useState(0);\n // Token that increments per request so stale async responses can be dropped.\n const requestSeq = useRef(0);\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Offset where the current identifier prefix begins (for replace-on-accept).\n const prefixStart = useRef(0);\n\n // ── Synthesis popover state ───────────────────────────────────────────\n const [synOpen, setSynOpen] = useState(false);\n const [synRequest, setSynRequest] = useState('');\n const [synLoading, setSynLoading] = useState(false);\n const [synError, setSynError] = useState<string | null>(null);\n const [synResult, setSynResult] = useState<SynthesisResult | null>(null);\n const synInputRef = useRef<HTMLInputElement | null>(null);\n\n const severity = topSeverity(diagnostics);\n\n // Keep the mirror scrolled in lockstep with the textarea. Called on every\n // input AND on every scroll — the dual binding is the desync fix.\n const syncScroll = useCallback(() => {\n const ta = textareaRef.current;\n const mirror = mirrorRef.current;\n if (!ta || !mirror) return;\n mirror.scrollTop = ta.scrollTop;\n mirror.scrollLeft = ta.scrollLeft;\n }, []);\n\n // Auto-grow the textarea to fit its content (single-expression, grows down).\n //\n // Measurement safety: right at mount (e.g. a freshly added row that opens\n // expanded) the textarea can be measured before its container has laid out,\n // with a near-zero content width — the value/placeholder then wraps into a\n // 1-2px column and scrollHeight reports hundreds of px, which would stick as\n // a giant inline height. Two guards: an empty value never sets an inline\n // height at all (CSS min-height rules one line), and a degenerate width\n // defers the measurement to the next frame (bounded retries).\n const growRetries = useRef(0);\n const autoGrow = useCallback(() => {\n const ta = textareaRef.current;\n if (!ta) return;\n if (ta.value === '') {\n ta.style.height = '';\n growRetries.current = 0;\n return;\n }\n if (ta.clientWidth < 60) {\n if (growRetries.current < 10) {\n growRetries.current += 1;\n requestAnimationFrame(autoGrow);\n }\n return;\n }\n growRetries.current = 0;\n ta.style.height = 'auto';\n ta.style.height = `${ta.scrollHeight}px`;\n }, []);\n\n useEffect(() => {\n autoGrow();\n syncScroll();\n }, [value, autoGrow, syncScroll]);\n\n // ── Completion fetching (debounced, stale-drop, never-throw) ───────────\n const runComplete = useCallback(\n (text: string, caret: number) => {\n if (!complete) return;\n const { prefix, start } = identifierPrefixAt(text, caret);\n prefixStart.current = start;\n\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n const seq = ++requestSeq.current;\n debounceTimer.current = setTimeout(() => {\n let result: Completion[] | Promise<Completion[]>;\n try {\n result = complete(prefix);\n } catch {\n return; // never crash on a throwing source\n }\n Promise.resolve(result)\n .then((completions) => {\n // Drop stale responses.\n if (seq !== requestSeq.current) return;\n if (!completions || completions.length === 0) {\n setItems([]);\n setOpen(false);\n return;\n }\n setItems(completions);\n setActive(0);\n setOpen(true);\n })\n .catch(() => {\n // Never crash on a rejected promise; just leave the popup closed.\n if (seq !== requestSeq.current) return;\n setItems([]);\n setOpen(false);\n });\n }, COMPLETE_DEBOUNCE_MS);\n },\n [complete]\n );\n\n const closeAutocomplete = useCallback(() => {\n requestSeq.current++; // invalidate any in-flight response\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n setOpen(false);\n setItems([]);\n }, []);\n\n const acceptCompletion = useCallback(\n (item: Completion) => {\n const ta = textareaRef.current;\n const caret = ta ? ta.selectionStart : value.length;\n const insert = item.insertText ?? item.label;\n const next =\n value.slice(0, prefixStart.current) + insert + value.slice(caret);\n onChange(next);\n closeAutocomplete();\n // Restore caret just after the inserted text on the next frame.\n const nextCaret = prefixStart.current + insert.length;\n requestAnimationFrame(() => {\n const node = textareaRef.current;\n if (node) {\n node.focus();\n node.setSelectionRange(nextCaret, nextCaret);\n }\n });\n },\n [value, onChange, closeAutocomplete]\n );\n\n const handleInput = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const text = e.target.value;\n onChange(text);\n runComplete(text, e.target.selectionStart);\n },\n [onChange, runComplete]\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Ctrl+Space (or Cmd+Space) explicitly requests completions.\n if (e.code === 'Space' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n const ta = textareaRef.current;\n if (ta) runComplete(ta.value, ta.selectionStart);\n return;\n }\n\n if (!open || items.length === 0) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setActive((a) => (a + 1) % items.length);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setActive((a) => (a - 1 + items.length) % items.length);\n break;\n case 'Enter':\n case 'Tab':\n e.preventDefault();\n acceptCompletion(items[active]);\n break;\n case 'Escape':\n e.preventDefault();\n closeAutocomplete();\n break;\n default:\n break;\n }\n },\n [open, items, active, acceptCompletion, closeAutocomplete, runComplete]\n );\n\n // Close the popup when focus leaves the field entirely.\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n // If focus moves into our own listbox (e.g. mouse-down on an option),\n // don't close before the click registers.\n const next = e.relatedTarget as Node | null;\n if (next && mirrorRef.current?.parentElement?.contains(next)) return;\n closeAutocomplete();\n },\n [closeAutocomplete]\n );\n\n // ── Synthesis popover handlers ────────────────────────────────────────\n const openSynthesis = useCallback(() => {\n setSynOpen(true);\n setSynError(null);\n setSynResult(null);\n requestAnimationFrame(() => synInputRef.current?.focus());\n }, []);\n\n const closeSynthesis = useCallback(() => {\n setSynOpen(false);\n setSynLoading(false);\n setSynError(null);\n setSynResult(null);\n setSynRequest('');\n }, []);\n\n const runSynthesis = useCallback(async () => {\n if (!synthesize || synLoading) return;\n const request = synRequest.trim();\n if (!request) return;\n setSynLoading(true);\n setSynError(null);\n setSynResult(null);\n try {\n const result = await synthesize(request);\n setSynResult(result);\n } catch (err) {\n setSynError(\n err instanceof Error ? err.message : 'Synthesis failed. Try again.'\n );\n } finally {\n setSynLoading(false);\n }\n }, [synthesize, synLoading, synRequest]);\n\n const acceptSynthesis = useCallback(() => {\n if (!synResult) return;\n onChange(synResult.value);\n closeSynthesis();\n requestAnimationFrame(() => textareaRef.current?.focus());\n }, [synResult, onChange, closeSynthesis]);\n\n // Clean up timers on unmount.\n useEffect(\n () => () => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n },\n []\n );\n\n const hint =\n placeholder ??\n (selectorArity === 'binary'\n ? 'binary selector, e.g. parent'\n : selectorArity === 'unary'\n ? 'unary selector, e.g. Node'\n : 'selector expression');\n\n const describedBy = diagnostics && diagnostics.length > 0 ? diagId : undefined;\n\n // Viewport-fixed listbox position (spans the textarea's width, flips up when\n // cramped) so host containers with overflow clipping can't cut it off.\n const autocompleteStyle = useAnchoredPopup(open && items.length > 0, textareaRef, {\n align: 'stretch',\n estimatedHeight: 224,\n });\n\n return (\n <div\n className={`spytial-ed-selector${\n severity ? ` spytial-ed-selector--${severity}` : ''\n }${className ? ` ${className}` : ''}`}\n >\n <div\n className={`spytial-ed-selector-input-wrap${\n synthesize ? ' spytial-ed-selector-input-wrap--with-synth' : ''\n }`}\n >\n {/* Highlight mirror, behind the textarea (omitted when the host has\n disabled highlighting — the escape hatch for overlay misalignment). */}\n {highlight ? (\n <pre\n ref={mirrorRef}\n className=\"spytial-ed-selector-mirror\"\n aria-hidden=\"true\"\n >\n <HighlightedMirror value={value} />\n </pre>\n ) : null}\n\n {/*\n ARIA editable combobox (APG 1.2). The combobox role lives on the\n editable element itself, so it legitimately supports `aria-expanded`,\n `aria-autocomplete` and `aria-activedescendant`, and the accessible\n name comes from `aria-label`/`aria-labelledby`. A <textarea> is used\n (not <input>) so the field can grow vertically and wrap long lines.\n */}\n <textarea\n ref={textareaRef}\n className={`spytial-ed-selector-textarea${\n highlight ? '' : ' spytial-ed-selector-textarea--plain'\n }`}\n value={value}\n onChange={handleInput}\n onScroll={syncScroll}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n placeholder={hint}\n disabled={disabled}\n rows={1}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n wrap=\"soft\"\n role=\"combobox\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n open && items.length > 0 ? optionId(active) : undefined\n }\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={describedBy}\n aria-invalid={severity === 'error' || undefined}\n />\n\n {synthesize ? (\n <button\n type=\"button\"\n className=\"spytial-ed-selector-synth-btn\"\n onClick={openSynthesis}\n disabled={disabled}\n aria-label=\"Generate selector from a description\"\n aria-haspopup=\"dialog\"\n aria-expanded={synOpen}\n title=\"Generate selector from a description\"\n >\n <span aria-hidden=\"true\">✨</span>\n </button>\n ) : null}\n\n {/* Autocomplete listbox. */}\n {open && items.length > 0 ? (\n <ul\n className=\"spytial-ed-autocomplete\"\n style={autocompleteStyle}\n id={listboxId}\n role=\"listbox\"\n aria-label=\"Selector completions\"\n >\n {items.map((item, i) => (\n <li\n key={`${item.label}-${i}`}\n id={optionId(i)}\n role=\"option\"\n aria-selected={i === active}\n className={`spytial-ed-autocomplete-item${\n i === active ? ' spytial-ed-autocomplete-item--active' : ''\n }`}\n // mousedown (not click) so it fires before textarea blur.\n onMouseDown={(e) => {\n e.preventDefault();\n acceptCompletion(item);\n }}\n onMouseEnter={() => setActive(i)}\n >\n <span\n className={`spytial-ed-autocomplete-kind spytial-ed-kind-${item.kind}`}\n aria-hidden=\"true\"\n />\n <span className=\"spytial-ed-autocomplete-label\">\n {item.label}\n </span>\n {item.detail ? (\n <span className=\"spytial-ed-autocomplete-detail\">\n {item.detail}\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n\n {/* Synthesis popover. */}\n {synOpen ? (\n <div\n className=\"spytial-ed-synth-popover\"\n role=\"dialog\"\n aria-label=\"Generate selector\"\n >\n <div className=\"spytial-ed-synth-row\">\n <input\n ref={synInputRef}\n type=\"text\"\n className=\"spytial-ed-synth-input\"\n value={synRequest}\n placeholder=\"Describe the selector you want…\"\n disabled={synLoading}\n aria-label=\"Selector description\"\n onChange={(e) => setSynRequest(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n void runSynthesis();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n closeSynthesis();\n }\n }}\n />\n <button\n type=\"button\"\n className=\"spytial-ed-synth-generate\"\n onClick={() => void runSynthesis()}\n disabled={synLoading || synRequest.trim().length === 0}\n >\n {synLoading ? 'Generating…' : 'Generate'}\n </button>\n </div>\n\n {synError ? (\n <div className=\"spytial-ed-synth-error\" role=\"alert\">\n {synError}\n </div>\n ) : null}\n\n {synResult ? (\n <div className=\"spytial-ed-synth-result\">\n <pre className=\"spytial-ed-synth-preview\" aria-label=\"Proposed selector\">\n <HighlightedMirror value={synResult.value} />\n </pre>\n {synResult.explanation ? (\n <p className=\"spytial-ed-synth-explanation\">\n {synResult.explanation}\n </p>\n ) : null}\n <div className=\"spytial-ed-synth-actions\">\n <button\n type=\"button\"\n className=\"spytial-ed-synth-accept\"\n onClick={acceptSynthesis}\n >\n Accept\n </button>\n <button\n type=\"button\"\n className=\"spytial-ed-synth-dismiss\"\n onClick={closeSynthesis}\n >\n Dismiss\n </button>\n </div>\n </div>\n ) : null}\n </div>\n ) : null}\n\n {/* Inline diagnostics. */}\n {diagnostics && diagnostics.length > 0 ? (\n <ul className=\"spytial-ed-diagnostics\" id={diagId}>\n {diagnostics.map((d, i) => (\n <li\n key={i}\n className={`spytial-ed-diagnostic spytial-ed-diagnostic--${d.severity}`}\n >\n <span\n className=\"spytial-ed-diagnostic-dot\"\n aria-hidden=\"true\"\n />\n <span className=\"spytial-ed-diagnostic-msg\">{d.message}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n};\n","/**\n * {@link FieldRenderer} — a generic, schema-driven form renderer for the spec\n * editor. Given a `FieldSpec[]`, a values map and an `onChange(key, value)`\n * callback, it renders one row per field, dispatching on {@link FieldKind}:\n *\n * - `selector` → {@link SelectorField}\n * - `relationName` /\n * `typeName` → combo box (text input + datalist of known names)\n * - `enum` → segmented pill buttons (multi-select pills when `multiple`)\n * - `number` → number input\n * - `color` → color swatch input\n * - `boolean` → switch\n * - `text` → text input\n *\n * The renderer is domain-agnostic. Domain names for `relationName`/`typeName`\n * combo boxes come from the `options` prop; per-field selector props (the\n * completion + synthesis sources) come from an optional `selectorProps`\n * callback that WP4 supplies. With neither, every field still renders and edits.\n */\n\nimport React, { useId } from 'react';\nimport type { Diagnostic, FieldSpec } from '../core/types';\nimport { SelectorField } from './SelectorField';\nimport type { SelectorFieldProps } from './SelectorField';\n\n/** Domain names available for the combo-box field kinds. */\nexport interface FieldRendererOptions {\n relationNames?: readonly string[];\n typeNames?: readonly string[];\n}\n\n/** Per-field selector wiring, forwarded into {@link SelectorField}. */\nexport type SelectorFieldExtras = Pick<\n SelectorFieldProps,\n 'complete' | 'synthesize' | 'highlight'\n>;\n\nexport interface FieldRendererProps {\n fields: readonly FieldSpec[];\n values: Record<string, unknown>;\n onChange(key: string, value: unknown): void;\n /** all diagnostics for the item; the renderer buckets them per field. */\n diagnostics?: readonly Diagnostic[];\n /** domain names for combo-box fields. */\n options?: FieldRendererOptions;\n /** optional per-field selector wiring (completion/synthesis). */\n selectorProps?: (field: FieldSpec) => SelectorFieldExtras | undefined;\n disabled?: boolean;\n className?: string;\n}\n\n/** Coerce an unknown stored value to a string for text-like inputs. */\nfunction asString(value: unknown): string {\n if (value === undefined || value === null) return '';\n return String(value);\n}\n\n/** Coerce an unknown stored value to an array of strings (multi-enum). */\nfunction asStringArray(value: unknown): string[] {\n if (Array.isArray(value)) return value.map((v) => String(v));\n if (value === undefined || value === null || value === '') return [];\n return [String(value)];\n}\n\n/** Whether a value is a plain object (a nested block). */\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nconst fieldDiagnostics = (\n diagnostics: readonly Diagnostic[] | undefined,\n key: string\n): Diagnostic[] =>\n (diagnostics ?? []).filter((d) => d.fieldKey === key);\n\nconst topSeverity = (\n ds: readonly Diagnostic[]\n): Diagnostic['severity'] | undefined => {\n if (ds.length === 0) return undefined;\n if (ds.some((d) => d.severity === 'error')) return 'error';\n if (ds.some((d) => d.severity === 'warning')) return 'warning';\n return 'info';\n};\n\n/** Inline diagnostic list, shared by non-selector fields. */\nconst FieldDiagnostics: React.FC<{ diagnostics: Diagnostic[]; id: string }> = ({\n diagnostics,\n id,\n}) =>\n diagnostics.length > 0 ? (\n <ul className=\"spytial-ed-diagnostics\" id={id}>\n {diagnostics.map((d, i) => (\n <li\n key={i}\n className={`spytial-ed-diagnostic spytial-ed-diagnostic--${d.severity}`}\n >\n <span className=\"spytial-ed-diagnostic-dot\" aria-hidden=\"true\" />\n <span className=\"spytial-ed-diagnostic-msg\">{d.message}</span>\n </li>\n ))}\n </ul>\n ) : null;\n\nexport const FieldRenderer: React.FC<FieldRendererProps> = ({\n fields,\n values,\n onChange,\n diagnostics,\n options,\n selectorProps,\n disabled = false,\n className,\n}) => {\n const groupId = useId();\n\n return (\n <div className={`spytial-ed-fields${className ? ` ${className}` : ''}`}>\n {fields.map((field) => {\n // Nested blocks render as their own sub-fieldset (or an \"add\" chip),\n // outside the standard label+control row.\n if (field.kind === 'group') {\n return (\n <GroupField\n key={field.key}\n field={field}\n value={values[field.key]}\n onChange={onChange}\n options={options}\n selectorProps={selectorProps}\n diagnostics={diagnostics}\n disabled={disabled}\n />\n );\n }\n const fieldId = `${groupId}-${field.key}`;\n const labelId = `${fieldId}-label`;\n const diagId = `${fieldId}-diag`;\n const ds = fieldDiagnostics(diagnostics, field.key);\n const severity = topSeverity(ds);\n const value = values[field.key];\n\n return (\n <div\n key={field.key}\n className={`spytial-ed-field spytial-ed-field--${field.kind}${\n severity ? ` spytial-ed-field--${severity}` : ''\n }`}\n >\n <label\n id={labelId}\n htmlFor={field.kind === 'selector' ? undefined : fieldId}\n className=\"spytial-ed-field-label\"\n title={field.help}\n >\n {field.label}\n {field.required ? (\n <span\n className=\"spytial-ed-field-required\"\n aria-hidden=\"true\"\n title=\"required\"\n >\n {' '}\n *\n </span>\n ) : null}\n </label>\n\n <div className=\"spytial-ed-field-control\">\n {renderControl(field, value, {\n fieldId,\n labelId,\n diagId,\n hasDiagnostics: ds.length > 0,\n disabled,\n onChange,\n options,\n selectorProps,\n diagnostics: ds,\n })}\n\n {/* Selector renders its own diagnostics inline; others here. */}\n {field.kind === 'selector' ? null : (\n <FieldDiagnostics diagnostics={ds} id={diagId} />\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\n/**\n * A `group` field — a nested style block (lineStyle / textStyle / …). When the\n * block is absent and optional, renders a progressive-disclosure \"+ Label\" chip;\n * when present, a labeled sub-fieldset of the block's children (recursing through\n * {@link FieldRenderer}) with a remove control. Children are kept sparse: a\n * cleared leaf is dropped, and an emptied block is removed on emit by the codec.\n */\nfunction GroupField({\n field,\n value,\n onChange,\n options,\n selectorProps,\n diagnostics,\n disabled,\n}: {\n field: FieldSpec;\n value: unknown;\n onChange: (key: string, value: unknown) => void;\n options?: FieldRendererOptions;\n selectorProps?: (field: FieldSpec) => SelectorFieldExtras | undefined;\n diagnostics?: readonly Diagnostic[];\n disabled: boolean;\n}): React.ReactElement {\n const groupValue = isRecord(value) ? value : undefined;\n const removable = !field.required;\n\n if (groupValue === undefined) {\n return (\n <button\n type=\"button\"\n className=\"spytial-ed-group-add\"\n onClick={() => onChange(field.key, {})}\n disabled={disabled}\n title={field.help}\n >\n + {field.label}\n </button>\n );\n }\n\n const setChild = (childKey: string, childVal: unknown) => {\n const next: Record<string, unknown> = { ...groupValue };\n const empty =\n childVal === undefined ||\n childVal === '' ||\n (Array.isArray(childVal) && childVal.length === 0);\n if (empty) delete next[childKey];\n else next[childKey] = childVal;\n onChange(field.key, next);\n };\n\n return (\n <fieldset className=\"spytial-ed-group\">\n <legend className=\"spytial-ed-group-legend\">\n <span>{field.label}</span>\n {removable ? (\n <button\n type=\"button\"\n className=\"spytial-ed-group-remove\"\n onClick={() => onChange(field.key, undefined)}\n disabled={disabled}\n aria-label={`Remove ${field.label}`}\n title={`Remove ${field.label}`}\n >\n ×\n </button>\n ) : null}\n </legend>\n <FieldRenderer\n fields={field.children ?? []}\n values={groupValue}\n onChange={setChild}\n options={options}\n selectorProps={selectorProps}\n diagnostics={diagnostics}\n disabled={disabled}\n />\n </fieldset>\n );\n}\n\ninterface ControlCtx {\n fieldId: string;\n labelId: string;\n diagId: string;\n hasDiagnostics: boolean;\n disabled: boolean;\n onChange: (key: string, value: unknown) => void;\n options?: FieldRendererOptions;\n selectorProps?: (field: FieldSpec) => SelectorFieldExtras | undefined;\n diagnostics: Diagnostic[];\n}\n\nfunction renderControl(\n field: FieldSpec,\n value: unknown,\n ctx: ControlCtx\n): React.ReactNode {\n const {\n fieldId,\n labelId,\n diagId,\n hasDiagnostics,\n disabled,\n onChange,\n options,\n selectorProps,\n diagnostics,\n } = ctx;\n const describedBy = hasDiagnostics ? diagId : undefined;\n\n switch (field.kind) {\n case 'selector': {\n const extras = selectorProps?.(field) ?? {};\n return (\n <SelectorField\n value={asString(value)}\n onChange={(v) => onChange(field.key, v)}\n placeholder={field.placeholder}\n disabled={disabled}\n selectorArity={field.selectorArity}\n aria-labelledby={labelId}\n diagnostics={diagnostics}\n complete={extras.complete}\n synthesize={extras.synthesize}\n highlight={extras.highlight}\n />\n );\n }\n\n case 'relationName':\n case 'typeName': {\n const names =\n field.kind === 'relationName'\n ? options?.relationNames\n : options?.typeNames;\n const listId = `${fieldId}-list`;\n const hasOptions = !!names && names.length > 0;\n return (\n <>\n <input\n id={fieldId}\n type=\"text\"\n className=\"spytial-ed-input spytial-ed-combo\"\n value={asString(value)}\n placeholder={field.placeholder}\n disabled={disabled}\n list={hasOptions ? listId : undefined}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n aria-describedby={describedBy}\n aria-invalid={\n diagnostics.some((d) => d.severity === 'error') || undefined\n }\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n {hasOptions ? (\n <datalist id={listId}>\n {names!.map((n) => (\n <option key={n} value={n} />\n ))}\n </datalist>\n ) : null}\n </>\n );\n }\n\n case 'enum': {\n const opts = field.options ?? [];\n if (field.multiple) {\n const selected = asStringArray(value);\n return (\n <div\n className=\"spytial-ed-pills\"\n role=\"group\"\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n >\n {opts.map((opt) => {\n const isOn = selected.includes(opt);\n return (\n <button\n key={opt}\n type=\"button\"\n className={`spytial-ed-pill${\n isOn ? ' spytial-ed-pill--active' : ''\n }`}\n aria-pressed={isOn}\n disabled={disabled}\n onClick={() => {\n const next = isOn\n ? selected.filter((s) => s !== opt)\n : [...selected, opt];\n onChange(field.key, next);\n }}\n >\n {opt}\n </button>\n );\n })}\n </div>\n );\n }\n // single-select segmented control\n const current = asString(value);\n return (\n <div\n className=\"spytial-ed-pills\"\n role=\"radiogroup\"\n aria-labelledby={labelId}\n aria-describedby={describedBy}\n >\n {opts.map((opt) => {\n const isOn = current === opt;\n return (\n <button\n key={opt}\n type=\"button\"\n className={`spytial-ed-pill${\n isOn ? ' spytial-ed-pill--active' : ''\n }`}\n role=\"radio\"\n aria-checked={isOn}\n disabled={disabled}\n onClick={() => onChange(field.key, opt)}\n >\n {opt}\n </button>\n );\n })}\n </div>\n );\n }\n\n case 'number': {\n const raw = value;\n const display =\n raw === undefined || raw === null || raw === '' ? '' : String(raw);\n return (\n <input\n id={fieldId}\n type=\"number\"\n className=\"spytial-ed-input spytial-ed-input--number\"\n value={display}\n placeholder={field.placeholder}\n disabled={disabled}\n aria-describedby={describedBy}\n aria-invalid={\n diagnostics.some((d) => d.severity === 'error') || undefined\n }\n onChange={(e) => {\n const v = e.target.value;\n // Emit a number when parseable, empty string when cleared.\n onChange(field.key, v === '' ? '' : Number(v));\n }}\n />\n );\n }\n\n case 'color': {\n const colorVal = asString(value) || '#000000';\n return (\n <div className=\"spytial-ed-color\">\n <input\n id={fieldId}\n type=\"color\"\n className=\"spytial-ed-color-swatch\"\n value={normalizeColor(colorVal)}\n disabled={disabled}\n aria-describedby={describedBy}\n aria-label={`${field.label} color`}\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n <input\n type=\"text\"\n className=\"spytial-ed-input spytial-ed-color-text\"\n value={asString(value)}\n placeholder={field.placeholder ?? '#rrggbb'}\n disabled={disabled}\n spellCheck={false}\n aria-label={`${field.label} hex value`}\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n </div>\n );\n }\n\n case 'boolean': {\n const checked = value === true || value === 'true';\n return (\n <button\n id={fieldId}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-describedby={describedBy}\n className={`spytial-ed-switch${\n checked ? ' spytial-ed-switch--on' : ''\n }`}\n disabled={disabled}\n onClick={() => onChange(field.key, !checked)}\n >\n <span className=\"spytial-ed-switch-thumb\" aria-hidden=\"true\" />\n </button>\n );\n }\n\n case 'text':\n default:\n return (\n <input\n id={fieldId}\n type=\"text\"\n className=\"spytial-ed-input\"\n value={asString(value)}\n placeholder={field.placeholder}\n disabled={disabled}\n aria-describedby={describedBy}\n aria-invalid={\n diagnostics.some((d) => d.severity === 'error') || undefined\n }\n onChange={(e) => onChange(field.key, e.target.value)}\n />\n );\n }\n}\n\n/** Native `<input type=color>` only accepts `#rrggbb`; coerce best-effort. */\nfunction normalizeColor(value: string): string {\n const v = value.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(v)) return v;\n if (/^#[0-9a-fA-F]{3}$/.test(v)) {\n return `#${v[1]}${v[1]}${v[2]}${v[2]}${v[3]}${v[3]}`;\n }\n return '#000000';\n}\n","/**\n * {@link CodeView} — the raw-YAML editing surface of the spec editor.\n *\n * A CodeMirror 6 editor (not a textarea): CodeMirror owns the text rendering, so\n * syntax highlighting is real (no transparent-text mirror to keep in sync) and\n * diagnostics are drawn as IDE-style squiggly underlines you can hover to read.\n * The value is controlled by {@link SpecEditor}: typing fires `onChange(text)`\n * immediately, and the parent attempts a debounced parse. A parse error never\n * clobbers the model — the parent keeps the last good state and passes the\n * diagnostics down here as {@link PositionedDiagnostic}s (already resolved to\n * character ranges by `positionDiagnostics`), which we hand to `@codemirror/lint`.\n *\n * Highlighting uses `@codemirror/lang-yaml` themed through the same\n * `--spytial-ed-syn-*` CSS variables the rest of the editor uses, so it tracks\n * light/dark automatically. A persistent diagnostics list is kept below the\n * editor for accessibility and for any diagnostic that couldn't be positioned.\n */\n\nimport React, { useEffect, useId, useMemo, useRef } from 'react';\nimport { EditorState, Compartment } from '@codemirror/state';\nimport { EditorView, keymap, lineNumbers } from '@codemirror/view';\nimport { defaultKeymap, history, historyKeymap } from '@codemirror/commands';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { yaml } from '@codemirror/lang-yaml';\nimport { lintGutter, setDiagnostics, type Diagnostic as CmDiagnostic } from '@codemirror/lint';\nimport { tags as t } from '@lezer/highlight';\nimport type { Diagnostic } from '../core/types';\nimport type { PositionedDiagnostic } from '../core/code-positioning';\n\nexport interface CodeViewProps {\n /** controlled YAML text */\n value: string;\n /** fired with the next text on every edit */\n onChange(value: string): void;\n /**\n * Diagnostics for the current text, pre-resolved to character ranges. Those\n * with a range become editor squiggles; all appear in the list below.\n */\n diagnostics?: readonly PositionedDiagnostic[];\n /**\n * True when the text differs from the applied model (a parse error is keeping\n * the model on its last good state). Drives the \"unapplied edits\" notice.\n */\n hasUnappliedEdits?: boolean;\n /** render a line-number gutter (default true). */\n showLineNumbers?: boolean;\n /** syntax-highlight the YAML (default true). */\n syntaxHighlighting?: boolean;\n disabled?: boolean;\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Stable severity ranking for sorting the diagnostics list (errors first). */\nconst SEVERITY_ORDER: Record<Diagnostic['severity'], number> = {\n error: 0,\n warning: 1,\n info: 2,\n};\n\n/**\n * YAML token colors, mapped onto the editor's `--spytial-ed-syn-*` variables so\n * the highlight tracks the active (light/dark) theme. Keys carry the \"keyword\"\n * color, matching the old hand-rolled tokenizer's palette.\n */\nconst yamlHighlightStyle = HighlightStyle.define([\n { tag: t.comment, color: 'var(--spytial-ed-syn-comment, #8a8170)', fontStyle: 'italic' },\n { tag: [t.string, t.special(t.string)], color: 'var(--spytial-ed-syn-string, #7a5901)' },\n { tag: [t.number, t.bool, t.null], color: 'var(--spytial-ed-syn-number, #7a5901)' },\n {\n tag: [t.propertyName, t.definition(t.propertyName), t.keyword, t.atom],\n color: 'var(--spytial-ed-syn-keyword, #6d28a8)',\n },\n { tag: [t.punctuation, t.separator], color: 'var(--spytial-ed-text-muted, #6e6553)' },\n]);\n\n/** Editor chrome themed through the shared spec-editor CSS variables. */\nconst editorTheme = EditorView.theme({\n '&': {\n fontSize: '0.85em',\n color: 'var(--spytial-ed-text, #221d14)',\n backgroundColor: 'var(--spytial-ed-surface, #faf8f2)',\n border: '1px solid var(--spytial-ed-border, #d9d2c0)',\n borderRadius: 'var(--spytial-ed-radius, 2px)',\n minHeight: '12rem',\n },\n '&.cm-focused': { outline: '2px solid var(--spytial-ed-accent, #b5431a)', outlineOffset: '-1px' },\n '.cm-scroller': {\n fontFamily: 'var(--spytial-ed-mono-font-family, ui-monospace, monospace)',\n lineHeight: '1.5',\n overflow: 'auto',\n },\n '.cm-content': { padding: '0.5em 0', caretColor: 'var(--spytial-ed-accent, #b5431a)' },\n '.cm-cursor, .cm-dropCursor': { borderLeftColor: 'var(--spytial-ed-accent, #b5431a)' },\n '.cm-gutters': {\n backgroundColor: 'var(--spytial-ed-surface-raised, #f1ecdf)',\n color: 'var(--spytial-ed-text-muted, #6e6553)',\n border: 'none',\n borderInlineEnd: '1px solid var(--spytial-ed-border, #d9d2c0)',\n },\n '.cm-lineNumbers .cm-gutterElement': { padding: '0 0.5em 0 0.6em' },\n '&.cm-editor .cm-selectionBackground, & .cm-selectionBackground, & .cm-content ::selection': {\n backgroundColor: 'color-mix(in srgb, var(--spytial-ed-accent, #b5431a) 22%, transparent)',\n },\n '.cm-tooltip': {\n border: '1px solid var(--spytial-ed-border, #d9d2c0)',\n backgroundColor: 'var(--spytial-ed-surface-raised, #f1ecdf)',\n color: 'var(--spytial-ed-text, #221d14)',\n borderRadius: 'var(--spytial-ed-radius, 2px)',\n fontSize: '0.85em',\n },\n});\n\n/** Map our severity onto CodeMirror's (identical vocabulary for these three). */\nfunction cmSeverity(s: Diagnostic['severity']): CmDiagnostic['severity'] {\n return s; // 'error' | 'warning' | 'info' all exist in CodeMirror's union\n}\n\n/** Positioned diagnostics → CodeMirror lint diagnostics (only the ranged ones). */\nfunction toCmDiagnostics(\n diagnostics: readonly PositionedDiagnostic[] | undefined,\n docLength: number,\n): CmDiagnostic[] {\n if (!diagnostics) return [];\n const out: CmDiagnostic[] = [];\n for (const d of diagnostics) {\n if (d.from === undefined || d.to === undefined) continue;\n const from = Math.max(0, Math.min(d.from, docLength));\n const to = Math.max(from, Math.min(d.to, docLength));\n out.push({\n from,\n to,\n severity: cmSeverity(d.severity),\n message: d.message,\n // `code` (e.g. 'deprecated') surfaces as the source label in the tooltip.\n source: d.code,\n });\n }\n // CodeMirror expects diagnostics sorted by `from`.\n out.sort((a, b) => a.from - b.from);\n return out;\n}\n\nexport const CodeView: React.FC<CodeViewProps> = ({\n value,\n onChange,\n diagnostics,\n hasUnappliedEdits = false,\n showLineNumbers = true,\n syntaxHighlighting: highlight = true,\n disabled = false,\n 'aria-label': ariaLabel = 'Layout specification YAML',\n className,\n}) => {\n const hostRef = useRef<HTMLDivElement | null>(null);\n const viewRef = useRef<EditorView | null>(null);\n // Always-current callback, so the persistent editor never calls a stale one.\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n // Reconfigurable editable/read-only state (driven by `disabled`).\n const editableRef = useRef(new Compartment());\n const baseId = useId();\n const diagId = `${baseId}-diag`;\n\n // Create the editor once; subsequent prop changes are pushed via the effects\n // below (the EditorView persists across React renders).\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const extensions = [\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n ...(showLineNumbers ? [lineNumbers()] : []),\n ...(highlight ? [yaml(), syntaxHighlighting(yamlHighlightStyle)] : []),\n lintGutter(),\n editorTheme,\n editableRef.current.of([\n EditorView.editable.of(!disabled),\n EditorState.readOnly.of(disabled),\n ]),\n EditorView.contentAttributes.of({ 'aria-label': ariaLabel, 'aria-describedby': diagId }),\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onChangeRef.current(update.state.doc.toString());\n }\n }),\n ];\n\n const view = new EditorView({\n state: EditorState.create({ doc: value, extensions }),\n parent: host,\n });\n viewRef.current = view;\n\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // Mount once. `value`/`diagnostics`/`disabled` are synced by the effects\n // below; the other inputs are construction-time options.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Push external value changes into the editor (guarding the typing feedback\n // loop: when the user types, onChange updates `value`, which arrives here\n // already equal to the doc, so no transaction is dispatched).\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n const current = view.state.doc.toString();\n if (current !== value) {\n view.dispatch({ changes: { from: 0, to: current.length, insert: value } });\n }\n }, [value]);\n\n // Push diagnostics into the lint layer (squiggles + hover tooltips).\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch(setDiagnostics(view.state, toCmDiagnostics(diagnostics, view.state.doc.length)));\n }, [diagnostics]);\n\n // Reconfigure editable / read-only when `disabled` changes.\n useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: editableRef.current.reconfigure([\n EditorView.editable.of(!disabled),\n EditorState.readOnly.of(disabled),\n ]),\n });\n }, [disabled]);\n\n const sorted = useMemo(() => {\n if (!diagnostics || diagnostics.length === 0) return [];\n return [...diagnostics].sort((a, b) => {\n const sev = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];\n if (sev !== 0) return sev;\n return (a.line ?? Infinity) - (b.line ?? Infinity);\n });\n }, [diagnostics]);\n\n return (\n <div className={`spytial-ed-code${className ? ` ${className}` : ''}`}>\n {hasUnappliedEdits ? (\n <div className=\"spytial-ed-code-notice\" role=\"status\">\n Text has unapplied edits — fix the error below to update the builder.\n </div>\n ) : null}\n\n <div\n ref={hostRef}\n className={`spytial-ed-code-cm${disabled ? ' spytial-ed-code-cm--disabled' : ''}`}\n />\n\n {sorted.length > 0 ? (\n <ul className=\"spytial-ed-code-diagnostics\" id={diagId}>\n {sorted.map((d, i) => (\n <li\n key={i}\n className={`spytial-ed-diagnostic spytial-ed-diagnostic--${d.severity}`}\n >\n <span className=\"spytial-ed-diagnostic-dot\" aria-hidden=\"true\" />\n {d.line !== undefined ? (\n <span className=\"spytial-ed-code-diagnostic-loc\">\n {d.column !== undefined\n ? `Ln ${d.line}, Col ${d.column}`\n : `Ln ${d.line}`}\n </span>\n ) : null}\n <span className=\"spytial-ed-diagnostic-msg\">{d.message}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n};\n","/**\n * {@link BuilderView} — the compact, schema-driven row list of the spec editor.\n *\n * Each constraint/directive is a single compact row: a kind badge, the type\n * label, a live `summary(params)`, a diagnostic dot when the item has issues,\n * and an overflow menu (duplicate · delete · move up/down · add comment).\n * Clicking a row expands it inline (accordion: exactly one open at a time, Esc\n * collapses) into the generated form rendered by {@link FieldRenderer} from the\n * registry definition, plus a \"negate\" toggle for types that support `hold` and\n * a free-text comment input.\n *\n * \"Add constraint\" / \"Add directive\" buttons open searchable menus built from\n * the registry (deprecated types hidden). Reordering is keyboard-accessible via\n * the overflow menu's move up/down items.\n *\n * Unknown-type items (those carrying `SpecItem.raw`) render as a read-only row\n * labelled with their YAML key and a \"preserved as written\" note — they survive\n * round-trips untouched.\n *\n * This component is domain-blind about completion/synthesis: the parent passes a\n * `selectorProps(item, field)` callback that composes the real sources.\n */\n\nimport React, {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type {\n Diagnostic,\n FieldSpec,\n ItemKind,\n SpecItem,\n} from '../core/types';\nimport {\n getDefinition,\n getDefinitions,\n} from '../core/registry';\nimport { FieldRenderer } from './FieldRenderer';\nimport type {\n FieldRendererOptions,\n SelectorFieldExtras,\n} from './FieldRenderer';\nimport { useAnchoredPopup } from './use-anchored-popup';\n\n/** Types that round-trip a `hold: never` negation toggle. */\nconst NEGATABLE_TYPES: ReadonlySet<string> = new Set([\n 'orientation',\n 'cyclic',\n 'align',\n 'groupselector',\n 'groupfield',\n]);\n\nexport interface BuilderViewProps {\n constraints: readonly SpecItem[];\n directives: readonly SpecItem[];\n /** all diagnostics; the view buckets them per item/field. */\n diagnostics?: readonly Diagnostic[];\n /** domain names for combo-box fields. */\n options?: FieldRendererOptions;\n /** per (item, field) selector wiring (completion/synthesis). */\n selectorProps?: (item: SpecItem, field: FieldSpec) => SelectorFieldExtras | undefined;\n /**\n * Add an item. Return the created {@link SpecItem} and the builder\n * auto-expands its row (a fresh constraint/directive opens ready to edit,\n * not minimized); return nothing and the row starts collapsed.\n */\n onAddItem(kind: ItemKind, type: string): SpecItem | void;\n onUpdateParam(id: string, key: string, value: unknown): void;\n onUpdateComment(id: string, comment: string): void;\n /** toggle the `hold: never` negation for a negatable item. */\n onToggleNegate(id: string, negated: boolean): void;\n onDuplicate(id: string): void;\n onRemove(id: string): void;\n onMove(id: string, direction: -1 | 1): void;\n disabled?: boolean;\n className?: string;\n}\n\nexport const BuilderView: React.FC<BuilderViewProps> = ({\n constraints,\n directives,\n diagnostics,\n options,\n selectorProps,\n onAddItem,\n onUpdateParam,\n onUpdateComment,\n onToggleNegate,\n onDuplicate,\n onRemove,\n onMove,\n disabled = false,\n className,\n}) => {\n // Exactly one expanded row at a time (accordion).\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n const toggleExpand = useCallback((id: string) => {\n setExpandedId((cur) => (cur === id ? null : id));\n }, []);\n\n // Collapse the currently expanded row. The id arg lets callers reason about\n // which row collapsed (focus return is handled in the Row itself).\n const collapse = useCallback((_id?: string) => setExpandedId(null), []);\n\n // Adding opens the new row's form immediately (not minimized): the parent\n // returns the created item and we expand it.\n const handleAddItem = useCallback(\n (kind: ItemKind, type: string) => {\n const created = onAddItem(kind, type);\n if (created && typeof created === 'object' && 'id' in created) {\n setExpandedId(created.id);\n }\n return created;\n },\n [onAddItem],\n );\n\n const empty = constraints.length === 0 && directives.length === 0;\n\n return (\n <div className={`spytial-ed-builder${className ? ` ${className}` : ''}`}>\n <Section\n title=\"Constraints\"\n kind=\"constraint\"\n items={constraints}\n diagnostics={diagnostics}\n options={options}\n selectorProps={selectorProps}\n expandedId={expandedId}\n onToggleExpand={toggleExpand}\n onCollapse={collapse}\n onAddItem={handleAddItem}\n onUpdateParam={onUpdateParam}\n onUpdateComment={onUpdateComment}\n onToggleNegate={onToggleNegate}\n onDuplicate={onDuplicate}\n onRemove={onRemove}\n onMove={onMove}\n disabled={disabled}\n />\n\n <Section\n title=\"Directives\"\n kind=\"directive\"\n items={directives}\n diagnostics={diagnostics}\n options={options}\n selectorProps={selectorProps}\n expandedId={expandedId}\n onToggleExpand={toggleExpand}\n onCollapse={collapse}\n onAddItem={handleAddItem}\n onUpdateParam={onUpdateParam}\n onUpdateComment={onUpdateComment}\n onToggleNegate={onToggleNegate}\n onDuplicate={onDuplicate}\n onRemove={onRemove}\n onMove={onMove}\n disabled={disabled}\n />\n\n {empty ? (\n <p className=\"spytial-ed-builder-empty\">\n No constraints or directives yet — add one to start shaping the layout.\n </p>\n ) : null}\n </div>\n );\n};\n\n// ---- section (constraints / directives) ----------------------------------\n\ninterface SectionProps {\n title: string;\n kind: ItemKind;\n items: readonly SpecItem[];\n diagnostics?: readonly Diagnostic[];\n options?: FieldRendererOptions;\n selectorProps?: (item: SpecItem, field: FieldSpec) => SelectorFieldExtras | undefined;\n expandedId: string | null;\n onToggleExpand(id: string): void;\n onCollapse(id?: string): void;\n onAddItem(kind: ItemKind, type: string): void;\n onUpdateParam(id: string, key: string, value: unknown): void;\n onUpdateComment(id: string, comment: string): void;\n onToggleNegate(id: string, negated: boolean): void;\n onDuplicate(id: string): void;\n onRemove(id: string): void;\n onMove(id: string, direction: -1 | 1): void;\n disabled: boolean;\n}\n\nconst Section: React.FC<SectionProps> = ({\n title,\n kind,\n items,\n diagnostics,\n options,\n selectorProps,\n expandedId,\n onToggleExpand,\n onCollapse,\n onAddItem,\n onUpdateParam,\n onUpdateComment,\n onToggleNegate,\n onDuplicate,\n onRemove,\n onMove,\n disabled,\n}) => {\n const listLabel = `${title} List`;\n\n // Focus management (APG accordion): keep a live map of each row's toggle\n // button plus a ref to the \"Add\" button, so after deleting a row we can land\n // focus on a sensible neighbour instead of dropping it to <body>.\n const toggleRefs = useRef<Map<string, HTMLButtonElement>>(new Map());\n const addBtnRef = useRef<HTMLButtonElement | null>(null);\n // Set to the id of the toggle to focus once the post-delete re-render lands;\n // `'__add__'` is a sentinel meaning \"focus the Add button\".\n const pendingFocusId = useRef<string | null>(null);\n\n const registerToggle = useCallback(\n (id: string, el: HTMLButtonElement | null): void => {\n if (el) {\n toggleRefs.current.set(id, el);\n } else {\n toggleRefs.current.delete(id);\n }\n },\n [],\n );\n\n const handleRemove = useCallback(\n (id: string): void => {\n // Decide the focus target BEFORE removal, from the current ordering:\n // next row's toggle, else previous row's toggle, else the Add button.\n const idx = items.findIndex((it) => it.id === id);\n const next = items[idx + 1];\n const prev = items[idx - 1];\n pendingFocusId.current = next?.id ?? prev?.id ?? '__add__';\n onRemove(id);\n },\n [items, onRemove],\n );\n\n // After the list re-renders (post-delete), move focus to the chosen target.\n useEffect(() => {\n const target = pendingFocusId.current;\n if (target === null) return;\n pendingFocusId.current = null;\n if (target === '__add__') {\n addBtnRef.current?.focus();\n return;\n }\n toggleRefs.current.get(target)?.focus();\n }, [items]);\n\n return (\n <section className=\"spytial-ed-section\" aria-label={title}>\n <div className=\"spytial-ed-section-head\">\n <h3 className=\"spytial-ed-section-title\">{title}</h3>\n <AddMenu\n kind={kind}\n onAdd={onAddItem}\n disabled={disabled}\n triggerRef={addBtnRef}\n />\n </div>\n\n <ul className=\"spytial-ed-rows\" aria-label={listLabel}>\n {items.map((item, index) => (\n <Row\n key={item.id}\n item={item}\n index={index}\n count={items.length}\n diagnostics={diagnostics}\n options={options}\n selectorProps={selectorProps}\n expanded={expandedId === item.id}\n onToggleExpand={onToggleExpand}\n onCollapse={onCollapse}\n registerToggle={registerToggle}\n onUpdateParam={onUpdateParam}\n onUpdateComment={onUpdateComment}\n onToggleNegate={onToggleNegate}\n onDuplicate={onDuplicate}\n onRemove={handleRemove}\n onMove={onMove}\n disabled={disabled}\n />\n ))}\n </ul>\n </section>\n );\n};\n\n// ---- a single row --------------------------------------------------------\n\ninterface RowProps {\n item: SpecItem;\n index: number;\n count: number;\n diagnostics?: readonly Diagnostic[];\n options?: FieldRendererOptions;\n selectorProps?: (item: SpecItem, field: FieldSpec) => SelectorFieldExtras | undefined;\n expanded: boolean;\n onToggleExpand(id: string): void;\n /** collapse the row and return focus to its toggle (Esc / APG accordion). */\n onCollapse(id: string): void;\n /** register/unregister this row's toggle button for focus management. */\n registerToggle(id: string, el: HTMLButtonElement | null): void;\n onUpdateParam(id: string, key: string, value: unknown): void;\n onUpdateComment(id: string, comment: string): void;\n onToggleNegate(id: string, negated: boolean): void;\n onDuplicate(id: string): void;\n onRemove(id: string): void;\n onMove(id: string, direction: -1 | 1): void;\n disabled: boolean;\n}\n\nconst Row: React.FC<RowProps> = ({\n item,\n index,\n count,\n diagnostics,\n options,\n selectorProps,\n expanded,\n onToggleExpand,\n onCollapse,\n registerToggle,\n onUpdateParam,\n onUpdateComment,\n onToggleNegate,\n onDuplicate,\n onRemove,\n onMove,\n disabled,\n}) => {\n const baseId = useId();\n const panelId = `${baseId}-panel`;\n const def = getDefinition(item.type);\n\n // Register the toggle button so the section can return focus to it (on Esc)\n // or to a sibling (after delete), per the APG accordion focus guidance.\n const toggleRef = useRef<HTMLButtonElement | null>(null);\n const itemId = item.id;\n useEffect(() => {\n registerToggle(itemId, toggleRef.current);\n return () => registerToggle(itemId, null);\n }, [itemId, registerToggle]);\n\n const itemDiagnostics = useMemo(\n () => (diagnostics ?? []).filter((d) => d.itemId === item.id),\n [diagnostics, item.id],\n );\n const severity = topSeverity(itemDiagnostics);\n\n // Unknown / unregistered types render read-only (\"preserved as written\").\n if (!def) {\n return (\n <li className=\"spytial-ed-row spytial-ed-row--unknown\">\n <div className=\"spytial-ed-row-main\">\n <span className=\"spytial-ed-badge spytial-ed-badge--unknown\">\n {item.kind === 'constraint' ? 'C' : 'D'}\n </span>\n <span className=\"spytial-ed-row-type\">{item.type}</span>\n <span className=\"spytial-ed-row-summary spytial-ed-row-summary--muted\">\n preserved as written\n </span>\n </div>\n </li>\n );\n }\n\n const summary = (() => {\n try {\n return def.summary(item.params);\n } catch {\n return '';\n }\n })();\n\n const negatable = NEGATABLE_TYPES.has(item.type);\n const negated = item.params.hold === 'never';\n\n return (\n <li\n className={`spytial-ed-row${expanded ? ' spytial-ed-row--expanded' : ''}${\n severity ? ` spytial-ed-row--${severity}` : ''\n }`}\n >\n <div className=\"spytial-ed-row-main\">\n <button\n ref={toggleRef}\n type=\"button\"\n className=\"spytial-ed-row-toggle\"\n aria-expanded={expanded}\n aria-controls={panelId}\n disabled={disabled}\n onClick={() => onToggleExpand(item.id)}\n >\n <span\n className={`spytial-ed-badge spytial-ed-badge--${item.kind}`}\n aria-hidden=\"true\"\n >\n {item.kind === 'constraint' ? 'C' : 'D'}\n </span>\n <span className=\"spytial-ed-row-type\">{def.label}</span>\n {negated ? (\n <span\n className=\"spytial-ed-row-negated\"\n role=\"img\"\n aria-label=\"should not hold\"\n title=\"should not hold (hold: never)\"\n >\n ¬\n </span>\n ) : null}\n <span className=\"spytial-ed-row-summary\">{summary}</span>\n {severity ? (\n <span\n className={`spytial-ed-row-dot spytial-ed-row-dot--${severity}`}\n role=\"img\"\n aria-label={`${severity}: ${itemDiagnostics.length} issue${\n itemDiagnostics.length === 1 ? '' : 's'\n }`}\n />\n ) : null}\n </button>\n\n <OverflowMenu\n item={item}\n index={index}\n count={count}\n disabled={disabled}\n onDuplicate={onDuplicate}\n onRemove={onRemove}\n onMove={onMove}\n onAddComment={() => onToggleExpand(item.id)}\n />\n </div>\n\n {expanded ? (\n <div\n className=\"spytial-ed-row-panel\"\n id={panelId}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n // Collapse and return focus to this row's toggle (APG accordion).\n onCollapse(item.id);\n toggleRef.current?.focus();\n }\n }}\n >\n <FieldRenderer\n fields={visibleFields(def.fields)}\n values={item.params}\n diagnostics={itemDiagnostics}\n options={options}\n disabled={disabled}\n onChange={(key, value) => onUpdateParam(item.id, key, value)}\n selectorProps={\n selectorProps\n ? (field) => selectorProps(item, field)\n : undefined\n }\n />\n\n {negatable ? (\n <div className=\"spytial-ed-field spytial-ed-field--hold\">\n <span\n className=\"spytial-ed-field-label\"\n id={`${baseId}-hold-label`}\n title=\"Whether this constraint must hold, or must NOT hold (hold: never), in the layout.\"\n >\n Condition\n </span>\n <div className=\"spytial-ed-field-control\">\n <div\n className=\"spytial-ed-pills\"\n role=\"radiogroup\"\n aria-labelledby={`${baseId}-hold-label`}\n >\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={!negated}\n className={`spytial-ed-pill${!negated ? ' spytial-ed-pill--active' : ''}`}\n disabled={disabled}\n onClick={() => onToggleNegate(item.id, false)}\n >\n Should hold\n </button>\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={negated}\n className={`spytial-ed-pill${negated ? ' spytial-ed-pill--active spytial-ed-pill--negated' : ''}`}\n disabled={disabled}\n onClick={() => onToggleNegate(item.id, true)}\n >\n Should not hold\n </button>\n </div>\n </div>\n </div>\n ) : null}\n\n <div className=\"spytial-ed-field spytial-ed-field--text\">\n <label\n className=\"spytial-ed-field-label\"\n htmlFor={`${baseId}-comment`}\n >\n Comment\n </label>\n <div className=\"spytial-ed-field-control\">\n <input\n id={`${baseId}-comment`}\n type=\"text\"\n className=\"spytial-ed-input\"\n value={item.comment ?? ''}\n placeholder=\"Optional note (round-trips as a YAML comment)\"\n disabled={disabled}\n onChange={(e) => onUpdateComment(item.id, e.target.value)}\n />\n </div>\n </div>\n </div>\n ) : null}\n </li>\n );\n};\n\n// ---- overflow menu -------------------------------------------------------\n\ninterface OverflowMenuProps {\n item: SpecItem;\n index: number;\n count: number;\n disabled: boolean;\n onDuplicate(id: string): void;\n onRemove(id: string): void;\n onMove(id: string, direction: -1 | 1): void;\n onAddComment(): void;\n}\n\nconst OverflowMenu: React.FC<OverflowMenuProps> = ({\n item,\n index,\n count,\n disabled,\n onDuplicate,\n onRemove,\n onMove,\n onAddComment,\n}) => {\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement | null>(null);\n const btnRef = useRef<HTMLButtonElement | null>(null);\n // Fixed positioning so host containers with overflow clipping (demo\n // sidebars) can't cut the menu off; flips above the button when cramped.\n const menuStyle = useAnchoredPopup(open, btnRef, {\n align: 'end',\n estimatedHeight: 220,\n });\n const label = getDefinition(item.type)?.label ?? item.type;\n\n useEffect(() => {\n if (!open) return;\n const onDocMouseDown = (e: MouseEvent): void => {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onDocMouseDown);\n return () => document.removeEventListener('mousedown', onDocMouseDown);\n }, [open]);\n\n const close = useCallback(() => setOpen(false), []);\n\n const run = useCallback(\n (fn: () => void) => {\n fn();\n close();\n },\n [close],\n );\n\n return (\n <div className=\"spytial-ed-overflow\" ref={wrapRef}>\n <button\n ref={btnRef}\n type=\"button\"\n className=\"spytial-ed-overflow-btn\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={`Actions for ${label}`}\n disabled={disabled}\n onClick={() => setOpen((o) => !o)}\n >\n <span aria-hidden=\"true\">⋯</span>\n </button>\n\n {open ? (\n <ul\n className=\"spytial-ed-overflow-menu\"\n style={menuStyle}\n role=\"menu\"\n aria-label={`Actions for ${label}`}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n close();\n }\n }}\n >\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item\"\n onClick={() => run(onAddComment)}\n >\n Add comment\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item\"\n onClick={() => run(() => onDuplicate(item.id))}\n >\n Duplicate\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item\"\n disabled={index === 0}\n onClick={() => run(() => onMove(item.id, -1))}\n >\n Move up\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item\"\n disabled={index >= count - 1}\n onClick={() => run(() => onMove(item.id, 1))}\n >\n Move down\n </button>\n </li>\n <li role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-overflow-item spytial-ed-overflow-item--danger\"\n aria-label={`Remove ${label} ${item.kind}`}\n onClick={() => run(() => onRemove(item.id))}\n >\n Delete\n </button>\n </li>\n </ul>\n ) : null}\n </div>\n );\n};\n\n// ---- add menu (searchable) -----------------------------------------------\n\ninterface AddMenuProps {\n kind: ItemKind;\n onAdd(kind: ItemKind, type: string): void;\n disabled: boolean;\n /** ref to the trigger button, for post-delete focus fallback. */\n triggerRef?: React.Ref<HTMLButtonElement>;\n}\n\nconst AddMenu: React.FC<AddMenuProps> = ({ kind, onAdd, disabled, triggerRef }) => {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const wrapRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Local trigger ref for popup anchoring, merged with the external ref the\n // section uses for focus management.\n const btnRef = useRef<HTMLButtonElement | null>(null);\n const setTriggerRef = useCallback(\n (el: HTMLButtonElement | null): void => {\n btnRef.current = el;\n if (typeof triggerRef === 'function') {\n triggerRef(el);\n } else if (triggerRef && typeof triggerRef === 'object') {\n (triggerRef as React.MutableRefObject<HTMLButtonElement | null>).current = el;\n }\n },\n [triggerRef],\n );\n\n // Fixed positioning so the menu can't be clipped by host containers (the\n // original absolute menu rendered BELOW a short sidebar and was invisible).\n const menuStyle = useAnchoredPopup(open, btnRef, {\n align: 'end',\n estimatedHeight: 320,\n });\n\n // Deprecated types are hidden from the add menu (getDefinitions default).\n const defs = useMemo(() => getDefinitions(kind), [kind]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return defs;\n return defs.filter(\n (d) =>\n d.label.toLowerCase().includes(q) ||\n d.type.toLowerCase().includes(q) ||\n (d.description ?? '').toLowerCase().includes(q),\n );\n }, [defs, query]);\n\n useEffect(() => {\n if (!open) return;\n requestAnimationFrame(() => inputRef.current?.focus());\n const onDocMouseDown = (e: MouseEvent): void => {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onDocMouseDown);\n return () => document.removeEventListener('mousedown', onDocMouseDown);\n }, [open]);\n\n const close = useCallback(() => {\n setOpen(false);\n setQuery('');\n }, []);\n\n const choose = useCallback(\n (type: string) => {\n onAdd(kind, type);\n close();\n },\n [onAdd, kind, close],\n );\n\n const label = kind === 'constraint' ? 'Add constraint' : 'Add directive';\n\n return (\n <div className=\"spytial-ed-add\" ref={wrapRef}>\n <button\n ref={setTriggerRef}\n type=\"button\"\n className=\"spytial-ed-add-btn\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n disabled={disabled}\n onClick={() => setOpen((o) => !o)}\n >\n + {label}\n </button>\n\n {open ? (\n <div\n className=\"spytial-ed-add-menu\"\n style={menuStyle}\n role=\"menu\"\n aria-label={label}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n }\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n className=\"spytial-ed-add-search\"\n value={query}\n placeholder=\"Search types…\"\n aria-label={`Search ${kind} types`}\n onChange={(e) => setQuery(e.target.value)}\n />\n <ul className=\"spytial-ed-add-list\">\n {filtered.length === 0 ? (\n <li className=\"spytial-ed-add-empty\">No matching types.</li>\n ) : (\n filtered.map((d) => (\n <li key={d.type} role=\"none\">\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"spytial-ed-add-item\"\n onClick={() => choose(d.type)}\n >\n <span className=\"spytial-ed-add-item-label\">{d.label}</span>\n {d.description ? (\n <span className=\"spytial-ed-add-item-desc\">\n {d.description}\n </span>\n ) : null}\n </button>\n </li>\n ))\n )}\n </ul>\n </div>\n ) : null}\n </div>\n );\n};\n\n// ---- helpers -------------------------------------------------------------\n\n/** Hide the internal `hold` param from the form — surfaced as a Negate toggle. */\nfunction visibleFields(fields: readonly FieldSpec[]): FieldSpec[] {\n return fields.filter((f) => f.key !== 'hold');\n}\n\nfunction topSeverity(\n ds: readonly Diagnostic[],\n): Diagnostic['severity'] | undefined {\n if (ds.length === 0) return undefined;\n if (ds.some((d) => d.severity === 'error')) return 'error';\n if (ds.some((d) => d.severity === 'warning')) return 'warning';\n return 'info';\n}\n","/**\n * {@link SuggestionsPanel} — the read-only explanation of a\n * {@link LayoutAssistant} run.\n *\n * The suggestion itself has already been applied to the document by the time\n * this renders; the panel exists so the reasoning isn't thrown away. Each row\n * shows the suggester's rationale plus two optional generic chips (confidence,\n * outcome), and result-level `notes` follow the list. Nothing here is\n * interactive beyond dismissal — accepting or rejecting individual suggestions\n * would require the suggester to recompose the spec, which is host policy.\n */\n\nimport React from 'react';\nimport type {\n LayoutSuggestionDetail,\n LayoutSuggestionResult,\n} from '../domain/layout-assistant';\n\nexport interface SuggestionsPanelProps {\n result: LayoutSuggestionResult;\n onDismiss(): void;\n}\n\nexport const SuggestionsPanel: React.FC<SuggestionsPanelProps> = ({\n result,\n onDismiss,\n}) => {\n const suggestions = result.suggestions ?? [];\n const notes = result.notes ?? [];\n\n return (\n <div\n className=\"spytial-ed-suggestions\"\n role=\"region\"\n aria-label=\"Layout suggestions\"\n >\n <div className=\"spytial-ed-suggestions-head\">\n <span className=\"spytial-ed-suggestions-title\">\n {suggestions.length > 0\n ? `${suggestions.length} suggestion${suggestions.length === 1 ? '' : 's'}`\n : 'Suggestion applied'}\n </span>\n <button\n type=\"button\"\n className=\"spytial-ed-suggestions-dismiss\"\n aria-label=\"Dismiss suggestions\"\n title=\"Dismiss\"\n onClick={onDismiss}\n >\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n\n {suggestions.length > 0 ? (\n <ul className=\"spytial-ed-suggestions-list\">\n {suggestions.map((s) => (\n <SuggestionRow key={s.id} suggestion={s} />\n ))}\n </ul>\n ) : null}\n\n {notes.length > 0 ? (\n <ul className=\"spytial-ed-suggestions-notes\">\n {notes.map((note, i) => (\n // Notes are free-form host strings with no stable identity; index\n // keys are correct here because the list is replaced wholesale.\n <li key={i}>{note}</li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n};\n\nconst SuggestionRow: React.FC<{ suggestion: LayoutSuggestionDetail }> = ({\n suggestion,\n}) => {\n const { id, rationale, confidence, outcome } = suggestion;\n return (\n <li\n className={`spytial-ed-suggestion${\n outcome === 'omitted' ? ' spytial-ed-suggestion--omitted' : ''\n }`}\n >\n <div className=\"spytial-ed-suggestion-head\">\n {/* Ids are machine-facing (`orientation:synth-union:Node`), so the\n rationale leads and the id trails as a mono tag. With no rationale\n the id is all we have, so it becomes the label. */}\n <span className=\"spytial-ed-suggestion-text\">{rationale || id}</span>\n {confidence ? (\n <span\n className={`spytial-ed-suggestion-chip spytial-ed-suggestion-chip--${confidence}`}\n title={`${confidence} confidence`}\n >\n {confidence}\n </span>\n ) : null}\n {outcome ? (\n <span\n className={`spytial-ed-suggestion-chip spytial-ed-suggestion-chip--${outcome}`}\n title={`Outcome: ${outcome}`}\n >\n {outcome}\n </span>\n ) : null}\n </div>\n {rationale ? <code className=\"spytial-ed-suggestion-id\">{id}</code> : null}\n </li>\n );\n};\n","/**\n * {@link SpecEditor} — the public Spytial spec-editor component.\n *\n * Owns a single {@link SpecDocument} (the source of truth) and projects it into\n * two live views: the {@link BuilderView} (compact schema-driven rows) and the\n * {@link CodeView} (raw YAML). The view toggle is purely visual; no conversion\n * happens on toggle.\n *\n * Sync semantics (see `docs/SPEC_EDITOR_REDESIGN.md`):\n * - Builder mutations → document mutation → `toYaml()` → `onChange` synchronously.\n * - Code-view edits → `onChange(text)` immediately (controlled), plus a\n * debounced `replaceFromYaml`. On a `SpecParseError` the model is untouched,\n * the parse diagnostic is shown inline, and the builder toggle shows a \"text\n * has unapplied edits\" badge until the text parses again.\n * - External `value` changes (prop differs from both the last emitted text and\n * the current model YAML) replace the model, guarded by try/catch.\n *\n * Domain awareness: `domain` is `props.domain ?? extractDomainSchema(instance)`,\n * memoized. It flows to the field combo-box options, the built-in completion\n * source, `document.validate(domain)`, and the assistant context.\n *\n * Selector assistance: per (item, field) we compose built-in domain completions\n * with `assistant.complete()`; `assistant.synthesize` powers the ✨ affordance;\n * `assistant.review()` results are merged into the field diagnostics (debounced,\n * stale-dropped, failures swallowed).\n *\n * Layout assistance: `layoutAssistant.suggest` powers the toolbar's Suggest\n * button. The proposal is applied through `replaceFromYaml` + `emit`, so it is\n * one undo step, refreshes the builder in place, and re-validates — the same\n * path a code-view edit takes. Its rationale renders in the suggestions panel.\n */\n\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport './spec-editor.css';\nimport { SpecDocument, SpecParseError } from '../core/spec-document';\nimport type {\n Diagnostic,\n FieldSpec,\n ItemKind,\n SpecItem,\n} from '../core/types';\nimport { getDefinition } from '../core/registry';\nimport { extractDomainSchema } from '../domain/domain-schema';\nimport type { DomainSchema } from '../domain/domain-schema';\nimport {\n createBuiltinCompletionSource,\n mergeCompletions,\n} from '../domain/completions';\nimport type { Completion, SelectorAssistant, SelectorAssistContext } from '../domain/assistant';\nimport type {\n LayoutAssistant,\n LayoutAssistContext,\n LayoutSuggestionResult,\n} from '../domain/layout-assistant';\nimport type { IInputDataInstance } from '../../data-instance/interfaces';\nimport {\n SpecEditorThemeInput,\n resolveSpecEditorTheme,\n themeToCssVars,\n} from './theme';\nimport { BuilderView } from './BuilderView';\nimport { CodeView } from './CodeView';\nimport { SuggestionsPanel } from './SuggestionsPanel';\nimport { lintYaml } from '../core/code-positioning';\nimport type { SelectorFieldExtras } from './FieldRenderer';\n\nexport interface SpecEditorProps {\n /** controlled YAML value */\n value: string;\n onChange(value: string): void;\n /** domain awareness: pass either the live instance or a precomputed schema */\n instance?: IInputDataInstance;\n /** wins over instance if both given */\n domain?: DomainSchema;\n /**\n * Hooks. `theme` accepts either a token object or the NAME of a registered\n * theme (`'light'`, `'dark'`, or anything added via\n * `registerSpecEditorThemes`) — the same by-name convention as\n * `webcola-cnd-graph`'s `theme` attribute.\n */\n theme?: SpecEditorThemeInput;\n selectorAssistant?: SelectorAssistant;\n /**\n * Whole-spec suggestion hook. When it provides `suggest`, the toolbar grows a\n * Suggest button; otherwise nothing is rendered and the editor is unchanged.\n */\n layoutAssistant?: LayoutAssistant;\n /** appearance */\n density?: 'compact' | 'comfortable';\n /**\n * Syntax highlighting in the code view and selector fields (default true).\n * Both use a mirror-overlay technique (highlighted <pre> behind a\n * transparent-text textarea); this is the escape hatch if a host's fonts or\n * zoom ever misalign the overlay — flipping it off renders plain visible\n * text with no mirror.\n */\n syntaxHighlighting?: boolean;\n defaultView?: 'builder' | 'code';\n /**\n * Optional controlled view. When provided, the editor renders this view and\n * notifies `onViewChange` instead of owning view state internally. (Used by\n * the back-compat `CndLayoutInterface` wrapper to keep `isNoCodeView` working;\n * standalone consumers can ignore it and use `defaultView`.)\n */\n view?: 'builder' | 'code';\n onViewChange?(view: 'builder' | 'code'): void;\n className?: string;\n disabled?: boolean;\n 'aria-label'?: string;\n /** notified whenever validation state changes */\n onDiagnostics?(diagnostics: Diagnostic[]): void;\n}\n\nconst PARSE_DEBOUNCE_MS = 300;\nconst REVIEW_DEBOUNCE_MS = 400;\n\nexport const SpecEditor: React.FC<SpecEditorProps> = ({\n value,\n onChange,\n instance,\n domain: domainProp,\n theme,\n selectorAssistant,\n layoutAssistant,\n density = 'compact',\n syntaxHighlighting = true,\n defaultView = 'builder',\n view: controlledView,\n onViewChange,\n className,\n disabled = false,\n 'aria-label': ariaLabel = 'Layout specification editor',\n onDiagnostics,\n}) => {\n // ── Document (source of truth) ────────────────────────────────────────\n // Created once from the initial value; never recreated on re-render. If the\n // INITIAL value is unparseable we keep an empty document but carry the parse\n // diagnostic forward (PR review finding: silently rendering an empty builder\n // for a broken initial spec left the user with no explanation), seeding the\n // parseError state below so the diagnostic + \"unapplied edits\" badge show\n // from the first render.\n const initRef = useRef<{ doc: SpecDocument; error: Diagnostic | null } | null>(\n null,\n );\n if (initRef.current === null) {\n initRef.current = initDocFromYaml(value);\n }\n const doc = initRef.current.doc;\n\n // Bump to force re-render on any document change (builder/undo/redo/parse).\n const [, forceRender] = useReducer((n: number) => n + 1, 0);\n\n // Last YAML text we emitted via onChange, so external-change detection can\n // distinguish a prop echo from a genuine external edit.\n const lastEmitted = useRef<string>(value);\n\n // Generation token bumped by every model mutation (builder emit, external\n // replace). A debounced code-view parse captures the current value when\n // scheduled and aborts if a mutation has bumped it since — otherwise a stale\n // parse could clobber a newer builder edit (see Finding 2 in the redesign).\n const mutationSeq = useRef(0);\n\n const [internalView, setInternalView] = useState<'builder' | 'code'>(\n defaultView,\n );\n const view = controlledView ?? internalView;\n // Holds the debounced code-view parse timer and its payload; declared here\n // so a view toggle can flush a pending parse (defined fully where code-view\n // editing lives).\n const parseTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const pendingParse = useRef<{ text: string; seq: number } | null>(null);\n const flushParseRef = useRef<() => void>(() => {});\n const setView = useCallback(\n (next: 'builder' | 'code') => {\n // Apply (not discard) any pending debounced parse before switching views,\n // so a code edit made just before toggling is reflected in the builder.\n // The generation-token guard inside the flush still drops parses that a\n // newer builder/external mutation has superseded.\n flushParseRef.current();\n if (controlledView === undefined) {\n setInternalView(next);\n }\n onViewChange?.(next);\n },\n [controlledView, onViewChange],\n );\n // The parse diagnostic + \"unapplied edits\" state for the code view. Seeded\n // with the initial value's parse error, if any (see initRef above).\n const [parseError, setParseError] = useState<Diagnostic | null>(\n () => initRef.current?.error ?? null,\n );\n\n // ── Domain ─────────────────────────────────────────────────────────────\n const domain = useMemo<DomainSchema | undefined>(() => {\n if (domainProp) return domainProp;\n if (instance) return extractDomainSchema(instance);\n return undefined;\n }, [domainProp, instance]);\n\n const builtinComplete = useMemo(\n () => createBuiltinCompletionSource(domain),\n [domain],\n );\n\n const relationNames = useMemo(\n () => domain?.relations.map((r) => r.name) ?? [],\n [domain],\n );\n const typeNames = useMemo(\n () => domain?.types.map((t) => t.name) ?? [],\n [domain],\n );\n\n // ── Emit helper: regenerate YAML from the model and notify the host ──────\n const emit = useCallback(() => {\n const yaml = doc.toYaml();\n lastEmitted.current = yaml;\n // Invalidate any in-flight debounced code-view parse: this builder mutation\n // is now the latest edit, so a pending stale parse must not overwrite it.\n mutationSeq.current += 1;\n // A successful builder edit means the model and text now agree.\n setParseError(null);\n onChange(yaml);\n }, [doc, onChange]);\n\n // ── Assistant-review diagnostics (debounced, per item+field) ────────────\n const [reviewDiagnostics, setReviewDiagnostics] = useState<\n readonly Diagnostic[]\n >([]);\n const reviewSeq = useRef(0);\n const reviewTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // ── Combined diagnostics (structure + domain + assistant review) ─────────\n const structuralDomain = useMemo(\n () => doc.validate(domain),\n // Re-validate on every model change. `value` is included as a coarse model\n // change signal (each emit/parse threads through the controlled value), so\n // structural diagnostics refresh after builder edits and external changes.\n [doc, domain, value],\n );\n\n const allDiagnostics = useMemo(\n () => [...structuralDomain, ...reviewDiagnostics],\n [structuralDomain, reviewDiagnostics],\n );\n\n // Notify the host when validation state changes (string-keyed dedupe).\n const lastDiagKey = useRef<string>('');\n useEffect(() => {\n if (!onDiagnostics) return;\n const key = diagnosticsKey(allDiagnostics);\n if (key === lastDiagKey.current) return;\n lastDiagKey.current = key;\n onDiagnostics(allDiagnostics);\n }, [allDiagnostics, onDiagnostics]);\n\n // ── External value-change handling ───────────────────────────────────────\n // When the controlled prop diverges from both the last text we emitted and\n // the current model YAML, treat it as an external edit and replace the model.\n useEffect(() => {\n if (value === lastEmitted.current) return;\n let modelYaml: string;\n try {\n modelYaml = doc.toYaml();\n } catch {\n modelYaml = '';\n }\n if (value === modelYaml) {\n lastEmitted.current = value;\n return;\n }\n try {\n doc.replaceFromYaml(value);\n lastEmitted.current = value;\n // An external replace is also a model mutation — invalidate any pending\n // debounced code-view parse so it can't overwrite this newer state.\n mutationSeq.current += 1;\n setParseError(null);\n forceRender();\n } catch (err) {\n // Keep the model; surface the parse error in the code view.\n setParseError(toParseDiagnostic(err));\n }\n // `doc` is a stable ref; we intentionally key only on the controlled value.\n }, [value, doc]);\n\n // ── Subscribe to document changes (covers undo/redo + internal mutations) ─\n useEffect(() => {\n const unsub = doc.subscribe(() => forceRender());\n return unsub;\n }, [doc]);\n\n // ── Code-view editing (debounced parse) ─────────────────────────────────\n // Applies the pending code-view text to the model. Called by the debounce\n // timer and synchronously by `setView` so a toggle right after typing never\n // discards the edit. The generation check still aborts parses that a newer\n // builder/undo/external mutation has superseded (Finding 2).\n const flushParse = useCallback(() => {\n if (parseTimer.current) {\n clearTimeout(parseTimer.current);\n parseTimer.current = null;\n }\n const pending = pendingParse.current;\n pendingParse.current = null;\n if (!pending) return;\n if (mutationSeq.current !== pending.seq) return; // superseded\n try {\n doc.replaceFromYaml(pending.text);\n setParseError(null);\n forceRender();\n } catch (err) {\n // Model untouched; show the diagnostic + \"unapplied edits\" badge.\n setParseError(toParseDiagnostic(err));\n }\n }, [doc]);\n flushParseRef.current = flushParse;\n\n const handleCodeChange = useCallback(\n (text: string) => {\n if (disabled) return;\n lastEmitted.current = text;\n onChange(text); // controlled text updates immediately\n if (parseTimer.current) clearTimeout(parseTimer.current);\n // Capture the mutation generation at schedule time (checked in flush).\n pendingParse.current = { text, seq: mutationSeq.current };\n parseTimer.current = setTimeout(flushParse, PARSE_DEBOUNCE_MS);\n },\n [disabled, onChange, flushParse],\n );\n\n useEffect(\n () => () => {\n alive.current = false;\n if (parseTimer.current) clearTimeout(parseTimer.current);\n if (reviewTimer.current) clearTimeout(reviewTimer.current);\n },\n [],\n );\n\n // ── Layout assistance (whole-spec suggestion) ───────────────────────────\n const [suggestion, setSuggestion] = useState<{\n running: boolean;\n result: LayoutSuggestionResult | null;\n error: string | null;\n }>({ running: false, result: null, error: null });\n // Dropped-result guards: a superseded run (the user clicked Suggest again)\n // and an unmount both mean the resolved promise must not touch the document.\n const suggestSeq = useRef(0);\n const alive = useRef(true);\n\n const handleSuggest = useCallback(() => {\n const suggest = layoutAssistant?.suggest;\n if (!suggest || disabled) return;\n // Land any debounced code-view parse first, so the suggester sees the text\n // the user is looking at rather than the last-parsed model.\n flushParseRef.current();\n const seq = ++suggestSeq.current;\n setSuggestion({ running: true, result: null, error: null });\n const ctx: LayoutAssistContext = { domain, instance, currentYaml: value };\n Promise.resolve()\n .then(() => suggest(ctx))\n .then((result) => {\n if (seq !== suggestSeq.current || !alive.current) return;\n // Same path as a code-view edit: one undo step, builder refreshed in\n // place, re-validated. Throws on unparseable YAML WITHOUT mutating,\n // which the catch below turns into a panel error.\n doc.replaceFromYaml(result.yaml);\n emit();\n setSuggestion({ running: false, result, error: null });\n })\n .catch((err: unknown) => {\n if (seq !== suggestSeq.current || !alive.current) return;\n setSuggestion({\n running: false,\n result: null,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }, [layoutAssistant, disabled, domain, instance, value, doc, emit]);\n\n const dismissSuggestion = useCallback(() => {\n // Bump the token too: a run still in flight when the user dismisses should\n // not reopen the panel behind them.\n suggestSeq.current += 1;\n setSuggestion({ running: false, result: null, error: null });\n }, []);\n\n // ── Builder mutations ───────────────────────────────────────────────────\n const handleAddItem = useCallback(\n (kind: ItemKind, type: string) => {\n if (disabled) return undefined;\n const item = doc.addItem(kind, type);\n emit();\n // Returned so the builder can auto-expand the freshly added row.\n return item;\n },\n [disabled, doc, emit],\n );\n\n const handleUpdateParam = useCallback(\n (id: string, key: string, val: unknown) => {\n if (disabled) return;\n // Empty string clears a param so it round-trips out of the YAML.\n const patchValue = val === '' ? undefined : val;\n doc.updateItem(id, { params: { [key]: patchValue } });\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleUpdateComment = useCallback(\n (id: string, comment: string) => {\n if (disabled) return;\n doc.updateItem(id, { comment });\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleToggleNegate = useCallback(\n (id: string, negated: boolean) => {\n if (disabled) return;\n doc.updateItem(id, { params: { hold: negated ? 'never' : undefined } });\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleDuplicate = useCallback(\n (id: string) => {\n if (disabled) return;\n // Single document-level mutation = single undo step (the previous\n // addItem + updateItem + moveItem composition recorded three).\n const created = doc.duplicateItem(id);\n if (!created) return;\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleRemove = useCallback(\n (id: string) => {\n if (disabled) return;\n doc.removeItem(id);\n emit();\n },\n [disabled, doc, emit],\n );\n\n const handleMove = useCallback(\n (id: string, direction: -1 | 1) => {\n if (disabled) return;\n const state = doc.getState();\n const list = state.constraints.some((i) => i.id === id)\n ? state.constraints\n : state.directives;\n const index = list.findIndex((i) => i.id === id);\n if (index === -1) return;\n doc.moveItem(id, index + direction);\n emit();\n },\n [disabled, doc, emit],\n );\n\n // ── Undo / redo ──────────────────────────────────────────────────────────\n const handleUndo = useCallback(() => {\n if (disabled || !doc.canUndo()) return;\n doc.undo();\n emit();\n }, [disabled, doc, emit]);\n\n const handleRedo = useCallback(() => {\n if (disabled || !doc.canRedo()) return;\n doc.redo();\n emit();\n }, [disabled, doc, emit]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod || e.key.toLowerCase() !== 'z') return;\n e.preventDefault();\n if (e.shiftKey) {\n handleRedo();\n } else {\n handleUndo();\n }\n },\n [handleUndo, handleRedo],\n );\n\n // ── Selector wiring (per item + field) ──────────────────────────────────\n const selectorProps = useCallback(\n (item: SpecItem, field: FieldSpec): SelectorFieldExtras | undefined => {\n if (field.kind !== 'selector') return undefined;\n\n const ctxBase: Omit<SelectorAssistContext, 'currentValue'> = {\n itemKind: item.kind,\n itemType: item.type,\n fieldKey: field.key,\n domain,\n specYaml: lastEmitted.current,\n };\n\n const complete = (prefix: string): Completion[] | Promise<Completion[]> => {\n const builtinResults = builtinComplete(prefix);\n const assistantComplete = selectorAssistant?.complete;\n if (!assistantComplete) {\n return builtinResults;\n }\n const ctx: SelectorAssistContext = {\n ...ctxBase,\n currentValue: String(item.params[field.key] ?? ''),\n };\n let assistantOut: Completion[] | Promise<Completion[]>;\n try {\n assistantOut = assistantComplete(ctx, prefix) ?? [];\n } catch {\n return builtinResults;\n }\n return Promise.resolve(assistantOut)\n .then((res) => mergeCompletions(res ?? [], builtinResults))\n .catch(() => builtinResults);\n };\n\n const extras: SelectorFieldExtras = {\n complete,\n highlight: syntaxHighlighting,\n };\n\n if (selectorAssistant?.synthesize) {\n const synthFn = selectorAssistant.synthesize;\n extras.synthesize = (request: string) => {\n const ctx: SelectorAssistContext = {\n ...ctxBase,\n currentValue: String(item.params[field.key] ?? ''),\n };\n return synthFn(ctx, request);\n };\n }\n\n return extras;\n },\n [domain, builtinComplete, selectorAssistant, syntaxHighlighting],\n );\n\n // ── Assistant review (debounced over the whole model) ───────────────────\n useEffect(() => {\n const review = selectorAssistant?.review;\n if (!review) {\n setReviewDiagnostics([]);\n return;\n }\n if (reviewTimer.current) clearTimeout(reviewTimer.current);\n const seq = ++reviewSeq.current;\n reviewTimer.current = setTimeout(() => {\n const state = doc.getState();\n const items = [...state.constraints, ...state.directives];\n const tasks: Array<Promise<Diagnostic[]>> = [];\n for (const item of items) {\n const def = getDefinition(item.type);\n if (!def) continue;\n for (const field of def.fields) {\n if (field.kind !== 'selector') continue;\n const current = String(item.params[field.key] ?? '');\n if (current.trim() === '') continue;\n const ctx: SelectorAssistContext = {\n itemKind: item.kind,\n itemType: item.type,\n fieldKey: field.key,\n currentValue: current,\n domain,\n specYaml: lastEmitted.current,\n };\n tasks.push(\n Promise.resolve()\n .then(() => review(ctx, current))\n .then((ds) =>\n (ds ?? []).map((d) => ({\n ...d,\n itemId: item.id,\n fieldKey: field.key,\n source: 'assistant' as const,\n })),\n )\n .catch(() => [] as Diagnostic[]),\n );\n }\n }\n Promise.all(tasks)\n .then((groups) => {\n if (seq !== reviewSeq.current) return; // stale\n setReviewDiagnostics(groups.flat());\n })\n .catch(() => {\n if (seq !== reviewSeq.current) return;\n setReviewDiagnostics([]);\n });\n }, REVIEW_DEBOUNCE_MS);\n // Re-review when the assistant/domain change or the model changes (`value`\n // is the coarse model-change signal). `doc` is a stable ref.\n }, [selectorAssistant, domain, value, doc]);\n\n // ── Render ───────────────────────────────────────────────────────────────\n const state = doc.getState();\n const hasUnappliedEdits = parseError !== null;\n const rootClass = [\n 'spytial-ed',\n density === 'compact' ? 'spytial-ed--compact' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Lint the code-view text itself — parse + validate + position all from the\n // same `value`, so diagnostics' item ids match the state used to place them.\n // (Deliberately independent of the debounced model, whose ids drift on each\n // re-parse and whose text may lag during unapplied edits.)\n const codeDiagnostics = useMemo(() => lintYaml(value, domain), [value, domain]);\n\n const resolvedTheme = resolveSpecEditorTheme(theme);\n\n return (\n <section\n className={rootClass}\n style={resolvedTheme ? themeToCssVars(resolvedTheme) : undefined}\n aria-label={ariaLabel}\n onKeyDown={handleKeyDown}\n >\n <div className=\"spytial-ed-toolbar\">\n <div\n className=\"spytial-ed-viewtoggle\"\n role=\"tablist\"\n aria-label=\"Editor view\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={view === 'builder'}\n className={`spytial-ed-viewtoggle-btn${\n view === 'builder' ? ' spytial-ed-viewtoggle-btn--active' : ''\n }`}\n disabled={disabled}\n onClick={() => setView('builder')}\n >\n Builder\n {hasUnappliedEdits ? (\n <span\n className=\"spytial-ed-diagnostic-badge spytial-ed-diagnostic-badge--warning\"\n title=\"Text has unapplied edits\"\n aria-label=\"Text has unapplied edits\"\n >\n !\n </span>\n ) : null}\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={view === 'code'}\n className={`spytial-ed-viewtoggle-btn${\n view === 'code' ? ' spytial-ed-viewtoggle-btn--active' : ''\n }`}\n disabled={disabled}\n onClick={() => setView('code')}\n >\n Code\n </button>\n </div>\n\n <div className=\"spytial-ed-toolbar-actions\">\n {layoutAssistant?.suggest ? (\n <button\n type=\"button\"\n className=\"spytial-ed-suggest-btn\"\n title=\"Suggest a layout for the current data\"\n disabled={disabled || suggestion.running}\n aria-busy={suggestion.running}\n onClick={handleSuggest}\n >\n <span aria-hidden=\"true\">✦</span>\n {suggestion.running ? 'Analyzing…' : 'Suggest'}\n </button>\n ) : null}\n\n <div className=\"spytial-ed-history\">\n <button\n type=\"button\"\n className=\"spytial-ed-history-btn\"\n aria-label=\"Undo\"\n title=\"Undo (Cmd/Ctrl+Z)\"\n disabled={disabled || !doc.canUndo()}\n onClick={handleUndo}\n >\n <span aria-hidden=\"true\">↶</span>\n </button>\n <button\n type=\"button\"\n className=\"spytial-ed-history-btn\"\n aria-label=\"Redo\"\n title=\"Redo (Shift+Cmd/Ctrl+Z)\"\n disabled={disabled || !doc.canRedo()}\n onClick={handleRedo}\n >\n <span aria-hidden=\"true\">↷</span>\n </button>\n </div>\n </div>\n </div>\n\n {suggestion.error !== null ? (\n <p className=\"spytial-ed-suggest-error\" role=\"alert\">\n {suggestion.error}\n </p>\n ) : null}\n\n {suggestion.result !== null ? (\n <SuggestionsPanel\n result={suggestion.result}\n onDismiss={dismissSuggestion}\n />\n ) : null}\n\n <div className=\"spytial-ed-body\">\n {view === 'builder' ? (\n <BuilderView\n constraints={state.constraints}\n directives={state.directives}\n diagnostics={allDiagnostics}\n options={{ relationNames, typeNames }}\n selectorProps={selectorProps}\n onAddItem={handleAddItem}\n onUpdateParam={handleUpdateParam}\n onUpdateComment={handleUpdateComment}\n onToggleNegate={handleToggleNegate}\n onDuplicate={handleDuplicate}\n onRemove={handleRemove}\n onMove={handleMove}\n disabled={disabled}\n />\n ) : (\n <CodeView\n value={value}\n onChange={handleCodeChange}\n diagnostics={codeDiagnostics}\n hasUnappliedEdits={hasUnappliedEdits}\n syntaxHighlighting={syntaxHighlighting}\n disabled={disabled}\n />\n )}\n </div>\n </section>\n );\n};\n\n// ---- helpers --------------------------------------------------------------\n\n/**\n * Build a document from YAML. On parse error, falls back to an empty document\n * but RETURNS the diagnostic so the editor can surface it from first render\n * instead of silently showing an empty builder.\n */\nfunction initDocFromYaml(yaml: string): {\n doc: SpecDocument;\n error: Diagnostic | null;\n} {\n try {\n return { doc: SpecDocument.fromYaml(yaml), error: null };\n } catch (err) {\n return { doc: new SpecDocument(), error: toParseDiagnostic(err) };\n }\n}\n\n/** Turn an unknown thrown value into a YAML parse diagnostic. */\nfunction toParseDiagnostic(err: unknown): Diagnostic {\n if (err instanceof SpecParseError) {\n return {\n severity: 'error',\n message: err.message,\n source: 'yaml',\n ...(err.line !== undefined ? { line: err.line } : {}),\n ...(err.column !== undefined ? { column: err.column } : {}),\n };\n }\n return {\n severity: 'error',\n message: err instanceof Error ? err.message : String(err),\n source: 'yaml',\n };\n}\n\n/** Stable key for a diagnostics array, for change detection. */\nfunction diagnosticsKey(ds: readonly Diagnostic[]): string {\n return ds\n .map(\n (d) =>\n `${d.severity}|${d.source}|${d.itemId ?? ''}|${d.fieldKey ?? ''}|${\n d.line ?? ''\n }|${d.column ?? ''}|${d.message}`,\n )\n .join('\\n');\n}\n","/**\n * Back-compat shims for the legacy `NoCodeView` data API.\n *\n * The old Structured Builder (the 27 hand-built selector components, the\n * `NoCodeView`/`CodeView` React surfaces, the `ConstraintCard`/`DirectiveCard`\n * widgets, the selector hooks and CSS) has been replaced by the schema-driven\n * Spytial spec editor in `src/spec-editor/`. The functions below preserve the\n * legacy import surface so existing callers keep compiling, by re-expressing\n * each one on top of the new core:\n *\n * - `parseLayoutSpecToData(yaml)` → `parseYamlToState` mapped to the legacy\n * `{ id, type, params, comment }` `ConstraintData`/`DirectiveData` shapes.\n * - `generateLayoutSpecYaml(c, d)` → the legacy data shapes mapped back to\n * `SpecItem[]` and serialized via `serializeStateToYaml`.\n * - `validateYaml` / `validateSpytialSpec` → unchanged behaviour (js-yaml\n * syntax check + structural key/type warnings + a final `parseLayoutSpec`).\n * - `highlightSelector` → the legacy pure HTML-highlighting helper, kept\n * verbatim (it has no UI dependency and retains its own test coverage).\n *\n * Document state is owned by the new `SpecEditor`; these shims are convenience\n * adapters for callers that have not migrated yet.\n */\n\nimport jsyaml from 'js-yaml';\nimport { parseLayoutSpec } from '../../layout/layoutspec';\nimport {\n parseYamlToState,\n serializeStateToYaml,\n newId,\n isKnownType,\n getKnownYamlKeys,\n} from '../../spec-editor';\nimport type { SpecItem, SpecDocumentState } from '../../spec-editor';\nimport type { ConstraintData, DirectiveData } from './interfaces';\nimport type { ConstraintType, DirectiveType } from './types';\n\n// ---- parse: YAML → legacy data shapes ------------------------------------\n\n/** Map a core `SpecItem` to the legacy flat data shape. */\nfunction itemToData<T extends ConstraintData | DirectiveData>(item: SpecItem): T {\n return {\n id: item.id,\n type: item.type as ConstraintType & DirectiveType,\n params: { ...item.params },\n ...(item.comment !== undefined ? { comment: item.comment } : {}),\n } as T;\n}\n\n/**\n * Parse a CnD layout spec YAML string into the legacy structured data shapes.\n *\n * Backed by the new codec (`parseYamlToState`), which preserves comments and\n * unknown nodes. Items keep the section the YAML places them in (the old\n * directive→constraint migration for `hideAtom`/`size` is no longer applied;\n * the spec editor renders those wherever they appear).\n *\n * @param yamlString - the YAML spec to parse\n * @returns the constraints and directives as legacy data objects\n * @public\n */\nexport function parseLayoutSpecToData(yamlString: string): {\n constraints: ConstraintData[];\n directives: DirectiveData[];\n} {\n const state = parseYamlToState(yamlString);\n return {\n constraints: state.constraints.map((i) => itemToData<ConstraintData>(i)),\n directives: state.directives.map((i) => itemToData<DirectiveData>(i)),\n };\n}\n\n// ---- serialize: legacy data shapes → YAML --------------------------------\n\n/** Map a legacy data object back to a core `SpecItem`. */\nfunction dataToItem(\n data: ConstraintData | DirectiveData,\n kind: SpecItem['kind'],\n): SpecItem {\n const item: SpecItem = {\n id: data.id || newId(),\n kind,\n type: data.type,\n params: { ...(data.params ?? {}) },\n };\n if (data.comment !== undefined) {\n item.comment = data.comment;\n }\n // Unknown types (not in the registry) carry their raw node so the codec\n // re-emits them verbatim under their own key.\n if (!isKnownType(data.type)) {\n item.raw = { [data.type]: { ...(data.params ?? {}) } };\n }\n return item;\n}\n\n/**\n * Generate a CnD layout spec YAML string from the legacy structured data\n * shapes. Backed by the new codec's `serializeStateToYaml`, so comments\n * round-trip and grouping types emit under the shared `group:` key.\n *\n * @param constraints - constraint data objects\n * @param directives - directive data objects\n * @returns the YAML spec\n * @public\n */\nexport function generateLayoutSpecYaml(\n constraints: ConstraintData[],\n directives: DirectiveData[],\n): string {\n const state: SpecDocumentState = {\n constraints: (constraints ?? []).map((c) => dataToItem(c, 'constraint')),\n directives: (directives ?? []).map((d) => dataToItem(d, 'directive')),\n };\n return serializeStateToYaml(state);\n}\n\n// ---- validation (unchanged behaviour) ------------------------------------\n\n/**\n * Validate YAML syntax. Returns an error message (with line/column when\n * available) if invalid, or `null` if the YAML parses.\n *\n * @param yamlString - YAML to validate\n * @public\n */\nexport function validateYaml(yamlString: string): string | null {\n if (!yamlString || !yamlString.trim()) {\n return null; // empty is valid\n }\n try {\n jsyaml.load(yamlString);\n return null;\n } catch (error) {\n if (error instanceof jsyaml.YAMLException) {\n const line = error.mark?.line !== undefined ? error.mark.line + 1 : undefined;\n const column =\n error.mark?.column !== undefined ? error.mark.column + 1 : undefined;\n const position = line && column ? ` (line ${line}, column ${column})` : '';\n return `YAML syntax error${position}: ${error.reason || error.message}`;\n }\n return `Invalid YAML: ${(error as Error).message}`;\n }\n}\n\n/** Result of Spytial spec validation. */\nexport interface SpytialValidationResult {\n /** whether the spec is valid */\n isValid: boolean;\n /** error message if the spec has errors (will prevent parsing) */\n error: string | null;\n /** warning messages for unrecognized elements (won't prevent parsing) */\n warnings: string[];\n}\n\n/**\n * Recognized constraint/directive keys are derived from the registry\n * (`getKnownYamlKeys`) rather than hand-listed here, so this check can't drift\n * as the registry grows — the reason a stale list previously false-warned on\n * the current `atomStyle`/`edgeStyle` directives. The check stays section-aware:\n * a known key in the wrong section (e.g. `edgeStyle` under `constraints`) is\n * still flagged, because `parseLayoutSpec` drops it there.\n */\n\n/** Keys valid in the `constraints:` section. */\nconst CONSTRAINT_SECTION_KEYS = getKnownYamlKeys('constraint');\n/**\n * Keys valid in the `directives:` section. `size`/`hideAtom` are registered as\n * constraints but the engine also reads them among directives, so they are\n * valid in both sections.\n */\nconst DIRECTIVE_SECTION_KEYS = [...getKnownYamlKeys('directive'), 'size', 'hideAtom'];\n\n/** Known top-level keys in a Spytial spec. */\nconst KNOWN_TOP_LEVEL_KEYS = ['constraints', 'directives'];\n\n/**\n * Validate a Spytial spec YAML string and return detailed results: YAML syntax\n * is checked first, then unrecognized top-level keys and constraint/directive\n * types are flagged as warnings, then the spec is parsed with the authoritative\n * `parseLayoutSpec` to surface structural errors.\n *\n * @param yamlString - YAML to validate\n * @public\n */\nexport function validateSpytialSpec(yamlString: string): SpytialValidationResult {\n const result: SpytialValidationResult = {\n isValid: true,\n error: null,\n warnings: [],\n };\n\n if (!yamlString || !yamlString.trim()) {\n return result; // empty is valid\n }\n\n let parsed: unknown;\n try {\n parsed = jsyaml.load(yamlString);\n } catch (error) {\n if (error instanceof jsyaml.YAMLException) {\n const line = error.mark?.line !== undefined ? error.mark.line + 1 : undefined;\n const column =\n error.mark?.column !== undefined ? error.mark.column + 1 : undefined;\n const position = line && column ? ` (line ${line}, column ${column})` : '';\n result.isValid = false;\n result.error = `YAML syntax error${position}: ${error.reason || error.message}`;\n } else {\n result.isValid = false;\n result.error = `Invalid YAML: ${(error as Error).message}`;\n }\n return result;\n }\n\n if (parsed && typeof parsed === 'object') {\n const obj = parsed as Record<string, unknown>;\n for (const key of Object.keys(obj)) {\n if (!KNOWN_TOP_LEVEL_KEYS.includes(key)) {\n result.warnings.push(\n `Unrecognized top-level key: \"${key}\". Expected: ${KNOWN_TOP_LEVEL_KEYS.join(', ')}`,\n );\n }\n }\n\n if (Array.isArray(obj.constraints)) {\n obj.constraints.forEach((constraint, i) => {\n if (constraint && typeof constraint === 'object') {\n const constraintType = Object.keys(constraint as object)[0];\n if (constraintType && !CONSTRAINT_SECTION_KEYS.includes(constraintType)) {\n result.warnings.push(\n `Unrecognized constraint type at index ${i}: \"${constraintType}\". Known types: ${CONSTRAINT_SECTION_KEYS.join(', ')}`,\n );\n }\n }\n });\n }\n\n if (Array.isArray(obj.directives)) {\n obj.directives.forEach((directive, i) => {\n if (directive && typeof directive === 'object') {\n const directiveType = Object.keys(directive as object)[0];\n if (directiveType && !DIRECTIVE_SECTION_KEYS.includes(directiveType)) {\n result.warnings.push(\n `Unrecognized directive type at index ${i}: \"${directiveType}\". Known types: ${DIRECTIVE_SECTION_KEYS.join(', ')}`,\n );\n }\n }\n });\n }\n }\n\n try {\n parseLayoutSpec(yamlString);\n } catch (error) {\n result.isValid = false;\n result.error = `Spytial spec error: ${(error as Error).message}`;\n return result;\n }\n\n return result;\n}\n\n// ---- highlightSelector (legacy pure helper, kept verbatim) ----------------\n\n/**\n * Highlights selector syntax with Alloy-esque coloring, returning an HTML\n * string of `<span>`-wrapped tokens. Pure and dependency-free; retained for\n * tooltips/previews and its existing test coverage.\n *\n * Recognizes operators (`->`, `+`, `&`, `-`, `~`, `*`, `^`, `.`), wildcards\n * (`_`, `univ`, `none`, `iden`), parentheses/brackets, capitalized identifiers\n * (sigs/atoms), lowercase identifiers (fields) and numeric literals.\n *\n * @param selector - the selector string to highlight\n * @returns HTML string with span elements for syntax highlighting\n * @public\n */\nexport function highlightSelector(selector: string): string {\n if (!selector) return '';\n\n const tokenPattern =\n /(->|[+&~*^.-]|[()[\\]]|_\\b|univ\\b|none\\b|iden\\b|[A-Z][a-zA-Z0-9_]*|[a-z][a-zA-Z0-9_]*|[0-9]+|\\s+|.)/g;\n\n const tokens = Array.from(selector.matchAll(tokenPattern), (m) => m[0]);\n\n const highlighted = tokens.map((token) => {\n const escaped = token\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\n if (/^\\s+$/.test(token)) {\n return escaped;\n }\n if (token === '->' || token === '.') {\n return `<span class=\"selector-join\">${escaped}</span>`;\n }\n if (/^[+&\\-~*^]$/.test(token)) {\n return `<span class=\"selector-operator\">${escaped}</span>`;\n }\n if (/^[()[\\]]$/.test(token)) {\n return `<span class=\"selector-paren\">${escaped}</span>`;\n }\n if (/^(_|univ|none|iden)$/.test(token)) {\n return `<span class=\"selector-wildcard\">${escaped}</span>`;\n }\n if (/^[A-Z][a-zA-Z0-9_]*$/.test(token)) {\n return `<span class=\"selector-sig\">${escaped}</span>`;\n }\n if (/^[a-z][a-zA-Z0-9_]*$/.test(token)) {\n return `<span class=\"selector-field\">${escaped}</span>`;\n }\n if (/^[0-9]+$/.test(token)) {\n return `<span class=\"selector-number\">${escaped}</span>`;\n }\n return escaped;\n });\n\n return highlighted.join('');\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { SpecEditor } from '../spec-editor';\nimport type {\n SpecEditorProps,\n Diagnostic,\n DomainSchema,\n LayoutAssistant,\n SelectorAssistant,\n SpecEditorThemeInput,\n} from '../spec-editor';\nimport { parseLayoutSpecToData } from './NoCodeView/shims';\nimport type { ConstraintData, DirectiveData } from './NoCodeView/interfaces';\nimport type { IInputDataInstance } from '../data-instance/interfaces';\n\n/**\n * Props for the CND Layout Interface.\n *\n * `CndLayoutInterface` is now a thin back-compat wrapper over the schema-driven\n * {@link SpecEditor}. The legacy props (`yamlValue`, `isNoCodeView`,\n * `onViewChange`, and the `constraints`/`setConstraints`/`directives`/\n * `setDirectives` quartet) still work, but the document inside `SpecEditor` is\n * the source of truth — the constraint/directive callbacks are deprecated and\n * kept loosely in sync on a best-effort basis. New code should pass `value` +\n * `instance` (and any other {@link SpecEditorProps}) directly.\n *\n * @public\n */\nexport interface CndLayoutInterfaceProps {\n /** Current YAML value (legacy name for `value`). */\n yamlValue?: string;\n /** Current YAML value (alias for `yamlValue`; `value` wins if both given). */\n value?: string;\n /** Callback when the YAML value changes. */\n onChange: (value: string) => void;\n\n /** Whether to show the Structured Builder (true) vs Code view (false). */\n isNoCodeView?: boolean;\n /** Callback when the view mode changes. */\n onViewChange?: (isNoCodeView: boolean) => void;\n\n /**\n * @deprecated The document owns this state now. Kept loosely in sync via a\n * best-effort callback so legacy wrappers keep functioning.\n */\n constraints?: ConstraintData[];\n /** @deprecated see {@link CndLayoutInterfaceProps.constraints} */\n setConstraints?: (updater: (prev: ConstraintData[]) => ConstraintData[]) => void;\n /** @deprecated see {@link CndLayoutInterfaceProps.constraints} */\n directives?: DirectiveData[];\n /** @deprecated see {@link CndLayoutInterfaceProps.constraints} */\n setDirectives?: (updater: (prev: DirectiveData[]) => DirectiveData[]) => void;\n\n /** Domain awareness: the live data instance (extracts a schema). */\n instance?: IInputDataInstance;\n /** Domain awareness: a precomputed schema (wins over `instance`). */\n domain?: DomainSchema;\n /** Theme: token object or a registered theme name (e.g. 'dark'). */\n theme?: SpecEditorThemeInput;\n /** Selector-writing assistant hook. */\n selectorAssistant?: SelectorAssistant;\n /**\n * Whole-spec suggestion hook. Supplying `suggest` adds a Suggest button to\n * the editor toolbar; the proposal is applied to the document (one undo step)\n * and surfaced through `onChange` like any other edit.\n */\n layoutAssistant?: LayoutAssistant;\n /** Row density. */\n density?: 'compact' | 'comfortable';\n /** Syntax highlighting in code view + selector fields (default true). */\n syntaxHighlighting?: boolean;\n /** Notified whenever validation state changes. */\n onDiagnostics?: (diagnostics: Diagnostic[]) => void;\n\n /** Additional CSS class name. */\n className?: string;\n /** Whether the component is disabled. */\n disabled?: boolean;\n /** ARIA label for accessibility. */\n 'aria-label'?: string;\n}\n\n/**\n * CND Layout Interface — a thin back-compat wrapper over {@link SpecEditor}.\n *\n * Provides the historical prop surface (controlled `yamlValue`, an\n * `isNoCodeView` view toggle, and the deprecated constraint/directive\n * callbacks) while delegating all editing to the new spec editor. Builder and\n * Code views stay live and lossless; comments and unknown nodes round-trip.\n *\n * @example\n * ```tsx\n * <CndLayoutInterface\n * value={yamlValue}\n * onChange={setYamlValue}\n * instance={dataInstance}\n * />\n * ```\n *\n * @public\n */\nconst CndLayoutInterface: React.FC<CndLayoutInterfaceProps> = ({\n yamlValue,\n value,\n onChange,\n isNoCodeView,\n onViewChange,\n constraints,\n setConstraints,\n directives,\n setDirectives,\n instance,\n domain,\n theme,\n selectorAssistant,\n layoutAssistant,\n density,\n syntaxHighlighting,\n onDiagnostics,\n className,\n disabled = false,\n 'aria-label': ariaLabel = 'CND Layout Specification Interface',\n}) => {\n const currentValue = value ?? yamlValue ?? '';\n\n // Map the legacy boolean view flag to the SpecEditor view names. When\n // `isNoCodeView` is undefined the editor falls back to its own default view.\n const view: 'builder' | 'code' | undefined =\n isNoCodeView === undefined ? undefined : isNoCodeView ? 'builder' : 'code';\n\n const handleViewChange = useCallback(\n (next: 'builder' | 'code') => {\n onViewChange?.(next === 'builder');\n },\n [onViewChange],\n );\n\n /**\n * Keep the deprecated constraint/directive callbacks loosely in sync. The\n * document is the source of truth; on every YAML change we best-effort parse\n * it into the legacy data shapes and push them through the legacy setters so\n * old wrappers that read those arrays keep functioning.\n */\n const handleChange = useCallback(\n (nextYaml: string) => {\n onChange(nextYaml);\n if (setConstraints || setDirectives) {\n try {\n const parsed = parseLayoutSpecToData(nextYaml);\n setConstraints?.(() => parsed.constraints);\n setDirectives?.(() => parsed.directives);\n } catch {\n // Invalid intermediate YAML: leave the legacy arrays untouched.\n }\n }\n },\n [onChange, setConstraints, setDirectives],\n );\n\n const editorProps: SpecEditorProps = useMemo(() => {\n const props: SpecEditorProps = {\n value: currentValue,\n onChange: handleChange,\n defaultView: 'builder',\n disabled,\n 'aria-label': ariaLabel,\n };\n if (view !== undefined) {\n props.view = view;\n props.onViewChange = handleViewChange;\n }\n if (instance !== undefined) props.instance = instance;\n if (domain !== undefined) props.domain = domain;\n if (theme !== undefined) props.theme = theme;\n if (selectorAssistant !== undefined) props.selectorAssistant = selectorAssistant;\n if (layoutAssistant !== undefined) props.layoutAssistant = layoutAssistant;\n if (density !== undefined) props.density = density;\n if (syntaxHighlighting !== undefined)\n props.syntaxHighlighting = syntaxHighlighting;\n if (onDiagnostics !== undefined) props.onDiagnostics = onDiagnostics;\n if (className !== undefined) props.className = className;\n return props;\n }, [\n currentValue,\n handleChange,\n view,\n handleViewChange,\n instance,\n domain,\n theme,\n selectorAssistant,\n layoutAssistant,\n density,\n syntaxHighlighting,\n onDiagnostics,\n className,\n disabled,\n ariaLabel,\n ]);\n\n // `constraints`/`directives` are read-only deprecated inputs; referenced here\n // only to acknowledge them (the document owns the real state).\n void constraints;\n void directives;\n\n return <SpecEditor {...editorProps} />;\n};\n\n/**\n * Named export for tree-shaking (no default export), per spytial-core guidelines.\n */\nexport { CndLayoutInterface };\n","import React, { useState, useEffect } from 'react';\nimport { ReplInterface } from './ReplInterface';\nimport { CndLayoutInterface } from '../CndLayoutInterface';\nimport { IInputDataInstance } from '../../data-instance/interfaces';\n\nexport interface ReplWithVisualizationProps {\n /** Data instance to work with */\n instance: IInputDataInstance;\n /** Callback when instance changes */\n onChange?: (instance: IInputDataInstance) => void;\n /** Initial CND layout specification */\n initialCndSpec?: string;\n /** Whether to show the CND layout interface */\n showLayoutInterface?: boolean;\n /** Custom styling for the container */\n style?: React.CSSProperties;\n /** Height of the REPL interface (default: 300px) */\n replHeight?: string;\n /** Height of the visualization area (default: 400px) */\n visualizationHeight?: string;\n}\n\n/**\n * Combined REPL and Visualization Component\n * \n * This component provides an integrated solution that combines:\n * - ReplInterface for command-line style data entry\n * - CndLayoutInterface for layout specification\n * - Real-time visualization updates\n * \n * Perfect for demos, tutorials, and rapid prototyping.\n * \n * @example\n * ```tsx\n * import { ReplWithVisualization, JSONDataInstance } from 'spytial-core';\n * \n * const instance = new JSONDataInstance({ atoms: [], relations: [] });\n * \n * <ReplWithVisualization \n * instance={instance}\n * onChange={(updated) => console.log('Updated:', updated)}\n * showLayoutInterface={true}\n * />\n * ```\n */\nexport const ReplWithVisualization: React.FC<ReplWithVisualizationProps> = ({\n instance,\n onChange,\n initialCndSpec = '',\n showLayoutInterface = true,\n style,\n replHeight = '300px',\n visualizationHeight = '400px'\n}) => {\n const [currentInstance, setCurrentInstance] = useState(instance);\n const [cndSpec, setCndSpec] = useState(initialCndSpec);\n\n // Update internal state when instance prop changes\n useEffect(() => {\n setCurrentInstance(instance);\n }, [instance]);\n\n const handleInstanceChange = (updatedInstance: IInputDataInstance) => {\n setCurrentInstance(updatedInstance);\n onChange?.(updatedInstance);\n };\n\n const handleCndSpecChange = (newSpec: string) => {\n setCndSpec(newSpec);\n };\n\n const containerStyle: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n backgroundColor: '#f8f9fa',\n border: '1px solid #dee2e6',\n borderRadius: '8px',\n overflow: 'hidden',\n ...style\n };\n\n const sectionStyle: React.CSSProperties = {\n padding: '16px',\n borderBottom: '1px solid #dee2e6'\n };\n\n const headerStyle: React.CSSProperties = {\n margin: '0 0 12px 0',\n fontSize: '14px',\n fontWeight: 'bold',\n color: '#495057'\n };\n\n return (\n <div style={containerStyle}>\n {/* REPL Interface Section */}\n <div style={{ ...sectionStyle, height: replHeight, minHeight: '250px' }}>\n <h3 style={headerStyle}>Command Interface</h3>\n <div style={{ height: `calc(${replHeight} - 40px)` }}>\n <ReplInterface \n instance={currentInstance}\n onChange={handleInstanceChange}\n />\n </div>\n </div>\n\n {/* Layout Interface Section (Optional) */}\n {showLayoutInterface && (\n <div style={{ ...sectionStyle, height: '200px', minHeight: '150px' }}>\n <h3 style={headerStyle}>Layout Specification</h3>\n <div style={{ height: 'calc(200px - 40px)' }}>\n <CndLayoutInterface \n instance={currentInstance}\n value={cndSpec}\n onChange={handleCndSpecChange}\n />\n </div>\n </div>\n )}\n\n {/* Visualization Area */}\n <div style={{ \n ...sectionStyle, \n height: visualizationHeight,\n minHeight: '300px',\n borderBottom: 'none',\n flex: 1\n }}>\n <h3 style={headerStyle}>Visualization</h3>\n <div style={{ \n height: `calc(${visualizationHeight} - 40px)`,\n backgroundColor: 'white',\n border: '1px solid #ccc',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#6c757d'\n }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{ fontSize: '48px', marginBottom: '16px' }}>📊</div>\n <div>\n Visualization area ready for webcola-cnd-graph integration\n </div>\n <div style={{ marginTop: '8px', fontSize: '12px' }}>\n Current data: {currentInstance.getAtoms().length} atoms, {currentInstance.getRelations().length} relations\n </div>\n {cndSpec && (\n <div style={{ marginTop: '8px', fontSize: '12px', color: '#28a745' }}>\n CND spec: {cndSpec.length} characters\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default ReplWithVisualization;","import React from 'react';\nimport './ProjectionControls.css';\n\n/**\n * Data structure for a single projection choice\n */\nexport interface ProjectionChoice {\n /** The type being projected */\n type: string;\n /** The currently selected atom to project on */\n projectedAtom: string;\n /** All available atoms for this type */\n atoms: string[];\n}\n\n/**\n * Props for the ProjectionControls component\n */\nexport interface ProjectionControlsProps {\n /** Projection data from layout generation */\n projectionData: ProjectionChoice[];\n /** Callback when a projection selection changes */\n onProjectionChange: (type: string, atomId: string) => void;\n /** Additional CSS class name */\n className?: string;\n /** Whether the controls are disabled */\n disabled?: boolean;\n}\n\n/**\n * ProjectionControls component\n * \n * Displays dropdown selectors for each projected type in a Forge/Alloy instance.\n * Allows users to dynamically select which specific atom to project on for each\n * projected signature.\n * \n * This component is specifically designed for Forge/Alloy contexts where projection\n * is a common operation. It examines the projected types and creates interactive\n * selectors for them.\n * \n * @example\n * ```tsx\n * const projectionData = [\n * { type: 'State', projectedAtom: 'State0', atoms: ['State0', 'State1', 'State2'] },\n * { type: 'Process', projectedAtom: 'P1', atoms: ['P1', 'P2'] }\n * ];\n * \n * <ProjectionControls\n * projectionData={projectionData}\n * onProjectionChange={(type, atomId) => {\n * console.log(`Changed ${type} projection to ${atomId}`);\n * // Update projections and regenerate layout\n * }}\n * />\n * ```\n * \n * @public\n */\nexport const ProjectionControls: React.FC<ProjectionControlsProps> = ({\n projectionData,\n onProjectionChange,\n className = '',\n disabled = false\n}) => {\n // Don't render if there are no projections\n if (!projectionData || projectionData.length === 0) {\n return null;\n }\n\n return (\n <div \n className={`projection-controls ${className}`}\n role=\"region\"\n aria-label=\"Projection Controls\"\n >\n <div className=\"projection-controls__header\">\n <h3 className=\"projection-controls__title\">Projections</h3>\n <p className=\"projection-controls__description\">\n Select which atom to project for each type\n </p>\n </div>\n \n <div className=\"projection-controls__list\">\n {projectionData.map((projection) => (\n <div \n key={projection.type} \n className=\"projection-controls__item\"\n >\n <label \n htmlFor={`projection-${projection.type}`}\n className=\"projection-controls__label\"\n >\n {projection.type}\n </label>\n \n <select\n id={`projection-${projection.type}`}\n className=\"projection-controls__select\"\n value={projection.projectedAtom}\n onChange={(e) => onProjectionChange(projection.type, e.target.value)}\n disabled={disabled || projection.atoms.length === 0}\n aria-label={`Select atom to project for ${projection.type}`}\n >\n {projection.atoms.length === 0 ? (\n <option value=\"\">No atoms available</option>\n ) : (\n projection.atoms.map((atom) => (\n <option key={atom} value={atom}>\n {atom}\n </option>\n ))\n )}\n </select>\n </div>\n ))}\n </div>\n </div>\n );\n};\n","/**\n * Projection Transform Module\n * \n * Provides a standalone, pre-layout data instance transformation that applies\n * projections to an IDataInstance. Projections are a form of metaprogramming:\n * they rewrite the datum itself by removing projected atoms and collapsing\n * relation arities, producing a new IDataInstance that downstream consumers\n * (layout, export, analysis) can operate on naively.\n * \n * This module is intentionally decoupled from the layout engine. Projections\n * are a semantic transformation on the model, not a visual/constraint concern.\n * \n * @module projection-transform\n */\n\nimport { IDataInstance, IType } from './interfaces';\n\n/**\n * A projection specifying which type (sig) to project over,\n * and optionally how to order the atoms of that type.\n */\nexport interface Projection {\n /** The type/sig name to project over */\n sig: string;\n /** \n * Optional ordering specification for atoms of this type.\n * When provided with an evaluator via ProjectionTransformOptions,\n * atoms are topologically sorted according to the tuples returned\n * by evaluating this selector.\n */\n orderBy?: string;\n}\n\n/**\n * The result of selecting a specific atom for a projected type.\n * Used to populate projection UI controls (dropdowns).\n */\nexport interface ProjectionChoice {\n /** The projected type/sig name */\n type: string;\n /** The currently selected atom ID for this type */\n projectedAtom: string;\n /** All available atoms for this type, in display order */\n atoms: string[];\n}\n\n/**\n * Options for configuring projection transform behavior.\n */\nexport interface ProjectionTransformOptions {\n /**\n * Optional evaluator function for `orderBy` selectors.\n * When a Projection has an `orderBy` field, this function\n * is called with the selector string and should return an array of\n * [from, to] tuple pairs defining a partial order on atoms.\n * \n * If not provided, orderBy fields are ignored and atoms are\n * sorted lexicographically.\n */\n evaluateOrderBy?: (selector: string) => string[][];\n\n /**\n * Optional error handler for orderBy evaluation failures.\n * If not provided, errors are silently caught and atoms fall back\n * to lexicographic ordering.\n */\n onOrderByError?: (selector: string, error: unknown) => void;\n}\n\n/**\n * The result of applying a projection transform to a data instance.\n */\nexport interface ProjectionTransformResult {\n /** The transformed data instance with projections applied */\n instance: IDataInstance;\n /** The projection choices made, for populating UI controls */\n choices: ProjectionChoice[];\n}\n\n\n/**\n * Applies projections to a data instance, producing a new\n * IDataInstance with projected types/atoms removed and relation arities\n * reduced accordingly.\n * \n * This is the core pre-layout transformation step. It:\n * 1. Resolves which atoms belong to each projected sig (including subtypes)\n * 2. Orders atoms per sig (via orderBy or lexicographic fallback)\n * 3. Selects the active atom per sig (from user selections or defaults to first)\n * 4. Delegates to IDataInstance.applyProjections() for the actual data rewrite\n * \n * **Evaluation-order dependency:** The `evaluateOrderBy` callback is invoked\n * *before* `instance.applyProjections()` is called, so it evaluates against the\n * **original, un-projected** data instance. This is intentional — the ordering\n * relation (e.g., `next: Time → Time`) involves atoms of the projected type,\n * which are removed by projection. The caller must therefore initialise the\n * evaluator with the original instance, not the projected one:\n *\n * ```\n * evaluator.initialize({ sourceData: originalInstance }) // ← full data\n * applyProjectionTransform(originalInstance, ...) // ← orderBy runs here\n * layoutInstance.generateLayout(projectedInstance) // ← layout on projected\n * ```\n *\n * Layout selectors evaluated later (step 3) still work correctly: atom IDs\n * returned by the evaluator that no longer exist in the projected graph are\n * silently filtered out during node matching.\n *\n * @param instance - The source data instance to project\n * @param projections - The projections (which sigs to project over)\n * @param selections - User selections mapping type/sig name → chosen atom ID.\n * This object is mutated to fill in defaults for unset projections.\n * @param options - Optional configuration (orderBy evaluator, error handler)\n * @returns The projected data instance and the finalized projection choices\n * \n * @example\n * ```typescript\n * import { applyProjectionTransform } from 'spytial-core';\n * \n * const result = applyProjectionTransform(\n * dataInstance,\n * [{ sig: 'State', orderBy: 'next' }],\n * { State: 'State0' },\n * { evaluateOrderBy: (sel) => evaluator.evaluate(sel).selectedTwoples() }\n * );\n * \n * // result.instance is the projected IDataInstance\n * // result.choices has the dropdown metadata\n * ```\n */\nexport function applyProjectionTransform(\n instance: IDataInstance,\n projections: Projection[],\n selections: Record<string, string>,\n options: ProjectionTransformOptions = {}\n): ProjectionTransformResult {\n const projectedSigs = projections.map(d => d.sig);\n \n if (projectedSigs.length === 0) {\n return { instance, choices: [] };\n }\n\n const allTypes = instance.getTypes();\n\n // For each projected sig, collect atoms from all types that include\n // this sig in their type hierarchy (handles abstract sigs / subtypes)\n const atomsPerType: Record<string, string[]> = {};\n\n for (const projection of projections) {\n const sig = projection.sig;\n\n // Validate that the sig exists in the type hierarchy.\n // Check both `t.types` (which lists the full hierarchy, e.g. [\"Node\",\"univ\"])\n // and `t.id` (the type's own identifier) for a match.\n const sigExists = allTypes.some(t => t.id === sig || t.types.includes(sig));\n if (!sigExists) {\n throw new Error(`Projected type '${sig}' not found in data instance`);\n }\n\n // Find all types that include this sig (subtypes/descendants)\n const matchingTypes = allTypes.filter(t => t.id === sig || t.types.includes(sig));\n\n // Collect all atoms, deduplicating (parent sigs may include subsig atoms)\n const atomSet = new Set<string>();\n for (const type of matchingTypes) {\n for (const atom of type.atoms) {\n atomSet.add(atom.id);\n }\n }\n\n let atoms = [...atomSet];\n\n // Apply orderBy sorting if an evaluator is provided\n if (projection.orderBy && options.evaluateOrderBy) {\n try {\n const orderTuples = options.evaluateOrderBy(projection.orderBy);\n atoms = topologicalSortWithCycleBreaking(atoms, orderTuples);\n } catch (error) {\n if (options.onOrderByError) {\n options.onOrderByError(projection.orderBy, error);\n }\n // Fallback to lexicographic sort\n atoms.sort((a, b) => a.localeCompare(b));\n }\n } else {\n // Default: sort lexicographically by atom ID\n atoms.sort((a, b) => a.localeCompare(b));\n }\n\n atomsPerType[sig] = atoms;\n }\n\n // Select which atom to project for each sig\n const projectedAtomIds: string[] = [];\n\n for (const [typeId, atomIds] of Object.entries(atomsPerType)) {\n if (atomIds.length > 0) {\n if (selections[typeId]) {\n projectedAtomIds.push(selections[typeId]);\n } else {\n // Default to first atom; mutate selections so caller sees the default\n const defaultAtom = atomIds[0];\n selections[typeId] = defaultAtom;\n projectedAtomIds.push(defaultAtom);\n }\n }\n }\n\n // Build projection choices for UI consumption\n const choices: ProjectionChoice[] = Object.entries(selections)\n .filter(([typeId]) => projectedSigs.includes(typeId))\n .map(([typeId, atomId]) => ({\n type: typeId,\n projectedAtom: atomId,\n atoms: atomsPerType[typeId] || []\n }));\n\n // Apply the actual data transformation\n const projectedInstance = instance.applyProjections(projectedAtomIds);\n\n return { instance: projectedInstance, choices };\n}\n\n\n/**\n * Topological sort with cycle breaking via Kahn's algorithm.\n * \n * Given a set of atoms and a partial order defined by [from, to] tuples,\n * produces a total ordering that respects the partial order where possible.\n * Cycles are broken by preferring the lexicographically smallest node.\n * \n * @param atoms - The atoms to sort\n * @param tuples - Pairs [from, to] defining the partial order (from < to)\n * @returns Sorted array of atom IDs\n */\nexport function topologicalSortWithCycleBreaking(atoms: string[], tuples: string[][]): string[] {\n const atomSet = new Set(atoms);\n\n // Build adjacency list and in-degree count\n const adjacency = new Map<string, Set<string>>();\n const inDegree = new Map<string, number>();\n\n for (const atom of atoms) {\n adjacency.set(atom, new Set());\n inDegree.set(atom, 0);\n }\n\n for (const tuple of tuples) {\n if (tuple.length >= 2) {\n const from = tuple[0];\n const to = tuple[1];\n\n if (atomSet.has(from) && atomSet.has(to) && from !== to) {\n const neighbors = adjacency.get(from)!;\n if (!neighbors.has(to)) {\n neighbors.add(to);\n inDegree.set(to, (inDegree.get(to) || 0) + 1);\n }\n }\n }\n }\n\n // Kahn's algorithm with cycle breaking\n const result: string[] = [];\n const remaining = new Set(atoms);\n\n while (remaining.size > 0) {\n const ready: string[] = [];\n for (const atom of remaining) {\n if ((inDegree.get(atom) || 0) === 0) {\n ready.push(atom);\n }\n }\n\n if (ready.length === 0) {\n // Cycle detected — break by picking lexicographically smallest\n const sorted = [...remaining].sort((a, b) => a.localeCompare(b));\n ready.push(sorted[0]);\n }\n\n ready.sort((a, b) => a.localeCompare(b));\n\n const node = ready[0];\n result.push(node);\n remaining.delete(node);\n\n const neighbors = adjacency.get(node) || new Set();\n for (const neighbor of neighbors) {\n if (remaining.has(neighbor)) {\n inDegree.set(neighbor, (inDegree.get(neighbor) || 1) - 1);\n }\n }\n }\n\n return result;\n}\n","import React, { useState, useCallback, useEffect, useRef } from 'react';\nimport { ProjectionChoice } from './ProjectionControls';\nimport './ProjectionOrchestrator.css';\nimport {\n applyProjectionTransform,\n Projection,\n ProjectionTransformResult,\n} from '../../data-instance/projection-transform';\nimport { IDataInstance } from '../../data-instance/interfaces';\nimport IEvaluator from '../../evaluators/interfaces';\n\n/**\n * Result emitted by ProjectionOrchestrator whenever projections change.\n * Contains everything the caller needs to run layout on the projected data.\n */\nexport interface ProjectionOrchestratorResult {\n /** The projected data instance — pass this to `LayoutInstance.generateLayout()` */\n instance: IDataInstance;\n /** Projection choices for external consumption / serialisation */\n choices: ProjectionChoice[];\n}\n\n/**\n * Props for the ProjectionOrchestrator component.\n */\nexport interface ProjectionOrchestratorProps {\n /**\n * The **original, un-projected** data instance.\n * The orchestrator applies projection transforms to this instance.\n */\n instance: IDataInstance | null;\n\n /**\n * Optional evaluator, initialised against `instance`.\n * Required for `orderBy` support — if omitted, `orderBy` is ignored\n * and atoms fall back to lexicographic sorting.\n */\n evaluator?: IEvaluator | null;\n\n /**\n * Callback fired whenever the projected instance changes.\n * Called on instance change, projection add/remove, or atom selection change.\n * The caller should use `result.instance` for layout generation.\n */\n onProjectionChange: (result: ProjectionOrchestratorResult) => void;\n\n /** Additional CSS class name */\n className?: string;\n\n /** Whether the controls are disabled */\n disabled?: boolean;\n}\n\n/**\n * ProjectionOrchestrator\n *\n * A simplified, self-contained projection UI.\n *\n * **Step 1 — Add a projection:** Type any type/sig name (including built-in\n * types like `Int`) into the text box and press Enter or click Add.\n *\n * **Step 2 — Pick an atom:** Once a type is added, a dropdown appears listing\n * every atom of that type. Selecting a different atom re-projects the\n * instance and fires `onProjectionChange`.\n *\n * The component runs `applyProjectionTransform` internally and emits the\n * projected `IDataInstance` — the caller just passes it to `generateLayout()`.\n *\n * @public\n */\nexport const ProjectionOrchestrator: React.FC<ProjectionOrchestratorProps> = ({\n instance,\n evaluator,\n onProjectionChange,\n className = '',\n disabled = false,\n}) => {\n // ── State ──────────────────────────────────────────────────────────\n const [projections, setProjections] = useState<Projection[]>([]);\n const [selections, setSelections] = useState<Record<string, string>>({});\n const [choices, setChoices] = useState<ProjectionChoice[]>([]);\n const [inputValue, setInputValue] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n // Ref to avoid stale closures in the onProjectionChange callback.\n const onChangeRef = useRef(onProjectionChange);\n useEffect(() => {\n onChangeRef.current = onProjectionChange;\n }, [onProjectionChange]);\n\n // ── Core: run projection transform ─────────────────────────────────\n const runTransform = useCallback(\n (\n inst: IDataInstance | null,\n dirs: Projection[],\n sels: Record<string, string>,\n ): ProjectionTransformResult | null => {\n if (!inst || dirs.length === 0) {\n return null;\n }\n\n try {\n return applyProjectionTransform(inst, dirs, sels, {\n evaluateOrderBy: evaluator?.isReady()\n ? (sel) => evaluator.evaluate(sel).selectedTwoples()\n : undefined,\n onOrderByError: (sel, err) => {\n console.warn(`ProjectionOrchestrator: orderBy error for \"${sel}\":`, err);\n },\n });\n } catch (err) {\n console.error('ProjectionOrchestrator: projection transform failed:', err);\n return null;\n }\n },\n [evaluator],\n );\n\n // ── Effect: re-run projection when inputs change ───────────────────\n useEffect(() => {\n if (!instance) {\n setChoices([]);\n return;\n }\n\n if (projections.length === 0) {\n // No projections active — emit the original instance unchanged.\n setChoices([]);\n onChangeRef.current({ instance, choices: [] });\n return;\n }\n\n const selsCopy = { ...selections };\n const result = runTransform(instance, projections, selsCopy);\n if (result) {\n setChoices(result.choices);\n // Sync defaults that applyProjectionTransform may have filled in.\n setSelections(selsCopy);\n setError(null);\n onChangeRef.current({ instance: result.instance, choices: result.choices });\n } else {\n // Transform failed — fallback to un-projected\n setChoices([]);\n setError('Projection transform failed — showing un-projected data.');\n onChangeRef.current({ instance, choices: [] });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [instance, projections, JSON.stringify(selections), runTransform]);\n\n // ── Handlers ───────────────────────────────────────────────────────\n const handleAddProjection = useCallback(() => {\n const sig = inputValue.trim();\n if (!sig) return;\n\n // Prevent duplicates\n if (projections.some((p) => p.sig === sig)) {\n setError(`Already projecting over \"${sig}\".`);\n return;\n }\n\n setError(null);\n setProjections((prev) => [...prev, { sig }]);\n setInputValue('');\n }, [inputValue, projections]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddProjection();\n }\n },\n [handleAddProjection],\n );\n\n const handleRemoveProjection = useCallback((sig: string) => {\n setProjections((prev) => prev.filter((d) => d.sig !== sig));\n setSelections((prev) => {\n const next = { ...prev };\n delete next[sig];\n return next;\n });\n setError(null);\n }, []);\n\n const handleAtomChange = useCallback(\n (type: string, atomId: string) => {\n setSelections((prev) => ({ ...prev, [type]: atomId }));\n },\n [],\n );\n\n // ── Render ─────────────────────────────────────────────────────────\n if (!instance) return null;\n\n return (\n <div\n className={`projection-orchestrator ${className}`}\n role=\"region\"\n aria-label=\"Projection Orchestrator\"\n >\n {/* ── Add new projection (free-text) ─────────────── */}\n <div className=\"projection-orchestrator__add\">\n <label\n htmlFor=\"projection-orchestrator-add\"\n className=\"projection-controls__label\"\n >\n Project over:\n </label>\n <input\n id=\"projection-orchestrator-add\"\n className=\"projection-controls__input\"\n type=\"text\"\n placeholder=\"Type name (e.g. State, Node, Int)\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n autoComplete=\"off\"\n />\n <button\n type=\"button\"\n className=\"projection-orchestrator__add-btn\"\n onClick={handleAddProjection}\n disabled={disabled || !inputValue.trim()}\n >\n Add\n </button>\n </div>\n\n {/* ── Error banner ─────────────────────────────────── */}\n {error && (\n <div className=\"projection-orchestrator__error\" role=\"alert\">\n {error}\n </div>\n )}\n\n {/* ── Active projections ───────────────────────────── */}\n {projections.length > 0 && (\n <div className=\"projection-orchestrator__list\">\n {projections.map((d) => {\n const choice = choices.find((c) => c.type === d.sig);\n return (\n <div key={d.sig} className=\"projection-orchestrator__row\">\n {/* Type tag with remove button */}\n <span className=\"projection-orchestrator__tag\">\n {d.sig}\n <button\n type=\"button\"\n className=\"projection-orchestrator__remove-btn\"\n onClick={() => handleRemoveProjection(d.sig)}\n disabled={disabled}\n aria-label={`Remove projection on ${d.sig}`}\n >\n ×\n </button>\n </span>\n\n {/* Atom selector */}\n {choice && choice.atoms.length > 0 ? (\n <select\n className=\"projection-controls__select\"\n value={choice.projectedAtom}\n onChange={(e) => handleAtomChange(d.sig, e.target.value)}\n disabled={disabled}\n aria-label={`Select atom for ${d.sig}`}\n >\n {choice.atoms.map((atom) => (\n <option key={atom} value={atom}>\n {atom}\n </option>\n ))}\n </select>\n ) : choice ? (\n <span className=\"projection-orchestrator__no-atoms\">\n No atoms\n </span>\n ) : null}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react'\nimport { IEvaluator } from '../../evaluators'\nimport \"./EvaluatorRepl.css\"\n\ninterface EvaluatorReplProps {\n // IEvaluator instance\n evaluator: IEvaluator\n // Instance index for the evaluator\n instanceNumber: number\n}\n\ntype EvaluatorExecution = [string, string]\n\nexport const EvaluatorRepl: React.FC<EvaluatorReplProps> = ({ evaluator, instanceNumber }) => {\n const [textInput, setTextInput] = React.useState('');\n const [evaluatorOutput, setEvaluatorOutput] = React.useState<EvaluatorExecution[]>([]);\n\n React.useEffect(() => {\n // Clear input and output when evaluator or instance number changes\n setTextInput('');\n setEvaluatorOutput([]);\n }, [evaluator, instanceNumber]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n // Evaluate the input expression\n const output = evaluator.evaluate(textInput, { instanceIndex: instanceNumber });\n setEvaluatorOutput(prev => [[textInput, output.prettyPrint()], ...prev]);\n setTextInput(''); // Clear input after evaluation\n }\n }\n\n return (\n <div id=\"evaluator-repl-container\">\n <input \n className=\"code-input\"\n id=\"evaluator-input\" \n type=\"text\" \n placeholder=\"Enter expression to evaluate...\" \n value={textInput} \n onChange={(e) => setTextInput(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n <div id=\"repl-output\">\n {evaluatorOutput.map(([textInput, output], index) => (\n <React.Fragment key={index}>\n <p className=\"repl-output-line\">{`> ${textInput}`}</p>\n <p className=\"repl-output-line\">{output}</p>\n </React.Fragment>\n ))}\n </div>\n </div>\n )\n}","import React, { useEffect, useRef, useState } from 'react';\nimport './RelationHighlighter.css';\n\ninterface RelationHighlighterProps {\n /** ID of the webcola-cnd-graph HTML element */\n graphElementId: string;\n}\n\n// Type for the webcola-cnd-graph element with its public API\ninterface WebColaGraphElement extends HTMLElement {\n highlightRelation(relationName: string): boolean;\n clearHighlightRelation(relationName: string): boolean;\n getAllRelations(): string[];\n}\n\n// Type for the relations-available custom event\ninterface RelationsAvailableEvent extends CustomEvent {\n detail: {\n relations: string[];\n count: number;\n timestamp: number;\n graphId: string;\n };\n}\n\n/**\n * Component that provides an interactive list of relations for highlighting in a WebCola graph.\n * Listens to the graph's custom events and provides hover-based relation highlighting.\n */\nexport const RelationHighlighter: React.FC<RelationHighlighterProps> = ({ \n graphElementId \n}) => {\n // State for available relations and collapsible container\n const [relations, setRelations] = useState<string[]>([]);\n const [isCollapsed, setIsCollapsed] = useState(true);\n \n // Ref to the webcola-cnd-graph element\n const graphElementRef = useRef<WebColaGraphElement | null>(null);\n\n useEffect(() => {\n // Get reference to the webcola-cnd-graph element\n const element = document.getElementById(graphElementId) as WebColaGraphElement | null;\n graphElementRef.current = element;\n \n if (!graphElementRef.current) {\n console.warn(`RelationHighlighter: Element with id \"${graphElementId}\" not found`);\n return;\n }\n\n // Event handler for relations-available custom event\n const handleRelationsAvailable = (event: unknown) => {\n const customEvent = event as RelationsAvailableEvent;\n const { relations: availableRelations } = customEvent.detail;\n setRelations(availableRelations || []);\n };\n\n // Attach event listener\n graphElementRef.current.addEventListener('relations-available', handleRelationsAvailable);\n\n // Cleanup function to remove event listener\n return () => {\n if (graphElementRef.current) {\n graphElementRef.current.removeEventListener('relations-available', handleRelationsAvailable);\n }\n };\n }, [graphElementId]);\n\n /**\n * Handle mouse enter on relation item - only highlight if within content area\n * Prevents highlighting when hovering over scrollbars\n */\n const handleRelationHover = (event: React.MouseEvent<HTMLLIElement>, relationName: string) => {\n const currentTarget = event.currentTarget;\n const parentList = currentTarget.parentElement;\n \n if (!parentList) return;\n \n // Get mouse position relative to the parent list\n const rect = parentList.getBoundingClientRect();\n const mouseX = event.clientX - rect.left;\n const mouseY = event.clientY - rect.top;\n \n // Only highlight if mouse is within the scrollable content area\n // clientWidth/clientHeight exclude scrollbars\n if (mouseX >= 0 && mouseX <= parentList.clientWidth && \n mouseY >= 0 && mouseY <= parentList.clientHeight) {\n \n if (graphElementRef.current && typeof graphElementRef.current.highlightRelation === 'function') {\n graphElementRef.current.highlightRelation(relationName);\n }\n }\n };\n\n /**\n * Handle mouse leave on relation item - only clear if mouse leaves the entire list area\n * Prevents clearing when moving to scrollbars within the list\n */\n const handleRelationLeave = (relationName: string) => {\n // Clear highlighting when mouse truly leaves the list area\n if (graphElementRef.current && typeof graphElementRef.current.clearHighlightRelation === 'function') {\n graphElementRef.current.clearHighlightRelation(relationName);\n }\n };\n\n // Toggle collapsible container\n const toggleCollapsed = () => {\n setIsCollapsed(prev => !prev);\n };\n\n return (\n <div className=\"relation-highlighter\">\n {/* Collapsible header */}\n <div className=\"relation-highlighter-header\" onClick={toggleCollapsed}>\n <h3 className=\"relation-highlighter-title\">\n Relations ({relations.length})\n </h3>\n <button \n className={`collapse-toggle ${isCollapsed ? 'collapsed' : ''}`}\n aria-label={isCollapsed ? 'Expand relations' : 'Collapse relations'}\n >\n ▼\n </button>\n </div>\n\n {/* Collapsible content */}\n <div className={`relation-highlighter-content ${isCollapsed ? 'collapsed' : ''}`}>\n {relations.length === 0 ? (\n <p className=\"no-relations\">No relations available</p>\n ) : (\n <ul className=\"relation-list\">\n {relations.map((relation) => (\n <li \n key={relation}\n className=\"relation-item\"\n onMouseEnter={(event) => handleRelationHover(event, relation)}\n onMouseLeave={() => handleRelationLeave(relation)}\n >\n {relation}\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n};"]}
|