@fairfox/polly 0.15.7 → 0.15.8
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.
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// Invariant extraction from JSDoc comments\n// Extract domain-specific invariants from code annotations\n\nimport { type JSDoc, Node, Project, type SourceFile } from \"ts-morph\";\nimport type { CodebaseAnalysis } from \"../../../analysis/src/extract/types\";\n\n/**\n * Extracted invariant from JSDoc annotation\n */\nexport type Invariant = {\n /** Name for the invariant (auto-generated if not provided) */\n name: string;\n /** Description from JSDoc comment */\n description: string;\n /** JavaScript expression that should always be true */\n expression: string;\n /** Source location */\n location: {\n file: string;\n line: number;\n };\n};\n\n/**\n * Result of invariant extraction\n */\nexport type InvariantExtractionResult = {\n invariants: Invariant[];\n warnings: string[];\n};\n\n/**\n * InvariantExtractor extracts application-specific invariants from:\n * - @invariant JSDoc tags\n * - @ensures JSDoc tags (treated as post-condition invariants)\n * - @requires JSDoc tags (treated as pre-condition invariants)\n *\n * These are translated to TLA+ invariants that TLC can check.\n */\nexport class InvariantExtractor {\n private warnings: string[] = [];\n\n /**\n * Extract invariants from TypeScript project\n */\n extractInvariants(projectPath: string): InvariantExtractionResult {\n const project = new Project({\n tsConfigFilePath: `${projectPath}/tsconfig.json`,\n skipAddingFilesFromTsConfig: false,\n });\n\n const invariants: Invariant[] = [];\n\n for (const sourceFile of project.getSourceFiles()) {\n // Skip node_modules and test files\n if (\n sourceFile.getFilePath().includes(\"node_modules\") ||\n sourceFile.getFilePath().includes(\".test.\") ||\n sourceFile.getFilePath().includes(\".spec.\")\n ) {\n continue;\n }\n\n invariants.push(...this.extractFromSourceFile(sourceFile));\n }\n\n return {\n invariants,\n warnings: this.warnings,\n };\n }\n\n /**\n * Extract invariants from codebase analysis result\n * (Alternative entry point when analysis is already done)\n */\n extractFromAnalysis(_analysis: CodebaseAnalysis): InvariantExtractionResult {\n // For now, return empty - could be enhanced to extract from handlers\n return {\n invariants: [],\n warnings: [],\n };\n }\n\n /**\n * Extract invariants from a single source file\n */\n private extractFromSourceFile(sourceFile: SourceFile): Invariant[] {\n const invariants: Invariant[] = [];\n\n // Traverse all nodes looking for JSDoc comments\n sourceFile.forEachDescendant((node) => {\n this.processNodeJSDocs(node, sourceFile, invariants);\n });\n\n return invariants;\n }\n\n /**\n * Process JSDoc comments for a node\n */\n private processNodeJSDocs(node: Node, sourceFile: SourceFile, invariants: Invariant[]): void {\n const jsDocs = this.getJsDocComments(node);\n\n for (const jsDoc of jsDocs) {\n this.processJSDocTags(jsDoc, sourceFile, node, invariants);\n }\n }\n\n /**\n * Process tags within a JSDoc comment\n */\n private processJSDocTags(\n jsDoc: JSDoc,\n sourceFile: SourceFile,\n node: Node,\n invariants: Invariant[]\n ): void {\n for (const tag of jsDoc.getTags()) {\n this.processJSDocTag(tag, sourceFile, node, invariants);\n }\n }\n\n /**\n * Process a single JSDoc tag\n */\n private processJSDocTag(\n tag: { getTagName: () => string; getComment: () => string | undefined },\n sourceFile: SourceFile,\n node: Node,\n invariants: Invariant[]\n ): void {\n const tagName = tag.getTagName();\n const text = tag.getComment();\n\n if (typeof text !== \"string\" || !text.trim()) {\n return;\n }\n\n const trimmedText = text.trim();\n\n if (tagName === \"invariant\") {\n invariants.push(this.createInvariant(trimmedText, \"invariant\", sourceFile, node));\n } else if (tagName === \"ensures\") {\n invariants.push(this.createInvariant(trimmedText, \"post-condition\", sourceFile, node));\n } else if (tagName === \"requires\") {\n invariants.push(this.createInvariant(trimmedText, \"pre-condition\", sourceFile, node));\n }\n }\n\n /**\n * Get JSDoc comments for a node\n */\n private getJsDocComments(node: Node): JSDoc[] {\n if (Node.isJSDocable(node)) {\n return node.getJsDocs();\n }\n return [];\n }\n\n /**\n * Create invariant from JSDoc annotation\n */\n private createInvariant(\n expression: string,\n type: \"invariant\" | \"pre-condition\" | \"post-condition\",\n sourceFile: SourceFile,\n node: Node\n ): Invariant {\n // Extract description from preceding comment text\n const description = this.extractDescription(node, expression);\n\n // Generate name from expression\n const name = this.generateInvariantName(expression, type);\n\n return {\n name,\n description,\n expression,\n location: {\n file: sourceFile.getFilePath(),\n line: node.getStartLineNumber(),\n },\n };\n }\n\n /**\n * Extract human-readable description from JSDoc\n */\n private extractDescription(node: Node, expression: string): string {\n if (Node.isJSDocable(node)) {\n const jsDocs = node.getJsDocs();\n for (const jsDoc of jsDocs) {\n const desc = jsDoc.getDescription();\n if (desc?.trim()) {\n return desc.trim();\n }\n }\n }\n\n // Fallback: use expression as description\n return `Invariant: ${expression}`;\n }\n\n /**\n * Generate invariant name from expression\n *\n * Examples:\n * - \"state.count >= 0\" -> \"CountNonNegative\"\n * - \"state.items.length <= 100\" -> \"ItemsMaxLength\"\n */\n private generateInvariantName(\n expression: string,\n type: \"invariant\" | \"pre-condition\" | \"post-condition\"\n ): string {\n // Extract field names from expression\n const fieldMatches = expression.match(/state\\.(\\w+)/g);\n if (!fieldMatches || fieldMatches.length === 0) {\n return this.generateGenericInvariantName(type);\n }\n\n // Use first field name as base\n const fieldName = fieldMatches[0]?.replace(\"state.\", \"\");\n\n // Build name from components\n const constraintSuffix = this.determineConstraintSuffix(expression);\n const capitalizedField = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);\n const prefix = this.getInvariantPrefix(type);\n\n return `${prefix}${capitalizedField}${constraintSuffix}`;\n }\n\n /**\n * Generate generic invariant name when no state fields found\n */\n private generateGenericInvariantName(\n type: \"invariant\" | \"pre-condition\" | \"post-condition\"\n ): string {\n const prefix = this.getInvariantPrefix(type);\n return `${prefix}Invariant${Math.random().toString(36).substring(2, 7)}`;\n }\n\n /**\n * Determine constraint suffix based on operators in expression\n */\n private determineConstraintSuffix(expression: string): string {\n if (expression.includes(\"<=\")) return \"MaxValue\";\n if (expression.includes(\">=\")) return \"MinValue\";\n if (expression.includes(\"===\") || expression.includes(\"==\")) return \"Equals\";\n if (expression.includes(\"!==\") || expression.includes(\"!=\")) return \"NotEquals\";\n if (expression.includes(\"<\")) return \"LessThan\";\n if (expression.includes(\">\")) return \"GreaterThan\";\n return \"Check\";\n }\n\n /**\n * Get prefix based on invariant type\n */\n private getInvariantPrefix(type: \"invariant\" | \"pre-condition\" | \"post-condition\"): string {\n if (type === \"pre-condition\") return \"Pre\";\n if (type === \"post-condition\") return \"Post\";\n return \"\";\n }\n\n /**\n * Validate that expression is safe to translate to TLA+\n */\n validateExpression(expression: string): { valid: boolean; error?: string } {\n // Check for dangerous patterns\n if (expression.includes(\"eval(\")) {\n return { valid: false, error: \"eval() not allowed in invariants\" };\n }\n\n // Check for basic syntax issues\n const openParens = (expression.match(/\\(/g) || []).length;\n const closeParens = (expression.match(/\\)/g) || []).length;\n if (openParens !== closeParens) {\n return { valid: false, error: \"Unbalanced parentheses\" };\n }\n\n const openBrackets = (expression.match(/\\[/g) || []).length;\n const closeBrackets = (expression.match(/\\]/g) || []).length;\n if (openBrackets !== closeBrackets) {\n return { valid: false, error: \"Unbalanced brackets\" };\n }\n\n return { valid: true };\n }\n}\n\n/**\n * InvariantGenerator converts extracted invariants to TLA+ format\n */\nexport class InvariantGenerator {\n /**\n * Generate TLA+ invariant definitions from extracted invariants\n */\n generateTLAInvariants(\n invariants: Invariant[],\n tsExpressionToTLA: (expr: string) => string\n ): string[] {\n const tlaInvariants: string[] = [];\n\n for (const invariant of invariants) {\n tlaInvariants.push(this.generateSingleInvariant(invariant, tsExpressionToTLA));\n }\n\n return tlaInvariants;\n }\n\n /**\n * Generate single TLA+ invariant\n */\n private generateSingleInvariant(\n invariant: Invariant,\n tsExpressionToTLA: (expr: string) => string\n ): string {\n const lines: string[] = [];\n\n // Add description as comment\n if (invariant.description) {\n lines.push(`\\\\* ${invariant.description}`);\n }\n\n // Translate expression to TLA+\n const tlaExpr = tsExpressionToTLA(invariant.expression);\n\n // Wrap in universal quantifier over all contexts\n lines.push(`${invariant.name} ==`);\n lines.push(` \\\\A ctx \\\\in Contexts : ${tlaExpr}`);\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate INVARIANT declarations for TLA+ config file\n */\n generateConfigInvariants(invariants: Invariant[]): string[] {\n return invariants.map((inv) => `INVARIANT ${inv.name}`);\n }\n}\n",
|
|
6
6
|
"// Temporal property generation for message ordering and causality\n// Generate LTL (Linear Temporal Logic) properties for TLC liveness checking\n\nimport type { CodebaseAnalysis } from \"../../../analysis/src/extract/types\";\n\n/**\n * Temporal property types\n */\nexport type TemporalPropertyType =\n | \"eventually\" // <>P (eventually P)\n | \"always\" // []P (always P)\n | \"until\" // P U Q (P until Q)\n | \"implies-eventually\" // []( P => <>Q ) (always: if P then eventually Q)\n | \"implies-next\" // []( P => X Q ) (always: if P then next Q)\n | \"order\"; // Message ordering constraint\n\n/**\n * Temporal property specification\n */\nexport type TemporalProperty = {\n /** Property name */\n name: string;\n /** Human-readable description */\n description: string;\n /** Property type */\n type: TemporalPropertyType;\n /** Trigger condition (if applicable) */\n trigger?: string;\n /** Target condition or message */\n target: string;\n /** Source location (if extracted from code) */\n location?: {\n file: string;\n line: number;\n };\n};\n\n/**\n * Ordering rule between messages\n */\nexport type MessageOrderRule = {\n /** Message that must come first */\n first: string;\n /** Message that must come after */\n second: string;\n /** Description of the ordering requirement */\n description: string;\n};\n\n/**\n * TemporalPropertyGenerator creates LTL properties for:\n * - Message ordering (init first, login before auth actions, etc.)\n * - Causality (request => response)\n * - Liveness (eventual completion)\n * - Safety (bad states never reached)\n */\nexport class TemporalPropertyGenerator {\n /**\n * Generate temporal properties from codebase analysis\n */\n generateProperties(analysis: CodebaseAnalysis): TemporalProperty[] {\n const properties: TemporalProperty[] = [];\n\n // 1. Generate init-first property if init message exists\n if (analysis.messageTypes.includes(\"init\")) {\n properties.push(this.generateInitFirstProperty());\n }\n\n // 2. Detect request-response patterns\n properties.push(...this.detectRequestResponsePatterns(analysis));\n\n // 3. Detect state transitions that require ordering\n properties.push(...this.detectOrderingFromHandlers(analysis));\n\n // 4. Generate eventual completion properties\n properties.push(...this.generateCompletionProperties(analysis));\n\n return properties;\n }\n\n /**\n * Generate property: init message must be delivered first\n */\n private generateInitFirstProperty(): TemporalProperty {\n return {\n name: \"InitMessageFirst\",\n description: \"Init message must be delivered before any other message\",\n type: \"order\",\n target: \"init\",\n };\n }\n\n /**\n * Detect request-response message pairs\n */\n private detectRequestResponsePatterns(analysis: CodebaseAnalysis): TemporalProperty[] {\n const properties: TemporalProperty[] = [];\n\n // Common patterns: request/response, query/result, command/ack\n const patterns = [\n { request: \"request\", response: \"response\" },\n { request: \"query\", response: \"result\" },\n { request: \"command\", response: \"ack\" },\n { request: \"send\", response: \"receive\" },\n ];\n\n for (const pattern of patterns) {\n const hasRequest = analysis.messageTypes.some((m) =>\n m.toLowerCase().includes(pattern.request)\n );\n const hasResponse = analysis.messageTypes.some((m) =>\n m.toLowerCase().includes(pattern.response)\n );\n\n if (hasRequest && hasResponse) {\n properties.push({\n name: `${this.capitalize(pattern.request)}EventuallyGets${this.capitalize(pattern.response)}`,\n description: `Every ${pattern.request} eventually gets a ${pattern.response}`,\n type: \"implies-eventually\",\n trigger: `delivered[\"${pattern.request}\"]`,\n target: `delivered[\"${pattern.response}\"]`,\n });\n }\n }\n\n return properties;\n }\n\n /**\n * Detect ordering requirements from handler preconditions\n */\n private detectOrderingFromHandlers(analysis: CodebaseAnalysis): TemporalProperty[] {\n const properties: TemporalProperty[] = [];\n\n for (const handler of analysis.handlers) {\n // Check preconditions for state requirements\n for (const precondition of handler.preconditions) {\n // If handler requires authenticated state, it must come after login\n if (\n precondition.expression.includes(\"authenticated\") &&\n analysis.messageTypes.some((m) => m.toLowerCase().includes(\"login\"))\n ) {\n properties.push({\n name: `${handler.messageType}RequiresLogin`,\n description: `${handler.messageType} can only happen after login`,\n type: \"implies-eventually\",\n trigger: `msgType = \"${handler.messageType}\"`,\n target: 'delivered[\"login\"]',\n location: handler.location,\n });\n }\n }\n }\n\n return properties;\n }\n\n /**\n * Generate properties for eventual completion\n */\n private generateCompletionProperties(analysis: CodebaseAnalysis): TemporalProperty[] {\n const properties: TemporalProperty[] = [];\n\n // Look for \"start\" messages that should eventually complete\n const startMessages = analysis.messageTypes.filter((m) => m.toLowerCase().includes(\"start\"));\n const completeMessages = analysis.messageTypes.filter(\n (m) => m.toLowerCase().includes(\"complete\") || m.toLowerCase().includes(\"finish\")\n );\n\n if (startMessages.length > 0 && completeMessages.length > 0) {\n for (const start of startMessages) {\n properties.push({\n name: `${start}EventuallyCompletes`,\n description: `Every ${start} eventually leads to completion`,\n type: \"implies-eventually\",\n trigger: `delivered[\"${start}\"]`,\n target: `\\\\E msg \\\\in {\"${completeMessages.join('\", \"')}\"} : delivered[msg]`,\n });\n }\n }\n\n return properties;\n }\n\n /**\n * Create custom ordering rule\n */\n createOrderingRule(rule: MessageOrderRule): TemporalProperty {\n return {\n name: `${rule.first}Before${rule.second}`,\n description: rule.description,\n type: \"order\",\n trigger: `delivered[\"${rule.second}\"]`,\n target: `delivered[\"${rule.first}\"]`,\n };\n }\n\n /**\n * Capitalize first letter\n */\n private capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n}\n\n/**\n * TemporalTLAGenerator converts temporal properties to TLA+ format\n */\nexport class TemporalTLAGenerator {\n /**\n * Generate TLA+ temporal formulas from properties\n */\n generateTLAProperties(properties: TemporalProperty[]): string[] {\n return properties.map((prop) => this.generateSingleProperty(prop));\n }\n\n /**\n * Generate single TLA+ temporal property\n */\n private generateSingleProperty(prop: TemporalProperty): string {\n const lines: string[] = [];\n\n // Add description\n if (prop.description) {\n lines.push(`\\\\* ${prop.description}`);\n }\n\n // Generate property based on type\n switch (prop.type) {\n case \"eventually\":\n lines.push(`${prop.name} == <>(${prop.target})`);\n break;\n\n case \"always\":\n lines.push(`${prop.name} == [](${prop.target})`);\n break;\n\n case \"until\":\n if (prop.trigger) {\n lines.push(`${prop.name} == (${prop.trigger}) U (${prop.target})`);\n }\n break;\n\n case \"implies-eventually\":\n if (prop.trigger) {\n lines.push(`${prop.name} == [](${prop.trigger} => <>(${prop.target}))`);\n }\n break;\n\n case \"implies-next\":\n if (prop.trigger) {\n lines.push(`${prop.name} == [](${prop.trigger} => X(${prop.target}))`);\n }\n break;\n\n case \"order\":\n // For ordering: \"first must happen before second\"\n // Expressed as: always (second => first already happened)\n if (prop.trigger) {\n lines.push(`${prop.name} == [](${prop.trigger} => ${prop.target})`);\n } else {\n // Init-first special case\n lines.push(\n `${prop.name} == [](delivered[\"${prop.target}\"] \\\\/ (\\\\A msg \\\\in MessageTypes \\\\\\\\ {\"${prop.target}\"} : ~delivered[msg]))`\n );\n }\n break;\n }\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Generate PROPERTY declarations for TLA+ config file\n */\n generateConfigProperties(properties: TemporalProperty[]): string[] {\n return properties.map((prop) => `PROPERTY ${prop.name}`);\n }\n\n /**\n * Generate delivered tracking variables for temporal properties\n */\n generateDeliveredVariables(): string {\n return [\n \"\\\\* Track which messages have been delivered (for temporal properties)\",\n \"VARIABLE delivered\",\n \"\",\n \"\\\\* Initially no messages delivered\",\n \"InitDelivered == delivered = [msg \\\\in MessageTypes |-> FALSE]\",\n \"\",\n \"\\\\* Mark message as delivered when processed\",\n \"MarkDelivered(msgType) == delivered' = [delivered EXCEPT ![msgType] = TRUE]\",\n ].join(\"\\n\");\n }\n}\n\n/**\n * Create \"eventually\" property: <>P\n */\nexport function eventually(name: string, description: string, condition: string): TemporalProperty {\n return {\n name,\n description,\n type: \"eventually\",\n target: condition,\n };\n}\n\n/**\n * Create \"always\" property: []P\n */\nexport function always(name: string, description: string, condition: string): TemporalProperty {\n return {\n name,\n description,\n type: \"always\",\n target: condition,\n };\n}\n\n/**\n * Create \"implies eventually\" property: [](P => <>Q)\n */\nexport function impliesEventually(\n name: string,\n description: string,\n trigger: string,\n target: string\n): TemporalProperty {\n return {\n name,\n description,\n type: \"implies-eventually\",\n trigger,\n target,\n };\n}\n\n/**\n * Create ordering property: first before second\n */\nexport function ordering(first: string, second: string, description: string): TemporalProperty {\n return {\n name: `${first}Before${second}`,\n description,\n type: \"order\",\n trigger: `delivered[\"${second}\"]`,\n target: `delivered[\"${first}\"]`,\n };\n}\n\n/**\n * Create request-response property\n */\nexport function requestResponse(request: string, response: string): TemporalProperty {\n return {\n name: `${request}EventuallyGets${response}`,\n description: `Every ${request} eventually gets a ${response}`,\n type: \"implies-eventually\",\n trigger: `delivered[\"${request}\"]`,\n target: `delivered[\"${response}\"]`,\n };\n}\n",
|
|
7
|
-
"// TLA+ specification generator\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { MessageHandler } from \"../core/model\";\nimport type { SANYRunner, ValidationResult as SANYValidationResult } from \"../runner/sany\";\nimport type { CodebaseAnalysis, VerificationConfig } from \"../types\";\nimport { type Invariant, InvariantExtractor, InvariantGenerator } from \"./invariants\";\nimport type { RoundTripResult, RoundTripValidator } from \"./round-trip\";\nimport { type TemporalProperty, TemporalPropertyGenerator, TemporalTLAGenerator } from \"./temporal\";\nimport type { TLAValidator, ValidationError } from \"./tla-validator\";\n\n/**\n * Validation report from all validators\n */\nexport type ValidationReport = {\n syntaxValidation: {\n passed: boolean;\n errors: ValidationError[];\n };\n sanyValidation: {\n passed: boolean;\n result: SANYValidationResult | null;\n };\n roundTripValidation: {\n passed: boolean;\n result: RoundTripResult | null;\n };\n};\n\n/**\n * Validation error thrown when generation produces invalid TLA+\n */\nexport class TLAValidationError extends Error {\n constructor(\n message: string,\n public readonly report: ValidationReport\n ) {\n super(message);\n this.name = \"TLAValidationError\";\n }\n}\n\nexport class TLAGenerator {\n private lines: string[] = [];\n private indent = 0;\n private extractedInvariants: Invariant[] = [];\n private temporalProperties: TemporalProperty[] = [];\n private symmetrySets: string[] = [];\n // Map from messageType to resolved unique action name (handles collisions)\n private resolvedActionNames: Map<string, string> = new Map();\n // Tab symmetry state\n private tabSymmetryEnabled: boolean = false;\n private tabCount: number = 0;\n\n /**\n * Create TLA+ generator with optional validators and property generators\n *\n * If validators are provided, generate() will automatically validate\n * the generated spec and throw TLAValidationError if invalid.\n *\n * If enableInvariants or enableTemporalProperties is true, the generator\n * will extract and include these properties in the spec.\n */\n constructor(\n private options?: {\n validator?: TLAValidator;\n sanyRunner?: SANYRunner;\n roundTripValidator?: RoundTripValidator;\n enableInvariants?: boolean;\n enableTemporalProperties?: boolean;\n projectPath?: string; // Required if enableInvariants is true\n }\n ) {}\n\n /**\n * Check if a string is a valid TLA+ identifier\n * TLA+ identifiers must:\n * - Start with a letter (a-zA-Z)\n * - Contain only letters, digits, and underscores\n * - Not be empty\n */\n private isValidTLAIdentifier(s: string): boolean {\n if (!s || s.length === 0) {\n return false;\n }\n // TLA+ identifiers: start with letter, contain only alphanumeric + underscore\n return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(s);\n }\n\n /**\n * Generate TLA+ specification with optional validation\n *\n * If validators were provided in constructor, this method will:\n * 1. Pre-validate inputs\n * 2. Generate spec\n * 3. Fast syntax validation\n * 4. SANY validation (comprehensive)\n * 5. Round-trip validation\n *\n * Throws TLAValidationError if validation fails.\n */\n async generate(\n config: VerificationConfig,\n analysis: CodebaseAnalysis\n ): Promise<{\n spec: string;\n cfg: string;\n validation?: ValidationReport;\n }> {\n // Pre-validate inputs\n this.validateInputs(config, analysis);\n\n // Extract invariants and temporal properties if enabled\n this.extractInvariantsIfEnabled();\n this.generateTemporalPropertiesIfEnabled(analysis);\n\n // Generate spec and config\n this.lines = [];\n this.indent = 0;\n const spec = this.generateSpec(config, analysis);\n const cfg = this.generateConfig(config);\n\n // If no validators provided, return immediately (backward compatibility)\n if (!this.hasValidators()) {\n return { spec, cfg };\n }\n\n // Perform all validations\n const validation = await this.performAllValidations(spec, config, analysis);\n\n return { spec, cfg, validation };\n }\n\n /**\n * Check if any validators are configured\n */\n private hasValidators(): boolean {\n return !!(\n this.options?.validator ||\n this.options?.sanyRunner ||\n this.options?.roundTripValidator\n );\n }\n\n /**\n * Extract invariants from project if enabled\n */\n private extractInvariantsIfEnabled(): void {\n if (this.options?.enableInvariants && this.options.projectPath) {\n const extractor = new InvariantExtractor();\n const result = extractor.extractInvariants(this.options.projectPath);\n this.extractedInvariants = result.invariants;\n\n if (result.warnings.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] Invariant extraction warnings:\");\n for (const warning of result.warnings) {\n console.log(` - ${warning}`);\n }\n }\n }\n }\n\n /**\n * Generate temporal properties if enabled\n */\n private generateTemporalPropertiesIfEnabled(analysis: CodebaseAnalysis): void {\n if (this.options?.enableTemporalProperties) {\n const generator = new TemporalPropertyGenerator();\n this.temporalProperties = generator.generateProperties(analysis);\n }\n }\n\n /**\n * Perform all validations and return report\n */\n private async performAllValidations(\n spec: string,\n config: VerificationConfig,\n analysis: CodebaseAnalysis\n ): Promise<ValidationReport> {\n // Fast syntax validation\n const syntaxErrors = this.performSyntaxValidation(spec);\n\n // SANY validation (comprehensive)\n const sanyResult = await this.performSANYValidation(spec);\n\n // Round-trip validation\n const roundTripResult = await this.performRoundTripValidation(config, analysis, spec);\n\n // Build validation report\n const validation: ValidationReport = {\n syntaxValidation: {\n passed: syntaxErrors.length === 0,\n errors: syntaxErrors,\n },\n sanyValidation: {\n passed: sanyResult ? sanyResult.valid : true,\n result: sanyResult,\n },\n roundTripValidation: {\n passed: roundTripResult ? roundTripResult.valid : true,\n result: roundTripResult,\n },\n };\n\n // If any validation failed, throw error\n if (\n !validation.syntaxValidation.passed ||\n !validation.sanyValidation.passed ||\n !validation.roundTripValidation.passed\n ) {\n throw new TLAValidationError(this.buildValidationErrorMessage(validation), validation);\n }\n\n return validation;\n }\n\n /**\n * Perform fast syntax validation\n */\n private performSyntaxValidation(spec: string): ValidationError[] {\n const syntaxErrors: ValidationError[] = [];\n if (this.options?.validator) {\n const moduleErrors = this.options.validator.validateModuleStructure(spec);\n syntaxErrors.push(...moduleErrors);\n }\n return syntaxErrors;\n }\n\n /**\n * Perform SANY validation\n */\n private async performSANYValidation(spec: string): Promise<SANYValidationResult | null> {\n if (!this.options?.sanyRunner) {\n return null;\n }\n\n // Write spec to temp file for SANY\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"polly-sany-\"));\n const specPath = path.join(tempDir, \"UserApp.tla\");\n fs.writeFileSync(specPath, spec);\n\n try {\n return await this.options.sanyRunner.validateSpec(specPath);\n } finally {\n // Cleanup temp file\n try {\n fs.rmSync(tempDir, { recursive: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n\n /**\n * Perform round-trip validation\n */\n private async performRoundTripValidation(\n config: VerificationConfig,\n analysis: CodebaseAnalysis,\n spec: string\n ): Promise<RoundTripResult | null> {\n if (!this.options?.roundTripValidator) {\n return null;\n }\n\n return await this.options.roundTripValidator.validate(config, analysis, spec);\n }\n\n /**\n * Pre-validate inputs before generation\n */\n private validateInputs(_config: VerificationConfig, analysis: CodebaseAnalysis): void {\n // Validate message types are valid TLA+ identifiers\n for (const messageType of analysis.messageTypes) {\n if (!this.isValidTLAIdentifier(messageType)) {\n throw new Error(\n `Invalid message type '${messageType}'. TLA+ identifiers must start with a letter and contain only letters, digits, and underscores.`\n );\n }\n }\n\n // Note: State field names are sanitized (dots → underscores) during generation,\n // so we don't validate them here as strict TLA+ identifiers\n }\n\n /**\n * Build user-friendly error message from validation report\n */\n private buildValidationErrorMessage(validation: ValidationReport): string {\n const messages: string[] = [\"TLA+ generation validation failed:\"];\n\n this.appendSyntaxErrors(validation, messages);\n this.appendSANYErrors(validation, messages);\n this.appendRoundTripErrors(validation, messages);\n\n return messages.join(\"\\n\");\n }\n\n /**\n * Append syntax validation errors to message array\n */\n private appendSyntaxErrors(validation: ValidationReport, messages: string[]): void {\n if (!validation.syntaxValidation.passed) {\n messages.push(`\\n Syntax errors (${validation.syntaxValidation.errors.length}):`);\n for (const error of validation.syntaxValidation.errors.slice(0, 5)) {\n const location = error.line ? ` at line ${error.line}` : \"\";\n messages.push(` - ${error.message}${location}`);\n }\n if (validation.syntaxValidation.errors.length > 5) {\n messages.push(` ... and ${validation.syntaxValidation.errors.length - 5} more`);\n }\n }\n }\n\n /**\n * Append SANY validation errors to message array\n */\n private appendSANYErrors(validation: ValidationReport, messages: string[]): void {\n if (!validation.sanyValidation.passed && validation.sanyValidation.result) {\n messages.push(\n `\\n SANY validation errors (${validation.sanyValidation.result.errors.length}):`\n );\n for (const error of validation.sanyValidation.result.errors.slice(0, 5)) {\n const location = error.line ? ` at line ${error.line}` : \"\";\n messages.push(` - ${error.message}${location}`);\n if (error.suggestion) {\n messages.push(` Suggestion: ${error.suggestion}`);\n }\n }\n if (validation.sanyValidation.result.errors.length > 5) {\n messages.push(` ... and ${validation.sanyValidation.result.errors.length - 5} more`);\n }\n }\n }\n\n /**\n * Append round-trip validation errors to message array\n */\n private appendRoundTripErrors(validation: ValidationReport, messages: string[]): void {\n if (!validation.roundTripValidation.passed && validation.roundTripValidation.result) {\n messages.push(\n `\\n Round-trip validation errors (${validation.roundTripValidation.result.errors.length}):`\n );\n for (const error of validation.roundTripValidation.result.errors.slice(0, 5)) {\n messages.push(` - ${error.message}`);\n }\n if (validation.roundTripValidation.result.errors.length > 5) {\n messages.push(\n ` ... and ${validation.roundTripValidation.result.errors.length - 5} more`\n );\n }\n }\n }\n\n private generateSpec(config: VerificationConfig, analysis: CodebaseAnalysis): string {\n this.lines = [];\n this.indent = 0;\n\n this.addHeader();\n this.addExtends();\n this.addConstants(config);\n this.addMessageTypes(config, analysis);\n this.addTabSymmetry(config);\n this.addStateType(config, analysis);\n this.addVariables();\n\n // Add delivered tracking if temporal properties enabled\n if (this.temporalProperties.length > 0) {\n this.addDeliveredTracking();\n }\n\n this.addInit(config, analysis);\n this.addActions(config, analysis);\n this.addRouteWithHandlers(config, analysis);\n this.addNext(config, analysis);\n this.addSpec();\n this.addInvariants(config, analysis);\n\n // Add temporal properties if enabled\n if (this.temporalProperties.length > 0) {\n this.addTemporalProperties();\n }\n\n return this.lines.join(\"\\n\");\n }\n\n private generateConfig(config: VerificationConfig): string {\n const lines: string[] = [];\n\n this.addConfigHeader(lines);\n this.addBasicConstants(lines, config);\n this.addProjectSpecificConstants(lines, config.messages);\n this.addStateBoundsConstants(lines, config.state);\n this.addInvariantsSection(lines);\n this.addTemporalPropertiesSection(lines);\n this.addConstraintSection(lines);\n this.addSymmetrySection(lines, config);\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Add config file header\n */\n private addConfigHeader(lines: string[]): void {\n lines.push(\"SPECIFICATION UserSpec\");\n lines.push(\"\");\n lines.push(\"\\\\* Constants\");\n lines.push(\"CONSTANTS\");\n }\n\n /**\n * Add basic constants (Contexts, MaxMessages)\n */\n private addBasicConstants(lines: string[], config: VerificationConfig): void {\n lines.push(\" Contexts = {background, content, popup}\");\n lines.push(` MaxMessages = ${config.messages.maxInFlight || 3}`);\n // NULL is a model value used for null/undefined\n lines.push(\" NULL = NULL\");\n\n // Tier 1 Optimization: Per-message bounds\n if (config.messages.perMessageBounds) {\n for (const [msgType, bound] of Object.entries(config.messages.perMessageBounds)) {\n const constName = `MaxMessages_${msgType}`;\n lines.push(` ${constName} = ${bound}`);\n }\n }\n }\n\n /**\n * Add project-specific constants (maxWorkers, maxRenderers, etc.)\n */\n private addProjectSpecificConstants(\n lines: string[],\n messages: VerificationConfig[\"messages\"]\n ): void {\n let hasProjectConstant = false;\n\n if (\"maxWorkers\" in messages && messages.maxWorkers !== undefined) {\n lines.push(` MaxWorkers = ${messages.maxWorkers}`);\n hasProjectConstant = true;\n }\n if (\"maxRenderers\" in messages && messages.maxRenderers !== undefined) {\n lines.push(` MaxRenderers = ${messages.maxRenderers}`);\n hasProjectConstant = true;\n }\n if (\"maxContexts\" in messages && messages.maxContexts !== undefined) {\n lines.push(` MaxContexts = ${messages.maxContexts}`);\n hasProjectConstant = true;\n }\n if (\"maxClients\" in messages && messages.maxClients !== undefined && !hasProjectConstant) {\n lines.push(` MaxClients = ${messages.maxClients}`);\n hasProjectConstant = true;\n }\n\n // Handle tab constants - either model values for symmetry or MaxTabId integer\n if (this.tabSymmetryEnabled) {\n // Tab symmetry: use model value assignments\n for (let i = 0; i < this.tabCount; i++) {\n lines.push(` Tab${i} = Tab${i}`);\n }\n } else if (\"maxTabs\" in messages && messages.maxTabs !== undefined) {\n // Standard integer-based tabs with explicit maxTabs\n lines.push(` MaxTabId = ${messages.maxTabs}`);\n } else if (hasProjectConstant) {\n lines.push(\" MaxTabId = 0\");\n } else {\n lines.push(\" MaxTabId = 1\");\n }\n\n lines.push(\" TimeoutLimit = 3\");\n }\n\n /**\n * Add state bounds constants\n */\n private addStateBoundsConstants(lines: string[], state: VerificationConfig[\"state\"]): void {\n for (const [field, fieldConfig] of Object.entries(state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n const constName = this.fieldToConstName(field);\n\n if (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) {\n lines.push(` ${constName}_MaxLength = ${fieldConfig.maxLength}`);\n }\n if (\"max\" in fieldConfig && fieldConfig.max !== null) {\n lines.push(` ${constName}_Max = ${fieldConfig.max}`);\n }\n if (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null) {\n lines.push(` ${constName}_MaxSize = ${fieldConfig.maxSize}`);\n }\n }\n }\n\n /**\n * Add invariants section to config\n */\n private addInvariantsSection(lines: string[]): void {\n lines.push(\"\");\n lines.push(\"\\\\* Invariants to check\");\n lines.push(\"INVARIANTS\");\n lines.push(\" TypeOK\");\n lines.push(\" NoRoutingLoops\");\n lines.push(\" UserStateTypeInvariant\");\n\n for (const inv of this.extractedInvariants) {\n lines.push(` ${inv.name}`);\n }\n }\n\n /**\n * Add temporal properties section to config\n */\n private addTemporalPropertiesSection(lines: string[]): void {\n if (this.temporalProperties.length === 0) return;\n\n lines.push(\"\");\n lines.push(\"\\\\* Temporal properties to check\");\n lines.push(\"PROPERTIES\");\n for (const prop of this.temporalProperties) {\n lines.push(` ${prop.name}`);\n }\n }\n\n /**\n * Add constraint section to config\n */\n private addConstraintSection(lines: string[]): void {\n lines.push(\"\");\n lines.push(\"\\\\* State constraint\");\n lines.push(\"CONSTRAINT\");\n lines.push(\" StateConstraint\");\n }\n\n /**\n * Add symmetry section to config for Tier 1 optimization\n *\n * IMPORTANT (Issue #16): TLA+ config files only support ONE SYMMETRY declaration.\n * this.symmetrySets should only contain one element after addSymmetrySets() processes\n * the configuration (either a single group or a combined set).\n */\n private addSymmetrySection(lines: string[], _config: VerificationConfig): void {\n if (!this.symmetrySets || this.symmetrySets.length === 0) {\n return;\n }\n\n // Defensive assertion: TLA+ only allows one SYMMETRY declaration\n if (this.symmetrySets.length > 1) {\n throw new Error(\n `Internal error: TLA+ config files only support ONE SYMMETRY declaration (Issue #16), ` +\n `but ${this.symmetrySets.length} sets were prepared. This should have been handled in addSymmetrySets().`\n );\n }\n\n lines.push(\"\");\n lines.push(\"\\\\* Symmetry sets for state space reduction\");\n for (const setName of this.symmetrySets) {\n lines.push(`SYMMETRY ${setName}`);\n }\n }\n\n private addHeader(): void {\n this.line(\"------------------------- MODULE UserApp -------------------------\");\n this.line(\"(*\");\n this.line(\" Auto-generated TLA+ specification for web extension\");\n this.line(\" \");\n this.line(\" Generated from:\");\n this.line(\" - TypeScript type definitions\");\n this.line(\" - Verification configuration\");\n this.line(\" \");\n this.line(\" This spec extends MessageRouter with:\");\n this.line(\" - Application-specific state types\");\n this.line(\" - Message type definitions\");\n this.line(\" - State transition actions\");\n this.line(\"*)\");\n this.line(\"\");\n }\n\n private addExtends(): void {\n this.line(\"EXTENDS MessageRouter\");\n this.line(\"\");\n }\n\n private addConstants(config: VerificationConfig): void {\n // MessageRouter already defines: Contexts, MaxMessages, MaxTabId, TimeoutLimit\n // We add application-specific constants and per-message bounds constants\n // NULL is always needed for null/undefined value representation\n\n const hasStateConstants = this.hasCustomConstants(config.state);\n const hasPerMessageBounds =\n config.messages.perMessageBounds && Object.keys(config.messages.perMessageBounds).length > 0;\n\n this.line(\"\\\\* Application-specific constants\");\n this.line(\"CONSTANTS\");\n this.indent++;\n\n // NULL is always needed - used for null/undefined values in state\n this.line(\"NULL\");\n\n // Add state-related constants (NULL was already added, so start with comma)\n if (hasStateConstants) {\n this.generateConstantDeclarations(config.state, false);\n }\n\n // Add per-message bounds constants (Tier 1 optimization)\n if (hasPerMessageBounds) {\n for (const [msgType, _bound] of Object.entries(config.messages.perMessageBounds)) {\n const constName = `MaxMessages_${msgType}`;\n this.line(`,${constName}`);\n }\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Check if config has any custom constants\n */\n private hasCustomConstants(state: VerificationConfig[\"state\"]): boolean {\n return Object.values(state).some((fieldConfig) => {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) return false;\n return (\n (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) ||\n (\"max\" in fieldConfig && fieldConfig.max !== null) ||\n (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null)\n );\n });\n }\n\n /**\n * Generate constant declarations for all state fields\n * @param state - State configuration\n * @param firstConstant - Whether this is the first constant (no comma prefix)\n */\n private generateConstantDeclarations(\n state: VerificationConfig[\"state\"],\n firstConstant = true\n ): void {\n let first = firstConstant;\n\n for (const [field, fieldConfig] of Object.entries(state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n const constName = this.fieldToConstName(field);\n first = this.addFieldConstants(field, fieldConfig, constName, first);\n }\n }\n\n /**\n * Add constants for a single field\n */\n private addFieldConstants(\n field: string,\n fieldConfig: Record<string, unknown>,\n constName: string,\n first: boolean\n ): boolean {\n let isFirst = first;\n\n if (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) {\n this.line(`${isFirst ? \"\" : \",\"}${constName}_MaxLength \\\\* Max length for ${field}`);\n isFirst = false;\n }\n if (\"max\" in fieldConfig && fieldConfig.max !== null) {\n this.line(`${isFirst ? \"\" : \",\"}${constName}_Max \\\\* Max value for ${field}`);\n isFirst = false;\n }\n if (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null) {\n this.line(`${isFirst ? \"\" : \",\"}${constName}_MaxSize \\\\* Max size for ${field}`);\n isFirst = false;\n }\n\n return isFirst;\n }\n\n private addStateType(config: VerificationConfig, _analysis: CodebaseAnalysis): void {\n // Define Value type for generic sequences and maps\n this.defineValueTypes();\n\n // Generate State type definition\n this.line(\"\\\\* Application state type definition\");\n this.line(\"State == [\");\n this.indent++;\n\n const stateFields = this.collectStateFields(config, _analysis);\n this.writeStateFields(stateFields);\n\n this.indent--;\n this.line(\"]\");\n this.line(\"\");\n }\n\n private defineValueTypes(): void {\n this.line(\"\\\\* Generic value type for sequences and maps\");\n this.line(\"\\\\* Bounded to 2 values to reduce state space (2^n vs 3^n)\");\n this.line('Value == {\"v1\", \"v2\"}');\n this.line(\"\");\n\n this.line(\"\\\\* Generic key type for maps\");\n this.line(\"\\\\* Bounded to allow model checking\");\n this.line('Keys == {\"k1\", \"k2\"}');\n this.line(\"\");\n }\n\n private collectStateFields(config: VerificationConfig, _analysis: CodebaseAnalysis): string[] {\n const stateFields: string[] = [];\n\n // Add fields from config.state (with recursive flattening for nested objects)\n for (const [fieldPath, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n // Recursively collect fields from nested configurations\n this.collectNestedFields(fieldPath, fieldConfig, config, stateFields);\n }\n\n // Add fields from analysis\n for (const fieldAnalysis of _analysis.fields) {\n if (!fieldAnalysis.path || typeof fieldAnalysis.path !== \"string\") continue;\n\n const fieldName = this.sanitizeFieldName(fieldAnalysis.path);\n if (stateFields.some((f) => f.startsWith(`${fieldName}:`))) continue;\n\n const tlaType = this.inferTLATypeFromAnalysis(fieldAnalysis);\n stateFields.push(`${fieldName}: ${tlaType}`);\n }\n\n return stateFields;\n }\n\n /**\n * Recursively collect fields from nested configurations, flattening nested objects\n */\n private collectNestedFields(\n prefix: string,\n fieldConfig: FieldConfig,\n config: VerificationConfig,\n stateFields: string[]\n ): void {\n // Check if this is a leaf field (has a type we can translate)\n const tlaType = this.fieldConfigToTLAType(prefix, fieldConfig, config);\n\n // If we got a non-default type or this config has type indicators, it's a leaf field\n if (tlaType !== \"Value\" || this.hasTypeIndicators(fieldConfig)) {\n const fieldName = this.sanitizeFieldName(prefix);\n stateFields.push(`${fieldName}: ${tlaType}`);\n return;\n }\n\n // Otherwise, it's a nested object - recurse into its properties\n for (const [key, value] of Object.entries(fieldConfig)) {\n if (typeof value !== \"object\" || value === null) continue;\n\n // Skip special keys that aren't nested state fields\n if (key === \"item\" || key === \"element\") {\n // These are array element configs, not nested state\n continue;\n }\n\n const nestedPath = `${prefix}_${key}`;\n this.collectNestedFields(nestedPath, value as FieldConfig, config, stateFields);\n }\n }\n\n /**\n * Check if a field config has type indicators (not just nested structure)\n */\n private hasTypeIndicators(fieldConfig: FieldConfig): boolean {\n return (\n \"type\" in fieldConfig ||\n \"values\" in fieldConfig ||\n \"maxLength\" in fieldConfig ||\n \"min\" in fieldConfig ||\n \"max\" in fieldConfig ||\n \"maxSize\" in fieldConfig ||\n \"abstract\" in fieldConfig\n );\n }\n\n private writeStateFields(fields: string[]): void {\n if (fields.length === 0) {\n this.line(\"dummy: BOOLEAN \\\\* Placeholder for empty state\");\n return;\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const suffix = i < fields.length - 1 ? \",\" : \"\";\n this.line(`${field}${suffix}`);\n }\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex filtering logic needed for optimization\n private addMessageTypes(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n if (analysis.messageTypes.length === 0) {\n // No message types found, skip\n return;\n }\n\n // Debug: Log the config.messages object\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] Full config keys:\", Object.keys(config));\n console.log(\n \"[DEBUG] [TLAGenerator] config.messages:\",\n JSON.stringify(config.messages, null, 2)\n );\n console.log(\"[DEBUG] [TLAGenerator] config.messages.include:\", config.messages.include);\n console.log(\"[DEBUG] [TLAGenerator] config.messages.exclude:\", config.messages.exclude);\n console.log(\"[DEBUG] [TLAGenerator] analysis.messageTypes:\", analysis.messageTypes);\n }\n\n // Filter out invalid TLA+ identifiers\n let validMessageTypes: string[] = [];\n const invalidMessageTypes: string[] = [];\n\n for (const msgType of analysis.messageTypes) {\n if (this.isValidTLAIdentifier(msgType)) {\n validMessageTypes.push(msgType);\n } else {\n invalidMessageTypes.push(msgType);\n }\n }\n\n // Log warnings about invalid message types\n if (invalidMessageTypes.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[WARN] [TLAGenerator] Filtered out ${invalidMessageTypes.length} invalid message type(s):`\n );\n for (const invalid of invalidMessageTypes) {\n console.log(`[WARN] - \"${invalid}\" (not a valid TLA+ identifier)`);\n }\n }\n\n // Debug: Log message types before filtering\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[DEBUG] [TLAGenerator] Valid message types before filtering (${validMessageTypes.length}):`,\n validMessageTypes\n );\n }\n\n // Apply Tier 1 Optimization: Message filtering (Issue #12)\n const originalCount = validMessageTypes.length;\n const filteredOut: string[] = [];\n\n // Debug: Check if config.messages.include is accessible\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] Checking filter conditions:\");\n console.log(\"[DEBUG] - config.messages.include exists:\", !!config.messages.include);\n console.log(\n \"[DEBUG] - config.messages.include.length:\",\n config.messages.include?.length ?? \"N/A\"\n );\n console.log(\n \"[DEBUG] - First condition result:\",\n !!(config.messages.include && config.messages.include.length > 0)\n );\n }\n\n if (config.messages.include && config.messages.include.length > 0) {\n // Include mode: only keep specified message types\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] Entering include mode filtering\");\n }\n const included = new Set(config.messages.include);\n const beforeFilter = validMessageTypes;\n validMessageTypes = validMessageTypes.filter((msg) => included.has(msg));\n filteredOut.push(...beforeFilter.filter((msg) => !included.has(msg)));\n\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] After include filtering:\");\n console.log(\"[DEBUG] - validMessageTypes:\", validMessageTypes);\n console.log(\"[DEBUG] - filteredOut:\", filteredOut);\n }\n } else if (config.messages.exclude && config.messages.exclude.length > 0) {\n // Exclude mode: filter out specified message types\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] Entering exclude mode filtering\");\n }\n const excluded = new Set(config.messages.exclude);\n const beforeFilter = validMessageTypes;\n validMessageTypes = validMessageTypes.filter((msg) => !excluded.has(msg));\n filteredOut.push(...beforeFilter.filter((msg) => excluded.has(msg)));\n\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] After exclude filtering:\");\n console.log(\"[DEBUG] - validMessageTypes:\", validMessageTypes);\n console.log(\"[DEBUG] - filteredOut:\", filteredOut);\n }\n } else if (process.env[\"POLLY_DEBUG\"]) {\n // Debug: Log when no filtering is applied\n console.log(\"[DEBUG] [TLAGenerator] No include/exclude filtering applied\");\n console.log(\"[DEBUG] - Reason: Neither include nor exclude conditions met\");\n }\n\n // Log message filtering optimization\n if (filteredOut.length > 0) {\n const filterMode = config.messages.include ? \"include\" : \"exclude\";\n console.log(\n `[INFO] [TLAGenerator] Message filtering (${filterMode}): ${originalCount} → ${validMessageTypes.length} message types`\n );\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[INFO] Filtered out: ${filteredOut.join(\", \")}`);\n }\n } else if (config.messages.include || config.messages.exclude) {\n // If we have filters but nothing was filtered out, that's suspicious\n console.log(\"[WARN] [TLAGenerator] Message filters configured but no types were filtered\");\n }\n\n if (validMessageTypes.length === 0) {\n // No valid message types, skip\n return;\n }\n\n this.line(\"\\\\* Message types from application\");\n const messageTypeSet = validMessageTypes.map((t) => `\"${t}\"`).join(\", \");\n this.line(`UserMessageTypes == {${messageTypeSet}}`);\n this.line(\"\");\n\n // Store for symmetry reduction\n this.filteredMessageTypes = validMessageTypes;\n\n // Apply Tier 1 Optimization: Symmetry reduction\n if (config.messages.symmetry && config.messages.symmetry.length > 0) {\n this.addSymmetrySets(config.messages.symmetry, validMessageTypes);\n }\n }\n\n /**\n * Add symmetry set definitions for Tier 1 optimization\n *\n * IMPORTANT: TLA+ config files only support ONE SYMMETRY declaration (Issue #16).\n * However, we can achieve independent symmetry groups by using the union of permutations:\n * Symmetry == Permutations(Set1) \\cup Permutations(Set2)\n *\n * This is the standard approach used in real TLA+ specs (e.g., Paxos, SimpleAllocator).\n * It preserves independent group semantics while using a single SYMMETRY declaration.\n */\n private addSymmetrySets(symmetryGroups: string[][], validMessageTypes: string[]): void {\n const validTypes = new Set(validMessageTypes);\n\n this.line(\"\\\\* Symmetry sets for state space reduction (Tier 1 optimization)\");\n\n // Collect all valid symmetry groups\n const validSymmetryGroups: string[][] = [];\n\n for (let i = 0; i < symmetryGroups.length; i++) {\n const group = symmetryGroups[i];\n if (!group || group.length < 2) continue;\n\n // Filter to only valid message types in this group\n const validGroupTypes = group.filter((t) => validTypes.has(t));\n if (validGroupTypes.length < 2) {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[WARN] [TLAGenerator] Symmetry group ${i + 1} has < 2 valid types, skipping`\n );\n }\n continue;\n }\n\n validSymmetryGroups.push(validGroupTypes);\n }\n\n // If no valid symmetry groups, return early\n if (validSymmetryGroups.length === 0) {\n return;\n }\n\n // Generate individual symmetry set definitions\n for (let i = 0; i < validSymmetryGroups.length; i++) {\n const group = validSymmetryGroups[i];\n const setName = `SymmetrySet${i + 1}`;\n const setValues = group.map((t) => `\"${t}\"`).join(\", \");\n this.line(`${setName} == {${setValues}}`);\n }\n\n this.line(\"\");\n\n // Use union of Permutations for independent symmetry groups\n // This is the standard approach used in Paxos, SimpleAllocator, etc.\n if (validSymmetryGroups.length > 1) {\n this.line(\"\\\\* Independent symmetry groups via union of permutations\");\n this.line(\"\\\\* Standard TLA+ pattern (see: Paxos, SimpleAllocator)\");\n const permutationsUnion = validSymmetryGroups\n .map((_, i) => `Permutations(SymmetrySet${i + 1})`)\n .join(\" \\\\cup \");\n this.line(`Symmetry == ${permutationsUnion}`);\n\n console.log(\n `[INFO] [TLAGenerator] Symmetry reduction: ${validSymmetryGroups.length} independent symmetry groups ` +\n `(${validSymmetryGroups.map((g) => g.length).join(\", \")} message types)`\n );\n } else {\n // Single symmetry group\n this.line(`Symmetry == Permutations(SymmetrySet1)`);\n console.log(\n `[INFO] [TLAGenerator] Symmetry reduction: 1 symmetry group with ${validSymmetryGroups[0].length} message types`\n );\n }\n\n // Store \"Symmetry\" for config generation (single identifier)\n this.symmetrySets = [\"Symmetry\"];\n\n this.line(\"\");\n }\n\n /**\n * Add tab symmetry definitions for Tier 1 optimization\n *\n * When tabSymmetry is enabled, tabs are represented as model values instead of integers.\n * This enables TLC's symmetry optimization to reduce state space significantly.\n *\n * Generates:\n * CONSTANTS Tab0, Tab1, ... (in spec)\n * Tabs == {Tab0, Tab1, ...}\n * TabSymmetry == Permutations(Tabs)\n *\n * If combined with message symmetry, also generates:\n * AllSymmetry == Symmetry \\cup TabSymmetry\n */\n private addTabSymmetry(config: VerificationConfig): void {\n if (!config.messages.tabSymmetry) {\n return;\n }\n\n const maxTabs = config.messages.maxTabs ?? 1;\n this.tabCount = maxTabs + 1; // 0..maxTabs = maxTabs+1 values\n this.tabSymmetryEnabled = true;\n\n this.line(\"\\\\* Tab symmetry constants for state space reduction (Tier 1 optimization)\");\n this.line(\"CONSTANTS\");\n this.indent++;\n\n // Generate Tab0, Tab1, ..., TabN constants\n const tabConstants: string[] = [];\n for (let i = 0; i <= maxTabs; i++) {\n tabConstants.push(`Tab${i}`);\n }\n this.line(tabConstants.join(\", \"));\n this.indent--;\n this.line(\"\");\n\n // Generate Tabs set\n this.line(`Tabs == {${tabConstants.join(\", \")}}`);\n this.line(\"\");\n\n // Generate TabSymmetry permutations\n this.line(\"TabSymmetry == Permutations(Tabs)\");\n this.line(\"\");\n\n // Check if we need to combine with message symmetry\n const hasMessageSymmetry = this.symmetrySets.length > 0 && this.symmetrySets[0] === \"Symmetry\";\n\n if (hasMessageSymmetry) {\n // Combine both symmetries using union\n this.line(\"\\\\* Combined symmetry: message types and tabs\");\n this.line(\"AllSymmetry == Symmetry \\\\cup TabSymmetry\");\n this.line(\"\");\n // Update symmetrySets to use the combined set\n this.symmetrySets = [\"AllSymmetry\"];\n console.log(\n `[INFO] [TLAGenerator] Combined symmetry: message symmetry + ${this.tabCount} tabs as model values`\n );\n } else {\n // Tab symmetry only\n this.symmetrySets = [\"TabSymmetry\"];\n console.log(\n `[INFO] [TLAGenerator] Tab symmetry enabled: ${this.tabCount} tabs as model values`\n );\n }\n }\n\n private addVariables(): void {\n // MessageRouter already defines: ports, messages, pendingRequests, delivered, routingDepth, time\n // We add: contextStates for application state, payload for message payload\n\n this.line(\"\\\\* Application state per context\");\n this.line(\"VARIABLE contextStates\");\n this.line(\"\");\n this.line(\"\\\\* Message payload (abstract model - non-deterministically chosen)\");\n this.line(\"\\\\* In verification, we model payload fields as potentially any valid value\");\n this.line(\"VARIABLE payload\");\n this.line(\"\");\n this.line(\"\\\\* All variables (extending MessageRouter vars)\");\n this.line(\n \"allVars == <<ports, messages, pendingRequests, delivered, routingDepth, time, contextStates, payload>>\"\n );\n this.line(\"\");\n }\n\n private addInit(config: VerificationConfig, _analysis: CodebaseAnalysis): void {\n // Generate InitialState first\n this.line(\"\\\\* Initial application state\");\n this.line(\"InitialState == [\");\n this.indent++;\n\n const fields = this.collectInitialStateFields(config, _analysis);\n this.writeInitialStateFields(fields);\n\n this.indent--;\n this.line(\"]\");\n this.line(\"\");\n\n // Payload type definition - simplified to essential fields used by handlers\n // Reducing fields from 6 to 3 cuts state space from 2^6=64 to 2^3=8\n this.line(\"\\\\* Payload modeled with essential fields only (id, text, userId)\");\n this.line(\"\\\\* Other fields (name, role, filter) use same Value type at runtime\");\n this.line(\"PayloadType == [id: Value, text: Value, userId: Value]\");\n this.line(\"\");\n\n // Init extends MessageRouter's Init\n this.line(\"\\\\* Initial state (extends MessageRouter)\");\n this.line(\"UserInit ==\");\n this.indent++;\n this.line(\"/\\\\ Init \\\\* MessageRouter's init\");\n this.line(\"/\\\\ contextStates = [c \\\\in Contexts |-> InitialState]\");\n this.line(\"/\\\\ payload \\\\in PayloadType \\\\* Non-deterministic initial payload\");\n this.indent--;\n this.line(\"\");\n }\n\n private collectInitialStateFields(\n config: VerificationConfig,\n _analysis: CodebaseAnalysis\n ): string[] {\n const fields: string[] = [];\n\n // Add fields from config.state (with recursive flattening for nested objects)\n for (const [fieldPath, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n // Recursively collect initial values from nested configurations\n this.collectNestedInitialValues(fieldPath, fieldConfig, fields);\n }\n\n // Add fields from analysis\n for (const fieldAnalysis of _analysis.fields) {\n if (!fieldAnalysis.path || typeof fieldAnalysis.path !== \"string\") continue;\n\n const fieldName = this.sanitizeFieldName(fieldAnalysis.path);\n if (fields.some((f) => f.startsWith(`${fieldName} |->`))) continue;\n\n const initialValue = this.getInitialValueFromAnalysis(fieldAnalysis);\n fields.push(`${fieldName} |-> ${initialValue}`);\n }\n\n return fields;\n }\n\n /**\n * Recursively collect initial values from nested configurations\n */\n private collectNestedInitialValues(\n prefix: string,\n fieldConfig: FieldConfig,\n fields: string[]\n ): void {\n // Check if this is a leaf field (has type indicators)\n if (this.hasTypeIndicators(fieldConfig)) {\n const fieldName = this.sanitizeFieldName(prefix);\n const initialValue = this.getInitialValue(fieldConfig);\n fields.push(`${fieldName} |-> ${initialValue}`);\n return;\n }\n\n // Otherwise, it's a nested object - recurse into its properties\n for (const [key, value] of Object.entries(fieldConfig)) {\n if (typeof value !== \"object\" || value === null) continue;\n\n // Skip special keys that aren't nested state fields\n if (key === \"item\" || key === \"element\") {\n continue;\n }\n\n const nestedPath = `${prefix}_${key}`;\n this.collectNestedInitialValues(nestedPath, value as FieldConfig, fields);\n }\n }\n\n private writeInitialStateFields(fields: string[]): void {\n if (fields.length === 0) {\n this.line(\"dummy |-> FALSE \\\\* Placeholder for empty state\");\n return;\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const suffix = i < fields.length - 1 ? \",\" : \"\";\n this.line(`${field}${suffix}`);\n }\n }\n\n private addActions(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Application-specific actions\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n if (analysis.handlers.length === 0) {\n this.generateNoHandlersStub();\n return;\n }\n\n const { validHandlers, invalidHandlers } = this.filterHandlersByValidity(analysis.handlers);\n this.logInvalidHandlers(invalidHandlers);\n\n if (validHandlers.length === 0) {\n this.generateNoValidHandlersStub();\n return;\n }\n\n // Resolve action names before generation to handle naming collisions\n this.resolveActionNamesForHandlers(validHandlers);\n\n const handlersByType = this.groupHandlersByType(validHandlers);\n this.generateHandlerActions(handlersByType, config, analysis.stateConstraints ?? []);\n this.generateStateTransitionDispatcher(handlersByType);\n }\n\n /**\n * Generate stub for no handlers found\n */\n private generateNoHandlersStub(): void {\n this.line(\"\\\\* No message handlers found in codebase\");\n this.line(\"\\\\* State remains unchanged for all messages\");\n this.line(\"StateTransition(ctx, msgType) ==\");\n this.indent++;\n this.line(\"UNCHANGED contextStates\");\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Generate stub for no valid handlers\n */\n private generateNoValidHandlersStub(): void {\n this.line(\"\\\\* No valid message handlers found (all had invalid TLA+ identifiers)\");\n this.line(\"\\\\* State remains unchanged for all messages\");\n this.line(\"StateTransition(ctx, msgType) ==\");\n this.indent++;\n this.line(\"UNCHANGED contextStates\");\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Filter handlers into valid and invalid based on TLA+ identifier rules\n */\n private filterHandlersByValidity(handlers: MessageHandler[]): {\n validHandlers: MessageHandler[];\n invalidHandlers: MessageHandler[];\n } {\n const validHandlers: MessageHandler[] = [];\n const invalidHandlers: MessageHandler[] = [];\n\n for (const handler of handlers) {\n if (this.isValidTLAIdentifier(handler.messageType)) {\n validHandlers.push(handler);\n } else {\n invalidHandlers.push(handler);\n }\n }\n\n return { validHandlers, invalidHandlers };\n }\n\n /**\n * Log warnings about invalid handlers\n */\n private logInvalidHandlers(invalidHandlers: MessageHandler[]): void {\n if (invalidHandlers.length === 0 || !process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(\n `[WARN] [TLAGenerator] Filtered out ${invalidHandlers.length} handler(s) with invalid message types:`\n );\n for (const handler of invalidHandlers) {\n console.log(\n `[WARN] - \"${handler.messageType}\" at ${handler.location.file}:${handler.location.line}`\n );\n }\n }\n\n /**\n * Group handlers by message type\n */\n private groupHandlersByType(handlers: MessageHandler[]): Map<string, MessageHandler[]> {\n const handlersByType = new Map<string, MessageHandler[]>();\n\n for (const handler of handlers) {\n if (!handlersByType.has(handler.messageType)) {\n handlersByType.set(handler.messageType, []);\n }\n handlersByType.get(handler.messageType)?.push(handler);\n }\n\n return handlersByType;\n }\n\n /**\n * Generate handler actions for all message types\n */\n private generateHandlerActions(\n handlersByType: Map<string, MessageHandler[]>,\n config: VerificationConfig,\n stateConstraints: Array<{\n field: string;\n messageType: string;\n requires?: string;\n ensures?: string;\n message?: string;\n }>\n ): void {\n this.line(\"\\\\* State transitions extracted from message handlers\");\n this.line(\"\");\n\n for (const [messageType, handlers] of handlersByType.entries()) {\n // Find state constraints for this message type\n const constraintsForMessage = stateConstraints.filter((c) => c.messageType === messageType);\n this.generateHandlerAction(messageType, handlers, config, constraintsForMessage);\n }\n }\n\n /**\n * Generate main StateTransition dispatcher\n */\n private generateStateTransitionDispatcher(handlersByType: Map<string, MessageHandler[]>): void {\n this.line(\"\\\\* Main state transition action\");\n this.line(\"StateTransition(ctx, msgType) ==\");\n this.indent++;\n\n const messageTypes = Array.from(handlersByType.keys());\n for (let i = 0; i < messageTypes.length; i++) {\n const msgType = messageTypes[i];\n if (!msgType) continue;\n const actionName = this.getResolvedActionName(msgType);\n\n if (i === 0) {\n this.line(`IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n // If this is the only message type, add ELSE clause\n if (messageTypes.length === 1) {\n this.line(\"ELSE FALSE \\\\* Unknown message type - action disabled\");\n }\n } else if (i === messageTypes.length - 1) {\n this.line(`ELSE IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n this.line(\"ELSE FALSE \\\\* Unknown message type - action disabled\");\n } else {\n this.line(`ELSE IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n }\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n private generateHandlerAction(\n messageType: string,\n handlers: MessageHandler[],\n config: VerificationConfig,\n stateConstraints: Array<{\n field: string;\n requires?: string;\n ensures?: string;\n message?: string;\n }>\n ): void {\n const actionName = this.getResolvedActionName(messageType);\n\n this.line(`\\\\* Handler for ${messageType}`);\n this.line(`${actionName}(ctx) ==`);\n this.indent++;\n\n // Collect conditions and assignments\n const allPreconditions = handlers.flatMap((h) => h.preconditions);\n const allAssignments = handlers.flatMap((h) => h.assignments);\n const allPostconditions = handlers.flatMap((h) => h.postconditions);\n\n // Wire in state-level constraints as preconditions\n for (const constraint of stateConstraints) {\n if (constraint.requires) {\n allPreconditions.push({\n expression: constraint.requires,\n message: constraint.message,\n location: { line: 0, column: 0 },\n });\n }\n }\n\n // Wire in state-level constraints as postconditions\n for (const constraint of stateConstraints) {\n if (constraint.ensures) {\n allPostconditions.push({\n expression: constraint.ensures,\n message: constraint.message,\n location: { line: 0, column: 0 },\n });\n }\n }\n\n // Emit preconditions\n this.emitPreconditions(allPreconditions);\n\n // Process and emit assignments\n const validAssignments = this.processAssignments(allAssignments, config.state);\n const usedUnchanged = this.emitStateUpdates(validAssignments, allPreconditions);\n\n // Emit postconditions only if we're not using UNCHANGED\n // When UNCHANGED is used, we can't also constrain contextStates' - it's a contradiction\n // The verification still works via preconditions (requires() conditions)\n if (!usedUnchanged) {\n this.emitPostconditions(allPostconditions);\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Emit precondition checks\n */\n private emitPreconditions(preconditions: Array<{ expression: string; message?: string }>): void {\n for (const precondition of preconditions) {\n const tlaExpr = this.tsExpressionToTLA(precondition.expression);\n const comment = precondition.message ? ` \\\\* ${precondition.message}` : \"\";\n this.line(`/\\\\ ${tlaExpr}${comment}`);\n }\n }\n\n /**\n * Emit postcondition checks\n */\n private emitPostconditions(\n postconditions: Array<{ expression: string; message?: string }>\n ): void {\n for (const postcondition of postconditions) {\n const tlaExpr = this.tsExpressionToTLA(postcondition.expression, true);\n const comment = postcondition.message ? ` \\\\* ${postcondition.message}` : \"\";\n this.line(`/\\\\ ${tlaExpr}${comment}`);\n }\n }\n\n /**\n * Process assignments, filtering and mapping null values\n */\n private processAssignments(\n assignments: Array<{ field: string; value: string | boolean | number | null }>,\n state: VerificationConfig[\"state\"]\n ): Array<{ field: string; value: string | boolean | number | null }> {\n return assignments\n .filter((a) => this.shouldIncludeAssignment(a, state))\n .map((a) => this.mapNullAssignment(a, state));\n }\n\n /**\n * Check if assignment should be included\n */\n private shouldIncludeAssignment(\n assignment: { field: string; value: string | boolean | number | null },\n state: VerificationConfig[\"state\"]\n ): boolean {\n if (assignment.value !== null) return true;\n\n // Check if null can be mapped to a valid value\n const fieldConfig = state[assignment.field];\n return !!(\n fieldConfig &&\n typeof fieldConfig === \"object\" &&\n \"values\" in fieldConfig &&\n fieldConfig.values\n );\n }\n\n /**\n * Map null assignment to a valid value if possible\n */\n private mapNullAssignment(\n assignment: { field: string; value: string | boolean | number | null },\n state: VerificationConfig[\"state\"]\n ): { field: string; value: string | boolean | number | null } {\n if (assignment.value !== null) return assignment;\n\n const fieldConfig = state[assignment.field];\n if (\n fieldConfig &&\n typeof fieldConfig === \"object\" &&\n \"values\" in fieldConfig &&\n fieldConfig.values\n ) {\n const nullValue = fieldConfig.values[fieldConfig.values.length - 1];\n return { ...assignment, value: nullValue };\n }\n\n return assignment;\n }\n\n /**\n * Emit state updates or UNCHANGED\n * @returns true if UNCHANGED was used (postconditions should be skipped)\n *\n * Emits actual state transitions when valid assignments are extracted:\n * - user_loggedIn = true -> contextStates' = [contextStates EXCEPT ![ctx].user_loggedIn = TRUE]\n *\n * Falls back to UNCHANGED when no assignments are extracted (complex expressions,\n * array operations, spreads, etc.)\n */\n private emitStateUpdates(\n validAssignments: Array<{ field: string; value: string | boolean | number | null }>,\n preconditions: Array<{ expression: string; message?: string }>\n ): boolean {\n // If we have valid assignments, emit actual state transitions\n if (validAssignments.length > 0) {\n // Build EXCEPT clause for all assignments\n const exceptClauses = validAssignments.map((a) => {\n const tlaValue = this.assignmentValueToTLA(a.value);\n return `![ctx].${this.sanitizeFieldName(a.field)} = ${tlaValue}`;\n });\n\n this.line(`/\\\\ contextStates' = [contextStates EXCEPT ${exceptClauses.join(\", \")}]`);\n return false; // State was updated, not UNCHANGED\n }\n\n // No valid assignments - use UNCHANGED\n if (preconditions.length === 0) {\n this.line(\"\\\\* No state changes in handler\");\n }\n this.line(\"/\\\\ UNCHANGED contextStates\");\n return true; // Signal that UNCHANGED was used\n }\n\n /**\n * Translate TypeScript expression to TLA+ syntax\n * @param expr - TypeScript expression from requires() or ensures()\n * @param isPrimed - If true, use contextStates' (for postconditions)\n */\n private tsExpressionToTLA(expr: string, isPrimed = false): string {\n // Early return for invalid expressions\n if (!expr || typeof expr !== \"string\") {\n return expr || \"\";\n }\n\n let tla = expr;\n\n // Replace state references with contextStates[ctx] or contextStates'[ctx]\n const statePrefix = isPrimed ? \"contextStates'[ctx]\" : \"contextStates[ctx]\";\n\n // Phase 0: Handle complex expressions FIRST (before state replacements)\n // These must come first because they have special operators (?., ??, ?) that\n // would be mangled by later replacements\n tla = this.translateComplexExpressions(tla, statePrefix);\n\n // Ensure tla is still a valid string after complex expression translation\n if (!tla || typeof tla !== \"string\") {\n return expr;\n }\n\n // Phase 1: Handle array/collection operations and string methods before generic replacements\n tla = this.translateArrayOperations(tla, statePrefix);\n if (!tla || typeof tla !== \"string\") {\n return expr;\n }\n\n tla = this.translateStringMethods(tla);\n if (!tla || typeof tla !== \"string\") {\n return expr;\n }\n\n // Phase 2a: Replace single quotes with double quotes (TLA+ uses double quotes for strings)\n tla = tla.replace(/'([^']+)'/g, '\"$1\"');\n\n // Phase 2b: Replace signal state references with contextStates[ctx]\n // Pattern 1: stateName.value.field -> contextStates[ctx].stateName_field\n // e.g., user.value.loggedIn -> contextStates[ctx].user_loggedIn\n // The state field name combines signal name and field path\n tla = tla.replace(\n /([a-zA-Z_][a-zA-Z0-9_]*)\\.value\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n (_match, stateName, path) => {\n // Combine signal name and field path with underscore separator\n const fullPath = `${stateName}_${path.replace(/\\./g, \"_\")}`;\n return `${statePrefix}.${this.sanitizeFieldName(fullPath)}`;\n }\n );\n\n // Pattern 2: stateName.value (without field) -> contextStates[ctx].stateName\n // e.g., todos.value -> contextStates[ctx].todos\n // This handles direct signal access where the signal name IS the state field\n tla = tla.replace(/([a-zA-Z_][a-zA-Z0-9_]*)\\.value\\b(?!\\.)/g, (_match, stateName) => {\n return `${statePrefix}.${stateName}`;\n });\n\n // Phase 2c: Replace state references with contextStates[ctx] or contextStates'[ctx]\n tla = tla.replace(/state\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g, (_match, path) => {\n return `${statePrefix}.${this.sanitizeFieldName(path)}`;\n });\n\n // Replace payload.field with payload.field (no change needed, but sanitize)\n tla = tla.replace(/payload\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g, (_match, path) => {\n return `payload.${this.sanitizeFieldName(path)}`;\n });\n\n // Phase 3: Replace comparison operators\n tla = tla.replace(/===/g, \"=\");\n tla = tla.replace(/!==/g, \"#\");\n tla = tla.replace(/!=/g, \"#\");\n tla = tla.replace(/==/g, \"=\");\n\n // Phase 4: Replace logical operators\n tla = tla.replace(/&&/g, \"/\\\\\");\n tla = tla.replace(/\\|\\|/g, \"\\\\/\");\n\n // Replace negation operator (careful with !== already handled)\n // Match ! that's not part of !== or !=\n tla = tla.replace(/!([^=])/g, \"~$1\");\n tla = tla.replace(/!$/g, \"~\"); // Handle ! at end of string\n\n // Phase 5: Replace boolean literals\n tla = tla.replace(/\\btrue\\b/g, \"TRUE\");\n tla = tla.replace(/\\bfalse\\b/g, \"FALSE\");\n\n // Replace null\n tla = tla.replace(/\\bnull\\b/g, \"NULL\");\n\n // Phase 6: Replace less than / greater than comparisons\n tla = tla.replace(/</g, \"<\");\n tla = tla.replace(/>/g, \">\");\n tla = tla.replace(/<=/g, \"<=\");\n tla = tla.replace(/>=/g, \">=\");\n\n // Phase 7: Convert bare identifiers (function parameters) to payload references\n // These are identifiers that aren't:\n // - Already prefixed (contextStates, payload, msg, Len, etc.)\n // - TLA+ keywords/literals (TRUE, FALSE, NULL, IF, THEN, ELSE, etc.)\n // - Quantified variables (after \\E, \\A, CHOOSE, \\in, :)\n tla = this.convertFunctionParamsToPayload(tla);\n\n return tla;\n }\n\n /**\n * Convert bare identifiers (likely function parameters) to payload.identifier\n * In the verified state pattern, function parameters are the message payload.\n *\n * Only converts identifiers that are clearly standalone variables, not:\n * - Inside string literals\n * - Property accesses (after .)\n * - Quantified variables\n * - TLA+ keywords\n */\n private convertFunctionParamsToPayload(tla: string): string {\n // TLA+ keywords and built-in operators to skip\n const tlaKeywords = new Set([\n \"TRUE\",\n \"FALSE\",\n \"NULL\",\n \"IF\",\n \"THEN\",\n \"ELSE\",\n \"LET\",\n \"IN\",\n \"CASE\",\n \"OTHER\",\n \"CHOOSE\",\n \"EXCEPT\",\n \"DOMAIN\",\n \"SUBSET\",\n \"UNION\",\n \"UNCHANGED\",\n \"Len\",\n \"Cardinality\",\n \"SubSeq\",\n \"Append\",\n \"Head\",\n \"Tail\",\n \"Seq\",\n \"ctx\",\n \"payload\",\n \"msg\",\n \"state\", // Don't convert 'state' - it's handled separately\n \"contextStates\",\n ]);\n\n // First, extract quantified variable names to skip them\n const quantifiedVars = new Set<string>();\n const quantifierPattern = /\\\\[EA]\\s+(\\w+)\\s+\\\\in|CHOOSE\\s+(\\w+)\\s+\\\\in/g;\n for (const qMatch of tla.matchAll(quantifierPattern)) {\n if (qMatch[1]) quantifiedVars.add(qMatch[1]);\n if (qMatch[2]) quantifiedVars.add(qMatch[2]);\n }\n\n // Track string literal positions to skip content inside quotes\n const stringRanges: Array<{ start: number; end: number }> = [];\n const stringPattern = /\"[^\"]*\"/g;\n for (const sMatch of tla.matchAll(stringPattern)) {\n stringRanges.push({ start: sMatch.index, end: sMatch.index + sMatch[0].length });\n }\n\n // Check if an offset is inside a string literal\n const isInsideString = (offset: number): boolean => {\n return stringRanges.some((range) => offset >= range.start && offset < range.end);\n };\n\n // Now find bare identifiers that should become payload.identifier\n // Only match identifiers that appear as standalone comparisons (e.g., = id, # id)\n // This is more conservative than matching all bare identifiers\n const result = tla.replace(\n /([=#<>]\\s*)([a-z][a-zA-Z0-9_]*)(\\s*[/#\\\\)<>,]|\\s*$)/g,\n (match, prefix, ident, suffix, offset) => {\n // Skip if inside a string literal\n if (isInsideString(offset + prefix.length)) return match;\n\n // Skip if it's a TLA+ keyword\n if (tlaKeywords.has(ident)) return match;\n\n // Skip if it's a quantified variable\n if (quantifiedVars.has(ident)) return match;\n\n // Skip if it looks like a TLA+ operator (all caps)\n if (ident === ident.toUpperCase() && ident.length > 1) return match;\n\n // Skip common false positives\n if ([\"in\", \"of\", \"or\", \"and\", \"not\"].includes(ident.toLowerCase())) return match;\n\n // This is likely a function parameter - convert to payload.identifier\n return `${prefix}payload.${ident}${suffix}`;\n }\n );\n\n return result;\n }\n\n /**\n * Translate JavaScript array/collection operations to TLA+ equivalents\n *\n * Examples:\n * - items.length -> Len(items)\n * - items.includes(x) -> x \\in items\n * - items[0] -> items[1] (1-based indexing)\n * - items.some(i => i.active) -> \\E item \\in items : item.active\n * - items.every(i => i.active) -> \\A item \\in items : item.active\n * - items.find(i => i.id === x) -> CHOOSE item \\in items : item.id = x\n * - hasLength(arr, { max: 99 }) -> Len(arr) <= 99\n * - inRange(value, min, max) -> value >= min /\\ value <= max\n * - oneOf(value, [...]) -> value \\in {...}\n */\n private translateArrayOperations(expr: string, _statePrefix: string): string {\n if (!expr || typeof expr !== \"string\") {\n return expr || \"\";\n }\n\n let result = expr;\n\n // =========================================================================\n // Verification helper functions (hasLength, inRange, oneOf)\n // These must be translated FIRST before other array operations\n // =========================================================================\n\n // hasLength(arr, { max: N }) -> Len(arr) <= N\n // hasLength(arr, { min: M }) -> Len(arr) >= M\n // hasLength(arr, { min: M, max: N }) -> Len(arr) >= M /\\ Len(arr) <= N\n result = result.replace(\n /hasLength\\(([^,]+),\\s*\\{\\s*(?:min:\\s*(\\d+))?\\s*,?\\s*(?:max:\\s*(\\d+))?\\s*\\}\\)/g,\n (_match, arrayRef, minVal, maxVal) => {\n const constraints: string[] = [];\n const arr = arrayRef.trim();\n if (minVal !== undefined) {\n constraints.push(`Len(${arr}) >= ${minVal}`);\n }\n if (maxVal !== undefined) {\n constraints.push(`Len(${arr}) <= ${maxVal}`);\n }\n if (constraints.length === 0) {\n return \"TRUE\"; // No constraints specified\n }\n return constraints.join(\" /\\\\ \");\n }\n );\n\n // inRange(value, min, max) -> value >= min /\\ value <= max\n result = result.replace(\n /inRange\\(([^,]+),\\s*(\\d+),\\s*(\\d+)\\)/g,\n (_match, valueRef, minVal, maxVal) => {\n const val = valueRef.trim();\n return `${val} >= ${minVal} /\\\\ ${val} <= ${maxVal}`;\n }\n );\n\n // oneOf(value, [v1, v2, v3]) -> value \\in {v1, v2, v3}\n result = result.replace(/oneOf\\(([^,]+),\\s*\\[([^\\]]+)\\]\\)/g, (_match, valueRef, valuesStr) => {\n const val = valueRef.trim();\n // Convert array values to set notation\n const values = valuesStr.split(\",\").map((v: string) => v.trim());\n return `${val} \\\\in {${values.join(\", \")}}`;\n });\n\n // Array.length -> Len(array)\n // Match: identifier.length or state.field.length\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.length\\b/g, (_match, arrayRef) => {\n // If it's a state reference, keep it for later replacement\n if (arrayRef.startsWith(\"state.\")) {\n return `Len(${arrayRef})`;\n }\n return `Len(${arrayRef})`;\n });\n\n // Array.includes(item) -> item \\in array\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.includes\\(([^)]+)\\)/g, (_match, arrayRef, item) => {\n return `${item.trim()} \\\\in ${arrayRef}`;\n });\n\n // Array[index] -> Array[index+1] (convert to 1-based indexing)\n // Handle nested indices: arr[0][1] -> arr[1][2]\n // Pattern matches either: identifier OR closing bracket, followed by [number]\n const _indexMap = new Map<string, number>();\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\[(\\d+)\\]|\\]\\[(\\d+)\\]/g,\n (_match, identPart, index1, index2) => {\n if (identPart) {\n // First bracket after identifier: items[0]\n const newIndex = Number.parseInt(index1, 10) + 1;\n return `${identPart}[${newIndex}]`;\n }\n // Subsequent bracket after ]: ][1]\n const newIndex = Number.parseInt(index2, 10) + 1;\n return `][${newIndex}]`;\n }\n );\n\n // Array.some(lambda) -> \\E item \\in array : condition\n // Match: array.some(item => condition) or array.some((item) => condition)\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.some\\(\\(?(\\w+)\\)?\\s*=>\\s*([^)]+)\\)/g,\n (_match, arrayRef, param, condition) => {\n // Transform lambda parameter in condition\n const tlaCondition = condition.replace(new RegExp(`\\\\b${param}\\\\.`, \"g\"), `${param}.`);\n return `\\\\E ${param} \\\\in ${arrayRef} : ${tlaCondition}`;\n }\n );\n\n // Array.every(lambda) -> \\A item \\in array : condition\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.every\\(\\(?(\\w+)\\)?\\s*=>\\s*([^)]+)\\)/g,\n (_match, arrayRef, param, condition) => {\n const tlaCondition = condition.replace(new RegExp(`\\\\b${param}\\\\.`, \"g\"), `${param}.`);\n return `\\\\A ${param} \\\\in ${arrayRef} : ${tlaCondition}`;\n }\n );\n\n // Array.find(lambda) -> CHOOSE item \\in array : condition\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.find\\(\\(?(\\w+)\\)?\\s*=>\\s*([^)]+)\\)/g,\n (_match, arrayRef, param, condition) => {\n const tlaCondition = condition.replace(new RegExp(`\\\\b${param}\\\\.`, \"g\"), `${param}.`);\n return `CHOOSE ${param} \\\\in ${arrayRef} : ${tlaCondition}`;\n }\n );\n\n // Array.filter(lambda).length -> Cardinality({item \\in array : condition})\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.filter\\(\\(?(\\w+)\\)?\\s*=>\\s*([^)]+)\\)\\.length/g,\n (_match, arrayRef, param, condition) => {\n const tlaCondition = condition.replace(new RegExp(`\\\\b${param}\\\\.`, \"g\"), `${param}.`);\n return `Cardinality({${param} \\\\in ${arrayRef} : ${tlaCondition}})`;\n }\n );\n\n // String.startsWith(prefix) -> SubSeq(str, 1, Len(prefix)) = prefix\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.startsWith\\(\"([^\"]+)\"\\)/g,\n (_match, strRef, prefix) => {\n return `SubSeq(${strRef}, 1, ${prefix.length}) = \"${prefix}\"`;\n }\n );\n\n // String.endsWith(suffix) -> SubSeq(str, Len(str)-Len(suffix)+1, Len(str)) = suffix\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.endsWith\\(\"([^\"]+)\"\\)/g, (_match, strRef, suffix) => {\n return `SubSeq(${strRef}, Len(${strRef})-${suffix.length}+1, Len(${strRef})) = \"${suffix}\"`;\n });\n\n // String.includes(substring) -> \\E i \\in 1..Len(str) : SubSeq(str, i, i+Len(sub)-1) = sub\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.includes\\(\"([^\"]+)\"\\)/g,\n (_match, strRef, substring) => {\n return `\\\\E i \\\\in 1..Len(${strRef}) : SubSeq(${strRef}, i, i+${substring.length}-1) = \"${substring}\"`;\n }\n );\n\n // String.slice(start, end?).length -> Len(SubSeq(...))\n // Handle chained .length first before translating slice\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.slice\\((-?\\d+)(?:,\\s*(-?\\d+))?\\)\\.length/g,\n (_match, strRef, start, end) => {\n const startNum = Number.parseInt(start, 10);\n if (end !== undefined) {\n const endNum = Number.parseInt(end, 10);\n if (startNum < 0 && endNum < 0) {\n return `Len(SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, Len(${strRef}) - ${Math.abs(endNum)}))`;\n }\n if (startNum < 0) {\n return `Len(SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, ${endNum}))`;\n }\n if (endNum < 0) {\n return `Len(SubSeq(${strRef}, ${startNum + 1}, Len(${strRef}) - ${Math.abs(endNum)}))`;\n }\n return `Len(SubSeq(${strRef}, ${startNum + 1}, ${endNum}))`;\n }\n if (startNum < 0) {\n return `Len(SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, Len(${strRef})))`;\n }\n return `Len(SubSeq(${strRef}, ${startNum + 1}, Len(${strRef})))`;\n }\n );\n\n // String.substring(start, end?).length -> Len(SubSeq(...))\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.substring\\((\\d+)(?:,\\s*(\\d+))?\\)\\.length/g,\n (_match, strRef, start, end) => {\n const startNum = Number.parseInt(start, 10);\n if (end !== undefined) {\n const endNum = Number.parseInt(end, 10);\n if (startNum > endNum) {\n return `Len(SubSeq(${strRef}, ${endNum + 1}, ${startNum}))`;\n }\n return `Len(SubSeq(${strRef}, ${startNum + 1}, ${endNum}))`;\n }\n return `Len(SubSeq(${strRef}, ${startNum + 1}, Len(${strRef})))`;\n }\n );\n\n // String.slice(start, end?) -> SubSeq(str, start+1, end?) (1-based indexing)\n // slice(start) → SubSeq(str, start+1, Len(str))\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.slice\\((-?\\d+)\\)(?!,)/g, (_match, strRef, start) => {\n const startNum = Number.parseInt(start, 10);\n if (startNum < 0) {\n // Negative index: slice(-2) → SubSeq(str, Len(str) - 2 + 1, Len(str))\n return `SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, Len(${strRef}))`;\n }\n // Positive index: slice(1) → SubSeq(str, 2, Len(str))\n return `SubSeq(${strRef}, ${startNum + 1}, Len(${strRef}))`;\n });\n\n // slice(start, end) → SubSeq(str, start+1, end)\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.slice\\((-?\\d+),\\s*(-?\\d+)\\)/g,\n (_match, strRef, start, end) => {\n const startNum = Number.parseInt(start, 10);\n const endNum = Number.parseInt(end, 10);\n\n if (startNum < 0 && endNum < 0) {\n return `SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, Len(${strRef}) - ${Math.abs(endNum)})`;\n }\n if (startNum < 0) {\n return `SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, ${endNum})`;\n }\n if (endNum < 0) {\n return `SubSeq(${strRef}, ${startNum + 1}, Len(${strRef}) - ${Math.abs(endNum)})`;\n }\n // Both positive: slice(0, 3) → SubSeq(str, 1, 3)\n return `SubSeq(${strRef}, ${startNum + 1}, ${endNum})`;\n }\n );\n\n // String.substring(start, end?) -> SubSeq(str, start+1, end?) (1-based indexing)\n // substring(start) → SubSeq(str, start+1, Len(str))\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.substring\\((\\d+)\\)(?!,)/g,\n (_match, strRef, start) => {\n const startNum = Number.parseInt(start, 10);\n return `SubSeq(${strRef}, ${startNum + 1}, Len(${strRef}))`;\n }\n );\n\n // substring(start, end) → SubSeq(str, start+1, end)\n // Note: substring auto-swaps if start > end\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.substring\\((\\d+),\\s*(\\d+)\\)/g,\n (_match, strRef, start, end) => {\n const startNum = Number.parseInt(start, 10);\n const endNum = Number.parseInt(end, 10);\n\n // substring auto-swaps indices if start > end\n if (startNum > endNum) {\n return `SubSeq(${strRef}, ${endNum + 1}, ${startNum})`;\n }\n return `SubSeq(${strRef}, ${startNum + 1}, ${endNum})`;\n }\n );\n\n return result;\n }\n\n /**\n * Translate complex JavaScript expressions to TLA+\n *\n * Handles:\n * - Ternary operators: a ? b : c → IF a THEN b ELSE c\n * - Nullish coalescing: a ?? b → IF a # NULL THEN a ELSE b\n * - Optional chaining: a?.b → IF a # NULL THEN a.b ELSE NULL\n * - Logical short-circuit: a && b → IF a THEN b ELSE FALSE\n */\n private translateComplexExpressions(expr: string, _statePrefix: string): string {\n if (!expr || typeof expr !== \"string\") {\n return expr || \"\";\n }\n\n let result = expr;\n\n // Phase 1: Handle optional chaining (must come before other operators)\n result = this.translateOptionalChaining(result);\n\n // Phase 2: Handle nullish coalescing (before ternary to avoid ?? being confused with ?)\n result = this.translateNullishCoalescing(result);\n\n // Phase 3: Handle ternary operators (after nullish so ?? doesn't interfere)\n result = this.translateTernary(result);\n\n // Phase 4: Handle logical short-circuit (advanced)\n // Note: && and || are handled later as simple operators\n // This is for special cases where we want IF-THEN-ELSE semantics\n\n return result;\n }\n\n /**\n * Translate ternary operator: condition ? trueValue : falseValue\n * → IF condition THEN trueValue ELSE falseValue\n *\n * Handles nested ternaries recursively\n */\n private translateTernary(expr: string): string {\n if (!expr || typeof expr !== \"string\" || !expr.includes(\"?\")) {\n return expr || \"\";\n }\n\n // Match ternary pattern: condition ? true_expr : false_expr\n // Use a simple approach for non-nested ternaries first\n // Pattern: anything ? anything : anything (non-greedy)\n const ternaryRegex = /([^?]+)\\?([^:]+):([^:?]+)/;\n\n let result = expr;\n let match: RegExpMatchArray | null;\n let iterations = 0;\n const maxIterations = 10; // Prevent infinite loops\n\n // Process ternaries from innermost to outermost (right to left)\n match = result.match(ternaryRegex);\n while (match && iterations < maxIterations) {\n const condition = match[1]?.trim();\n const trueVal = match[2]?.trim();\n const falseVal = match[3]?.trim();\n\n const tlaIf = `IF ${condition} THEN ${trueVal} ELSE ${falseVal}`;\n\n // Replace the matched ternary\n if (match[0]) {\n result = result.replace(match[0], tlaIf);\n }\n iterations++;\n match = result.match(ternaryRegex);\n }\n\n return result;\n }\n\n /**\n * Translate nullish coalescing: a ?? b → IF a # NULL THEN a ELSE b\n *\n * Note: JavaScript ?? checks for null or undefined, but TLA+ only has NULL\n */\n private translateNullishCoalescing(expr: string): string {\n if (!expr || typeof expr !== \"string\" || !expr.includes(\"??\")) {\n return expr || \"\";\n }\n\n // Match: expr ?? defaultValue\n // Use non-greedy matching to handle multiple ?? in sequence\n const nullishRegex = /([^?]+)\\?\\?([^?]+)/;\n\n let result = expr;\n let match: RegExpMatchArray | null;\n let iterations = 0;\n const maxIterations = 10;\n\n match = result.match(nullishRegex);\n while (match && iterations < maxIterations) {\n const value = match[1]?.trim();\n const defaultVal = match[2]?.trim();\n\n const tlaIf = `IF ${value} # NULL THEN ${value} ELSE ${defaultVal}`;\n\n if (match[0]) {\n result = result.replace(match[0], tlaIf);\n }\n iterations++;\n match = result.match(nullishRegex);\n }\n\n return result;\n }\n\n /**\n * Translate optional chaining: a?.b?.c → IF a # NULL /\\ a.b # NULL THEN a.b.c ELSE NULL\n *\n * Strategy: Convert each ?. to explicit null check iteratively\n * Supports: a?.b, a?.[0], a?.['prop'], chained a?.b?.c\n */\n private translateOptionalChaining(expr: string): string {\n // If no optional chaining, return as-is\n if (!expr.includes(\"?.\")) {\n return expr;\n }\n\n let result = expr;\n let iteration = 0;\n const maxIterations = 10;\n let previousResult = \"\";\n\n // Iteratively process ?. operators until none remain or no changes made\n while (result.includes(\"?.\") && iteration < maxIterations && result !== previousResult) {\n previousResult = result;\n\n // Pattern 1: identifier?.property (simple property access)\n // Matches: a?.b, user?.name, etc.\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\?\\.(\\w+)(?!\\?\\.)/g,\n (_match, obj, prop) => `IF ${obj} # NULL THEN ${obj}.${prop} ELSE NULL`\n );\n\n // Pattern 2: (expression)?.property (parenthesized expression)\n // Matches: (a.b.c)?.d, (user)?.name, etc.\n result = result.replace(\n /\\(([^)]+)\\)\\?\\.(\\w+)/g,\n (_match, expr, prop) => `IF (${expr}) # NULL THEN (${expr}).${prop} ELSE NULL`\n );\n\n // Pattern 3: identifier?.[index] (bracket notation with number)\n // Matches: items?.[0], arr?.[5], etc.\n // Note: TLA+ uses 1-based indexing, so [0] becomes [1]\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\?\\.\\[(\\d+)\\]/g, (_match, obj, index) => {\n const tlaIndex = Number.parseInt(index, 10) + 1; // Convert to 1-based\n return `IF ${obj} # NULL THEN ${obj}[${tlaIndex}] ELSE NULL`;\n });\n\n // Pattern 4: identifier?.['property'] or identifier?.[\"property\"]\n // Matches: obj?.['name'], user?.[\"id\"], etc.\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\?\\.\\[['\"](\\w+)['\"]\\]/g,\n (_match, obj, prop) => `IF ${obj} # NULL THEN ${obj}.${prop} ELSE NULL`\n );\n\n iteration++;\n }\n\n // If ?. still remains after max iterations, warn and return original\n if (result.includes(\"?.\") && iteration >= maxIterations) {\n // Return original rather than partially translated to avoid confusing output\n return expr;\n }\n\n return result;\n }\n\n /**\n * Translate string methods to TLA+ operators\n *\n * - str.startsWith(prefix) → SubSeq(str, 1, Len(prefix)) = prefix\n * - str.endsWith(suffix) → SubSeq(str, Len(str) - Len(suffix) + 1, Len(str)) = suffix\n * - str.includes(sub) → \\E i \\in 1..Len(str) : SubSeq(str, i, i + Len(sub) - 1) = sub\n */\n private translateStringMethods(expr: string): string {\n if (!expr || typeof expr !== \"string\") {\n return expr || \"\";\n }\n\n let result = expr;\n\n // String.startsWith(prefix)\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.startsWith\\(([^)]+)\\)/g, (_match, str, prefix) => {\n const trimmedPrefix = prefix.trim();\n return `SubSeq(${str}, 1, Len(${trimmedPrefix})) = ${trimmedPrefix}`;\n });\n\n // String.endsWith(suffix)\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.endsWith\\(([^)]+)\\)/g, (_match, str, suffix) => {\n const trimmedSuffix = suffix.trim();\n return `SubSeq(${str}, Len(${str}) - Len(${trimmedSuffix}) + 1, Len(${str})) = ${trimmedSuffix}`;\n });\n\n // String.includes(substring) - more complex, uses existential quantifier\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.includes\\(([^)]+)\\)/g, (_match, str, substring) => {\n const trimmedSub = substring.trim();\n return `\\\\E i \\\\in 1..Len(${str}) : SubSeq(${str}, i, i + Len(${trimmedSub}) - 1) = ${trimmedSub}`;\n });\n\n return result;\n }\n\n private messageTypeToActionName(messageType: string): string {\n // Defensive check: this method should only be called with valid TLA+ identifiers\n // (filtering happens earlier, but this adds an extra layer of safety)\n if (!this.isValidTLAIdentifier(messageType)) {\n // Sanitize by removing all invalid characters and replacing with underscores\n const sanitized = messageType.replace(/[^a-zA-Z0-9_]/g, \"_\");\n // Ensure it starts with a letter\n const validStart = sanitized.match(/[a-zA-Z]/);\n if (!validStart) {\n // No letters at all, can't create a valid identifier\n return \"HandleInvalidMessageType\";\n }\n // Use the sanitized version from the first letter onwards\n const validIdentifier = sanitized.slice(sanitized.indexOf(validStart[0]));\n return this.messageTypeToActionName(validIdentifier);\n }\n\n // Convert USER_LOGIN -> HandleUserLogin\n return `Handle${messageType\n .split(\"_\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join(\"\")}`;\n }\n\n /**\n * Resolve action names for all handlers, detecting and handling collisions.\n * When two different messageTypes would produce the same action name,\n * use the origin to differentiate (e.g., HandleFnConnected for state handlers).\n */\n private resolveActionNamesForHandlers(handlers: MessageHandler[]): void {\n this.resolvedActionNames.clear();\n const actionNameToMessageTypes = this.groupHandlersByActionName(handlers);\n this.resolveCollisions(actionNameToMessageTypes);\n }\n\n /**\n * Group handlers by their base action name for collision detection.\n */\n private groupHandlersByActionName(\n handlers: MessageHandler[]\n ): Map<string, Array<{ messageType: string; origin?: \"event\" | \"stateHandler\" }>> {\n const actionNameToMessageTypes = new Map<\n string,\n Array<{ messageType: string; origin?: \"event\" | \"stateHandler\" }>\n >();\n\n for (const handler of handlers) {\n const baseActionName = this.messageTypeToActionName(handler.messageType);\n if (!actionNameToMessageTypes.has(baseActionName)) {\n actionNameToMessageTypes.set(baseActionName, []);\n }\n const existing = actionNameToMessageTypes.get(baseActionName);\n if (existing && !existing.some((e) => e.messageType === handler.messageType)) {\n existing.push({ messageType: handler.messageType, origin: handler.origin });\n }\n }\n\n return actionNameToMessageTypes;\n }\n\n /**\n * Resolve naming collisions by using origin to differentiate action names.\n */\n private resolveCollisions(\n actionNameToMessageTypes: Map<\n string,\n Array<{ messageType: string; origin?: \"event\" | \"stateHandler\" }>\n >\n ): void {\n for (const [baseActionName, messageTypes] of actionNameToMessageTypes.entries()) {\n if (messageTypes.length === 1) {\n const entry = messageTypes[0];\n if (entry) {\n this.resolvedActionNames.set(entry.messageType, baseActionName);\n }\n continue;\n }\n // Collision detected - use origin to differentiate\n for (const entry of messageTypes) {\n const resolvedName =\n entry.origin === \"stateHandler\"\n ? baseActionName.replace(/^Handle/, \"HandleFn\")\n : baseActionName;\n this.resolvedActionNames.set(entry.messageType, resolvedName);\n }\n }\n }\n\n /**\n * Get the resolved action name for a message type.\n * Must call resolveActionNamesForHandlers first.\n */\n private getResolvedActionName(messageType: string): string {\n const resolved = this.resolvedActionNames.get(messageType);\n if (resolved) {\n return resolved;\n }\n // Fallback to base conversion if not pre-resolved\n return this.messageTypeToActionName(messageType);\n }\n\n private assignmentValueToTLA(value: string | boolean | number | null): string {\n if (typeof value === \"boolean\") {\n return value ? \"TRUE\" : \"FALSE\";\n }\n if (typeof value === \"number\") {\n return String(value);\n }\n if (value === null) {\n return \"NULL\"; // Will need to handle this based on type\n }\n if (typeof value === \"string\") {\n // Check if this is already a TLA+ expression (compound operator or array mutation)\n // These contain @ (current value reference) or TLA+ operators\n if (this.isTLAExpression(value)) {\n // Replace undefined variable references with placeholder from Value set\n return this.sanitizeTLAExpression(value);\n }\n return `\"${value}\"`; // Regular string literal\n }\n return \"NULL\";\n }\n\n /**\n * Sanitize TLA+ expressions by replacing undefined variables with placeholders\n * Uses \"v1\" from our bounded Value set for abstract model checking\n */\n private sanitizeTLAExpression(expr: string): string {\n // Pattern to match Append(@, identifier) where identifier is not quoted\n const appendPattern = /Append\\(@,\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\)/g;\n\n return expr.replace(appendPattern, (match, varName) => {\n // If it's already a string literal or number, keep it\n if (/^\".*\"$/.test(varName) || /^\\d+$/.test(varName)) {\n return match;\n }\n\n // Replace with placeholder from Value set for abstract model checking\n return 'Append(@, \"v1\")';\n });\n }\n\n /**\n * Check if a string value is a TLA+ expression (not a literal string)\n * TLA+ expressions contain:\n * - @ (current value reference for EXCEPT)\n * - TLA+ operators: Append, SubSeq, Tail, Len, Head, etc.\n * - TLA+ syntax: \\o (concatenation), << >> (sequences)\n */\n private isTLAExpression(value: string): boolean {\n // Check for @ symbol (used in EXCEPT expressions)\n if (value.includes(\"@\")) {\n return true;\n }\n\n // Check for TLA+ sequence operators\n const tlaOperators = [\n \"Append\",\n \"SubSeq\",\n \"Tail\",\n \"Head\",\n \"Len\",\n \"\\\\o\", // Concatenation\n \"<<\", // Sequence start\n \"Cardinality\", // Set cardinality\n \"CHOOSE\", // Choice operator\n \"\\\\E\", // Exists quantifier\n \"\\\\A\", // Forall quantifier\n ];\n\n return tlaOperators.some((op) => value.includes(op));\n }\n\n private addRouteWithHandlers(_config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Message Routing with State Transitions\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n if (analysis.handlers.length === 0) {\n // No handlers, just use base routing\n return;\n }\n\n this.line(\"\\\\* Route a message and invoke its handler\");\n this.line(\"UserRouteMessage(msgIndex) ==\");\n this.indent++;\n this.line(\"/\\\\ msgIndex \\\\in 1..Len(messages)\");\n this.line(\"/\\\\ LET msg == messages[msgIndex]\");\n this.line(' IN /\\\\ msg.status = \"pending\"');\n this.line(\" /\\\\ routingDepth' = routingDepth + 1\");\n this.line(\" /\\\\ routingDepth < 5\");\n this.line(\" /\\\\ \\\\E target \\\\in msg.targets :\");\n this.line(' /\\\\ IF target \\\\in Contexts /\\\\ ports[target] = \"connected\"');\n this.line(\" THEN \\\\* Successful delivery - route AND invoke handler\");\n this.line(\n ' /\\\\ messages\\' = [messages EXCEPT ![msgIndex].status = \"delivered\"]'\n );\n this.line(\" /\\\\ delivered' = delivered \\\\union {msg.id}\");\n this.line(\n \" /\\\\ pendingRequests' = [id \\\\in DOMAIN pendingRequests \\\\ {msg.id} |->\"\n );\n this.line(\" pendingRequests[id]]\");\n this.line(\" /\\\\ time' = time + 1\");\n this.line(\n \" /\\\\ \\\\E p \\\\in PayloadType : payload' = p \\\\* Non-deterministic payload\"\n );\n this.line(\" /\\\\ StateTransition(target, msg.msgType)\");\n this.line(\" ELSE \\\\* Port not connected - message fails\");\n this.line(\n ' /\\\\ messages\\' = [messages EXCEPT ![msgIndex].status = \"failed\"]'\n );\n this.line(\n \" /\\\\ pendingRequests' = [id \\\\in DOMAIN pendingRequests \\\\ {msg.id} |->\"\n );\n this.line(\" pendingRequests[id]]\");\n this.line(\" /\\\\ time' = time + 1\");\n this.line(\" /\\\\ UNCHANGED <<delivered, contextStates, payload>>\");\n this.line(\" /\\\\ UNCHANGED ports\");\n this.indent--;\n this.line(\"\");\n }\n\n private addNext(_config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* Next state relation (extends MessageRouter)\");\n this.line(\"UserNext ==\");\n this.indent++;\n\n // Check if there are any valid handlers (not just any handlers)\n const hasValidHandlers = analysis.handlers.some((h) =>\n this.isValidTLAIdentifier(h.messageType)\n );\n\n if (hasValidHandlers) {\n // Use integrated routing + handlers\n // Note: payload is UNCHANGED for non-message actions, but can change non-deterministically\n // when a message is routed (to model any possible payload value)\n this.line(\n \"\\\\/ \\\\E c \\\\in Contexts : ConnectPort(c) /\\\\ UNCHANGED <<contextStates, payload>>\"\n );\n this.line(\n \"\\\\/ \\\\E c \\\\in Contexts : DisconnectPort(c) /\\\\ UNCHANGED <<contextStates, payload>>\"\n );\n\n // Use Tabs set when tab symmetry is enabled, otherwise use 0..MaxTabId\n const tabSet = this.tabSymmetryEnabled ? \"Tabs\" : \"0..MaxTabId\";\n this.line(\n `\\\\/ \\\\E src \\\\in Contexts : \\\\E targetSet \\\\in (SUBSET Contexts \\\\ {{}}) : \\\\E tab \\\\in ${tabSet} : \\\\E msgType \\\\in UserMessageTypes :`\n );\n this.indent++;\n this.line(\n \"SendMessage(src, targetSet, tab, msgType) /\\\\ UNCHANGED <<contextStates, payload>>\"\n );\n this.indent--;\n this.line(\"\\\\/ \\\\E i \\\\in 1..Len(messages) : UserRouteMessage(i)\");\n this.line(\"\\\\/ CompleteRouting /\\\\ UNCHANGED <<contextStates, payload>>\");\n this.line(\n \"\\\\/ \\\\E i \\\\in 1..Len(messages) : TimeoutMessage(i) /\\\\ UNCHANGED <<contextStates, payload>>\"\n );\n } else {\n // No valid handlers, all actions preserve contextStates and payload\n this.line(\"\\\\/ Next /\\\\ UNCHANGED <<contextStates, payload>>\");\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n private addSpec(): void {\n this.line(\"\\\\* Specification\");\n this.line(\"UserSpec == UserInit /\\\\ [][UserNext]_allVars /\\\\ WF_allVars(UserNext)\");\n this.line(\"\");\n }\n\n private addInvariants(config: VerificationConfig, _analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Application Invariants\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n this.line(\"\\\\* TypeOK and NoRoutingLoops are inherited from MessageRouter\");\n this.line(\"\");\n\n this.line(\"\\\\* Application state type invariant\");\n this.line(\"UserStateTypeInvariant ==\");\n this.indent++;\n this.line(\"\\\\A ctx \\\\in Contexts :\");\n this.indent++;\n this.line(\"contextStates[ctx] \\\\in State\");\n this.indent--;\n this.indent--;\n this.line(\"\");\n\n // Add extracted invariants from JSDoc\n if (this.extractedInvariants.length > 0) {\n this.line(\"\\\\* Extracted invariants from code annotations\");\n this.line(\"\");\n\n const invGenerator = new InvariantGenerator();\n const tlaInvariants = invGenerator.generateTLAInvariants(this.extractedInvariants, (expr) =>\n this.tsExpressionToTLA(expr, false)\n );\n\n for (const invDef of tlaInvariants) {\n this.line(invDef);\n this.line(\"\");\n }\n }\n\n // Add Tier 2 Optimization: Temporal constraints\n if (config.tier2?.temporalConstraints && config.tier2.temporalConstraints.length > 0) {\n this.addTemporalConstraints(config.tier2.temporalConstraints);\n }\n\n this.line(\"\\\\* State constraint to bound state space\");\n this.addStateConstraint(config);\n\n this.line(\"=============================================================================\");\n }\n\n /**\n * Add temporal constraint invariants (Tier 2 optimization)\n */\n private addTemporalConstraints(\n constraints: Array<{ before: string; after: string; description?: string }>\n ): void {\n this.line(\"\\\\* Tier 2: Temporal constraint invariants\");\n this.line(\"\\\\* Enforce ordering requirements between message types\");\n this.line(\"\");\n\n for (let i = 0; i < constraints.length; i++) {\n const constraint = constraints[i];\n const invName = `TemporalConstraint${i + 1}`;\n\n if (constraint.description) {\n this.line(`\\\\* ${constraint.description}`);\n }\n this.line(`${invName} ==`);\n this.indent++;\n this.line(\n `\\\\* If ${constraint.after} has been delivered, then ${constraint.before} must have been delivered`\n );\n this.line(\n `(\\\\E i \\\\in 1..Len(messages) : messages[i].id \\\\in delivered /\\\\ messages[i].msgType = \"${constraint.after}\")`\n );\n this.line(\"=>\");\n this.line(\n `(\\\\E i \\\\in 1..Len(messages) : messages[i].id \\\\in delivered /\\\\ messages[i].msgType = \"${constraint.before}\")`\n );\n this.indent--;\n this.line(\"\");\n\n // Track this invariant for config generation\n this.extractedInvariants.push({\n name: invName,\n description:\n constraint.description || `${constraint.before} must happen before ${constraint.after}`,\n condition: \"\",\n confidence: \"high\",\n source: { file: \"\", line: 0, column: 0 },\n });\n }\n }\n\n /**\n * Generate StateConstraint with per-message bounds support (Tier 1 optimization)\n * and bounded exploration (Tier 2 optimization)\n */\n private addStateConstraint(config: VerificationConfig): void {\n const hasPerMessageBounds =\n config.messages.perMessageBounds && Object.keys(config.messages.perMessageBounds).length > 0;\n const hasBoundedExploration = config.tier2?.boundedExploration?.maxDepth !== undefined;\n\n const needsConjunction = hasPerMessageBounds || hasBoundedExploration;\n\n this.line(\"StateConstraint ==\");\n this.indent++;\n\n if (needsConjunction) {\n // Multiple constraints\n this.line(\"/\\\\ Len(messages) <= MaxMessages\");\n\n // Tier 1: Per-message bounds\n if (hasPerMessageBounds) {\n for (const [msgType, _bound] of Object.entries(config.messages.perMessageBounds)) {\n const constName = `MaxMessages_${msgType}`;\n this.line(\n `/\\\\ Cardinality({m \\\\in DOMAIN messages : messages[m].msgType = \"${msgType}\"}) <= ${constName}`\n );\n }\n }\n\n // Tier 2: Bounded exploration (depth limit)\n if (hasBoundedExploration && config.tier2?.boundedExploration?.maxDepth) {\n this.line(\n `/\\\\ TLCGet(\"level\") <= ${config.tier2.boundedExploration.maxDepth} \\\\* Tier 2: Bounded exploration`\n );\n }\n } else {\n // Simple global bound only\n this.line(\"Len(messages) <= MaxMessages\");\n }\n\n this.indent--;\n this.line(\"\");\n\n // Log bounded exploration\n if (hasBoundedExploration && config.tier2?.boundedExploration?.maxDepth) {\n console.log(\n `[INFO] [TLAGenerator] Tier 2: Bounded exploration with maxDepth = ${config.tier2.boundedExploration.maxDepth}`\n );\n }\n }\n\n /**\n * Add delivered tracking variables for temporal properties\n */\n private addDeliveredTracking(): void {\n this.line(\"\");\n const tempGenerator = new TemporalTLAGenerator();\n const deliveredVars = tempGenerator.generateDeliveredVariables();\n this.line(deliveredVars);\n this.line(\"\");\n }\n\n /**\n * Add temporal property definitions\n */\n private addTemporalProperties(): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Temporal Properties\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n const tempGenerator = new TemporalTLAGenerator();\n const tlaProperties = tempGenerator.generateTLAProperties(this.temporalProperties);\n\n for (const propDef of tlaProperties) {\n this.line(propDef);\n this.line(\"\");\n }\n\n this.line(\"=============================================================================\");\n }\n\n private fieldConfigToTLAType(\n _fieldPath: string,\n fieldConfig: FieldConfig,\n _config: VerificationConfig\n ): string {\n // Try each type pattern in order\n const typeResult =\n this.tryAbstractType(fieldConfig) ||\n this.tryBooleanType(fieldConfig) ||\n this.tryEnumType(fieldConfig) ||\n this.tryArrayType(fieldConfig) ||\n this.tryNumberType(fieldConfig) ||\n this.tryStringType(fieldConfig) ||\n this.tryMapType(fieldConfig);\n\n return typeResult || \"Value\";\n }\n\n /**\n * Try to match abstract type pattern\n * Abstract fields use the generic Value type for model checking\n */\n private tryAbstractType(fieldConfig: FieldConfig): string | null {\n if (\"abstract\" in fieldConfig && fieldConfig.abstract === true) {\n return \"Value\";\n }\n return null;\n }\n\n /**\n * Try to match boolean type pattern\n */\n private tryBooleanType(fieldConfig: FieldConfig): string | null {\n if (\"type\" in fieldConfig && fieldConfig.type === \"boolean\") {\n return \"BOOLEAN\";\n }\n\n // Check for boolean array: [true, false] or [false, true]\n if (Array.isArray(fieldConfig)) {\n if (\n fieldConfig.length === 2 &&\n typeof fieldConfig[0] === \"boolean\" &&\n typeof fieldConfig[1] === \"boolean\"\n ) {\n return \"BOOLEAN\";\n }\n }\n\n return null;\n }\n\n /**\n * Try to match enum type pattern\n */\n private tryEnumType(fieldConfig: FieldConfig): string | null {\n if (\"type\" in fieldConfig && fieldConfig.type === \"enum\" && fieldConfig.values) {\n const values = fieldConfig.values.map((v: string) => `\"${v}\"`).join(\", \");\n return `{${values}}`;\n }\n return null;\n }\n\n /**\n * Try to match array type pattern\n */\n private tryArrayType(fieldConfig: FieldConfig): string | null {\n if (\"maxLength\" in fieldConfig) {\n return \"Seq(Value)\";\n }\n return null;\n }\n\n /**\n * Try to match number type pattern\n */\n private tryNumberType(fieldConfig: FieldConfig): string | null {\n if (\"min\" in fieldConfig && \"max\" in fieldConfig) {\n const min = fieldConfig.min || 0;\n const max = fieldConfig.max || 100;\n return `${min}..${max}`;\n }\n return null;\n }\n\n /**\n * Try to match string type pattern\n */\n private tryStringType(fieldConfig: FieldConfig): string | null {\n if (!(\"values\" in fieldConfig)) return null;\n\n if (fieldConfig.values && Array.isArray(fieldConfig.values)) {\n const values = fieldConfig.values.map((v: string) => `\"${v}\"`).join(\", \");\n return `{${values}}`;\n }\n\n return \"STRING\";\n }\n\n /**\n * Try to match map type pattern\n */\n private tryMapType(fieldConfig: FieldConfig): string | null {\n if (\"maxSize\" in fieldConfig) {\n return \"[Keys -> Value]\";\n }\n return null;\n }\n\n private getInitialValueFromAnalysis(fieldAnalysis: FieldAnalysis): string {\n const typeInfo = fieldAnalysis.type;\n\n switch (typeInfo.kind) {\n case \"boolean\":\n return \"FALSE\";\n case \"string\":\n return this.getInitialStringValue(typeInfo, fieldAnalysis.bounds);\n case \"number\":\n return this.getInitialNumberValue(fieldAnalysis.bounds);\n case \"enum\":\n return this.getInitialEnumValue(typeInfo);\n case \"array\":\n return \"<<>>\";\n case \"set\":\n return \"{}\";\n case \"map\":\n return \"[x \\\\in {} |-> NULL]\";\n case \"object\":\n return \"NULL\";\n case \"null\":\n return \"NULL\";\n case \"union\":\n return this.getInitialUnionValue(typeInfo, fieldAnalysis);\n default:\n return \"NULL\";\n }\n }\n\n /**\n * Get initial value for string type\n */\n private getInitialStringValue(\n typeInfo: { enumValues?: string[] },\n bounds?: { values?: string[] }\n ): string {\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n return `\"${typeInfo.enumValues[0]}\"`;\n }\n if (bounds?.values && bounds.values.length > 0) {\n return `\"${bounds.values[0]}\"`;\n }\n return '\"\"';\n }\n\n /**\n * Get initial value for number type\n */\n private getInitialNumberValue(bounds?: { min?: number }): string {\n if (bounds?.min !== undefined) {\n return `${bounds.min}`;\n }\n return \"0\";\n }\n\n /**\n * Get initial value for enum type\n */\n private getInitialEnumValue(typeInfo: { enumValues?: string[] }): string {\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n return `\"${typeInfo.enumValues[0]}\"`;\n }\n return '\"\"';\n }\n\n /**\n * Get initial value for union type\n */\n private getInitialUnionValue(\n typeInfo: { unionTypes?: Array<{ kind: string }> },\n fieldAnalysis: FieldAnalysis\n ): string {\n if (typeInfo.unionTypes && typeInfo.unionTypes.length > 0) {\n const firstType =\n typeInfo.unionTypes.find((t) => t.kind !== \"null\") || typeInfo.unionTypes[0];\n return this.getInitialValueFromAnalysis({\n ...fieldAnalysis,\n type: firstType as FieldAnalysis[\"type\"],\n });\n }\n return \"NULL\";\n }\n\n private inferTLATypeFromAnalysis(fieldAnalysis: FieldAnalysis): string {\n const typeInfo = fieldAnalysis.type;\n\n // Handle nullable types\n const makeNullable = (baseType: string): string => {\n return typeInfo.nullable ? `${baseType} \\\\union {NULL}` : baseType;\n };\n\n // Convert TypeKind to TLA+ type\n switch (typeInfo.kind) {\n case \"boolean\":\n return makeNullable(\"BOOLEAN\");\n\n case \"string\":\n // Check if there are enum values\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n const values = typeInfo.enumValues.map((v) => `\"${v}\"`).join(\", \");\n return makeNullable(`{${values}}`);\n }\n // Check bounds for bounded strings\n if (fieldAnalysis.bounds?.values && fieldAnalysis.bounds.values.length > 0) {\n const values = fieldAnalysis.bounds.values.map((v) => `\"${v}\"`).join(\", \");\n return makeNullable(`{${values}}`);\n }\n return makeNullable(\"STRING\");\n\n case \"number\":\n // Check for numeric bounds\n if (fieldAnalysis.bounds?.min !== undefined && fieldAnalysis.bounds?.max !== undefined) {\n return makeNullable(`${fieldAnalysis.bounds.min}..${fieldAnalysis.bounds.max}`);\n }\n return makeNullable(\"Int\");\n\n case \"enum\":\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n const values = typeInfo.enumValues.map((v) => `\"${v}\"`).join(\", \");\n return makeNullable(`{${values}}`);\n }\n return makeNullable(\"STRING\");\n\n case \"array\":\n // Sequence type\n if (typeInfo.elementType) {\n // For now, use simplified Value type\n return makeNullable(\"Seq(Value)\");\n }\n return makeNullable(\"Seq(Value)\");\n\n case \"set\":\n // Set type\n return makeNullable(\"SUBSET Value\");\n\n case \"map\":\n // Function type (TLA+ records/functions)\n return makeNullable(\"[Keys -> Value]\");\n\n case \"object\":\n // For nested objects, we'd need recursive handling\n // For now, use generic Value\n return makeNullable(\"Value\");\n\n case \"union\":\n // For unions, try to find a common representation\n // For now, use generic Value\n return makeNullable(\"Value\");\n\n case \"null\":\n return \"NULL\";\n default:\n return \"Value\";\n }\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Config type discrimination requires multiple conditionals\n private getInitialValue(fieldConfig: FieldConfig): string {\n // Handle abstract fields - use value from bounded Value set\n if (\"abstract\" in fieldConfig && fieldConfig.abstract === true) {\n return '\"v1\"'; // Default value from Value set\n }\n\n // Check for boolean array: [true, false]\n if (Array.isArray(fieldConfig)) {\n if (fieldConfig.length > 0 && typeof fieldConfig[0] === \"boolean\") {\n return fieldConfig[0] ? \"TRUE\" : \"FALSE\";\n }\n // String array\n if (fieldConfig.length > 0 && typeof fieldConfig[0] === \"string\") {\n return `\"${fieldConfig[0]}\"`;\n }\n }\n\n if (\"type\" in fieldConfig) {\n if (fieldConfig.type === \"boolean\") {\n return \"FALSE\";\n }\n if (fieldConfig.type === \"enum\" && fieldConfig.values && fieldConfig.values.length > 0) {\n return `\"${fieldConfig.values[0]}\"`;\n }\n // Handle array type\n if (fieldConfig.type === \"array\") {\n return \"<<>>\"; // Empty sequence\n }\n // Handle string type\n if (fieldConfig.type === \"string\") {\n return '\"\"'; // Empty string\n }\n }\n\n if (\"maxLength\" in fieldConfig) {\n return \"<<>>\"; // Empty sequence\n }\n\n if (\"min\" in fieldConfig) {\n return String(fieldConfig.min || 0);\n }\n\n if (\"values\" in fieldConfig && fieldConfig.values && fieldConfig.values.length > 0) {\n return `\"${fieldConfig.values[0]}\"`;\n }\n\n if (\"maxSize\" in fieldConfig) {\n // Map with all keys mapped to default value\n return '[k \\\\in Keys |-> \"v1\"]';\n }\n\n return \"0\"; // Default fallback\n }\n\n private fieldToConstName(fieldPath: string): string {\n return fieldPath.replace(/\\./g, \"_\").toUpperCase();\n }\n\n private sanitizeFieldName(fieldPath: string): string {\n return fieldPath.replace(/\\./g, \"_\");\n }\n\n private line(content: string): void {\n if (content === \"\") {\n this.lines.push(\"\");\n } else {\n const indentation = \" \".repeat(this.indent);\n this.lines.push(indentation + content);\n }\n }\n}\n\nexport async function generateTLA(\n config: VerificationConfig,\n analysis: CodebaseAnalysis\n): Promise<{ spec: string; cfg: string; validation?: ValidationReport }> {\n const generator = new TLAGenerator();\n return await generator.generate(config, analysis);\n}\n",
|
|
7
|
+
"// TLA+ specification generator\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { MessageHandler } from \"../core/model\";\nimport type { SANYRunner, ValidationResult as SANYValidationResult } from \"../runner/sany\";\nimport type { CodebaseAnalysis, VerificationConfig } from \"../types\";\nimport { type Invariant, InvariantExtractor, InvariantGenerator } from \"./invariants\";\nimport type { RoundTripResult, RoundTripValidator } from \"./round-trip\";\nimport { type TemporalProperty, TemporalPropertyGenerator, TemporalTLAGenerator } from \"./temporal\";\nimport type { TLAValidator, ValidationError } from \"./tla-validator\";\n\n/**\n * Validation report from all validators\n */\nexport type ValidationReport = {\n syntaxValidation: {\n passed: boolean;\n errors: ValidationError[];\n };\n sanyValidation: {\n passed: boolean;\n result: SANYValidationResult | null;\n };\n roundTripValidation: {\n passed: boolean;\n result: RoundTripResult | null;\n };\n};\n\n/**\n * Validation error thrown when generation produces invalid TLA+\n */\nexport class TLAValidationError extends Error {\n constructor(\n message: string,\n public readonly report: ValidationReport\n ) {\n super(message);\n this.name = \"TLAValidationError\";\n }\n}\n\nexport class TLAGenerator {\n private lines: string[] = [];\n private indent = 0;\n private extractedInvariants: Invariant[] = [];\n private temporalProperties: TemporalProperty[] = [];\n private symmetrySets: string[] = [];\n // Map from messageType to resolved unique action name (handles collisions)\n private resolvedActionNames: Map<string, string> = new Map();\n // Tab symmetry state\n private tabSymmetryEnabled: boolean = false;\n private tabCount: number = 0;\n\n /**\n * Create TLA+ generator with optional validators and property generators\n *\n * If validators are provided, generate() will automatically validate\n * the generated spec and throw TLAValidationError if invalid.\n *\n * If enableInvariants or enableTemporalProperties is true, the generator\n * will extract and include these properties in the spec.\n */\n constructor(\n private options?: {\n validator?: TLAValidator;\n sanyRunner?: SANYRunner;\n roundTripValidator?: RoundTripValidator;\n enableInvariants?: boolean;\n enableTemporalProperties?: boolean;\n projectPath?: string; // Required if enableInvariants is true\n }\n ) {}\n\n /**\n * Check if a string is a valid TLA+ identifier\n * TLA+ identifiers must:\n * - Start with a letter (a-zA-Z)\n * - Contain only letters, digits, and underscores\n * - Not be empty\n */\n private isValidTLAIdentifier(s: string): boolean {\n if (!s || s.length === 0) {\n return false;\n }\n // TLA+ identifiers: start with letter, contain only alphanumeric + underscore\n return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(s);\n }\n\n /**\n * Generate TLA+ specification with optional validation\n *\n * If validators were provided in constructor, this method will:\n * 1. Pre-validate inputs\n * 2. Generate spec\n * 3. Fast syntax validation\n * 4. SANY validation (comprehensive)\n * 5. Round-trip validation\n *\n * Throws TLAValidationError if validation fails.\n */\n async generate(\n config: VerificationConfig,\n analysis: CodebaseAnalysis\n ): Promise<{\n spec: string;\n cfg: string;\n validation?: ValidationReport;\n }> {\n // Pre-validate inputs\n this.validateInputs(config, analysis);\n\n // Extract invariants and temporal properties if enabled\n this.extractInvariantsIfEnabled();\n this.generateTemporalPropertiesIfEnabled(analysis);\n\n // Generate spec and config\n this.lines = [];\n this.indent = 0;\n const spec = this.generateSpec(config, analysis);\n const cfg = this.generateConfig(config);\n\n // If no validators provided, return immediately (backward compatibility)\n if (!this.hasValidators()) {\n return { spec, cfg };\n }\n\n // Perform all validations\n const validation = await this.performAllValidations(spec, config, analysis);\n\n return { spec, cfg, validation };\n }\n\n /**\n * Check if any validators are configured\n */\n private hasValidators(): boolean {\n return !!(\n this.options?.validator ||\n this.options?.sanyRunner ||\n this.options?.roundTripValidator\n );\n }\n\n /**\n * Extract invariants from project if enabled\n */\n private extractInvariantsIfEnabled(): void {\n if (this.options?.enableInvariants && this.options.projectPath) {\n const extractor = new InvariantExtractor();\n const result = extractor.extractInvariants(this.options.projectPath);\n this.extractedInvariants = result.invariants;\n\n if (result.warnings.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] Invariant extraction warnings:\");\n for (const warning of result.warnings) {\n console.log(` - ${warning}`);\n }\n }\n }\n }\n\n /**\n * Generate temporal properties if enabled\n */\n private generateTemporalPropertiesIfEnabled(analysis: CodebaseAnalysis): void {\n if (this.options?.enableTemporalProperties) {\n const generator = new TemporalPropertyGenerator();\n this.temporalProperties = generator.generateProperties(analysis);\n }\n }\n\n /**\n * Perform all validations and return report\n */\n private async performAllValidations(\n spec: string,\n config: VerificationConfig,\n analysis: CodebaseAnalysis\n ): Promise<ValidationReport> {\n // Fast syntax validation\n const syntaxErrors = this.performSyntaxValidation(spec);\n\n // SANY validation (comprehensive)\n const sanyResult = await this.performSANYValidation(spec);\n\n // Round-trip validation\n const roundTripResult = await this.performRoundTripValidation(config, analysis, spec);\n\n // Build validation report\n const validation: ValidationReport = {\n syntaxValidation: {\n passed: syntaxErrors.length === 0,\n errors: syntaxErrors,\n },\n sanyValidation: {\n passed: sanyResult ? sanyResult.valid : true,\n result: sanyResult,\n },\n roundTripValidation: {\n passed: roundTripResult ? roundTripResult.valid : true,\n result: roundTripResult,\n },\n };\n\n // If any validation failed, throw error\n if (\n !validation.syntaxValidation.passed ||\n !validation.sanyValidation.passed ||\n !validation.roundTripValidation.passed\n ) {\n throw new TLAValidationError(this.buildValidationErrorMessage(validation), validation);\n }\n\n return validation;\n }\n\n /**\n * Perform fast syntax validation\n */\n private performSyntaxValidation(spec: string): ValidationError[] {\n const syntaxErrors: ValidationError[] = [];\n if (this.options?.validator) {\n const moduleErrors = this.options.validator.validateModuleStructure(spec);\n syntaxErrors.push(...moduleErrors);\n }\n return syntaxErrors;\n }\n\n /**\n * Perform SANY validation\n */\n private async performSANYValidation(spec: string): Promise<SANYValidationResult | null> {\n if (!this.options?.sanyRunner) {\n return null;\n }\n\n // Write spec to temp file for SANY\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"polly-sany-\"));\n const specPath = path.join(tempDir, \"UserApp.tla\");\n fs.writeFileSync(specPath, spec);\n\n try {\n return await this.options.sanyRunner.validateSpec(specPath);\n } finally {\n // Cleanup temp file\n try {\n fs.rmSync(tempDir, { recursive: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n\n /**\n * Perform round-trip validation\n */\n private async performRoundTripValidation(\n config: VerificationConfig,\n analysis: CodebaseAnalysis,\n spec: string\n ): Promise<RoundTripResult | null> {\n if (!this.options?.roundTripValidator) {\n return null;\n }\n\n return await this.options.roundTripValidator.validate(config, analysis, spec);\n }\n\n /**\n * Pre-validate inputs before generation\n */\n private validateInputs(_config: VerificationConfig, analysis: CodebaseAnalysis): void {\n // Validate message types are valid TLA+ identifiers\n for (const messageType of analysis.messageTypes) {\n if (!this.isValidTLAIdentifier(messageType)) {\n throw new Error(\n `Invalid message type '${messageType}'. TLA+ identifiers must start with a letter and contain only letters, digits, and underscores.`\n );\n }\n }\n\n // Note: State field names are sanitized (dots → underscores) during generation,\n // so we don't validate them here as strict TLA+ identifiers\n }\n\n /**\n * Build user-friendly error message from validation report\n */\n private buildValidationErrorMessage(validation: ValidationReport): string {\n const messages: string[] = [\"TLA+ generation validation failed:\"];\n\n this.appendSyntaxErrors(validation, messages);\n this.appendSANYErrors(validation, messages);\n this.appendRoundTripErrors(validation, messages);\n\n return messages.join(\"\\n\");\n }\n\n /**\n * Append syntax validation errors to message array\n */\n private appendSyntaxErrors(validation: ValidationReport, messages: string[]): void {\n if (!validation.syntaxValidation.passed) {\n messages.push(`\\n Syntax errors (${validation.syntaxValidation.errors.length}):`);\n for (const error of validation.syntaxValidation.errors.slice(0, 5)) {\n const location = error.line ? ` at line ${error.line}` : \"\";\n messages.push(` - ${error.message}${location}`);\n }\n if (validation.syntaxValidation.errors.length > 5) {\n messages.push(` ... and ${validation.syntaxValidation.errors.length - 5} more`);\n }\n }\n }\n\n /**\n * Append SANY validation errors to message array\n */\n private appendSANYErrors(validation: ValidationReport, messages: string[]): void {\n if (!validation.sanyValidation.passed && validation.sanyValidation.result) {\n messages.push(\n `\\n SANY validation errors (${validation.sanyValidation.result.errors.length}):`\n );\n for (const error of validation.sanyValidation.result.errors.slice(0, 5)) {\n const location = error.line ? ` at line ${error.line}` : \"\";\n messages.push(` - ${error.message}${location}`);\n if (error.suggestion) {\n messages.push(` Suggestion: ${error.suggestion}`);\n }\n }\n if (validation.sanyValidation.result.errors.length > 5) {\n messages.push(` ... and ${validation.sanyValidation.result.errors.length - 5} more`);\n }\n }\n }\n\n /**\n * Append round-trip validation errors to message array\n */\n private appendRoundTripErrors(validation: ValidationReport, messages: string[]): void {\n if (!validation.roundTripValidation.passed && validation.roundTripValidation.result) {\n messages.push(\n `\\n Round-trip validation errors (${validation.roundTripValidation.result.errors.length}):`\n );\n for (const error of validation.roundTripValidation.result.errors.slice(0, 5)) {\n messages.push(` - ${error.message}`);\n }\n if (validation.roundTripValidation.result.errors.length > 5) {\n messages.push(\n ` ... and ${validation.roundTripValidation.result.errors.length - 5} more`\n );\n }\n }\n }\n\n private generateSpec(config: VerificationConfig, analysis: CodebaseAnalysis): string {\n this.lines = [];\n this.indent = 0;\n\n this.addHeader();\n this.addExtends();\n this.addConstants(config);\n this.addMessageTypes(config, analysis);\n this.addTabSymmetry(config);\n this.addStateType(config, analysis);\n this.addVariables();\n\n // Add delivered tracking if temporal properties enabled\n if (this.temporalProperties.length > 0) {\n this.addDeliveredTracking();\n }\n\n this.addInit(config, analysis);\n this.addActions(config, analysis);\n this.addRouteWithHandlers(config, analysis);\n this.addNext(config, analysis);\n this.addSpec();\n this.addInvariants(config, analysis);\n\n // Add temporal properties if enabled\n if (this.temporalProperties.length > 0) {\n this.addTemporalProperties();\n }\n\n return this.lines.join(\"\\n\");\n }\n\n private generateConfig(config: VerificationConfig): string {\n const lines: string[] = [];\n\n this.addConfigHeader(lines);\n this.addBasicConstants(lines, config);\n this.addProjectSpecificConstants(lines, config.messages);\n this.addStateBoundsConstants(lines, config.state);\n this.addInvariantsSection(lines);\n this.addTemporalPropertiesSection(lines);\n this.addConstraintSection(lines);\n this.addSymmetrySection(lines, config);\n\n return lines.join(\"\\n\");\n }\n\n /**\n * Add config file header\n */\n private addConfigHeader(lines: string[]): void {\n lines.push(\"SPECIFICATION UserSpec\");\n lines.push(\"\");\n lines.push(\"\\\\* Constants\");\n lines.push(\"CONSTANTS\");\n }\n\n /**\n * Add basic constants (Contexts, MaxMessages)\n */\n private addBasicConstants(lines: string[], config: VerificationConfig): void {\n lines.push(\" Contexts = {background, content, popup}\");\n lines.push(` MaxMessages = ${config.messages.maxInFlight || 3}`);\n // NULL is a model value used for null/undefined\n lines.push(\" NULL = NULL\");\n\n // Tier 1 Optimization: Per-message bounds\n if (config.messages.perMessageBounds) {\n for (const [msgType, bound] of Object.entries(config.messages.perMessageBounds)) {\n const constName = `MaxMessages_${msgType}`;\n lines.push(` ${constName} = ${bound}`);\n }\n }\n }\n\n /**\n * Add project-specific constants (maxWorkers, maxRenderers, etc.)\n */\n private addProjectSpecificConstants(\n lines: string[],\n messages: VerificationConfig[\"messages\"]\n ): void {\n let hasProjectConstant = false;\n\n if (\"maxWorkers\" in messages && messages.maxWorkers !== undefined) {\n lines.push(` MaxWorkers = ${messages.maxWorkers}`);\n hasProjectConstant = true;\n }\n if (\"maxRenderers\" in messages && messages.maxRenderers !== undefined) {\n lines.push(` MaxRenderers = ${messages.maxRenderers}`);\n hasProjectConstant = true;\n }\n if (\"maxContexts\" in messages && messages.maxContexts !== undefined) {\n lines.push(` MaxContexts = ${messages.maxContexts}`);\n hasProjectConstant = true;\n }\n if (\"maxClients\" in messages && messages.maxClients !== undefined && !hasProjectConstant) {\n lines.push(` MaxClients = ${messages.maxClients}`);\n hasProjectConstant = true;\n }\n\n // Handle tab constants - either model values for symmetry or integer set\n if (this.tabSymmetryEnabled) {\n // Tab symmetry: use model value assignments\n for (let i = 0; i < this.tabCount; i++) {\n lines.push(` Tab${i} = Tab${i}`);\n }\n // Define Tabs as the set of model values\n const tabValues = Array.from({ length: this.tabCount }, (_, i) => `Tab${i}`).join(\", \");\n lines.push(` Tabs = {${tabValues}}`);\n } else if (\"maxTabs\" in messages && messages.maxTabs !== undefined) {\n // Standard integer-based tabs with explicit maxTabs\n const tabValues = Array.from({ length: messages.maxTabs + 1 }, (_, i) => i).join(\", \");\n lines.push(` Tabs = {${tabValues}}`);\n } else if (hasProjectConstant) {\n lines.push(\" Tabs = {0}\");\n } else {\n lines.push(\" Tabs = {0, 1}\");\n }\n\n lines.push(\" TimeoutLimit = 3\");\n }\n\n /**\n * Add state bounds constants\n */\n private addStateBoundsConstants(lines: string[], state: VerificationConfig[\"state\"]): void {\n for (const [field, fieldConfig] of Object.entries(state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n const constName = this.fieldToConstName(field);\n\n if (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) {\n lines.push(` ${constName}_MaxLength = ${fieldConfig.maxLength}`);\n }\n if (\"max\" in fieldConfig && fieldConfig.max !== null) {\n lines.push(` ${constName}_Max = ${fieldConfig.max}`);\n }\n if (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null) {\n lines.push(` ${constName}_MaxSize = ${fieldConfig.maxSize}`);\n }\n }\n }\n\n /**\n * Add invariants section to config\n */\n private addInvariantsSection(lines: string[]): void {\n lines.push(\"\");\n lines.push(\"\\\\* Invariants to check\");\n lines.push(\"INVARIANTS\");\n lines.push(\" TypeOK\");\n lines.push(\" NoRoutingLoops\");\n lines.push(\" UserStateTypeInvariant\");\n\n for (const inv of this.extractedInvariants) {\n lines.push(` ${inv.name}`);\n }\n }\n\n /**\n * Add temporal properties section to config\n */\n private addTemporalPropertiesSection(lines: string[]): void {\n if (this.temporalProperties.length === 0) return;\n\n lines.push(\"\");\n lines.push(\"\\\\* Temporal properties to check\");\n lines.push(\"PROPERTIES\");\n for (const prop of this.temporalProperties) {\n lines.push(` ${prop.name}`);\n }\n }\n\n /**\n * Add constraint section to config\n */\n private addConstraintSection(lines: string[]): void {\n lines.push(\"\");\n lines.push(\"\\\\* State constraint\");\n lines.push(\"CONSTRAINT\");\n lines.push(\" StateConstraint\");\n }\n\n /**\n * Add symmetry section to config for Tier 1 optimization\n *\n * IMPORTANT (Issue #16): TLA+ config files only support ONE SYMMETRY declaration.\n * this.symmetrySets should only contain one element after addSymmetrySets() processes\n * the configuration (either a single group or a combined set).\n */\n private addSymmetrySection(lines: string[], _config: VerificationConfig): void {\n if (!this.symmetrySets || this.symmetrySets.length === 0) {\n return;\n }\n\n // Defensive assertion: TLA+ only allows one SYMMETRY declaration\n if (this.symmetrySets.length > 1) {\n throw new Error(\n `Internal error: TLA+ config files only support ONE SYMMETRY declaration (Issue #16), ` +\n `but ${this.symmetrySets.length} sets were prepared. This should have been handled in addSymmetrySets().`\n );\n }\n\n lines.push(\"\");\n lines.push(\"\\\\* Symmetry sets for state space reduction\");\n for (const setName of this.symmetrySets) {\n lines.push(`SYMMETRY ${setName}`);\n }\n }\n\n private addHeader(): void {\n this.line(\"------------------------- MODULE UserApp -------------------------\");\n this.line(\"(*\");\n this.line(\" Auto-generated TLA+ specification for web extension\");\n this.line(\" \");\n this.line(\" Generated from:\");\n this.line(\" - TypeScript type definitions\");\n this.line(\" - Verification configuration\");\n this.line(\" \");\n this.line(\" This spec extends MessageRouter with:\");\n this.line(\" - Application-specific state types\");\n this.line(\" - Message type definitions\");\n this.line(\" - State transition actions\");\n this.line(\"*)\");\n this.line(\"\");\n }\n\n private addExtends(): void {\n this.line(\"EXTENDS MessageRouter\");\n this.line(\"\");\n }\n\n private addConstants(config: VerificationConfig): void {\n // MessageRouter already defines: Contexts, MaxMessages, Tabs, TimeoutLimit\n // We add application-specific constants and per-message bounds constants\n // NULL is always needed for null/undefined value representation\n\n const hasStateConstants = this.hasCustomConstants(config.state);\n const hasPerMessageBounds =\n config.messages.perMessageBounds && Object.keys(config.messages.perMessageBounds).length > 0;\n\n this.line(\"\\\\* Application-specific constants\");\n this.line(\"CONSTANTS\");\n this.indent++;\n\n // NULL is always needed - used for null/undefined values in state\n this.line(\"NULL\");\n\n // Add state-related constants (NULL was already added, so start with comma)\n if (hasStateConstants) {\n this.generateConstantDeclarations(config.state, false);\n }\n\n // Add per-message bounds constants (Tier 1 optimization)\n if (hasPerMessageBounds) {\n for (const [msgType, _bound] of Object.entries(config.messages.perMessageBounds)) {\n const constName = `MaxMessages_${msgType}`;\n this.line(`,${constName}`);\n }\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Check if config has any custom constants\n */\n private hasCustomConstants(state: VerificationConfig[\"state\"]): boolean {\n return Object.values(state).some((fieldConfig) => {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) return false;\n return (\n (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) ||\n (\"max\" in fieldConfig && fieldConfig.max !== null) ||\n (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null)\n );\n });\n }\n\n /**\n * Generate constant declarations for all state fields\n * @param state - State configuration\n * @param firstConstant - Whether this is the first constant (no comma prefix)\n */\n private generateConstantDeclarations(\n state: VerificationConfig[\"state\"],\n firstConstant = true\n ): void {\n let first = firstConstant;\n\n for (const [field, fieldConfig] of Object.entries(state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n const constName = this.fieldToConstName(field);\n first = this.addFieldConstants(field, fieldConfig, constName, first);\n }\n }\n\n /**\n * Add constants for a single field\n */\n private addFieldConstants(\n field: string,\n fieldConfig: Record<string, unknown>,\n constName: string,\n first: boolean\n ): boolean {\n let isFirst = first;\n\n if (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) {\n this.line(`${isFirst ? \"\" : \",\"}${constName}_MaxLength \\\\* Max length for ${field}`);\n isFirst = false;\n }\n if (\"max\" in fieldConfig && fieldConfig.max !== null) {\n this.line(`${isFirst ? \"\" : \",\"}${constName}_Max \\\\* Max value for ${field}`);\n isFirst = false;\n }\n if (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null) {\n this.line(`${isFirst ? \"\" : \",\"}${constName}_MaxSize \\\\* Max size for ${field}`);\n isFirst = false;\n }\n\n return isFirst;\n }\n\n private addStateType(config: VerificationConfig, _analysis: CodebaseAnalysis): void {\n // Define Value type for generic sequences and maps\n this.defineValueTypes();\n\n // Generate State type definition\n this.line(\"\\\\* Application state type definition\");\n this.line(\"State == [\");\n this.indent++;\n\n const stateFields = this.collectStateFields(config, _analysis);\n this.writeStateFields(stateFields);\n\n this.indent--;\n this.line(\"]\");\n this.line(\"\");\n }\n\n private defineValueTypes(): void {\n this.line(\"\\\\* Generic value type for sequences and maps\");\n this.line(\"\\\\* Bounded to 2 values to reduce state space (2^n vs 3^n)\");\n this.line('Value == {\"v1\", \"v2\"}');\n this.line(\"\");\n\n this.line(\"\\\\* Generic key type for maps\");\n this.line(\"\\\\* Bounded to allow model checking\");\n this.line('Keys == {\"k1\", \"k2\"}');\n this.line(\"\");\n }\n\n private collectStateFields(config: VerificationConfig, _analysis: CodebaseAnalysis): string[] {\n const stateFields: string[] = [];\n\n // Add fields from config.state (with recursive flattening for nested objects)\n for (const [fieldPath, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n // Recursively collect fields from nested configurations\n this.collectNestedFields(fieldPath, fieldConfig, config, stateFields);\n }\n\n // Add fields from analysis\n for (const fieldAnalysis of _analysis.fields) {\n if (!fieldAnalysis.path || typeof fieldAnalysis.path !== \"string\") continue;\n\n const fieldName = this.sanitizeFieldName(fieldAnalysis.path);\n if (stateFields.some((f) => f.startsWith(`${fieldName}:`))) continue;\n\n const tlaType = this.inferTLATypeFromAnalysis(fieldAnalysis);\n stateFields.push(`${fieldName}: ${tlaType}`);\n }\n\n return stateFields;\n }\n\n /**\n * Recursively collect fields from nested configurations, flattening nested objects\n */\n private collectNestedFields(\n prefix: string,\n fieldConfig: FieldConfig,\n config: VerificationConfig,\n stateFields: string[]\n ): void {\n // Check if this is a leaf field (has a type we can translate)\n const tlaType = this.fieldConfigToTLAType(prefix, fieldConfig, config);\n\n // If we got a non-default type or this config has type indicators, it's a leaf field\n if (tlaType !== \"Value\" || this.hasTypeIndicators(fieldConfig)) {\n const fieldName = this.sanitizeFieldName(prefix);\n stateFields.push(`${fieldName}: ${tlaType}`);\n return;\n }\n\n // Otherwise, it's a nested object - recurse into its properties\n for (const [key, value] of Object.entries(fieldConfig)) {\n if (typeof value !== \"object\" || value === null) continue;\n\n // Skip special keys that aren't nested state fields\n if (key === \"item\" || key === \"element\") {\n // These are array element configs, not nested state\n continue;\n }\n\n const nestedPath = `${prefix}_${key}`;\n this.collectNestedFields(nestedPath, value as FieldConfig, config, stateFields);\n }\n }\n\n /**\n * Check if a field config has type indicators (not just nested structure)\n */\n private hasTypeIndicators(fieldConfig: FieldConfig): boolean {\n return (\n \"type\" in fieldConfig ||\n \"values\" in fieldConfig ||\n \"maxLength\" in fieldConfig ||\n \"min\" in fieldConfig ||\n \"max\" in fieldConfig ||\n \"maxSize\" in fieldConfig ||\n \"abstract\" in fieldConfig\n );\n }\n\n private writeStateFields(fields: string[]): void {\n if (fields.length === 0) {\n this.line(\"dummy: BOOLEAN \\\\* Placeholder for empty state\");\n return;\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const suffix = i < fields.length - 1 ? \",\" : \"\";\n this.line(`${field}${suffix}`);\n }\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Complex filtering logic needed for optimization\n private addMessageTypes(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n if (analysis.messageTypes.length === 0) {\n // No message types found, skip\n return;\n }\n\n // Debug: Log the config.messages object\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] Full config keys:\", Object.keys(config));\n console.log(\n \"[DEBUG] [TLAGenerator] config.messages:\",\n JSON.stringify(config.messages, null, 2)\n );\n console.log(\"[DEBUG] [TLAGenerator] config.messages.include:\", config.messages.include);\n console.log(\"[DEBUG] [TLAGenerator] config.messages.exclude:\", config.messages.exclude);\n console.log(\"[DEBUG] [TLAGenerator] analysis.messageTypes:\", analysis.messageTypes);\n }\n\n // Filter out invalid TLA+ identifiers\n let validMessageTypes: string[] = [];\n const invalidMessageTypes: string[] = [];\n\n for (const msgType of analysis.messageTypes) {\n if (this.isValidTLAIdentifier(msgType)) {\n validMessageTypes.push(msgType);\n } else {\n invalidMessageTypes.push(msgType);\n }\n }\n\n // Log warnings about invalid message types\n if (invalidMessageTypes.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[WARN] [TLAGenerator] Filtered out ${invalidMessageTypes.length} invalid message type(s):`\n );\n for (const invalid of invalidMessageTypes) {\n console.log(`[WARN] - \"${invalid}\" (not a valid TLA+ identifier)`);\n }\n }\n\n // Debug: Log message types before filtering\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[DEBUG] [TLAGenerator] Valid message types before filtering (${validMessageTypes.length}):`,\n validMessageTypes\n );\n }\n\n // Apply Tier 1 Optimization: Message filtering (Issue #12)\n const originalCount = validMessageTypes.length;\n const filteredOut: string[] = [];\n\n // Debug: Check if config.messages.include is accessible\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] Checking filter conditions:\");\n console.log(\"[DEBUG] - config.messages.include exists:\", !!config.messages.include);\n console.log(\n \"[DEBUG] - config.messages.include.length:\",\n config.messages.include?.length ?? \"N/A\"\n );\n console.log(\n \"[DEBUG] - First condition result:\",\n !!(config.messages.include && config.messages.include.length > 0)\n );\n }\n\n if (config.messages.include && config.messages.include.length > 0) {\n // Include mode: only keep specified message types\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] Entering include mode filtering\");\n }\n const included = new Set(config.messages.include);\n const beforeFilter = validMessageTypes;\n validMessageTypes = validMessageTypes.filter((msg) => included.has(msg));\n filteredOut.push(...beforeFilter.filter((msg) => !included.has(msg)));\n\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] After include filtering:\");\n console.log(\"[DEBUG] - validMessageTypes:\", validMessageTypes);\n console.log(\"[DEBUG] - filteredOut:\", filteredOut);\n }\n } else if (config.messages.exclude && config.messages.exclude.length > 0) {\n // Exclude mode: filter out specified message types\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] Entering exclude mode filtering\");\n }\n const excluded = new Set(config.messages.exclude);\n const beforeFilter = validMessageTypes;\n validMessageTypes = validMessageTypes.filter((msg) => !excluded.has(msg));\n filteredOut.push(...beforeFilter.filter((msg) => excluded.has(msg)));\n\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\"[DEBUG] [TLAGenerator] After exclude filtering:\");\n console.log(\"[DEBUG] - validMessageTypes:\", validMessageTypes);\n console.log(\"[DEBUG] - filteredOut:\", filteredOut);\n }\n } else if (process.env[\"POLLY_DEBUG\"]) {\n // Debug: Log when no filtering is applied\n console.log(\"[DEBUG] [TLAGenerator] No include/exclude filtering applied\");\n console.log(\"[DEBUG] - Reason: Neither include nor exclude conditions met\");\n }\n\n // Log message filtering optimization\n if (filteredOut.length > 0) {\n const filterMode = config.messages.include ? \"include\" : \"exclude\";\n console.log(\n `[INFO] [TLAGenerator] Message filtering (${filterMode}): ${originalCount} → ${validMessageTypes.length} message types`\n );\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[INFO] Filtered out: ${filteredOut.join(\", \")}`);\n }\n } else if (config.messages.include || config.messages.exclude) {\n // If we have filters but nothing was filtered out, that's suspicious\n console.log(\"[WARN] [TLAGenerator] Message filters configured but no types were filtered\");\n }\n\n if (validMessageTypes.length === 0) {\n // No valid message types, skip\n return;\n }\n\n this.line(\"\\\\* Message types from application\");\n const messageTypeSet = validMessageTypes.map((t) => `\"${t}\"`).join(\", \");\n this.line(`UserMessageTypes == {${messageTypeSet}}`);\n this.line(\"\");\n\n // Store for symmetry reduction\n this.filteredMessageTypes = validMessageTypes;\n\n // Apply Tier 1 Optimization: Symmetry reduction\n if (config.messages.symmetry && config.messages.symmetry.length > 0) {\n this.addSymmetrySets(config.messages.symmetry, validMessageTypes);\n }\n }\n\n /**\n * Add symmetry set definitions for Tier 1 optimization\n *\n * IMPORTANT: TLA+ config files only support ONE SYMMETRY declaration (Issue #16).\n * However, we can achieve independent symmetry groups by using the union of permutations:\n * Symmetry == Permutations(Set1) \\cup Permutations(Set2)\n *\n * This is the standard approach used in real TLA+ specs (e.g., Paxos, SimpleAllocator).\n * It preserves independent group semantics while using a single SYMMETRY declaration.\n */\n private addSymmetrySets(symmetryGroups: string[][], validMessageTypes: string[]): void {\n const validTypes = new Set(validMessageTypes);\n\n this.line(\"\\\\* Symmetry sets for state space reduction (Tier 1 optimization)\");\n\n // Collect all valid symmetry groups\n const validSymmetryGroups: string[][] = [];\n\n for (let i = 0; i < symmetryGroups.length; i++) {\n const group = symmetryGroups[i];\n if (!group || group.length < 2) continue;\n\n // Filter to only valid message types in this group\n const validGroupTypes = group.filter((t) => validTypes.has(t));\n if (validGroupTypes.length < 2) {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[WARN] [TLAGenerator] Symmetry group ${i + 1} has < 2 valid types, skipping`\n );\n }\n continue;\n }\n\n validSymmetryGroups.push(validGroupTypes);\n }\n\n // If no valid symmetry groups, return early\n if (validSymmetryGroups.length === 0) {\n return;\n }\n\n // Generate individual symmetry set definitions\n for (let i = 0; i < validSymmetryGroups.length; i++) {\n const group = validSymmetryGroups[i];\n const setName = `SymmetrySet${i + 1}`;\n const setValues = group.map((t) => `\"${t}\"`).join(\", \");\n this.line(`${setName} == {${setValues}}`);\n }\n\n this.line(\"\");\n\n // Use union of Permutations for independent symmetry groups\n // This is the standard approach used in Paxos, SimpleAllocator, etc.\n if (validSymmetryGroups.length > 1) {\n this.line(\"\\\\* Independent symmetry groups via union of permutations\");\n this.line(\"\\\\* Standard TLA+ pattern (see: Paxos, SimpleAllocator)\");\n const permutationsUnion = validSymmetryGroups\n .map((_, i) => `Permutations(SymmetrySet${i + 1})`)\n .join(\" \\\\cup \");\n this.line(`Symmetry == ${permutationsUnion}`);\n\n console.log(\n `[INFO] [TLAGenerator] Symmetry reduction: ${validSymmetryGroups.length} independent symmetry groups ` +\n `(${validSymmetryGroups.map((g) => g.length).join(\", \")} message types)`\n );\n } else {\n // Single symmetry group\n this.line(`Symmetry == Permutations(SymmetrySet1)`);\n console.log(\n `[INFO] [TLAGenerator] Symmetry reduction: 1 symmetry group with ${validSymmetryGroups[0].length} message types`\n );\n }\n\n // Store \"Symmetry\" for config generation (single identifier)\n this.symmetrySets = [\"Symmetry\"];\n\n this.line(\"\");\n }\n\n /**\n * Add tab symmetry definitions for Tier 1 optimization\n *\n * When tabSymmetry is enabled, tabs are represented as model values instead of integers.\n * This enables TLC's symmetry optimization to reduce state space significantly.\n *\n * Generates:\n * CONSTANTS Tab0, Tab1, ... (in spec)\n * Tabs == {Tab0, Tab1, ...}\n * TabSymmetry == Permutations(Tabs)\n *\n * If combined with message symmetry, also generates:\n * AllSymmetry == Symmetry \\cup TabSymmetry\n */\n private addTabSymmetry(config: VerificationConfig): void {\n if (!config.messages.tabSymmetry) {\n return;\n }\n\n const maxTabs = config.messages.maxTabs ?? 1;\n this.tabCount = maxTabs + 1; // 0..maxTabs = maxTabs+1 values\n this.tabSymmetryEnabled = true;\n\n this.line(\"\\\\* Tab symmetry constants for state space reduction (Tier 1 optimization)\");\n this.line(\"CONSTANTS\");\n this.indent++;\n\n // Generate Tab0, Tab1, ..., TabN constants\n const tabConstants: string[] = [];\n for (let i = 0; i <= maxTabs; i++) {\n tabConstants.push(`Tab${i}`);\n }\n this.line(tabConstants.join(\", \"));\n this.indent--;\n this.line(\"\");\n\n // Note: Tabs is a CONSTANT in MessageRouter.tla, assigned via config file as {Tab0, Tab1, ...}\n\n // Generate TabSymmetry permutations\n this.line(\"TabSymmetry == Permutations(Tabs)\");\n this.line(\"\");\n\n // Check if we need to combine with message symmetry\n const hasMessageSymmetry = this.symmetrySets.length > 0 && this.symmetrySets[0] === \"Symmetry\";\n\n if (hasMessageSymmetry) {\n // Combine both symmetries using union\n this.line(\"\\\\* Combined symmetry: message types and tabs\");\n this.line(\"AllSymmetry == Symmetry \\\\cup TabSymmetry\");\n this.line(\"\");\n // Update symmetrySets to use the combined set\n this.symmetrySets = [\"AllSymmetry\"];\n console.log(\n `[INFO] [TLAGenerator] Combined symmetry: message symmetry + ${this.tabCount} tabs as model values`\n );\n } else {\n // Tab symmetry only\n this.symmetrySets = [\"TabSymmetry\"];\n console.log(\n `[INFO] [TLAGenerator] Tab symmetry enabled: ${this.tabCount} tabs as model values`\n );\n }\n }\n\n private addVariables(): void {\n // MessageRouter already defines: ports, messages, pendingRequests, delivered, routingDepth, time\n // We add: contextStates for application state, payload for message payload\n\n this.line(\"\\\\* Application state per context\");\n this.line(\"VARIABLE contextStates\");\n this.line(\"\");\n this.line(\"\\\\* Message payload (abstract model - non-deterministically chosen)\");\n this.line(\"\\\\* In verification, we model payload fields as potentially any valid value\");\n this.line(\"VARIABLE payload\");\n this.line(\"\");\n this.line(\"\\\\* All variables (extending MessageRouter vars)\");\n this.line(\n \"allVars == <<ports, messages, pendingRequests, delivered, routingDepth, time, contextStates, payload>>\"\n );\n this.line(\"\");\n }\n\n private addInit(config: VerificationConfig, _analysis: CodebaseAnalysis): void {\n // Generate InitialState first\n this.line(\"\\\\* Initial application state\");\n this.line(\"InitialState == [\");\n this.indent++;\n\n const fields = this.collectInitialStateFields(config, _analysis);\n this.writeInitialStateFields(fields);\n\n this.indent--;\n this.line(\"]\");\n this.line(\"\");\n\n // Payload type definition - simplified to essential fields used by handlers\n // Reducing fields from 6 to 3 cuts state space from 2^6=64 to 2^3=8\n this.line(\"\\\\* Payload modeled with essential fields only (id, text, userId)\");\n this.line(\"\\\\* Other fields (name, role, filter) use same Value type at runtime\");\n this.line(\"PayloadType == [id: Value, text: Value, userId: Value]\");\n this.line(\"\");\n\n // Init extends MessageRouter's Init\n this.line(\"\\\\* Initial state (extends MessageRouter)\");\n this.line(\"UserInit ==\");\n this.indent++;\n this.line(\"/\\\\ Init \\\\* MessageRouter's init\");\n this.line(\"/\\\\ contextStates = [c \\\\in Contexts |-> InitialState]\");\n this.line(\"/\\\\ payload \\\\in PayloadType \\\\* Non-deterministic initial payload\");\n this.indent--;\n this.line(\"\");\n }\n\n private collectInitialStateFields(\n config: VerificationConfig,\n _analysis: CodebaseAnalysis\n ): string[] {\n const fields: string[] = [];\n\n // Add fields from config.state (with recursive flattening for nested objects)\n for (const [fieldPath, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n // Recursively collect initial values from nested configurations\n this.collectNestedInitialValues(fieldPath, fieldConfig, fields);\n }\n\n // Add fields from analysis\n for (const fieldAnalysis of _analysis.fields) {\n if (!fieldAnalysis.path || typeof fieldAnalysis.path !== \"string\") continue;\n\n const fieldName = this.sanitizeFieldName(fieldAnalysis.path);\n if (fields.some((f) => f.startsWith(`${fieldName} |->`))) continue;\n\n const initialValue = this.getInitialValueFromAnalysis(fieldAnalysis);\n fields.push(`${fieldName} |-> ${initialValue}`);\n }\n\n return fields;\n }\n\n /**\n * Recursively collect initial values from nested configurations\n */\n private collectNestedInitialValues(\n prefix: string,\n fieldConfig: FieldConfig,\n fields: string[]\n ): void {\n // Check if this is a leaf field (has type indicators)\n if (this.hasTypeIndicators(fieldConfig)) {\n const fieldName = this.sanitizeFieldName(prefix);\n const initialValue = this.getInitialValue(fieldConfig);\n fields.push(`${fieldName} |-> ${initialValue}`);\n return;\n }\n\n // Otherwise, it's a nested object - recurse into its properties\n for (const [key, value] of Object.entries(fieldConfig)) {\n if (typeof value !== \"object\" || value === null) continue;\n\n // Skip special keys that aren't nested state fields\n if (key === \"item\" || key === \"element\") {\n continue;\n }\n\n const nestedPath = `${prefix}_${key}`;\n this.collectNestedInitialValues(nestedPath, value as FieldConfig, fields);\n }\n }\n\n private writeInitialStateFields(fields: string[]): void {\n if (fields.length === 0) {\n this.line(\"dummy |-> FALSE \\\\* Placeholder for empty state\");\n return;\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const suffix = i < fields.length - 1 ? \",\" : \"\";\n this.line(`${field}${suffix}`);\n }\n }\n\n private addActions(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Application-specific actions\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n if (analysis.handlers.length === 0) {\n this.generateNoHandlersStub();\n return;\n }\n\n const { validHandlers, invalidHandlers } = this.filterHandlersByValidity(analysis.handlers);\n this.logInvalidHandlers(invalidHandlers);\n\n if (validHandlers.length === 0) {\n this.generateNoValidHandlersStub();\n return;\n }\n\n // Resolve action names before generation to handle naming collisions\n this.resolveActionNamesForHandlers(validHandlers);\n\n const handlersByType = this.groupHandlersByType(validHandlers);\n this.generateHandlerActions(handlersByType, config, analysis.stateConstraints ?? []);\n this.generateStateTransitionDispatcher(handlersByType);\n }\n\n /**\n * Generate stub for no handlers found\n */\n private generateNoHandlersStub(): void {\n this.line(\"\\\\* No message handlers found in codebase\");\n this.line(\"\\\\* State remains unchanged for all messages\");\n this.line(\"StateTransition(ctx, msgType) ==\");\n this.indent++;\n this.line(\"UNCHANGED contextStates\");\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Generate stub for no valid handlers\n */\n private generateNoValidHandlersStub(): void {\n this.line(\"\\\\* No valid message handlers found (all had invalid TLA+ identifiers)\");\n this.line(\"\\\\* State remains unchanged for all messages\");\n this.line(\"StateTransition(ctx, msgType) ==\");\n this.indent++;\n this.line(\"UNCHANGED contextStates\");\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Filter handlers into valid and invalid based on TLA+ identifier rules\n */\n private filterHandlersByValidity(handlers: MessageHandler[]): {\n validHandlers: MessageHandler[];\n invalidHandlers: MessageHandler[];\n } {\n const validHandlers: MessageHandler[] = [];\n const invalidHandlers: MessageHandler[] = [];\n\n for (const handler of handlers) {\n if (this.isValidTLAIdentifier(handler.messageType)) {\n validHandlers.push(handler);\n } else {\n invalidHandlers.push(handler);\n }\n }\n\n return { validHandlers, invalidHandlers };\n }\n\n /**\n * Log warnings about invalid handlers\n */\n private logInvalidHandlers(invalidHandlers: MessageHandler[]): void {\n if (invalidHandlers.length === 0 || !process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(\n `[WARN] [TLAGenerator] Filtered out ${invalidHandlers.length} handler(s) with invalid message types:`\n );\n for (const handler of invalidHandlers) {\n console.log(\n `[WARN] - \"${handler.messageType}\" at ${handler.location.file}:${handler.location.line}`\n );\n }\n }\n\n /**\n * Group handlers by message type\n */\n private groupHandlersByType(handlers: MessageHandler[]): Map<string, MessageHandler[]> {\n const handlersByType = new Map<string, MessageHandler[]>();\n\n for (const handler of handlers) {\n if (!handlersByType.has(handler.messageType)) {\n handlersByType.set(handler.messageType, []);\n }\n handlersByType.get(handler.messageType)?.push(handler);\n }\n\n return handlersByType;\n }\n\n /**\n * Generate handler actions for all message types\n */\n private generateHandlerActions(\n handlersByType: Map<string, MessageHandler[]>,\n config: VerificationConfig,\n stateConstraints: Array<{\n field: string;\n messageType: string;\n requires?: string;\n ensures?: string;\n message?: string;\n }>\n ): void {\n this.line(\"\\\\* State transitions extracted from message handlers\");\n this.line(\"\");\n\n for (const [messageType, handlers] of handlersByType.entries()) {\n // Find state constraints for this message type\n const constraintsForMessage = stateConstraints.filter((c) => c.messageType === messageType);\n this.generateHandlerAction(messageType, handlers, config, constraintsForMessage);\n }\n }\n\n /**\n * Generate main StateTransition dispatcher\n */\n private generateStateTransitionDispatcher(handlersByType: Map<string, MessageHandler[]>): void {\n this.line(\"\\\\* Main state transition action\");\n this.line(\"StateTransition(ctx, msgType) ==\");\n this.indent++;\n\n const messageTypes = Array.from(handlersByType.keys());\n for (let i = 0; i < messageTypes.length; i++) {\n const msgType = messageTypes[i];\n if (!msgType) continue;\n const actionName = this.getResolvedActionName(msgType);\n\n if (i === 0) {\n this.line(`IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n // If this is the only message type, add ELSE clause\n if (messageTypes.length === 1) {\n this.line(\"ELSE FALSE \\\\* Unknown message type - action disabled\");\n }\n } else if (i === messageTypes.length - 1) {\n this.line(`ELSE IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n this.line(\"ELSE FALSE \\\\* Unknown message type - action disabled\");\n } else {\n this.line(`ELSE IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n }\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n private generateHandlerAction(\n messageType: string,\n handlers: MessageHandler[],\n config: VerificationConfig,\n stateConstraints: Array<{\n field: string;\n requires?: string;\n ensures?: string;\n message?: string;\n }>\n ): void {\n const actionName = this.getResolvedActionName(messageType);\n\n this.line(`\\\\* Handler for ${messageType}`);\n this.line(`${actionName}(ctx) ==`);\n this.indent++;\n\n // Collect conditions and assignments\n const allPreconditions = handlers.flatMap((h) => h.preconditions);\n const allAssignments = handlers.flatMap((h) => h.assignments);\n const allPostconditions = handlers.flatMap((h) => h.postconditions);\n\n // Wire in state-level constraints as preconditions\n for (const constraint of stateConstraints) {\n if (constraint.requires) {\n allPreconditions.push({\n expression: constraint.requires,\n message: constraint.message,\n location: { line: 0, column: 0 },\n });\n }\n }\n\n // Wire in state-level constraints as postconditions\n for (const constraint of stateConstraints) {\n if (constraint.ensures) {\n allPostconditions.push({\n expression: constraint.ensures,\n message: constraint.message,\n location: { line: 0, column: 0 },\n });\n }\n }\n\n // Emit preconditions\n this.emitPreconditions(allPreconditions);\n\n // Process and emit assignments\n const validAssignments = this.processAssignments(allAssignments, config.state);\n const usedUnchanged = this.emitStateUpdates(validAssignments, allPreconditions);\n\n // Emit postconditions only if we're not using UNCHANGED\n // When UNCHANGED is used, we can't also constrain contextStates' - it's a contradiction\n // The verification still works via preconditions (requires() conditions)\n if (!usedUnchanged) {\n this.emitPostconditions(allPostconditions);\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Emit precondition checks\n */\n private emitPreconditions(preconditions: Array<{ expression: string; message?: string }>): void {\n for (const precondition of preconditions) {\n const tlaExpr = this.tsExpressionToTLA(precondition.expression);\n const comment = precondition.message ? ` \\\\* ${precondition.message}` : \"\";\n this.line(`/\\\\ ${tlaExpr}${comment}`);\n }\n }\n\n /**\n * Emit postcondition checks\n */\n private emitPostconditions(\n postconditions: Array<{ expression: string; message?: string }>\n ): void {\n for (const postcondition of postconditions) {\n const tlaExpr = this.tsExpressionToTLA(postcondition.expression, true);\n const comment = postcondition.message ? ` \\\\* ${postcondition.message}` : \"\";\n this.line(`/\\\\ ${tlaExpr}${comment}`);\n }\n }\n\n /**\n * Process assignments, filtering and mapping null values\n */\n private processAssignments(\n assignments: Array<{ field: string; value: string | boolean | number | null }>,\n state: VerificationConfig[\"state\"]\n ): Array<{ field: string; value: string | boolean | number | null }> {\n return assignments\n .filter((a) => this.shouldIncludeAssignment(a, state))\n .map((a) => this.mapNullAssignment(a, state));\n }\n\n /**\n * Check if assignment should be included\n */\n private shouldIncludeAssignment(\n assignment: { field: string; value: string | boolean | number | null },\n state: VerificationConfig[\"state\"]\n ): boolean {\n if (assignment.value !== null) return true;\n\n // Check if null can be mapped to a valid value\n const fieldConfig = state[assignment.field];\n return !!(\n fieldConfig &&\n typeof fieldConfig === \"object\" &&\n \"values\" in fieldConfig &&\n fieldConfig.values\n );\n }\n\n /**\n * Map null assignment to a valid value if possible\n */\n private mapNullAssignment(\n assignment: { field: string; value: string | boolean | number | null },\n state: VerificationConfig[\"state\"]\n ): { field: string; value: string | boolean | number | null } {\n if (assignment.value !== null) return assignment;\n\n const fieldConfig = state[assignment.field];\n if (\n fieldConfig &&\n typeof fieldConfig === \"object\" &&\n \"values\" in fieldConfig &&\n fieldConfig.values\n ) {\n const nullValue = fieldConfig.values[fieldConfig.values.length - 1];\n return { ...assignment, value: nullValue };\n }\n\n return assignment;\n }\n\n /**\n * Emit state updates or UNCHANGED\n * @returns true if UNCHANGED was used (postconditions should be skipped)\n *\n * Emits actual state transitions when valid assignments are extracted:\n * - user_loggedIn = true -> contextStates' = [contextStates EXCEPT ![ctx].user_loggedIn = TRUE]\n *\n * Falls back to UNCHANGED when no assignments are extracted (complex expressions,\n * array operations, spreads, etc.)\n */\n private emitStateUpdates(\n validAssignments: Array<{ field: string; value: string | boolean | number | null }>,\n preconditions: Array<{ expression: string; message?: string }>\n ): boolean {\n // If we have valid assignments, emit actual state transitions\n if (validAssignments.length > 0) {\n // Build EXCEPT clause for all assignments\n const exceptClauses = validAssignments.map((a) => {\n const tlaValue = this.assignmentValueToTLA(a.value);\n return `![ctx].${this.sanitizeFieldName(a.field)} = ${tlaValue}`;\n });\n\n this.line(`/\\\\ contextStates' = [contextStates EXCEPT ${exceptClauses.join(\", \")}]`);\n return false; // State was updated, not UNCHANGED\n }\n\n // No valid assignments - use UNCHANGED\n if (preconditions.length === 0) {\n this.line(\"\\\\* No state changes in handler\");\n }\n this.line(\"/\\\\ UNCHANGED contextStates\");\n return true; // Signal that UNCHANGED was used\n }\n\n /**\n * Translate TypeScript expression to TLA+ syntax\n * @param expr - TypeScript expression from requires() or ensures()\n * @param isPrimed - If true, use contextStates' (for postconditions)\n */\n private tsExpressionToTLA(expr: string, isPrimed = false): string {\n // Early return for invalid expressions\n if (!expr || typeof expr !== \"string\") {\n return expr || \"\";\n }\n\n let tla = expr;\n\n // Replace state references with contextStates[ctx] or contextStates'[ctx]\n const statePrefix = isPrimed ? \"contextStates'[ctx]\" : \"contextStates[ctx]\";\n\n // Phase 0: Handle complex expressions FIRST (before state replacements)\n // These must come first because they have special operators (?., ??, ?) that\n // would be mangled by later replacements\n tla = this.translateComplexExpressions(tla, statePrefix);\n\n // Ensure tla is still a valid string after complex expression translation\n if (!tla || typeof tla !== \"string\") {\n return expr;\n }\n\n // Phase 1: Handle array/collection operations and string methods before generic replacements\n tla = this.translateArrayOperations(tla, statePrefix);\n if (!tla || typeof tla !== \"string\") {\n return expr;\n }\n\n tla = this.translateStringMethods(tla);\n if (!tla || typeof tla !== \"string\") {\n return expr;\n }\n\n // Phase 2a: Replace single quotes with double quotes (TLA+ uses double quotes for strings)\n tla = tla.replace(/'([^']+)'/g, '\"$1\"');\n\n // Phase 2b: Replace signal state references with contextStates[ctx]\n // Pattern 1: stateName.value.field -> contextStates[ctx].stateName_field\n // e.g., user.value.loggedIn -> contextStates[ctx].user_loggedIn\n // The state field name combines signal name and field path\n tla = tla.replace(\n /([a-zA-Z_][a-zA-Z0-9_]*)\\.value\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g,\n (_match, stateName, path) => {\n // Combine signal name and field path with underscore separator\n const fullPath = `${stateName}_${path.replace(/\\./g, \"_\")}`;\n return `${statePrefix}.${this.sanitizeFieldName(fullPath)}`;\n }\n );\n\n // Pattern 2: stateName.value (without field) -> contextStates[ctx].stateName\n // e.g., todos.value -> contextStates[ctx].todos\n // This handles direct signal access where the signal name IS the state field\n tla = tla.replace(/([a-zA-Z_][a-zA-Z0-9_]*)\\.value\\b(?!\\.)/g, (_match, stateName) => {\n return `${statePrefix}.${stateName}`;\n });\n\n // Phase 2c: Replace state references with contextStates[ctx] or contextStates'[ctx]\n tla = tla.replace(/state\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g, (_match, path) => {\n return `${statePrefix}.${this.sanitizeFieldName(path)}`;\n });\n\n // Replace payload.field with payload.field (no change needed, but sanitize)\n tla = tla.replace(/payload\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g, (_match, path) => {\n return `payload.${this.sanitizeFieldName(path)}`;\n });\n\n // Phase 3: Replace comparison operators\n tla = tla.replace(/===/g, \"=\");\n tla = tla.replace(/!==/g, \"#\");\n tla = tla.replace(/!=/g, \"#\");\n tla = tla.replace(/==/g, \"=\");\n\n // Phase 4: Replace logical operators\n tla = tla.replace(/&&/g, \"/\\\\\");\n tla = tla.replace(/\\|\\|/g, \"\\\\/\");\n\n // Replace negation operator (careful with !== already handled)\n // Match ! that's not part of !== or !=\n tla = tla.replace(/!([^=])/g, \"~$1\");\n tla = tla.replace(/!$/g, \"~\"); // Handle ! at end of string\n\n // Phase 5: Replace boolean literals\n tla = tla.replace(/\\btrue\\b/g, \"TRUE\");\n tla = tla.replace(/\\bfalse\\b/g, \"FALSE\");\n\n // Replace null\n tla = tla.replace(/\\bnull\\b/g, \"NULL\");\n\n // Phase 6: Replace less than / greater than comparisons\n tla = tla.replace(/</g, \"<\");\n tla = tla.replace(/>/g, \">\");\n tla = tla.replace(/<=/g, \"<=\");\n tla = tla.replace(/>=/g, \">=\");\n\n // Phase 7: Convert bare identifiers (function parameters) to payload references\n // These are identifiers that aren't:\n // - Already prefixed (contextStates, payload, msg, Len, etc.)\n // - TLA+ keywords/literals (TRUE, FALSE, NULL, IF, THEN, ELSE, etc.)\n // - Quantified variables (after \\E, \\A, CHOOSE, \\in, :)\n tla = this.convertFunctionParamsToPayload(tla);\n\n return tla;\n }\n\n /**\n * Convert bare identifiers (likely function parameters) to payload.identifier\n * In the verified state pattern, function parameters are the message payload.\n *\n * Only converts identifiers that are clearly standalone variables, not:\n * - Inside string literals\n * - Property accesses (after .)\n * - Quantified variables\n * - TLA+ keywords\n */\n private convertFunctionParamsToPayload(tla: string): string {\n // TLA+ keywords and built-in operators to skip\n const tlaKeywords = new Set([\n \"TRUE\",\n \"FALSE\",\n \"NULL\",\n \"IF\",\n \"THEN\",\n \"ELSE\",\n \"LET\",\n \"IN\",\n \"CASE\",\n \"OTHER\",\n \"CHOOSE\",\n \"EXCEPT\",\n \"DOMAIN\",\n \"SUBSET\",\n \"UNION\",\n \"UNCHANGED\",\n \"Len\",\n \"Cardinality\",\n \"SubSeq\",\n \"Append\",\n \"Head\",\n \"Tail\",\n \"Seq\",\n \"ctx\",\n \"payload\",\n \"msg\",\n \"state\", // Don't convert 'state' - it's handled separately\n \"contextStates\",\n ]);\n\n // First, extract quantified variable names to skip them\n const quantifiedVars = new Set<string>();\n const quantifierPattern = /\\\\[EA]\\s+(\\w+)\\s+\\\\in|CHOOSE\\s+(\\w+)\\s+\\\\in/g;\n for (const qMatch of tla.matchAll(quantifierPattern)) {\n if (qMatch[1]) quantifiedVars.add(qMatch[1]);\n if (qMatch[2]) quantifiedVars.add(qMatch[2]);\n }\n\n // Track string literal positions to skip content inside quotes\n const stringRanges: Array<{ start: number; end: number }> = [];\n const stringPattern = /\"[^\"]*\"/g;\n for (const sMatch of tla.matchAll(stringPattern)) {\n stringRanges.push({ start: sMatch.index, end: sMatch.index + sMatch[0].length });\n }\n\n // Check if an offset is inside a string literal\n const isInsideString = (offset: number): boolean => {\n return stringRanges.some((range) => offset >= range.start && offset < range.end);\n };\n\n // Now find bare identifiers that should become payload.identifier\n // Only match identifiers that appear as standalone comparisons (e.g., = id, # id)\n // This is more conservative than matching all bare identifiers\n const result = tla.replace(\n /([=#<>]\\s*)([a-z][a-zA-Z0-9_]*)(\\s*[/#\\\\)<>,]|\\s*$)/g,\n (match, prefix, ident, suffix, offset) => {\n // Skip if inside a string literal\n if (isInsideString(offset + prefix.length)) return match;\n\n // Skip if it's a TLA+ keyword\n if (tlaKeywords.has(ident)) return match;\n\n // Skip if it's a quantified variable\n if (quantifiedVars.has(ident)) return match;\n\n // Skip if it looks like a TLA+ operator (all caps)\n if (ident === ident.toUpperCase() && ident.length > 1) return match;\n\n // Skip common false positives\n if ([\"in\", \"of\", \"or\", \"and\", \"not\"].includes(ident.toLowerCase())) return match;\n\n // This is likely a function parameter - convert to payload.identifier\n return `${prefix}payload.${ident}${suffix}`;\n }\n );\n\n return result;\n }\n\n /**\n * Translate JavaScript array/collection operations to TLA+ equivalents\n *\n * Examples:\n * - items.length -> Len(items)\n * - items.includes(x) -> x \\in items\n * - items[0] -> items[1] (1-based indexing)\n * - items.some(i => i.active) -> \\E item \\in items : item.active\n * - items.every(i => i.active) -> \\A item \\in items : item.active\n * - items.find(i => i.id === x) -> CHOOSE item \\in items : item.id = x\n * - hasLength(arr, { max: 99 }) -> Len(arr) <= 99\n * - inRange(value, min, max) -> value >= min /\\ value <= max\n * - oneOf(value, [...]) -> value \\in {...}\n */\n private translateArrayOperations(expr: string, _statePrefix: string): string {\n if (!expr || typeof expr !== \"string\") {\n return expr || \"\";\n }\n\n let result = expr;\n\n // =========================================================================\n // Verification helper functions (hasLength, inRange, oneOf)\n // These must be translated FIRST before other array operations\n // =========================================================================\n\n // hasLength(arr, { max: N }) -> Len(arr) <= N\n // hasLength(arr, { min: M }) -> Len(arr) >= M\n // hasLength(arr, { min: M, max: N }) -> Len(arr) >= M /\\ Len(arr) <= N\n result = result.replace(\n /hasLength\\(([^,]+),\\s*\\{\\s*(?:min:\\s*(\\d+))?\\s*,?\\s*(?:max:\\s*(\\d+))?\\s*\\}\\)/g,\n (_match, arrayRef, minVal, maxVal) => {\n const constraints: string[] = [];\n const arr = arrayRef.trim();\n if (minVal !== undefined) {\n constraints.push(`Len(${arr}) >= ${minVal}`);\n }\n if (maxVal !== undefined) {\n constraints.push(`Len(${arr}) <= ${maxVal}`);\n }\n if (constraints.length === 0) {\n return \"TRUE\"; // No constraints specified\n }\n return constraints.join(\" /\\\\ \");\n }\n );\n\n // inRange(value, min, max) -> value >= min /\\ value <= max\n result = result.replace(\n /inRange\\(([^,]+),\\s*(\\d+),\\s*(\\d+)\\)/g,\n (_match, valueRef, minVal, maxVal) => {\n const val = valueRef.trim();\n return `${val} >= ${minVal} /\\\\ ${val} <= ${maxVal}`;\n }\n );\n\n // oneOf(value, [v1, v2, v3]) -> value \\in {v1, v2, v3}\n result = result.replace(/oneOf\\(([^,]+),\\s*\\[([^\\]]+)\\]\\)/g, (_match, valueRef, valuesStr) => {\n const val = valueRef.trim();\n // Convert array values to set notation\n const values = valuesStr.split(\",\").map((v: string) => v.trim());\n return `${val} \\\\in {${values.join(\", \")}}`;\n });\n\n // Array.length -> Len(array)\n // Match: identifier.length or state.field.length\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.length\\b/g, (_match, arrayRef) => {\n // If it's a state reference, keep it for later replacement\n if (arrayRef.startsWith(\"state.\")) {\n return `Len(${arrayRef})`;\n }\n return `Len(${arrayRef})`;\n });\n\n // Array.includes(item) -> item \\in array\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.includes\\(([^)]+)\\)/g, (_match, arrayRef, item) => {\n return `${item.trim()} \\\\in ${arrayRef}`;\n });\n\n // Array[index] -> Array[index+1] (convert to 1-based indexing)\n // Handle nested indices: arr[0][1] -> arr[1][2]\n // Pattern matches either: identifier OR closing bracket, followed by [number]\n const _indexMap = new Map<string, number>();\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\[(\\d+)\\]|\\]\\[(\\d+)\\]/g,\n (_match, identPart, index1, index2) => {\n if (identPart) {\n // First bracket after identifier: items[0]\n const newIndex = Number.parseInt(index1, 10) + 1;\n return `${identPart}[${newIndex}]`;\n }\n // Subsequent bracket after ]: ][1]\n const newIndex = Number.parseInt(index2, 10) + 1;\n return `][${newIndex}]`;\n }\n );\n\n // Array.some(lambda) -> \\E item \\in array : condition\n // Match: array.some(item => condition) or array.some((item) => condition)\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.some\\(\\(?(\\w+)\\)?\\s*=>\\s*([^)]+)\\)/g,\n (_match, arrayRef, param, condition) => {\n // Transform lambda parameter in condition\n const tlaCondition = condition.replace(new RegExp(`\\\\b${param}\\\\.`, \"g\"), `${param}.`);\n return `\\\\E ${param} \\\\in ${arrayRef} : ${tlaCondition}`;\n }\n );\n\n // Array.every(lambda) -> \\A item \\in array : condition\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.every\\(\\(?(\\w+)\\)?\\s*=>\\s*([^)]+)\\)/g,\n (_match, arrayRef, param, condition) => {\n const tlaCondition = condition.replace(new RegExp(`\\\\b${param}\\\\.`, \"g\"), `${param}.`);\n return `\\\\A ${param} \\\\in ${arrayRef} : ${tlaCondition}`;\n }\n );\n\n // Array.find(lambda) -> CHOOSE item \\in array : condition\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.find\\(\\(?(\\w+)\\)?\\s*=>\\s*([^)]+)\\)/g,\n (_match, arrayRef, param, condition) => {\n const tlaCondition = condition.replace(new RegExp(`\\\\b${param}\\\\.`, \"g\"), `${param}.`);\n return `CHOOSE ${param} \\\\in ${arrayRef} : ${tlaCondition}`;\n }\n );\n\n // Array.filter(lambda).length -> Cardinality({item \\in array : condition})\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.filter\\(\\(?(\\w+)\\)?\\s*=>\\s*([^)]+)\\)\\.length/g,\n (_match, arrayRef, param, condition) => {\n const tlaCondition = condition.replace(new RegExp(`\\\\b${param}\\\\.`, \"g\"), `${param}.`);\n return `Cardinality({${param} \\\\in ${arrayRef} : ${tlaCondition}})`;\n }\n );\n\n // String.startsWith(prefix) -> SubSeq(str, 1, Len(prefix)) = prefix\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.startsWith\\(\"([^\"]+)\"\\)/g,\n (_match, strRef, prefix) => {\n return `SubSeq(${strRef}, 1, ${prefix.length}) = \"${prefix}\"`;\n }\n );\n\n // String.endsWith(suffix) -> SubSeq(str, Len(str)-Len(suffix)+1, Len(str)) = suffix\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.endsWith\\(\"([^\"]+)\"\\)/g, (_match, strRef, suffix) => {\n return `SubSeq(${strRef}, Len(${strRef})-${suffix.length}+1, Len(${strRef})) = \"${suffix}\"`;\n });\n\n // String.includes(substring) -> \\E i \\in 1..Len(str) : SubSeq(str, i, i+Len(sub)-1) = sub\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.includes\\(\"([^\"]+)\"\\)/g,\n (_match, strRef, substring) => {\n return `\\\\E i \\\\in 1..Len(${strRef}) : SubSeq(${strRef}, i, i+${substring.length}-1) = \"${substring}\"`;\n }\n );\n\n // String.slice(start, end?).length -> Len(SubSeq(...))\n // Handle chained .length first before translating slice\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.slice\\((-?\\d+)(?:,\\s*(-?\\d+))?\\)\\.length/g,\n (_match, strRef, start, end) => {\n const startNum = Number.parseInt(start, 10);\n if (end !== undefined) {\n const endNum = Number.parseInt(end, 10);\n if (startNum < 0 && endNum < 0) {\n return `Len(SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, Len(${strRef}) - ${Math.abs(endNum)}))`;\n }\n if (startNum < 0) {\n return `Len(SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, ${endNum}))`;\n }\n if (endNum < 0) {\n return `Len(SubSeq(${strRef}, ${startNum + 1}, Len(${strRef}) - ${Math.abs(endNum)}))`;\n }\n return `Len(SubSeq(${strRef}, ${startNum + 1}, ${endNum}))`;\n }\n if (startNum < 0) {\n return `Len(SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, Len(${strRef})))`;\n }\n return `Len(SubSeq(${strRef}, ${startNum + 1}, Len(${strRef})))`;\n }\n );\n\n // String.substring(start, end?).length -> Len(SubSeq(...))\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.substring\\((\\d+)(?:,\\s*(\\d+))?\\)\\.length/g,\n (_match, strRef, start, end) => {\n const startNum = Number.parseInt(start, 10);\n if (end !== undefined) {\n const endNum = Number.parseInt(end, 10);\n if (startNum > endNum) {\n return `Len(SubSeq(${strRef}, ${endNum + 1}, ${startNum}))`;\n }\n return `Len(SubSeq(${strRef}, ${startNum + 1}, ${endNum}))`;\n }\n return `Len(SubSeq(${strRef}, ${startNum + 1}, Len(${strRef})))`;\n }\n );\n\n // String.slice(start, end?) -> SubSeq(str, start+1, end?) (1-based indexing)\n // slice(start) → SubSeq(str, start+1, Len(str))\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.slice\\((-?\\d+)\\)(?!,)/g, (_match, strRef, start) => {\n const startNum = Number.parseInt(start, 10);\n if (startNum < 0) {\n // Negative index: slice(-2) → SubSeq(str, Len(str) - 2 + 1, Len(str))\n return `SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, Len(${strRef}))`;\n }\n // Positive index: slice(1) → SubSeq(str, 2, Len(str))\n return `SubSeq(${strRef}, ${startNum + 1}, Len(${strRef}))`;\n });\n\n // slice(start, end) → SubSeq(str, start+1, end)\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.slice\\((-?\\d+),\\s*(-?\\d+)\\)/g,\n (_match, strRef, start, end) => {\n const startNum = Number.parseInt(start, 10);\n const endNum = Number.parseInt(end, 10);\n\n if (startNum < 0 && endNum < 0) {\n return `SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, Len(${strRef}) - ${Math.abs(endNum)})`;\n }\n if (startNum < 0) {\n return `SubSeq(${strRef}, Len(${strRef}) - ${Math.abs(startNum)} + 1, ${endNum})`;\n }\n if (endNum < 0) {\n return `SubSeq(${strRef}, ${startNum + 1}, Len(${strRef}) - ${Math.abs(endNum)})`;\n }\n // Both positive: slice(0, 3) → SubSeq(str, 1, 3)\n return `SubSeq(${strRef}, ${startNum + 1}, ${endNum})`;\n }\n );\n\n // String.substring(start, end?) -> SubSeq(str, start+1, end?) (1-based indexing)\n // substring(start) → SubSeq(str, start+1, Len(str))\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.substring\\((\\d+)\\)(?!,)/g,\n (_match, strRef, start) => {\n const startNum = Number.parseInt(start, 10);\n return `SubSeq(${strRef}, ${startNum + 1}, Len(${strRef}))`;\n }\n );\n\n // substring(start, end) → SubSeq(str, start+1, end)\n // Note: substring auto-swaps if start > end\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\.substring\\((\\d+),\\s*(\\d+)\\)/g,\n (_match, strRef, start, end) => {\n const startNum = Number.parseInt(start, 10);\n const endNum = Number.parseInt(end, 10);\n\n // substring auto-swaps indices if start > end\n if (startNum > endNum) {\n return `SubSeq(${strRef}, ${endNum + 1}, ${startNum})`;\n }\n return `SubSeq(${strRef}, ${startNum + 1}, ${endNum})`;\n }\n );\n\n return result;\n }\n\n /**\n * Translate complex JavaScript expressions to TLA+\n *\n * Handles:\n * - Ternary operators: a ? b : c → IF a THEN b ELSE c\n * - Nullish coalescing: a ?? b → IF a # NULL THEN a ELSE b\n * - Optional chaining: a?.b → IF a # NULL THEN a.b ELSE NULL\n * - Logical short-circuit: a && b → IF a THEN b ELSE FALSE\n */\n private translateComplexExpressions(expr: string, _statePrefix: string): string {\n if (!expr || typeof expr !== \"string\") {\n return expr || \"\";\n }\n\n let result = expr;\n\n // Phase 1: Handle optional chaining (must come before other operators)\n result = this.translateOptionalChaining(result);\n\n // Phase 2: Handle nullish coalescing (before ternary to avoid ?? being confused with ?)\n result = this.translateNullishCoalescing(result);\n\n // Phase 3: Handle ternary operators (after nullish so ?? doesn't interfere)\n result = this.translateTernary(result);\n\n // Phase 4: Handle logical short-circuit (advanced)\n // Note: && and || are handled later as simple operators\n // This is for special cases where we want IF-THEN-ELSE semantics\n\n return result;\n }\n\n /**\n * Translate ternary operator: condition ? trueValue : falseValue\n * → IF condition THEN trueValue ELSE falseValue\n *\n * Handles nested ternaries recursively\n */\n private translateTernary(expr: string): string {\n if (!expr || typeof expr !== \"string\" || !expr.includes(\"?\")) {\n return expr || \"\";\n }\n\n // Match ternary pattern: condition ? true_expr : false_expr\n // Use a simple approach for non-nested ternaries first\n // Pattern: anything ? anything : anything (non-greedy)\n const ternaryRegex = /([^?]+)\\?([^:]+):([^:?]+)/;\n\n let result = expr;\n let match: RegExpMatchArray | null;\n let iterations = 0;\n const maxIterations = 10; // Prevent infinite loops\n\n // Process ternaries from innermost to outermost (right to left)\n match = result.match(ternaryRegex);\n while (match && iterations < maxIterations) {\n const condition = match[1]?.trim();\n const trueVal = match[2]?.trim();\n const falseVal = match[3]?.trim();\n\n const tlaIf = `IF ${condition} THEN ${trueVal} ELSE ${falseVal}`;\n\n // Replace the matched ternary\n if (match[0]) {\n result = result.replace(match[0], tlaIf);\n }\n iterations++;\n match = result.match(ternaryRegex);\n }\n\n return result;\n }\n\n /**\n * Translate nullish coalescing: a ?? b → IF a # NULL THEN a ELSE b\n *\n * Note: JavaScript ?? checks for null or undefined, but TLA+ only has NULL\n */\n private translateNullishCoalescing(expr: string): string {\n if (!expr || typeof expr !== \"string\" || !expr.includes(\"??\")) {\n return expr || \"\";\n }\n\n // Match: expr ?? defaultValue\n // Use non-greedy matching to handle multiple ?? in sequence\n const nullishRegex = /([^?]+)\\?\\?([^?]+)/;\n\n let result = expr;\n let match: RegExpMatchArray | null;\n let iterations = 0;\n const maxIterations = 10;\n\n match = result.match(nullishRegex);\n while (match && iterations < maxIterations) {\n const value = match[1]?.trim();\n const defaultVal = match[2]?.trim();\n\n const tlaIf = `IF ${value} # NULL THEN ${value} ELSE ${defaultVal}`;\n\n if (match[0]) {\n result = result.replace(match[0], tlaIf);\n }\n iterations++;\n match = result.match(nullishRegex);\n }\n\n return result;\n }\n\n /**\n * Translate optional chaining: a?.b?.c → IF a # NULL /\\ a.b # NULL THEN a.b.c ELSE NULL\n *\n * Strategy: Convert each ?. to explicit null check iteratively\n * Supports: a?.b, a?.[0], a?.['prop'], chained a?.b?.c\n */\n private translateOptionalChaining(expr: string): string {\n // If no optional chaining, return as-is\n if (!expr.includes(\"?.\")) {\n return expr;\n }\n\n let result = expr;\n let iteration = 0;\n const maxIterations = 10;\n let previousResult = \"\";\n\n // Iteratively process ?. operators until none remain or no changes made\n while (result.includes(\"?.\") && iteration < maxIterations && result !== previousResult) {\n previousResult = result;\n\n // Pattern 1: identifier?.property (simple property access)\n // Matches: a?.b, user?.name, etc.\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\?\\.(\\w+)(?!\\?\\.)/g,\n (_match, obj, prop) => `IF ${obj} # NULL THEN ${obj}.${prop} ELSE NULL`\n );\n\n // Pattern 2: (expression)?.property (parenthesized expression)\n // Matches: (a.b.c)?.d, (user)?.name, etc.\n result = result.replace(\n /\\(([^)]+)\\)\\?\\.(\\w+)/g,\n (_match, expr, prop) => `IF (${expr}) # NULL THEN (${expr}).${prop} ELSE NULL`\n );\n\n // Pattern 3: identifier?.[index] (bracket notation with number)\n // Matches: items?.[0], arr?.[5], etc.\n // Note: TLA+ uses 1-based indexing, so [0] becomes [1]\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\?\\.\\[(\\d+)\\]/g, (_match, obj, index) => {\n const tlaIndex = Number.parseInt(index, 10) + 1; // Convert to 1-based\n return `IF ${obj} # NULL THEN ${obj}[${tlaIndex}] ELSE NULL`;\n });\n\n // Pattern 4: identifier?.['property'] or identifier?.[\"property\"]\n // Matches: obj?.['name'], user?.[\"id\"], etc.\n result = result.replace(\n /(\\w+(?:\\.\\w+)*)\\?\\.\\[['\"](\\w+)['\"]\\]/g,\n (_match, obj, prop) => `IF ${obj} # NULL THEN ${obj}.${prop} ELSE NULL`\n );\n\n iteration++;\n }\n\n // If ?. still remains after max iterations, warn and return original\n if (result.includes(\"?.\") && iteration >= maxIterations) {\n // Return original rather than partially translated to avoid confusing output\n return expr;\n }\n\n return result;\n }\n\n /**\n * Translate string methods to TLA+ operators\n *\n * - str.startsWith(prefix) → SubSeq(str, 1, Len(prefix)) = prefix\n * - str.endsWith(suffix) → SubSeq(str, Len(str) - Len(suffix) + 1, Len(str)) = suffix\n * - str.includes(sub) → \\E i \\in 1..Len(str) : SubSeq(str, i, i + Len(sub) - 1) = sub\n */\n private translateStringMethods(expr: string): string {\n if (!expr || typeof expr !== \"string\") {\n return expr || \"\";\n }\n\n let result = expr;\n\n // String.startsWith(prefix)\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.startsWith\\(([^)]+)\\)/g, (_match, str, prefix) => {\n const trimmedPrefix = prefix.trim();\n return `SubSeq(${str}, 1, Len(${trimmedPrefix})) = ${trimmedPrefix}`;\n });\n\n // String.endsWith(suffix)\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.endsWith\\(([^)]+)\\)/g, (_match, str, suffix) => {\n const trimmedSuffix = suffix.trim();\n return `SubSeq(${str}, Len(${str}) - Len(${trimmedSuffix}) + 1, Len(${str})) = ${trimmedSuffix}`;\n });\n\n // String.includes(substring) - more complex, uses existential quantifier\n result = result.replace(/(\\w+(?:\\.\\w+)*)\\.includes\\(([^)]+)\\)/g, (_match, str, substring) => {\n const trimmedSub = substring.trim();\n return `\\\\E i \\\\in 1..Len(${str}) : SubSeq(${str}, i, i + Len(${trimmedSub}) - 1) = ${trimmedSub}`;\n });\n\n return result;\n }\n\n private messageTypeToActionName(messageType: string): string {\n // Defensive check: this method should only be called with valid TLA+ identifiers\n // (filtering happens earlier, but this adds an extra layer of safety)\n if (!this.isValidTLAIdentifier(messageType)) {\n // Sanitize by removing all invalid characters and replacing with underscores\n const sanitized = messageType.replace(/[^a-zA-Z0-9_]/g, \"_\");\n // Ensure it starts with a letter\n const validStart = sanitized.match(/[a-zA-Z]/);\n if (!validStart) {\n // No letters at all, can't create a valid identifier\n return \"HandleInvalidMessageType\";\n }\n // Use the sanitized version from the first letter onwards\n const validIdentifier = sanitized.slice(sanitized.indexOf(validStart[0]));\n return this.messageTypeToActionName(validIdentifier);\n }\n\n // Convert USER_LOGIN -> HandleUserLogin\n return `Handle${messageType\n .split(\"_\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join(\"\")}`;\n }\n\n /**\n * Resolve action names for all handlers, detecting and handling collisions.\n * When two different messageTypes would produce the same action name,\n * use the origin to differentiate (e.g., HandleFnConnected for state handlers).\n */\n private resolveActionNamesForHandlers(handlers: MessageHandler[]): void {\n this.resolvedActionNames.clear();\n const actionNameToMessageTypes = this.groupHandlersByActionName(handlers);\n this.resolveCollisions(actionNameToMessageTypes);\n }\n\n /**\n * Group handlers by their base action name for collision detection.\n */\n private groupHandlersByActionName(\n handlers: MessageHandler[]\n ): Map<string, Array<{ messageType: string; origin?: \"event\" | \"stateHandler\" }>> {\n const actionNameToMessageTypes = new Map<\n string,\n Array<{ messageType: string; origin?: \"event\" | \"stateHandler\" }>\n >();\n\n for (const handler of handlers) {\n const baseActionName = this.messageTypeToActionName(handler.messageType);\n if (!actionNameToMessageTypes.has(baseActionName)) {\n actionNameToMessageTypes.set(baseActionName, []);\n }\n const existing = actionNameToMessageTypes.get(baseActionName);\n if (existing && !existing.some((e) => e.messageType === handler.messageType)) {\n existing.push({ messageType: handler.messageType, origin: handler.origin });\n }\n }\n\n return actionNameToMessageTypes;\n }\n\n /**\n * Resolve naming collisions by using origin to differentiate action names.\n */\n private resolveCollisions(\n actionNameToMessageTypes: Map<\n string,\n Array<{ messageType: string; origin?: \"event\" | \"stateHandler\" }>\n >\n ): void {\n for (const [baseActionName, messageTypes] of actionNameToMessageTypes.entries()) {\n if (messageTypes.length === 1) {\n const entry = messageTypes[0];\n if (entry) {\n this.resolvedActionNames.set(entry.messageType, baseActionName);\n }\n continue;\n }\n // Collision detected - use origin to differentiate\n for (const entry of messageTypes) {\n const resolvedName =\n entry.origin === \"stateHandler\"\n ? baseActionName.replace(/^Handle/, \"HandleFn\")\n : baseActionName;\n this.resolvedActionNames.set(entry.messageType, resolvedName);\n }\n }\n }\n\n /**\n * Get the resolved action name for a message type.\n * Must call resolveActionNamesForHandlers first.\n */\n private getResolvedActionName(messageType: string): string {\n const resolved = this.resolvedActionNames.get(messageType);\n if (resolved) {\n return resolved;\n }\n // Fallback to base conversion if not pre-resolved\n return this.messageTypeToActionName(messageType);\n }\n\n private assignmentValueToTLA(value: string | boolean | number | null): string {\n if (typeof value === \"boolean\") {\n return value ? \"TRUE\" : \"FALSE\";\n }\n if (typeof value === \"number\") {\n return String(value);\n }\n if (value === null) {\n return \"NULL\"; // Will need to handle this based on type\n }\n if (typeof value === \"string\") {\n // Check if this is already a TLA+ expression (compound operator or array mutation)\n // These contain @ (current value reference) or TLA+ operators\n if (this.isTLAExpression(value)) {\n // Replace undefined variable references with placeholder from Value set\n return this.sanitizeTLAExpression(value);\n }\n return `\"${value}\"`; // Regular string literal\n }\n return \"NULL\";\n }\n\n /**\n * Sanitize TLA+ expressions by replacing undefined variables with placeholders\n * Uses \"v1\" from our bounded Value set for abstract model checking\n */\n private sanitizeTLAExpression(expr: string): string {\n // Pattern to match Append(@, identifier) where identifier is not quoted\n const appendPattern = /Append\\(@,\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\)/g;\n\n return expr.replace(appendPattern, (match, varName) => {\n // If it's already a string literal or number, keep it\n if (/^\".*\"$/.test(varName) || /^\\d+$/.test(varName)) {\n return match;\n }\n\n // Replace with placeholder from Value set for abstract model checking\n return 'Append(@, \"v1\")';\n });\n }\n\n /**\n * Check if a string value is a TLA+ expression (not a literal string)\n * TLA+ expressions contain:\n * - @ (current value reference for EXCEPT)\n * - TLA+ operators: Append, SubSeq, Tail, Len, Head, etc.\n * - TLA+ syntax: \\o (concatenation), << >> (sequences)\n */\n private isTLAExpression(value: string): boolean {\n // Check for @ symbol (used in EXCEPT expressions)\n if (value.includes(\"@\")) {\n return true;\n }\n\n // Check for TLA+ sequence operators\n const tlaOperators = [\n \"Append\",\n \"SubSeq\",\n \"Tail\",\n \"Head\",\n \"Len\",\n \"\\\\o\", // Concatenation\n \"<<\", // Sequence start\n \"Cardinality\", // Set cardinality\n \"CHOOSE\", // Choice operator\n \"\\\\E\", // Exists quantifier\n \"\\\\A\", // Forall quantifier\n ];\n\n return tlaOperators.some((op) => value.includes(op));\n }\n\n private addRouteWithHandlers(_config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Message Routing with State Transitions\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n if (analysis.handlers.length === 0) {\n // No handlers, just use base routing\n return;\n }\n\n this.line(\"\\\\* Route a message and invoke its handler\");\n this.line(\"UserRouteMessage(msgIndex) ==\");\n this.indent++;\n this.line(\"/\\\\ msgIndex \\\\in 1..Len(messages)\");\n this.line(\"/\\\\ LET msg == messages[msgIndex]\");\n this.line(' IN /\\\\ msg.status = \"pending\"');\n this.line(\" /\\\\ routingDepth' = routingDepth + 1\");\n this.line(\" /\\\\ routingDepth < 5\");\n this.line(\" /\\\\ \\\\E target \\\\in msg.targets :\");\n this.line(' /\\\\ IF target \\\\in Contexts /\\\\ ports[target] = \"connected\"');\n this.line(\" THEN \\\\* Successful delivery - route AND invoke handler\");\n this.line(\n ' /\\\\ messages\\' = [messages EXCEPT ![msgIndex].status = \"delivered\"]'\n );\n this.line(\" /\\\\ delivered' = delivered \\\\union {msg.id}\");\n this.line(\n \" /\\\\ pendingRequests' = [id \\\\in DOMAIN pendingRequests \\\\ {msg.id} |->\"\n );\n this.line(\" pendingRequests[id]]\");\n this.line(\" /\\\\ time' = time + 1\");\n this.line(\n \" /\\\\ \\\\E p \\\\in PayloadType : payload' = p \\\\* Non-deterministic payload\"\n );\n this.line(\" /\\\\ StateTransition(target, msg.msgType)\");\n this.line(\" ELSE \\\\* Port not connected - message fails\");\n this.line(\n ' /\\\\ messages\\' = [messages EXCEPT ![msgIndex].status = \"failed\"]'\n );\n this.line(\n \" /\\\\ pendingRequests' = [id \\\\in DOMAIN pendingRequests \\\\ {msg.id} |->\"\n );\n this.line(\" pendingRequests[id]]\");\n this.line(\" /\\\\ time' = time + 1\");\n this.line(\" /\\\\ UNCHANGED <<delivered, contextStates, payload>>\");\n this.line(\" /\\\\ UNCHANGED ports\");\n this.indent--;\n this.line(\"\");\n }\n\n private addNext(_config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* Next state relation (extends MessageRouter)\");\n this.line(\"UserNext ==\");\n this.indent++;\n\n // Check if there are any valid handlers (not just any handlers)\n const hasValidHandlers = analysis.handlers.some((h) =>\n this.isValidTLAIdentifier(h.messageType)\n );\n\n if (hasValidHandlers) {\n // Use integrated routing + handlers\n // Note: payload is UNCHANGED for non-message actions, but can change non-deterministically\n // when a message is routed (to model any possible payload value)\n this.line(\n \"\\\\/ \\\\E c \\\\in Contexts : ConnectPort(c) /\\\\ UNCHANGED <<contextStates, payload>>\"\n );\n this.line(\n \"\\\\/ \\\\E c \\\\in Contexts : DisconnectPort(c) /\\\\ UNCHANGED <<contextStates, payload>>\"\n );\n\n // Always use Tabs set (defined in config as integers or model values for symmetry)\n this.line(\n \"\\\\/ \\\\E src \\\\in Contexts : \\\\E targetSet \\\\in (SUBSET Contexts \\\\ {{}}) : \\\\E tab \\\\in Tabs : \\\\E msgType \\\\in UserMessageTypes :\"\n );\n this.indent++;\n this.line(\n \"SendMessage(src, targetSet, tab, msgType) /\\\\ UNCHANGED <<contextStates, payload>>\"\n );\n this.indent--;\n this.line(\"\\\\/ \\\\E i \\\\in 1..Len(messages) : UserRouteMessage(i)\");\n this.line(\"\\\\/ CompleteRouting /\\\\ UNCHANGED <<contextStates, payload>>\");\n this.line(\n \"\\\\/ \\\\E i \\\\in 1..Len(messages) : TimeoutMessage(i) /\\\\ UNCHANGED <<contextStates, payload>>\"\n );\n } else {\n // No valid handlers, all actions preserve contextStates and payload\n this.line(\"\\\\/ Next /\\\\ UNCHANGED <<contextStates, payload>>\");\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n private addSpec(): void {\n this.line(\"\\\\* Specification\");\n this.line(\"UserSpec == UserInit /\\\\ [][UserNext]_allVars /\\\\ WF_allVars(UserNext)\");\n this.line(\"\");\n }\n\n private addInvariants(config: VerificationConfig, _analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Application Invariants\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n this.line(\"\\\\* TypeOK and NoRoutingLoops are inherited from MessageRouter\");\n this.line(\"\");\n\n this.line(\"\\\\* Application state type invariant\");\n this.line(\"UserStateTypeInvariant ==\");\n this.indent++;\n this.line(\"\\\\A ctx \\\\in Contexts :\");\n this.indent++;\n this.line(\"contextStates[ctx] \\\\in State\");\n this.indent--;\n this.indent--;\n this.line(\"\");\n\n // Add extracted invariants from JSDoc\n if (this.extractedInvariants.length > 0) {\n this.line(\"\\\\* Extracted invariants from code annotations\");\n this.line(\"\");\n\n const invGenerator = new InvariantGenerator();\n const tlaInvariants = invGenerator.generateTLAInvariants(this.extractedInvariants, (expr) =>\n this.tsExpressionToTLA(expr, false)\n );\n\n for (const invDef of tlaInvariants) {\n this.line(invDef);\n this.line(\"\");\n }\n }\n\n // Add Tier 2 Optimization: Temporal constraints\n if (config.tier2?.temporalConstraints && config.tier2.temporalConstraints.length > 0) {\n this.addTemporalConstraints(config.tier2.temporalConstraints);\n }\n\n this.line(\"\\\\* State constraint to bound state space\");\n this.addStateConstraint(config);\n\n this.line(\"=============================================================================\");\n }\n\n /**\n * Add temporal constraint invariants (Tier 2 optimization)\n */\n private addTemporalConstraints(\n constraints: Array<{ before: string; after: string; description?: string }>\n ): void {\n this.line(\"\\\\* Tier 2: Temporal constraint invariants\");\n this.line(\"\\\\* Enforce ordering requirements between message types\");\n this.line(\"\");\n\n for (let i = 0; i < constraints.length; i++) {\n const constraint = constraints[i];\n const invName = `TemporalConstraint${i + 1}`;\n\n if (constraint.description) {\n this.line(`\\\\* ${constraint.description}`);\n }\n this.line(`${invName} ==`);\n this.indent++;\n this.line(\n `\\\\* If ${constraint.after} has been delivered, then ${constraint.before} must have been delivered`\n );\n this.line(\n `(\\\\E i \\\\in 1..Len(messages) : messages[i].id \\\\in delivered /\\\\ messages[i].msgType = \"${constraint.after}\")`\n );\n this.line(\"=>\");\n this.line(\n `(\\\\E i \\\\in 1..Len(messages) : messages[i].id \\\\in delivered /\\\\ messages[i].msgType = \"${constraint.before}\")`\n );\n this.indent--;\n this.line(\"\");\n\n // Track this invariant for config generation\n this.extractedInvariants.push({\n name: invName,\n description:\n constraint.description || `${constraint.before} must happen before ${constraint.after}`,\n condition: \"\",\n confidence: \"high\",\n source: { file: \"\", line: 0, column: 0 },\n });\n }\n }\n\n /**\n * Generate StateConstraint with per-message bounds support (Tier 1 optimization)\n * and bounded exploration (Tier 2 optimization)\n */\n private addStateConstraint(config: VerificationConfig): void {\n const hasPerMessageBounds =\n config.messages.perMessageBounds && Object.keys(config.messages.perMessageBounds).length > 0;\n const hasBoundedExploration = config.tier2?.boundedExploration?.maxDepth !== undefined;\n\n const needsConjunction = hasPerMessageBounds || hasBoundedExploration;\n\n this.line(\"StateConstraint ==\");\n this.indent++;\n\n if (needsConjunction) {\n // Multiple constraints\n this.line(\"/\\\\ Len(messages) <= MaxMessages\");\n\n // Tier 1: Per-message bounds\n if (hasPerMessageBounds) {\n for (const [msgType, _bound] of Object.entries(config.messages.perMessageBounds)) {\n const constName = `MaxMessages_${msgType}`;\n this.line(\n `/\\\\ Cardinality({m \\\\in DOMAIN messages : messages[m].msgType = \"${msgType}\"}) <= ${constName}`\n );\n }\n }\n\n // Tier 2: Bounded exploration (depth limit)\n if (hasBoundedExploration && config.tier2?.boundedExploration?.maxDepth) {\n this.line(\n `/\\\\ TLCGet(\"level\") <= ${config.tier2.boundedExploration.maxDepth} \\\\* Tier 2: Bounded exploration`\n );\n }\n } else {\n // Simple global bound only\n this.line(\"Len(messages) <= MaxMessages\");\n }\n\n this.indent--;\n this.line(\"\");\n\n // Log bounded exploration\n if (hasBoundedExploration && config.tier2?.boundedExploration?.maxDepth) {\n console.log(\n `[INFO] [TLAGenerator] Tier 2: Bounded exploration with maxDepth = ${config.tier2.boundedExploration.maxDepth}`\n );\n }\n }\n\n /**\n * Add delivered tracking variables for temporal properties\n */\n private addDeliveredTracking(): void {\n this.line(\"\");\n const tempGenerator = new TemporalTLAGenerator();\n const deliveredVars = tempGenerator.generateDeliveredVariables();\n this.line(deliveredVars);\n this.line(\"\");\n }\n\n /**\n * Add temporal property definitions\n */\n private addTemporalProperties(): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Temporal Properties\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n const tempGenerator = new TemporalTLAGenerator();\n const tlaProperties = tempGenerator.generateTLAProperties(this.temporalProperties);\n\n for (const propDef of tlaProperties) {\n this.line(propDef);\n this.line(\"\");\n }\n\n this.line(\"=============================================================================\");\n }\n\n private fieldConfigToTLAType(\n _fieldPath: string,\n fieldConfig: FieldConfig,\n _config: VerificationConfig\n ): string {\n // Try each type pattern in order\n const typeResult =\n this.tryAbstractType(fieldConfig) ||\n this.tryBooleanType(fieldConfig) ||\n this.tryEnumType(fieldConfig) ||\n this.tryArrayType(fieldConfig) ||\n this.tryNumberType(fieldConfig) ||\n this.tryStringType(fieldConfig) ||\n this.tryMapType(fieldConfig);\n\n return typeResult || \"Value\";\n }\n\n /**\n * Try to match abstract type pattern\n * Abstract fields use the generic Value type for model checking\n */\n private tryAbstractType(fieldConfig: FieldConfig): string | null {\n if (\"abstract\" in fieldConfig && fieldConfig.abstract === true) {\n return \"Value\";\n }\n return null;\n }\n\n /**\n * Try to match boolean type pattern\n */\n private tryBooleanType(fieldConfig: FieldConfig): string | null {\n if (\"type\" in fieldConfig && fieldConfig.type === \"boolean\") {\n return \"BOOLEAN\";\n }\n\n // Check for boolean array: [true, false] or [false, true]\n if (Array.isArray(fieldConfig)) {\n if (\n fieldConfig.length === 2 &&\n typeof fieldConfig[0] === \"boolean\" &&\n typeof fieldConfig[1] === \"boolean\"\n ) {\n return \"BOOLEAN\";\n }\n }\n\n return null;\n }\n\n /**\n * Try to match enum type pattern\n */\n private tryEnumType(fieldConfig: FieldConfig): string | null {\n if (\"type\" in fieldConfig && fieldConfig.type === \"enum\" && fieldConfig.values) {\n const values = fieldConfig.values.map((v: string) => `\"${v}\"`).join(\", \");\n return `{${values}}`;\n }\n return null;\n }\n\n /**\n * Try to match array type pattern\n */\n private tryArrayType(fieldConfig: FieldConfig): string | null {\n if (\"maxLength\" in fieldConfig) {\n return \"Seq(Value)\";\n }\n return null;\n }\n\n /**\n * Try to match number type pattern\n */\n private tryNumberType(fieldConfig: FieldConfig): string | null {\n if (\"min\" in fieldConfig && \"max\" in fieldConfig) {\n const min = fieldConfig.min || 0;\n const max = fieldConfig.max || 100;\n return `${min}..${max}`;\n }\n return null;\n }\n\n /**\n * Try to match string type pattern\n */\n private tryStringType(fieldConfig: FieldConfig): string | null {\n if (!(\"values\" in fieldConfig)) return null;\n\n if (fieldConfig.values && Array.isArray(fieldConfig.values)) {\n const values = fieldConfig.values.map((v: string) => `\"${v}\"`).join(\", \");\n return `{${values}}`;\n }\n\n return \"STRING\";\n }\n\n /**\n * Try to match map type pattern\n */\n private tryMapType(fieldConfig: FieldConfig): string | null {\n if (\"maxSize\" in fieldConfig) {\n return \"[Keys -> Value]\";\n }\n return null;\n }\n\n private getInitialValueFromAnalysis(fieldAnalysis: FieldAnalysis): string {\n const typeInfo = fieldAnalysis.type;\n\n switch (typeInfo.kind) {\n case \"boolean\":\n return \"FALSE\";\n case \"string\":\n return this.getInitialStringValue(typeInfo, fieldAnalysis.bounds);\n case \"number\":\n return this.getInitialNumberValue(fieldAnalysis.bounds);\n case \"enum\":\n return this.getInitialEnumValue(typeInfo);\n case \"array\":\n return \"<<>>\";\n case \"set\":\n return \"{}\";\n case \"map\":\n return \"[x \\\\in {} |-> NULL]\";\n case \"object\":\n return \"NULL\";\n case \"null\":\n return \"NULL\";\n case \"union\":\n return this.getInitialUnionValue(typeInfo, fieldAnalysis);\n default:\n return \"NULL\";\n }\n }\n\n /**\n * Get initial value for string type\n */\n private getInitialStringValue(\n typeInfo: { enumValues?: string[] },\n bounds?: { values?: string[] }\n ): string {\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n return `\"${typeInfo.enumValues[0]}\"`;\n }\n if (bounds?.values && bounds.values.length > 0) {\n return `\"${bounds.values[0]}\"`;\n }\n return '\"\"';\n }\n\n /**\n * Get initial value for number type\n */\n private getInitialNumberValue(bounds?: { min?: number }): string {\n if (bounds?.min !== undefined) {\n return `${bounds.min}`;\n }\n return \"0\";\n }\n\n /**\n * Get initial value for enum type\n */\n private getInitialEnumValue(typeInfo: { enumValues?: string[] }): string {\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n return `\"${typeInfo.enumValues[0]}\"`;\n }\n return '\"\"';\n }\n\n /**\n * Get initial value for union type\n */\n private getInitialUnionValue(\n typeInfo: { unionTypes?: Array<{ kind: string }> },\n fieldAnalysis: FieldAnalysis\n ): string {\n if (typeInfo.unionTypes && typeInfo.unionTypes.length > 0) {\n const firstType =\n typeInfo.unionTypes.find((t) => t.kind !== \"null\") || typeInfo.unionTypes[0];\n return this.getInitialValueFromAnalysis({\n ...fieldAnalysis,\n type: firstType as FieldAnalysis[\"type\"],\n });\n }\n return \"NULL\";\n }\n\n private inferTLATypeFromAnalysis(fieldAnalysis: FieldAnalysis): string {\n const typeInfo = fieldAnalysis.type;\n\n // Handle nullable types\n const makeNullable = (baseType: string): string => {\n return typeInfo.nullable ? `${baseType} \\\\union {NULL}` : baseType;\n };\n\n // Convert TypeKind to TLA+ type\n switch (typeInfo.kind) {\n case \"boolean\":\n return makeNullable(\"BOOLEAN\");\n\n case \"string\":\n // Check if there are enum values\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n const values = typeInfo.enumValues.map((v) => `\"${v}\"`).join(\", \");\n return makeNullable(`{${values}}`);\n }\n // Check bounds for bounded strings\n if (fieldAnalysis.bounds?.values && fieldAnalysis.bounds.values.length > 0) {\n const values = fieldAnalysis.bounds.values.map((v) => `\"${v}\"`).join(\", \");\n return makeNullable(`{${values}}`);\n }\n return makeNullable(\"STRING\");\n\n case \"number\":\n // Check for numeric bounds\n if (fieldAnalysis.bounds?.min !== undefined && fieldAnalysis.bounds?.max !== undefined) {\n return makeNullable(`${fieldAnalysis.bounds.min}..${fieldAnalysis.bounds.max}`);\n }\n return makeNullable(\"Int\");\n\n case \"enum\":\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n const values = typeInfo.enumValues.map((v) => `\"${v}\"`).join(\", \");\n return makeNullable(`{${values}}`);\n }\n return makeNullable(\"STRING\");\n\n case \"array\":\n // Sequence type\n if (typeInfo.elementType) {\n // For now, use simplified Value type\n return makeNullable(\"Seq(Value)\");\n }\n return makeNullable(\"Seq(Value)\");\n\n case \"set\":\n // Set type\n return makeNullable(\"SUBSET Value\");\n\n case \"map\":\n // Function type (TLA+ records/functions)\n return makeNullable(\"[Keys -> Value]\");\n\n case \"object\":\n // For nested objects, we'd need recursive handling\n // For now, use generic Value\n return makeNullable(\"Value\");\n\n case \"union\":\n // For unions, try to find a common representation\n // For now, use generic Value\n return makeNullable(\"Value\");\n\n case \"null\":\n return \"NULL\";\n default:\n return \"Value\";\n }\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Config type discrimination requires multiple conditionals\n private getInitialValue(fieldConfig: FieldConfig): string {\n // Handle abstract fields - use value from bounded Value set\n if (\"abstract\" in fieldConfig && fieldConfig.abstract === true) {\n return '\"v1\"'; // Default value from Value set\n }\n\n // Check for boolean array: [true, false]\n if (Array.isArray(fieldConfig)) {\n if (fieldConfig.length > 0 && typeof fieldConfig[0] === \"boolean\") {\n return fieldConfig[0] ? \"TRUE\" : \"FALSE\";\n }\n // String array\n if (fieldConfig.length > 0 && typeof fieldConfig[0] === \"string\") {\n return `\"${fieldConfig[0]}\"`;\n }\n }\n\n if (\"type\" in fieldConfig) {\n if (fieldConfig.type === \"boolean\") {\n return \"FALSE\";\n }\n if (fieldConfig.type === \"enum\" && fieldConfig.values && fieldConfig.values.length > 0) {\n return `\"${fieldConfig.values[0]}\"`;\n }\n // Handle array type\n if (fieldConfig.type === \"array\") {\n return \"<<>>\"; // Empty sequence\n }\n // Handle string type\n if (fieldConfig.type === \"string\") {\n return '\"\"'; // Empty string\n }\n }\n\n if (\"maxLength\" in fieldConfig) {\n return \"<<>>\"; // Empty sequence\n }\n\n if (\"min\" in fieldConfig) {\n return String(fieldConfig.min || 0);\n }\n\n if (\"values\" in fieldConfig && fieldConfig.values && fieldConfig.values.length > 0) {\n return `\"${fieldConfig.values[0]}\"`;\n }\n\n if (\"maxSize\" in fieldConfig) {\n // Map with all keys mapped to default value\n return '[k \\\\in Keys |-> \"v1\"]';\n }\n\n return \"0\"; // Default fallback\n }\n\n private fieldToConstName(fieldPath: string): string {\n return fieldPath.replace(/\\./g, \"_\").toUpperCase();\n }\n\n private sanitizeFieldName(fieldPath: string): string {\n return fieldPath.replace(/\\./g, \"_\");\n }\n\n private line(content: string): void {\n if (content === \"\") {\n this.lines.push(\"\");\n } else {\n const indentation = \" \".repeat(this.indent);\n this.lines.push(indentation + content);\n }\n }\n}\n\nexport async function generateTLA(\n config: VerificationConfig,\n analysis: CodebaseAnalysis\n): Promise<{ spec: string; cfg: string; validation?: ValidationReport }> {\n const generator = new TLAGenerator();\n return await generator.generate(config, analysis);\n}\n",
|
|
8
8
|
"// Docker container management for TLA+ verification\n\nimport { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport type DockerRunResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport class DockerRunner {\n private readonly IMAGE_NAME = \"polly-tla:latest\";\n private readonly DOCKERFILE_PATH = path.join(__dirname, \"../../Dockerfile\");\n\n /**\n * Check if Docker is available and daemon is responsive\n * Throws an error if Docker times out (to distinguish from Docker not being installed)\n */\n async isDockerAvailable(): Promise<boolean> {\n try {\n // Use 'docker info' instead of '--version' to verify daemon is running\n // '--version' only checks the client, not the daemon\n const result = await this.runCommand(\"docker\", [\"info\"], {\n timeout: 5000, // 5 second timeout\n });\n return result.exitCode === 0;\n } catch (error) {\n // Re-throw timeout errors so caller can handle them specially\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n throw error;\n }\n return false;\n }\n }\n\n /**\n * Check if TLA+ image exists\n * Throws an error if Docker times out\n */\n async hasImage(): Promise<boolean> {\n try {\n const result = await this.runCommand(\"docker\", [\"images\", \"-q\", this.IMAGE_NAME], {\n timeout: 10000, // 10 second timeout\n });\n return result.stdout.trim().length > 0;\n } catch (error) {\n // Re-throw timeout errors so caller can handle them specially\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n throw error;\n }\n return false;\n }\n }\n\n /**\n * Build TLA+ image from Dockerfile\n */\n async buildImage(onProgress?: (line: string) => void): Promise<void> {\n const dockerfileDir = path.dirname(this.DOCKERFILE_PATH);\n\n await this.runCommandStreaming(\n \"docker\",\n [\"build\", \"-f\", this.DOCKERFILE_PATH, \"-t\", this.IMAGE_NAME, dockerfileDir],\n onProgress,\n 300000 // 5 minute timeout for building image\n );\n }\n\n /**\n * Pull TLA+ image (deprecated - use buildImage instead)\n */\n async pullImage(onProgress?: (line: string) => void): Promise<void> {\n await this.buildImage(onProgress);\n }\n\n /**\n * Run TLC model checker on a spec\n */\n async runTLC(\n specPath: string,\n options?: {\n workers?: number;\n timeout?: number;\n maxDepth?: number;\n }\n ): Promise<TLCResult> {\n // Ensure spec file exists\n if (!fs.existsSync(specPath)) {\n throw new Error(`Spec file not found: ${specPath}`);\n }\n\n const specDir = path.dirname(specPath);\n const specName = path.basename(specPath, \".tla\");\n const cfgPath = path.join(specDir, `${specName}.cfg`);\n\n // Ensure cfg file exists\n if (!fs.existsSync(cfgPath)) {\n throw new Error(`Config file not found: ${cfgPath}`);\n }\n\n // Clean up any leftover state files from previous interrupted runs\n const statesDir = path.join(specDir, \"states\");\n if (fs.existsSync(statesDir)) {\n fs.rmSync(statesDir, { recursive: true, force: true });\n }\n\n // Run TLC in Docker\n const args = [\n \"run\",\n \"--rm\",\n \"-v\",\n `${specDir}:/work`,\n this.IMAGE_NAME,\n \"tlc\",\n \"-workers\",\n `${options?.workers || 1}`,\n \"-cleanup\", // Delete state files after model checking to prevent disk space issues\n ];\n\n // Add depth limit if maxDepth is configured (bounded model checking)\n if (options?.maxDepth !== undefined && options.maxDepth > 0) {\n args.push(\"-depth\", `${options.maxDepth}`);\n }\n\n args.push(`${specName}.tla`);\n\n const result = await this.runCommand(\"docker\", args, {\n timeout: options?.timeout,\n });\n\n return this.parseTLCOutput(result);\n }\n\n /**\n * Parse TLC output\n */\n private parseTLCOutput(result: DockerRunResult): TLCResult {\n const output = result.stdout + result.stderr;\n\n // Check for violations\n const violationMatch = output.match(/Error: Invariant (.*?) is violated/);\n if (violationMatch) {\n return {\n success: false,\n violation: {\n type: \"invariant\",\n name: violationMatch[1],\n trace: this.extractTrace(output),\n },\n output,\n };\n }\n\n // Check for errors\n if (result.exitCode !== 0 || output.includes(\"Error:\")) {\n return {\n success: false,\n error: this.extractError(output),\n output,\n };\n }\n\n // Success\n const statesMatch = output.match(/(\\d+) states generated/);\n const distinctMatch = output.match(/(\\d+) distinct states/);\n\n return {\n success: true,\n stats: {\n statesGenerated: statesMatch?.[1] ? Number.parseInt(statesMatch[1], 10) : 0,\n distinctStates: distinctMatch?.[1] ? Number.parseInt(distinctMatch[1], 10) : 0,\n },\n output,\n };\n }\n\n /**\n * Extract error trace from TLC output\n */\n private extractTrace(output: string): string[] {\n const lines = output.split(\"\\n\");\n const trace: string[] = [];\n let inTrace = false;\n\n for (const line of lines) {\n if (line.includes(\"State \") && line.includes(\":\")) {\n inTrace = true;\n trace.push(line);\n } else if (inTrace) {\n if (line.trim() === \"\" || line.startsWith(\"Error:\")) {\n break;\n }\n trace.push(line);\n }\n }\n\n return trace;\n }\n\n /**\n * Extract error message from TLC output\n */\n private extractError(output: string): string {\n const errorMatch = output.match(/Error: (.*?)(?:\\n|$)/);\n if (errorMatch?.[1]) {\n return errorMatch[1];\n }\n\n // Look for common error patterns\n if (output.includes(\"Parse Error\")) {\n return \"TLA+ syntax error in specification\";\n }\n if (output.includes(\"Semantic Error\")) {\n return \"Semantic error in specification\";\n }\n\n return \"Unknown error occurred during model checking\";\n }\n\n /**\n * Run a command and return output\n * Public to allow other runners (like SANYRunner) to execute commands\n */\n runCommand(\n command: string,\n args: string[],\n options?: { timeout?: number }\n ): Promise<DockerRunResult> {\n return new Promise((resolve, reject) => {\n const proc = spawn(command, args);\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n proc.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n // Only set timeout if a timeout value is provided\n const timeoutValue = options?.timeout ?? 0;\n const timeout =\n timeoutValue > 0\n ? setTimeout(() => {\n proc.kill();\n reject(\n new Error(\n `Command timed out after ${Math.floor(timeoutValue / 1000)}s. TLC was still making progress. Consider increasing the timeout or setting timeout: 0 for no timeout.`\n )\n );\n }, timeoutValue)\n : null;\n\n proc.on(\"close\", (exitCode) => {\n if (timeout) clearTimeout(timeout);\n\n resolve({\n exitCode: exitCode || 0,\n stdout,\n stderr,\n });\n });\n\n proc.on(\"error\", (error) => {\n if (timeout) clearTimeout(timeout);\n reject(error);\n });\n });\n }\n\n /**\n * Run a command with streaming output\n */\n private runCommandStreaming(\n command: string,\n args: string[],\n onOutput?: (line: string) => void,\n timeout?: number\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn(command, args);\n\n // Set up timeout if provided\n const timeoutHandle =\n timeout && timeout > 0\n ? setTimeout(() => {\n proc.kill();\n reject(\n new Error(\n `Command timed out after ${Math.floor(timeout / 1000)}s. Docker may be unresponsive.`\n )\n );\n }, timeout)\n : null;\n\n proc.stdout.on(\"data\", (data) => {\n if (onOutput) {\n const lines = data.toString().split(\"\\n\");\n for (const line of lines) {\n if (line.trim()) {\n onOutput(line.trim());\n }\n }\n }\n });\n\n proc.stderr.on(\"data\", (data) => {\n if (onOutput) {\n const lines = data.toString().split(\"\\n\");\n for (const line of lines) {\n if (line.trim()) {\n onOutput(line.trim());\n }\n }\n }\n });\n\n proc.on(\"close\", (exitCode) => {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n\n if (exitCode === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${exitCode}`));\n }\n });\n\n proc.on(\"error\", (error) => {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n reject(error);\n });\n });\n }\n}\n\nexport type TLCResult = {\n success: boolean;\n violation?: {\n type: \"invariant\" | \"property\" | \"deadlock\";\n name?: string;\n trace: string[];\n };\n error?: string;\n stats?: {\n statesGenerated: number;\n distinctStates: number;\n };\n output: string;\n};\n",
|
|
9
9
|
"#!/usr/bin/env bun\n// CLI for verification system\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { generateConfig } from \"./codegen/config\";\nimport { validateConfig } from \"./config/parser\";\nimport type { UnifiedVerificationConfig } from \"./config/types\";\nimport { analyzeCodebase } from \"./extract/types\";\n\nconst COLORS = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n gray: \"\\x1b[90m\",\n};\n\nfunction color(text: string, colorCode: string): string {\n return `${colorCode}${text}${COLORS.reset}`;\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n switch (command) {\n case \"--setup\":\n case \"setup\":\n await setupCommand();\n break;\n\n case \"--validate\":\n case \"validate\":\n await validateCommand();\n break;\n\n case \"--help\":\n case \"help\":\n showHelp();\n break;\n\n default:\n await verifyCommand();\n }\n}\n\nasync function setupCommand() {\n console.log(color(\"\\n🔍 Analyzing codebase...\\n\", COLORS.blue));\n\n try {\n // Find tsconfig\n const tsConfigPath = findTsConfig();\n if (!tsConfigPath) {\n process.exit(1);\n }\n\n console.log(color(` Using: ${tsConfigPath}`, COLORS.gray));\n\n // Analyze codebase\n const analysis = await analyzeCodebase({\n tsConfigPath,\n stateFilePath: findStateFile(),\n });\n\n displayAnalysisResults(analysis);\n displayAnalysisSummary(analysis);\n\n // Generate and write config\n const configContent = generateConfig(analysis);\n const configPath = path.join(process.cwd(), \"specs\", \"verification.config.ts\");\n\n writeConfigFile(configPath, configContent);\n displaySetupSuccess(configPath);\n } catch (_error) {\n process.exit(1);\n }\n}\n\nfunction displayAnalysisResults(analysis: {\n stateType?: unknown;\n fields: unknown[];\n messageTypes: unknown[];\n}): void {\n if (analysis.stateType) {\n console.log(color(`✓ Found state type with ${analysis.fields.length} field(s)`, COLORS.green));\n } else {\n console.log(color(\"\\n⚠️ Could not find state type definition\", COLORS.yellow));\n console.log(\" Expected to find a type named 'AppState' or 'State'\");\n console.log(\" in a file matching **/state*.ts\");\n console.log();\n console.log(\" You can still generate a config template:\");\n console.log(\" It will be empty and you'll need to fill it in manually.\");\n console.log();\n }\n\n console.log(color(`✓ Found ${analysis.messageTypes.length} message type(s)`, COLORS.green));\n}\n\nfunction displayAnalysisSummary(analysis: {\n fields: Array<{ path: string; type: { kind: string }; confidence: string }>;\n}): void {\n if (analysis.fields.length === 0) return;\n\n console.log(color(\"\\n📊 Configuration Summary:\\n\", COLORS.blue));\n\n const table = [\n [\"Field\", \"Type\", \"Status\"],\n [\"─\".repeat(30), \"─\".repeat(20), \"─\".repeat(20)],\n ];\n\n for (const field of analysis.fields) {\n const status = getFieldStatus(field.confidence);\n table.push([field.path, field.type.kind, status]);\n }\n\n for (const row of table) {\n console.log(` ${row[0]?.padEnd(32) ?? \"\"} ${row[1]?.padEnd(22) ?? \"\"} ${row[2] ?? \"\"}`);\n }\n}\n\nfunction getFieldStatus(confidence: string): string {\n if (confidence === \"high\") return color(\"✓ Auto-configured\", COLORS.green);\n if (confidence === \"medium\") return color(\"⚠ Review needed\", COLORS.yellow);\n return color(\"⚠ Manual config\", COLORS.red);\n}\n\nfunction writeConfigFile(configPath: string, configContent: string): void {\n const configDir = path.dirname(configPath);\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n fs.writeFileSync(configPath, configContent, \"utf-8\");\n}\n\nfunction displaySetupSuccess(configPath: string): void {\n console.log(color(\"\\n✅ Configuration generated!\\n\", COLORS.green));\n console.log(` File: ${color(configPath, COLORS.blue)}`);\n console.log();\n console.log(color(\"📝 Next steps:\", COLORS.blue));\n console.log();\n console.log(\" 1. Review the generated configuration file\");\n console.log(\" 2. Fill in values marked with /* CONFIGURE */\");\n console.log(\" 3. Run 'bun verify' to check your configuration\");\n console.log();\n console.log(color(\"💡 Tip:\", COLORS.gray));\n console.log(color(\" Look for comments explaining what each field needs.\", COLORS.gray));\n console.log();\n}\n\nasync function validateCommand() {\n const configPath = path.join(process.cwd(), \"specs\", \"verification.config.ts\");\n\n console.log(color(\"\\n🔍 Validating configuration...\\n\", COLORS.blue));\n\n const result = validateConfig(configPath);\n\n if (result.valid) {\n console.log(color(\"✅ Configuration is complete and valid!\\n\", COLORS.green));\n console.log(\" You can now run 'bun verify' to start verification.\");\n console.log();\n return;\n }\n\n // Show errors\n const errors = result.issues.filter((i) => i.severity === \"error\");\n const warnings = result.issues.filter((i) => i.severity === \"warning\");\n\n displayValidationErrors(errors);\n displayValidationWarnings(warnings);\n\n console.log(color(\"Configuration incomplete. Please fix the errors above.\\n\", COLORS.red));\n process.exit(1);\n}\n\nfunction displayValidationErrors(\n errors: Array<{\n message: string;\n field?: string;\n location?: { line: number };\n suggestion: string;\n }>\n): void {\n if (errors.length === 0) return;\n\n console.log(color(`❌ Found ${errors.length} error(s):\\n`, COLORS.red));\n\n for (const error of errors) {\n console.log(color(` • ${error.message}`, COLORS.red));\n if (error.field) {\n console.log(color(` Field: ${error.field}`, COLORS.gray));\n }\n if (error.location) {\n console.log(color(` Location: line ${error.location.line}`, COLORS.gray));\n }\n console.log(color(` → ${error.suggestion}`, COLORS.yellow));\n console.log();\n }\n}\n\nfunction displayValidationWarnings(\n warnings: Array<{ message: string; field?: string; suggestion: string }>\n): void {\n if (warnings.length === 0) return;\n\n console.log(color(`⚠️ Found ${warnings.length} warning(s):\\n`, COLORS.yellow));\n\n for (const warning of warnings) {\n console.log(color(` • ${warning.message}`, COLORS.yellow));\n if (warning.field) {\n console.log(color(` Field: ${warning.field}`, COLORS.gray));\n }\n console.log(color(` → ${warning.suggestion}`, COLORS.gray));\n console.log();\n }\n}\n\nasync function verifyCommand() {\n const configPath = path.join(process.cwd(), \"specs\", \"verification.config.ts\");\n\n console.log(color(\"\\n🔍 Running verification...\\n\", COLORS.blue));\n\n // First validate config\n const validation = validateConfig(configPath);\n\n if (!validation.valid) {\n const errors = validation.issues.filter((i) => i.severity === \"error\");\n console.log(color(`❌ Configuration incomplete (${errors.length} error(s))\\n`, COLORS.red));\n\n for (const error of errors.slice(0, 3)) {\n console.log(color(` • ${error.message}`, COLORS.red));\n if (error.field) {\n console.log(color(` Field: ${error.field}`, COLORS.gray));\n }\n console.log();\n }\n\n if (errors.length > 3) {\n console.log(color(` ... and ${errors.length - 3} more error(s)`, COLORS.gray));\n console.log();\n }\n\n console.log(\" Run 'bun verify --validate' to see all issues\");\n console.log(\" Run 'bun verify --setup' to regenerate configuration\");\n console.log();\n process.exit(1);\n }\n\n console.log(color(\"✓ Configuration valid\", COLORS.green));\n console.log();\n\n // Run full verification\n try {\n await runFullVerification(configPath);\n } catch (error) {\n // biome-ignore lint/suspicious/noConsole: CLI tool needs console output for error reporting\n console.error(color(\"\\n❌ Verification error:\", COLORS.red));\n if (error instanceof Error) {\n // biome-ignore lint/suspicious/noConsole: CLI tool needs console output for error reporting\n console.error(color(error.message, COLORS.red));\n if (process.env.POLLY_DEBUG) {\n // biome-ignore lint/suspicious/noConsole: CLI tool needs console output for error reporting\n console.error(color(\"\\nStack trace:\", COLORS.gray));\n // biome-ignore lint/suspicious/noConsole: CLI tool needs console output for error reporting\n console.error(error.stack);\n }\n } else {\n // biome-ignore lint/suspicious/noConsole: CLI tool needs console output for error reporting\n console.error(String(error));\n }\n // biome-ignore lint/suspicious/noConsole: CLI tool needs console output for error reporting\n console.error();\n process.exit(1);\n }\n}\n\n/**\n * Get timeout in seconds from config (0 = no timeout)\n */\nfunction getTimeout(config: UnifiedVerificationConfig): number {\n return config.verification?.timeout ?? 0;\n}\n\n/**\n * Get number of workers from config\n */\nfunction getWorkers(config: UnifiedVerificationConfig): number {\n return config.verification?.workers ?? 1;\n}\n\n/**\n * Get maxDepth from config for bounded model checking (Tier 2)\n */\nfunction getMaxDepth(config: UnifiedVerificationConfig): number | undefined {\n // maxDepth is only available in legacy config format with tier2 settings\n if (\"tier2\" in config && config.tier2?.boundedExploration?.maxDepth) {\n return config.tier2.boundedExploration.maxDepth;\n }\n return undefined;\n}\n\nasync function runFullVerification(configPath: string) {\n // Load config\n const config = await loadVerificationConfig(configPath);\n\n // Analyze codebase\n const analysis = await runCodebaseAnalysis();\n\n // Generate TLA+ specs\n const { specPath, specDir } = await generateAndWriteTLASpecs(config, analysis);\n\n // Find and copy base spec\n findAndCopyBaseSpec(specDir);\n\n console.log(color(\"✓ Specification generated\", COLORS.green));\n console.log(color(` ${specPath}`, COLORS.gray));\n console.log();\n\n // Setup and run Docker\n const docker = await setupDocker();\n\n // Determine timeout, workers, and maxDepth from config\n const timeoutSeconds = getTimeout(config);\n const workers = getWorkers(config);\n const maxDepth = getMaxDepth(config);\n\n // Run TLC\n console.log(color(\"⚙️ Running TLC model checker...\", COLORS.blue));\n if (timeoutSeconds === 0) {\n console.log(color(\" No timeout set - will run until completion\", COLORS.gray));\n } else {\n const timeoutMinutes = Math.floor(timeoutSeconds / 60);\n const timeoutLabel =\n timeoutMinutes > 0\n ? `${timeoutMinutes} minute${timeoutMinutes > 1 ? \"s\" : \"\"}`\n : `${timeoutSeconds} seconds`;\n console.log(color(` Timeout: ${timeoutLabel}`, COLORS.gray));\n }\n if (maxDepth !== undefined) {\n console.log(color(` Max depth: ${maxDepth}`, COLORS.gray));\n }\n console.log();\n\n const result = await docker.runTLC(specPath, {\n workers,\n timeout: timeoutSeconds > 0 ? timeoutSeconds * 1000 : undefined,\n maxDepth,\n });\n\n // Display results\n displayVerificationResults(result, specDir);\n}\n\nasync function loadVerificationConfig(configPath: string): Promise<unknown> {\n const resolvedPath = path.resolve(configPath);\n const configModule = await import(`file://${resolvedPath}?t=${Date.now()}`);\n\n // Support both named export (verificationConfig) and default export\n // Named export was added in v0.7.0 for better IDE support\n return configModule.verificationConfig || configModule.default;\n}\n\nasync function runCodebaseAnalysis(): Promise<{ fields: unknown[]; messageTypes: unknown[] }> {\n console.log(color(\"📊 Analyzing codebase...\", COLORS.blue));\n const tsConfigPath = findTsConfig();\n if (!tsConfigPath) {\n throw new Error(\"Could not find tsconfig.json\");\n }\n\n const analysis = await analyzeCodebase({\n tsConfigPath,\n stateFilePath: findStateFile(),\n });\n\n console.log(color(\"✓ Analysis complete\", COLORS.green));\n console.log();\n\n return analysis;\n}\n\nasync function generateAndWriteTLASpecs(\n config: unknown,\n analysis: unknown\n): Promise<{ specPath: string; specDir: string }> {\n const { generateTLA } = await import(\"./codegen/tla\");\n\n console.log(color(\"📝 Generating TLA+ specification...\", COLORS.blue));\n const { spec, cfg } = await generateTLA(config, analysis);\n\n const specDir = path.join(process.cwd(), \"specs\", \"tla\", \"generated\");\n if (!fs.existsSync(specDir)) {\n fs.mkdirSync(specDir, { recursive: true });\n }\n\n const specPath = path.join(specDir, \"UserApp.tla\");\n const cfgPath = path.join(specDir, \"UserApp.cfg\");\n\n fs.writeFileSync(specPath, spec);\n fs.writeFileSync(cfgPath, cfg);\n\n return { specPath, specDir };\n}\n\nfunction findAndCopyBaseSpec(specDir: string): void {\n const possiblePaths = [\n path.join(process.cwd(), \"specs\", \"tla\", \"MessageRouter.tla\"),\n path.join(__dirname, \"..\", \"specs\", \"tla\", \"MessageRouter.tla\"),\n path.join(__dirname, \"..\", \"..\", \"specs\", \"tla\", \"MessageRouter.tla\"),\n path.join(\n process.cwd(),\n \"external\",\n \"polly\",\n \"packages\",\n \"verify\",\n \"specs\",\n \"tla\",\n \"MessageRouter.tla\"\n ),\n path.join(\n process.cwd(),\n \"node_modules\",\n \"@fairfox\",\n \"polly-verify\",\n \"specs\",\n \"tla\",\n \"MessageRouter.tla\"\n ),\n ];\n\n let baseSpecPath: string | null = null;\n for (const candidatePath of possiblePaths) {\n if (fs.existsSync(candidatePath)) {\n baseSpecPath = candidatePath;\n break;\n }\n }\n\n if (baseSpecPath) {\n const destSpecPath = path.join(specDir, \"MessageRouter.tla\");\n fs.copyFileSync(baseSpecPath, destSpecPath);\n console.log(color(\"✓ Copied MessageRouter.tla\", COLORS.green));\n } else {\n console.log(\n color(\"⚠️ Warning: MessageRouter.tla not found, verification may fail\", COLORS.yellow)\n );\n console.log(color(\" Searched in:\", COLORS.gray));\n for (const searchPath of possiblePaths) {\n console.log(color(` - ${searchPath}`, COLORS.gray));\n }\n }\n}\n\nasync function setupDocker(): Promise<{\n runTLC: (\n specPath: string,\n options: { workers: number; timeout: number }\n ) => Promise<{\n success: boolean;\n stats?: { statesGenerated: number; distinctStates: number };\n violation?: { name: string; trace: string[] };\n error?: string;\n output: string;\n }>;\n}> {\n const { DockerRunner } = await import(\"./runner/docker\");\n\n console.log(color(\"🐳 Checking Docker...\", COLORS.blue));\n const docker = new DockerRunner();\n\n try {\n if (!(await docker.isDockerAvailable())) {\n console.log();\n console.log(color(\"❌ Docker is not available\", COLORS.red));\n console.log();\n console.log(\"Please ensure Docker is installed and running:\");\n console.log(\n color(\n \" • Install Docker Desktop: https://www.docker.com/products/docker-desktop\",\n COLORS.gray\n )\n );\n console.log(color(\" • Make sure Docker Desktop is running\", COLORS.gray));\n console.log();\n throw new Error(\"Docker is not available\");\n }\n } catch (error) {\n console.log();\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n console.log(color(\"❌ Docker is unresponsive\", COLORS.red));\n console.log();\n console.log(\"Docker appears to be installed but is not responding.\");\n console.log(\"Try restarting Docker:\");\n console.log(color(\" • Quit Docker Desktop completely\", COLORS.gray));\n console.log(color(\" • Restart Docker Desktop\", COLORS.gray));\n console.log(\n color(\" • Wait for Docker to fully start (check the menu bar icon)\", COLORS.gray)\n );\n console.log();\n } else if (error instanceof Error && error.message !== \"Docker is not available\") {\n console.log(color(`❌ Error checking Docker: ${error.message}`, COLORS.red));\n console.log();\n }\n throw error;\n }\n\n try {\n if (!(await docker.hasImage())) {\n console.log(color(\" Pulling TLA+ image (this may take a moment)...\", COLORS.gray));\n await docker.pullImage((line) => {\n console.log(color(` ${line}`, COLORS.gray));\n });\n }\n } catch (error) {\n console.log();\n if (error instanceof Error && error.message.includes(\"timed out\")) {\n console.log(color(\"❌ Docker is unresponsive while checking for TLA+ image\", COLORS.red));\n console.log();\n console.log(\"Docker is not responding. Try restarting Docker Desktop.\");\n console.log();\n }\n throw error;\n }\n\n console.log(color(\"✓ Docker ready\", COLORS.green));\n console.log();\n\n return docker;\n}\n\nfunction displayVerificationResults(\n result: {\n success: boolean;\n stats?: { statesGenerated: number; distinctStates: number };\n violation?: { name: string; trace: string[] };\n error?: string;\n output: string;\n },\n specDir: string\n): void {\n if (result.success) {\n console.log(color(\"✅ Verification passed!\\n\", COLORS.green));\n console.log(color(\"Statistics:\", COLORS.blue));\n console.log(color(` States explored: ${result.stats?.statesGenerated || 0}`, COLORS.gray));\n console.log(color(` Distinct states: ${result.stats?.distinctStates || 0}`, COLORS.gray));\n console.log();\n return;\n }\n\n console.log(color(\"❌ Verification failed!\\n\", COLORS.red));\n\n if (result.violation) {\n console.log(color(`Invariant violated: ${result.violation.name}\\n`, COLORS.red));\n console.log(color(\"Trace to violation:\", COLORS.yellow));\n for (const line of result.violation.trace.slice(0, 20)) {\n console.log(color(` ${line}`, COLORS.gray));\n }\n if (result.violation.trace.length > 20) {\n console.log(color(` ... (${result.violation.trace.length - 20} more lines)`, COLORS.gray));\n }\n } else if (result.error) {\n console.log(color(`Error: ${result.error}`, COLORS.red));\n }\n\n console.log();\n console.log(color(\"Full output saved to:\", COLORS.gray));\n console.log(color(` ${path.join(specDir, \"tlc-output.log\")}`, COLORS.gray));\n fs.writeFileSync(path.join(specDir, \"tlc-output.log\"), result.output);\n\n process.exit(1);\n}\n\nfunction showHelp() {\n console.log(`\n${color(\"bun verify\", COLORS.blue)} - Formal verification for web extensions\n\n${color(\"Commands:\", COLORS.blue)}\n\n ${color(\"bun verify\", COLORS.green)}\n Run verification (validates config, generates specs, runs TLC)\n\n ${color(\"bun verify --setup\", COLORS.green)}\n Analyze codebase and generate configuration file\n\n ${color(\"bun verify --validate\", COLORS.green)}\n Validate existing configuration without running verification\n\n ${color(\"bun verify --help\", COLORS.green)}\n Show this help message\n\n${color(\"Getting Started:\", COLORS.blue)}\n\n 1. Run ${color(\"bun verify --setup\", COLORS.green)} to generate configuration\n 2. Review ${color(\"specs/verification.config.ts\", COLORS.blue)} and fill in marked fields\n 3. Run ${color(\"bun verify --validate\", COLORS.green)} to check your configuration\n 4. Run ${color(\"bun verify\", COLORS.green)} to start verification\n\n${color(\"Configuration Help:\", COLORS.blue)}\n\n The generated config file uses special markers:\n\n ${color(\"/* CONFIGURE */\", COLORS.yellow)} - Replace with your value\n ${color(\"/* REVIEW */\", COLORS.yellow)} - Check auto-generated value\n ${color(\"null\", COLORS.yellow)} - Must be replaced with concrete value\n\n${color(\"Learn More:\", COLORS.blue)}\n\n Documentation: https://github.com/fairfox/web-ext\n TLA+ Resources: https://learntla.com\n`);\n}\n\nfunction findTsConfig(): string | null {\n const locations = [\n path.join(process.cwd(), \"tsconfig.json\"),\n path.join(process.cwd(), \"packages\", \"web-ext\", \"tsconfig.json\"),\n ];\n\n for (const loc of locations) {\n if (fs.existsSync(loc)) {\n return loc;\n }\n }\n\n return null;\n}\n\nfunction findStateFile(): string | undefined {\n const locations = [\n path.join(process.cwd(), \"types\", \"state.ts\"),\n path.join(process.cwd(), \"src\", \"types\", \"state.ts\"),\n path.join(process.cwd(), \"packages\", \"web-ext\", \"src\", \"shared\", \"state\", \"app-state.ts\"),\n ];\n\n for (const loc of locations) {\n if (fs.existsSync(loc)) {\n return loc;\n }\n }\n\n return undefined;\n}\n\nmain().catch((error) => {\n if (error instanceof Error && error.stack) {\n // Stack trace already printed by underlying functions\n }\n process.exit(1);\n});\n",
|
|
10
10
|
"// Configuration file generator with smart comments\n\nimport type { ProjectType } from \"../../../analysis/src/types/architecture\";\nimport type { CodebaseAnalysis, FieldAnalysis, TypeInfo } from \"../types\";\n\nexport class ConfigGenerator {\n private lines: string[] = [];\n private indent = 0;\n private projectType: ProjectType = \"chrome-extension\";\n\n generate(analysis: CodebaseAnalysis, projectType: ProjectType = \"chrome-extension\"): string {\n this.lines = [];\n this.indent = 0;\n this.projectType = projectType;\n\n this.addHeader();\n this.addImports();\n this.addExport();\n this.addStateConfig(analysis.fields);\n this.addMessagesConfig();\n this.addBehaviorConfig();\n this.closeExport();\n\n return this.lines.join(\"\\n\");\n }\n\n private addHeader(): void {\n this.line(\"// ═══════════════════════════════════════════════════════════════\");\n this.line(\"// Verification Configuration\");\n this.line(\"// ═══════════════════════════════════════════════════════════════\");\n this.line(\"//\");\n this.line(`// Project type: ${this.projectType}`);\n this.line(\"//\");\n this.line(\"// This file configures TLA+ verification for your application.\");\n this.line(\"// Some values are auto-configured, others need your input.\");\n this.line(\"//\");\n this.line(\"// Entry points:\");\n this.addEntryPointsDocumentation();\n this.line(\"//\");\n this.line(\"// Look for:\");\n this.line(\"// • /* CONFIGURE */ - Replace with your value\");\n this.line(\"// • /* REVIEW */ - Check the auto-generated value\");\n this.line(\"// • null - Must be replaced with a concrete value\");\n this.line(\"//\");\n this.line(\"// Run 'bun verify' to check for incomplete configuration.\");\n this.line(\"// Run 'bun verify --setup' for interactive help.\");\n this.line(\"//\");\n this.line(\"\");\n }\n\n private addEntryPointsDocumentation(): void {\n switch (this.projectType) {\n case \"websocket-app\":\n this.line(\"// • server - WebSocket server\");\n this.line(\"// • client-* - Connected clients\");\n break;\n case \"pwa\":\n this.line(\"// • ServiceWorker - Service worker context\");\n this.line(\"// • Window - Browser window context\");\n break;\n case \"electron\":\n this.line(\"// • MainProcess - Electron main process\");\n this.line(\"// • Renderer-* - Renderer processes\");\n break;\n case \"chrome-extension\":\n this.line(\"// • background - Background service worker\");\n this.line(\"// • content - Content scripts\");\n this.line(\"// • popup - Extension popup\");\n break;\n case \"generic\":\n this.line(\"// • Detected from your code\");\n break;\n }\n }\n\n private addImports(): void {\n this.line(\"import { defineVerification } from '@fairfox/polly/verify'\");\n this.line(\"\");\n }\n\n private addExport(): void {\n this.line(\"export default defineVerification({\");\n this.indent++;\n }\n\n private closeExport(): void {\n this.indent--;\n this.line(\"})\");\n }\n\n private addStateConfig(fields: FieldAnalysis[]): void {\n this.line(\"state: {\");\n this.indent++;\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n if (!field) continue;\n\n // Add blank line between fields\n if (i > 0) {\n this.line(\"\");\n }\n\n this.addFieldConfig(field);\n }\n\n this.indent--;\n this.line(\"},\");\n this.line(\"\");\n }\n\n private addFieldConfig(field: FieldAnalysis): void {\n // Generate comment block\n this.addFieldComment(field);\n\n // Generate configuration line\n const config = this.generateFieldConfig(field);\n this.line(`\"${field.path}\": ${config},`);\n }\n\n private addFieldComment(field: FieldAnalysis): void {\n const separator = \"─\".repeat(60);\n\n // Header\n this.line(`// ${separator}`);\n this.line(`// ${field.path}: ${this.formatTypeName(field.type)}`);\n this.line(`// ${separator}`);\n\n // High confidence: auto-configured\n if (field.confidence === \"high\") {\n this.line(\"// ✓ Auto-configured from code analysis\");\n if (field.evidence.length > 0) {\n for (const evidence of field.evidence) {\n this.line(`// ${evidence}`);\n }\n }\n this.line(\"//\");\n return;\n }\n\n // Medium confidence: needs review\n if (field.confidence === \"medium\") {\n this.line(\"// ⚠️ Please review this auto-generated value\");\n if (field.evidence.length > 0) {\n for (const evidence of field.evidence) {\n this.line(`// Found: ${evidence}`);\n }\n }\n this.line(\"//\");\n this.line(\"// REVIEW: Adjust if needed\");\n this.line(\"//\");\n return;\n }\n\n // Low confidence: manual configuration required\n this.line(\"// ⚠️ Manual configuration required\");\n this.line(\"//\");\n\n // Type-specific guidance\n this.addTypeGuidance(field);\n\n // Suggestions\n if (field.suggestions.length > 0) {\n this.line(\"//\");\n for (const suggestion of field.suggestions) {\n this.line(`// ${suggestion}`);\n }\n }\n\n this.line(\"//\");\n this.line(\"// CONFIGURE: Fill in the value below\");\n this.line(\"//\");\n }\n\n private addTypeGuidance(field: FieldAnalysis): void {\n switch (field.type.kind) {\n case \"array\":\n this.line(\"// This array has no bounds in your code. Choose a maximum\");\n this.line(\"// length for verification. Tradeoffs:\");\n this.line(\"// • Small (3-5): Fast, catches basic bugs\");\n this.line(\"// • Medium (10-15): Balanced, catches most bugs\");\n this.line(\"// • Large (20+): Thorough, much slower\");\n break;\n\n case \"string\":\n this.line(\"// Strings need concrete values for precise verification.\");\n this.line(\"// Provide 2-3 representative values from your app.\");\n if (field.type.nullable) {\n this.line(\"//\");\n this.line(\"// Note: This field is nullable (can be null)\");\n }\n this.line(\"//\");\n this.line(\"// Examples:\");\n this.line('// [\"user_abc123\", \"user_xyz789\", \"guest_000\"]');\n this.line('// [\"active\", \"inactive\", \"pending\"]');\n this.line(\"//\");\n this.line(\"// Alternative: Use abstract verification (less precise, faster)\");\n this.line(\"// { abstract: true }\");\n break;\n\n case \"number\":\n this.line(\"// Numbers need a range. Choose min and max values based on\");\n this.line(\"// realistic bounds in your application.\");\n if (field.type.nullable) {\n this.line(\"//\");\n this.line(\"// Note: This field is nullable (can be null)\");\n }\n this.line(\"//\");\n this.line(\"// Examples:\");\n this.line(\"// { min: 0, max: 100 } // Counter\");\n this.line(\"// { min: 0, max: 999999 } // Timestamp\");\n break;\n\n case \"map\":\n case \"set\":\n this.line(`// ${field.type.kind} needs a maximum size. How many entries`);\n this.line(\"// do you need to model to catch bugs?\");\n this.line(\"//\");\n this.line(\"// Recommended: 3-5 for most cases\");\n break;\n\n case \"object\":\n this.line(\"// Complex nested object. Configure each field separately.\");\n break;\n\n default:\n this.line(`// ${field.type.kind} type requires configuration.`);\n }\n }\n\n private generateFieldConfig(field: FieldAnalysis): string {\n switch (field.type.kind) {\n case \"boolean\":\n return \"{ type: 'boolean' }\";\n\n case \"enum\":\n return this.generateEnumFieldConfig(field);\n\n case \"array\":\n return this.generateArrayFieldConfig(field);\n\n case \"number\":\n return this.generateNumberFieldConfig(field);\n\n case \"string\":\n return \"{ values: /* CONFIGURE */ null }\";\n\n case \"map\":\n case \"set\":\n return \"{ maxSize: /* CONFIGURE */ null }\";\n\n default:\n return \"{ /* CONFIGURE */ }\";\n }\n }\n\n private generateEnumFieldConfig(field: FieldAnalysis): string {\n if (field.type.enumValues) {\n const values = field.type.enumValues.map((v) => `\"${v}\"`).join(\", \");\n return `{ type: \"enum\", values: [${values}] }`;\n }\n return \"{ type: 'enum', values: /* CONFIGURE */ null }\";\n }\n\n private generateArrayFieldConfig(field: FieldAnalysis): string {\n if (field.bounds?.maxLength !== undefined && field.bounds.maxLength !== null) {\n if (field.confidence === \"medium\") {\n return `{ maxLength: /* REVIEW */ ${field.bounds.maxLength} }`;\n }\n return `{ maxLength: ${field.bounds.maxLength} }`;\n }\n return \"{ maxLength: /* CONFIGURE */ null }\";\n }\n\n private generateNumberFieldConfig(field: FieldAnalysis): string {\n if (field.bounds?.min !== undefined && field.bounds?.max !== undefined) {\n const minStr = field.bounds.min !== null ? field.bounds.min : \"/* CONFIGURE */\";\n const maxStr = field.bounds.max !== null ? field.bounds.max : \"/* CONFIGURE */\";\n\n if (field.confidence === \"high\") {\n return `{ min: ${minStr}, max: ${maxStr} }`;\n }\n return `{ min: /* REVIEW */ ${minStr}, max: /* REVIEW */ ${maxStr} }`;\n }\n return \"{ min: /* CONFIGURE */ null, max: /* CONFIGURE */ null }\";\n }\n\n private addMessagesConfig(): void {\n this.line(\"messages: {\");\n this.indent++;\n\n this.line(\"// Maximum messages in flight simultaneously across all contexts.\");\n this.line(\"// Higher = more realistic concurrency, but exponentially slower.\");\n this.line(\"//\");\n this.line(\"// Recommended values:\");\n this.line(\"// • 2: Fast verification (< 1 minute)\");\n this.line(\"// • 3: Balanced (5-10 minutes)\");\n this.line(\"// • 4+: Thorough but slow (10+ minutes)\");\n this.line(\"//\");\n this.line(\"// WARNING: State space grows exponentially! Start small.\");\n this.line(\"maxInFlight: 2,\");\n this.line(\"\");\n\n // Add project-specific fields\n switch (this.projectType) {\n case \"websocket-app\":\n this.line(\"// Maximum number of connected WebSocket clients to model.\");\n this.line(\"//\");\n this.line(\"// Recommended:\");\n this.line(\"// • 2-3: Most WebSocket apps\");\n this.line(\"// • 4-5: Multi-client coordination\");\n this.line(\"//\");\n this.line(\"maxClients: 3,\");\n this.line(\"\");\n this.line(\"// Maximum messages per client in flight.\");\n this.line(\"//\");\n this.line(\"// Recommended:\");\n this.line(\"// • 1-2: Simple request-response\");\n this.line(\"// • 3-4: Complex message flows\");\n this.line(\"//\");\n this.line(\"maxMessagesPerClient: 2,\");\n break;\n\n case \"pwa\":\n this.line(\"// Maximum number of service workers to model.\");\n this.line(\"//\");\n this.line(\"// Recommended:\");\n this.line(\"// • 1: Most PWAs (single service worker)\");\n this.line(\"// • 2: Testing worker updates\");\n this.line(\"//\");\n this.line(\"maxWorkers: 1,\");\n this.line(\"\");\n this.line(\"// Maximum number of client windows to model.\");\n this.line(\"//\");\n this.line(\"// Recommended:\");\n this.line(\"// • 2-3: Most PWAs\");\n this.line(\"// • 4-5: Multi-window coordination\");\n this.line(\"//\");\n this.line(\"maxClients: 3,\");\n break;\n\n case \"electron\":\n this.line(\"// Maximum number of renderer processes to model.\");\n this.line(\"//\");\n this.line(\"// Recommended:\");\n this.line(\"// • 1-2: Most Electron apps\");\n this.line(\"// • 3-4: Multi-window applications\");\n this.line(\"//\");\n this.line(\"maxRenderers: 2,\");\n break;\n\n case \"chrome-extension\":\n this.line(\"// Maximum tab IDs to model (content scripts are per-tab).\");\n this.line(\"//\");\n this.line(\"// Recommended:\");\n this.line(\"// • 0-1: Most extensions (single tab or tab-agnostic)\");\n this.line(\"// • 2-3: Multi-tab coordination\");\n this.line(\"//\");\n this.line(\"// Start with 0 or 1 for faster verification.\");\n this.line(\"maxTabs: 1,\");\n break;\n\n case \"generic\":\n this.line(\"// Maximum contexts/actors to model.\");\n this.line(\"//\");\n this.line(\"// Recommended:\");\n this.line(\"// • 2-3: Simple message passing\");\n this.line(\"// • 4-5: Complex coordination\");\n this.line(\"//\");\n this.line(\"maxContexts: 3,\");\n break;\n }\n\n this.line(\"\");\n this.line(\"// ─────────────────────────────────────────────────────────\");\n this.line(\"// Tier 1 Optimizations (no precision loss) - OPTIONAL\");\n this.line(\"// ─────────────────────────────────────────────────────────\");\n this.line(\"// Uncomment and configure to reduce state space:\");\n this.line(\"//\");\n this.line(\"// 1. Filter messages (use include OR exclude, not both):\");\n this.line(\"// include: ['authenticate', 'query', 'command', 'result'],\");\n this.line(\"// exclude: ['load', 'unload', 'resize', 'scroll', 'click'],\");\n this.line(\"//\");\n this.line(\"// 2. Symmetry reduction (group equivalent message types):\");\n this.line(\"// symmetry: [\");\n this.line(\"// ['query_user', 'query_post'], // All query types\");\n this.line(\"// ['create', 'update', 'delete'], // CRUD operations\");\n this.line(\"// ],\");\n this.line(\"//\");\n this.line(\"// 3. Per-message bounds (different maxInFlight per type):\");\n this.line(\"// perMessageBounds: {\");\n this.line(\"// 'authenticate': 1, // Sequential only\");\n this.line(\"// 'query': 5, // Allow concurrency\");\n this.line(\"// 'command': 2,\");\n this.line(\"// },\");\n\n this.indent--;\n this.line(\"},\");\n this.line(\"\");\n }\n\n private addBehaviorConfig(): void {\n this.line(\"// Verification behavior\");\n this.line(\"// ─────────────────────\");\n this.line(\"//\");\n this.line(\"// onBuild: What to do during development builds\");\n this.line(\"// • 'warn' - Show warnings but don't fail (recommended)\");\n this.line(\"// • 'error' - Fail the build on violations\");\n this.line(\"// • 'off' - Skip verification\");\n this.line(\"//\");\n this.line(\"onBuild: 'warn',\");\n this.line(\"\");\n this.line(\"// onRelease: What to do during production builds\");\n this.line(\"// • 'error' - Fail the build on violations (recommended)\");\n this.line(\"// • 'warn' - Show warnings but don't fail\");\n this.line(\"// • 'off' - Skip verification\");\n this.line(\"//\");\n this.line(\"onRelease: 'error',\");\n this.line(\"\");\n this.line(\"// ─────────────────────────────────────────────────────────\");\n this.line(\"// Tier 2 Optimizations (controlled approximations) - ADVANCED\");\n this.line(\"// ─────────────────────────────────────────────────────────\");\n this.line(\"// Use with caution - these reduce precision for performance.\");\n this.line(\"// Only use if verification is too slow even with Tier 1 optimizations.\");\n this.line(\"//\");\n this.line(\"// tier2: {\");\n this.line(\"// // Temporal constraints: specify known ordering requirements\");\n this.line(\"// temporalConstraints: [\");\n this.line(\"// {\");\n this.line(\"// before: 'LOGIN',\");\n this.line(\"// after: 'LOGOUT',\");\n this.line(\"// description: 'User must login before logout'\");\n this.line(\"// },\");\n this.line(\"// ],\");\n this.line(\"//\");\n this.line(\"// // Bounded exploration: limit state depth\");\n this.line(\"// boundedExploration: {\");\n this.line(\"// maxDepth: 20, // Stop exploring after 20 actions\");\n this.line(\"// // criticalPaths: [ // Ensure these sequences are fully explored\");\n this.line(\"// // ['LOGIN', 'QUERY', 'LOGOUT'],\");\n this.line(\"// // ],\");\n this.line(\"// },\");\n this.line(\"// },\");\n }\n\n private formatTypeName(type: TypeInfo): string {\n let typeName: string;\n\n switch (type.kind) {\n case \"boolean\":\n typeName = \"boolean\";\n break;\n case \"string\":\n typeName = \"string\";\n break;\n case \"number\":\n typeName = \"number\";\n break;\n case \"enum\":\n if (type.enumValues) {\n typeName = type.enumValues.map((v) => `\"${v}\"`).join(\" | \");\n } else {\n typeName = \"enum\";\n }\n break;\n case \"array\":\n if (type.elementType) {\n typeName = `${this.formatTypeName(type.elementType)}[]`;\n } else {\n typeName = \"array\";\n }\n break;\n case \"object\":\n typeName = \"object\";\n break;\n case \"map\":\n typeName = \"Map\";\n break;\n case \"set\":\n typeName = \"Set\";\n break;\n case \"null\":\n typeName = \"null\";\n break;\n default:\n typeName = \"unknown\";\n }\n\n // Append \" | null\" if type is nullable\n if (type.nullable && type.kind !== \"null\") {\n typeName += \" | null\";\n }\n\n return typeName;\n }\n\n private line(content: string): void {\n if (content === \"\") {\n this.lines.push(\"\");\n } else {\n const indentation = \" \".repeat(this.indent);\n this.lines.push(indentation + content);\n }\n }\n}\n\nexport function generateConfig(\n analysis: CodebaseAnalysis,\n projectType: ProjectType = \"chrome-extension\"\n): string {\n const generator = new ConfigGenerator();\n return generator.generate(analysis, projectType);\n}\n",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"// Handler extraction from TypeScript code\n// Extracts message handlers and their state mutations\n//\n// ═══════════════════════════════════════════════════════════════════════════════\n// STATE ASSIGNMENT EXTRACTION - SUPPORTED PATTERNS\n// ═══════════════════════════════════════════════════════════════════════════════\n//\n// The following patterns are extracted and converted to TLA+ state transitions:\n//\n// OBJECTS:\n// ✓ state.field = value → direct assignment\n// ✓ signal.value.field = value → signal nested field\n// ✓ signal.value = { field: value } → object literal\n// ✓ signal.value = { ...signal.value, f } → spread update (extracts changed fields)\n//\n// ARRAYS:\n// ✓ [...arr, item] → Append(@, payload)\n// ✓ [item, ...arr] → <<payload>> \\o @\n// ✓ arr.filter(...) → SelectSeq(@, LAMBDA t: TRUE)\n// ✓ arr.map(...) → [i \\in DOMAIN @ |-> @[i]]\n// ✓ arr.slice(...) → SubSeq(@, 1, Len(@))\n// ✓ arr.concat(...) → @ \\o <<payload>>\n// ✓ arr.reverse() → [i \\in DOMAIN @ |-> @[Len(@) - i + 1]]\n//\n// SETS:\n// ✓ new Set([...set, item]) → @ \\union {payload}\n// ✓ new Set([...set].filter(...)) → @ \\ {payload}\n// ✓ new Set() → {}\n//\n// MAPS:\n// ✓ new Map([...map, [k, v]]) → [@ EXCEPT ![payload.key] = payload.value]\n// ✓ new Map([...map].filter(...)) → [k \\in DOMAIN @ \\ {payload.key} |-> @[k]]\n// ✓ new Map() → <<>>\n//\n// ═══════════════════════════════════════════════════════════════════════════════\n// UNSUPPORTED PATTERNS (will emit warnings)\n// ═══════════════════════════════════════════════════════════════════════════════\n//\n// MUTATING METHODS (modify in place, don't return new value):\n// ✗ arr.push(), arr.pop(), arr.shift(), arr.unshift(), arr.splice()\n// ✗ arr.sort() with in-place mutation\n// ✗ set.add(), set.delete(), set.clear()\n// ✗ map.set(), map.delete(), map.clear()\n//\n// QUERY METHODS (return non-collection values):\n// ✗ arr.find(), arr.findIndex(), arr.reduce()\n// ✗ arr.some(), arr.every(), arr.includes(), arr.indexOf()\n// ✗ set.has(), map.has(), map.get()\n//\n// COMPLEX EXPRESSIONS:\n// ✗ Ternary expressions in assignments\n// ✗ Function calls as values (except supported collection methods)\n// ✗ Computed property names\n// ✗ Dynamic field names\n// ✗ Nested object updates beyond first level\n// ✗ Object.assign(), Object.keys(), Object.values(), Object.entries()\n//\n// To request support for additional patterns, please open an issue at:\n// https://github.com/anthropics/polly/issues\n// ═══════════════════════════════════════════════════════════════════════════════\n\nimport {\n type ArrowFunction,\n type CallExpression,\n type FunctionDeclaration,\n type FunctionExpression,\n type Identifier,\n type IfStatement,\n Node,\n type ObjectLiteralExpression,\n Project,\n type PropertyAccessExpression,\n type SourceFile,\n type Statement,\n type SwitchStatement,\n SyntaxKind,\n type VariableDeclaration,\n} from \"ts-morph\";\nimport type {\n ComponentRelationship,\n MessageHandler,\n StateAssignment,\n StateConstraint,\n VerificationCondition,\n VerifiedStateInfo,\n} from \"../types\";\nimport { RelationshipExtractor } from \"./relationships\";\n\nexport interface ExtractionWarning {\n type: \"unsupported_pattern\";\n pattern: string;\n location: string;\n suggestion: string;\n}\n\nexport interface HandlerAnalysis {\n handlers: MessageHandler[];\n messageTypes: Set<string>;\n stateConstraints: StateConstraint[];\n verifiedStates: VerifiedStateInfo[];\n warnings: ExtractionWarning[];\n}\n\nexport class HandlerExtractor {\n private project: Project;\n private typeGuardCache: WeakMap<SourceFile, Map<string, string>>;\n private relationshipExtractor: RelationshipExtractor;\n private analyzedFiles: Set<string>; // Track files we've already analyzed\n private packageRoot: string; // Package directory (contains package.json)\n private warnings: ExtractionWarning[]; // Warnings for unsupported patterns\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n });\n this.typeGuardCache = new WeakMap();\n this.relationshipExtractor = new RelationshipExtractor();\n this.analyzedFiles = new Set<string>();\n this.warnings = [];\n // Find package root by looking for package.json from tsconfig location\n this.packageRoot = this.findPackageRoot(tsConfigPath);\n }\n\n /**\n * Emit a warning for an unsupported pattern\n */\n private warnUnsupportedPattern(pattern: string, location: string, suggestion: string): void {\n // Deduplicate warnings by pattern + location\n const exists = this.warnings.some((w) => w.pattern === pattern && w.location === location);\n if (!exists) {\n this.warnings.push({\n type: \"unsupported_pattern\",\n pattern,\n location,\n suggestion,\n });\n }\n }\n\n /**\n * Get a location string for a node\n */\n private getNodeLocation(node: Node): string {\n const sourceFile = node.getSourceFile();\n const lineAndCol = sourceFile.getLineAndColumnAtPos(node.getStart());\n const filePath = sourceFile.getFilePath();\n const relativePath = filePath.startsWith(this.packageRoot)\n ? filePath.substring(this.packageRoot.length + 1)\n : filePath;\n return `${relativePath}:${lineAndCol.line}`;\n }\n\n /**\n * Find the nearest package.json directory from tsconfig location\n * This defines the package boundary - we only analyze files within this package\n */\n private findPackageRoot(tsConfigPath: string): string {\n let dir = tsConfigPath.substring(0, tsConfigPath.lastIndexOf(\"/\"));\n // Walk up until we find package.json\n while (dir.length > 1) {\n try {\n const packageJsonPath = `${dir}/package.json`;\n const file = Bun.file(packageJsonPath);\n if (file.size > 0) {\n // Found package.json\n return dir;\n }\n } catch {\n // Keep looking\n }\n const parentDir = dir.substring(0, dir.lastIndexOf(\"/\"));\n if (parentDir === dir) break; // Reached root\n dir = parentDir;\n }\n // Fallback: use tsconfig directory\n return tsConfigPath.substring(0, tsConfigPath.lastIndexOf(\"/\"));\n }\n\n /**\n * Extract all message handlers from the codebase\n *\n * Uses transitive import following to discover all reachable code:\n * 1. Start with source files from tsconfig that are within the package\n * 2. Follow imports recursively (within package boundary)\n * 3. Cache analyzed files to avoid re-processing\n */\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Handler extraction requires analyzing multiple patterns and file boundaries\n extractHandlers(): HandlerAnalysis {\n const handlers: MessageHandler[] = [];\n const messageTypes = new Set<string>();\n const invalidMessageTypes = new Set<string>();\n const stateConstraints: StateConstraint[] = [];\n const verifiedStates: VerifiedStateInfo[] = [];\n this.warnings = []; // Clear warnings from previous runs\n\n // Find all source files from tsconfig as potential entry points\n const allSourceFiles = this.project.getSourceFiles();\n // Filter to only files within the package boundary\n const entryPoints = allSourceFiles.filter((f) => this.isWithinPackage(f.getFilePath()));\n\n this.debugLogSourceFiles(allSourceFiles, entryPoints);\n\n // Analyze each entry point and follow its imports transitively\n for (const entryPoint of entryPoints) {\n this.analyzeFileAndImports(\n entryPoint,\n handlers,\n messageTypes,\n invalidMessageTypes,\n stateConstraints,\n verifiedStates\n );\n }\n\n // Issue #27: Second pass - find functions that modify verified states\n if (verifiedStates.length > 0) {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[DEBUG] Found ${verifiedStates.length} verified state(s), scanning for mutating functions...`\n );\n }\n\n for (const filePath of this.analyzedFiles) {\n const sourceFile = this.project.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n const mutatingHandlers = this.findStateMutatingFunctions(sourceFile, verifiedStates);\n\n for (const handler of mutatingHandlers) {\n // Avoid duplicates - check if handler already exists for this message type\n const exists = handlers.some(\n (h) =>\n h.messageType === handler.messageType && h.location.file === handler.location.file\n );\n\n if (!exists) {\n handlers.push(handler);\n if (this.isValidTLAIdentifier(handler.messageType)) {\n messageTypes.add(handler.messageType);\n } else {\n invalidMessageTypes.add(handler.messageType);\n }\n }\n }\n }\n }\n\n this.debugLogExtractionResults(handlers.length, invalidMessageTypes.size);\n this.debugLogAnalysisStats(allSourceFiles.length, entryPoints.length);\n\n return {\n handlers,\n messageTypes,\n stateConstraints,\n verifiedStates,\n warnings: this.warnings,\n };\n }\n\n /**\n * Analyze a file and recursively follow its imports\n *\n * This implements the Knip pattern: follow imports transitively\n * to discover all reachable code, including files outside src/\n * that are imported from analyzed files.\n */\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Import following requires conditional logic for package boundaries, caching, and recursion\n private analyzeFileAndImports(\n sourceFile: SourceFile,\n handlers: MessageHandler[],\n messageTypes: Set<string>,\n invalidMessageTypes: Set<string>,\n stateConstraints: StateConstraint[],\n verifiedStates: VerifiedStateInfo[]\n ): void {\n const filePath = sourceFile.getFilePath();\n\n // Skip if already analyzed\n if (this.analyzedFiles.has(filePath)) {\n return;\n }\n\n // Mark as analyzed\n this.analyzedFiles.add(filePath);\n\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Analyzing: ${filePath}`);\n }\n\n // Extract handlers from this file\n const fileHandlers = this.extractFromFile(sourceFile);\n handlers.push(...fileHandlers);\n this.categorizeHandlerMessageTypes(fileHandlers, messageTypes, invalidMessageTypes);\n\n // Extract state constraints from this file\n const fileConstraints = this.extractStateConstraintsFromFile(sourceFile);\n stateConstraints.push(...fileConstraints);\n\n // Issue #27: Extract verified states from this file\n const fileVerifiedStates = this.extractVerifiedStatesFromFile(sourceFile);\n verifiedStates.push(...fileVerifiedStates);\n\n // Follow imports to discover more files (within package boundary only)\n const importDeclarations = sourceFile.getImportDeclarations();\n for (const importDecl of importDeclarations) {\n const importedFile = importDecl.getModuleSpecifierSourceFile();\n\n if (importedFile) {\n const importedPath = importedFile.getFilePath();\n\n // Only follow imports within the same package\n // This excludes:\n // - node_modules (other packages)\n // - Framework code in monorepo parent (other packages)\n // But includes:\n // - All files in this package (src/, specs/, tests/, etc.)\n if (!this.isWithinPackage(importedPath)) {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Skipping external import: ${importedPath}`);\n }\n continue;\n }\n\n // Recursively analyze imported file\n this.analyzeFileAndImports(\n importedFile,\n handlers,\n messageTypes,\n invalidMessageTypes,\n stateConstraints,\n verifiedStates\n );\n } else if (process.env[\"POLLY_DEBUG\"]) {\n // Log unresolved imports for debugging\n const specifier = importDecl.getModuleSpecifierValue();\n if (!specifier.startsWith(\"node:\") && !this.isNodeModuleImport(specifier)) {\n console.log(`[DEBUG] Could not resolve import: ${specifier} in ${filePath}`);\n }\n }\n }\n }\n\n /**\n * Check if a file path is within the package boundary\n */\n private isWithinPackage(filePath: string): boolean {\n // Must be under package root\n if (!filePath.startsWith(this.packageRoot)) {\n return false;\n }\n // Must not be in node_modules\n if (filePath.includes(\"/node_modules/\")) {\n return false;\n }\n return true;\n }\n\n /**\n * Check if an import specifier is a node_modules import\n */\n private isNodeModuleImport(specifier: string): boolean {\n // Relative imports start with . or ..\n // Absolute/node_modules imports don't\n return !specifier.startsWith(\".\") && !specifier.startsWith(\"/\");\n }\n\n private debugLogAnalysisStats(totalSourceFiles: number, entryPointCount: number): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] Analysis Statistics:`);\n console.log(`[DEBUG] Package root: ${this.packageRoot}`);\n console.log(`[DEBUG] Source files from tsconfig: ${totalSourceFiles}`);\n console.log(`[DEBUG] Entry points (in package): ${entryPointCount}`);\n console.log(`[DEBUG] Files analyzed (including imports): ${this.analyzedFiles.size}`);\n console.log(\n `[DEBUG] Additional files discovered: ${this.analyzedFiles.size - entryPointCount}`\n );\n }\n\n private debugLogSourceFiles(allSourceFiles: SourceFile[], entryPoints: SourceFile[]): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] Loaded ${allSourceFiles.length} source files from tsconfig`);\n console.log(`[DEBUG] Filtered to ${entryPoints.length} entry points within package`);\n if (entryPoints.length <= 20) {\n for (const sf of entryPoints) {\n console.log(`[DEBUG] - ${sf.getFilePath()}`);\n }\n }\n }\n\n private categorizeHandlerMessageTypes(\n handlers: MessageHandler[],\n messageTypes: Set<string>,\n invalidMessageTypes: Set<string>\n ): void {\n for (const handler of handlers) {\n if (this.isValidTLAIdentifier(handler.messageType)) {\n messageTypes.add(handler.messageType);\n } else {\n invalidMessageTypes.add(handler.messageType);\n }\n }\n }\n\n private debugLogExtractionResults(handlerCount: number, invalidCount: number): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] Total handlers extracted: ${handlerCount}`);\n if (invalidCount > 0) {\n console.log(`[DEBUG] Filtered ${invalidCount} invalid message type(s) from handlers`);\n }\n }\n\n /**\n * Check if a string is a valid TLA+ identifier\n * TLA+ identifiers must:\n * - Start with a letter (a-zA-Z)\n * - Contain only letters, digits, and underscores\n * - Not be empty\n */\n private isValidTLAIdentifier(s: string): boolean {\n if (!s || s.length === 0) {\n return false;\n }\n // TLA+ identifiers: start with letter, contain only alphanumeric + underscore\n return /^[a-zA-Z][a-zA-Z0-9_]*$/.test(s);\n }\n\n /**\n * Extract handlers from a single source file\n */\n private extractFromFile(sourceFile: SourceFile): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n const filePath = sourceFile.getFilePath();\n const context = this.inferContext(filePath);\n\n sourceFile.forEachDescendant((node) => {\n this.processNodeForHandlers(node, context, filePath, handlers);\n });\n\n return handlers;\n }\n\n /**\n * Process a single node to find handler patterns\n */\n private processNodeForHandlers(\n node: Node,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n if (Node.isCallExpression(node)) {\n this.processCallExpressionHandler(node, context, filePath, handlers);\n }\n\n if (Node.isSwitchStatement(node)) {\n const switchHandlers = this.extractSwitchCaseHandlers(node, context, filePath);\n handlers.push(...switchHandlers);\n }\n\n if (Node.isVariableDeclaration(node)) {\n const mapHandlers = this.extractHandlerMapPattern(node, context, filePath);\n handlers.push(...mapHandlers);\n }\n\n if (Node.isIfStatement(node) && !this.isElseIfStatement(node)) {\n const typeGuardHandlers = this.extractTypeGuardHandlers(node, context, filePath);\n handlers.push(...typeGuardHandlers);\n }\n }\n\n /**\n * Process call expression to find .on() or .addEventListener() handlers\n */\n private processCallExpressionHandler(\n node: CallExpression,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n const expression = node.getExpression();\n\n if (Node.isPropertyAccessExpression(expression)) {\n const methodName = expression.getName();\n\n if (methodName === \"on\" || methodName === \"addEventListener\") {\n const handler = this.extractHandler(node, context, filePath);\n if (handler) {\n handlers.push(handler);\n }\n }\n }\n }\n\n /**\n * Check if a node is an else-if statement\n */\n private isElseIfStatement(node: Node): boolean {\n const parent = node.getParent();\n return parent !== undefined && Node.isIfStatement(parent);\n }\n\n /**\n * Extract handler details from a .on() call expression\n */\n private extractHandler(\n callExpr: CallExpression,\n context: string,\n filePath: string\n ): MessageHandler | null {\n const args = callExpr.getArguments();\n\n if (args.length < 2) {\n return null;\n }\n\n // First argument should be the message type (string literal)\n const messageTypeArg = args[0];\n let messageType: string | null = null;\n\n if (Node.isStringLiteral(messageTypeArg)) {\n messageType = messageTypeArg.getLiteralValue();\n } else if (Node.isTemplateExpression(messageTypeArg)) {\n // Handle template literals if needed\n messageType = messageTypeArg.getText().replace(/[`'\"]/g, \"\");\n }\n\n if (!messageType) {\n return null;\n }\n\n // Second argument is the handler function\n const handlerArg = args[1];\n const assignments: StateAssignment[] = [];\n const preconditions: VerificationCondition[] = [];\n const postconditions: VerificationCondition[] = [];\n\n // Parse the handler function for state assignments and verification conditions\n let actualHandler: ArrowFunction | FunctionExpression | FunctionDeclaration | null = null;\n\n if (Node.isArrowFunction(handlerArg) || Node.isFunctionExpression(handlerArg)) {\n actualHandler = handlerArg;\n } else if (Node.isIdentifier(handlerArg)) {\n // Resolve function reference (e.g., bus.on('query', handleQuery))\n actualHandler = this.resolveFunctionReference(handlerArg);\n }\n\n if (actualHandler) {\n this.extractAssignments(actualHandler, assignments);\n this.extractVerificationConditions(actualHandler, preconditions, postconditions);\n\n // Check for async mutations (potential race conditions)\n if (Node.isArrowFunction(actualHandler) || Node.isFunctionExpression(actualHandler)) {\n this.checkAsyncMutations(actualHandler, messageType);\n }\n }\n\n const line = callExpr.getStartLineNumber();\n\n // Extract relationships from handler code\n const sourceFile = callExpr.getSourceFile();\n const handlerName = `${messageType}_handler`;\n let relationships: ComponentRelationship[] | undefined;\n\n if (actualHandler) {\n const detectedRelationships = this.relationshipExtractor.extractFromHandler(\n actualHandler,\n sourceFile,\n handlerName\n );\n if (detectedRelationships.length > 0) {\n relationships = detectedRelationships;\n }\n }\n\n return {\n messageType,\n node: context, // Renamed from 'context' to 'node' for generalization\n assignments,\n preconditions,\n postconditions,\n location: {\n file: filePath,\n line,\n },\n relationships,\n origin: \"event\" as const,\n };\n }\n\n /**\n * Extract state assignments from a handler function\n * Handles:\n * - Simple assignments: state.field = value\n * - Compound operators: state.count += 1\n * - Unary operators: state.count++, state.count--, ++state.count, --state.count\n * - Array mutations: state.items.push(item)\n * - Array indexing: state.items[0] = value\n */\n private extractAssignments(\n funcNode: ArrowFunction | FunctionExpression | FunctionDeclaration,\n assignments: StateAssignment[]\n ): void {\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isBinaryExpression(node)) {\n this.extractBinaryExpressionAssignment(node, assignments);\n }\n\n if (Node.isCallExpression(node)) {\n this.extractArrayMutationAssignment(node, assignments);\n }\n\n if (Node.isPostfixUnaryExpression(node) || Node.isPrefixUnaryExpression(node)) {\n this.extractUnaryExpressionAssignment(node, assignments);\n }\n });\n }\n\n /**\n * Extract assignments from binary expressions (=, +=, -=, etc.)\n */\n private extractBinaryExpressionAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n\n if (operator === \"=\") {\n this.extractSimpleOrElementAccessAssignment(node, assignments);\n } else if ([\"+=\", \"-=\", \"*=\", \"/=\", \"%=\"].includes(operator)) {\n this.extractCompoundAssignment(node, assignments);\n }\n }\n\n /**\n * Extract simple or element access assignments (state.field = value or state.items[0] = value)\n */\n private extractSimpleOrElementAccessAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const left = node.getLeft();\n const right = node.getRight();\n\n if (Node.isPropertyAccessExpression(left)) {\n this.extractPropertyAccessAssignment(left, right, assignments);\n } else if (Node.isElementAccessExpression(left)) {\n this.extractElementAccessAssignment(left, right, assignments);\n }\n }\n\n /**\n * Extract property access assignment (state.field = value or someState.value.field = value)\n */\n private extractPropertyAccessAssignment(\n left: Node,\n right: Node,\n assignments: StateAssignment[]\n ): void {\n if (!Node.isPropertyAccessExpression(left)) return;\n\n const fieldPath = this.getPropertyPath(left);\n\n // Try each pattern in order\n if (this.tryExtractStateFieldPattern(fieldPath, right, assignments)) return;\n if (this.tryExtractSignalNestedFieldPattern(fieldPath, right, assignments)) return;\n if (this.tryExtractSignalObjectPattern(fieldPath, right, assignments)) return;\n if (this.tryExtractSignalArrayPattern(fieldPath, right, assignments)) return;\n if (this.tryExtractSignalMethodPattern(fieldPath, right, assignments)) return;\n if (this.tryExtractSetConstructorPattern(fieldPath, right, assignments)) return;\n this.tryExtractMapConstructorPattern(fieldPath, right, assignments);\n }\n\n /** Pattern 1: state.field = value */\n private tryExtractStateFieldPattern(\n fieldPath: string,\n right: Node,\n assignments: StateAssignment[]\n ): boolean {\n if (!fieldPath.startsWith(\"state.\")) return false;\n const field = fieldPath.substring(6);\n const value = this.extractValue(right);\n if (value !== undefined) {\n assignments.push({ field, value });\n }\n return true;\n }\n\n /** Pattern 2: someState.value.field = value (signal pattern with nested field) */\n private tryExtractSignalNestedFieldPattern(\n fieldPath: string,\n right: Node,\n assignments: StateAssignment[]\n ): boolean {\n const valueFieldMatch = fieldPath.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\.value\\.(.+)$/);\n if (!valueFieldMatch?.[1] || !valueFieldMatch?.[2]) return false;\n const signalName = valueFieldMatch[1];\n const fieldName = valueFieldMatch[2];\n const value = this.extractValue(right);\n if (value !== undefined) {\n assignments.push({ field: `${signalName}_${fieldName}`, value });\n }\n return true;\n }\n\n /** Pattern 3: someState.value = { object literal } (signal replacement or spread update) */\n private tryExtractSignalObjectPattern(\n fieldPath: string,\n right: Node,\n assignments: StateAssignment[]\n ): boolean {\n if (!fieldPath.endsWith(\".value\") || !Node.isObjectLiteralExpression(right)) return false;\n const signalName = fieldPath.slice(0, -6);\n if (this.isSpreadUpdatePattern(right, fieldPath)) {\n this.extractSpreadUpdateAssignments(right, assignments, signalName);\n } else {\n this.extractObjectLiteralAssignments(right, assignments, signalName);\n }\n return true;\n }\n\n /** Check if object literal is a spread update pattern: { ...existing, field: value } */\n private isSpreadUpdatePattern(\n objectLiteral: import(\"ts-morph\").ObjectLiteralExpression,\n fieldPath: string\n ): boolean {\n const properties = objectLiteral.getProperties();\n if (properties.length === 0) return false;\n const firstProp = properties[0];\n if (!firstProp || !Node.isSpreadAssignment(firstProp)) return false;\n const spreadExpr = firstProp.getExpression();\n if (!spreadExpr) return false;\n return this.getPropertyPath(spreadExpr) === fieldPath;\n }\n\n /** Pattern 4: someState.value = [...someState.value, item] (array spread) */\n private tryExtractSignalArrayPattern(\n fieldPath: string,\n right: Node,\n assignments: StateAssignment[]\n ): boolean {\n if (!fieldPath.endsWith(\".value\") || !Node.isArrayLiteralExpression(right)) return false;\n const signalName = fieldPath.slice(0, -6);\n const arrayAssignment = this.extractArraySpreadOperation(right, fieldPath, signalName);\n if (arrayAssignment) {\n assignments.push(arrayAssignment);\n }\n return true;\n }\n\n /** Pattern 5: someState.value = someState.value.filter(...) or .map(...) (array methods) */\n private tryExtractSignalMethodPattern(\n fieldPath: string,\n right: Node,\n assignments: StateAssignment[]\n ): boolean {\n if (!fieldPath.endsWith(\".value\") || !Node.isCallExpression(right)) return false;\n const signalName = fieldPath.slice(0, -6);\n\n // Check for and warn about Set/Map direct method calls that mutate\n this.checkForMutatingCollectionMethods(right);\n\n const methodAssignment = this.extractArrayMethodOperation(right, fieldPath, signalName);\n if (methodAssignment) {\n assignments.push(methodAssignment);\n }\n return true;\n }\n\n /** Check for mutating Set/Map methods and emit warnings */\n private checkForMutatingCollectionMethods(callExpr: import(\"ts-morph\").CallExpression): void {\n const expression = callExpr.getExpression();\n if (!Node.isPropertyAccessExpression(expression)) return;\n\n const methodName = expression.getName();\n const sourceExpr = expression.getExpression();\n\n // Check for Set mutating methods\n const setMethods = [\"add\", \"delete\", \"clear\"];\n if (setMethods.includes(methodName)) {\n // Try to determine if this is a Set operation by checking the source expression\n const sourceText = sourceExpr.getText();\n if (sourceText.includes(\"Set\") || this.looksLikeSetOrMap(sourceExpr, \"Set\")) {\n this.warnUnsupportedPattern(\n `set.${methodName}()`,\n this.getNodeLocation(callExpr),\n `Set.${methodName}() mutates in place. Use: new Set([...set, item]) for add, new Set([...set].filter(...)) for delete.`\n );\n }\n }\n\n // Check for Map mutating methods\n const mapMethods = [\"set\", \"delete\", \"clear\"];\n if (mapMethods.includes(methodName)) {\n const sourceText = sourceExpr.getText();\n if (sourceText.includes(\"Map\") || this.looksLikeSetOrMap(sourceExpr, \"Map\")) {\n this.warnUnsupportedPattern(\n `map.${methodName}()`,\n this.getNodeLocation(callExpr),\n `Map.${methodName}() mutates in place. Use: new Map([...map, [key, value]]) for set, new Map([...map].filter(...)) for delete.`\n );\n }\n }\n }\n\n /** Heuristic check if an expression might be a Set or Map */\n private looksLikeSetOrMap(expr: Node, collectionType: \"Set\" | \"Map\"): boolean {\n const text = expr.getText().toLowerCase();\n return text.includes(collectionType.toLowerCase());\n }\n\n /** Pattern 6: someState.value = new Set([...someState.value, item]) (Set operations) */\n private tryExtractSetConstructorPattern(\n fieldPath: string,\n right: Node,\n assignments: StateAssignment[]\n ): boolean {\n if (!fieldPath.endsWith(\".value\") || !Node.isNewExpression(right)) return false;\n const constructorExpr = right.getExpression();\n if (!Node.isIdentifier(constructorExpr) || constructorExpr.getText() !== \"Set\") return false;\n\n const signalName = fieldPath.slice(0, -6);\n const setAssignment = this.extractSetOperation(right, fieldPath, signalName);\n if (setAssignment) {\n assignments.push(setAssignment);\n }\n return true;\n }\n\n /** Pattern 7: someState.value = new Map([...someState.value, [key, val]]) (Map operations) */\n private tryExtractMapConstructorPattern(\n fieldPath: string,\n right: Node,\n assignments: StateAssignment[]\n ): boolean {\n if (!fieldPath.endsWith(\".value\") || !Node.isNewExpression(right)) return false;\n const constructorExpr = right.getExpression();\n if (!Node.isIdentifier(constructorExpr) || constructorExpr.getText() !== \"Map\") return false;\n\n const signalName = fieldPath.slice(0, -6);\n const mapAssignment = this.extractMapOperation(right, fieldPath, signalName);\n if (mapAssignment) {\n assignments.push(mapAssignment);\n }\n return true;\n }\n\n /** Extract Set operations from new Set(...) constructor */\n private extractSetOperation(\n newExpr: import(\"ts-morph\").NewExpression,\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const args = newExpr.getArguments();\n\n // new Set() - clear operation\n if (args.length === 0) {\n return { field: signalName, value: \"{}\" };\n }\n\n const firstArg = args[0];\n if (!firstArg) return null;\n\n // new Set([...set.value, item]) - add operation\n if (Node.isArrayLiteralExpression(firstArg)) {\n return this.extractSetArrayOperation(firstArg, fieldPath, signalName);\n }\n\n // new Set([...set.value].filter(...)) - delete operation via method chain\n if (Node.isCallExpression(firstArg)) {\n return this.extractSetMethodChainOperation(firstArg, fieldPath, signalName);\n }\n\n return null;\n }\n\n /** Extract Set operation from array literal: new Set([...set.value, item]) */\n private extractSetArrayOperation(\n arrayLiteral: import(\"ts-morph\").ArrayLiteralExpression,\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const elements = arrayLiteral.getElements();\n if (elements.length < 1) return null;\n\n const firstElement = elements[0];\n const lastElement = elements[elements.length - 1];\n\n // Check for add: new Set([...set.value, item])\n if (firstElement && Node.isSpreadElement(firstElement)) {\n const spreadExpr = firstElement.getExpression();\n if (spreadExpr && this.getPropertyPath(spreadExpr) === fieldPath) {\n // Add operation: @ \\union {payload}\n return { field: signalName, value: \"@ \\\\union {payload}\" };\n }\n }\n\n // Check for add at beginning: new Set([item, ...set.value])\n if (lastElement && Node.isSpreadElement(lastElement)) {\n const spreadExpr = lastElement.getExpression();\n if (spreadExpr && this.getPropertyPath(spreadExpr) === fieldPath) {\n return { field: signalName, value: \"{payload} \\\\union @\" };\n }\n }\n\n return null;\n }\n\n /** Extract Set operation from method chain: new Set([...set.value].filter(...)) */\n private extractSetMethodChainOperation(\n callExpr: import(\"ts-morph\").CallExpression,\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const expression = callExpr.getExpression();\n if (!Node.isPropertyAccessExpression(expression)) return null;\n\n const methodName = expression.getName();\n const sourceExpr = expression.getExpression();\n\n // Check for [...set.value].filter(...) pattern\n if (methodName === \"filter\" && Node.isArrayLiteralExpression(sourceExpr)) {\n const elements = sourceExpr.getElements();\n if (elements.length === 1) {\n const spreadEl = elements[0];\n if (spreadEl && Node.isSpreadElement(spreadEl)) {\n const spreadExpr = spreadEl.getExpression();\n if (spreadExpr && this.getPropertyPath(spreadExpr) === fieldPath) {\n // Delete operation: @ \\ {payload}\n return { field: signalName, value: \"@ \\\\ {payload}\" };\n }\n }\n }\n }\n\n return null;\n }\n\n /** Extract Map operations from new Map(...) constructor */\n private extractMapOperation(\n newExpr: import(\"ts-morph\").NewExpression,\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const args = newExpr.getArguments();\n\n // new Map() - clear operation\n if (args.length === 0) {\n return { field: signalName, value: \"<<>>\" }; // Empty function in TLA+\n }\n\n const firstArg = args[0];\n if (!firstArg) return null;\n\n // new Map([...map.value, [key, value]]) - set operation\n if (Node.isArrayLiteralExpression(firstArg)) {\n return this.extractMapArrayOperation(firstArg, fieldPath, signalName);\n }\n\n // new Map([...map.value].filter(...)) - delete operation via method chain\n if (Node.isCallExpression(firstArg)) {\n return this.extractMapMethodChainOperation(firstArg, fieldPath, signalName);\n }\n\n return null;\n }\n\n /** Extract Map operation from array literal: new Map([...map.value, [key, val]]) */\n private extractMapArrayOperation(\n arrayLiteral: import(\"ts-morph\").ArrayLiteralExpression,\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const elements = arrayLiteral.getElements();\n if (elements.length < 1) return null;\n\n const firstElement = elements[0];\n\n // Check for set: new Map([...map.value, [key, value]])\n if (firstElement && Node.isSpreadElement(firstElement)) {\n const spreadExpr = firstElement.getExpression();\n if (spreadExpr && this.getPropertyPath(spreadExpr) === fieldPath) {\n // Set operation: [@ EXCEPT ![payload.key] = payload.value]\n return { field: signalName, value: \"[@ EXCEPT ![payload.key] = payload.value]\" };\n }\n }\n\n return null;\n }\n\n /** Extract Map operation from method chain: new Map([...map.value].filter(...)) */\n private extractMapMethodChainOperation(\n callExpr: import(\"ts-morph\").CallExpression,\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const expression = callExpr.getExpression();\n if (!Node.isPropertyAccessExpression(expression)) return null;\n\n const methodName = expression.getName();\n const sourceExpr = expression.getExpression();\n\n // Check for [...map.value].filter(...) pattern\n if (methodName === \"filter\" && Node.isArrayLiteralExpression(sourceExpr)) {\n const elements = sourceExpr.getElements();\n if (elements.length === 1) {\n const spreadEl = elements[0];\n if (spreadEl && Node.isSpreadElement(spreadEl)) {\n const spreadExpr = spreadEl.getExpression();\n if (spreadExpr && this.getPropertyPath(spreadExpr) === fieldPath) {\n // Delete operation: restrict domain\n return { field: signalName, value: \"[k \\\\in DOMAIN @ \\\\ {payload.key} |-> @[k]]\" };\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Extract array method operations: arr.filter(...), arr.map(...)\n */\n private extractArrayMethodOperation(\n callExpr: import(\"ts-morph\").CallExpression,\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const expression = callExpr.getExpression();\n if (!Node.isPropertyAccessExpression(expression)) return null;\n\n const methodName = expression.getName();\n const sourceExpr = expression.getExpression();\n const sourcePath = this.getPropertyPath(sourceExpr);\n\n // Check if source matches target (e.g., todos.value = todos.value.filter(...))\n if (sourcePath !== fieldPath) return null;\n\n switch (methodName) {\n case \"filter\":\n // Abstract filter - we can't parse the predicate, so model as non-deterministic removal\n return { field: signalName, value: \"SelectSeq(@, LAMBDA t: TRUE)\" };\n\n case \"map\":\n // Abstract map - model as identity transformation (elements may change)\n return { field: signalName, value: \"[i \\\\in DOMAIN @ |-> @[i]]\" };\n\n case \"slice\":\n // Slice returns a subsequence\n return { field: signalName, value: \"SubSeq(@, 1, Len(@))\" };\n\n case \"concat\":\n // Concat appends another sequence\n return { field: signalName, value: \"@ \\\\o <<payload>>\" };\n\n case \"reverse\":\n // Reverse the sequence\n return { field: signalName, value: \"[i \\\\in DOMAIN @ |-> @[Len(@) - i + 1]]\" };\n\n default:\n // Warn about unsupported array methods\n this.warnUnsupportedArrayMethod(methodName, callExpr);\n return null;\n }\n }\n\n /** Warn about unsupported array methods */\n private warnUnsupportedArrayMethod(methodName: string, node: Node): void {\n const mutatingMethods = [\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"fill\",\n \"copyWithin\",\n ];\n const queryMethods = [\n \"find\",\n \"findIndex\",\n \"reduce\",\n \"reduceRight\",\n \"some\",\n \"every\",\n \"includes\",\n \"indexOf\",\n \"lastIndexOf\",\n ];\n const otherMethods = [\"flat\", \"flatMap\", \"join\", \"toString\", \"toLocaleString\"];\n\n if (mutatingMethods.includes(methodName)) {\n this.warnUnsupportedPattern(\n `array.${methodName}()`,\n this.getNodeLocation(node),\n `'${methodName}' mutates in place. Use spread syntax: [...arr, item] for append, arr.filter() for removal.`\n );\n } else if (queryMethods.includes(methodName)) {\n this.warnUnsupportedPattern(\n `array.${methodName}()`,\n this.getNodeLocation(node),\n `'${methodName}' returns a single value, not a new array. State assignment won't be extracted.`\n );\n } else if (otherMethods.includes(methodName)) {\n this.warnUnsupportedPattern(\n `array.${methodName}()`,\n this.getNodeLocation(node),\n `'${methodName}' is not supported for state extraction. Consider using map/filter instead.`\n );\n }\n }\n\n /**\n * Extract assignments from spread update pattern: { ...existing, field: value }\n * Only extracts the explicitly set properties, not the spread\n */\n private extractSpreadUpdateAssignments(\n objectLiteral: import(\"ts-morph\").ObjectLiteralExpression,\n assignments: StateAssignment[],\n signalName: string\n ): void {\n for (const prop of objectLiteral.getProperties()) {\n // Skip spread assignments (they preserve existing values)\n if (Node.isSpreadAssignment(prop)) continue;\n\n // Extract regular property assignments\n this.extractPropertyAssignment(prop, assignments, signalName);\n }\n }\n\n /**\n * Extract array spread operations: [...arr, item] or [item, ...arr]\n */\n private extractArraySpreadOperation(\n arrayLiteral: import(\"ts-morph\").ArrayLiteralExpression,\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const elements = arrayLiteral.getElements();\n if (elements.length < 1) return null;\n\n // Try append pattern first, then prepend\n return (\n this.tryExtractAppendOperation(elements, fieldPath, signalName) ??\n this.tryExtractPrependOperation(elements, fieldPath, signalName)\n );\n }\n\n /** Extract append operation: [...arr, item] or [...arr, item1, item2] */\n private tryExtractAppendOperation(\n elements: Node[],\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n const firstElement = elements[0];\n if (!firstElement || !Node.isSpreadElement(firstElement)) return null;\n\n const spreadExpr = firstElement.getExpression();\n if (!spreadExpr || this.getPropertyPath(spreadExpr) !== fieldPath) return null;\n\n if (elements.length === 2) {\n return { field: signalName, value: \"Append(@, payload)\" };\n }\n const placeholders = Array(elements.length - 1)\n .fill(\"payload\")\n .join(\", \");\n return { field: signalName, value: `@ \\\\o <<${placeholders}>>` };\n }\n\n /** Extract prepend operation: [item, ...arr] or [item1, item2, ...arr] */\n private tryExtractPrependOperation(\n elements: Node[],\n fieldPath: string,\n signalName: string\n ): StateAssignment | null {\n if (elements.length < 2) return null;\n\n const lastElement = elements[elements.length - 1];\n if (!lastElement || !Node.isSpreadElement(lastElement)) return null;\n\n const spreadExpr = lastElement.getExpression();\n if (!spreadExpr || this.getPropertyPath(spreadExpr) !== fieldPath) return null;\n\n if (elements.length === 2) {\n return { field: signalName, value: \"<<payload>> \\\\o @\" };\n }\n const placeholders = Array(elements.length - 1)\n .fill(\"payload\")\n .join(\", \");\n return { field: signalName, value: `<<${placeholders}>> \\\\o @` };\n }\n\n /**\n * Extract assignments from object literal properties\n * Used for: someState.value = { field1: value1, field2: value2 }\n * @param signalName - Optional signal name prefix (e.g., \"user\" for user.value = {...})\n */\n private extractObjectLiteralAssignments(\n objectLiteral: Node,\n assignments: StateAssignment[],\n signalName?: string\n ): void {\n if (!Node.isObjectLiteralExpression(objectLiteral)) return;\n\n for (const prop of objectLiteral.getProperties()) {\n this.extractPropertyAssignment(prop, assignments, signalName);\n }\n }\n\n /**\n * Extract a single property assignment from an object literal property\n */\n private extractPropertyAssignment(\n prop: Node,\n assignments: StateAssignment[],\n signalName?: string\n ): void {\n // Handle regular property assignments: { field: value }\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n const initializer = prop.getInitializer();\n if (!name || !initializer) return;\n\n const value = this.extractValue(initializer);\n if (value === undefined) return;\n\n // Prefix field name with signal name if provided (e.g., user_loggedIn)\n const field = signalName ? `${signalName}_${name}` : name;\n assignments.push({ field, value });\n return;\n }\n\n // Handle shorthand properties: { field }\n if (Node.isShorthandPropertyAssignment(prop)) {\n const name = prop.getName();\n // For shorthand, we can't extract the value statically\n // but we know the field is being set\n const field = signalName ? `${signalName}_${name}` : name;\n assignments.push({ field, value: \"@\" }); // Use @ as placeholder\n }\n }\n\n /**\n * Extract element access assignment (state.items[index] = value)\n */\n private extractElementAccessAssignment(\n left: Node,\n right: Node,\n assignments: StateAssignment[]\n ): void {\n if (!Node.isElementAccessExpression(left)) return;\n\n const expr = left.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const fieldPath = this.getPropertyPath(expr);\n const field = this.extractFieldFromStatePath(fieldPath);\n\n if (!field) return;\n const indexExpr = left.getArgumentExpression();\n const index = indexExpr ? indexExpr.getText() : \"0\";\n const value = this.extractValue(right);\n\n if (value !== undefined) {\n const tlaIndex = this.isNumericLiteral(index)\n ? (Number.parseInt(index, 10) + 1).toString()\n : `${index} + 1`;\n assignments.push({\n field: `${field}[${tlaIndex}]`,\n value,\n });\n }\n }\n\n /**\n * Check if field path is a state mutation pattern and extract field name\n * Supports: state.field, someState.value.field\n * Returns: field name or null if not a state pattern\n */\n private extractFieldFromStatePath(fieldPath: string): string | null {\n // Pattern 1: state.field\n if (fieldPath.startsWith(\"state.\")) {\n return fieldPath.substring(6);\n }\n\n // Pattern 2: someState.value.field\n const valueMatch = fieldPath.match(/\\.value\\.(.+)$/);\n if (valueMatch?.[1]) {\n return valueMatch[1];\n }\n\n return null;\n }\n\n /**\n * Extract compound assignments (+=, -=, *=, /=, %=)\n */\n private extractCompoundAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n const left = node.getLeft();\n const right = node.getRight();\n\n if (Node.isPropertyAccessExpression(left)) {\n const fieldPath = this.getPropertyPath(left);\n const field = this.extractFieldFromStatePath(fieldPath);\n\n if (field) {\n const rightValue = right.getText();\n const tlaOp = operator.slice(0, -1); // Remove '=' suffix\n assignments.push({\n field,\n value: `@ ${tlaOp} ${rightValue}`,\n });\n }\n }\n }\n\n /**\n * Get operator text from unary expression token\n */\n private getUnaryOperatorText(operator: unknown): string | null {\n if (typeof operator === \"number\") {\n // It's a SyntaxKind enum value\n if (operator === SyntaxKind.PlusPlusToken) return \"++\";\n if (operator === SyntaxKind.MinusMinusToken) return \"--\";\n return null;\n }\n if (operator && typeof operator === \"object\" && \"getText\" in operator) {\n // It's a Node with getText method\n return (operator as { getText(): string }).getText();\n }\n return null;\n }\n\n /**\n * Extract unary expression assignments (++, --)\n */\n private extractUnaryExpressionAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isPostfixUnaryExpression(node) && !Node.isPrefixUnaryExpression(node)) return;\n\n const operator = node.getOperatorToken();\n const operatorText = this.getUnaryOperatorText(operator);\n\n // Only handle ++ and --\n if (operatorText !== \"++\" && operatorText !== \"--\") return;\n\n const operand = node.getOperand();\n if (!Node.isPropertyAccessExpression(operand)) return;\n\n const fieldPath = this.getPropertyPath(operand);\n const field = this.extractFieldFromStatePath(fieldPath);\n\n if (field) {\n // Translate ++ to @ + 1 and -- to @ - 1\n const value = operatorText === \"++\" ? \"@ + 1\" : \"@ - 1\";\n assignments.push({ field, value });\n }\n }\n\n /**\n * Extract array mutation assignments (push, pop, shift, unshift, splice)\n */\n private extractArrayMutationAssignment(node: Node, assignments: StateAssignment[]): void {\n if (!Node.isCallExpression(node)) return;\n\n const expr = node.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const methodName = expr.getName();\n const object = expr.getExpression();\n\n if (Node.isPropertyAccessExpression(object)) {\n const fieldPath = this.getPropertyPath(object);\n const field = this.extractFieldFromStatePath(fieldPath);\n\n if (field) {\n const args = node.getArguments().map((arg) => arg.getText());\n const tlaValue = this.translateArrayMethod(methodName, args, fieldPath);\n\n if (tlaValue) {\n assignments.push({ field, value: tlaValue });\n }\n }\n }\n }\n\n /**\n * Translate array mutation methods to TLA+ operators\n */\n private translateArrayMethod(\n methodName: string,\n args: string[],\n fieldPath: string\n ): string | null {\n switch (methodName) {\n case \"push\":\n return args.length === 1 ? `Append(@, ${args[0]})` : null;\n\n case \"pop\":\n return \"SubSeq(@, 1, Len(@)-1)\";\n\n case \"shift\":\n return \"Tail(@)\";\n\n case \"unshift\":\n return args.length === 1 ? `<<${args[0]}>> \\\\o @` : null;\n\n case \"splice\":\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Warning: splice() mutation on ${fieldPath} not fully translated`);\n }\n return null;\n\n default:\n return null;\n }\n }\n\n /**\n * Check for async mutations that could cause race conditions\n * Warns when async handlers have state mutations after await expressions\n */\n private checkAsyncMutations(\n funcNode: ArrowFunction | FunctionExpression,\n messageType: string\n ): void {\n // Check if function is async\n const isAsync =\n funcNode.hasModifier?.(SyntaxKind.AsyncKeyword) ||\n funcNode.getModifiers?.()?.some((m: Node) => m.getKind() === SyntaxKind.AsyncKeyword);\n\n if (!isAsync) {\n return; // Not async, no race conditions possible\n }\n\n // Find all await expressions\n const awaitExpressions: Node[] = [];\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isAwaitExpression(node)) {\n awaitExpressions.push(node);\n }\n });\n\n if (awaitExpressions.length === 0) {\n return; // No awaits, no interleaving possible\n }\n\n // Find all state mutations\n const mutations: Array<{ field: string; line: number; afterAwait: boolean }> = [];\n const body = funcNode.getBody();\n\n if (!body) {\n return;\n }\n\n const firstAwait = awaitExpressions[0];\n if (!firstAwait) return;\n\n // Get position of first await\n const firstAwaitPos = firstAwait.getStart();\n\n // Track mutations and whether they occur after await\n funcNode.forEachDescendant((node: Node) => {\n if (Node.isBinaryExpression(node)) {\n this.checkBinaryExpressionMutation(node, firstAwaitPos, mutations);\n }\n\n if (Node.isCallExpression(node)) {\n this.checkCallExpressionMutation(node, firstAwaitPos, mutations);\n }\n });\n\n // Filter to mutations after await\n const mutationsAfterAwait = mutations.filter((m) => m.afterAwait);\n\n if (mutationsAfterAwait.length > 0 && process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[DEBUG] Warning: Async handler for '${messageType}' has ${mutationsAfterAwait.length} state mutation(s) after await`\n );\n console.log(\n \"[DEBUG] This may cause race conditions if multiple messages are processed concurrently\"\n );\n console.log(\n `[DEBUG] Mutations: ${mutationsAfterAwait.map((m) => `${m.field} (line ${m.line})`).join(\", \")}`\n );\n }\n }\n\n /**\n * Extract verification conditions (requires/ensures) from a handler function\n */\n private extractVerificationConditions(\n funcNode: ArrowFunction | FunctionExpression | FunctionDeclaration,\n preconditions: VerificationCondition[],\n postconditions: VerificationCondition[]\n ): void {\n const body = funcNode.getBody();\n const statements = Node.isBlock(body) ? body.getStatements() : body ? [body] : [];\n\n for (const statement of statements) {\n this.processStatementForConditions(statement, preconditions, postconditions);\n }\n }\n\n /**\n * Process a statement to extract verification conditions\n */\n private processStatementForConditions(\n statement: Node | Statement,\n preconditions: VerificationCondition[],\n postconditions: VerificationCondition[]\n ): void {\n if (!Node.isExpressionStatement(statement)) return;\n\n const expr = statement.getExpression();\n if (!Node.isCallExpression(expr)) return;\n\n const callee = expr.getExpression();\n if (!Node.isIdentifier(callee)) return;\n\n const functionName = callee.getText();\n\n if (functionName === \"requires\") {\n const condition = this.extractCondition(expr);\n if (condition) {\n preconditions.push(condition);\n }\n } else if (functionName === \"ensures\") {\n const condition = this.extractCondition(expr);\n if (condition) {\n postconditions.push(condition);\n }\n }\n }\n\n /**\n * Extract condition from a requires() or ensures() call\n */\n private extractCondition(callExpr: CallExpression): VerificationCondition | null {\n const args = callExpr.getArguments();\n\n if (args.length === 0) {\n return null;\n }\n\n // First argument is the condition expression\n const conditionArg = args[0];\n if (!conditionArg) return null;\n\n const expression = conditionArg.getText();\n\n // Second argument (optional) is the message\n let message: string | undefined;\n if (args.length >= 2 && Node.isStringLiteral(args[1])) {\n message = args[1].getLiteralValue();\n }\n\n const line = callExpr.getStartLineNumber();\n const column = callExpr.getStartLinePos();\n\n return {\n expression,\n message,\n location: {\n line,\n column,\n },\n };\n }\n\n /**\n * Get the full property access path (e.g., \"state.user.loggedIn\")\n */\n private getPropertyPath(node: PropertyAccessExpression | Node): string {\n const parts: string[] = [];\n\n let current = node;\n while (Node.isPropertyAccessExpression(current)) {\n parts.unshift(current.getName());\n current = current.getExpression();\n }\n\n // Add the base identifier\n if (Node.isIdentifier(current)) {\n parts.unshift(current.getText());\n }\n\n return parts.join(\".\");\n }\n\n /**\n * Extract a literal value from an expression\n */\n private extractValue(node: Node): string | boolean | number | null | undefined {\n if (Node.isStringLiteral(node)) {\n return node.getLiteralValue();\n }\n\n if (Node.isNumericLiteral(node)) {\n return node.getLiteralValue();\n }\n\n if (node.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n\n if (node.getKind() === SyntaxKind.FalseKeyword) {\n return false;\n }\n\n if (node.getKind() === SyntaxKind.NullKeyword) {\n return null;\n }\n\n // For complex expressions, return undefined (can't extract)\n return undefined;\n }\n\n /**\n * Check if a string represents a numeric literal\n */\n private isNumericLiteral(str: string): boolean {\n return /^\\d+$/.test(str);\n }\n\n /**\n * Extract handlers from switch/case message router patterns\n * Detects: switch(message.type) { case 'EVENT': handler(); }\n */\n private extractSwitchCaseHandlers(\n switchNode: SwitchStatement,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n // Check if switching on message.type or similar\n const expression = switchNode.getExpression();\n const expressionText = expression.getText();\n\n // Look for patterns like: message.type, data.type, msg.type, event.type\n if (!/\\.(type|kind|event|action)/.test(expressionText)) {\n return handlers;\n }\n\n // Extract handlers from each case clause\n const caseClauses = switchNode.getClauses();\n for (const clause of caseClauses) {\n if (Node.isCaseClause(clause)) {\n const caseExpr = clause.getExpression();\n\n // Extract message type from case expression\n let messageType: string | null = null;\n if (Node.isStringLiteral(caseExpr)) {\n messageType = caseExpr.getLiteralValue();\n }\n\n if (messageType) {\n const line = clause.getStartLineNumber();\n\n handlers.push({\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n origin: \"event\" as const,\n });\n }\n }\n }\n } catch (_error) {\n // Skip malformed switch statements\n }\n\n return handlers;\n }\n\n /**\n * Extract handlers from handler map patterns\n * Detects: const handlers = { 'EVENT': handlerFn, ... }\n */\n private extractHandlerMapPattern(\n varDecl: VariableDeclaration,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n const initializer = varDecl.getInitializer();\n if (!initializer) {\n return handlers;\n }\n\n // Get the object literal - either direct or from defineHandlers() call\n const objectLiteral = this.getHandlerMapObject(initializer, varDecl);\n if (!objectLiteral) {\n return handlers;\n }\n\n // Extract handlers from object properties\n const properties = objectLiteral.getProperties();\n for (const prop of properties) {\n const handler = this.extractHandlerFromProperty(prop, context, filePath);\n if (handler) {\n handlers.push(handler);\n }\n }\n } catch (_error) {\n // Skip malformed object literals\n }\n\n return handlers;\n }\n\n /**\n * Extract the object literal from a handler map.\n * Only processes direct object literals with handler-like variable names.\n */\n private getHandlerMapObject(\n initializer: Node,\n varDecl: VariableDeclaration\n ): ObjectLiteralExpression | null {\n // Only process direct object literals\n if (Node.isObjectLiteralExpression(initializer)) {\n if (this.isHandlerMapName(varDecl.getName())) {\n return initializer;\n }\n }\n return null;\n }\n\n /**\n * Check if variable name suggests it's a handler map\n */\n private isHandlerMapName(varName: string): boolean {\n return /(handler|listener|callback|event)s?/.test(varName.toLowerCase());\n }\n\n /**\n * Extract handler from a property assignment in a handler map\n */\n private extractHandlerFromProperty(\n prop: Node,\n context: string,\n filePath: string\n ): MessageHandler | null {\n if (!Node.isPropertyAssignment(prop)) {\n return null;\n }\n\n const nameNode = prop.getNameNode();\n const messageType = this.getMessageTypeFromPropertyName(nameNode);\n\n if (!messageType) {\n return null;\n }\n\n const value = prop.getInitializer();\n const assignments: StateAssignment[] = [];\n const preconditions: VerificationCondition[] = [];\n const postconditions: VerificationCondition[] = [];\n\n // Extract from the handler function\n if (value) {\n // Case 1: Inline arrow function or function expression\n if (Node.isArrowFunction(value) || Node.isFunctionExpression(value)) {\n this.extractAssignments(value, assignments);\n this.extractVerificationConditions(value, preconditions, postconditions);\n }\n // Case 2: Function reference (e.g., handleQuery)\n else if (Node.isIdentifier(value)) {\n const referencedFunction = this.resolveFunctionReference(value);\n if (referencedFunction) {\n this.extractAssignments(referencedFunction, assignments);\n this.extractVerificationConditions(referencedFunction, preconditions, postconditions);\n }\n }\n }\n\n const line = prop.getStartLineNumber();\n return {\n messageType,\n node: context,\n assignments,\n preconditions,\n postconditions,\n location: { file: filePath, line },\n };\n }\n\n /**\n * Extract message type from property name node\n */\n private getMessageTypeFromPropertyName(nameNode: Node): string | null {\n if (Node.isStringLiteral(nameNode)) {\n return nameNode.getLiteralValue();\n }\n if (Node.isIdentifier(nameNode)) {\n return nameNode.getText();\n }\n return null;\n }\n\n /**\n * Resolve a function reference to its declaration or expression.\n * Handles both named function declarations and variable-assigned functions.\n *\n * @param identifier - The identifier node referencing the function\n * @returns The resolved function node, or null if not found\n */\n private resolveFunctionReference(\n identifier: Node\n ): FunctionDeclaration | ArrowFunction | FunctionExpression | null {\n if (!Node.isIdentifier(identifier)) {\n return null;\n }\n\n try {\n const definitions = identifier.getDefinitionNodes();\n\n for (const def of definitions) {\n // Direct function declaration\n if (Node.isFunctionDeclaration(def)) {\n return def;\n }\n\n // Variable declaration with function initializer\n if (Node.isVariableDeclaration(def)) {\n const initializer = def.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) || Node.isFunctionExpression(initializer))\n ) {\n return initializer;\n }\n }\n }\n } catch (_error) {\n // Failed to resolve - return null\n }\n\n return null;\n }\n\n /**\n * Extract handlers from type guard if/else-if patterns\n * Detects: if (isQueryMessage(msg)) { handleQuery(msg); }\n */\n private extractTypeGuardHandlers(\n ifNode: Node,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n\n try {\n const sourceFile = ifNode.getSourceFile();\n const typeGuards = this.getOrComputeTypeGuards(sourceFile);\n\n this.debugLogTypeGuards(sourceFile, typeGuards);\n this.processIfElseChain(ifNode as IfStatement, typeGuards, context, filePath, handlers);\n } catch (error) {\n this.debugLogError(error);\n }\n\n return handlers;\n }\n\n /**\n * Get cached type guards or compute if not cached\n */\n private getOrComputeTypeGuards(sourceFile: SourceFile): Map<string, string> {\n let typeGuards = this.typeGuardCache.get(sourceFile);\n if (!typeGuards) {\n typeGuards = this.findTypePredicateFunctions(sourceFile);\n this.typeGuardCache.set(sourceFile, typeGuards);\n }\n return typeGuards;\n }\n\n /**\n * Debug log type guards found in source file\n */\n private debugLogTypeGuards(sourceFile: SourceFile, typeGuards: Map<string, string>): void {\n if (!process.env[\"POLLY_DEBUG\"]) return;\n\n console.log(`[DEBUG] File: ${sourceFile.getBaseName()}`);\n console.log(`[DEBUG] Local type guards found: ${typeGuards.size}`);\n\n if (typeGuards.size > 0) {\n for (const [name, type] of typeGuards.entries()) {\n console.log(`[DEBUG] - ${name} → ${type}`);\n }\n }\n }\n\n /**\n * Process if-else-if chain to extract handlers\n */\n private processIfElseChain(\n currentIf: IfStatement,\n typeGuards: Map<string, string>,\n context: string,\n filePath: string,\n handlers: MessageHandler[]\n ): void {\n let ifStatement = currentIf;\n while (ifStatement) {\n const handler = this.extractHandlerFromIfClause(ifStatement, typeGuards, context, filePath);\n\n if (handler) {\n handlers.push(handler);\n this.debugLogFoundHandler(handler);\n }\n\n // Check for else-if\n const elseStatement = ifStatement.getElseStatement();\n if (elseStatement && Node.isIfStatement(elseStatement)) {\n ifStatement = elseStatement;\n } else {\n break;\n }\n }\n }\n\n /**\n * Debug log found handler\n */\n private debugLogFoundHandler(handler: MessageHandler): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Found handler: ${handler.messageType} at line ${handler.location.line}`);\n }\n }\n\n /**\n * Debug log error\n */\n private debugLogError(error: unknown): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Error in extractTypeGuardHandlers: ${error}`);\n }\n }\n\n /**\n * Extract handler from a single if clause\n */\n private extractHandlerFromIfClause(\n ifNode: Node,\n typeGuards: Map<string, string>,\n context: string,\n filePath: string\n ): MessageHandler | null {\n try {\n const ifStmt = ifNode as IfStatement;\n const condition = ifStmt.getExpression();\n\n if (!Node.isCallExpression(condition)) {\n return null;\n }\n\n const funcExpr = condition.getExpression();\n const funcName = Node.isIdentifier(funcExpr) ? funcExpr.getText() : undefined;\n\n this.debugLogProcessingFunction(funcName);\n\n const messageType = this.resolveMessageType(funcExpr, funcName, typeGuards);\n if (!messageType) {\n this.debugLogUnresolvedMessageType(funcName);\n return null;\n }\n\n const line = ifStmt.getStartLineNumber();\n const relationships = this.extractRelationshipsFromIfBlock(ifStmt, messageType);\n\n return {\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n relationships,\n };\n } catch (_error) {\n return null;\n }\n }\n\n /**\n * Debug log processing function\n */\n private debugLogProcessingFunction(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"] && funcName) {\n console.log(`[DEBUG] Processing if condition with function: ${funcName}`);\n }\n }\n\n /**\n * Debug log unresolved message type\n */\n private debugLogUnresolvedMessageType(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"] && funcName) {\n console.log(`[DEBUG] Could not resolve message type for: ${funcName}`);\n }\n }\n\n /**\n * Resolve message type from function expression\n */\n private resolveMessageType(\n funcExpr: Node,\n funcName: string | undefined,\n typeGuards: Map<string, string>\n ): string | undefined {\n if (funcName && typeGuards.has(funcName)) {\n const guardType = typeGuards.get(funcName);\n if (guardType) {\n this.debugLogFoundInLocalTypeGuards(funcName, guardType);\n return guardType;\n }\n }\n\n if (Node.isIdentifier(funcExpr)) {\n this.debugLogTryingImportResolution(funcName);\n return this.resolveImportedTypeGuard(funcExpr) ?? undefined;\n }\n\n return undefined;\n }\n\n /**\n * Debug log found in local type guards\n */\n private debugLogFoundInLocalTypeGuards(funcName: string, messageType: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Found in local type guards: ${funcName} → ${messageType}`);\n }\n }\n\n /**\n * Debug log trying import resolution\n */\n private debugLogTryingImportResolution(funcName: string | undefined): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Not found locally, trying import resolution for: ${funcName}`);\n }\n }\n\n /**\n * Extract relationships from if block\n */\n private extractRelationshipsFromIfBlock(\n ifStmt: IfStatement,\n messageType: string\n ): ComponentRelationship[] | undefined {\n const thenStatement = ifStmt.getThenStatement();\n if (!thenStatement) {\n return undefined;\n }\n\n const sourceFile = ifStmt.getSourceFile();\n const handlerName = `${messageType}_handler`;\n const detectedRelationships = this.relationshipExtractor.extractFromHandler(\n thenStatement,\n sourceFile,\n handlerName\n );\n\n return detectedRelationships.length > 0 ? detectedRelationships : undefined;\n }\n\n /**\n * Find all type predicate functions in a source file\n * Returns a map of function name → message type\n * Uses AST-based detection for consistency with imported type guard resolution\n */\n private findTypePredicateFunctions(sourceFile: SourceFile): Map<string, string> {\n const typeGuards = new Map<string, string>();\n\n sourceFile.forEachDescendant((node) => {\n this.processTypePredicate(node, typeGuards);\n });\n\n return typeGuards;\n }\n\n /**\n * Process a node that might be a type predicate function\n */\n private processTypePredicate(node: Node, typeGuards: Map<string, string>): void {\n if (!this.isFunctionNode(node)) {\n return;\n }\n\n const returnTypeNode = node.getReturnTypeNode();\n if (!returnTypeNode || !Node.isTypePredicate(returnTypeNode)) {\n return;\n }\n\n const functionName = this.extractFunctionName(node);\n if (!functionName) {\n return;\n }\n\n const messageType = this.extractMessageTypeFromTypePredicateFunction(node, returnTypeNode);\n if (messageType) {\n typeGuards.set(functionName, messageType);\n }\n }\n\n /**\n * Extract function name from function node\n */\n private extractFunctionName(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction\n ): string | undefined {\n if (Node.isFunctionDeclaration(node)) {\n return node.getName();\n }\n\n if (Node.isFunctionExpression(node) || Node.isArrowFunction(node)) {\n return this.extractFunctionNameFromVariable(node);\n }\n\n return undefined;\n }\n\n /**\n * Extract function name from variable declaration\n */\n private extractFunctionNameFromVariable(\n node: FunctionExpression | ArrowFunction\n ): string | undefined {\n const parent = node.getParent();\n if (Node.isVariableDeclaration(parent)) {\n return parent.getName();\n }\n return undefined;\n }\n\n /**\n * Extract message type from type predicate function\n */\n private extractMessageTypeFromTypePredicateFunction(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction,\n returnTypeNode: Node\n ): string | null {\n if (!Node.isTypePredicate(returnTypeNode)) {\n return null;\n }\n\n // Try to get type node if method exists\n if (\"getTypeNode\" in returnTypeNode && typeof returnTypeNode.getTypeNode === \"function\") {\n const typeNode = returnTypeNode.getTypeNode();\n\n if (typeNode) {\n const typeName = typeNode.getText();\n const messageType = this.extractMessageTypeFromTypeName(typeName);\n if (messageType) {\n return messageType;\n }\n }\n }\n\n return this.extractMessageTypeFromFunctionBodyText(node);\n }\n\n /**\n * Extract message type from function body text\n */\n private extractMessageTypeFromFunctionBodyText(\n node: FunctionDeclaration | FunctionExpression | ArrowFunction\n ): string | null {\n const body = node.getBody();\n if (!body) {\n return null;\n }\n\n const bodyText = body.getText();\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/);\n\n if (typeValueMatch) {\n return typeValueMatch[1] ?? null;\n }\n\n return null;\n }\n\n /**\n * Resolve type guard from imported function\n * Uses ts-morph symbol resolution to find definition across files\n * Checks AST structure, not resolved types (which can lose type predicate info)\n */\n private resolveImportedTypeGuard(identifier: Identifier): string | null {\n try {\n const funcName = identifier.getText();\n const definitions = identifier.getDefinitionNodes();\n\n if (definitions.length === 0) {\n this.debugLogNoDefinitions(funcName);\n return null;\n }\n\n for (const def of definitions) {\n const messageType = this.tryExtractTypeGuardFromDefinition(def, funcName);\n if (messageType) {\n return messageType;\n }\n }\n } catch (error) {\n this.debugLogResolutionError(error);\n }\n\n return null;\n }\n\n /**\n * Try to extract type guard from a single function definition\n */\n private tryExtractTypeGuardFromDefinition(def: Node, funcName: string): string | null {\n if (!this.isFunctionNode(def)) {\n return null;\n }\n\n const returnTypeNode = def.getReturnTypeNode();\n this.debugLogReturnTypeInfo(funcName, def, returnTypeNode);\n\n const typePredicateResult = this.extractFromTypePredicate(returnTypeNode, funcName);\n if (typePredicateResult) {\n return typePredicateResult;\n }\n\n return this.extractFromFunctionBody(def, funcName);\n }\n\n /**\n * Check if node is a function type\n */\n private isFunctionNode(\n node: Node\n ): node is FunctionDeclaration | FunctionExpression | ArrowFunction {\n return (\n Node.isFunctionDeclaration(node) ||\n Node.isFunctionExpression(node) ||\n Node.isArrowFunction(node)\n );\n }\n\n /**\n * Extract message type from type predicate node\n */\n private extractFromTypePredicate(\n returnTypeNode: Node | undefined,\n funcName: string\n ): string | null {\n if (!returnTypeNode || !Node.isTypePredicate(returnTypeNode)) {\n return null;\n }\n\n const typeNode = returnTypeNode.getTypeNode();\n if (!typeNode) {\n return null;\n }\n\n const typeName = typeNode.getText();\n const messageType = this.extractMessageTypeFromTypeName(typeName);\n\n if (messageType) {\n this.debugLogTypePredicateResolution(funcName, messageType);\n return messageType;\n }\n\n return null;\n }\n\n /**\n * Extract message type from function body\n */\n private extractFromFunctionBody(\n def: FunctionDeclaration | FunctionExpression | ArrowFunction,\n funcName: string\n ): string | null {\n const body = def.getBody();\n if (!body) {\n return null;\n }\n\n const bodyText = body.getText();\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/);\n\n if (typeValueMatch) {\n const messageType = typeValueMatch[1] ?? null;\n this.debugLogBodyResolution(funcName, messageType);\n return messageType;\n }\n\n return null;\n }\n\n /**\n * Debug: Log no definitions found\n */\n private debugLogNoDefinitions(funcName: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] No definitions found for imported function: ${funcName}`);\n }\n }\n\n /**\n * Debug: Log return type info\n */\n private debugLogReturnTypeInfo(\n funcName: string,\n def: FunctionDeclaration | FunctionExpression | ArrowFunction,\n returnTypeNode: Node | undefined\n ): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n const returnType = def.getReturnType().getText();\n console.log(`[DEBUG] Function ${funcName} return type (resolved): ${returnType}`);\n console.log(`[DEBUG] Has return type node: ${!!returnTypeNode}`);\n console.log(\n `[DEBUG] Is type predicate node: ${returnTypeNode && Node.isTypePredicate(returnTypeNode)}`\n );\n }\n }\n\n /**\n * Debug: Log type predicate resolution\n */\n private debugLogTypePredicateResolution(funcName: string, messageType: string): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Resolved ${funcName} → ${messageType} (from AST type predicate)`);\n }\n }\n\n /**\n * Debug: Log body resolution\n */\n private debugLogBodyResolution(funcName: string, messageType: string | null): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Resolved ${funcName} → ${messageType} (from body)`);\n }\n }\n\n /**\n * Debug: Log resolution error\n */\n private debugLogResolutionError(error: unknown): void {\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Error resolving imported type guard: ${error}`);\n }\n }\n\n /**\n * Extract message type from TypeScript type name\n * Examples:\n * QueryMessage → query\n * CommandMessage → command\n * SubscribeMessage → subscribe\n */\n private extractMessageTypeFromTypeName(typeName: string): string {\n // Remove common suffixes and convert to lowercase\n const messageType = typeName\n .replace(/Message$/, \"\")\n .replace(/Event$/, \"\")\n .replace(/Request$/, \"\")\n .replace(/Command$/, \"\")\n .replace(/Query$/, \"\")\n .toLowerCase();\n\n return messageType;\n }\n\n /**\n * Infer the context (background, content, popup, etc.) from file path\n */\n private inferContext(filePath: string): string {\n const path = filePath.toLowerCase();\n\n // Check contexts in priority order\n return (\n this.inferElectronContext(path) ||\n this.inferWorkerContext(path) ||\n this.inferServerAppContext(path) ||\n this.inferChromeExtensionContext(path) ||\n \"unknown\"\n );\n }\n\n /**\n * Infer Electron context (main, renderer, preload)\n */\n private inferElectronContext(path: string): string | null {\n if (\n path.includes(\"main.ts\") ||\n path.includes(\"main.js\") ||\n path.includes(\"/main/\") ||\n path.includes(\"\\\\main\\\\\")\n ) {\n return \"main\";\n }\n\n if (\n path.includes(\"/renderer/\") ||\n path.includes(\"\\\\renderer\\\\\") ||\n path.includes(\"renderer.ts\") ||\n path.includes(\"renderer.js\")\n ) {\n return \"renderer\";\n }\n\n if (path.includes(\"preload.ts\") || path.includes(\"preload.js\")) {\n return \"preload\";\n }\n\n return null;\n }\n\n /**\n * Infer Worker/PWA context\n */\n private inferWorkerContext(path: string): string | null {\n if (path.includes(\"service-worker\") || path.includes(\"sw.ts\") || path.includes(\"sw.js\")) {\n return \"worker\";\n }\n\n if (path.includes(\"/worker/\") || path.includes(\"\\\\worker\\\\\")) {\n return \"worker\";\n }\n\n return null;\n }\n\n /**\n * Infer WebSocket/server app context\n */\n private inferServerAppContext(path: string): string | null {\n if (\n path.includes(\"/server/\") ||\n path.includes(\"\\\\server\\\\\") ||\n path.includes(\"/server.\") ||\n path.includes(\"server.ts\") ||\n path.includes(\"server.js\")\n ) {\n return \"server\";\n }\n\n if (path.includes(\"/client/\") || path.includes(\"\\\\client\\\\\") || path.includes(\"/client.\")) {\n return \"client\";\n }\n\n return null;\n }\n\n /**\n * Infer Chrome extension context\n */\n private inferChromeExtensionContext(path: string): string | null {\n if (path.includes(\"/background/\") || path.includes(\"\\\\background\\\\\")) {\n return \"background\";\n }\n\n if (path.includes(\"/content/\") || path.includes(\"\\\\content\\\\\")) {\n return \"content\";\n }\n\n if (path.includes(\"/popup/\") || path.includes(\"\\\\popup\\\\\")) {\n return \"popup\";\n }\n\n if (path.includes(\"/devtools/\") || path.includes(\"\\\\devtools\\\\\")) {\n return \"devtools\";\n }\n\n if (path.includes(\"/options/\") || path.includes(\"\\\\options\\\\\")) {\n return \"options\";\n }\n\n if (path.includes(\"/offscreen/\") || path.includes(\"\\\\offscreen\\\\\")) {\n return \"offscreen\";\n }\n\n return null;\n }\n\n /**\n * Check binary expression for state mutations\n */\n private checkBinaryExpressionMutation(\n node: Node,\n firstAwaitPos: number,\n mutations: Array<{ field: string; line: number; afterAwait: boolean }>\n ): void {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n if (operator !== \"=\" && ![\"+=\", \"-=\", \"*=\", \"/=\", \"%=\"].includes(operator)) return;\n\n const left = node.getLeft();\n if (!Node.isPropertyAccessExpression(left) && !Node.isElementAccessExpression(left)) return;\n\n const fieldPath = Node.isPropertyAccessExpression(left)\n ? this.getPropertyPath(left)\n : this.getPropertyPath(left.getExpression());\n\n const field = this.extractFieldFromStatePath(fieldPath);\n if (field) {\n const line = node.getStartLineNumber();\n const afterAwait = node.getStart() > firstAwaitPos;\n mutations.push({ field, line, afterAwait });\n }\n }\n\n /**\n * Check call expression for array mutation methods\n */\n private checkCallExpressionMutation(\n node: Node,\n firstAwaitPos: number,\n mutations: Array<{ field: string; line: number; afterAwait: boolean }>\n ): void {\n if (!Node.isCallExpression(node)) return;\n\n const expr = node.getExpression();\n if (!Node.isPropertyAccessExpression(expr)) return;\n\n const methodName = expr.getName();\n const object = expr.getExpression();\n\n if (!Node.isPropertyAccessExpression(object)) return;\n\n const fieldPath = this.getPropertyPath(object);\n const field = this.extractFieldFromStatePath(fieldPath);\n\n if (field && [\"push\", \"pop\", \"shift\", \"unshift\", \"splice\"].includes(methodName)) {\n const line = node.getStartLineNumber();\n const afterAwait = node.getStart() > firstAwaitPos;\n mutations.push({ field, line, afterAwait });\n }\n }\n\n /**\n * Extract state-level constraints from a source file\n */\n private extractStateConstraintsFromFile(sourceFile: SourceFile): StateConstraint[] {\n const constraints: StateConstraint[] = [];\n const filePath = sourceFile.getFilePath();\n\n sourceFile.forEachDescendant((node) => {\n const nodeConstraints = this.recognizeStateConstraint(node, filePath);\n constraints.push(...nodeConstraints);\n });\n\n return constraints;\n }\n\n /**\n * Recognize a $constraints() call and extract constraint definitions\n */\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Parser logic requires nested conditionals\n private recognizeStateConstraint(node: Node, filePath: string): StateConstraint[] {\n if (!Node.isCallExpression(node)) {\n return [];\n }\n\n const expression = node.getExpression();\n if (!Node.isIdentifier(expression)) {\n return [];\n }\n\n const functionName = expression.getText();\n if (functionName !== \"$constraints\") {\n return [];\n }\n\n // Get arguments: $constraints(field, constraintsObject)\n const args = node.getArguments();\n if (args.length < 2) {\n return [];\n }\n\n // First argument is the state field name\n const fieldArg = args[0];\n if (!Node.isStringLiteral(fieldArg)) {\n return [];\n }\n const field = fieldArg.getLiteralValue();\n\n // Second argument is the constraints object\n const constraintsArg = args[1];\n if (!Node.isObjectLiteralExpression(constraintsArg)) {\n return [];\n }\n\n // Extract each message type constraint\n const results: StateConstraint[] = [];\n for (const property of constraintsArg.getProperties()) {\n if (!Node.isPropertyAssignment(property)) {\n continue;\n }\n\n const messageType = property.getName();\n const initializer = property.getInitializer();\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n continue;\n }\n\n // Extract requires, ensures, and message from the constraint object\n let requires: string | undefined;\n let ensures: string | undefined;\n let message: string | undefined;\n\n for (const constraintProp of initializer.getProperties()) {\n if (!Node.isPropertyAssignment(constraintProp)) {\n continue;\n }\n\n const propName = constraintProp.getName();\n const propValue = constraintProp.getInitializer();\n if (!propValue) {\n continue;\n }\n\n if (propName === \"requires\" && Node.isStringLiteral(propValue)) {\n requires = propValue.getLiteralValue();\n } else if (propName === \"ensures\" && Node.isStringLiteral(propValue)) {\n ensures = propValue.getLiteralValue();\n } else if (propName === \"message\" && Node.isStringLiteral(propValue)) {\n message = propValue.getLiteralValue();\n }\n }\n\n results.push({\n field,\n messageType,\n requires,\n ensures,\n message,\n location: {\n file: filePath,\n line: property.getStartLineNumber(),\n },\n });\n }\n\n return results;\n }\n\n // ═══════════════════════════════════════════════════════════════════\n // Verified State Discovery (Issue #27)\n // ═══════════════════════════════════════════════════════════════════\n\n /**\n * Extract $sharedState declarations with { verify: true } from a source file\n *\n * Finds patterns like:\n * const authState = $sharedState('auth', initialState, { verify: true })\n * export const settings = $syncedState('settings', defaults, { verify: true })\n */\n extractVerifiedStatesFromFile(sourceFile: SourceFile): VerifiedStateInfo[] {\n const verifiedStates: VerifiedStateInfo[] = [];\n const filePath = sourceFile.getFilePath();\n\n sourceFile.forEachDescendant((node) => {\n if (!Node.isCallExpression(node)) return;\n\n const stateInfo = this.recognizeVerifiedStateCall(node, filePath);\n if (stateInfo) {\n verifiedStates.push(stateInfo);\n }\n });\n\n return verifiedStates;\n }\n\n /**\n * Recognize a $sharedState/$syncedState/$persistedState call with verify: true\n */\n private recognizeVerifiedStateCall(node: Node, filePath: string): VerifiedStateInfo | null {\n if (!Node.isCallExpression(node)) return null;\n\n const expression = node.getExpression();\n if (!Node.isIdentifier(expression)) return null;\n\n const funcName = expression.getText();\n // Match state primitives that support verification\n if (![\"$sharedState\", \"$syncedState\", \"$persistedState\"].includes(funcName)) {\n return null;\n }\n\n const args = node.getArguments();\n if (args.length < 2) return null;\n\n // Check for { verify: true } in options (3rd argument)\n const optionsArg = args[2];\n if (!optionsArg || !this.hasVerifyTrue(optionsArg)) return null;\n\n // Extract state key (1st argument)\n const keyArg = args[0];\n if (!keyArg || !Node.isStringLiteral(keyArg)) return null;\n const key = keyArg.getLiteralValue();\n\n // Get variable name from parent declaration\n const variableName = this.getVariableNameFromParent(node) || key;\n\n // Extract field names from initial value (2nd argument)\n const initialValueArg = args[1];\n const fields = initialValueArg ? this.extractFieldNames(initialValueArg) : [];\n\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[DEBUG] Found verified state: ${variableName} (key: \"${key}\") with fields: [${fields.join(\", \")}]`\n );\n }\n\n return {\n key,\n variableName,\n filePath,\n line: node.getStartLineNumber(),\n fields,\n };\n }\n\n /**\n * Check if an options object contains verify: true\n */\n private hasVerifyTrue(optionsNode: Node): boolean {\n if (!Node.isObjectLiteralExpression(optionsNode)) return false;\n\n for (const prop of optionsNode.getProperties()) {\n if (!Node.isPropertyAssignment(prop)) continue;\n\n const name = prop.getName();\n if (name !== \"verify\") continue;\n\n const initializer = prop.getInitializer();\n if (initializer && initializer.getKind() === SyntaxKind.TrueKeyword) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Get variable name from parent VariableDeclaration\n */\n private getVariableNameFromParent(node: Node): string | null {\n const parent = node.getParent();\n if (Node.isVariableDeclaration(parent)) {\n return parent.getName();\n }\n return null;\n }\n\n /**\n * Extract field names from an initial value expression\n * Handles object literals and identifier references\n */\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: Field extraction requires traversing nested object structures\n private extractFieldNames(node: Node): string[] {\n const fields: string[] = [];\n\n if (Node.isObjectLiteralExpression(node)) {\n for (const prop of node.getProperties()) {\n if (Node.isPropertyAssignment(prop) || Node.isShorthandPropertyAssignment(prop)) {\n fields.push(prop.getName());\n }\n }\n } else if (Node.isIdentifier(node)) {\n // Try to resolve the identifier to its declaration\n const definitions = node.getDefinitionNodes();\n for (const def of definitions) {\n if (Node.isVariableDeclaration(def)) {\n const initializer = def.getInitializer();\n if (initializer && Node.isObjectLiteralExpression(initializer)) {\n return this.extractFieldNames(initializer);\n }\n }\n }\n }\n\n return fields;\n }\n\n /**\n * Find exported functions that modify verified state signals\n *\n * Looks for patterns:\n * - authState.value = { ... }\n * - authState.value.field = value\n */\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: State mutation detection requires complex AST pattern matching\n findStateMutatingFunctions(\n sourceFile: SourceFile,\n verifiedStates: VerifiedStateInfo[]\n ): MessageHandler[] {\n const handlers: MessageHandler[] = [];\n const stateVarNames = new Set(verifiedStates.map((s) => s.variableName));\n const filePath = sourceFile.getFilePath();\n const context = this.inferContext(filePath);\n\n // Find all exported functions\n for (const func of sourceFile.getFunctions()) {\n if (!func.isExported()) continue;\n\n const funcName = func.getName();\n if (!funcName) continue;\n\n // Check if function modifies any verified state\n const assignments = this.findStateMutationsInFunction(func, stateVarNames);\n if (assignments.length === 0) continue;\n\n // Extract requires/ensures\n const preconditions: VerificationCondition[] = [];\n const postconditions: VerificationCondition[] = [];\n this.extractVerificationConditions(func, preconditions, postconditions);\n\n // Generate message type from function name\n const messageType = this.functionNameToMessageType(funcName);\n\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(\n `[DEBUG] Found state-mutating function: ${funcName} → ${messageType} ` +\n `(${assignments.length} assignments, ${preconditions.length} preconditions, ${postconditions.length} postconditions)`\n );\n }\n\n handlers.push({\n messageType,\n node: context,\n assignments,\n preconditions,\n postconditions,\n location: {\n file: filePath,\n line: func.getStartLineNumber(),\n },\n origin: \"stateHandler\" as const,\n });\n }\n\n // Also check exported variable declarations with arrow functions\n for (const varStmt of sourceFile.getVariableStatements()) {\n if (!varStmt.isExported()) continue;\n\n for (const decl of varStmt.getDeclarations()) {\n const initializer = decl.getInitializer();\n if (!initializer) continue;\n if (!Node.isArrowFunction(initializer) && !Node.isFunctionExpression(initializer)) continue;\n\n const funcName = decl.getName();\n if (!funcName) continue;\n\n const assignments = this.findStateMutationsInFunction(initializer, stateVarNames);\n if (assignments.length === 0) continue;\n\n const preconditions: VerificationCondition[] = [];\n const postconditions: VerificationCondition[] = [];\n this.extractVerificationConditions(initializer, preconditions, postconditions);\n\n const messageType = this.functionNameToMessageType(funcName);\n\n if (process.env[\"POLLY_DEBUG\"]) {\n console.log(`[DEBUG] Found state-mutating arrow function: ${funcName} → ${messageType}`);\n }\n\n handlers.push({\n messageType,\n node: context,\n assignments,\n preconditions,\n postconditions,\n location: {\n file: filePath,\n line: decl.getStartLineNumber(),\n },\n origin: \"stateHandler\" as const,\n });\n }\n }\n\n return handlers;\n }\n\n /**\n * Find state mutations within a function that target verified state signals\n */\n private findStateMutationsInFunction(\n func: FunctionDeclaration | ArrowFunction | FunctionExpression,\n stateVarNames: Set<string>\n ): StateAssignment[] {\n const mutations: StateAssignment[] = [];\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: AST traversal for state mutations requires multiple pattern checks\n func.forEachDescendant((node) => {\n if (!Node.isBinaryExpression(node)) return;\n\n const operator = node.getOperatorToken().getText();\n if (operator !== \"=\") return;\n\n const left = node.getLeft();\n if (!Node.isPropertyAccessExpression(left)) return;\n\n const path = this.getPropertyPath(left);\n\n // Check for patterns:\n // 1. authState.value = { ... } (full replacement)\n // 2. authState.value.field = value (field update)\n for (const varName of stateVarNames) {\n // Pattern 1: Full state replacement\n // e.g., authState.value = { loggedIn: true } → authState_loggedIn = true\n if (path === `${varName}.value`) {\n const right = node.getRight();\n if (Node.isObjectLiteralExpression(right)) {\n this.extractObjectLiteralAssignments(right, mutations, varName);\n }\n break;\n }\n\n // Pattern 2: Field update\n // e.g., authState.value.loggedIn = true → authState_loggedIn = true\n const fieldPrefix = `${varName}.value.`;\n if (path.startsWith(fieldPrefix)) {\n const fieldName = path.substring(fieldPrefix.length);\n const value = this.extractValue(node.getRight());\n mutations.push({ field: `${varName}_${fieldName}`, value: value ?? \"@\" });\n break;\n }\n }\n });\n\n return mutations;\n }\n\n /**\n * Convert function name to message type\n * Examples:\n * handleAuthSuccess → AuthSuccess\n * handleLogout → Logout\n * setUserProfile → SetUserProfile\n */\n private functionNameToMessageType(funcName: string): string {\n // Remove common handler prefixes\n let name = funcName\n .replace(/^handle/, \"\")\n .replace(/^on/, \"\")\n .replace(/^set/, \"Set\")\n .replace(/^update/, \"Update\")\n .replace(/^do/, \"\");\n\n // Ensure first letter is uppercase\n if (name.length > 0) {\n name = name.charAt(0).toUpperCase() + name.slice(1);\n }\n\n return name || funcName;\n }\n}\n\nexport function extractHandlers(tsConfigPath: string): HandlerAnalysis {\n const extractor = new HandlerExtractor(tsConfigPath);\n return extractor.extractHandlers();\n}\n",
|
|
14
14
|
"// Component relationship extraction from TypeScript code\n// Detects function calls, imports, and dependencies between components\n\nimport {\n type ArrowFunction,\n type CallExpression,\n type FunctionDeclaration,\n type FunctionExpression,\n type Identifier,\n Node,\n type SourceFile,\n} from \"ts-morph\";\n\n/**\n * Represents a relationship between components detected from code analysis\n */\nexport interface DetectedRelationship {\n /** Source component (handler, service, etc.) */\n from: string;\n /** Target component being called/used */\n to: string;\n /** Description of the relationship */\n description: string;\n /** Technology/method used (e.g., \"Function Call\", \"Import\", \"SQL\", \"HTTP\") */\n technology?: string;\n /** Confidence level of this detection */\n confidence: \"high\" | \"medium\" | \"low\";\n /** Evidence supporting this detection */\n evidence: string[];\n}\n\n/**\n * Extracts component relationships from handler code\n */\nexport class RelationshipExtractor {\n /**\n * Extract relationships from a function/handler body\n */\n extractFromHandler(\n handlerNode: Node,\n sourceFile: SourceFile,\n handlerName: string\n ): DetectedRelationship[] {\n const relationships: DetectedRelationship[] = [];\n const visited = new Set<string>(); // Prevent infinite recursion\n\n this.extractFromNode(handlerNode, sourceFile, handlerName, relationships, visited);\n\n return this.deduplicateRelationships(relationships);\n }\n\n /**\n * Recursively extract relationships from a node and follow function calls\n */\n private extractFromNode(\n node: Node,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n node.forEachDescendant((descendant) => {\n this.processDescendantNode(descendant, sourceFile, handlerName, relationships, visited);\n });\n }\n\n /**\n * Process a single descendant node for relationship extraction\n */\n private processDescendantNode(\n descendant: Node,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n if (Node.isCallExpression(descendant)) {\n this.processCallExpression(descendant, sourceFile, handlerName, relationships, visited);\n }\n\n if (Node.isAwaitExpression(descendant)) {\n const rel = this.extractFromDatabaseCall(descendant, handlerName);\n if (rel) {\n relationships.push(rel);\n }\n }\n\n if (Node.isCallExpression(descendant) && descendant.getExpression().getText() === \"fetch\") {\n const rel = this.extractFromFetchCall(descendant, handlerName);\n if (rel) {\n relationships.push(rel);\n }\n }\n }\n\n /**\n * Process a call expression for relationship extraction\n */\n private processCallExpression(\n callExpr: CallExpression,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n const expr = callExpr.getExpression();\n\n if (Node.isIdentifier(expr)) {\n this.processIdentifierCall(expr, sourceFile, handlerName, relationships, visited);\n return;\n }\n\n if (Node.isPropertyAccessExpression(expr)) {\n const rel = this.extractFromPropertyAccess(expr, handlerName);\n if (rel) {\n relationships.push(rel);\n return;\n }\n }\n\n const rel = this.extractFromFunctionCall(callExpr, handlerName, sourceFile);\n if (rel) {\n relationships.push(rel);\n }\n }\n\n /**\n * Process an identifier call (local or imported function)\n */\n private processIdentifierCall(\n identifier: Identifier,\n sourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n const functionName = identifier.getText();\n const resolved = this.resolveFunctionDeclaration(functionName, sourceFile);\n\n if (resolved && !visited.has(functionName)) {\n this.followFunctionCall(\n functionName,\n resolved.functionDecl,\n resolved.sourceFile,\n handlerName,\n relationships,\n visited\n );\n return;\n }\n\n if (!resolved) {\n this.tryAddServiceCallRelationship(functionName, handlerName, relationships);\n }\n }\n\n /**\n * Resolve function declaration from name\n */\n private resolveFunctionDeclaration(\n functionName: string,\n sourceFile: SourceFile\n ): {\n functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression;\n sourceFile: SourceFile;\n } | null {\n let functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression | undefined =\n sourceFile.getFunction(functionName);\n let targetSourceFile = sourceFile;\n\n if (!functionDecl) {\n const resolved = this.resolveImportedFunction(functionName, sourceFile);\n if (resolved) {\n functionDecl = resolved.functionDecl;\n targetSourceFile = resolved.sourceFile;\n }\n }\n\n if (!functionDecl) {\n return null;\n }\n\n return { functionDecl, sourceFile: targetSourceFile };\n }\n\n /**\n * Follow a function call recursively\n */\n private followFunctionCall(\n functionName: string,\n functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression,\n targetSourceFile: SourceFile,\n handlerName: string,\n relationships: DetectedRelationship[],\n visited: Set<string>\n ): void {\n visited.add(functionName);\n\n const body = functionDecl.getBody();\n if (body) {\n this.extractFromNode(body, targetSourceFile, handlerName, relationships, visited);\n }\n }\n\n /**\n * Try to add a service call relationship based on function name\n */\n private tryAddServiceCallRelationship(\n functionName: string,\n handlerName: string,\n relationships: DetectedRelationship[]\n ): void {\n const componentFromName = this.inferComponentFromFunctionName(functionName);\n if (componentFromName) {\n relationships.push({\n from: this.toComponentId(handlerName),\n to: componentFromName,\n description: `Calls ${functionName}()`,\n technology: \"Function Call\",\n confidence: \"medium\",\n evidence: [`Function call: ${functionName}`],\n });\n }\n }\n\n /**\n * Extract relationship from a function call\n */\n private extractFromFunctionCall(\n callExpr: CallExpression,\n handlerName: string,\n sourceFile: SourceFile\n ): DetectedRelationship | null {\n const expr = callExpr.getExpression();\n const exprText = expr.getText();\n\n // Skip common utility functions and built-ins\n const skipList = [\n \"console.\",\n \"JSON.\",\n \"Math.\",\n \"Object.\",\n \"Array.\",\n \"String.\",\n \"Number.\",\n \"Date.\",\n \"Promise.\",\n \"setTimeout\",\n \"setInterval\",\n \"clearTimeout\",\n \"clearInterval\",\n ];\n\n if (skipList.some((skip) => exprText.startsWith(skip))) {\n return null;\n }\n\n // Extract function name\n let functionName = exprText;\n let targetComponent: string | null = null;\n\n // Handle property access (e.g., db.getConnection() -> db_client)\n if (Node.isPropertyAccessExpression(expr)) {\n const objectExpr = expr.getExpression();\n const objectName = objectExpr.getText();\n const methodName = expr.getName();\n\n // Map common patterns to component names\n targetComponent = this.inferComponentFromCall(objectName);\n\n if (!targetComponent) {\n return null;\n }\n\n functionName = methodName;\n } else {\n // Direct function call - try to resolve from imports\n targetComponent = this.resolveComponentFromImport(exprText, sourceFile);\n\n if (!targetComponent) {\n return null;\n }\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: targetComponent,\n description: `Calls ${functionName}()`,\n technology: \"Function Call\",\n confidence: \"high\",\n evidence: [`Function call: ${exprText}`],\n };\n }\n\n /**\n * Extract relationship from property access chain\n * Handles both simple (obj.method) and nested (obj.prop.method) patterns\n */\n private extractFromPropertyAccess(\n propAccess: Node,\n handlerName: string\n ): DetectedRelationship | null {\n if (!Node.isPropertyAccessExpression(propAccess)) {\n return null;\n }\n\n const fullChain = propAccess.getText();\n const methodName = propAccess.getName();\n\n // Extract the root object from potentially nested property access\n // e.g., repositories.users.create -> repositories\n let rootObject = propAccess.getExpression();\n while (Node.isPropertyAccessExpression(rootObject)) {\n rootObject = rootObject.getExpression();\n }\n\n const objectName = rootObject.getText();\n\n // Map object name to component name\n const targetComponent = this.inferComponentFromCall(objectName);\n\n if (!targetComponent) {\n return null;\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: targetComponent,\n description: `Calls ${methodName}()`,\n technology: \"Function Call\",\n confidence: \"high\",\n evidence: [`Property access: ${fullChain}`],\n };\n }\n\n /**\n * Extract relationship from database call\n */\n private extractFromDatabaseCall(\n awaitExpr: Node,\n handlerName: string\n ): DetectedRelationship | null {\n if (!Node.isAwaitExpression(awaitExpr)) {\n return null;\n }\n\n const innerExpr = awaitExpr.getExpression();\n if (!Node.isCallExpression(innerExpr)) {\n return null;\n }\n\n const callExpr = innerExpr.getExpression().getText();\n\n // Detect database patterns\n if (\n callExpr.includes(\"db.query\") ||\n callExpr.includes(\"db.execute\") ||\n callExpr.includes(\"db.select\") ||\n callExpr.includes(\"db.insert\") ||\n callExpr.includes(\"db.update\") ||\n callExpr.includes(\"db.delete\")\n ) {\n const operation = this.inferDatabaseOperation(callExpr);\n\n return {\n from: this.toComponentId(handlerName),\n to: \"database\",\n description: operation,\n technology: \"SQL\",\n confidence: \"high\",\n evidence: [`Database call: ${callExpr}`],\n };\n }\n\n return null;\n }\n\n /**\n * Extract relationship from fetch/HTTP call\n */\n private extractFromFetchCall(\n callExpr: CallExpression,\n handlerName: string\n ): DetectedRelationship | null {\n const args = callExpr.getArguments();\n if (args.length === 0 || !args[0]) {\n return null;\n }\n\n const urlArg = args[0].getText();\n\n // Try to extract API name from URL\n let apiName = \"external_api\";\n if (urlArg.includes(\"openai\")) {\n apiName = \"openai_api\";\n } else if (urlArg.includes(\"anthropic\")) {\n apiName = \"anthropic_api\";\n }\n\n return {\n from: this.toComponentId(handlerName),\n to: apiName,\n description: \"Calls external API\",\n technology: \"HTTP/REST\",\n confidence: \"high\",\n evidence: [`fetch() call to: ${urlArg}`],\n };\n }\n\n /**\n * Infer component name from object.method pattern\n */\n private inferComponentFromCall(objectName: string): string | null {\n const mappings: Record<string, string> = {\n db: \"db_client\",\n database: \"database\",\n repos: \"repositories\",\n repository: \"repositories\",\n repositories: \"repositories\",\n cache: \"cache\",\n storage: \"storage\",\n ai: \"ai_service\",\n auth: \"auth_service\",\n authservice: \"auth_service\",\n user: \"user_service\",\n userservice: \"user_service\",\n logger: \"logger\",\n queue: \"queue_service\",\n };\n\n const normalized = objectName.toLowerCase();\n return mappings[normalized] || null;\n }\n\n /**\n * Infer component name from function name patterns\n * Detects patterns like getDatabase(), createRepositories(), etc.\n */\n private inferComponentFromFunctionName(functionName: string): string | null {\n const normalized = functionName.toLowerCase();\n\n // Pattern 1: getXxx() or createXxx()\n if (normalized.startsWith(\"get\") || normalized.startsWith(\"create\")) {\n const prefixLength = normalized.startsWith(\"get\") ? 3 : 6;\n const suffix = functionName.substring(prefixLength);\n return this.matchComponentPattern(suffix);\n }\n\n // Pattern 2: initXxx() or setupXxx()\n if (normalized.startsWith(\"init\") || normalized.startsWith(\"setup\")) {\n const prefixLength = normalized.startsWith(\"init\") ? 4 : 5;\n const suffix = functionName.substring(prefixLength);\n return this.matchInitPattern(suffix);\n }\n\n return null;\n }\n\n /**\n * Match component patterns for get/create functions\n */\n private matchComponentPattern(suffix: string): string | null {\n const suffixLower = suffix.toLowerCase();\n\n const componentPatterns = [\n {\n patterns: [\"database\", \"db\", \"dbconnection\", \"connection\"],\n component: \"db_client\",\n },\n {\n patterns: [\"repositories\", \"repos\", \"repository\"],\n component: \"repositories\",\n },\n {\n patterns: [\"cache\"],\n component: \"cache\",\n },\n {\n patterns: [\"storage\"],\n component: \"storage\",\n },\n {\n patterns: [\"ai\", \"llm\"],\n component: \"ai_service\",\n },\n {\n patterns: [\"logger\"],\n component: \"logger\",\n },\n ];\n\n for (const { patterns, component } of componentPatterns) {\n if (patterns.some((pattern) => suffixLower.includes(pattern) || suffixLower === pattern)) {\n return component;\n }\n }\n\n // Service patterns (special case with extraction)\n if (suffixLower.includes(\"service\")) {\n const serviceMatch = suffix.match(/^(.+?)Service/i);\n if (serviceMatch) {\n return this.toComponentId(`${serviceMatch[1]}_service`);\n }\n return \"service\";\n }\n\n return null;\n }\n\n /**\n * Match patterns for init/setup functions\n */\n private matchInitPattern(suffix: string): string | null {\n const suffixLower = suffix.toLowerCase();\n\n if (suffixLower.includes(\"database\") || suffixLower === \"db\") {\n return \"db_client\";\n }\n if (suffixLower.includes(\"cache\")) {\n return \"cache\";\n }\n\n return null;\n }\n\n /**\n * Resolve component from import statement\n */\n private resolveComponentFromImport(functionName: string, sourceFile: SourceFile): string | null {\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const namedImports = importDecl.getNamedImports();\n\n for (const namedImport of namedImports) {\n if (namedImport.getName() === functionName) {\n const modulePath = importDecl.getModuleSpecifierValue();\n const component = this.inferComponentFromModulePath(modulePath);\n if (component) return component;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Infer component from module path\n */\n private inferComponentFromModulePath(modulePath: string): string | null {\n if (modulePath.includes(\"/db/\") || modulePath.includes(\"/database/\")) {\n return \"db_client\";\n }\n if (modulePath.includes(\"/repos\") || modulePath.includes(\"/repositories\")) {\n return \"repositories\";\n }\n if (modulePath.includes(\"/service\") || modulePath.includes(\"/services\")) {\n const match = modulePath.match(/\\/([^/]+)\\.ts$/);\n if (match?.[1]) {\n return this.toComponentId(match[1]);\n }\n }\n return null;\n }\n\n /**\n * Resolve imported function to its declaration in another file\n * This enables cross-file relationship detection for architectures where\n * handlers are separated from routing logic\n */\n private resolveImportedFunction(\n functionName: string,\n sourceFile: SourceFile\n ): {\n functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression;\n sourceFile: SourceFile;\n } | null {\n try {\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const namedImports = importDecl.getNamedImports();\n\n for (const namedImport of namedImports) {\n if (namedImport.getName() === functionName) {\n const moduleSpecifier = importDecl.getModuleSpecifierSourceFile();\n if (!moduleSpecifier) continue;\n\n const result = this.findFunctionInModule(functionName, moduleSpecifier);\n if (result) return result;\n }\n }\n }\n } catch (_error) {\n // Silently fail on resolution errors (e.g., missing files, parse errors)\n // This ensures the extractor is resilient to incomplete projects\n return null;\n }\n\n return null;\n }\n\n /**\n * Find function declaration or arrow function in a module\n */\n private findFunctionInModule(\n functionName: string,\n moduleSpecifier: SourceFile\n ): {\n functionDecl: FunctionDeclaration | ArrowFunction | FunctionExpression;\n sourceFile: SourceFile;\n } | null {\n // Find the function in the imported file\n const functionDecl = moduleSpecifier.getFunction(functionName);\n if (functionDecl) {\n return {\n functionDecl,\n sourceFile: moduleSpecifier,\n };\n }\n\n // Also check for exported arrow functions or const declarations\n const variableDecl = moduleSpecifier.getVariableDeclaration(functionName);\n if (variableDecl) {\n const initializer = variableDecl.getInitializer();\n if (\n initializer &&\n (Node.isArrowFunction(initializer) || Node.isFunctionExpression(initializer))\n ) {\n return {\n functionDecl: initializer,\n sourceFile: moduleSpecifier,\n };\n }\n }\n\n return null;\n }\n\n /**\n * Infer database operation type\n */\n private inferDatabaseOperation(callExpr: string): string {\n if (callExpr.includes(\"query\") || callExpr.includes(\"select\")) {\n return \"Reads from database\";\n }\n if (\n callExpr.includes(\"execute\") ||\n callExpr.includes(\"insert\") ||\n callExpr.includes(\"update\") ||\n callExpr.includes(\"delete\")\n ) {\n return \"Writes to database\";\n }\n return \"Accesses database\";\n }\n\n /**\n * Convert name to component ID format\n */\n private toComponentId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_|_$/g, \"\");\n }\n\n /**\n * Remove duplicate relationships\n */\n private deduplicateRelationships(relationships: DetectedRelationship[]): DetectedRelationship[] {\n const seen = new Set<string>();\n const unique: DetectedRelationship[] = [];\n\n for (const rel of relationships) {\n const key = `${rel.from}->${rel.to}`;\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(rel);\n }\n }\n\n return unique;\n }\n}\n"
|
|
15
15
|
],
|
|
16
|
-
"mappings": "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",
|
|
17
|
-
"debugId": "
|
|
16
|
+
"mappings": "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",
|
|
17
|
+
"debugId": "30BEA370D0E300CD64756E2164756E21",
|
|
18
18
|
"names": []
|
|
19
19
|
}
|