@isl-lang/repl 0.1.0 → 0.1.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/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/repl.ts","../src/session.ts","../src/history.ts","../src/completions.ts","../src/formatter.ts","../src/commands.ts","../src/cli.ts"],"sourcesContent":["// ============================================================================\r\n// ISL REPL - Core REPL Loop\r\n// ============================================================================\r\n\r\nimport * as readline from 'readline';\r\nimport { Session, Intent } from './session';\r\nimport { History } from './history';\r\nimport { CompletionProvider, createCompleter } from './completions';\r\nimport { formatIntent, formatError, formatSuccess, formatWarning, colors } from './formatter';\r\nimport {\r\n MetaCommand,\r\n ISLCommand,\r\n metaCommands,\r\n islCommands,\r\n findSimilarCommand,\r\n} from './commands';\r\n\r\nconst VERSION = '0.1.0';\r\nconst PROMPT = `${colors.cyan}isl>${colors.reset} `;\r\nconst CONTINUATION_PROMPT = `${colors.cyan}...>${colors.reset} `;\r\n\r\nexport interface REPLOptions {\r\n colors?: boolean;\r\n verbose?: boolean;\r\n historyFile?: string;\r\n}\r\n\r\n/**\r\n * ISL REPL - Interactive Read-Eval-Print Loop\r\n */\r\nexport class ISLREPL {\r\n private session: Session;\r\n private history: History;\r\n private completionProvider: CompletionProvider;\r\n private rl: readline.Interface | null = null;\r\n private buffer: string[] = [];\r\n private braceCount = 0;\r\n private options: REPLOptions;\r\n private running = false;\r\n\r\n constructor(options: REPLOptions = {}) {\r\n this.options = {\r\n colors: options.colors !== false,\r\n verbose: options.verbose ?? false,\r\n historyFile: options.historyFile,\r\n };\r\n \r\n this.session = new Session({ colors: this.options.colors });\r\n this.history = new History({\r\n historyFile: this.options.historyFile,\r\n });\r\n this.completionProvider = new CompletionProvider(this.session);\r\n }\r\n\r\n /**\r\n * Start the REPL\r\n */\r\n start(): void {\r\n if (this.running) return;\r\n this.running = true;\r\n\r\n // Load history\r\n this.history.load();\r\n\r\n // Create readline interface\r\n this.rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n prompt: PROMPT,\r\n completer: createCompleter(this.completionProvider),\r\n terminal: true,\r\n });\r\n\r\n // Print banner\r\n this.printBanner();\r\n this.rl.prompt();\r\n\r\n // Handle line input\r\n this.rl.on('line', (line: string) => {\r\n this.handleLine(line);\r\n if (this.rl && this.running) {\r\n this.rl.setPrompt(this.braceCount > 0 ? CONTINUATION_PROMPT : PROMPT);\r\n this.rl.prompt();\r\n }\r\n });\r\n\r\n // Handle close\r\n this.rl.on('close', () => {\r\n this.exit();\r\n });\r\n\r\n // Handle SIGINT (Ctrl+C)\r\n this.rl.on('SIGINT', () => {\r\n if (this.buffer.length > 0) {\r\n // Cancel multi-line input\r\n this.buffer = [];\r\n this.braceCount = 0;\r\n console.log('\\n' + formatWarning('Input cancelled'));\r\n this.rl!.setPrompt(PROMPT);\r\n this.rl!.prompt();\r\n } else {\r\n console.log('\\n' + formatWarning('Use .exit or :quit to exit'));\r\n this.rl!.prompt();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Print the welcome banner\r\n */\r\n private printBanner(): void {\r\n const banner = `\r\n${colors.cyan}╔═══════════════════════════════════════════════════════════════╗\r\n║ ║\r\n║ ██╗███████╗██╗ ██████╗ ███████╗██████╗ ██╗ ║\r\n║ ██║██╔════╝██║ ██╔══██╗██╔════╝██╔══██╗██║ ║\r\n║ ██║███████╗██║ ██████╔╝█████╗ ██████╔╝██║ ║\r\n║ ██║╚════██║██║ ██╔══██╗██╔══╝ ██╔═══╝ ██║ ║\r\n║ ██║███████║███████╗ ██║ ██║███████╗██║ ███████╗ ║\r\n║ ╚═╝╚══════╝╚══════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚══════╝ ║\r\n║ ║\r\n╚═══════════════════════════════════════════════════════════════╝${colors.reset}\r\n\r\n${colors.bold}ISL v${VERSION}${colors.reset} — Intent Specification Language\r\nType ${colors.cyan}.help${colors.reset} for commands, ${colors.cyan}.exit${colors.reset} to quit\r\n`;\r\n console.log(banner);\r\n }\r\n\r\n /**\r\n * Handle a line of input\r\n */\r\n private handleLine(line: string): void {\r\n const trimmed = line.trim();\r\n\r\n // Handle empty line\r\n if (!trimmed && this.buffer.length === 0) {\r\n return;\r\n }\r\n\r\n // Handle meta commands (. prefix) - only at start, not in multi-line\r\n if (trimmed.startsWith('.') && this.buffer.length === 0) {\r\n this.handleMetaCommand(trimmed);\r\n return;\r\n }\r\n\r\n // Handle ISL commands (: prefix) - only at start, not in multi-line\r\n if (trimmed.startsWith(':') && this.buffer.length === 0) {\r\n this.handleISLCommand(trimmed);\r\n return;\r\n }\r\n\r\n // Track braces for multi-line input\r\n this.braceCount += (line.match(/\\{/g) || []).length;\r\n this.braceCount -= (line.match(/\\}/g) || []).length;\r\n this.buffer.push(line);\r\n\r\n // Execute when braces are balanced\r\n if (this.braceCount <= 0) {\r\n const code = this.buffer.join('\\n');\r\n this.buffer = [];\r\n this.braceCount = 0;\r\n\r\n // Add to history\r\n this.history.add(code);\r\n this.session.addToHistory(code);\r\n\r\n // Evaluate the code\r\n this.evaluate(code);\r\n }\r\n }\r\n\r\n /**\r\n * Handle a meta command (. prefix)\r\n */\r\n private handleMetaCommand(input: string): void {\r\n const parts = input.slice(1).split(/\\s+/);\r\n const cmdName = parts[0]?.toLowerCase() || '';\r\n const args = parts.slice(1);\r\n\r\n // Find the command\r\n const command = metaCommands.find(\r\n c => c.name === cmdName || c.aliases.includes(cmdName)\r\n );\r\n\r\n if (command) {\r\n this.history.add(input);\r\n const result = command.handler(args, this.session, this);\r\n if (result.output) {\r\n console.log(result.output);\r\n }\r\n if (result.exit) {\r\n this.exit();\r\n }\r\n } else {\r\n // Try to suggest similar command\r\n const suggestion = findSimilarCommand(cmdName, 'meta');\r\n if (suggestion) {\r\n console.log(formatError(`Unknown command: .${cmdName}`));\r\n console.log(formatWarning(`Did you mean: .${suggestion}?`));\r\n } else {\r\n console.log(formatError(`Unknown command: .${cmdName}`));\r\n console.log(`Type ${colors.cyan}.help${colors.reset} for available commands`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle an ISL command (: prefix)\r\n */\r\n private handleISLCommand(input: string): void {\r\n const parts = input.slice(1).split(/\\s+/);\r\n const cmdName = parts[0]?.toLowerCase() || '';\r\n const args = parts.slice(1);\r\n\r\n // Find the command\r\n const command = islCommands.find(\r\n c => c.name === cmdName || c.aliases.includes(cmdName)\r\n );\r\n\r\n if (command) {\r\n this.history.add(input);\r\n const result = command.handler(args, this.session, this);\r\n if (result.output) {\r\n console.log(result.output);\r\n }\r\n } else {\r\n // Try to suggest similar command\r\n const suggestion = findSimilarCommand(cmdName, 'isl');\r\n if (suggestion) {\r\n console.log(formatError(`Unknown command: :${cmdName}`));\r\n console.log(formatWarning(`Did you mean: :${suggestion}?`));\r\n } else {\r\n console.log(formatError(`Unknown command: :${cmdName}`));\r\n console.log(`Type ${colors.cyan}.help${colors.reset} for available commands`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate ISL code\r\n */\r\n private evaluate(code: string): void {\r\n try {\r\n const trimmed = code.trim();\r\n\r\n // Check if it's an intent definition\r\n if (trimmed.startsWith('intent ')) {\r\n this.evaluateIntent(trimmed);\r\n return;\r\n }\r\n\r\n // Check if it's a behavior definition (treat as intent)\r\n if (trimmed.startsWith('behavior ')) {\r\n this.evaluateIntent(trimmed);\r\n return;\r\n }\r\n\r\n // Otherwise, it's an expression or other ISL construct\r\n console.log(formatWarning(`Cannot evaluate: ${trimmed.split('\\n')[0]}...`));\r\n console.log(`Use ${colors.cyan}intent Name { ... }${colors.reset} to define an intent`);\r\n } catch (error) {\r\n this.printError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate an intent definition\r\n */\r\n private evaluateIntent(code: string): void {\r\n const intent = this.session.parseIntent(code);\r\n \r\n if (intent) {\r\n this.session.defineIntent(intent);\r\n \r\n const preCount = intent.preconditions.length;\r\n const postCount = intent.postconditions.length;\r\n const invCount = intent.invariants.length;\r\n \r\n const parts: string[] = [];\r\n if (preCount > 0) parts.push(`${preCount} pre`);\r\n if (postCount > 0) parts.push(`${postCount} post`);\r\n if (invCount > 0) parts.push(`${invCount} invariant`);\r\n \r\n const summary = parts.length > 0 ? ` (${parts.join(', ')})` : '';\r\n console.log(formatSuccess(`Intent '${intent.name}' defined${summary}`));\r\n } else {\r\n // Try parsing as behavior\r\n const behaviorMatch = code.match(/^behavior\\s+(\\w+)\\s*\\{([\\s\\S]*)\\}$/);\r\n if (behaviorMatch) {\r\n const name = behaviorMatch[1]!;\r\n const body = behaviorMatch[2]!;\r\n \r\n const intent: Intent = {\r\n name,\r\n preconditions: [],\r\n postconditions: [],\r\n invariants: [],\r\n scenarios: [],\r\n rawSource: code,\r\n };\r\n\r\n // Parse pre/post sections\r\n const preSection = body.match(/pre(?:conditions)?\\s*\\{([^}]*)\\}/s);\r\n if (preSection) {\r\n const conditions = preSection[1]!.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n for (const cond of conditions) {\r\n const expr = cond.replace(/^-\\s*/, '').trim();\r\n if (expr) {\r\n intent.preconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n const postSection = body.match(/post(?:conditions)?\\s*\\{([^}]*)\\}/s);\r\n if (postSection) {\r\n const conditions = postSection[1]!.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n for (const cond of conditions) {\r\n const expr = cond.replace(/^-\\s*/, '').trim();\r\n if (expr) {\r\n intent.postconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n this.session.defineIntent(intent);\r\n \r\n const preCount = intent.preconditions.length;\r\n const postCount = intent.postconditions.length;\r\n \r\n const parts: string[] = [];\r\n if (preCount > 0) parts.push(`${preCount} pre`);\r\n if (postCount > 0) parts.push(`${postCount} post`);\r\n \r\n const summary = parts.length > 0 ? ` (${parts.join(', ')})` : '';\r\n console.log(formatSuccess(`Intent '${intent.name}' defined${summary}`));\r\n } else {\r\n this.printParseError(code, 'Failed to parse intent definition');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Print a parse error with location info\r\n */\r\n private printParseError(code: string, message: string, line?: number, column?: number): void {\r\n console.log(formatError(message));\r\n \r\n if (line !== undefined && column !== undefined) {\r\n const lines = code.split('\\n');\r\n const errorLine = lines[line - 1] || '';\r\n console.log(` ${colors.gray}${line} |${colors.reset} ${errorLine}`);\r\n console.log(` ${colors.gray}${' '.repeat(String(line).length)} |${colors.reset} ${' '.repeat(column - 1)}${colors.red}^${colors.reset}`);\r\n } else {\r\n // Show first line of code\r\n const firstLine = code.split('\\n')[0];\r\n if (firstLine) {\r\n console.log(` ${colors.gray}>${colors.reset} ${firstLine}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Print an error\r\n */\r\n private printError(error: unknown): void {\r\n if (error instanceof Error) {\r\n console.log(formatError(error.message));\r\n if (this.options.verbose && error.stack) {\r\n console.log(colors.gray + error.stack + colors.reset);\r\n }\r\n } else {\r\n console.log(formatError(String(error)));\r\n }\r\n }\r\n\r\n /**\r\n * Exit the REPL\r\n */\r\n exit(): void {\r\n this.running = false;\r\n this.history.save();\r\n console.log(`\\n${colors.yellow}Goodbye!${colors.reset}`);\r\n if (this.rl) {\r\n this.rl.close();\r\n }\r\n process.exit(0);\r\n }\r\n\r\n /**\r\n * Get the session\r\n */\r\n getSession(): Session {\r\n return this.session;\r\n }\r\n\r\n /**\r\n * Get history\r\n */\r\n getHistory(): History {\r\n return this.history;\r\n }\r\n\r\n /**\r\n * Execute a single command and return result (for testing)\r\n */\r\n async executeOnce(input: string): Promise<{ success: boolean; output?: string; error?: string }> {\r\n const trimmed = input.trim();\r\n\r\n if (trimmed.startsWith('.')) {\r\n const parts = trimmed.slice(1).split(/\\s+/);\r\n const cmdName = parts[0]?.toLowerCase() || '';\r\n const args = parts.slice(1);\r\n\r\n const command = metaCommands.find(\r\n c => c.name === cmdName || c.aliases.includes(cmdName)\r\n );\r\n\r\n if (command) {\r\n const result = command.handler(args, this.session, this);\r\n return { success: true, output: result.output };\r\n }\r\n return { success: false, error: `Unknown command: .${cmdName}` };\r\n }\r\n\r\n if (trimmed.startsWith(':')) {\r\n const parts = trimmed.slice(1).split(/\\s+/);\r\n const cmdName = parts[0]?.toLowerCase() || '';\r\n const args = parts.slice(1);\r\n\r\n const command = islCommands.find(\r\n c => c.name === cmdName || c.aliases.includes(cmdName)\r\n );\r\n\r\n if (command) {\r\n const result = command.handler(args, this.session, this);\r\n return { success: true, output: result.output };\r\n }\r\n return { success: false, error: `Unknown command: :${cmdName}` };\r\n }\r\n\r\n // Intent definition\r\n if (trimmed.startsWith('intent ') || trimmed.startsWith('behavior ')) {\r\n const intent = this.session.parseIntent(trimmed);\r\n if (intent) {\r\n this.session.defineIntent(intent);\r\n return { success: true, output: `Intent '${intent.name}' defined` };\r\n }\r\n return { success: false, error: 'Failed to parse intent' };\r\n }\r\n\r\n return { success: false, error: 'Unknown input' };\r\n }\r\n}\r\n\r\n/**\r\n * Start the REPL\r\n */\r\nexport function startREPL(options?: REPLOptions): ISLREPL {\r\n const repl = new ISLREPL(options);\r\n repl.start();\r\n return repl;\r\n}\r\n","// ============================================================================\r\n// ISL REPL Session State Management\r\n// ============================================================================\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * Represents an ISL intent definition\r\n */\r\nexport interface Intent {\r\n name: string;\r\n preconditions: Condition[];\r\n postconditions: Condition[];\r\n invariants: Condition[];\r\n scenarios: Scenario[];\r\n rawSource: string;\r\n}\r\n\r\n/**\r\n * A condition (pre/post/invariant)\r\n */\r\nexport interface Condition {\r\n expression: string;\r\n description?: string;\r\n}\r\n\r\n/**\r\n * A scenario for testing\r\n */\r\nexport interface Scenario {\r\n name: string;\r\n given: string[];\r\n when: string;\r\n then: string[];\r\n}\r\n\r\n/**\r\n * Session configuration\r\n */\r\nexport interface SessionConfig {\r\n colors?: boolean;\r\n verbose?: boolean;\r\n cwd?: string;\r\n}\r\n\r\n/**\r\n * Session state management for the ISL REPL\r\n */\r\nexport class Session {\r\n /** Defined intents in this session */\r\n private intents: Map<string, Intent> = new Map();\r\n \r\n /** Variables set during the session */\r\n private variables: Map<string, unknown> = new Map();\r\n \r\n /** Command history */\r\n private history: string[] = [];\r\n \r\n /** Last evaluation result */\r\n private lastResult: unknown = undefined;\r\n \r\n /** Loaded files */\r\n private loadedFiles: Set<string> = new Set();\r\n \r\n /** Session configuration */\r\n private config: SessionConfig;\r\n\r\n constructor(config: SessionConfig = {}) {\r\n this.config = {\r\n colors: true,\r\n verbose: false,\r\n cwd: process.cwd(),\r\n ...config,\r\n };\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // Intent Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Define a new intent\r\n */\r\n defineIntent(intent: Intent): void {\r\n this.intents.set(intent.name, intent);\r\n }\r\n\r\n /**\r\n * Get an intent by name\r\n */\r\n getIntent(name: string): Intent | undefined {\r\n return this.intents.get(name);\r\n }\r\n\r\n /**\r\n * Get all defined intents\r\n */\r\n getAllIntents(): Intent[] {\r\n return Array.from(this.intents.values());\r\n }\r\n\r\n /**\r\n * Check if an intent exists\r\n */\r\n hasIntent(name: string): boolean {\r\n return this.intents.has(name);\r\n }\r\n\r\n /**\r\n * Remove an intent\r\n */\r\n removeIntent(name: string): boolean {\r\n return this.intents.delete(name);\r\n }\r\n\r\n /**\r\n * Get intent names for completion\r\n */\r\n getIntentNames(): string[] {\r\n return Array.from(this.intents.keys());\r\n }\r\n\r\n /**\r\n * Parse an intent definition from source code\r\n */\r\n parseIntent(source: string): Intent | null {\r\n const trimmed = source.trim();\r\n \r\n // Match intent declaration: intent Name { ... }\r\n const match = trimmed.match(/^intent\\s+(\\w+)\\s*\\{([\\s\\S]*)\\}$/);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const name = match[1]!;\r\n const body = match[2]!;\r\n\r\n const intent: Intent = {\r\n name,\r\n preconditions: [],\r\n postconditions: [],\r\n invariants: [],\r\n scenarios: [],\r\n rawSource: source,\r\n };\r\n\r\n // Parse preconditions\r\n const preMatch = body.match(/pre(?:conditions?)?\\s*:\\s*([^\\n]+)/g);\r\n if (preMatch) {\r\n for (const pre of preMatch) {\r\n const expr = pre.replace(/pre(?:conditions?)?\\s*:\\s*/, '').trim();\r\n if (expr) {\r\n intent.preconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n // Parse postconditions\r\n const postMatch = body.match(/post(?:conditions?)?\\s*:\\s*([^\\n]+)/g);\r\n if (postMatch) {\r\n for (const post of postMatch) {\r\n const expr = post.replace(/post(?:conditions?)?\\s*:\\s*/, '').trim();\r\n if (expr) {\r\n intent.postconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n // Parse invariants\r\n const invMatch = body.match(/invariants?\\s*:\\s*([^\\n]+)/g);\r\n if (invMatch) {\r\n for (const inv of invMatch) {\r\n const expr = inv.replace(/invariants?\\s*:\\s*/, '').trim();\r\n if (expr) {\r\n intent.invariants.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n return intent;\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // Variable Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Set a variable\r\n */\r\n setVariable(name: string, value: unknown): void {\r\n this.variables.set(name, value);\r\n }\r\n\r\n /**\r\n * Get a variable\r\n */\r\n getVariable(name: string): unknown {\r\n return this.variables.get(name);\r\n }\r\n\r\n /**\r\n * Get all variables\r\n */\r\n getAllVariables(): Map<string, unknown> {\r\n return new Map(this.variables);\r\n }\r\n\r\n /**\r\n * Check if a variable exists\r\n */\r\n hasVariable(name: string): boolean {\r\n return this.variables.has(name);\r\n }\r\n\r\n /**\r\n * Set the last result (accessible as _)\r\n */\r\n setLastResult(value: unknown): void {\r\n this.lastResult = value;\r\n this.variables.set('_', value);\r\n }\r\n\r\n /**\r\n * Get the last result\r\n */\r\n getLastResult(): unknown {\r\n return this.lastResult;\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // History Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Add to history\r\n */\r\n addToHistory(entry: string): void {\r\n const trimmed = entry.trim();\r\n if (trimmed && (this.history.length === 0 || this.history[this.history.length - 1] !== trimmed)) {\r\n this.history.push(trimmed);\r\n }\r\n }\r\n\r\n /**\r\n * Get history\r\n */\r\n getHistory(count?: number): string[] {\r\n if (count) {\r\n return this.history.slice(-count);\r\n }\r\n return [...this.history];\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // File Loading\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Load intents from an ISL file\r\n */\r\n async loadFile(filePath: string): Promise<{ intents: Intent[]; errors: string[] }> {\r\n const resolvedPath = path.isAbsolute(filePath)\r\n ? filePath\r\n : path.resolve(this.config.cwd!, filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n return { intents: [], errors: [`File not found: ${resolvedPath}`] };\r\n }\r\n\r\n try {\r\n const content = fs.readFileSync(resolvedPath, 'utf-8');\r\n const loadedIntents: Intent[] = [];\r\n const errors: string[] = [];\r\n\r\n // Find all intent definitions in the file\r\n const intentRegex = /intent\\s+(\\w+)\\s*\\{[^}]*(?:\\{[^}]*\\}[^}]*)*\\}/g;\r\n let match;\r\n \r\n while ((match = intentRegex.exec(content)) !== null) {\r\n const intent = this.parseIntent(match[0]);\r\n if (intent) {\r\n this.defineIntent(intent);\r\n loadedIntents.push(intent);\r\n } else {\r\n errors.push(`Failed to parse intent starting at position ${match.index}`);\r\n }\r\n }\r\n\r\n // Also try to parse domain-style ISL with behaviors\r\n const behaviorRegex = /behavior\\s+(\\w+)\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}/g;\r\n while ((match = behaviorRegex.exec(content)) !== null) {\r\n const intent = this.parseBehaviorAsIntent(match[1]!, match[2]!);\r\n if (intent) {\r\n this.defineIntent(intent);\r\n loadedIntents.push(intent);\r\n }\r\n }\r\n\r\n this.loadedFiles.add(resolvedPath);\r\n\r\n return { intents: loadedIntents, errors };\r\n } catch (error) {\r\n return {\r\n intents: [],\r\n errors: [`Failed to load file: ${error instanceof Error ? error.message : String(error)}`],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parse a behavior block as an intent\r\n */\r\n private parseBehaviorAsIntent(name: string, body: string): Intent | null {\r\n const intent: Intent = {\r\n name,\r\n preconditions: [],\r\n postconditions: [],\r\n invariants: [],\r\n scenarios: [],\r\n rawSource: `behavior ${name} {${body}}`,\r\n };\r\n\r\n // Parse preconditions block\r\n const preSection = body.match(/pre(?:conditions)?\\s*\\{([^}]*)\\}/s);\r\n if (preSection) {\r\n const conditions = preSection[1]!.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n for (const cond of conditions) {\r\n // Remove leading dash if present\r\n const expr = cond.replace(/^-\\s*/, '').trim();\r\n if (expr) {\r\n intent.preconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n // Parse postconditions block\r\n const postSection = body.match(/post(?:conditions)?\\s*\\{([^}]*)\\}/s);\r\n if (postSection) {\r\n const conditions = postSection[1]!.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n for (const cond of conditions) {\r\n const expr = cond.replace(/^-\\s*/, '').trim();\r\n if (expr) {\r\n intent.postconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n // Parse invariants block\r\n const invSection = body.match(/invariants?\\s*\\{([^}]*)\\}/s);\r\n if (invSection) {\r\n const conditions = invSection[1]!.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n for (const cond of conditions) {\r\n const expr = cond.replace(/^-\\s*/, '').trim();\r\n if (expr) {\r\n intent.invariants.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n return intent;\r\n }\r\n\r\n /**\r\n * Export session intents to a file\r\n */\r\n async exportToFile(filePath: string): Promise<{ success: boolean; error?: string }> {\r\n const resolvedPath = path.isAbsolute(filePath)\r\n ? filePath\r\n : path.resolve(this.config.cwd!, filePath);\r\n\r\n try {\r\n const lines: string[] = [];\r\n lines.push('// Exported ISL intents');\r\n lines.push(`// Generated at ${new Date().toISOString()}`);\r\n lines.push('');\r\n\r\n for (const intent of this.intents.values()) {\r\n lines.push(`intent ${intent.name} {`);\r\n \r\n for (const pre of intent.preconditions) {\r\n lines.push(` pre: ${pre.expression}`);\r\n }\r\n \r\n for (const post of intent.postconditions) {\r\n lines.push(` post: ${post.expression}`);\r\n }\r\n \r\n for (const inv of intent.invariants) {\r\n lines.push(` invariant: ${inv.expression}`);\r\n }\r\n \r\n lines.push('}');\r\n lines.push('');\r\n }\r\n\r\n fs.writeFileSync(resolvedPath, lines.join('\\n'));\r\n return { success: true };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: `Failed to export: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n }\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // State Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Clear all session state\r\n */\r\n clear(): void {\r\n this.intents.clear();\r\n this.variables.clear();\r\n this.lastResult = undefined;\r\n this.loadedFiles.clear();\r\n // Keep history\r\n }\r\n\r\n /**\r\n * Get session summary\r\n */\r\n getSummary(): {\r\n intentCount: number;\r\n variableCount: number;\r\n loadedFileCount: number;\r\n historyCount: number;\r\n } {\r\n return {\r\n intentCount: this.intents.size,\r\n variableCount: this.variables.size,\r\n loadedFileCount: this.loadedFiles.size,\r\n historyCount: this.history.length,\r\n };\r\n }\r\n\r\n /**\r\n * Get loaded files\r\n */\r\n getLoadedFiles(): string[] {\r\n return Array.from(this.loadedFiles);\r\n }\r\n\r\n /**\r\n * Get config\r\n */\r\n getConfig(): SessionConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Update config\r\n */\r\n setConfig(config: Partial<SessionConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n }\r\n}\r\n\r\n/**\r\n * Create a new session\r\n */\r\nexport function createSession(config?: SessionConfig): Session {\r\n return new Session(config);\r\n}\r\n","// ============================================================================\r\n// Command History Management\r\n// ============================================================================\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\n\r\n/**\r\n * Command history manager with persistence\r\n */\r\nexport class History {\r\n private entries: string[] = [];\r\n private position: number = -1;\r\n private maxSize: number;\r\n private historyFile: string;\r\n private unsavedCount: number = 0;\r\n private autoSaveThreshold: number = 10;\r\n\r\n constructor(options: {\r\n maxSize?: number;\r\n historyFile?: string;\r\n autoSaveThreshold?: number;\r\n } = {}) {\r\n this.maxSize = options.maxSize ?? 1000;\r\n this.historyFile = options.historyFile ?? this.getDefaultHistoryFile();\r\n this.autoSaveThreshold = options.autoSaveThreshold ?? 10;\r\n }\r\n\r\n /**\r\n * Get default history file path\r\n */\r\n private getDefaultHistoryFile(): string {\r\n const homeDir = os.homedir();\r\n return path.join(homeDir, '.isl_repl_history');\r\n }\r\n\r\n /**\r\n * Load history from file\r\n */\r\n load(): void {\r\n try {\r\n if (fs.existsSync(this.historyFile)) {\r\n const content = fs.readFileSync(this.historyFile, 'utf-8');\r\n this.entries = content\r\n .split('\\n')\r\n .filter(line => line.trim() !== '')\r\n .slice(-this.maxSize);\r\n this.position = this.entries.length;\r\n }\r\n } catch {\r\n // Ignore errors, start with empty history\r\n }\r\n }\r\n\r\n /**\r\n * Save history to file\r\n */\r\n save(): void {\r\n try {\r\n const dir = path.dirname(this.historyFile);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n fs.writeFileSync(this.historyFile, this.entries.join('\\n') + '\\n');\r\n this.unsavedCount = 0;\r\n } catch {\r\n // Ignore save errors\r\n }\r\n }\r\n\r\n /**\r\n * Add entry to history\r\n */\r\n add(entry: string): void {\r\n const trimmed = entry.trim();\r\n if (trimmed === '') return;\r\n\r\n // Don't add duplicates of the last entry\r\n if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {\r\n this.position = this.entries.length;\r\n return;\r\n }\r\n\r\n this.entries.push(trimmed);\r\n\r\n // Trim to max size\r\n if (this.entries.length > this.maxSize) {\r\n this.entries = this.entries.slice(-this.maxSize);\r\n }\r\n\r\n this.position = this.entries.length;\r\n this.unsavedCount++;\r\n\r\n // Auto-save periodically\r\n if (this.unsavedCount >= this.autoSaveThreshold) {\r\n this.save();\r\n }\r\n }\r\n\r\n /**\r\n * Get previous entry (for up arrow)\r\n */\r\n previous(): string | null {\r\n if (this.entries.length === 0) return null;\r\n \r\n if (this.position > 0) {\r\n this.position--;\r\n }\r\n \r\n return this.entries[this.position] ?? null;\r\n }\r\n\r\n /**\r\n * Get next entry (for down arrow)\r\n */\r\n next(): string | null {\r\n if (this.entries.length === 0) return null;\r\n \r\n if (this.position < this.entries.length - 1) {\r\n this.position++;\r\n return this.entries[this.position] ?? null;\r\n }\r\n \r\n this.position = this.entries.length;\r\n return '';\r\n }\r\n\r\n /**\r\n * Reset position to end\r\n */\r\n resetPosition(): void {\r\n this.position = this.entries.length;\r\n }\r\n\r\n /**\r\n * Search history for entries containing text\r\n */\r\n search(text: string): string[] {\r\n const lower = text.toLowerCase();\r\n return this.entries.filter(entry => \r\n entry.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n /**\r\n * Search backwards from current position\r\n */\r\n searchBackward(text: string): string | null {\r\n const lower = text.toLowerCase();\r\n for (let i = this.position - 1; i >= 0; i--) {\r\n if (this.entries[i]!.toLowerCase().includes(lower)) {\r\n this.position = i;\r\n return this.entries[i]!;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Search forward from current position\r\n */\r\n searchForward(text: string): string | null {\r\n const lower = text.toLowerCase();\r\n for (let i = this.position + 1; i < this.entries.length; i++) {\r\n if (this.entries[i]!.toLowerCase().includes(lower)) {\r\n this.position = i;\r\n return this.entries[i]!;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get all entries\r\n */\r\n getAll(): string[] {\r\n return [...this.entries];\r\n }\r\n\r\n /**\r\n * Get recent entries\r\n */\r\n getRecent(count: number): string[] {\r\n return this.entries.slice(-count);\r\n }\r\n\r\n /**\r\n * Clear history\r\n */\r\n clear(): void {\r\n this.entries = [];\r\n this.position = 0;\r\n this.save();\r\n }\r\n\r\n /**\r\n * Get history size\r\n */\r\n get size(): number {\r\n return this.entries.length;\r\n }\r\n\r\n /**\r\n * Get current position\r\n */\r\n get currentPosition(): number {\r\n return this.position;\r\n }\r\n}\r\n\r\n/**\r\n * In-memory history (no persistence)\r\n */\r\nexport class MemoryHistory extends History {\r\n constructor(maxSize: number = 1000) {\r\n super({ maxSize, historyFile: '' });\r\n }\r\n\r\n override load(): void {\r\n // No-op for memory history\r\n }\r\n\r\n override save(): void {\r\n // No-op for memory history\r\n }\r\n}\r\n","// ============================================================================\r\n// ISL REPL Tab Completion\r\n// Intelligent completions for commands and expressions\r\n// ============================================================================\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { Session } from './session';\r\nimport { metaCommands, islCommands } from './commands';\r\n\r\n/**\r\n * Completion item\r\n */\r\nexport interface CompletionItem {\r\n text: string;\r\n type: 'command' | 'intent' | 'keyword' | 'variable' | 'file';\r\n description?: string;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Constants\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * ISL keywords\r\n */\r\nexport const KEYWORDS: CompletionItem[] = [\r\n { text: 'intent', type: 'keyword', description: 'Define an intent' },\r\n { text: 'behavior', type: 'keyword', description: 'Define a behavior' },\r\n { text: 'pre', type: 'keyword', description: 'Precondition' },\r\n { text: 'post', type: 'keyword', description: 'Postcondition' },\r\n { text: 'invariant', type: 'keyword', description: 'Invariant' },\r\n { text: 'true', type: 'keyword', description: 'Boolean true' },\r\n { text: 'false', type: 'keyword', description: 'Boolean false' },\r\n { text: 'null', type: 'keyword', description: 'Null value' },\r\n { text: 'and', type: 'keyword', description: 'Logical AND' },\r\n { text: 'or', type: 'keyword', description: 'Logical OR' },\r\n { text: 'not', type: 'keyword', description: 'Logical NOT' },\r\n { text: 'implies', type: 'keyword', description: 'Logical implication' },\r\n { text: 'forall', type: 'keyword', description: 'Universal quantifier' },\r\n { text: 'exists', type: 'keyword', description: 'Existential quantifier' },\r\n { text: 'in', type: 'keyword', description: 'Membership test' },\r\n];\r\n\r\n/**\r\n * Meta commands (. prefix)\r\n */\r\nexport const META_COMMANDS: CompletionItem[] = metaCommands.map(cmd => ({\r\n text: `.${cmd.name}`,\r\n type: 'command' as const,\r\n description: cmd.description,\r\n}));\r\n\r\n/**\r\n * ISL commands (: prefix)\r\n */\r\nexport const ISL_COMMANDS: CompletionItem[] = islCommands.map(cmd => ({\r\n text: `:${cmd.name}`,\r\n type: 'command' as const,\r\n description: cmd.description,\r\n}));\r\n\r\n/**\r\n * All commands\r\n */\r\nexport const COMMANDS: CompletionItem[] = [...META_COMMANDS, ...ISL_COMMANDS];\r\n\r\n/**\r\n * Generate targets for :gen command\r\n */\r\nexport const GEN_TARGETS: CompletionItem[] = [\r\n { text: 'typescript', type: 'keyword', description: 'Generate TypeScript contract' },\r\n { text: 'rust', type: 'keyword', description: 'Generate Rust contract' },\r\n { text: 'go', type: 'keyword', description: 'Generate Go contract' },\r\n { text: 'openapi', type: 'keyword', description: 'Generate OpenAPI schema' },\r\n];\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Completion Provider\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Provides intelligent completions based on context\r\n */\r\nexport class CompletionProvider {\r\n constructor(private session: Session) {}\r\n\r\n /**\r\n * Update the session reference\r\n */\r\n setSession(session: Session): void {\r\n this.session = session;\r\n }\r\n\r\n /**\r\n * Get completions for a line\r\n */\r\n complete(line: string): [CompletionItem[], string] {\r\n const trimmed = line.trimStart();\r\n\r\n // Meta command completion (. prefix)\r\n if (trimmed.startsWith('.')) {\r\n return this.completeMetaCommand(trimmed);\r\n }\r\n\r\n // ISL command completion (: prefix)\r\n if (trimmed.startsWith(':')) {\r\n return this.completeISLCommand(trimmed);\r\n }\r\n\r\n // Expression completion\r\n return this.completeExpression(trimmed);\r\n }\r\n\r\n /**\r\n * Complete meta commands\r\n */\r\n private completeMetaCommand(line: string): [CompletionItem[], string] {\r\n const parts = line.slice(1).split(/\\s+/);\r\n const cmdPart = parts[0] || '';\r\n\r\n // Just the command prefix - show all meta commands\r\n if (parts.length === 1) {\r\n const matches = META_COMMANDS.filter(c => \r\n c.text.toLowerCase().startsWith(`.${cmdPart.toLowerCase()}`)\r\n );\r\n return [matches.length > 0 ? matches : META_COMMANDS, '.' + cmdPart];\r\n }\r\n\r\n // Command arguments\r\n return [[], line];\r\n }\r\n\r\n /**\r\n * Complete ISL commands\r\n */\r\n private completeISLCommand(line: string): [CompletionItem[], string] {\r\n const parts = line.slice(1).split(/\\s+/);\r\n const cmdPart = parts[0] || '';\r\n const args = parts.slice(1);\r\n\r\n // Just the command prefix - show all ISL commands\r\n if (parts.length === 1) {\r\n const matches = ISL_COMMANDS.filter(c => \r\n c.text.toLowerCase().startsWith(`:${cmdPart.toLowerCase()}`)\r\n );\r\n return [matches.length > 0 ? matches : ISL_COMMANDS, ':' + cmdPart];\r\n }\r\n\r\n // Command-specific argument completion\r\n const cmd = cmdPart.toLowerCase();\r\n \r\n switch (cmd) {\r\n case 'gen':\r\n case 'generate':\r\n case 'g':\r\n return this.completeGenCommand(args);\r\n \r\n case 'check':\r\n case 'c':\r\n case 'inspect':\r\n case 'i':\r\n case 'show':\r\n return this.completeIntentName(args[0] || '');\r\n \r\n case 'load':\r\n case 'l':\r\n case 'export':\r\n case 'save':\r\n return this.completeFilePath(args[0] || '');\r\n \r\n default:\r\n return [[], line];\r\n }\r\n }\r\n\r\n /**\r\n * Complete :gen command arguments\r\n */\r\n private completeGenCommand(args: string[]): [CompletionItem[], string] {\r\n // First argument: target\r\n if (args.length <= 1) {\r\n const partial = args[0] || '';\r\n const matches = GEN_TARGETS.filter(t => \r\n t.text.toLowerCase().startsWith(partial.toLowerCase())\r\n );\r\n return [matches.length > 0 ? matches : GEN_TARGETS, partial];\r\n }\r\n\r\n // Second argument: intent name\r\n return this.completeIntentName(args[1] || '');\r\n }\r\n\r\n /**\r\n * Complete intent names\r\n */\r\n private completeIntentName(partial: string): [CompletionItem[], string] {\r\n const intents = this.session.getAllIntents();\r\n const items: CompletionItem[] = intents.map(intent => ({\r\n text: intent.name,\r\n type: 'intent',\r\n description: `${intent.preconditions.length} pre, ${intent.postconditions.length} post`,\r\n }));\r\n\r\n const matches = items.filter(i => \r\n i.text.toLowerCase().startsWith(partial.toLowerCase())\r\n );\r\n\r\n return [matches.length > 0 ? matches : items, partial];\r\n }\r\n\r\n /**\r\n * Complete file paths\r\n */\r\n private completeFilePath(partial: string): [CompletionItem[], string] {\r\n try {\r\n const dir = path.dirname(partial) || '.';\r\n const base = path.basename(partial);\r\n const resolvedDir = path.resolve(this.session.getConfig().cwd || process.cwd(), dir);\r\n\r\n if (!fs.existsSync(resolvedDir)) {\r\n return [[], partial];\r\n }\r\n\r\n const entries = fs.readdirSync(resolvedDir, { withFileTypes: true });\r\n const items: CompletionItem[] = entries\r\n .filter(e => {\r\n const name = e.name.toLowerCase();\r\n return name.startsWith(base.toLowerCase()) && \r\n (e.isDirectory() || name.endsWith('.isl'));\r\n })\r\n .map(e => ({\r\n text: path.join(dir, e.name + (e.isDirectory() ? '/' : '')),\r\n type: 'file' as const,\r\n description: e.isDirectory() ? 'Directory' : 'ISL file',\r\n }));\r\n\r\n return [items, partial];\r\n } catch {\r\n return [[], partial];\r\n }\r\n }\r\n\r\n /**\r\n * Complete expressions\r\n */\r\n private completeExpression(line: string): [CompletionItem[], string] {\r\n const items: CompletionItem[] = [...KEYWORDS];\r\n\r\n // Add intent names\r\n for (const intent of this.session.getAllIntents()) {\r\n items.push({\r\n text: intent.name,\r\n type: 'intent',\r\n description: 'Defined intent',\r\n });\r\n }\r\n\r\n // Add variables\r\n for (const [name] of this.session.getAllVariables()) {\r\n items.push({\r\n text: name,\r\n type: 'variable',\r\n description: 'Variable',\r\n });\r\n }\r\n\r\n // Add special variable\r\n items.push({\r\n text: '_',\r\n type: 'variable',\r\n description: 'Last result',\r\n });\r\n\r\n // Find partial word at end of line\r\n const match = line.match(/[\\w.]+$/);\r\n const partial = match ? match[0] : '';\r\n\r\n // Filter by partial\r\n const matches = items.filter(i => \r\n i.text.toLowerCase().startsWith(partial.toLowerCase())\r\n );\r\n\r\n return [matches.length > 0 ? matches : items, partial];\r\n }\r\n\r\n /**\r\n * Get all available completions (for help)\r\n */\r\n getAllCompletions(): {\r\n metaCommands: CompletionItem[];\r\n islCommands: CompletionItem[];\r\n keywords: CompletionItem[];\r\n intents: CompletionItem[];\r\n } {\r\n return {\r\n metaCommands: META_COMMANDS,\r\n islCommands: ISL_COMMANDS,\r\n keywords: KEYWORDS,\r\n intents: this.session.getAllIntents().map(i => ({\r\n text: i.name,\r\n type: 'intent' as const,\r\n description: `${i.preconditions.length} pre, ${i.postconditions.length} post`,\r\n })),\r\n };\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Readline Completer Factory\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Create a readline-compatible completer function\r\n */\r\nexport function createCompleter(\r\n provider: CompletionProvider\r\n): (line: string) => [string[], string] {\r\n return (line: string): [string[], string] => {\r\n const [items, partial] = provider.complete(line);\r\n const completions = items.map(i => i.text);\r\n return [completions, partial];\r\n };\r\n}\r\n","// ============================================================================\r\n// ISL REPL Output Formatting\r\n// Syntax highlighting and pretty-printing\r\n// ============================================================================\r\n\r\nimport type { Intent, Condition } from './session';\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// ANSI Color Codes\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const colors = {\r\n reset: '\\x1b[0m',\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n italic: '\\x1b[3m',\r\n underline: '\\x1b[4m',\r\n \r\n // Foreground colors\r\n black: '\\x1b[30m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n magenta: '\\x1b[35m',\r\n cyan: '\\x1b[36m',\r\n white: '\\x1b[37m',\r\n gray: '\\x1b[90m',\r\n \r\n // Bright foreground\r\n brightRed: '\\x1b[91m',\r\n brightGreen: '\\x1b[92m',\r\n brightYellow: '\\x1b[93m',\r\n brightBlue: '\\x1b[94m',\r\n brightMagenta: '\\x1b[95m',\r\n brightCyan: '\\x1b[96m',\r\n brightWhite: '\\x1b[97m',\r\n \r\n // Background colors\r\n bgBlack: '\\x1b[40m',\r\n bgRed: '\\x1b[41m',\r\n bgGreen: '\\x1b[42m',\r\n bgYellow: '\\x1b[43m',\r\n bgBlue: '\\x1b[44m',\r\n bgMagenta: '\\x1b[45m',\r\n bgCyan: '\\x1b[46m',\r\n bgWhite: '\\x1b[47m',\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Message Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format a success message\r\n */\r\nexport function formatSuccess(message: string): string {\r\n return `${colors.green}✓${colors.reset} ${message}`;\r\n}\r\n\r\n/**\r\n * Format an error message\r\n */\r\nexport function formatError(message: string): string {\r\n return `${colors.red}✗ Error:${colors.reset} ${message}`;\r\n}\r\n\r\n/**\r\n * Format a warning message\r\n */\r\nexport function formatWarning(message: string): string {\r\n return `${colors.yellow}⚠${colors.reset} ${message}`;\r\n}\r\n\r\n/**\r\n * Format an info message\r\n */\r\nexport function formatInfo(message: string): string {\r\n return `${colors.cyan}ℹ${colors.reset} ${message}`;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Intent Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format an intent for display\r\n */\r\nexport function formatIntent(intent: Intent): string {\r\n const lines: string[] = [\r\n '',\r\n `${colors.bold}Intent: ${colors.cyan}${intent.name}${colors.reset}`,\r\n colors.gray + '─'.repeat(40) + colors.reset,\r\n ];\r\n\r\n // Preconditions\r\n if (intent.preconditions.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Preconditions:${colors.reset}`);\r\n for (const pre of intent.preconditions) {\r\n lines.push(` ${colors.magenta}pre:${colors.reset} ${highlightExpression(pre.expression)}`);\r\n }\r\n }\r\n\r\n // Postconditions\r\n if (intent.postconditions.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Postconditions:${colors.reset}`);\r\n for (const post of intent.postconditions) {\r\n lines.push(` ${colors.magenta}post:${colors.reset} ${highlightExpression(post.expression)}`);\r\n }\r\n }\r\n\r\n // Invariants\r\n if (intent.invariants.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Invariants:${colors.reset}`);\r\n for (const inv of intent.invariants) {\r\n lines.push(` ${colors.magenta}invariant:${colors.reset} ${highlightExpression(inv.expression)}`);\r\n }\r\n }\r\n\r\n // Scenarios\r\n if (intent.scenarios.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Scenarios:${colors.reset}`);\r\n for (const scenario of intent.scenarios) {\r\n lines.push(` ${colors.yellow}${scenario.name}${colors.reset}`);\r\n }\r\n }\r\n\r\n // Raw source (if verbose)\r\n // lines.push('');\r\n // lines.push(`${colors.gray}Source:${colors.reset}`);\r\n // lines.push(colors.gray + intent.rawSource + colors.reset);\r\n\r\n lines.push('');\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Format a condition\r\n */\r\nexport function formatCondition(condition: Condition, type: 'pre' | 'post' | 'invariant'): string {\r\n const prefix = {\r\n pre: colors.magenta + 'pre' + colors.reset,\r\n post: colors.magenta + 'post' + colors.reset,\r\n invariant: colors.magenta + 'invariant' + colors.reset,\r\n }[type];\r\n\r\n return `${prefix}: ${highlightExpression(condition.expression)}`;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Syntax Highlighting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Highlight an ISL expression\r\n */\r\nexport function highlightExpression(expr: string): string {\r\n return expr\r\n // Operators\r\n .replace(/\\b(and|or|not|implies)\\b/g, `${colors.yellow}$1${colors.reset}`)\r\n .replace(/(>=|<=|==|!=|>|<)/g, `${colors.yellow}$1${colors.reset}`)\r\n // Keywords\r\n .replace(/\\b(true|false|null)\\b/g, `${colors.magenta}$1${colors.reset}`)\r\n .replace(/\\b(forall|exists|in)\\b/g, `${colors.yellow}$1${colors.reset}`)\r\n // Numbers\r\n .replace(/\\b(\\d+(?:\\.\\d+)?)\\b/g, `${colors.cyan}$1${colors.reset}`)\r\n // Strings\r\n .replace(/\"([^\"]*)\"/g, `${colors.green}\"$1\"${colors.reset}`)\r\n // Method calls\r\n .replace(/\\.(\\w+)\\(/g, `.${colors.blue}$1${colors.reset}(`)\r\n // Properties\r\n .replace(/\\.(\\w+)(?!\\()/g, `.${colors.cyan}$1${colors.reset}`);\r\n}\r\n\r\n/**\r\n * Highlight ISL source code\r\n */\r\nexport function highlightISL(source: string): string {\r\n return source\r\n // Keywords\r\n .replace(/\\b(intent|behavior|entity|domain|type|enum)\\b/g, `${colors.yellow}$1${colors.reset}`)\r\n .replace(/\\b(pre|post|invariant|scenario)\\b/g, `${colors.magenta}$1${colors.reset}`)\r\n .replace(/\\b(input|output|success|errors?)\\b/g, `${colors.blue}$1${colors.reset}`)\r\n // Types\r\n .replace(/\\b(String|Int|Boolean|UUID|Timestamp|Decimal|Duration|List|Map|Optional)\\b/g, \r\n `${colors.green}$1${colors.reset}`)\r\n // Operators\r\n .replace(/\\b(and|or|not|implies|forall|exists|in)\\b/g, `${colors.yellow}$1${colors.reset}`)\r\n // Booleans\r\n .replace(/\\b(true|false|null)\\b/g, `${colors.magenta}$1${colors.reset}`)\r\n // Numbers\r\n .replace(/\\b(\\d+(?:\\.\\d+)?)\\b/g, `${colors.cyan}$1${colors.reset}`)\r\n // Strings\r\n .replace(/\"([^\"]*)\"/g, `${colors.green}\"$1\"${colors.reset}`)\r\n // Comments\r\n .replace(/(\\/\\/[^\\n]*)/g, `${colors.gray}$1${colors.reset}`)\r\n .replace(/(#[^\\n]*)/g, `${colors.gray}$1${colors.reset}`);\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Table Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format a table\r\n */\r\nexport function formatTable(\r\n headers: string[],\r\n rows: string[][],\r\n options: { colors?: boolean } = {}\r\n): string {\r\n const useColors = options.colors !== false;\r\n\r\n // Calculate column widths\r\n const widths = headers.map((h, i) => {\r\n const cellWidths = [h.length, ...rows.map(r => (r[i] ?? '').length)];\r\n return Math.max(...cellWidths);\r\n });\r\n\r\n // Format header\r\n const headerRow = headers.map((h, i) => h.padEnd(widths[i]!)).join(' │ ');\r\n const separator = widths.map(w => '─'.repeat(w)).join('─┼─');\r\n\r\n // Format rows\r\n const dataRows = rows.map(row =>\r\n row.map((cell, i) => (cell ?? '').padEnd(widths[i]!)).join(' │ ')\r\n );\r\n\r\n const headerFormatted = useColors ? `${colors.bold}${headerRow}${colors.reset}` : headerRow;\r\n const sepFormatted = useColors ? `${colors.gray}${separator}${colors.reset}` : separator;\r\n\r\n return [headerFormatted, sepFormatted, ...dataRows].join('\\n');\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format a parse error with caret pointing to position\r\n */\r\nexport function formatParseError(\r\n source: string,\r\n message: string,\r\n line: number,\r\n column: number\r\n): string {\r\n const lines = source.split('\\n');\r\n const errorLine = lines[line - 1] || '';\r\n \r\n const output = [\r\n formatError(message),\r\n '',\r\n `${colors.gray}${String(line).padStart(4)} │${colors.reset} ${errorLine}`,\r\n `${colors.gray} │${colors.reset} ${' '.repeat(column - 1)}${colors.red}^${colors.reset}`,\r\n ];\r\n\r\n return output.join('\\n');\r\n}\r\n\r\n/**\r\n * Format a type error with expected vs actual\r\n */\r\nexport function formatTypeError(\r\n message: string,\r\n expected: string,\r\n actual: string,\r\n context?: string\r\n): string {\r\n const output = [\r\n formatError(message),\r\n '',\r\n ` Expected: ${colors.green}${expected}${colors.reset}`,\r\n ` Actual: ${colors.red}${actual}${colors.reset}`,\r\n ];\r\n\r\n if (context) {\r\n output.push('');\r\n output.push(` Context: ${colors.gray}${context}${colors.reset}`);\r\n }\r\n\r\n return output.join('\\n');\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Utility Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format a value for display\r\n */\r\nexport function formatValue(value: unknown, indent = 0): string {\r\n const pad = ' '.repeat(indent);\r\n \r\n if (value === null) return `${colors.gray}null${colors.reset}`;\r\n if (value === undefined) return `${colors.gray}undefined${colors.reset}`;\r\n \r\n if (typeof value === 'string') {\r\n return `${colors.green}\"${value}\"${colors.reset}`;\r\n }\r\n \r\n if (typeof value === 'number') {\r\n return `${colors.cyan}${value}${colors.reset}`;\r\n }\r\n \r\n if (typeof value === 'boolean') {\r\n return `${colors.magenta}${value}${colors.reset}`;\r\n }\r\n \r\n if (Array.isArray(value)) {\r\n if (value.length === 0) return '[]';\r\n const items = value.map(v => formatValue(v, indent + 2));\r\n return `[\\n${pad} ${items.join(`,\\n${pad} `)}\\n${pad}]`;\r\n }\r\n \r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value);\r\n if (entries.length === 0) return '{}';\r\n const items = entries.map(([k, v]) => \r\n `${colors.blue}${k}${colors.reset}: ${formatValue(v, indent + 2)}`\r\n );\r\n return `{\\n${pad} ${items.join(`,\\n${pad} `)}\\n${pad}}`;\r\n }\r\n \r\n return String(value);\r\n}\r\n\r\n/**\r\n * Strip ANSI color codes from a string\r\n */\r\nexport function stripColors(str: string): string {\r\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\r\n}\r\n\r\n/**\r\n * Wrap text to a maximum width\r\n */\r\nexport function wrapText(text: string, maxWidth: number): string {\r\n const words = text.split(' ');\r\n const lines: string[] = [];\r\n let currentLine = '';\r\n\r\n for (const word of words) {\r\n const testLine = currentLine ? `${currentLine} ${word}` : word;\r\n if (stripColors(testLine).length > maxWidth && currentLine) {\r\n lines.push(currentLine);\r\n currentLine = word;\r\n } else {\r\n currentLine = testLine;\r\n }\r\n }\r\n\r\n if (currentLine) {\r\n lines.push(currentLine);\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Box Drawing\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Draw a box around text\r\n */\r\nexport function drawBox(lines: string[], title?: string): string {\r\n const maxLen = Math.max(...lines.map(l => stripColors(l).length), title ? title.length + 4 : 0);\r\n \r\n const top = title \r\n ? `╔═ ${title} ${'═'.repeat(maxLen - title.length - 3)}╗`\r\n : `╔${'═'.repeat(maxLen + 2)}╗`;\r\n \r\n const bottom = `╚${'═'.repeat(maxLen + 2)}╝`;\r\n \r\n const paddedLines = lines.map(l => {\r\n const padding = maxLen - stripColors(l).length;\r\n return `║ ${l}${' '.repeat(padding)} ║`;\r\n });\r\n\r\n return [top, ...paddedLines, bottom].join('\\n');\r\n}\r\n","// ============================================================================\r\n// ISL REPL Commands\r\n// Meta commands (.) and ISL commands (:)\r\n// ============================================================================\r\n\r\nimport { Session, Intent } from './session';\r\nimport { \r\n formatIntent, \r\n formatSuccess, \r\n formatError, \r\n formatWarning, \r\n formatTable,\r\n colors,\r\n highlightISL,\r\n} from './formatter';\r\n\r\n// Forward declaration for REPL type\r\ninterface REPL {\r\n exit(): void;\r\n getSession(): Session;\r\n}\r\n\r\n/**\r\n * Command result\r\n */\r\nexport interface CommandResult {\r\n output?: string;\r\n exit?: boolean;\r\n}\r\n\r\n/**\r\n * Meta command definition (. prefix)\r\n */\r\nexport interface MetaCommand {\r\n name: string;\r\n aliases: string[];\r\n description: string;\r\n usage: string;\r\n handler: (args: string[], session: Session, repl: REPL) => CommandResult;\r\n}\r\n\r\n/**\r\n * ISL command definition (: prefix)\r\n */\r\nexport interface ISLCommand {\r\n name: string;\r\n aliases: string[];\r\n description: string;\r\n usage: string;\r\n handler: (args: string[], session: Session, repl: REPL) => CommandResult;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Meta Commands (. prefix) - REPL control commands\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const metaCommands: MetaCommand[] = [\r\n {\r\n name: 'help',\r\n aliases: ['h', '?'],\r\n description: 'Show help for commands',\r\n usage: '.help [command]',\r\n handler: (args, session) => {\r\n if (args.length > 0) {\r\n const cmdName = args[0]!.toLowerCase();\r\n \r\n // Search in meta commands\r\n const metaCmd = metaCommands.find(c => c.name === cmdName || c.aliases.includes(cmdName));\r\n if (metaCmd) {\r\n return {\r\n output: [\r\n `${colors.cyan}.${metaCmd.name}${colors.reset} - ${metaCmd.description}`,\r\n `Usage: ${metaCmd.usage}`,\r\n metaCmd.aliases.length > 0 ? `Aliases: ${metaCmd.aliases.map(a => '.' + a).join(', ')}` : '',\r\n ].filter(Boolean).join('\\n'),\r\n };\r\n }\r\n\r\n // Search in ISL commands\r\n const islCmd = islCommands.find(c => c.name === cmdName || c.aliases.includes(cmdName));\r\n if (islCmd) {\r\n return {\r\n output: [\r\n `${colors.cyan}:${islCmd.name}${colors.reset} - ${islCmd.description}`,\r\n `Usage: ${islCmd.usage}`,\r\n islCmd.aliases.length > 0 ? `Aliases: ${islCmd.aliases.map(a => ':' + a).join(', ')}` : '',\r\n ].filter(Boolean).join('\\n'),\r\n };\r\n }\r\n\r\n return { output: formatError(`Unknown command: ${cmdName}`) };\r\n }\r\n\r\n const lines = [\r\n '',\r\n `${colors.bold}Meta Commands${colors.reset} ${colors.gray}(REPL control)${colors.reset}`,\r\n '',\r\n ...metaCommands.map(c => ` ${colors.cyan}.${c.name.padEnd(10)}${colors.reset} ${c.description}`),\r\n '',\r\n `${colors.bold}ISL Commands${colors.reset} ${colors.gray}(specification operations)${colors.reset}`,\r\n '',\r\n ...islCommands.map(c => ` ${colors.cyan}:${c.name.padEnd(10)}${colors.reset} ${c.description}`),\r\n '',\r\n `${colors.bold}ISL Syntax${colors.reset}`,\r\n '',\r\n ` ${colors.yellow}intent${colors.reset} Name {`,\r\n ` ${colors.magenta}pre${colors.reset}: condition`,\r\n ` ${colors.magenta}post${colors.reset}: condition`,\r\n ` }`,\r\n '',\r\n `Type ${colors.cyan}.help <command>${colors.reset} for detailed help.`,\r\n '',\r\n ];\r\n\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n\r\n {\r\n name: 'exit',\r\n aliases: ['quit', 'q'],\r\n description: 'Exit the REPL',\r\n usage: '.exit',\r\n handler: () => {\r\n return { exit: true };\r\n },\r\n },\r\n\r\n {\r\n name: 'clear',\r\n aliases: ['cls'],\r\n description: 'Clear session state (intents, variables)',\r\n usage: '.clear',\r\n handler: (args, session) => {\r\n session.clear();\r\n return { output: formatSuccess('Session cleared') };\r\n },\r\n },\r\n\r\n {\r\n name: 'history',\r\n aliases: ['hist'],\r\n description: 'Show command history',\r\n usage: '.history [n]',\r\n handler: (args, session) => {\r\n const count = args.length > 0 ? parseInt(args[0]!) : 10;\r\n const history = session.getHistory(count);\r\n\r\n if (history.length === 0) {\r\n return { output: 'No history.' };\r\n }\r\n\r\n const lines = [\r\n `${colors.bold}History${colors.reset} (last ${history.length} entries)`,\r\n '',\r\n ...history.map((entry, i) => {\r\n const num = String(i + 1).padStart(3);\r\n const preview = entry.split('\\n')[0]!;\r\n const more = entry.includes('\\n') ? ` ${colors.gray}...${colors.reset}` : '';\r\n return ` ${colors.gray}${num}${colors.reset} ${preview}${more}`;\r\n }),\r\n ];\r\n\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n];\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// ISL Commands (: prefix) - Specification operations\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const islCommands: ISLCommand[] = [\r\n {\r\n name: 'check',\r\n aliases: ['c'],\r\n description: 'Type check an intent',\r\n usage: ':check <intent>',\r\n handler: (args, session) => {\r\n if (args.length === 0) {\r\n // Check all intents\r\n const intents = session.getAllIntents();\r\n if (intents.length === 0) {\r\n return { output: formatWarning('No intents defined. Define one with: intent Name { ... }') };\r\n }\r\n\r\n const lines = [\r\n formatSuccess('Type check passed'),\r\n '',\r\n ];\r\n\r\n for (const intent of intents) {\r\n lines.push(`${colors.bold}${intent.name}${colors.reset}`);\r\n \r\n for (const pre of intent.preconditions) {\r\n lines.push(` ${colors.green}✓${colors.reset} pre: ${highlightCondition(pre.expression)}`);\r\n }\r\n \r\n for (const post of intent.postconditions) {\r\n lines.push(` ${colors.green}✓${colors.reset} post: ${highlightCondition(post.expression)}`);\r\n }\r\n \r\n lines.push('');\r\n }\r\n\r\n return { output: lines.join('\\n') };\r\n }\r\n\r\n const intentName = args[0]!;\r\n const intent = session.getIntent(intentName);\r\n\r\n if (!intent) {\r\n const available = session.getIntentNames().join(', ') || '(none)';\r\n return { \r\n output: formatError(`Unknown intent: ${intentName}\\nAvailable: ${available}`) \r\n };\r\n }\r\n\r\n const lines = [\r\n formatSuccess('Type check passed'),\r\n '',\r\n ];\r\n\r\n for (const pre of intent.preconditions) {\r\n lines.push(` pre: ${highlightCondition(pre.expression)} ${colors.green}✓${colors.reset}`);\r\n }\r\n\r\n for (const post of intent.postconditions) {\r\n lines.push(` post: ${highlightCondition(post.expression)} ${colors.green}✓${colors.reset}`);\r\n }\r\n\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n\r\n {\r\n name: 'gen',\r\n aliases: ['generate', 'g'],\r\n description: 'Generate code from an intent',\r\n usage: ':gen <target> <intent>',\r\n handler: (args, session) => {\r\n if (args.length < 2) {\r\n return {\r\n output: [\r\n 'Usage: :gen <target> <intent>',\r\n '',\r\n 'Targets:',\r\n ' typescript Generate TypeScript contract',\r\n ' rust Generate Rust contract',\r\n ' go Generate Go contract',\r\n ' openapi Generate OpenAPI schema',\r\n ].join('\\n'),\r\n };\r\n }\r\n\r\n const target = args[0]!.toLowerCase();\r\n const intentName = args[1]!;\r\n const intent = session.getIntent(intentName);\r\n\r\n if (!intent) {\r\n const available = session.getIntentNames().join(', ') || '(none)';\r\n return { \r\n output: formatError(`Unknown intent: ${intentName}\\nAvailable: ${available}`) \r\n };\r\n }\r\n\r\n switch (target) {\r\n case 'typescript':\r\n case 'ts':\r\n return { output: generateTypeScript(intent) };\r\n case 'rust':\r\n case 'rs':\r\n return { output: generateRust(intent) };\r\n case 'go':\r\n return { output: generateGo(intent) };\r\n case 'openapi':\r\n case 'oas':\r\n return { output: generateOpenAPI(intent) };\r\n default:\r\n return { \r\n output: formatError(`Unknown target: ${target}\\nAvailable: typescript, rust, go, openapi`) \r\n };\r\n }\r\n },\r\n },\r\n\r\n {\r\n name: 'load',\r\n aliases: ['l'],\r\n description: 'Load intents from a file',\r\n usage: ':load <file.isl>',\r\n handler: (args, session) => {\r\n if (args.length === 0) {\r\n return { output: 'Usage: :load <file.isl>' };\r\n }\r\n\r\n const filePath = args[0]!;\r\n \r\n // Synchronous wrapper around async load\r\n // In a real implementation, this would need proper async handling\r\n let result: { intents: { name: string }[]; errors: string[] } = { intents: [], errors: [] };\r\n \r\n session.loadFile(filePath).then(r => {\r\n result = r;\r\n }).catch(e => {\r\n result.errors.push(String(e));\r\n });\r\n\r\n // For now, we'll do a blocking load using fs.readFileSync\r\n const fs = require('fs');\r\n const path = require('path');\r\n \r\n try {\r\n const resolvedPath = path.isAbsolute(filePath)\r\n ? filePath\r\n : path.resolve(process.cwd(), filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n return { output: formatError(`File not found: ${resolvedPath}`) };\r\n }\r\n\r\n const content = fs.readFileSync(resolvedPath, 'utf-8');\r\n \r\n // Find all intent/behavior definitions\r\n const intentRegex = /(?:intent|behavior)\\s+(\\w+)\\s*\\{[^}]*(?:\\{[^}]*\\}[^}]*)*\\}/g;\r\n let match;\r\n let count = 0;\r\n \r\n while ((match = intentRegex.exec(content)) !== null) {\r\n const intent = session.parseIntent(match[0]);\r\n if (intent) {\r\n session.defineIntent(intent);\r\n count++;\r\n }\r\n }\r\n\r\n if (count === 0) {\r\n return { output: formatWarning('No intents found in file') };\r\n }\r\n\r\n return { \r\n output: formatSuccess(`Loaded ${count} intent(s) from ${filePath}`) \r\n };\r\n } catch (error) {\r\n return { \r\n output: formatError(`Failed to load: ${error instanceof Error ? error.message : String(error)}`) \r\n };\r\n }\r\n },\r\n },\r\n\r\n {\r\n name: 'list',\r\n aliases: ['ls'],\r\n description: 'List all defined intents',\r\n usage: ':list',\r\n handler: (args, session) => {\r\n const intents = session.getAllIntents();\r\n\r\n if (intents.length === 0) {\r\n return { output: 'No intents defined.' };\r\n }\r\n\r\n const lines = [''];\r\n\r\n for (const intent of intents) {\r\n const preCount = intent.preconditions.length;\r\n const postCount = intent.postconditions.length;\r\n const invCount = intent.invariants.length;\r\n\r\n const parts: string[] = [];\r\n if (preCount > 0) parts.push(`${preCount} pre`);\r\n if (postCount > 0) parts.push(`${postCount} post`);\r\n if (invCount > 0) parts.push(`${invCount} invariant`);\r\n\r\n const summary = parts.length > 0 ? ` (${parts.join(', ')})` : '';\r\n lines.push(` ${colors.cyan}${intent.name}${colors.reset}${summary}`);\r\n }\r\n\r\n lines.push('');\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n\r\n {\r\n name: 'inspect',\r\n aliases: ['i', 'show'],\r\n description: 'Show full details of an intent',\r\n usage: ':inspect <intent>',\r\n handler: (args, session) => {\r\n if (args.length === 0) {\r\n // Show summary of all intents\r\n const summary = session.getSummary();\r\n const files = session.getLoadedFiles();\r\n\r\n const lines = [\r\n '',\r\n `${colors.bold}Session Summary${colors.reset}`,\r\n '',\r\n ` Intents: ${summary.intentCount}`,\r\n ` Variables: ${summary.variableCount}`,\r\n ` History: ${summary.historyCount} entries`,\r\n ];\r\n\r\n if (files.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Loaded Files${colors.reset}`);\r\n for (const file of files) {\r\n lines.push(` ${file}`);\r\n }\r\n }\r\n\r\n lines.push('');\r\n return { output: lines.join('\\n') };\r\n }\r\n\r\n const intentName = args[0]!;\r\n const intent = session.getIntent(intentName);\r\n\r\n if (!intent) {\r\n const available = session.getIntentNames().join(', ') || '(none)';\r\n return { \r\n output: formatError(`Unknown intent: ${intentName}\\nAvailable: ${available}`) \r\n };\r\n }\r\n\r\n return { output: formatIntent(intent) };\r\n },\r\n },\r\n\r\n {\r\n name: 'export',\r\n aliases: ['save'],\r\n description: 'Export intents to a file',\r\n usage: ':export <file.isl>',\r\n handler: (args, session) => {\r\n if (args.length === 0) {\r\n return { output: 'Usage: :export <file.isl>' };\r\n }\r\n\r\n const filePath = args[0]!;\r\n const fs = require('fs');\r\n const path = require('path');\r\n\r\n try {\r\n const resolvedPath = path.isAbsolute(filePath)\r\n ? filePath\r\n : path.resolve(process.cwd(), filePath);\r\n\r\n const intents = session.getAllIntents();\r\n \r\n if (intents.length === 0) {\r\n return { output: formatWarning('No intents to export') };\r\n }\r\n\r\n const lines: string[] = [];\r\n lines.push('// Exported ISL intents');\r\n lines.push(`// Generated at ${new Date().toISOString()}`);\r\n lines.push('');\r\n\r\n for (const intent of intents) {\r\n lines.push(`intent ${intent.name} {`);\r\n \r\n for (const pre of intent.preconditions) {\r\n lines.push(` pre: ${pre.expression}`);\r\n }\r\n \r\n for (const post of intent.postconditions) {\r\n lines.push(` post: ${post.expression}`);\r\n }\r\n \r\n for (const inv of intent.invariants) {\r\n lines.push(` invariant: ${inv.expression}`);\r\n }\r\n \r\n lines.push('}');\r\n lines.push('');\r\n }\r\n\r\n fs.writeFileSync(resolvedPath, lines.join('\\n'));\r\n return { output: formatSuccess(`Exported ${intents.length} intent(s) to ${filePath}`) };\r\n } catch (error) {\r\n return { \r\n output: formatError(`Failed to export: ${error instanceof Error ? error.message : String(error)}`) \r\n };\r\n }\r\n },\r\n },\r\n];\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Code Generation Helpers\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction generateTypeScript(intent: Intent): string {\r\n const lines = [\r\n `${colors.gray}// Generated TypeScript${colors.reset}`,\r\n `interface ${intent.name}Contract {`,\r\n ];\r\n\r\n if (intent.preconditions.length > 0) {\r\n for (const pre of intent.preconditions) {\r\n const varName = extractVariableName(pre.expression);\r\n const type = inferType(pre.expression);\r\n lines.push(` pre: (${varName}: ${type}) => boolean;`);\r\n }\r\n }\r\n\r\n if (intent.postconditions.length > 0) {\r\n for (const post of intent.postconditions) {\r\n const varName = extractVariableName(post.expression);\r\n const type = inferType(post.expression);\r\n lines.push(` post: (${varName}: ${type}) => boolean;`);\r\n }\r\n }\r\n\r\n lines.push('}');\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction generateRust(intent: Intent): string {\r\n const lines = [\r\n `${colors.gray}// Generated Rust${colors.reset}`,\r\n `pub trait ${intent.name}Contract {`,\r\n ];\r\n\r\n if (intent.preconditions.length > 0) {\r\n for (const pre of intent.preconditions) {\r\n const varName = extractVariableName(pre.expression);\r\n const type = inferRustType(pre.expression);\r\n lines.push(` fn check_pre(&self, ${varName}: ${type}) -> bool;`);\r\n }\r\n }\r\n\r\n if (intent.postconditions.length > 0) {\r\n for (const post of intent.postconditions) {\r\n const varName = extractVariableName(post.expression);\r\n const type = inferRustType(post.expression);\r\n lines.push(` fn check_post(&self, ${varName}: ${type}) -> bool;`);\r\n }\r\n }\r\n\r\n lines.push('}');\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction generateGo(intent: Intent): string {\r\n const lines = [\r\n `${colors.gray}// Generated Go${colors.reset}`,\r\n `type ${intent.name}Contract interface {`,\r\n ];\r\n\r\n if (intent.preconditions.length > 0) {\r\n for (const pre of intent.preconditions) {\r\n const varName = extractVariableName(pre.expression);\r\n const type = inferGoType(pre.expression);\r\n lines.push(`\\tCheckPre(${varName} ${type}) bool`);\r\n }\r\n }\r\n\r\n if (intent.postconditions.length > 0) {\r\n for (const post of intent.postconditions) {\r\n const varName = extractVariableName(post.expression);\r\n const type = inferGoType(post.expression);\r\n lines.push(`\\tCheckPost(${varName} ${type}) bool`);\r\n }\r\n }\r\n\r\n lines.push('}');\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction generateOpenAPI(intent: Intent): string {\r\n const lines = [\r\n `${colors.gray}# Generated OpenAPI${colors.reset}`,\r\n `openapi: 3.0.0`,\r\n `paths:`,\r\n ` /${intent.name.toLowerCase()}:`,\r\n ` post:`,\r\n ` summary: ${intent.name}`,\r\n ` requestBody:`,\r\n ` content:`,\r\n ` application/json:`,\r\n ` schema:`,\r\n ` type: object`,\r\n ];\r\n\r\n if (intent.preconditions.length > 0) {\r\n lines.push(` # Preconditions:`);\r\n for (const pre of intent.preconditions) {\r\n lines.push(` # - ${pre.expression}`);\r\n }\r\n }\r\n\r\n lines.push(` responses:`);\r\n lines.push(` '200':`);\r\n lines.push(` description: Success`);\r\n\r\n if (intent.postconditions.length > 0) {\r\n lines.push(` # Postconditions:`);\r\n for (const post of intent.postconditions) {\r\n lines.push(` # - ${post.expression}`);\r\n }\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Utility Functions\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction extractVariableName(expression: string): string {\r\n // Extract the first identifier from the expression\r\n const match = expression.match(/^(\\w+)/);\r\n return match ? match[1]! : 'input';\r\n}\r\n\r\nfunction inferType(expression: string): string {\r\n if (expression.includes('.length')) return 'string';\r\n if (expression.includes('.startsWith')) return 'string';\r\n if (expression.includes('.endsWith')) return 'string';\r\n if (expression.includes('.includes')) return 'string';\r\n if (expression.includes(' > ') || expression.includes(' < ')) return 'number';\r\n return 'unknown';\r\n}\r\n\r\nfunction inferRustType(expression: string): string {\r\n if (expression.includes('.length') || expression.includes('.len()')) return '&str';\r\n if (expression.includes('.starts_with')) return '&str';\r\n if (expression.includes(' > ') || expression.includes(' < ')) return 'i32';\r\n return '&str';\r\n}\r\n\r\nfunction inferGoType(expression: string): string {\r\n if (expression.includes('.length') || expression.includes('len(')) return 'string';\r\n if (expression.includes(' > ') || expression.includes(' < ')) return 'int';\r\n return 'string';\r\n}\r\n\r\nfunction highlightCondition(expression: string): string {\r\n // Highlight the condition expression\r\n return expression\r\n .replace(/(\\w+)\\s*(>|<|>=|<=|==|!=)\\s*(\\d+|\"[^\"]*\")/g, \r\n `${colors.blue}$1${colors.reset} ${colors.yellow}$2${colors.reset} ${colors.green}$3${colors.reset}`)\r\n .replace(/\\b(true|false)\\b/g, `${colors.magenta}$1${colors.reset}`)\r\n .replace(/\\.(length|startsWith|endsWith|includes)/g, `.${colors.cyan}$1${colors.reset}`);\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Command Suggestion (for typos)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Calculate Levenshtein distance between two strings\r\n */\r\nfunction levenshteinDistance(a: string, b: string): number {\r\n const matrix: number[][] = [];\r\n\r\n for (let i = 0; i <= b.length; i++) {\r\n matrix[i] = [i];\r\n }\r\n for (let j = 0; j <= a.length; j++) {\r\n matrix[0]![j] = j;\r\n }\r\n\r\n for (let i = 1; i <= b.length; i++) {\r\n for (let j = 1; j <= a.length; j++) {\r\n const cost = a[j - 1] === b[i - 1] ? 0 : 1;\r\n matrix[i]![j] = Math.min(\r\n matrix[i - 1]![j]! + 1,\r\n matrix[i]![j - 1]! + 1,\r\n matrix[i - 1]![j - 1]! + cost\r\n );\r\n }\r\n }\r\n\r\n return matrix[b.length]![a.length]!;\r\n}\r\n\r\n/**\r\n * Find a similar command name\r\n */\r\nexport function findSimilarCommand(input: string, type: 'meta' | 'isl'): string | null {\r\n const commands = type === 'meta' ? metaCommands : islCommands;\r\n const names = commands.flatMap(c => [c.name, ...c.aliases]);\r\n \r\n let bestMatch: string | null = null;\r\n let bestDistance = Infinity;\r\n\r\n for (const name of names) {\r\n const distance = levenshteinDistance(input.toLowerCase(), name.toLowerCase());\r\n if (distance < bestDistance && distance <= 2) {\r\n bestDistance = distance;\r\n bestMatch = name;\r\n }\r\n }\r\n\r\n return bestMatch;\r\n}\r\n","#!/usr/bin/env node\r\n// ============================================================================\r\n// ISL REPL CLI Entry Point\r\n// ============================================================================\r\n\r\nimport { startREPL } from './repl';\r\n\r\n/**\r\n * Main entry point\r\n */\r\nexport function main(): void {\r\n const args = process.argv.slice(2);\r\n \r\n const options = {\r\n colors: !args.includes('--no-color'),\r\n verbose: args.includes('--verbose') || args.includes('-v'),\r\n };\r\n\r\n // Show help\r\n if (args.includes('--help') || args.includes('-h')) {\r\n console.log(`\r\nISL REPL - Intent Specification Language Interactive Shell\r\n\r\nUsage: isl-repl [options]\r\n\r\nOptions:\r\n --no-color Disable colored output\r\n -v, --verbose Enable verbose output\r\n -h, --help Show this help message\r\n\r\nInside the REPL:\r\n .help Show all commands\r\n .exit Exit the REPL\r\n :check Type check intents\r\n :gen Generate code\r\n :load Load ISL file\r\n :list List intents\r\n\r\nExample:\r\n $ isl-repl\r\n isl> intent Greeting {\r\n ...> pre: name.length > 0\r\n ...> post: result.startsWith(\"Hello\")\r\n ...> }\r\n ✓ Intent 'Greeting' defined (1 pre, 1 post)\r\n`);\r\n process.exit(0);\r\n }\r\n\r\n startREPL(options);\r\n}\r\n\r\n// Run if executed directly\r\nif (require.main === module) {\r\n main();\r\n}\r\n"],"mappings":"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","names":["fs","path","fs","path","lines","intent","fs","path","intent"]}
1
+ {"version":3,"sources":["../src/repl.ts","../src/session.ts","../src/history.ts","../src/completions.ts","../src/commands.ts","../src/formatter.ts","../src/cli.ts"],"sourcesContent":["// ============================================================================\r\n// ISL REPL - Core REPL Loop\r\n// ============================================================================\r\n\r\nimport * as readline from 'readline';\r\nimport { Session, Intent } from './session';\r\nimport { History } from './history';\r\nimport { CompletionProvider, createCompleter } from './completions';\r\nimport { formatSuccess, formatError, formatWarning, colors, highlightISL } from './formatter';\r\nimport {\r\n MetaCommand,\r\n metaCommands,\r\n findSimilarCommand,\r\n} from './commands';\r\n\r\nconst VERSION = '0.1.0';\r\nconst PROMPT = `${colors.cyan}isl>${colors.reset} `;\r\nconst CONTINUATION_PROMPT = `${colors.cyan}...>${colors.reset} `;\r\n\r\nexport interface REPLOptions {\r\n colors?: boolean;\r\n verbose?: boolean;\r\n historyFile?: string;\r\n /** Load an ISL file on startup */\r\n load?: string;\r\n /** Set initial evaluation context (JSON string) */\r\n context?: string;\r\n /** Parse-only mode (non-interactive, for piped input) */\r\n parseOnly?: boolean;\r\n}\r\n\r\n/**\r\n * ISL REPL - Interactive Read-Eval-Print Loop\r\n */\r\nexport class ISLREPL {\r\n private session: Session;\r\n private history: History;\r\n private completionProvider: CompletionProvider;\r\n private rl: readline.Interface | null = null;\r\n private buffer: string[] = [];\r\n private braceCount = 0;\r\n private options: REPLOptions;\r\n private running = false;\r\n\r\n constructor(options: REPLOptions = {}) {\r\n this.options = {\r\n colors: options.colors !== false,\r\n verbose: options.verbose ?? false,\r\n historyFile: options.historyFile,\r\n load: options.load,\r\n context: options.context,\r\n parseOnly: options.parseOnly ?? false,\r\n };\r\n\r\n this.session = new Session({ colors: this.options.colors });\r\n this.history = new History({\r\n historyFile: this.options.historyFile,\r\n });\r\n this.completionProvider = new CompletionProvider(this.session);\r\n }\r\n\r\n /**\r\n * Start the REPL\r\n */\r\n start(): void {\r\n if (this.running) return;\r\n this.running = true;\r\n\r\n // Apply startup options\r\n this.applyStartupOptions();\r\n\r\n // Handle pipe mode (non-interactive)\r\n if (this.options.parseOnly || !process.stdin.isTTY) {\r\n this.runPipeMode();\r\n return;\r\n }\r\n\r\n // Load history\r\n this.history.load();\r\n\r\n // Create readline interface with tab completion\r\n this.rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n prompt: PROMPT,\r\n completer: createCompleter(this.completionProvider),\r\n terminal: true,\r\n });\r\n\r\n // Print banner\r\n this.printBanner();\r\n this.rl.prompt();\r\n\r\n // Handle line input\r\n this.rl.on('line', (line: string) => {\r\n this.handleLine(line);\r\n if (this.rl && this.running) {\r\n this.rl.setPrompt(this.braceCount > 0 ? CONTINUATION_PROMPT : PROMPT);\r\n this.rl.prompt();\r\n }\r\n });\r\n\r\n // Handle close (Ctrl+D)\r\n this.rl.on('close', () => {\r\n this.exit();\r\n });\r\n\r\n // Handle SIGINT (Ctrl+C)\r\n this.rl.on('SIGINT', () => {\r\n if (this.buffer.length > 0) {\r\n // Cancel multi-line input\r\n this.buffer = [];\r\n this.braceCount = 0;\r\n process.stdout.write('\\n' + formatWarning('Input cancelled') + '\\n');\r\n this.rl!.setPrompt(PROMPT);\r\n this.rl!.prompt();\r\n } else {\r\n process.stdout.write('\\n' + formatWarning('Use .exit to quit') + '\\n');\r\n this.rl!.prompt();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Apply startup options (--load, --context)\r\n */\r\n private applyStartupOptions(): void {\r\n if (this.options.context) {\r\n const result = this.session.setEvalContext(this.options.context);\r\n if (result.success) {\r\n process.stdout.write(\r\n formatSuccess(`Context set (${result.count} variable${result.count !== 1 ? 's' : ''})`) + '\\n'\r\n );\r\n } else {\r\n process.stdout.write(formatError(`Invalid context JSON: ${result.error}`) + '\\n');\r\n }\r\n }\r\n\r\n if (this.options.load) {\r\n const loadCmd = metaCommands.find(c => c.name === 'load');\r\n if (loadCmd) {\r\n const result = loadCmd.handler([this.options.load], this.session, this);\r\n if (result.output) {\r\n process.stdout.write(result.output + '\\n');\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Run in pipe mode (read all stdin, parse, and output)\r\n */\r\n private runPipeMode(): void {\r\n let input = '';\r\n\r\n process.stdin.setEncoding('utf-8');\r\n process.stdin.on('data', (chunk: string) => {\r\n input += chunk;\r\n });\r\n\r\n process.stdin.on('end', () => {\r\n const trimmed = input.trim();\r\n if (!trimmed) {\r\n process.exit(0);\r\n return;\r\n }\r\n\r\n // If --parse mode, just parse and show AST\r\n if (this.options.parseOnly) {\r\n const parseCmd = metaCommands.find(c => c.name === 'parse');\r\n if (parseCmd) {\r\n const result = parseCmd.handler(trimmed.split(' '), this.session, this);\r\n if (result.output) {\r\n process.stdout.write(result.output + '\\n');\r\n }\r\n }\r\n } else {\r\n // Otherwise, process line by line\r\n const lines = trimmed.split('\\n');\r\n for (const line of lines) {\r\n this.handleLine(line);\r\n }\r\n }\r\n\r\n process.exit(0);\r\n });\r\n }\r\n\r\n /**\r\n * Print the welcome banner\r\n */\r\n private printBanner(): void {\r\n const banner = `\r\n${colors.cyan}╔═══════════════════════════════════════════════════════════════╗\r\n║ ║\r\n║ ██╗███████╗██╗ ██████╗ ███████╗██████╗ ██╗ ║\r\n║ ██║██╔════╝██║ ██╔══██╗██╔════╝██╔══██╗██║ ║\r\n║ ██║███████╗██║ ██████╔╝█████╗ ██████╔╝██║ ║\r\n║ ██║╚════██║██║ ██╔══██╗██╔══╝ ██╔═══╝ ██║ ║\r\n║ ██║███████║███████╗ ██║ ██║███████╗██║ ███████╗ ║\r\n║ ╚═╝╚══════╝╚══════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚══════╝ ║\r\n║ ║\r\n╚═══════════════════════════════════════════════════════════════╝${colors.reset}\r\n\r\n${colors.bold}ISL v${VERSION}${colors.reset} — Intent Specification Language\r\nType ${colors.cyan}.help${colors.reset} for commands, ${colors.cyan}.exit${colors.reset} to quit\r\n`;\r\n process.stdout.write(banner);\r\n }\r\n\r\n /**\r\n * Handle a line of input\r\n */\r\n handleLine(line: string): void {\r\n const trimmed = line.trim();\r\n\r\n // Handle empty line\r\n if (!trimmed && this.buffer.length === 0) {\r\n return;\r\n }\r\n\r\n // Handle dot commands (. prefix) - only at start, not in multi-line\r\n if (trimmed.startsWith('.') && this.buffer.length === 0) {\r\n this.handleDotCommand(trimmed);\r\n return;\r\n }\r\n\r\n // Handle colon commands (: prefix) as aliases — redirect to dot commands\r\n if (trimmed.startsWith(':') && this.buffer.length === 0) {\r\n this.handleDotCommand('.' + trimmed.slice(1));\r\n return;\r\n }\r\n\r\n // Track braces for multi-line input\r\n this.braceCount += (line.match(/\\{/g) || []).length;\r\n this.braceCount -= (line.match(/\\}/g) || []).length;\r\n this.buffer.push(line);\r\n\r\n // Execute when braces are balanced\r\n if (this.braceCount <= 0) {\r\n const code = this.buffer.join('\\n');\r\n this.buffer = [];\r\n this.braceCount = 0;\r\n\r\n // Add to history\r\n this.history.add(code);\r\n this.session.addToHistory(code);\r\n\r\n // Evaluate the code\r\n this.evaluate(code);\r\n }\r\n }\r\n\r\n /**\r\n * Handle a dot command (. prefix)\r\n */\r\n private handleDotCommand(input: string): void {\r\n const parts = input.slice(1).split(/\\s+/);\r\n const cmdName = parts[0]?.toLowerCase() || '';\r\n const args = parts.slice(1);\r\n\r\n // For .context and .eval, join args back since they may contain spaces/JSON\r\n const rawArgs = input.slice(1 + (cmdName.length || 0)).trim();\r\n\r\n const command = metaCommands.find(\r\n c => c.name === cmdName || c.aliases.includes(cmdName)\r\n );\r\n\r\n if (command) {\r\n this.history.add(input);\r\n\r\n // For commands that need raw input (context JSON, eval expressions, parse)\r\n const needsRawArgs = ['context', 'ctx', 'eval', 'e', 'parse', 'p', 'ast', 'load', 'l'];\r\n const effectiveArgs = needsRawArgs.includes(cmdName) && rawArgs\r\n ? [rawArgs]\r\n : args;\r\n\r\n const result = command.handler(effectiveArgs, this.session, this);\r\n if (result.output) {\r\n process.stdout.write(result.output + '\\n');\r\n }\r\n if (result.exit) {\r\n this.exit();\r\n }\r\n } else {\r\n // Try to suggest similar command\r\n const suggestion = findSimilarCommand(cmdName);\r\n if (suggestion) {\r\n process.stdout.write(formatError(`Unknown command: .${cmdName}`) + '\\n');\r\n process.stdout.write(formatWarning(`Did you mean: .${suggestion}?`) + '\\n');\r\n } else {\r\n process.stdout.write(formatError(`Unknown command: .${cmdName}`) + '\\n');\r\n process.stdout.write(`Type ${colors.cyan}.help${colors.reset} for available commands\\n`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate ISL code (multi-line input or bare expressions)\r\n */\r\n private evaluate(code: string): void {\r\n try {\r\n const trimmed = code.trim();\r\n\r\n // Try the real parser first\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const { parse } = require('@isl-lang/parser') as {\r\n parse: (source: string, filename?: string) => {\r\n success: boolean;\r\n domain?: Record<string, unknown>;\r\n errors: Array<{\r\n message: string;\r\n severity?: string;\r\n location?: { line: number; column: number };\r\n }>;\r\n };\r\n };\r\n\r\n // Wrap bare constructs in a domain if needed\r\n let parseInput = trimmed;\r\n const needsWrapper = !trimmed.startsWith('domain ');\r\n if (needsWrapper) {\r\n parseInput = `domain _REPL { version: \"0.0.1\"\\n${trimmed}\\n}`;\r\n }\r\n\r\n const result = parse(parseInput, '<repl>');\r\n\r\n if (result.errors.length > 0) {\r\n // Show errors with inline diagnostics\r\n for (const err of result.errors) {\r\n const loc = err.location;\r\n if (loc) {\r\n // Adjust line number if we wrapped\r\n const adjustedLine = needsWrapper ? Math.max(1, loc.line - 1) : loc.line;\r\n const lines = trimmed.split('\\n');\r\n const errorLine = lines[adjustedLine - 1] || '';\r\n\r\n process.stdout.write(\r\n `${colors.red}\\u2717 Error at line ${adjustedLine}, col ${loc.column}:${colors.reset}\\n`\r\n );\r\n process.stdout.write(` ${errorLine}\\n`);\r\n process.stdout.write(` ${' '.repeat(Math.max(0, loc.column - 1))}${colors.red}^^^^^${colors.reset}\\n`);\r\n\r\n // Try to suggest corrections for unknown types\r\n const typeMatch = err.message.match(/Unknown type '(\\w+)'/i) ||\r\n err.message.match(/unexpected.*'(\\w+)'/i);\r\n if (typeMatch) {\r\n const suggestion = suggestCorrection(typeMatch[1]!);\r\n if (suggestion) {\r\n process.stdout.write(\r\n ` ${colors.yellow}Did you mean '${suggestion}'?${colors.reset}\\n`\r\n );\r\n }\r\n } else {\r\n process.stdout.write(` ${err.message}\\n`);\r\n }\r\n } else {\r\n process.stdout.write(formatError(err.message) + '\\n');\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (result.domain) {\r\n this.session.setDomainAST(result.domain);\r\n const domain = result.domain as {\r\n name?: { name?: string };\r\n entities?: Array<{ name?: { name?: string } }>;\r\n behaviors?: Array<{ name?: { name?: string } }>;\r\n invariants?: unknown[];\r\n };\r\n\r\n if (needsWrapper) {\r\n // Show summary of what was defined\r\n const entityCount = domain.entities?.length ?? 0;\r\n const behaviorCount = domain.behaviors?.length ?? 0;\r\n const parts: string[] = [];\r\n if (entityCount > 0) parts.push(`${entityCount} entit${entityCount === 1 ? 'y' : 'ies'}`);\r\n if (behaviorCount > 0) parts.push(`${behaviorCount} behavior${behaviorCount === 1 ? '' : 's'}`);\r\n\r\n if (parts.length > 0) {\r\n process.stdout.write(\r\n formatSuccess(`Parsed: ${parts.join(', ')}`) + '\\n'\r\n );\r\n } else {\r\n process.stdout.write(formatSuccess('Parsed successfully') + '\\n');\r\n }\r\n } else {\r\n const name = domain.name?.name ?? 'Unknown';\r\n const entityCount = domain.entities?.length ?? 0;\r\n const behaviorCount = domain.behaviors?.length ?? 0;\r\n\r\n process.stdout.write(\r\n formatSuccess(\r\n `Parsed: domain ${name} (${entityCount} entit${entityCount === 1 ? 'y' : 'ies'}, ${behaviorCount} behavior${behaviorCount === 1 ? '' : 's'})`\r\n ) + '\\n'\r\n );\r\n }\r\n return;\r\n }\r\n } catch {\r\n // Real parser not available — fall through to built-in handling\r\n }\r\n\r\n // Fallback: Built-in intent/behavior parsing\r\n if (trimmed.startsWith('intent ') || trimmed.startsWith('behavior ')) {\r\n this.evaluateIntent(trimmed);\r\n return;\r\n }\r\n\r\n // For domain blocks without the real parser\r\n if (trimmed.startsWith('domain ')) {\r\n process.stdout.write(formatSuccess('Parsed domain block') + '\\n');\r\n return;\r\n }\r\n\r\n // Unknown input\r\n process.stdout.write(\r\n formatWarning(`Cannot evaluate: ${trimmed.split('\\n')[0]}...`) + '\\n'\r\n );\r\n process.stdout.write(\r\n `Use ${colors.cyan}.help${colors.reset} for available commands\\n`\r\n );\r\n } catch (error) {\r\n this.printError(error);\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate an intent definition\r\n */\r\n private evaluateIntent(code: string): void {\r\n const intent = this.session.parseIntent(code);\r\n\r\n if (intent) {\r\n this.session.defineIntent(intent);\r\n\r\n const preCount = intent.preconditions.length;\r\n const postCount = intent.postconditions.length;\r\n const invCount = intent.invariants.length;\r\n\r\n const parts: string[] = [];\r\n if (preCount > 0) parts.push(`${preCount} pre`);\r\n if (postCount > 0) parts.push(`${postCount} post`);\r\n if (invCount > 0) parts.push(`${invCount} invariant`);\r\n\r\n const summary = parts.length > 0 ? ` (${parts.join(', ')})` : '';\r\n process.stdout.write(\r\n formatSuccess(`Intent '${intent.name}' defined${summary}`) + '\\n'\r\n );\r\n } else {\r\n // Try parsing as behavior\r\n const behaviorMatch = code.match(/^behavior\\s+(\\w+)\\s*\\{([\\s\\S]*)\\}$/);\r\n if (behaviorMatch) {\r\n const name = behaviorMatch[1]!;\r\n const body = behaviorMatch[2]!;\r\n\r\n const newIntent: Intent = {\r\n name,\r\n preconditions: [],\r\n postconditions: [],\r\n invariants: [],\r\n scenarios: [],\r\n rawSource: code,\r\n };\r\n\r\n const preSection = body.match(/pre(?:conditions)?\\s*\\{([^}]*)\\}/s);\r\n if (preSection) {\r\n for (const line of preSection[1]!.trim().split('\\n')) {\r\n const expr = line.trim().replace(/^-\\s*/, '').trim();\r\n if (expr) newIntent.preconditions.push({ expression: expr });\r\n }\r\n }\r\n\r\n const postSection = body.match(/post(?:conditions)?\\s*\\{([^}]*)\\}/s);\r\n if (postSection) {\r\n for (const line of postSection[1]!.trim().split('\\n')) {\r\n const expr = line.trim().replace(/^-\\s*/, '').trim();\r\n if (expr) newIntent.postconditions.push({ expression: expr });\r\n }\r\n }\r\n\r\n this.session.defineIntent(newIntent);\r\n\r\n const parts: string[] = [];\r\n if (newIntent.preconditions.length > 0) parts.push(`${newIntent.preconditions.length} pre`);\r\n if (newIntent.postconditions.length > 0) parts.push(`${newIntent.postconditions.length} post`);\r\n const summary = parts.length > 0 ? ` (${parts.join(', ')})` : '';\r\n process.stdout.write(\r\n formatSuccess(`Intent '${name}' defined${summary}`) + '\\n'\r\n );\r\n } else {\r\n process.stdout.write(formatError('Failed to parse intent definition') + '\\n');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Print an error\r\n */\r\n private printError(error: unknown): void {\r\n if (error instanceof Error) {\r\n process.stdout.write(formatError(error.message) + '\\n');\r\n if (this.options.verbose && error.stack) {\r\n process.stdout.write(colors.gray + error.stack + colors.reset + '\\n');\r\n }\r\n } else {\r\n process.stdout.write(formatError(String(error)) + '\\n');\r\n }\r\n }\r\n\r\n /**\r\n * Exit the REPL\r\n */\r\n exit(): void {\r\n this.running = false;\r\n this.history.save();\r\n process.stdout.write(`\\n${colors.yellow}Goodbye!${colors.reset}\\n`);\r\n if (this.rl) {\r\n this.rl.close();\r\n }\r\n process.exit(0);\r\n }\r\n\r\n /**\r\n * Get the session\r\n */\r\n getSession(): Session {\r\n return this.session;\r\n }\r\n\r\n /**\r\n * Get history\r\n */\r\n getHistory(): History {\r\n return this.history;\r\n }\r\n\r\n /**\r\n * Execute a single command and return result (for testing)\r\n */\r\n async executeOnce(input: string): Promise<{ success: boolean; output?: string; error?: string }> {\r\n const trimmed = input.trim();\r\n\r\n if (trimmed.startsWith('.') || trimmed.startsWith(':')) {\r\n const normalized = trimmed.startsWith(':') ? '.' + trimmed.slice(1) : trimmed;\r\n const parts = normalized.slice(1).split(/\\s+/);\r\n const cmdName = parts[0]?.toLowerCase() || '';\r\n const rawArgs = normalized.slice(1 + (cmdName.length || 0)).trim();\r\n\r\n const command = metaCommands.find(\r\n c => c.name === cmdName || c.aliases.includes(cmdName)\r\n );\r\n\r\n if (command) {\r\n const needsRawArgs = ['context', 'ctx', 'eval', 'e', 'parse', 'p', 'ast', 'load', 'l'];\r\n const effectiveArgs = needsRawArgs.includes(cmdName) && rawArgs\r\n ? [rawArgs]\r\n : parts.slice(1);\r\n\r\n const result = command.handler(effectiveArgs, this.session, this);\r\n return { success: true, output: result.output };\r\n }\r\n return { success: false, error: `Unknown command: ${cmdName}` };\r\n }\r\n\r\n // Intent definition\r\n if (trimmed.startsWith('intent ') || trimmed.startsWith('behavior ')) {\r\n const intent = this.session.parseIntent(trimmed);\r\n if (intent) {\r\n this.session.defineIntent(intent);\r\n return { success: true, output: `Intent '${intent.name}' defined` };\r\n }\r\n return { success: false, error: 'Failed to parse intent' };\r\n }\r\n\r\n return { success: false, error: 'Unknown input' };\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Type Suggestion Helper\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst KNOWN_TYPES = [\r\n 'String', 'Int', 'Decimal', 'Boolean', 'UUID', 'Timestamp', 'Duration',\r\n 'List', 'Map', 'Optional', 'Number',\r\n];\r\n\r\nfunction suggestCorrection(typo: string): string | null {\r\n const lower = typo.toLowerCase();\r\n for (const t of KNOWN_TYPES) {\r\n if (t.toLowerCase() === lower) return t;\r\n // Simple similarity: same start, within 2 chars diff\r\n if (t.toLowerCase().startsWith(lower.slice(0, 3)) &&\r\n Math.abs(t.length - typo.length) <= 2) {\r\n return t;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Start the REPL\r\n */\r\nexport function startREPL(options?: REPLOptions): ISLREPL {\r\n const repl = new ISLREPL(options);\r\n repl.start();\r\n return repl;\r\n}\r\n","// ============================================================================\r\n// ISL REPL Session State Management\r\n// ============================================================================\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\n/**\r\n * Represents an ISL intent definition\r\n */\r\nexport interface Intent {\r\n name: string;\r\n preconditions: Condition[];\r\n postconditions: Condition[];\r\n invariants: Condition[];\r\n scenarios: Scenario[];\r\n rawSource: string;\r\n}\r\n\r\n/**\r\n * A condition (pre/post/invariant)\r\n */\r\nexport interface Condition {\r\n expression: string;\r\n description?: string;\r\n}\r\n\r\n/**\r\n * A scenario for testing\r\n */\r\nexport interface Scenario {\r\n name: string;\r\n given: string[];\r\n when: string;\r\n then: string[];\r\n}\r\n\r\n/**\r\n * Session configuration\r\n */\r\nexport interface SessionConfig {\r\n colors?: boolean;\r\n verbose?: boolean;\r\n cwd?: string;\r\n}\r\n\r\n/**\r\n * Session state management for the ISL REPL\r\n */\r\nexport class Session {\r\n /** Defined intents in this session */\r\n private intents: Map<string, Intent> = new Map();\r\n \r\n /** Variables set during the session */\r\n private variables: Map<string, unknown> = new Map();\r\n \r\n /** Command history */\r\n private history: string[] = [];\r\n \r\n /** Last evaluation result */\r\n private lastResult: unknown = undefined;\r\n \r\n /** Loaded files */\r\n private loadedFiles: Set<string> = new Set();\r\n \r\n /** Session configuration */\r\n private config: SessionConfig;\r\n\r\n /** Evaluation context (set by .context command) */\r\n private evalContext: Record<string, unknown> = {};\r\n\r\n /** Pre-state context for old() expressions */\r\n private preContext: Record<string, unknown> | null = null;\r\n\r\n /** Loaded domain AST (from real parser) */\r\n private domainAST: unknown = null;\r\n\r\n constructor(config: SessionConfig = {}) {\r\n this.config = {\r\n colors: true,\r\n verbose: false,\r\n cwd: process.cwd(),\r\n ...config,\r\n };\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // Intent Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Define a new intent\r\n */\r\n defineIntent(intent: Intent): void {\r\n this.intents.set(intent.name, intent);\r\n }\r\n\r\n /**\r\n * Get an intent by name\r\n */\r\n getIntent(name: string): Intent | undefined {\r\n return this.intents.get(name);\r\n }\r\n\r\n /**\r\n * Get all defined intents\r\n */\r\n getAllIntents(): Intent[] {\r\n return Array.from(this.intents.values());\r\n }\r\n\r\n /**\r\n * Check if an intent exists\r\n */\r\n hasIntent(name: string): boolean {\r\n return this.intents.has(name);\r\n }\r\n\r\n /**\r\n * Remove an intent\r\n */\r\n removeIntent(name: string): boolean {\r\n return this.intents.delete(name);\r\n }\r\n\r\n /**\r\n * Get intent names for completion\r\n */\r\n getIntentNames(): string[] {\r\n return Array.from(this.intents.keys());\r\n }\r\n\r\n /**\r\n * Parse an intent definition from source code\r\n */\r\n parseIntent(source: string): Intent | null {\r\n const trimmed = source.trim();\r\n \r\n // Match intent declaration: intent Name { ... }\r\n const match = trimmed.match(/^intent\\s+(\\w+)\\s*\\{([\\s\\S]*)\\}$/);\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const name = match[1]!;\r\n const body = match[2]!;\r\n\r\n const intent: Intent = {\r\n name,\r\n preconditions: [],\r\n postconditions: [],\r\n invariants: [],\r\n scenarios: [],\r\n rawSource: source,\r\n };\r\n\r\n // Parse preconditions\r\n const preMatch = body.match(/pre(?:conditions?)?\\s*:\\s*([^\\n]+)/g);\r\n if (preMatch) {\r\n for (const pre of preMatch) {\r\n const expr = pre.replace(/pre(?:conditions?)?\\s*:\\s*/, '').trim();\r\n if (expr) {\r\n intent.preconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n // Parse postconditions\r\n const postMatch = body.match(/post(?:conditions?)?\\s*:\\s*([^\\n]+)/g);\r\n if (postMatch) {\r\n for (const post of postMatch) {\r\n const expr = post.replace(/post(?:conditions?)?\\s*:\\s*/, '').trim();\r\n if (expr) {\r\n intent.postconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n // Parse invariants\r\n const invMatch = body.match(/invariants?\\s*:\\s*([^\\n]+)/g);\r\n if (invMatch) {\r\n for (const inv of invMatch) {\r\n const expr = inv.replace(/invariants?\\s*:\\s*/, '').trim();\r\n if (expr) {\r\n intent.invariants.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n return intent;\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // Variable Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Set a variable\r\n */\r\n setVariable(name: string, value: unknown): void {\r\n this.variables.set(name, value);\r\n }\r\n\r\n /**\r\n * Get a variable\r\n */\r\n getVariable(name: string): unknown {\r\n return this.variables.get(name);\r\n }\r\n\r\n /**\r\n * Get all variables\r\n */\r\n getAllVariables(): Map<string, unknown> {\r\n return new Map(this.variables);\r\n }\r\n\r\n /**\r\n * Check if a variable exists\r\n */\r\n hasVariable(name: string): boolean {\r\n return this.variables.has(name);\r\n }\r\n\r\n /**\r\n * Set the last result (accessible as _)\r\n */\r\n setLastResult(value: unknown): void {\r\n this.lastResult = value;\r\n this.variables.set('_', value);\r\n }\r\n\r\n /**\r\n * Get the last result\r\n */\r\n getLastResult(): unknown {\r\n return this.lastResult;\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // History Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Add to history\r\n */\r\n addToHistory(entry: string): void {\r\n const trimmed = entry.trim();\r\n if (trimmed && (this.history.length === 0 || this.history[this.history.length - 1] !== trimmed)) {\r\n this.history.push(trimmed);\r\n }\r\n }\r\n\r\n /**\r\n * Get history\r\n */\r\n getHistory(count?: number): string[] {\r\n if (count) {\r\n return this.history.slice(-count);\r\n }\r\n return [...this.history];\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // File Loading\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Load intents from an ISL file\r\n */\r\n async loadFile(filePath: string): Promise<{ intents: Intent[]; errors: string[] }> {\r\n const resolvedPath = path.isAbsolute(filePath)\r\n ? filePath\r\n : path.resolve(this.config.cwd!, filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n return { intents: [], errors: [`File not found: ${resolvedPath}`] };\r\n }\r\n\r\n try {\r\n const content = fs.readFileSync(resolvedPath, 'utf-8');\r\n const loadedIntents: Intent[] = [];\r\n const errors: string[] = [];\r\n\r\n // Find all intent definitions in the file\r\n const intentRegex = /intent\\s+(\\w+)\\s*\\{[^}]*(?:\\{[^}]*\\}[^}]*)*\\}/g;\r\n let match;\r\n \r\n while ((match = intentRegex.exec(content)) !== null) {\r\n const intent = this.parseIntent(match[0]);\r\n if (intent) {\r\n this.defineIntent(intent);\r\n loadedIntents.push(intent);\r\n } else {\r\n errors.push(`Failed to parse intent starting at position ${match.index}`);\r\n }\r\n }\r\n\r\n // Also try to parse domain-style ISL with behaviors\r\n const behaviorRegex = /behavior\\s+(\\w+)\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}/g;\r\n while ((match = behaviorRegex.exec(content)) !== null) {\r\n const intent = this.parseBehaviorAsIntent(match[1]!, match[2]!);\r\n if (intent) {\r\n this.defineIntent(intent);\r\n loadedIntents.push(intent);\r\n }\r\n }\r\n\r\n this.loadedFiles.add(resolvedPath);\r\n\r\n return { intents: loadedIntents, errors };\r\n } catch (error) {\r\n return {\r\n intents: [],\r\n errors: [`Failed to load file: ${error instanceof Error ? error.message : String(error)}`],\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Parse a behavior block as an intent\r\n */\r\n private parseBehaviorAsIntent(name: string, body: string): Intent | null {\r\n const intent: Intent = {\r\n name,\r\n preconditions: [],\r\n postconditions: [],\r\n invariants: [],\r\n scenarios: [],\r\n rawSource: `behavior ${name} {${body}}`,\r\n };\r\n\r\n // Parse preconditions block\r\n const preSection = body.match(/pre(?:conditions)?\\s*\\{([^}]*)\\}/s);\r\n if (preSection) {\r\n const conditions = preSection[1]!.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n for (const cond of conditions) {\r\n // Remove leading dash if present\r\n const expr = cond.replace(/^-\\s*/, '').trim();\r\n if (expr) {\r\n intent.preconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n // Parse postconditions block\r\n const postSection = body.match(/post(?:conditions)?\\s*\\{([^}]*)\\}/s);\r\n if (postSection) {\r\n const conditions = postSection[1]!.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n for (const cond of conditions) {\r\n const expr = cond.replace(/^-\\s*/, '').trim();\r\n if (expr) {\r\n intent.postconditions.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n // Parse invariants block\r\n const invSection = body.match(/invariants?\\s*\\{([^}]*)\\}/s);\r\n if (invSection) {\r\n const conditions = invSection[1]!.trim().split('\\n').map(l => l.trim()).filter(Boolean);\r\n for (const cond of conditions) {\r\n const expr = cond.replace(/^-\\s*/, '').trim();\r\n if (expr) {\r\n intent.invariants.push({ expression: expr });\r\n }\r\n }\r\n }\r\n\r\n return intent;\r\n }\r\n\r\n /**\r\n * Export session intents to a file\r\n */\r\n async exportToFile(filePath: string): Promise<{ success: boolean; error?: string }> {\r\n const resolvedPath = path.isAbsolute(filePath)\r\n ? filePath\r\n : path.resolve(this.config.cwd!, filePath);\r\n\r\n try {\r\n const lines: string[] = [];\r\n lines.push('// Exported ISL intents');\r\n lines.push(`// Generated at ${new Date().toISOString()}`);\r\n lines.push('');\r\n\r\n for (const intent of this.intents.values()) {\r\n lines.push(`intent ${intent.name} {`);\r\n \r\n for (const pre of intent.preconditions) {\r\n lines.push(` pre: ${pre.expression}`);\r\n }\r\n \r\n for (const post of intent.postconditions) {\r\n lines.push(` post: ${post.expression}`);\r\n }\r\n \r\n for (const inv of intent.invariants) {\r\n lines.push(` invariant: ${inv.expression}`);\r\n }\r\n \r\n lines.push('}');\r\n lines.push('');\r\n }\r\n\r\n fs.writeFileSync(resolvedPath, lines.join('\\n'));\r\n return { success: true };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: `Failed to export: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n }\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // Evaluation Context Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Set evaluation context from JSON string\r\n */\r\n setEvalContext(json: string): { success: boolean; count: number; error?: string } {\r\n try {\r\n const parsed = JSON.parse(json);\r\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\r\n return { success: false, count: 0, error: 'Context must be a JSON object' };\r\n }\r\n this.evalContext = parsed as Record<string, unknown>;\r\n for (const [key, value] of Object.entries(this.evalContext)) {\r\n this.variables.set(key, value);\r\n }\r\n return { success: true, count: Object.keys(parsed as object).length };\r\n } catch (e) {\r\n return { success: false, count: 0, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n /**\r\n * Set pre-state context for old() expressions\r\n */\r\n setPreContext(json: string): { success: boolean; error?: string } {\r\n try {\r\n const parsed = JSON.parse(json);\r\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\r\n return { success: false, error: 'Pre-context must be a JSON object' };\r\n }\r\n this.preContext = parsed as Record<string, unknown>;\r\n return { success: true };\r\n } catch (e) {\r\n return { success: false, error: e instanceof Error ? e.message : String(e) };\r\n }\r\n }\r\n\r\n /**\r\n * Get evaluation context\r\n */\r\n getEvalContext(): Record<string, unknown> {\r\n return { ...this.evalContext };\r\n }\r\n\r\n /**\r\n * Get pre-state context\r\n */\r\n getPreContext(): Record<string, unknown> | null {\r\n return this.preContext ? { ...this.preContext } : null;\r\n }\r\n\r\n /**\r\n * Resolve a dot-path against the evaluation context\r\n */\r\n resolveValue(dotPath: string): { found: boolean; value: unknown } {\r\n const parts = dotPath.split('.');\r\n let current: unknown = this.evalContext;\r\n\r\n for (const part of parts) {\r\n if (current === null || current === undefined || typeof current !== 'object') {\r\n return { found: false, value: undefined };\r\n }\r\n current = (current as Record<string, unknown>)[part];\r\n }\r\n\r\n return { found: current !== undefined, value: current };\r\n }\r\n\r\n /**\r\n * Resolve a dot-path against the pre-state context\r\n */\r\n resolvePreValue(dotPath: string): { found: boolean; value: unknown } {\r\n if (!this.preContext) {\r\n return { found: false, value: undefined };\r\n }\r\n const parts = dotPath.split('.');\r\n let current: unknown = this.preContext;\r\n\r\n for (const part of parts) {\r\n if (current === null || current === undefined || typeof current !== 'object') {\r\n return { found: false, value: undefined };\r\n }\r\n current = (current as Record<string, unknown>)[part];\r\n }\r\n\r\n return { found: current !== undefined, value: current };\r\n }\r\n\r\n /**\r\n * Set domain AST (from real parser)\r\n */\r\n setDomainAST(ast: unknown): void {\r\n this.domainAST = ast;\r\n }\r\n\r\n /**\r\n * Get domain AST\r\n */\r\n getDomainAST(): unknown {\r\n return this.domainAST;\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────\r\n // State Management\r\n // ─────────────────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Clear all session state\r\n */\r\n clear(): void {\r\n this.intents.clear();\r\n this.variables.clear();\r\n this.lastResult = undefined;\r\n this.loadedFiles.clear();\r\n this.evalContext = {};\r\n this.preContext = null;\r\n this.domainAST = null;\r\n // Keep history\r\n }\r\n\r\n /**\r\n * Get session summary\r\n */\r\n getSummary(): {\r\n intentCount: number;\r\n variableCount: number;\r\n loadedFileCount: number;\r\n historyCount: number;\r\n } {\r\n return {\r\n intentCount: this.intents.size,\r\n variableCount: this.variables.size,\r\n loadedFileCount: this.loadedFiles.size,\r\n historyCount: this.history.length,\r\n };\r\n }\r\n\r\n /**\r\n * Get loaded files\r\n */\r\n getLoadedFiles(): string[] {\r\n return Array.from(this.loadedFiles);\r\n }\r\n\r\n /**\r\n * Get config\r\n */\r\n getConfig(): SessionConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Update config\r\n */\r\n setConfig(config: Partial<SessionConfig>): void {\r\n this.config = { ...this.config, ...config };\r\n }\r\n}\r\n\r\n/**\r\n * Create a new session\r\n */\r\nexport function createSession(config?: SessionConfig): Session {\r\n return new Session(config);\r\n}\r\n","// ============================================================================\r\n// Command History Management\r\n// ============================================================================\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\n\r\n/**\r\n * Command history manager with persistence\r\n */\r\nexport class History {\r\n private entries: string[] = [];\r\n private position: number = -1;\r\n private maxSize: number;\r\n private historyFile: string;\r\n private unsavedCount: number = 0;\r\n private autoSaveThreshold: number = 10;\r\n\r\n constructor(options: {\r\n maxSize?: number;\r\n historyFile?: string;\r\n autoSaveThreshold?: number;\r\n } = {}) {\r\n this.maxSize = options.maxSize ?? 1000;\r\n this.historyFile = options.historyFile ?? this.getDefaultHistoryFile();\r\n this.autoSaveThreshold = options.autoSaveThreshold ?? 10;\r\n }\r\n\r\n /**\r\n * Get default history file path\r\n */\r\n private getDefaultHistoryFile(): string {\r\n const homeDir = os.homedir();\r\n return path.join(homeDir, '.isl_repl_history');\r\n }\r\n\r\n /**\r\n * Load history from file\r\n */\r\n load(): void {\r\n try {\r\n if (fs.existsSync(this.historyFile)) {\r\n const content = fs.readFileSync(this.historyFile, 'utf-8');\r\n this.entries = content\r\n .split('\\n')\r\n .filter(line => line.trim() !== '')\r\n .slice(-this.maxSize);\r\n this.position = this.entries.length;\r\n }\r\n } catch {\r\n // Ignore errors, start with empty history\r\n }\r\n }\r\n\r\n /**\r\n * Save history to file\r\n */\r\n save(): void {\r\n try {\r\n const dir = path.dirname(this.historyFile);\r\n if (!fs.existsSync(dir)) {\r\n fs.mkdirSync(dir, { recursive: true });\r\n }\r\n fs.writeFileSync(this.historyFile, this.entries.join('\\n') + '\\n');\r\n this.unsavedCount = 0;\r\n } catch {\r\n // Ignore save errors\r\n }\r\n }\r\n\r\n /**\r\n * Add entry to history\r\n */\r\n add(entry: string): void {\r\n const trimmed = entry.trim();\r\n if (trimmed === '') return;\r\n\r\n // Don't add duplicates of the last entry\r\n if (this.entries.length > 0 && this.entries[this.entries.length - 1] === trimmed) {\r\n this.position = this.entries.length;\r\n return;\r\n }\r\n\r\n this.entries.push(trimmed);\r\n\r\n // Trim to max size\r\n if (this.entries.length > this.maxSize) {\r\n this.entries = this.entries.slice(-this.maxSize);\r\n }\r\n\r\n this.position = this.entries.length;\r\n this.unsavedCount++;\r\n\r\n // Auto-save periodically\r\n if (this.unsavedCount >= this.autoSaveThreshold) {\r\n this.save();\r\n }\r\n }\r\n\r\n /**\r\n * Get previous entry (for up arrow)\r\n */\r\n previous(): string | null {\r\n if (this.entries.length === 0) return null;\r\n \r\n if (this.position > 0) {\r\n this.position--;\r\n }\r\n \r\n return this.entries[this.position] ?? null;\r\n }\r\n\r\n /**\r\n * Get next entry (for down arrow)\r\n */\r\n next(): string | null {\r\n if (this.entries.length === 0) return null;\r\n \r\n if (this.position < this.entries.length - 1) {\r\n this.position++;\r\n return this.entries[this.position] ?? null;\r\n }\r\n \r\n this.position = this.entries.length;\r\n return '';\r\n }\r\n\r\n /**\r\n * Reset position to end\r\n */\r\n resetPosition(): void {\r\n this.position = this.entries.length;\r\n }\r\n\r\n /**\r\n * Search history for entries containing text\r\n */\r\n search(text: string): string[] {\r\n const lower = text.toLowerCase();\r\n return this.entries.filter(entry => \r\n entry.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n /**\r\n * Search backwards from current position\r\n */\r\n searchBackward(text: string): string | null {\r\n const lower = text.toLowerCase();\r\n for (let i = this.position - 1; i >= 0; i--) {\r\n if (this.entries[i]!.toLowerCase().includes(lower)) {\r\n this.position = i;\r\n return this.entries[i]!;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Search forward from current position\r\n */\r\n searchForward(text: string): string | null {\r\n const lower = text.toLowerCase();\r\n for (let i = this.position + 1; i < this.entries.length; i++) {\r\n if (this.entries[i]!.toLowerCase().includes(lower)) {\r\n this.position = i;\r\n return this.entries[i]!;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get all entries\r\n */\r\n getAll(): string[] {\r\n return [...this.entries];\r\n }\r\n\r\n /**\r\n * Get recent entries\r\n */\r\n getRecent(count: number): string[] {\r\n return this.entries.slice(-count);\r\n }\r\n\r\n /**\r\n * Clear history\r\n */\r\n clear(): void {\r\n this.entries = [];\r\n this.position = 0;\r\n this.save();\r\n }\r\n\r\n /**\r\n * Get history size\r\n */\r\n get size(): number {\r\n return this.entries.length;\r\n }\r\n\r\n /**\r\n * Get current position\r\n */\r\n get currentPosition(): number {\r\n return this.position;\r\n }\r\n}\r\n\r\n/**\r\n * In-memory history (no persistence)\r\n */\r\nexport class MemoryHistory extends History {\r\n constructor(maxSize: number = 1000) {\r\n super({ maxSize, historyFile: '' });\r\n }\r\n\r\n override load(): void {\r\n // No-op for memory history\r\n }\r\n\r\n override save(): void {\r\n // No-op for memory history\r\n }\r\n}\r\n","// ============================================================================\r\n// ISL REPL Tab Completion\r\n// Intelligent completions for commands and expressions\r\n// ============================================================================\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { Session } from './session';\r\nimport { metaCommands, islCommands } from './commands';\r\n\r\n/**\r\n * Completion item\r\n */\r\nexport interface CompletionItem {\r\n text: string;\r\n type: 'command' | 'intent' | 'keyword' | 'variable' | 'file';\r\n description?: string;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Constants\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * ISL keywords\r\n */\r\nexport const KEYWORDS: CompletionItem[] = [\r\n // Structure keywords\r\n { text: 'domain', type: 'keyword', description: 'Define a domain' },\r\n { text: 'entity', type: 'keyword', description: 'Define an entity' },\r\n { text: 'behavior', type: 'keyword', description: 'Define a behavior' },\r\n { text: 'intent', type: 'keyword', description: 'Define an intent' },\r\n { text: 'input', type: 'keyword', description: 'Input block' },\r\n { text: 'output', type: 'keyword', description: 'Output block' },\r\n { text: 'pre', type: 'keyword', description: 'Precondition' },\r\n { text: 'post', type: 'keyword', description: 'Postcondition' },\r\n { text: 'invariant', type: 'keyword', description: 'Invariant' },\r\n { text: 'scenario', type: 'keyword', description: 'Scenario block' },\r\n { text: 'version', type: 'keyword', description: 'Version declaration' },\r\n // Types\r\n { text: 'String', type: 'keyword', description: 'String type' },\r\n { text: 'Number', type: 'keyword', description: 'Number type' },\r\n { text: 'Int', type: 'keyword', description: 'Integer type' },\r\n { text: 'Decimal', type: 'keyword', description: 'Decimal type' },\r\n { text: 'Boolean', type: 'keyword', description: 'Boolean type' },\r\n { text: 'UUID', type: 'keyword', description: 'UUID type' },\r\n { text: 'Timestamp', type: 'keyword', description: 'Timestamp type' },\r\n { text: 'Duration', type: 'keyword', description: 'Duration type' },\r\n { text: 'List', type: 'keyword', description: 'List<T> type' },\r\n { text: 'Map', type: 'keyword', description: 'Map<K,V> type' },\r\n { text: 'Optional', type: 'keyword', description: 'Optional<T> type' },\r\n // Literals and operators\r\n { text: 'true', type: 'keyword', description: 'Boolean true' },\r\n { text: 'false', type: 'keyword', description: 'Boolean false' },\r\n { text: 'null', type: 'keyword', description: 'Null value' },\r\n { text: 'and', type: 'keyword', description: 'Logical AND' },\r\n { text: 'or', type: 'keyword', description: 'Logical OR' },\r\n { text: 'not', type: 'keyword', description: 'Logical NOT' },\r\n { text: 'implies', type: 'keyword', description: 'Logical implication' },\r\n { text: 'forall', type: 'keyword', description: 'Universal quantifier' },\r\n { text: 'exists', type: 'keyword', description: 'Existential quantifier' },\r\n { text: 'in', type: 'keyword', description: 'Membership test' },\r\n { text: 'old', type: 'keyword', description: 'Pre-state value (old(x))' },\r\n];\r\n\r\n/**\r\n * Meta commands (. prefix)\r\n */\r\nexport const META_COMMANDS: CompletionItem[] = metaCommands.map(cmd => ({\r\n text: `.${cmd.name}`,\r\n type: 'command' as const,\r\n description: cmd.description,\r\n}));\r\n\r\n/**\r\n * ISL commands (kept empty for backward compat — all commands use . prefix)\r\n */\r\nexport const ISL_COMMANDS: CompletionItem[] = [];\r\n\r\n/**\r\n * All commands\r\n */\r\nexport const COMMANDS: CompletionItem[] = [...META_COMMANDS];\r\n\r\n/**\r\n * Generate targets for :gen command\r\n */\r\nexport const GEN_TARGETS: CompletionItem[] = [\r\n { text: 'typescript', type: 'keyword', description: 'Generate TypeScript contract' },\r\n { text: 'rust', type: 'keyword', description: 'Generate Rust contract' },\r\n { text: 'go', type: 'keyword', description: 'Generate Go contract' },\r\n { text: 'openapi', type: 'keyword', description: 'Generate OpenAPI schema' },\r\n];\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Completion Provider\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Provides intelligent completions based on context\r\n */\r\nexport class CompletionProvider {\r\n constructor(private session: Session) {}\r\n\r\n /**\r\n * Update the session reference\r\n */\r\n setSession(session: Session): void {\r\n this.session = session;\r\n }\r\n\r\n /**\r\n * Get completions for a line\r\n */\r\n complete(line: string): [CompletionItem[], string] {\r\n const trimmed = line.trimStart();\r\n\r\n // Meta command completion (. prefix)\r\n if (trimmed.startsWith('.')) {\r\n return this.completeMetaCommand(trimmed);\r\n }\r\n\r\n // Legacy ISL command completion (: prefix) — redirect to meta\r\n if (trimmed.startsWith(':')) {\r\n return this.completeMetaCommand('.' + trimmed.slice(1));\r\n }\r\n\r\n // Expression completion\r\n return this.completeExpression(trimmed);\r\n }\r\n\r\n /**\r\n * Complete meta commands\r\n */\r\n private completeMetaCommand(line: string): [CompletionItem[], string] {\r\n const parts = line.slice(1).split(/\\s+/);\r\n const cmdPart = parts[0] || '';\r\n\r\n // Just the command prefix - show all meta commands\r\n if (parts.length === 1) {\r\n const matches = META_COMMANDS.filter(c => \r\n c.text.toLowerCase().startsWith(`.${cmdPart.toLowerCase()}`)\r\n );\r\n return [matches.length > 0 ? matches : META_COMMANDS, '.' + cmdPart];\r\n }\r\n\r\n // Command arguments\r\n return [[], line];\r\n }\r\n\r\n /**\r\n * Complete ISL commands\r\n */\r\n private completeISLCommand(line: string): [CompletionItem[], string] {\r\n const parts = line.slice(1).split(/\\s+/);\r\n const cmdPart = parts[0] || '';\r\n const args = parts.slice(1);\r\n\r\n // Just the command prefix - show all ISL commands\r\n if (parts.length === 1) {\r\n const matches = ISL_COMMANDS.filter(c => \r\n c.text.toLowerCase().startsWith(`:${cmdPart.toLowerCase()}`)\r\n );\r\n return [matches.length > 0 ? matches : ISL_COMMANDS, ':' + cmdPart];\r\n }\r\n\r\n // Command-specific argument completion\r\n const cmd = cmdPart.toLowerCase();\r\n \r\n switch (cmd) {\r\n case 'gen':\r\n case 'generate':\r\n case 'g':\r\n return this.completeGenCommand(args);\r\n \r\n case 'check':\r\n case 'c':\r\n case 'inspect':\r\n case 'i':\r\n case 'show':\r\n return this.completeIntentName(args[0] || '');\r\n \r\n case 'load':\r\n case 'l':\r\n case 'export':\r\n case 'save':\r\n return this.completeFilePath(args[0] || '');\r\n \r\n default:\r\n return [[], line];\r\n }\r\n }\r\n\r\n /**\r\n * Complete :gen command arguments\r\n */\r\n private completeGenCommand(args: string[]): [CompletionItem[], string] {\r\n // First argument: target\r\n if (args.length <= 1) {\r\n const partial = args[0] || '';\r\n const matches = GEN_TARGETS.filter(t => \r\n t.text.toLowerCase().startsWith(partial.toLowerCase())\r\n );\r\n return [matches.length > 0 ? matches : GEN_TARGETS, partial];\r\n }\r\n\r\n // Second argument: intent name\r\n return this.completeIntentName(args[1] || '');\r\n }\r\n\r\n /**\r\n * Complete intent names\r\n */\r\n private completeIntentName(partial: string): [CompletionItem[], string] {\r\n const intents = this.session.getAllIntents();\r\n const items: CompletionItem[] = intents.map(intent => ({\r\n text: intent.name,\r\n type: 'intent',\r\n description: `${intent.preconditions.length} pre, ${intent.postconditions.length} post`,\r\n }));\r\n\r\n const matches = items.filter(i => \r\n i.text.toLowerCase().startsWith(partial.toLowerCase())\r\n );\r\n\r\n return [matches.length > 0 ? matches : items, partial];\r\n }\r\n\r\n /**\r\n * Complete file paths\r\n */\r\n private completeFilePath(partial: string): [CompletionItem[], string] {\r\n try {\r\n const dir = path.dirname(partial) || '.';\r\n const base = path.basename(partial);\r\n const resolvedDir = path.resolve(this.session.getConfig().cwd || process.cwd(), dir);\r\n\r\n if (!fs.existsSync(resolvedDir)) {\r\n return [[], partial];\r\n }\r\n\r\n const entries = fs.readdirSync(resolvedDir, { withFileTypes: true });\r\n const items: CompletionItem[] = entries\r\n .filter(e => {\r\n const name = e.name.toLowerCase();\r\n return name.startsWith(base.toLowerCase()) && \r\n (e.isDirectory() || name.endsWith('.isl'));\r\n })\r\n .map(e => ({\r\n text: path.join(dir, e.name + (e.isDirectory() ? '/' : '')),\r\n type: 'file' as const,\r\n description: e.isDirectory() ? 'Directory' : 'ISL file',\r\n }));\r\n\r\n return [items, partial];\r\n } catch {\r\n return [[], partial];\r\n }\r\n }\r\n\r\n /**\r\n * Complete expressions\r\n */\r\n private completeExpression(line: string): [CompletionItem[], string] {\r\n const items: CompletionItem[] = [...KEYWORDS];\r\n\r\n // Add intent names\r\n for (const intent of this.session.getAllIntents()) {\r\n items.push({\r\n text: intent.name,\r\n type: 'intent',\r\n description: 'Defined intent',\r\n });\r\n }\r\n\r\n // Add variables\r\n for (const [name] of this.session.getAllVariables()) {\r\n items.push({\r\n text: name,\r\n type: 'variable',\r\n description: 'Variable',\r\n });\r\n }\r\n\r\n // Add special variable\r\n items.push({\r\n text: '_',\r\n type: 'variable',\r\n description: 'Last result',\r\n });\r\n\r\n // Find partial word at end of line\r\n const match = line.match(/[\\w.]+$/);\r\n const partial = match ? match[0] : '';\r\n\r\n // Filter by partial\r\n const matches = items.filter(i => \r\n i.text.toLowerCase().startsWith(partial.toLowerCase())\r\n );\r\n\r\n return [matches.length > 0 ? matches : items, partial];\r\n }\r\n\r\n /**\r\n * Get all available completions (for help)\r\n */\r\n getAllCompletions(): {\r\n metaCommands: CompletionItem[];\r\n islCommands: CompletionItem[];\r\n keywords: CompletionItem[];\r\n intents: CompletionItem[];\r\n } {\r\n return {\r\n metaCommands: META_COMMANDS,\r\n islCommands: ISL_COMMANDS,\r\n keywords: KEYWORDS,\r\n intents: this.session.getAllIntents().map(i => ({\r\n text: i.name,\r\n type: 'intent' as const,\r\n description: `${i.preconditions.length} pre, ${i.postconditions.length} post`,\r\n })),\r\n };\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Readline Completer Factory\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Create a readline-compatible completer function\r\n */\r\nexport function createCompleter(\r\n provider: CompletionProvider\r\n): (line: string) => [string[], string] {\r\n return (line: string): [string[], string] => {\r\n const [items, partial] = provider.complete(line);\r\n const completions = items.map(i => i.text);\r\n return [completions, partial];\r\n };\r\n}\r\n","// ============================================================================\r\n// ISL REPL Commands\r\n// All commands use the . prefix\r\n// ============================================================================\r\n\r\nimport * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport { Session, Intent } from './session';\r\nimport {\r\n formatSuccess,\r\n formatError,\r\n formatWarning,\r\n formatValue,\r\n formatParseError,\r\n formatTable,\r\n colors,\r\n highlightISL,\r\n highlightExpression,\r\n formatIntent,\r\n} from './formatter';\r\n\r\n// Forward declaration for REPL type\r\ninterface REPL {\r\n exit(): void;\r\n getSession(): Session;\r\n}\r\n\r\n/**\r\n * Command result\r\n */\r\nexport interface CommandResult {\r\n output?: string;\r\n exit?: boolean;\r\n}\r\n\r\n/**\r\n * Meta command definition (. prefix)\r\n */\r\nexport interface MetaCommand {\r\n name: string;\r\n aliases: string[];\r\n description: string;\r\n usage: string;\r\n handler: (args: string[], session: Session, repl: REPL) => CommandResult;\r\n}\r\n\r\n// Keep ISLCommand as alias for backward compat\r\nexport type ISLCommand = MetaCommand;\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Expression Evaluator (for .eval command)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction evaluateExpression(\r\n expr: string,\r\n session: Session\r\n): { value: unknown; error?: string } {\r\n const trimmed = expr.trim();\r\n\r\n // Handle old() function\r\n const oldMatch = trimmed.match(/^old\\((.+)\\)$/);\r\n if (oldMatch) {\r\n const innerPath = oldMatch[1]!.trim();\r\n if (!session.getPreContext()) {\r\n return {\r\n value: undefined,\r\n error: 'old() requires pre-state. Set with .context --pre <json>',\r\n };\r\n }\r\n const { found, value } = session.resolvePreValue(innerPath);\r\n if (!found) {\r\n return { value: undefined, error: `Cannot resolve '${innerPath}' in pre-state context` };\r\n }\r\n return { value };\r\n }\r\n\r\n // Handle parenthesized expression\r\n if (trimmed.startsWith('(') && trimmed.endsWith(')')) {\r\n return evaluateExpression(trimmed.slice(1, -1), session);\r\n }\r\n\r\n // Handle logical NOT\r\n if (trimmed.startsWith('!') || trimmed.startsWith('not ')) {\r\n const inner = trimmed.startsWith('!') ? trimmed.slice(1) : trimmed.slice(4);\r\n const result = evaluateExpression(inner.trim(), session);\r\n if (result.error) return result;\r\n return { value: !result.value };\r\n }\r\n\r\n // Handle binary operators (in priority order)\r\n // We scan right-to-left for && / || so left-associativity works with simple split\r\n for (const [opStr, opFn] of BINARY_OPS) {\r\n const idx = findOperator(trimmed, opStr);\r\n if (idx !== -1) {\r\n const left = trimmed.slice(0, idx).trim();\r\n const right = trimmed.slice(idx + opStr.length).trim();\r\n const lResult = evaluateExpression(left, session);\r\n if (lResult.error) return lResult;\r\n const rResult = evaluateExpression(right, session);\r\n if (rResult.error) return rResult;\r\n return { value: opFn(lResult.value, rResult.value) };\r\n }\r\n }\r\n\r\n // Literals\r\n if (trimmed === 'true') return { value: true };\r\n if (trimmed === 'false') return { value: false };\r\n if (trimmed === 'null') return { value: null };\r\n if (/^-?\\d+$/.test(trimmed)) return { value: parseInt(trimmed, 10) };\r\n if (/^-?\\d+\\.\\d+$/.test(trimmed)) return { value: parseFloat(trimmed) };\r\n if (/^\"([^\"]*)\"$/.test(trimmed)) return { value: trimmed.slice(1, -1) };\r\n if (/^'([^']*)'$/.test(trimmed)) return { value: trimmed.slice(1, -1) };\r\n\r\n // Path resolution against context\r\n if (/^[\\w.]+$/.test(trimmed)) {\r\n const { found, value } = session.resolveValue(trimmed);\r\n if (found) return { value };\r\n\r\n // Try as a session variable\r\n if (session.hasVariable(trimmed)) {\r\n return { value: session.getVariable(trimmed) };\r\n }\r\n }\r\n\r\n return { value: undefined, error: `Cannot evaluate: ${trimmed}` };\r\n}\r\n\r\ntype BinaryOpFn = (a: unknown, b: unknown) => unknown;\r\n\r\nconst BINARY_OPS: [string, BinaryOpFn][] = [\r\n // Logical (lowest precedence — scanned first so they split outermost)\r\n [' || ', (a, b) => Boolean(a) || Boolean(b)],\r\n [' or ', (a, b) => Boolean(a) || Boolean(b)],\r\n [' && ', (a, b) => Boolean(a) && Boolean(b)],\r\n [' and ', (a, b) => Boolean(a) && Boolean(b)],\r\n // Equality\r\n [' == ', (a, b) => a === b || String(a) === String(b)],\r\n [' != ', (a, b) => a !== b && String(a) !== String(b)],\r\n // Comparison\r\n [' >= ', (a, b) => Number(a) >= Number(b)],\r\n [' <= ', (a, b) => Number(a) <= Number(b)],\r\n [' > ', (a, b) => Number(a) > Number(b)],\r\n [' < ', (a, b) => Number(a) < Number(b)],\r\n // Arithmetic\r\n [' + ', (a, b) => {\r\n if (typeof a === 'string' || typeof b === 'string') return String(a) + String(b);\r\n return Number(a) + Number(b);\r\n }],\r\n [' - ', (a, b) => Number(a) - Number(b)],\r\n [' * ', (a, b) => Number(a) * Number(b)],\r\n [' / ', (a, b) => {\r\n const d = Number(b);\r\n if (d === 0) return Infinity;\r\n return Number(a) / d;\r\n }],\r\n];\r\n\r\n/**\r\n * Find an operator in an expression, respecting parentheses and strings.\r\n * Scans right-to-left from the very end so string quotes are processed\r\n * in the correct (closing → opening) order.\r\n * Returns the index of the operator or -1.\r\n */\r\nfunction findOperator(expr: string, op: string): number {\r\n let depth = 0;\r\n let inString: string | null = null;\r\n\r\n for (let i = expr.length - 1; i >= 0; i--) {\r\n const ch = expr[i]!;\r\n\r\n if (inString) {\r\n if (ch === inString && (i === 0 || expr[i - 1] !== '\\\\')) inString = null;\r\n continue;\r\n }\r\n if (ch === '\"' || ch === \"'\") {\r\n inString = ch;\r\n continue;\r\n }\r\n if (ch === '(') depth--;\r\n if (ch === ')') depth++;\r\n\r\n if (depth === 0 && i + op.length <= expr.length && expr.slice(i, i + op.length) === op) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// AST Pretty Printer (for .parse command)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction prettyPrintAST(node: unknown, indent: number = 0): string {\r\n const pad = ' '.repeat(indent);\r\n\r\n if (node === null || node === undefined) return `${pad}${colors.gray}null${colors.reset}`;\r\n if (typeof node === 'string') return `${pad}${colors.green}\"${node}\"${colors.reset}`;\r\n if (typeof node === 'number') return `${pad}${colors.cyan}${node}${colors.reset}`;\r\n if (typeof node === 'boolean') return `${pad}${colors.magenta}${node}${colors.reset}`;\r\n\r\n if (Array.isArray(node)) {\r\n if (node.length === 0) return `${pad}[]`;\r\n const items = node.map(item => prettyPrintAST(item, indent + 1));\r\n return `${pad}[\\n${items.join(',\\n')}\\n${pad}]`;\r\n }\r\n\r\n if (typeof node === 'object') {\r\n const obj = node as Record<string, unknown>;\r\n const kind = obj['kind'] as string | undefined;\r\n const entries = Object.entries(obj).filter(\r\n ([k, v]) => k !== 'location' && v !== undefined && !(Array.isArray(v) && v.length === 0)\r\n );\r\n\r\n if (entries.length === 0) return `${pad}{}`;\r\n\r\n const header = kind\r\n ? `${pad}${colors.yellow}${kind}${colors.reset} {`\r\n : `${pad}{`;\r\n\r\n const body = entries\r\n .filter(([k]) => k !== 'kind')\r\n .map(([k, v]) => {\r\n const valStr =\r\n typeof v === 'object' && v !== null\r\n ? '\\n' + prettyPrintAST(v, indent + 2)\r\n : ' ' + prettyPrintAST(v, 0).trim();\r\n return `${pad} ${colors.blue}${k}${colors.reset}:${valStr}`;\r\n });\r\n\r\n return `${header}\\n${body.join('\\n')}\\n${pad}}`;\r\n }\r\n\r\n return `${pad}${String(node)}`;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// ISL Type Suggestion (for diagnostics)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nconst ISL_TYPES = [\r\n 'String', 'Int', 'Decimal', 'Boolean', 'UUID', 'Timestamp', 'Duration',\r\n 'List', 'Map', 'Optional', 'Number',\r\n];\r\n\r\nfunction suggestType(unknown: string): string | null {\r\n const lower = unknown.toLowerCase();\r\n for (const t of ISL_TYPES) {\r\n if (levenshteinDistance(lower, t.toLowerCase()) <= 2) {\r\n return t;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// All Commands (. prefix)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const metaCommands: MetaCommand[] = [\r\n // ─── .help ──────────────────────────────────────────────────────────────\r\n {\r\n name: 'help',\r\n aliases: ['h', '?'],\r\n description: 'Show commands',\r\n usage: '.help [command]',\r\n handler: (args) => {\r\n if (args.length > 0) {\r\n const cmdName = args[0]!.toLowerCase().replace(/^\\./, '');\r\n const cmd = metaCommands.find(\r\n c => c.name === cmdName || c.aliases.includes(cmdName)\r\n );\r\n if (cmd) {\r\n return {\r\n output: [\r\n `${colors.cyan}.${cmd.name}${colors.reset} — ${cmd.description}`,\r\n `Usage: ${cmd.usage}`,\r\n cmd.aliases.length > 0\r\n ? `Aliases: ${cmd.aliases.map(a => '.' + a).join(', ')}`\r\n : '',\r\n ]\r\n .filter(Boolean)\r\n .join('\\n'),\r\n };\r\n }\r\n return { output: formatError(`Unknown command: ${cmdName}`) };\r\n }\r\n\r\n const lines = [\r\n '',\r\n `${colors.bold}REPL Commands${colors.reset}`,\r\n '',\r\n ...metaCommands.map(\r\n c =>\r\n ` ${colors.cyan}.${c.name.padEnd(12)}${colors.reset} ${c.description}`\r\n ),\r\n '',\r\n `${colors.bold}ISL Input${colors.reset}`,\r\n '',\r\n ` Type ISL directly — multi-line supported (braces auto-detect):`,\r\n '',\r\n ` ${colors.yellow}domain${colors.reset} Example {`,\r\n ` ${colors.yellow}entity${colors.reset} User {`,\r\n ` id: ${colors.green}UUID${colors.reset}`,\r\n ` name: ${colors.green}String${colors.reset}`,\r\n ` }`,\r\n ` }`,\r\n '',\r\n `Type ${colors.cyan}.help <command>${colors.reset} for details.`,\r\n '',\r\n ];\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n\r\n // ─── .parse ─────────────────────────────────────────────────────────────\r\n {\r\n name: 'parse',\r\n aliases: ['p', 'ast'],\r\n description: 'Parse ISL and show AST',\r\n usage: '.parse <isl>',\r\n handler: (args, session) => {\r\n const input = args.join(' ').trim();\r\n if (!input) {\r\n return { output: 'Usage: .parse <isl code>\\nExample: .parse domain Foo { version: \"1.0\" }' };\r\n }\r\n\r\n try {\r\n // Try the real parser\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const { parse } = require('@isl-lang/parser') as {\r\n parse: (source: string, filename?: string) => {\r\n success: boolean;\r\n domain?: unknown;\r\n errors: Array<{ message: string; location?: { line: number; column: number } }>;\r\n };\r\n };\r\n\r\n const result = parse(input, '<repl>');\r\n\r\n if (!result.success || result.errors.length > 0) {\r\n const errLines = result.errors.map(e => {\r\n const loc = e.location;\r\n if (loc) {\r\n return formatParseError(input, e.message, loc.line, loc.column);\r\n }\r\n return formatError(e.message);\r\n });\r\n return { output: errLines.join('\\n') };\r\n }\r\n\r\n if (result.domain) {\r\n session.setDomainAST(result.domain);\r\n return {\r\n output: formatSuccess('Parsed successfully') + '\\n' + prettyPrintAST(result.domain),\r\n };\r\n }\r\n return { output: formatWarning('Parse returned no AST') };\r\n } catch {\r\n // Fallback: use the built-in simple parser\r\n return {\r\n output: formatWarning(\r\n 'Real parser not available — install @isl-lang/parser.\\n' +\r\n 'Falling back to simple parse.'\r\n ),\r\n };\r\n }\r\n },\r\n },\r\n\r\n // ─── .eval ──────────────────────────────────────────────────────────────\r\n {\r\n name: 'eval',\r\n aliases: ['e'],\r\n description: 'Evaluate expression against context',\r\n usage: '.eval <expression>',\r\n handler: (args, session) => {\r\n const expr = args.join(' ').trim();\r\n if (!expr) {\r\n return {\r\n output: [\r\n 'Usage: .eval <expression>',\r\n '',\r\n 'Examples:',\r\n ' .eval user.email == \"test@x.com\"',\r\n ' .eval user.age > 30',\r\n ' .eval old(user.age)',\r\n '',\r\n 'Set context first: .context { \"user\": { \"email\": \"test@x.com\" } }',\r\n ].join('\\n'),\r\n };\r\n }\r\n\r\n const result = evaluateExpression(expr, session);\r\n if (result.error) {\r\n return { output: formatError(result.error) };\r\n }\r\n\r\n session.setLastResult(result.value);\r\n return {\r\n output: `${colors.cyan}\\u2192${colors.reset} ${formatValue(result.value)}`,\r\n };\r\n },\r\n },\r\n\r\n // ─── .check ─────────────────────────────────────────────────────────────\r\n {\r\n name: 'check',\r\n aliases: ['c'],\r\n description: 'Type check the current session',\r\n usage: '.check [intent]',\r\n handler: (args, session) => {\r\n if (args.length > 0) {\r\n const intentName = args[0]!;\r\n const intent = session.getIntent(intentName);\r\n if (!intent) {\r\n const available = session.getIntentNames().join(', ') || '(none)';\r\n return {\r\n output: formatError(`Unknown intent: ${intentName}\\nAvailable: ${available}`),\r\n };\r\n }\r\n\r\n const lines = [formatSuccess('Type check passed'), ''];\r\n for (const pre of intent.preconditions) {\r\n lines.push(` ${colors.green}\\u2713${colors.reset} pre: ${highlightExpression(pre.expression)}`);\r\n }\r\n for (const post of intent.postconditions) {\r\n lines.push(` ${colors.green}\\u2713${colors.reset} post: ${highlightExpression(post.expression)}`);\r\n }\r\n return { output: lines.join('\\n') };\r\n }\r\n\r\n const intents = session.getAllIntents();\r\n if (intents.length === 0) {\r\n return {\r\n output: formatWarning('No intents defined. Write ISL or use .load <file>'),\r\n };\r\n }\r\n\r\n const lines = [formatSuccess(`Type check passed — ${intents.length} intent(s)`), ''];\r\n for (const intent of intents) {\r\n lines.push(`${colors.bold}${intent.name}${colors.reset}`);\r\n for (const pre of intent.preconditions) {\r\n lines.push(` ${colors.green}\\u2713${colors.reset} pre: ${highlightExpression(pre.expression)}`);\r\n }\r\n for (const post of intent.postconditions) {\r\n lines.push(` ${colors.green}\\u2713${colors.reset} post: ${highlightExpression(post.expression)}`);\r\n }\r\n lines.push('');\r\n }\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n\r\n // ─── .gen ───────────────────────────────────────────────────────────────\r\n {\r\n name: 'gen',\r\n aliases: ['generate', 'g'],\r\n description: 'Generate TypeScript from intent',\r\n usage: '.gen [intent]',\r\n handler: (args, session) => {\r\n const intents = args.length > 0\r\n ? [session.getIntent(args[0]!)].filter(Boolean) as Intent[]\r\n : session.getAllIntents();\r\n\r\n if (intents.length === 0) {\r\n return {\r\n output: args.length > 0\r\n ? formatError(`Unknown intent: ${args[0]}\\nAvailable: ${session.getIntentNames().join(', ') || '(none)'}`)\r\n : formatWarning('No intents defined. Write ISL or use .load <file>'),\r\n };\r\n }\r\n\r\n const lines = [`${colors.gray}// Generated TypeScript${colors.reset}`, ''];\r\n\r\n for (const intent of intents) {\r\n lines.push(`interface ${intent.name}Contract {`);\r\n if (intent.preconditions.length > 0) {\r\n lines.push(' /** Preconditions */');\r\n for (const pre of intent.preconditions) {\r\n lines.push(` checkPre(): boolean; // ${pre.expression}`);\r\n }\r\n }\r\n if (intent.postconditions.length > 0) {\r\n lines.push(' /** Postconditions */');\r\n for (const post of intent.postconditions) {\r\n lines.push(` checkPost(): boolean; // ${post.expression}`);\r\n }\r\n }\r\n if (intent.invariants.length > 0) {\r\n lines.push(' /** Invariants */');\r\n for (const inv of intent.invariants) {\r\n lines.push(` checkInvariant(): boolean; // ${inv.expression}`);\r\n }\r\n }\r\n lines.push('}');\r\n lines.push('');\r\n }\r\n\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n\r\n // ─── .load ──────────────────────────────────────────────────────────────\r\n {\r\n name: 'load',\r\n aliases: ['l'],\r\n description: 'Load an .isl file',\r\n usage: '.load <file.isl>',\r\n handler: (args, session) => {\r\n if (args.length === 0) {\r\n return { output: 'Usage: .load <file.isl>' };\r\n }\r\n\r\n const filePath = args[0]!;\r\n const resolvedPath = path.isAbsolute(filePath)\r\n ? filePath\r\n : path.resolve(process.cwd(), filePath);\r\n\r\n if (!fs.existsSync(resolvedPath)) {\r\n return { output: formatError(`File not found: ${resolvedPath}`) };\r\n }\r\n\r\n try {\r\n const content = fs.readFileSync(resolvedPath, 'utf-8');\r\n\r\n // Try real parser first\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const { parse } = require('@isl-lang/parser') as {\r\n parse: (source: string, filename?: string) => {\r\n success: boolean;\r\n domain?: Record<string, unknown>;\r\n errors: Array<{ message: string; location?: { line: number; column: number } }>;\r\n };\r\n };\r\n\r\n const result = parse(content, resolvedPath);\r\n\r\n if (!result.success || result.errors.length > 0) {\r\n const errLines = result.errors.map(e => {\r\n const loc = e.location;\r\n if (loc) {\r\n return formatParseError(content, e.message, loc.line, loc.column);\r\n }\r\n return formatError(e.message);\r\n });\r\n return { output: errLines.join('\\n') };\r\n }\r\n\r\n if (result.domain) {\r\n session.setDomainAST(result.domain);\r\n const domain = result.domain as {\r\n name?: { name?: string };\r\n entities?: unknown[];\r\n behaviors?: unknown[];\r\n };\r\n const name = domain.name?.name ?? 'Unknown';\r\n const entityCount = domain.entities?.length ?? 0;\r\n const behaviorCount = domain.behaviors?.length ?? 0;\r\n\r\n return {\r\n output: formatSuccess(\r\n `Loaded: ${name} (${entityCount} entities, ${behaviorCount} behaviors) from ${path.basename(filePath)}`\r\n ),\r\n };\r\n }\r\n } catch {\r\n // Real parser unavailable — fallback to regex-based loading\r\n }\r\n\r\n // Fallback: regex-based intent/behavior extraction\r\n const intentRegex = /(?:intent|behavior)\\s+(\\w+)\\s*\\{[^}]*(?:\\{[^}]*\\}[^}]*)*\\}/g;\r\n let match;\r\n let count = 0;\r\n\r\n while ((match = intentRegex.exec(content)) !== null) {\r\n const intent = session.parseIntent(match[0]);\r\n if (intent) {\r\n session.defineIntent(intent);\r\n count++;\r\n }\r\n }\r\n\r\n if (count === 0) {\r\n return { output: formatWarning('No intents/behaviors found in file') };\r\n }\r\n return {\r\n output: formatSuccess(`Loaded ${count} intent(s) from ${path.basename(filePath)}`),\r\n };\r\n } catch (error) {\r\n return {\r\n output: formatError(\r\n `Failed to load: ${error instanceof Error ? error.message : String(error)}`\r\n ),\r\n };\r\n }\r\n },\r\n },\r\n\r\n // ─── .context ───────────────────────────────────────────────────────────\r\n {\r\n name: 'context',\r\n aliases: ['ctx'],\r\n description: 'Set evaluation context (JSON)',\r\n usage: '.context <json> | .context --pre <json>',\r\n handler: (args, session) => {\r\n const input = args.join(' ').trim();\r\n\r\n if (!input) {\r\n const ctx = session.getEvalContext();\r\n const pre = session.getPreContext();\r\n if (Object.keys(ctx).length === 0 && !pre) {\r\n return {\r\n output: [\r\n 'No context set.',\r\n '',\r\n 'Usage:',\r\n ' .context { \"user\": { \"email\": \"test@x.com\", \"age\": 25 } }',\r\n ' .context --pre { \"user\": { \"age\": 20 } }',\r\n ].join('\\n'),\r\n };\r\n }\r\n const lines: string[] = [];\r\n if (Object.keys(ctx).length > 0) {\r\n lines.push(`${colors.bold}Context:${colors.reset}`);\r\n lines.push(formatValue(ctx));\r\n }\r\n if (pre) {\r\n lines.push(`${colors.bold}Pre-state:${colors.reset}`);\r\n lines.push(formatValue(pre));\r\n }\r\n return { output: lines.join('\\n') };\r\n }\r\n\r\n // Handle --pre flag\r\n if (input.startsWith('--pre ')) {\r\n const json = input.slice(6).trim();\r\n const result = session.setPreContext(json);\r\n if (!result.success) {\r\n return { output: formatError(`Invalid JSON: ${result.error}`) };\r\n }\r\n return { output: formatSuccess('Pre-state context set') };\r\n }\r\n\r\n const result = session.setEvalContext(input);\r\n if (!result.success) {\r\n return { output: formatError(`Invalid JSON: ${result.error}`) };\r\n }\r\n return {\r\n output: formatSuccess(\r\n `Context set (${result.count} variable${result.count !== 1 ? 's' : ''})`\r\n ),\r\n };\r\n },\r\n },\r\n\r\n // ─── .clear ─────────────────────────────────────────────────────────────\r\n {\r\n name: 'clear',\r\n aliases: ['cls', 'reset'],\r\n description: 'Reset session state',\r\n usage: '.clear',\r\n handler: (_args, session) => {\r\n session.clear();\r\n return { output: formatSuccess('Session cleared') };\r\n },\r\n },\r\n\r\n // ─── .history ───────────────────────────────────────────────────────────\r\n {\r\n name: 'history',\r\n aliases: ['hist'],\r\n description: 'Show command history',\r\n usage: '.history [n]',\r\n handler: (args, session) => {\r\n const count = args.length > 0 ? parseInt(args[0]!, 10) : 10;\r\n const history = session.getHistory(count);\r\n\r\n if (history.length === 0) {\r\n return { output: 'No history.' };\r\n }\r\n\r\n const lines = [\r\n `${colors.bold}History${colors.reset} (last ${history.length} entries)`,\r\n '',\r\n ...history.map((entry, i) => {\r\n const num = String(i + 1).padStart(3);\r\n const preview = entry.split('\\n')[0]!;\r\n const more = entry.includes('\\n') ? ` ${colors.gray}...${colors.reset}` : '';\r\n return ` ${colors.gray}${num}${colors.reset} ${preview}${more}`;\r\n }),\r\n ];\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n\r\n // ─── .list ──────────────────────────────────────────────────────────────\r\n {\r\n name: 'list',\r\n aliases: ['ls'],\r\n description: 'List defined intents',\r\n usage: '.list',\r\n handler: (_args, session) => {\r\n const intents = session.getAllIntents();\r\n if (intents.length === 0) {\r\n return { output: 'No intents defined.' };\r\n }\r\n\r\n const lines = [''];\r\n for (const intent of intents) {\r\n const parts: string[] = [];\r\n if (intent.preconditions.length > 0) parts.push(`${intent.preconditions.length} pre`);\r\n if (intent.postconditions.length > 0) parts.push(`${intent.postconditions.length} post`);\r\n if (intent.invariants.length > 0) parts.push(`${intent.invariants.length} invariant`);\r\n const summary = parts.length > 0 ? ` (${parts.join(', ')})` : '';\r\n lines.push(` ${colors.cyan}${intent.name}${colors.reset}${summary}`);\r\n }\r\n lines.push('');\r\n return { output: lines.join('\\n') };\r\n },\r\n },\r\n\r\n // ─── .inspect ───────────────────────────────────────────────────────────\r\n {\r\n name: 'inspect',\r\n aliases: ['i', 'show'],\r\n description: 'Show full details of an intent',\r\n usage: '.inspect [intent]',\r\n handler: (args, session) => {\r\n if (args.length === 0) {\r\n const summary = session.getSummary();\r\n const ctx = session.getEvalContext();\r\n const lines = [\r\n '',\r\n `${colors.bold}Session Summary${colors.reset}`,\r\n '',\r\n ` Intents: ${summary.intentCount}`,\r\n ` Variables: ${summary.variableCount}`,\r\n ` Context: ${Object.keys(ctx).length} keys`,\r\n ` History: ${summary.historyCount} entries`,\r\n '',\r\n ];\r\n return { output: lines.join('\\n') };\r\n }\r\n\r\n const intentName = args[0]!;\r\n const intent = session.getIntent(intentName);\r\n if (!intent) {\r\n const available = session.getIntentNames().join(', ') || '(none)';\r\n return {\r\n output: formatError(`Unknown intent: ${intentName}\\nAvailable: ${available}`),\r\n };\r\n }\r\n return { output: formatIntent(intent) };\r\n },\r\n },\r\n\r\n // ─── .exit ──────────────────────────────────────────────────────────────\r\n {\r\n name: 'exit',\r\n aliases: ['quit', 'q'],\r\n description: 'Exit the REPL',\r\n usage: '.exit',\r\n handler: () => {\r\n return { exit: true };\r\n },\r\n },\r\n];\r\n\r\n// Provide islCommands as an empty array for backward compatibility\r\nexport const islCommands: ISLCommand[] = [];\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Command Suggestion (for typos)\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nfunction levenshteinDistance(a: string, b: string): number {\r\n const matrix: number[][] = [];\r\n for (let i = 0; i <= b.length; i++) {\r\n matrix[i] = [i];\r\n }\r\n for (let j = 0; j <= a.length; j++) {\r\n matrix[0]![j] = j;\r\n }\r\n for (let i = 1; i <= b.length; i++) {\r\n for (let j = 1; j <= a.length; j++) {\r\n const cost = a[j - 1] === b[i - 1] ? 0 : 1;\r\n matrix[i]![j] = Math.min(\r\n matrix[i - 1]![j]! + 1,\r\n matrix[i]![j - 1]! + 1,\r\n matrix[i - 1]![j - 1]! + cost\r\n );\r\n }\r\n }\r\n return matrix[b.length]![a.length]!;\r\n}\r\n\r\n/**\r\n * Find a similar command name\r\n */\r\nexport function findSimilarCommand(input: string, _type?: 'meta' | 'isl'): string | null {\r\n const names = metaCommands.flatMap(c => [c.name, ...c.aliases]);\r\n\r\n let bestMatch: string | null = null;\r\n let bestDistance = Infinity;\r\n\r\n for (const name of names) {\r\n const distance = levenshteinDistance(input.toLowerCase(), name.toLowerCase());\r\n if (distance < bestDistance && distance <= 2) {\r\n bestDistance = distance;\r\n bestMatch = name;\r\n }\r\n }\r\n\r\n return bestMatch;\r\n}\r\n","// ============================================================================\r\n// ISL REPL Output Formatting\r\n// Syntax highlighting and pretty-printing\r\n// ============================================================================\r\n\r\nimport type { Intent, Condition } from './session';\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// ANSI Color Codes\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\nexport const colors = {\r\n reset: '\\x1b[0m',\r\n bold: '\\x1b[1m',\r\n dim: '\\x1b[2m',\r\n italic: '\\x1b[3m',\r\n underline: '\\x1b[4m',\r\n \r\n // Foreground colors\r\n black: '\\x1b[30m',\r\n red: '\\x1b[31m',\r\n green: '\\x1b[32m',\r\n yellow: '\\x1b[33m',\r\n blue: '\\x1b[34m',\r\n magenta: '\\x1b[35m',\r\n cyan: '\\x1b[36m',\r\n white: '\\x1b[37m',\r\n gray: '\\x1b[90m',\r\n \r\n // Bright foreground\r\n brightRed: '\\x1b[91m',\r\n brightGreen: '\\x1b[92m',\r\n brightYellow: '\\x1b[93m',\r\n brightBlue: '\\x1b[94m',\r\n brightMagenta: '\\x1b[95m',\r\n brightCyan: '\\x1b[96m',\r\n brightWhite: '\\x1b[97m',\r\n \r\n // Background colors\r\n bgBlack: '\\x1b[40m',\r\n bgRed: '\\x1b[41m',\r\n bgGreen: '\\x1b[42m',\r\n bgYellow: '\\x1b[43m',\r\n bgBlue: '\\x1b[44m',\r\n bgMagenta: '\\x1b[45m',\r\n bgCyan: '\\x1b[46m',\r\n bgWhite: '\\x1b[47m',\r\n};\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Message Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format a success message\r\n */\r\nexport function formatSuccess(message: string): string {\r\n return `${colors.green}✓${colors.reset} ${message}`;\r\n}\r\n\r\n/**\r\n * Format an error message\r\n */\r\nexport function formatError(message: string): string {\r\n return `${colors.red}✗ Error:${colors.reset} ${message}`;\r\n}\r\n\r\n/**\r\n * Format a warning message\r\n */\r\nexport function formatWarning(message: string): string {\r\n return `${colors.yellow}⚠${colors.reset} ${message}`;\r\n}\r\n\r\n/**\r\n * Format an info message\r\n */\r\nexport function formatInfo(message: string): string {\r\n return `${colors.cyan}ℹ${colors.reset} ${message}`;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Intent Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format an intent for display\r\n */\r\nexport function formatIntent(intent: Intent): string {\r\n const lines: string[] = [\r\n '',\r\n `${colors.bold}Intent: ${colors.cyan}${intent.name}${colors.reset}`,\r\n colors.gray + '─'.repeat(40) + colors.reset,\r\n ];\r\n\r\n // Preconditions\r\n if (intent.preconditions.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Preconditions:${colors.reset}`);\r\n for (const pre of intent.preconditions) {\r\n lines.push(` ${colors.magenta}pre:${colors.reset} ${highlightExpression(pre.expression)}`);\r\n }\r\n }\r\n\r\n // Postconditions\r\n if (intent.postconditions.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Postconditions:${colors.reset}`);\r\n for (const post of intent.postconditions) {\r\n lines.push(` ${colors.magenta}post:${colors.reset} ${highlightExpression(post.expression)}`);\r\n }\r\n }\r\n\r\n // Invariants\r\n if (intent.invariants.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Invariants:${colors.reset}`);\r\n for (const inv of intent.invariants) {\r\n lines.push(` ${colors.magenta}invariant:${colors.reset} ${highlightExpression(inv.expression)}`);\r\n }\r\n }\r\n\r\n // Scenarios\r\n if (intent.scenarios.length > 0) {\r\n lines.push('');\r\n lines.push(`${colors.bold}Scenarios:${colors.reset}`);\r\n for (const scenario of intent.scenarios) {\r\n lines.push(` ${colors.yellow}${scenario.name}${colors.reset}`);\r\n }\r\n }\r\n\r\n // Raw source (if verbose)\r\n // lines.push('');\r\n // lines.push(`${colors.gray}Source:${colors.reset}`);\r\n // lines.push(colors.gray + intent.rawSource + colors.reset);\r\n\r\n lines.push('');\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * Format a condition\r\n */\r\nexport function formatCondition(condition: Condition, type: 'pre' | 'post' | 'invariant'): string {\r\n const prefix = {\r\n pre: colors.magenta + 'pre' + colors.reset,\r\n post: colors.magenta + 'post' + colors.reset,\r\n invariant: colors.magenta + 'invariant' + colors.reset,\r\n }[type];\r\n\r\n return `${prefix}: ${highlightExpression(condition.expression)}`;\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Syntax Highlighting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Highlight an ISL expression\r\n */\r\nexport function highlightExpression(expr: string): string {\r\n return expr\r\n // Operators\r\n .replace(/\\b(and|or|not|implies)\\b/g, `${colors.yellow}$1${colors.reset}`)\r\n .replace(/(>=|<=|==|!=|>|<)/g, `${colors.yellow}$1${colors.reset}`)\r\n // Keywords\r\n .replace(/\\b(true|false|null)\\b/g, `${colors.magenta}$1${colors.reset}`)\r\n .replace(/\\b(forall|exists|in)\\b/g, `${colors.yellow}$1${colors.reset}`)\r\n // Numbers\r\n .replace(/\\b(\\d+(?:\\.\\d+)?)\\b/g, `${colors.cyan}$1${colors.reset}`)\r\n // Strings\r\n .replace(/\"([^\"]*)\"/g, `${colors.green}\"$1\"${colors.reset}`)\r\n // Method calls\r\n .replace(/\\.(\\w+)\\(/g, `.${colors.blue}$1${colors.reset}(`)\r\n // Properties\r\n .replace(/\\.(\\w+)(?!\\()/g, `.${colors.cyan}$1${colors.reset}`);\r\n}\r\n\r\n/**\r\n * Highlight ISL source code\r\n */\r\nexport function highlightISL(source: string): string {\r\n return source\r\n // Keywords\r\n .replace(/\\b(intent|behavior|entity|domain|type|enum)\\b/g, `${colors.yellow}$1${colors.reset}`)\r\n .replace(/\\b(pre|post|invariant|scenario)\\b/g, `${colors.magenta}$1${colors.reset}`)\r\n .replace(/\\b(input|output|success|errors?)\\b/g, `${colors.blue}$1${colors.reset}`)\r\n // Types\r\n .replace(/\\b(String|Int|Boolean|UUID|Timestamp|Decimal|Duration|List|Map|Optional)\\b/g, \r\n `${colors.green}$1${colors.reset}`)\r\n // Operators\r\n .replace(/\\b(and|or|not|implies|forall|exists|in)\\b/g, `${colors.yellow}$1${colors.reset}`)\r\n // Booleans\r\n .replace(/\\b(true|false|null)\\b/g, `${colors.magenta}$1${colors.reset}`)\r\n // Numbers\r\n .replace(/\\b(\\d+(?:\\.\\d+)?)\\b/g, `${colors.cyan}$1${colors.reset}`)\r\n // Strings\r\n .replace(/\"([^\"]*)\"/g, `${colors.green}\"$1\"${colors.reset}`)\r\n // Comments\r\n .replace(/(\\/\\/[^\\n]*)/g, `${colors.gray}$1${colors.reset}`)\r\n .replace(/(#[^\\n]*)/g, `${colors.gray}$1${colors.reset}`);\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Table Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format a table\r\n */\r\nexport function formatTable(\r\n headers: string[],\r\n rows: string[][],\r\n options: { colors?: boolean } = {}\r\n): string {\r\n const useColors = options.colors !== false;\r\n\r\n // Calculate column widths\r\n const widths = headers.map((h, i) => {\r\n const cellWidths = [h.length, ...rows.map(r => (r[i] ?? '').length)];\r\n return Math.max(...cellWidths);\r\n });\r\n\r\n // Format header\r\n const headerRow = headers.map((h, i) => h.padEnd(widths[i]!)).join(' │ ');\r\n const separator = widths.map(w => '─'.repeat(w)).join('─┼─');\r\n\r\n // Format rows\r\n const dataRows = rows.map(row =>\r\n row.map((cell, i) => (cell ?? '').padEnd(widths[i]!)).join(' │ ')\r\n );\r\n\r\n const headerFormatted = useColors ? `${colors.bold}${headerRow}${colors.reset}` : headerRow;\r\n const sepFormatted = useColors ? `${colors.gray}${separator}${colors.reset}` : separator;\r\n\r\n return [headerFormatted, sepFormatted, ...dataRows].join('\\n');\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Error Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format a parse error with caret pointing to position\r\n */\r\nexport function formatParseError(\r\n source: string,\r\n message: string,\r\n line: number,\r\n column: number\r\n): string {\r\n const lines = source.split('\\n');\r\n const errorLine = lines[line - 1] || '';\r\n \r\n const output = [\r\n formatError(message),\r\n '',\r\n `${colors.gray}${String(line).padStart(4)} │${colors.reset} ${errorLine}`,\r\n `${colors.gray} │${colors.reset} ${' '.repeat(column - 1)}${colors.red}^${colors.reset}`,\r\n ];\r\n\r\n return output.join('\\n');\r\n}\r\n\r\n/**\r\n * Format a type error with expected vs actual\r\n */\r\nexport function formatTypeError(\r\n message: string,\r\n expected: string,\r\n actual: string,\r\n context?: string\r\n): string {\r\n const output = [\r\n formatError(message),\r\n '',\r\n ` Expected: ${colors.green}${expected}${colors.reset}`,\r\n ` Actual: ${colors.red}${actual}${colors.reset}`,\r\n ];\r\n\r\n if (context) {\r\n output.push('');\r\n output.push(` Context: ${colors.gray}${context}${colors.reset}`);\r\n }\r\n\r\n return output.join('\\n');\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Utility Formatting\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Format a value for display\r\n */\r\nexport function formatValue(value: unknown, indent = 0): string {\r\n const pad = ' '.repeat(indent);\r\n \r\n if (value === null) return `${colors.gray}null${colors.reset}`;\r\n if (value === undefined) return `${colors.gray}undefined${colors.reset}`;\r\n \r\n if (typeof value === 'string') {\r\n return `${colors.green}\"${value}\"${colors.reset}`;\r\n }\r\n \r\n if (typeof value === 'number') {\r\n return `${colors.cyan}${value}${colors.reset}`;\r\n }\r\n \r\n if (typeof value === 'boolean') {\r\n return `${colors.magenta}${value}${colors.reset}`;\r\n }\r\n \r\n if (Array.isArray(value)) {\r\n if (value.length === 0) return '[]';\r\n const items = value.map(v => formatValue(v, indent + 2));\r\n return `[\\n${pad} ${items.join(`,\\n${pad} `)}\\n${pad}]`;\r\n }\r\n \r\n if (typeof value === 'object') {\r\n const entries = Object.entries(value);\r\n if (entries.length === 0) return '{}';\r\n const items = entries.map(([k, v]) => \r\n `${colors.blue}${k}${colors.reset}: ${formatValue(v, indent + 2)}`\r\n );\r\n return `{\\n${pad} ${items.join(`,\\n${pad} `)}\\n${pad}}`;\r\n }\r\n \r\n return String(value);\r\n}\r\n\r\n/**\r\n * Strip ANSI color codes from a string\r\n */\r\nexport function stripColors(str: string): string {\r\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\r\n}\r\n\r\n/**\r\n * Wrap text to a maximum width\r\n */\r\nexport function wrapText(text: string, maxWidth: number): string {\r\n const words = text.split(' ');\r\n const lines: string[] = [];\r\n let currentLine = '';\r\n\r\n for (const word of words) {\r\n const testLine = currentLine ? `${currentLine} ${word}` : word;\r\n if (stripColors(testLine).length > maxWidth && currentLine) {\r\n lines.push(currentLine);\r\n currentLine = word;\r\n } else {\r\n currentLine = testLine;\r\n }\r\n }\r\n\r\n if (currentLine) {\r\n lines.push(currentLine);\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n// Box Drawing\r\n// ─────────────────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Draw a box around text\r\n */\r\nexport function drawBox(lines: string[], title?: string): string {\r\n const maxLen = Math.max(...lines.map(l => stripColors(l).length), title ? title.length + 4 : 0);\r\n \r\n const top = title \r\n ? `╔═ ${title} ${'═'.repeat(maxLen - title.length - 3)}╗`\r\n : `╔${'═'.repeat(maxLen + 2)}╗`;\r\n \r\n const bottom = `╚${'═'.repeat(maxLen + 2)}╝`;\r\n \r\n const paddedLines = lines.map(l => {\r\n const padding = maxLen - stripColors(l).length;\r\n return `║ ${l}${' '.repeat(padding)} ║`;\r\n });\r\n\r\n return [top, ...paddedLines, bottom].join('\\n');\r\n}\r\n","#!/usr/bin/env node\r\n// ============================================================================\r\n// ISL REPL CLI Entry Point\r\n// ============================================================================\r\n\r\nimport { startREPL, type REPLOptions } from './repl';\r\n\r\n/**\r\n * Parse CLI arguments into REPLOptions\r\n */\r\nfunction parseArgs(argv: string[]): REPLOptions & { help: boolean } {\r\n const options: REPLOptions & { help: boolean } = {\r\n help: false,\r\n colors: true,\r\n verbose: false,\r\n parseOnly: false,\r\n };\r\n\r\n for (let i = 0; i < argv.length; i++) {\r\n const arg = argv[i]!;\r\n\r\n switch (arg) {\r\n case '--help':\r\n case '-h':\r\n options.help = true;\r\n break;\r\n\r\n case '--no-color':\r\n options.colors = false;\r\n break;\r\n\r\n case '--verbose':\r\n case '-v':\r\n options.verbose = true;\r\n break;\r\n\r\n case '--load':\r\n options.load = argv[++i];\r\n break;\r\n\r\n case '--context':\r\n options.context = argv[++i];\r\n break;\r\n\r\n case '--parse':\r\n options.parseOnly = true;\r\n break;\r\n\r\n default:\r\n // Accept --load=file or --context=json\r\n if (arg.startsWith('--load=')) {\r\n options.load = arg.slice(7);\r\n } else if (arg.startsWith('--context=')) {\r\n options.context = arg.slice(10);\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return options;\r\n}\r\n\r\n/**\r\n * Print help text\r\n */\r\nfunction printHelp(): void {\r\n process.stdout.write(`\r\nISL REPL - Intent Specification Language Interactive Shell\r\n\r\nUsage: isl-repl [options]\r\n\r\nOptions:\r\n --load <file> Load an ISL file on start\r\n --context <json> Set initial evaluation context\r\n --parse Parse mode (non-interactive, for piped input)\r\n --no-color Disable colored output\r\n -v, --verbose Enable verbose output\r\n -h, --help Show this help message\r\n\r\nInside the REPL:\r\n .help Show all commands\r\n .parse <isl> Parse ISL and show AST\r\n .eval <expr> Evaluate expression against context\r\n .check [intent] Type check intents\r\n .gen [intent] Generate TypeScript from intent\r\n .load <file> Load an .isl file\r\n .context <json> Set evaluation context (mock data)\r\n .clear Reset session state\r\n .list List defined intents\r\n .inspect [intent] Show full details of an intent\r\n .history Show command history\r\n .exit Exit the REPL\r\n\r\nMulti-line Input:\r\n Type ISL with braces — the REPL auto-detects multi-line:\r\n isl> domain Example {\r\n ...> entity User {\r\n ...> id: UUID\r\n ...> name: String\r\n ...> }\r\n ...> }\r\n\r\nExamples:\r\n $ isl-repl\r\n $ isl-repl --load auth.isl\r\n $ isl-repl --context '{\"user\": {\"id\": 1}}'\r\n $ echo 'domain X { version: \"1.0\" }' | isl-repl --parse\r\n`);\r\n}\r\n\r\n/**\r\n * Main entry point\r\n */\r\nexport function main(): void {\r\n const args = process.argv.slice(2);\r\n const options = parseArgs(args);\r\n\r\n if (options.help) {\r\n printHelp();\r\n process.exit(0);\r\n }\r\n\r\n startREPL(options);\r\n}\r\n\r\n// Run if executed directly (ESM + CJS compat)\r\nconst isMainModule = typeof require !== 'undefined'\r\n ? require.main === module\r\n : process.argv[1]?.includes('cli');\r\n\r\nif (isMainModule) {\r\n main();\r\n}\r\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","lines","result"]}