{"version":3,"sources":["../src/index.ts","../src/extractors/openapi.ts","../src/generators/typescript.ts","../src/generators/api-client.ts","../src/generators/react-hooks.ts","../src/generators/ai-hooks.ts","../src/cache.ts","../src/type-sync.ts","../../../node_modules/.pnpm/diff@8.0.2/node_modules/diff/libesm/diff/base.js","../../../node_modules/.pnpm/diff@8.0.2/node_modules/diff/libesm/diff/line.js","../src/orchestrator.ts","../src/errors.ts","../src/watcher.ts","../src/utils/fetchWithRetry.ts"],"sourcesContent":["// packages/core/src/codegen/type-sync/index.ts\r\nexport { TypeSyncOrchestrator } from \"./orchestrator\";\r\nexport { TypeSyncWatcher } from \"./watcher\";\r\nexport { GenerationCache } from \"./cache\";\r\nexport { TypeDiffer } from \"./type-sync\";\r\nexport { OpenAPIExtractor } from \"./extractors/openapi\";\r\nexport { fetchWithRetry } from \"./utils/fetchWithRetry\";\r\nexport { TypeScriptGenerator } from \"./generators/typescript\";\r\nexport type { TypeScriptGenerationOptions } from \"./generators/typescript\";\r\nexport { APIClientGenerator } from \"./generators/api-client\";\r\nexport type { APIClientGeneratorOptions } from \"./generators/api-client\";\r\nexport { ReactHookGenerator } from \"./generators/react-hooks\";\r\nexport type { ReactHookGeneratorOptions } from \"./generators/react-hooks\";\r\nexport { AIHookGenerator } from \"./generators/ai-hooks\";\r\nexport type { AIHookGeneratorOptions } from \"./generators/ai-hooks\";\r\nexport type {\r\n  SyncOptions,\r\n  SyncResult,\r\n  OpenAPISchema,\r\n} from \"@farm-framework/types\";\r\n","import { spawn, ChildProcess } from \"child_process\";\r\nimport fsExtra from \"fs-extra\";\r\nimport { join } from \"path\";\r\nimport { performance } from \"perf_hooks\";\r\n\r\nconst { readFile, writeFile, ensureDir, pathExists } = fsExtra;\r\n\r\nexport interface OpenAPIExtractionOptions {\r\n  include?: string[];\r\n  exclude?: string[];\r\n  host?: string;\r\n  port?: number;\r\n  timeout?: number;\r\n  retries?: number;\r\n  retryDelay?: number;\r\n  enableCache?: boolean;\r\n  cacheTimeout?: number;\r\n  serverStartupTime?: number;\r\n  healthCheckEndpoint?: string;\r\n  /** Custom sleep function for retry delays */\r\n  sleepFn?: (ms: number) => Promise<void>;\r\n}\r\n\r\nexport interface ExtractionResult {\r\n  schema: any;\r\n  source: \"running-server\" | \"temp-server\" | \"cache\" | \"static-file\";\r\n  extractionTime: number;\r\n  serverStartupTime?: number;\r\n  retryCount?: number;\r\n}\r\n\r\nexport class OpenAPIExtractor {\r\n  private options: Required<Omit<OpenAPIExtractionOptions, \"sleepFn\">> & {\r\n    sleepFn: (ms: number) => Promise<void>;\r\n  };\r\n  private runningServer?: ChildProcess;\r\n  private lastSchemaCache?: { schema: any; timestamp: number; path: string };\r\n\r\n  constructor(options: OpenAPIExtractionOptions = {}) {\r\n    this.options = {\r\n      host: \"localhost\",\r\n      port: 8000,\r\n      timeout: 30000,\r\n      retries: 3,\r\n      retryDelay: 2000,\r\n      enableCache: true,\r\n      cacheTimeout: 60000, // 1 minute\r\n      serverStartupTime: 5000,\r\n      healthCheckEndpoint: \"/health\",\r\n      sleepFn: (ms: number) => new Promise((r) => setTimeout(r, ms)),\r\n      include: [],\r\n      exclude: [],\r\n      ...options,\r\n    };\r\n  }\r\n\r\n  async extractFromFastAPI(\r\n    apiPath: string,\r\n    outputPath: string,\r\n    options: OpenAPIExtractionOptions = {}\r\n  ): Promise<ExtractionResult> {\r\n    const mergedOptions = { ...this.options, ...options };\r\n    const startTime = performance.now();\r\n\r\n    try {\r\n      await ensureDir(join(outputPath, \"..\"));\r\n\r\n      // Try extraction methods in order of preference\r\n      const extractionMethods = [\r\n        () => this.tryRunningServer(mergedOptions),\r\n        () => this.tryStaticFile(apiPath),\r\n        () => this.tryCachedSchema(outputPath, mergedOptions),\r\n        () =>\r\n          this.generateSchemaWithTempServer(apiPath, outputPath, mergedOptions),\r\n      ];\r\n\r\n      let lastError: Error | null = null;\r\n\r\n      for (const method of extractionMethods) {\r\n        try {\r\n          const result = await method();\r\n          if (result) {\r\n            const extractionTime = performance.now() - startTime;\r\n\r\n            // Save to output file\r\n            await writeFile(outputPath, JSON.stringify(result.schema, null, 2));\r\n\r\n            // Update cache\r\n            if (mergedOptions.enableCache && result.source !== \"cache\") {\r\n              this.lastSchemaCache = {\r\n                schema: result.schema,\r\n                timestamp: Date.now(),\r\n                path: outputPath,\r\n              };\r\n            }\r\n\r\n            return {\r\n              ...result,\r\n              extractionTime,\r\n            };\r\n          }\r\n        } catch (error) {\r\n          lastError = error as Error;\r\n          console.warn(\r\n            `Extraction method failed: ${error instanceof Error ? error.message : \"Unknown error\"}`\r\n          );\r\n        }\r\n      }\r\n\r\n      throw lastError || new Error(\"All extraction methods failed\");\r\n    } catch (error) {\r\n      throw new Error(\r\n        `Failed to extract OpenAPI schema: ${error instanceof Error ? error.message : \"Unknown error\"}`\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Try to fetch schema from already running server\r\n   */\r\n  private async tryRunningServer(\r\n    options: OpenAPIExtractionOptions\r\n  ): Promise<ExtractionResult | null> {\r\n    try {\r\n      // First check if server is healthy\r\n      if (options.healthCheckEndpoint) {\r\n        await this.checkServerHealth(options);\r\n      }\r\n\r\n      const schema = await this.fetchSchemaFromServer(options);\r\n      if (schema) {\r\n        return {\r\n          schema,\r\n          source: \"running-server\",\r\n          extractionTime: 0, // Will be set by caller\r\n        };\r\n      }\r\n    } catch (error) {\r\n      // Server not available, try other methods\r\n    }\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Try to load schema from static file (like openapi.json in repo)\r\n   */\r\n  private async tryStaticFile(\r\n    apiPath: string\r\n  ): Promise<ExtractionResult | null> {\r\n    const staticPaths = [\r\n      join(apiPath, \"openapi.json\"),\r\n      join(apiPath, \"src\", \"openapi.json\"),\r\n      join(apiPath, \"docs\", \"openapi.json\"),\r\n      join(apiPath, \"static\", \"openapi.json\"),\r\n    ];\r\n\r\n    for (const staticPath of staticPaths) {\r\n      try {\r\n        if (await pathExists(staticPath)) {\r\n          const content = await readFile(staticPath, \"utf8\");\r\n          const schema = JSON.parse(content);\r\n\r\n          // Basic validation\r\n          if (schema.openapi || schema.swagger) {\r\n            return {\r\n              schema,\r\n              source: \"static-file\",\r\n              extractionTime: 0,\r\n            };\r\n          }\r\n        }\r\n      } catch (error) {\r\n        // Continue to next path\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Try to use cached schema if recent enough\r\n   */\r\n  private async tryCachedSchema(\r\n    outputPath: string,\r\n    options: OpenAPIExtractionOptions\r\n  ): Promise<ExtractionResult | null> {\r\n    if (!options.enableCache) return null;\r\n\r\n    // Check memory cache first\r\n    if (\r\n      this.lastSchemaCache &&\r\n      this.lastSchemaCache.path === outputPath &&\r\n      Date.now() - this.lastSchemaCache.timestamp < options.cacheTimeout!\r\n    ) {\r\n      return {\r\n        schema: this.lastSchemaCache.schema,\r\n        source: \"cache\",\r\n        extractionTime: 0,\r\n      };\r\n    }\r\n\r\n    // Check if output file exists and is recent\r\n    try {\r\n      if (await pathExists(outputPath)) {\r\n        const stats = await fsExtra.stat(outputPath);\r\n        const fileAge = Date.now() - stats.mtime.getTime();\r\n\r\n        if (fileAge < options.cacheTimeout!) {\r\n          const content = await readFile(outputPath, \"utf8\");\r\n          const schema = JSON.parse(content);\r\n\r\n          // Update memory cache\r\n          this.lastSchemaCache = {\r\n            schema,\r\n            timestamp: stats.mtime.getTime(),\r\n            path: outputPath,\r\n          };\r\n\r\n          return {\r\n            schema,\r\n            source: \"cache\",\r\n            extractionTime: 0,\r\n          };\r\n        }\r\n      }\r\n    } catch (error) {\r\n      // Cache invalid, continue\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  /**\r\n   * Check if server is healthy before attempting schema extraction\r\n   */\r\n  private async checkServerHealth(\r\n    options: OpenAPIExtractionOptions\r\n  ): Promise<boolean> {\r\n    try {\r\n      const healthUrl = `http://${options.host}:${options.port}${options.healthCheckEndpoint}`;\r\n      const controller = new AbortController();\r\n      const timeoutId = setTimeout(() => controller.abort(), 5000);\r\n\r\n      const response = await fetch(healthUrl, {\r\n        signal: controller.signal,\r\n        headers: { Accept: \"application/json\" },\r\n      });\r\n\r\n      clearTimeout(timeoutId);\r\n      return response.ok;\r\n    } catch (error) {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Fetch schema from running server with retries\r\n   */\r\n  private async fetchSchemaFromServer(\r\n    options: OpenAPIExtractionOptions\r\n  ): Promise<any | null> {\r\n    let lastError: Error | null = null;\r\n\r\n    for (let attempt = 0; attempt <= options.retries!; attempt++) {\r\n      try {\r\n        const url = `http://${options.host}:${options.port}/openapi.json`;\r\n        const controller = new AbortController();\r\n        const timeoutId = setTimeout(() => controller.abort(), options.timeout);\r\n\r\n        const response = await fetch(url, {\r\n          signal: controller.signal,\r\n          headers: {\r\n            Accept: \"application/json\",\r\n            \"User-Agent\": \"FARM-TypeSync/1.0\",\r\n          },\r\n        });\r\n\r\n        clearTimeout(timeoutId);\r\n\r\n        if (response.ok) {\r\n          const schema = await response.json();\r\n\r\n          // Basic validation\r\n          if (!schema.openapi && !schema.swagger) {\r\n            throw new Error(\"Invalid OpenAPI schema format\");\r\n          }\r\n\r\n          return schema;\r\n        } else {\r\n          throw new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n        }\r\n      } catch (error) {\r\n        lastError = error as Error;\r\n\r\n        if (attempt < options.retries!) {\r\n          console.warn(\r\n            `Schema fetch attempt ${attempt + 1} failed, retrying in ${options.retryDelay}ms...`\r\n          );\r\n          await this.delay(options.retryDelay!);\r\n        }\r\n      }\r\n    }\r\n\r\n    throw lastError || new Error(\"Failed to fetch schema after all retries\");\r\n  }\r\n\r\n  /**\r\n   * Generate schema by starting temporary server\r\n   */\r\n  private async generateSchemaWithTempServer(\r\n    apiPath: string,\r\n    outputPath: string,\r\n    options: OpenAPIExtractionOptions\r\n  ): Promise<ExtractionResult> {\r\n    const serverStartTime = performance.now();\r\n    let serverProcess: ChildProcess | null = null;\r\n\r\n    return new Promise((resolve, reject) => {\r\n      try {\r\n        // Find Python executable\r\n        const pythonCmd = this.findPythonExecutable();\r\n\r\n        // Start server\r\n        serverProcess = spawn(\r\n          pythonCmd,\r\n          [\r\n            \"-m\",\r\n            \"uvicorn\",\r\n            \"src.main:app\",\r\n            \"--host\",\r\n            options.host || \"localhost\",\r\n            \"--port\",\r\n            String(options.port || 8000),\r\n            \"--log-level\",\r\n            \"error\", // Reduce noise\r\n          ],\r\n          {\r\n            cwd: apiPath,\r\n            stdio: [\"ignore\", \"pipe\", \"pipe\"],\r\n            detached: false,\r\n          }\r\n        );\r\n\r\n        this.runningServer = serverProcess;\r\n\r\n        // Handle server errors\r\n        serverProcess.on(\"error\", (error) => {\r\n          reject(new Error(`Failed to start server: ${error.message}`));\r\n        });\r\n\r\n        // Wait for server startup then fetch schema\r\n        setTimeout(async () => {\r\n          try {\r\n            const serverStartupTime = performance.now() - serverStartTime;\r\n            const schema = await this.fetchSchemaFromServer(options);\r\n\r\n            if (schema) {\r\n              resolve({\r\n                schema,\r\n                source: \"temp-server\",\r\n                extractionTime: 0, // Will be set by caller\r\n                serverStartupTime,\r\n                retryCount: 0,\r\n              });\r\n            } else {\r\n              reject(new Error(\"Failed to fetch schema from temporary server\"));\r\n            }\r\n          } catch (err) {\r\n            reject(err);\r\n          } finally {\r\n            this.cleanupServer(serverProcess);\r\n          }\r\n        }, options.serverStartupTime);\r\n\r\n        // Cleanup timeout\r\n        setTimeout(() => {\r\n          if (serverProcess && !serverProcess.killed) {\r\n            this.cleanupServer(serverProcess);\r\n            reject(new Error(\"Server startup timeout\"));\r\n          }\r\n        }, options.timeout);\r\n      } catch (error) {\r\n        if (serverProcess) {\r\n          this.cleanupServer(serverProcess);\r\n        }\r\n        reject(error);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Find available Python executable\r\n   */\r\n  private findPythonExecutable(): string {\r\n    const candidates = [\"python3\", \"python\", \"py\"];\r\n\r\n    // On Windows, prefer 'py' launcher\r\n    if (process.platform === \"win32\") {\r\n      return \"py\";\r\n    }\r\n\r\n    return \"python3\";\r\n  }\r\n\r\n  /**\r\n   * Clean up server process\r\n   */\r\n  private cleanupServer(serverProcess: ChildProcess | null): void {\r\n    if (serverProcess && !serverProcess.killed) {\r\n      try {\r\n        serverProcess.kill(\"SIGTERM\");\r\n\r\n        // Force kill after delay if not terminated\r\n        setTimeout(() => {\r\n          if (serverProcess && !serverProcess.killed) {\r\n            serverProcess.kill(\"SIGKILL\");\r\n          }\r\n        }, 3000);\r\n      } catch (error) {\r\n        console.warn(\"Error cleaning up server process:\", error);\r\n      }\r\n    }\r\n\r\n    if (this.runningServer === serverProcess) {\r\n      this.runningServer = undefined;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Delay utility\r\n   */\r\n  private delay(ms: number): Promise<void> {\r\n    return this.options.sleepFn(ms);\r\n  }\r\n\r\n  /**\r\n   * Cleanup any running servers\r\n   */\r\n  async cleanup(): Promise<void> {\r\n    if (this.runningServer) {\r\n      this.cleanupServer(this.runningServer);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Clear cached schema\r\n   */\r\n  clearCache(): void {\r\n    this.lastSchemaCache = undefined;\r\n  }\r\n}\r\n","import fs from \"fs-extra\";\r\nimport path from \"path\";\r\nimport crypto from \"crypto\";\r\nimport type { OpenAPISchema } from \"@farm-framework/types\";\r\n\r\nexport interface TypeScriptGenerationOptions {\r\n  outputDir: string;\r\n  generateComments?: boolean;\r\n  enumType?: \"string\" | \"number\" | \"const\" | \"union\";\r\n  dateType?: \"string\" | \"Date\";\r\n  fileNaming?: \"camelCase\" | \"kebab-case\" | \"snake_case\";\r\n  cleanOrphans?: boolean;\r\n  metadataFile?: string;\r\n  strict?: boolean;\r\n  exportStyle?: \"named\" | \"default\" | \"both\";\r\n}\r\n\r\nexport interface GenerationResult {\r\n  path: string;\r\n  content?: string;\r\n  size?: number;\r\n  checksum?: string;\r\n  generatedAt?: Date;\r\n  type?: string;\r\n}\r\n\r\n/**\r\n * Generates raw TypeScript type declarations from an OpenAPI schema.\r\n */\r\nexport class TypeScriptGenerator {\r\n  private options: TypeScriptGenerationOptions;\r\n\r\n  constructor(options?: Partial<TypeScriptGenerationOptions>) {\r\n    this.options = {\r\n      outputDir: \"./src/types\",\r\n      generateComments: true,\r\n      enumType: \"union\",\r\n      dateType: \"string\",\r\n      fileNaming: \"camelCase\",\r\n      cleanOrphans: true,\r\n      metadataFile: \"generation-metadata.json\",\r\n      strict: true,\r\n      exportStyle: \"named\",\r\n      ...options,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Generate the type declaration file.\r\n   *\r\n   * @param schema - Parsed OpenAPI schema\r\n   * @param opts - Generation options\r\n   * @returns Path to the generated file\r\n   */\r\n  async generate(\r\n    schema: OpenAPISchema,\r\n    opts: TypeScriptGenerationOptions\r\n  ): Promise<GenerationResult> {\r\n    const finalOpts = { ...this.options, ...opts };\r\n    await fs.ensureDir(finalOpts.outputDir);\r\n\r\n    const content = await this.generateTypesContent(schema, finalOpts);\r\n    const outPath = path.join(finalOpts.outputDir, \"types.ts\");\r\n\r\n    await fs.writeFile(outPath, content);\r\n\r\n    return {\r\n      path: outPath,\r\n      content,\r\n      size: content.length,\r\n      checksum: this.generateChecksum(content),\r\n      generatedAt: new Date(),\r\n      type: \"typescript\",\r\n    };\r\n  }\r\n\r\n  private async generateTypesContent(\r\n    schema: OpenAPISchema,\r\n    opts: TypeScriptGenerationOptions\r\n  ): Promise<string> {\r\n    let content = \"\";\r\n\r\n    // Add file header\r\n    if (opts.generateComments) {\r\n      content += `/**\\n * Generated TypeScript types from OpenAPI schema\\n * Generated at: ${new Date().toISOString()}\\n * DO NOT EDIT - This file is auto-generated\\n */\\n\\n`;\r\n    }\r\n\r\n    // Generate interfaces from components/schemas\r\n    if (schema.components?.schemas) {\r\n      const sortedSchemas = this.sortSchemasByDependencies(\r\n        schema.components.schemas\r\n      );\r\n\r\n      for (const [name, schemaObj] of sortedSchemas) {\r\n        content += this.generateInterface(name, schemaObj as any, opts);\r\n        content += \"\\n\";\r\n      }\r\n    }\r\n\r\n    // Generate API operation types\r\n    if (schema.paths) {\r\n      content += this.generateApiTypes(schema.paths, opts);\r\n    }\r\n\r\n    // Add common utility types\r\n    content += this.generateCommonTypes(opts);\r\n\r\n    return content;\r\n  }\r\n\r\n  private generateInterface(\r\n    name: string,\r\n    schema: any,\r\n    opts: TypeScriptGenerationOptions\r\n  ): string {\r\n    let content = \"\";\r\n\r\n    if (opts.generateComments && schema.description) {\r\n      content += `/**\\n * ${schema.description}\\n */\\n`;\r\n    }\r\n\r\n    // Handle enums\r\n    if (schema.enum && opts.enumType === \"union\") {\r\n      const values = schema.enum.map((v: any) => `\"${v}\"`).join(\" | \");\r\n      content += `export type ${name} = ${values};\\n`;\r\n      return content;\r\n    }\r\n\r\n    content += `export interface ${name} {\\n`;\r\n\r\n    if (schema.properties) {\r\n      for (const [propName, propSchema] of Object.entries(\r\n        schema.properties as any\r\n      )) {\r\n        const optional = !schema.required?.includes(propName) ? \"?\" : \"\";\r\n        const type = this.mapSchemaType(propSchema as any, opts);\r\n\r\n        if (opts.generateComments && (propSchema as any).description) {\r\n          content += `  /** ${(propSchema as any).description} */\\n`;\r\n        }\r\n\r\n        content += `  ${propName}${optional}: ${type};\\n`;\r\n      }\r\n    }\r\n\r\n    content += \"}\\n\";\r\n    return content;\r\n  }\r\n\r\n  private generateApiTypes(\r\n    paths: Record<string, any>,\r\n    opts: TypeScriptGenerationOptions\r\n  ): string {\r\n    let content = \"\";\r\n\r\n    if (opts.generateComments) {\r\n      content += `/**\\n * API Operation Types\\n */\\n\\n`;\r\n    }\r\n    for (const [path, methods] of Object.entries(paths)) {\r\n      for (const [method, operation] of Object.entries(methods as any)) {\r\n        const operationDef = operation as any;\r\n        const operationId =\r\n          operationDef.operationId || this.generateOperationId(method, path);\r\n\r\n        // Generate request type\r\n        content += this.generateRequestType(operationId, operationDef, opts);\r\n\r\n        // Generate response type\r\n        content += this.generateResponseType(operationId, operationDef, opts);\r\n      }\r\n    }\r\n\r\n    return content;\r\n  }\r\n\r\n  private generateRequestType(\r\n    operationId: string,\r\n    operation: any,\r\n    opts: TypeScriptGenerationOptions\r\n  ): string {\r\n    let content = \"\";\r\n\r\n    if (opts.generateComments) {\r\n      content += `/** Request type for ${operationId} */\\n`;\r\n    }\r\n\r\n    content += `export interface ${this.capitalize(operationId)}Request {\\n`;\r\n\r\n    // Parameters\r\n    if (operation.parameters) {\r\n      for (const param of operation.parameters) {\r\n        const optional = !param.required ? \"?\" : \"\";\r\n        const type = this.mapSchemaType(\r\n          param.schema || { type: \"string\" },\r\n          opts\r\n        );\r\n        content += `  ${param.name}${optional}: ${type};\\n`;\r\n      }\r\n    }\r\n\r\n    // Request body\r\n    if (operation.requestBody?.content?.[\"application/json\"]?.schema) {\r\n      const schema = operation.requestBody.content[\"application/json\"].schema;\r\n      const type = this.mapSchemaType(schema, opts);\r\n      content += `  body: ${type};\\n`;\r\n    }\r\n\r\n    content += \"}\\n\\n\";\r\n    return content;\r\n  }\r\n\r\n  private generateResponseType(\r\n    operationId: string,\r\n    operation: any,\r\n    opts: TypeScriptGenerationOptions\r\n  ): string {\r\n    let content = \"\";\r\n\r\n    if (opts.generateComments) {\r\n      content += `/** Response type for ${operationId} */\\n`;\r\n    }\r\n\r\n    const successResponse =\r\n      operation.responses?.[\"200\"] || operation.responses?.[\"201\"];\r\n\r\n    if (successResponse?.content?.[\"application/json\"]?.schema) {\r\n      const schema = successResponse.content[\"application/json\"].schema;\r\n      const type = this.mapSchemaType(schema, opts);\r\n      content += `export type ${this.capitalize(operationId)}Response = ${type};\\n\\n`;\r\n    } else {\r\n      content += `export type ${this.capitalize(operationId)}Response = void;\\n\\n`;\r\n    }\r\n\r\n    return content;\r\n  }\r\n\r\n  private mapSchemaType(\r\n    schema: any,\r\n    opts: TypeScriptGenerationOptions\r\n  ): string {\r\n    if (schema.$ref) {\r\n      return schema.$ref.split(\"/\").pop();\r\n    }\r\n\r\n    if (schema.allOf) {\r\n      return schema.allOf\r\n        .map((s: any) => this.mapSchemaType(s, opts))\r\n        .join(\" & \");\r\n    }\r\n\r\n    if (schema.oneOf || schema.anyOf) {\r\n      const union = schema.oneOf || schema.anyOf;\r\n      return union.map((s: any) => this.mapSchemaType(s, opts)).join(\" | \");\r\n    }\r\n\r\n    if (schema.enum && opts.enumType === \"union\") {\r\n      return schema.enum.map((v: any) => `\"${v}\"`).join(\" | \");\r\n    }\r\n\r\n    switch (schema.type) {\r\n      case \"string\":\r\n        if (schema.format === \"date-time\" && opts.dateType === \"Date\") {\r\n          return \"Date\";\r\n        }\r\n        return \"string\";\r\n      case \"number\":\r\n      case \"integer\":\r\n        return \"number\";\r\n      case \"boolean\":\r\n        return \"boolean\";\r\n      case \"array\":\r\n        return `Array<${this.mapSchemaType(schema.items, opts)}>`;\r\n      case \"object\":\r\n        if (schema.properties) {\r\n          // Inline object type\r\n          let objectType = \"{\\n\";\r\n          for (const [propName, propSchema] of Object.entries(\r\n            schema.properties\r\n          )) {\r\n            const optional = !schema.required?.includes(propName) ? \"?\" : \"\";\r\n            const type = this.mapSchemaType(propSchema as any, opts);\r\n            objectType += `    ${propName}${optional}: ${type};\\n`;\r\n          }\r\n          objectType += \"  }\";\r\n          return objectType;\r\n        }\r\n        return \"Record<string, any>\";\r\n      default:\r\n        return \"any\";\r\n    }\r\n  }\r\n  private generateCommonTypes(opts: TypeScriptGenerationOptions): string {\r\n    if (!opts.generateComments) return \"\";\r\n\r\n    return `\r\n/**\r\n * Common utility types\r\n * Note: PaginatedResponse, ApiError, and DeepPartial are imported from @farm-framework/types\r\n */\r\nimport type { PaginatedResponse, ApiError, DeepPartial } from \"@farm-framework/types\";\r\n`;\r\n  }\r\n\r\n  private sortSchemasByDependencies(\r\n    schemas: Record<string, any>\r\n  ): Array<[string, any]> {\r\n    const sorted: Array<[string, any]> = [];\r\n    const visited = new Set<string>();\r\n    const visiting = new Set<string>();\r\n\r\n    const visit = (name: string, schema: any) => {\r\n      if (visited.has(name)) return;\r\n      if (visiting.has(name)) return; // Circular dependency, skip\r\n\r\n      visiting.add(name);\r\n\r\n      // Find dependencies\r\n      const deps = this.findSchemaDependencies(schema);\r\n      for (const dep of deps) {\r\n        if (schemas[dep]) {\r\n          visit(dep, schemas[dep]);\r\n        }\r\n      }\r\n\r\n      visiting.delete(name);\r\n      visited.add(name);\r\n      sorted.push([name, schema]);\r\n    };\r\n\r\n    for (const [name, schema] of Object.entries(schemas)) {\r\n      visit(name, schema);\r\n    }\r\n\r\n    return sorted;\r\n  }\r\n\r\n  private findSchemaDependencies(schema: any): string[] {\r\n    const deps: string[] = [];\r\n\r\n    const traverse = (obj: any) => {\r\n      if (typeof obj !== \"object\" || obj === null) return;\r\n\r\n      if (obj.$ref && typeof obj.$ref === \"string\") {\r\n        const refName = obj.$ref.split(\"/\").pop();\r\n        if (refName) deps.push(refName);\r\n      }\r\n\r\n      if (Array.isArray(obj)) {\r\n        obj.forEach(traverse);\r\n      } else {\r\n        Object.values(obj).forEach(traverse);\r\n      }\r\n    };\r\n\r\n    traverse(schema);\r\n    return [...new Set(deps)];\r\n  }\r\n\r\n  private generateOperationId(method: string, path: string): string {\r\n    return `${method}${path.replace(/[^a-zA-Z0-9]/g, \"\")}`;\r\n  }\r\n\r\n  private capitalize(str: string): string {\r\n    return str.charAt(0).toUpperCase() + str.slice(1);\r\n  }\r\n\r\n  private generateChecksum(content: string): string {\r\n    return crypto.createHash(\"md5\").update(content).digest(\"hex\").slice(0, 8);\r\n  }\r\n}\r\n","import fs from \"fs-extra\";\r\nimport path from \"path\";\r\nimport crypto from \"crypto\";\r\nimport type { OpenAPISchema } from \"@farm-framework/types\";\r\n\r\nexport interface APIClientGeneratorOptions {\r\n  outputDir: string;\r\n  enableAI?: boolean;\r\n  outputFormat?: \"typescript\" | \"javascript\";\r\n  includeTypes?: boolean;\r\n  baseURL?: string;\r\n  authentication?: \"bearer\" | \"cookie\" | \"custom\";\r\n  enableInterceptors?: boolean;\r\n  enableStreaming?: boolean;\r\n}\r\n\r\nexport interface GenerationResult {\r\n  path: string;\r\n  content?: string;\r\n  size?: number;\r\n  checksum?: string;\r\n  generatedAt?: Date;\r\n  type?: string;\r\n}\r\n\r\n/**\r\n * Generates a typed API client based on the provided OpenAPI schema.\r\n */\r\nexport class APIClientGenerator {\r\n  private options: APIClientGeneratorOptions;\r\n\r\n  constructor(options?: Partial<APIClientGeneratorOptions>) {\r\n    this.options = {\r\n      outputDir: \"./src/api\",\r\n      enableAI: false,\r\n      outputFormat: \"typescript\",\r\n      includeTypes: true,\r\n      baseURL: \"http://localhost:8000\",\r\n      authentication: \"bearer\",\r\n      enableInterceptors: true,\r\n      enableStreaming: false,\r\n      ...options,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Generate the client file.\r\n   *\r\n   * @param schema - Parsed OpenAPI schema\r\n   * @param opts - Generation options\r\n   * @returns Path to the generated file\r\n   */\r\n  async generate(\r\n    schema: OpenAPISchema,\r\n    opts: APIClientGeneratorOptions\r\n  ): Promise<GenerationResult> {\r\n    const finalOpts = { ...this.options, ...opts };\r\n    await fs.ensureDir(finalOpts.outputDir);\r\n\r\n    const content = this.generateClientCode(schema, finalOpts);\r\n    const outPath = path.join(finalOpts.outputDir, \"client.ts\");\r\n\r\n    await fs.writeFile(outPath, content);\r\n\r\n    return {\r\n      path: outPath,\r\n      content,\r\n      size: content.length,\r\n      checksum: this.generateChecksum(content),\r\n      generatedAt: new Date(),\r\n      type: \"api-client\",\r\n    };\r\n  }\r\n\r\n  private generateClientCode(\r\n    schema: OpenAPISchema,\r\n    opts: APIClientGeneratorOptions\r\n  ): string {\r\n    const imports = this.generateImports(opts);\r\n    const classDefinition = this.generateClassDefinition(schema, opts);\r\n    const methods = this.generateMethods(schema, opts);\r\n    const exports = this.generateExports(opts);\r\n\r\n    return `${imports}\\n\\n${classDefinition}\\n${methods}\\n}\\n\\n${exports}`;\r\n  }\r\n\r\n  private generateImports(opts: APIClientGeneratorOptions): string {\r\n    let imports = `import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\\n`;\r\n\r\n    if (opts.includeTypes) {\r\n      imports += `import * as Types from './types';\\n`;\r\n    }\r\n\r\n    if (opts.enableStreaming) {\r\n      imports += `import { EventSource } from 'eventsource';\\n`;\r\n    }\r\n\r\n    return imports;\r\n  }\r\n\r\n  private generateClassDefinition(\r\n    schema: OpenAPISchema,\r\n    opts: APIClientGeneratorOptions\r\n  ): string {\r\n    const className = \"APIClient\";\r\n    const baseURL = opts.baseURL || \"http://localhost:8000\";\r\n\r\n    let classContent = `/**\\n * Auto-generated API client for ${schema.info?.title || \"API\"}\\n * Version: ${schema.info?.version || \"1.0.0\"}\\n */\\nexport class ${className} {\\n`;\r\n    classContent += `  private axios: AxiosInstance;\\n`;\r\n\r\n    if (opts.enableStreaming) {\r\n      classContent += `  private eventSources: Map<string, EventSource> = new Map();\\n`;\r\n    }\r\n\r\n    classContent += `\\n  constructor(baseURL: string = '${baseURL}', config?: AxiosRequestConfig) {\\n`;\r\n    classContent += `    this.axios = axios.create({\\n`;\r\n    classContent += `      baseURL,\\n`;\r\n    classContent += `      timeout: 30000,\\n`;\r\n    classContent += `      headers: {\\n`;\r\n    classContent += `        'Content-Type': 'application/json',\\n`;\r\n    classContent += `      },\\n`;\r\n    classContent += `      ...config,\\n`;\r\n    classContent += `    });\\n\\n`;\r\n\r\n    if (opts.enableInterceptors) {\r\n      classContent += this.generateInterceptors(opts);\r\n    }\r\n\r\n    classContent += `  }\\n`;\r\n\r\n    return classContent;\r\n  }\r\n\r\n  private generateInterceptors(opts: APIClientGeneratorOptions): string {\r\n    let interceptors = `    // Request interceptor for authentication\\n`;\r\n    interceptors += `    this.axios.interceptors.request.use(\\n`;\r\n    interceptors += `      (config) => {\\n`;\r\n\r\n    if (opts.authentication === \"bearer\") {\r\n      interceptors += `        const token = this.getAuthToken();\\n`;\r\n      interceptors += `        if (token) {\\n`;\r\n      interceptors += `          config.headers.Authorization = \\`Bearer \\${token}\\`;\\n`;\r\n      interceptors += `        }\\n`;\r\n    } else if (opts.authentication === \"cookie\") {\r\n      interceptors += `        // Cookie authentication handled by browser\\n`;\r\n    }\r\n\r\n    interceptors += `        return config;\\n`;\r\n    interceptors += `      },\\n`;\r\n    interceptors += `      (error) => Promise.reject(error)\\n`;\r\n    interceptors += `    );\\n\\n`;\r\n\r\n    interceptors += `    // Response interceptor for error handling\\n`;\r\n    interceptors += `    this.axios.interceptors.response.use(\\n`;\r\n    interceptors += `      (response) => response,\\n`;\r\n    interceptors += `      (error) => {\\n`;\r\n    interceptors += `        if (error.response?.status === 401) {\\n`;\r\n    interceptors += `          this.handleAuthError();\\n`;\r\n    interceptors += `        }\\n`;\r\n    interceptors += `        return Promise.reject(error);\\n`;\r\n    interceptors += `      }\\n`;\r\n    interceptors += `    );\\n\\n`;\r\n\r\n    return interceptors;\r\n  }\r\n\r\n  private generateMethods(\r\n    schema: OpenAPISchema,\r\n    opts: APIClientGeneratorOptions\r\n  ): string {\r\n    let methods = \"\";\r\n\r\n    // Generate utility methods\r\n    methods += this.generateUtilityMethods(opts);\r\n\r\n    // Generate API methods from paths\r\n    if (schema.paths) {\r\n      for (const [path, pathItem] of Object.entries(schema.paths)) {\r\n        if (pathItem) {\r\n          methods += this.generatePathMethods(path, pathItem as any, opts);\r\n        }\r\n      }\r\n    }\r\n\r\n    return methods;\r\n  }\r\n\r\n  private generateUtilityMethods(opts: APIClientGeneratorOptions): string {\r\n    let methods = \"\";\r\n\r\n    if (opts.authentication === \"bearer\") {\r\n      methods += `\\n  private getAuthToken(): string | null {\\n`;\r\n      methods += `    return localStorage.getItem('auth_token') || sessionStorage.getItem('auth_token');\\n`;\r\n      methods += `  }\\n\\n`;\r\n\r\n      methods += `  public setAuthToken(token: string, persistent: boolean = true): void {\\n`;\r\n      methods += `    if (persistent) {\\n`;\r\n      methods += `      localStorage.setItem('auth_token', token);\\n`;\r\n      methods += `    } else {\\n`;\r\n      methods += `      sessionStorage.setItem('auth_token', token);\\n`;\r\n      methods += `    }\\n`;\r\n      methods += `  }\\n\\n`;\r\n\r\n      methods += `  public clearAuthToken(): void {\\n`;\r\n      methods += `    localStorage.removeItem('auth_token');\\n`;\r\n      methods += `    sessionStorage.removeItem('auth_token');\\n`;\r\n      methods += `  }\\n\\n`;\r\n    }\r\n\r\n    methods += `  private handleAuthError(): void {\\n`;\r\n    methods += `    this.clearAuthToken();\\n`;\r\n    methods += `    // Emit auth error event or redirect to login\\n`;\r\n    methods += `    window.dispatchEvent(new CustomEvent('auth-error'));\\n`;\r\n    methods += `  }\\n\\n`;\r\n\r\n    if (opts.enableStreaming) {\r\n      methods += this.generateStreamingMethods();\r\n    }\r\n\r\n    return methods;\r\n  }\r\n\r\n  private generateStreamingMethods(): string {\r\n    return (\r\n      `\\n  public createEventStream(path: string, onMessage: (data: any) => void, onError?: (error: Event) => void): string {\\n` +\r\n      `    const streamId = \\`stream_\\${Date.now()}_\\${Math.random().toString(36).substr(2, 9)}\\`;\\n` +\r\n      `    const eventSource = new EventSource(\\`\\${this.axios.defaults.baseURL}\\${path}\\`);\\n` +\r\n      `    \\n` +\r\n      `    eventSource.onmessage = (event) => {\\n` +\r\n      `      try {\\n` +\r\n      `        const data = JSON.parse(event.data);\\n` +\r\n      `        onMessage(data);\\n` +\r\n      `      } catch (error) {\\n` +\r\n      `        console.error('Failed to parse SSE data:', error);\\n` +\r\n      `      }\\n` +\r\n      `    };\\n` +\r\n      `    \\n` +\r\n      `    eventSource.onerror = (error) => {\\n` +\r\n      `      if (onError) onError(error);\\n` +\r\n      `      this.closeEventStream(streamId);\\n` +\r\n      `    };\\n` +\r\n      `    \\n` +\r\n      `    this.eventSources.set(streamId, eventSource);\\n` +\r\n      `    return streamId;\\n` +\r\n      `  }\\n\\n` +\r\n      `  public closeEventStream(streamId: string): void {\\n` +\r\n      `    const eventSource = this.eventSources.get(streamId);\\n` +\r\n      `    if (eventSource) {\\n` +\r\n      `      eventSource.close();\\n` +\r\n      `      this.eventSources.delete(streamId);\\n` +\r\n      `    }\\n` +\r\n      `  }\\n\\n`\r\n    );\r\n  }\r\n\r\n  private generatePathMethods(\r\n    path: string,\r\n    pathItem: any,\r\n    opts: APIClientGeneratorOptions\r\n  ): string {\r\n    let methods = \"\";\r\n    const httpMethods = [\"get\", \"post\", \"put\", \"delete\", \"patch\"] as const;\r\n\r\n    for (const method of httpMethods) {\r\n      const operation = pathItem[method];\r\n      if (operation) {\r\n        // Skip AI-specific endpoints if AI is not enabled\r\n        if (!opts.enableAI && this.isAIEndpoint(path, operation)) {\r\n          continue;\r\n        }\r\n\r\n        const methodName = this.generateMethodName(method, path, operation);\r\n        const parameters = this.generateMethodParameters(operation);\r\n        const returnType = this.generateReturnType(operation);\r\n        const methodCall = this.generateMethodCall(method, path, operation);\r\n\r\n        methods += `\\n  /**\\n   * ${operation.summary || `${method.toUpperCase()} ${path}`}\\n   */\\n`;\r\n        methods += `  async ${methodName}(${parameters}): Promise<${returnType}> {\\n`;\r\n        methods += `    const response = await this.axios.${method}${methodCall};\\n`;\r\n        methods += `    return response.data;\\n`;\r\n        methods += `  }\\n`;\r\n      }\r\n    }\r\n\r\n    return methods;\r\n  }\r\n\r\n  private generateMethodName(\r\n    method: string,\r\n    path: string,\r\n    operation: any\r\n  ): string {\r\n    if (operation.operationId) {\r\n      return operation.operationId;\r\n    }\r\n\r\n    // Generate method name from path and HTTP method\r\n    const pathParts = path\r\n      .split(\"/\")\r\n      .filter((part) => part && !part.startsWith(\"{\"))\r\n      .map((part) => part.replace(/[^a-zA-Z0-9]/g, \"\"));\r\n\r\n    const pathName = pathParts.length > 0 ? pathParts.join(\"\") : \"endpoint\";\r\n    return `${method}${pathName.charAt(0).toUpperCase() + pathName.slice(1)}`;\r\n  }\r\n\r\n  private generateMethodParameters(operation: any): string {\r\n    const params: string[] = [];\r\n\r\n    // Path parameters\r\n    if (operation.parameters) {\r\n      for (const param of operation.parameters) {\r\n        if (param.in === \"path\") {\r\n          params.push(`${param.name}: string | number`);\r\n        }\r\n      }\r\n    }\r\n\r\n    // Query parameters\r\n    const queryParams = operation.parameters?.filter(\r\n      (p: any) => p.in === \"query\"\r\n    );\r\n    if (queryParams && queryParams.length > 0) {\r\n      params.push(\r\n        `params?: { ${queryParams.map((p: any) => `${p.name}?: any`).join(\"; \")} }`\r\n      );\r\n    }\r\n\r\n    // Request body\r\n    if (operation.requestBody?.content?.[\"application/json\"]) {\r\n      params.push(`data?: any`);\r\n    }\r\n\r\n    // Config parameter\r\n    params.push(`config?: AxiosRequestConfig`);\r\n\r\n    return params.join(\", \");\r\n  }\r\n\r\n  private generateReturnType(operation: any): string {\r\n    const successResponse =\r\n      operation.responses?.[\"200\"] || operation.responses?.[\"201\"];\r\n    if (successResponse?.content?.[\"application/json\"]) {\r\n      return \"any\"; // Could be enhanced to use actual types\r\n    }\r\n    return \"void\";\r\n  }\r\n\r\n  private generateMethodCall(\r\n    method: string,\r\n    path: string,\r\n    operation: any\r\n  ): string {\r\n    const pathParams =\r\n      operation.parameters?.filter((p: any) => p.in === \"path\") || [];\r\n    let processedPath = path;\r\n\r\n    // Replace path parameters\r\n    for (const param of pathParams) {\r\n      processedPath = processedPath.replace(\r\n        `{${param.name}}`,\r\n        `\\${${param.name}}`\r\n      );\r\n    }\r\n\r\n    const args: string[] = [`\\`${processedPath}\\``];\r\n\r\n    if (method === \"post\" || method === \"put\" || method === \"patch\") {\r\n      args.push(\"data\");\r\n    }\r\n\r\n    // Add config parameter\r\n    const configObj: string[] = [];\r\n\r\n    const queryParams = operation.parameters?.filter(\r\n      (p: any) => p.in === \"query\"\r\n    );\r\n    if (queryParams && queryParams.length > 0) {\r\n      configObj.push(\"params\");\r\n    }\r\n\r\n    if (configObj.length > 0) {\r\n      args.push(`{ ${configObj.join(\", \")}, ...config }`);\r\n    } else {\r\n      args.push(\"config\");\r\n    }\r\n\r\n    return `(${args.join(\", \")})`;\r\n  }\r\n\r\n  private isAIEndpoint(path: string, operation: any): boolean {\r\n    const aiKeywords = [\r\n      \"ai\",\r\n      \"chat\",\r\n      \"completion\",\r\n      \"model\",\r\n      \"llm\",\r\n      \"embedding\",\r\n    ];\r\n    const fullPath =\r\n      `${path} ${operation.summary || \"\"} ${operation.description || \"\"}`.toLowerCase();\r\n    return aiKeywords.some((keyword) => fullPath.includes(keyword));\r\n  }\r\n\r\n  private generateExports(opts: APIClientGeneratorOptions): string {\r\n    return `export default APIClient;\\n`;\r\n  }\r\n\r\n  private generateChecksum(content: string): string {\r\n    return crypto.createHash(\"md5\").update(content).digest(\"hex\").slice(0, 8);\r\n  }\r\n}\r\n","import fs from \"fs-extra\";\r\nimport path from \"path\";\r\nimport crypto from \"crypto\";\r\nimport type { OpenAPISchema } from \"@farm-framework/types\";\r\n\r\nexport interface ReactHookGeneratorOptions {\r\n  outputDir: string;\r\n  apiClientImportPath?: string;\r\n  typesImportPath?: string;\r\n  enableAI?: boolean;\r\n  enableInfiniteQueries?: boolean;\r\n  enableOptimisticUpdates?: boolean;\r\n}\r\n\r\nexport interface GenerationResult {\r\n  path: string;\r\n  content?: string;\r\n  size?: number;\r\n  checksum?: string;\r\n  generatedAt?: Date;\r\n  type?: string;\r\n}\r\n\r\ninterface GeneratedHook {\r\n  name: string;\r\n  type: \"query\" | \"mutation\" | \"infiniteQuery\";\r\n  method: string;\r\n  path: string;\r\n  operationId: string;\r\n  requestType?: string;\r\n  responseType: string;\r\n  pathParams?: string[];\r\n  queryParams?: string[];\r\n}\r\n\r\n/**\r\n * Generates typed React hooks for interacting with the generated API client.\r\n */\r\nexport class ReactHookGenerator {\r\n  private options: ReactHookGeneratorOptions;\r\n\r\n  constructor(options?: Partial<ReactHookGeneratorOptions>) {\r\n    this.options = {\r\n      outputDir: \"./src/hooks\",\r\n      apiClientImportPath: \"../api/client\",\r\n      typesImportPath: \"../api/types\",\r\n      enableAI: false,\r\n      enableInfiniteQueries: true,\r\n      enableOptimisticUpdates: true,\r\n      ...options,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Generate hook source files.\r\n   *\r\n   * @param schema - Parsed OpenAPI schema\r\n   * @param opts - Generation options\r\n   * @returns Path to the generated file\r\n   */\r\n  async generate(\r\n    schema: OpenAPISchema,\r\n    opts: ReactHookGeneratorOptions\r\n  ): Promise<GenerationResult> {\r\n    const finalOpts = { ...this.options, ...opts };\r\n    await fs.ensureDir(finalOpts.outputDir);\r\n\r\n    const hooks = this.extractHooksFromSchema(schema, finalOpts);\r\n    const content = this.generateHooksContent(hooks, finalOpts);\r\n    const outPath = path.join(finalOpts.outputDir, \"hooks.ts\");\r\n\r\n    await fs.writeFile(outPath, content);\r\n\r\n    return {\r\n      path: outPath,\r\n      content,\r\n      size: content.length,\r\n      checksum: this.generateChecksum(content),\r\n      generatedAt: new Date(),\r\n      type: \"react-hooks\",\r\n    };\r\n  }\r\n\r\n  private extractHooksFromSchema(\r\n    schema: OpenAPISchema,\r\n    opts: ReactHookGeneratorOptions\r\n  ): GeneratedHook[] {\r\n    const hooks: GeneratedHook[] = [];\r\n\r\n    if (schema.paths) {\r\n      for (const [path, pathItem] of Object.entries(schema.paths)) {\r\n        if (!pathItem) continue;\r\n\r\n        for (const [method, operation] of Object.entries(pathItem)) {\r\n          if (!operation || typeof operation !== \"object\") continue;\r\n\r\n          // Skip AI-specific endpoints if AI is not enabled\r\n          if (!opts.enableAI && this.isAIEndpoint(path, operation)) {\r\n            continue;\r\n          }\r\n\r\n          const hook = this.createHookFromOperation(\r\n            method,\r\n            path,\r\n            operation as any,\r\n            opts\r\n          );\r\n          if (hook) {\r\n            hooks.push(hook);\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return hooks;\r\n  }\r\n\r\n  private createHookFromOperation(\r\n    method: string,\r\n    path: string,\r\n    operation: any,\r\n    opts: ReactHookGeneratorOptions\r\n  ): GeneratedHook | null {\r\n    const isQuery = method.toLowerCase() === \"get\";\r\n    const isMutation = [\"post\", \"put\", \"patch\", \"delete\"].includes(\r\n      method.toLowerCase()\r\n    );\r\n\r\n    if (!isQuery && !isMutation) return null;\r\n\r\n    const operationId =\r\n      operation.operationId || this.generateOperationId(method, path);\r\n    const pathParams = this.extractPathParameters(path);\r\n    const queryParams = this.extractQueryParameters(operation);\r\n\r\n    // Determine if this should be an infinite query\r\n    const isInfiniteQuery =\r\n      isQuery &&\r\n      opts.enableInfiniteQueries &&\r\n      this.isInfiniteQueryCandidate(operation, path);\r\n\r\n    return {\r\n      name: this.generateHookName(\r\n        operationId,\r\n        isInfiniteQuery ? \"infiniteQuery\" : isQuery ? \"query\" : \"mutation\"\r\n      ),\r\n      type: isInfiniteQuery ? \"infiniteQuery\" : isQuery ? \"query\" : \"mutation\",\r\n      method: method.toLowerCase(),\r\n      path,\r\n      operationId,\r\n      requestType: this.getRequestType(operation),\r\n      responseType: this.getResponseType(operation),\r\n      pathParams,\r\n      queryParams,\r\n    };\r\n  }\r\n\r\n  private generateHooksContent(\r\n    hooks: GeneratedHook[],\r\n    opts: ReactHookGeneratorOptions\r\n  ): string {\r\n    let content = this.generateImports(opts);\r\n    content += \"\\n\\n\";\r\n\r\n    // Group hooks by domain/resource\r\n    const hookGroups = this.groupHooksByDomain(hooks);\r\n\r\n    for (const [domain, domainHooks] of hookGroups) {\r\n      content += `// ${domain} hooks\\n`;\r\n\r\n      for (const hook of domainHooks) {\r\n        content += this.generateHookImplementation(hook, opts);\r\n        content += \"\\n\";\r\n      }\r\n\r\n      content += \"\\n\";\r\n    }\r\n\r\n    return content;\r\n  }\r\n\r\n  private generateImports(opts: ReactHookGeneratorOptions): string {\r\n    let imports = `import { useQuery, useMutation, useQueryClient, useInfiniteQuery } from '@tanstack/react-query';\\n`;\r\n\r\n    if (opts.apiClientImportPath) {\r\n      imports += `import { APIClient } from '${opts.apiClientImportPath}';\\n`;\r\n    }\r\n\r\n    if (opts.typesImportPath) {\r\n      imports += `import * as Types from '${opts.typesImportPath}';\\n`;\r\n    }\r\n\r\n    imports += `\\n// Create a default API client instance\\n`;\r\n    imports += `const apiClient = new APIClient();\\n`;\r\n\r\n    return imports;\r\n  }\r\n\r\n  private generateHookImplementation(\r\n    hook: GeneratedHook,\r\n    opts: ReactHookGeneratorOptions\r\n  ): string {\r\n    switch (hook.type) {\r\n      case \"query\":\r\n        return this.generateQueryHook(hook, opts);\r\n      case \"infiniteQuery\":\r\n        return this.generateInfiniteQueryHook(hook, opts);\r\n      case \"mutation\":\r\n        return this.generateMutationHook(hook, opts);\r\n      default:\r\n        return \"\";\r\n    }\r\n  }\r\n\r\n  private generateQueryHook(\r\n    hook: GeneratedHook,\r\n    opts: ReactHookGeneratorOptions\r\n  ): string {\r\n    const params = this.generateHookParameters(hook);\r\n    const queryKey = this.generateQueryKey(hook);\r\n    const queryFn = this.generateQueryFunction(hook);\r\n\r\n    let hookContent = `export function ${hook.name}(${params}) {\\n`;\r\n    hookContent += `  return useQuery({\\n`;\r\n    hookContent += `    queryKey: ${queryKey},\\n`;\r\n    hookContent += `    queryFn: ${queryFn},\\n`;\r\n\r\n    // Add conditional enabling for hooks with required parameters\r\n    if (hook.pathParams && hook.pathParams.length > 0) {\r\n      const enabledCondition = hook.pathParams\r\n        .map((param) => `!!${param}`)\r\n        .join(\" && \");\r\n      hookContent += `    enabled: ${enabledCondition},\\n`;\r\n    }\r\n\r\n    hookContent += `    ...options,\\n`;\r\n    hookContent += `  });\\n`;\r\n    hookContent += `}\\n`;\r\n\r\n    return hookContent;\r\n  }\r\n\r\n  private generateInfiniteQueryHook(\r\n    hook: GeneratedHook,\r\n    opts: ReactHookGeneratorOptions\r\n  ): string {\r\n    const params = this.generateHookParameters(hook);\r\n    const queryKey = this.generateQueryKey(hook);\r\n\r\n    let hookContent = `export function ${hook.name}(${params}) {\\n`;\r\n    hookContent += `  return useInfiniteQuery({\\n`;\r\n    hookContent += `    queryKey: ${queryKey},\\n`;\r\n    hookContent += `    queryFn: ({ pageParam = 1 }) => apiClient.${hook.operationId}({ ...params, page: pageParam }),\\n`;\r\n    hookContent += `    getNextPageParam: (lastPage, allPages) => {\\n`;\r\n    hookContent += `      // Adjust based on your pagination response structure\\n`;\r\n    hookContent += `      return lastPage.hasNext ? allPages.length + 1 : undefined;\\n`;\r\n    hookContent += `    },\\n`;\r\n    hookContent += `    ...options,\\n`;\r\n    hookContent += `  });\\n`;\r\n    hookContent += `}\\n`;\r\n\r\n    return hookContent;\r\n  }\r\n\r\n  private generateMutationHook(\r\n    hook: GeneratedHook,\r\n    opts: ReactHookGeneratorOptions\r\n  ): string {\r\n    const params = this.generateMutationParameters(hook);\r\n    const mutationFn = this.generateMutationFunction(hook);\r\n\r\n    let hookContent = `export function ${hook.name}(${params}) {\\n`;\r\n    hookContent += `  const queryClient = useQueryClient();\\n\\n`;\r\n    hookContent += `  return useMutation({\\n`;\r\n    hookContent += `    mutationFn: ${mutationFn},\\n`;\r\n\r\n    if (opts.enableOptimisticUpdates) {\r\n      hookContent += this.generateOptimisticUpdates(hook);\r\n    }\r\n\r\n    hookContent += `    onSuccess: (data, variables, context) => {\\n`;\r\n    hookContent += `      // Invalidate and refetch related queries\\n`;\r\n    hookContent += `      ${this.generateInvalidationLogic(hook)}\\n`;\r\n    hookContent += `      if (options?.onSuccess) options.onSuccess(data, variables, context);\\n`;\r\n    hookContent += `    },\\n`;\r\n    hookContent += `    ...options,\\n`;\r\n    hookContent += `  });\\n`;\r\n    hookContent += `}\\n`;\r\n\r\n    return hookContent;\r\n  }\r\n\r\n  private generateHookParameters(hook: GeneratedHook): string {\r\n    const params: string[] = [];\r\n\r\n    // Path parameters\r\n    if (hook.pathParams && hook.pathParams.length > 0) {\r\n      for (const param of hook.pathParams) {\r\n        params.push(`${param}: string | number`);\r\n      }\r\n    }\r\n\r\n    // Query parameters\r\n    if (hook.queryParams && hook.queryParams.length > 0) {\r\n      params.push(\r\n        `params?: { ${hook.queryParams.map((p) => `${p}?: any`).join(\"; \")} }`\r\n      );\r\n    }\r\n\r\n    // Options parameter\r\n    params.push(\r\n      `options?: Omit<Parameters<typeof useQuery>[0], 'queryKey' | 'queryFn'>`\r\n    );\r\n\r\n    return params.join(\", \");\r\n  }\r\n\r\n  private generateMutationParameters(hook: GeneratedHook): string {\r\n    const params: string[] = [];\r\n\r\n    // Options parameter for mutations\r\n    params.push(\r\n      `options?: Omit<Parameters<typeof useMutation>[0], 'mutationFn'>`\r\n    );\r\n\r\n    return params.join(\", \");\r\n  }\r\n\r\n  private generateQueryKey(hook: GeneratedHook): string {\r\n    const keyParts = [hook.operationId];\r\n\r\n    if (hook.pathParams && hook.pathParams.length > 0) {\r\n      keyParts.push(...hook.pathParams);\r\n    }\r\n\r\n    if (hook.queryParams && hook.queryParams.length > 0) {\r\n      keyParts.push(\"params\");\r\n    }\r\n\r\n    return `[${keyParts.map((part) => `'${part}'`).join(\", \")}]`;\r\n  }\r\n\r\n  private generateQueryFunction(hook: GeneratedHook): string {\r\n    const callParams: string[] = [];\r\n\r\n    if (hook.pathParams && hook.pathParams.length > 0) {\r\n      callParams.push(...hook.pathParams);\r\n    }\r\n\r\n    if (hook.queryParams && hook.queryParams.length > 0) {\r\n      callParams.push(\"params\");\r\n    }\r\n\r\n    return `() => apiClient.${hook.operationId}(${callParams.join(\", \")})`;\r\n  }\r\n\r\n  private generateMutationFunction(hook: GeneratedHook): string {\r\n    let params = \"\";\r\n\r\n    if (hook.requestType) {\r\n      params = `(data: ${hook.requestType})`;\r\n    } else {\r\n      params = \"(variables: any)\";\r\n    }\r\n\r\n    return `${params} => apiClient.${hook.operationId}(${hook.requestType ? \"data\" : \"variables\"})`;\r\n  }\r\n\r\n  private generateOptimisticUpdates(hook: GeneratedHook): string {\r\n    return (\r\n      `    onMutate: async (newData) => {\\n` +\r\n      `      // Cancel any outgoing refetches so they don't overwrite optimistic update\\n` +\r\n      `      await queryClient.cancelQueries({ queryKey: ['${hook.operationId}'] });\\n` +\r\n      `      \\n` +\r\n      `      // Snapshot the previous value\\n` +\r\n      `      const previousData = queryClient.getQueryData(['${hook.operationId}']);\\n` +\r\n      `      \\n` +\r\n      `      // Optimistically update to the new value\\n` +\r\n      `      queryClient.setQueryData(['${hook.operationId}'], (old: any) => {\\n` +\r\n      `        // Implement optimistic update logic based on operation type\\n` +\r\n      `        return old;\\n` +\r\n      `      });\\n` +\r\n      `      \\n` +\r\n      `      return { previousData };\\n` +\r\n      `    },\\n` +\r\n      `    onError: (err, newData, context) => {\\n` +\r\n      `      // Rollback on error\\n` +\r\n      `      if (context?.previousData) {\\n` +\r\n      `        queryClient.setQueryData(['${hook.operationId}'], context.previousData);\\n` +\r\n      `      }\\n` +\r\n      `    },\\n`\r\n    );\r\n  }\r\n\r\n  private generateInvalidationLogic(hook: GeneratedHook): string {\r\n    // Generate smart invalidation based on the operation\r\n    const domain = this.getDomainFromOperationId(hook.operationId);\r\n    return `queryClient.invalidateQueries({ queryKey: ['${domain}'] });`;\r\n  }\r\n\r\n  private groupHooksByDomain(\r\n    hooks: GeneratedHook[]\r\n  ): Map<string, GeneratedHook[]> {\r\n    const groups = new Map<string, GeneratedHook[]>();\r\n\r\n    for (const hook of hooks) {\r\n      const domain = this.getDomainFromOperationId(hook.operationId);\r\n\r\n      if (!groups.has(domain)) {\r\n        groups.set(domain, []);\r\n      }\r\n\r\n      groups.get(domain)!.push(hook);\r\n    }\r\n\r\n    return groups;\r\n  }\r\n\r\n  private getDomainFromOperationId(operationId: string): string {\r\n    // Extract domain from operation ID\r\n    // e.g., \"getUserById\" -> \"users\", \"createPost\" -> \"posts\"\r\n    const patterns = [\r\n      /^(get|list|find|fetch)(.+?)(?:ById|All)?$/i,\r\n      /^(create|update|delete|patch)(.+?)$/i,\r\n    ];\r\n\r\n    for (const pattern of patterns) {\r\n      const match = operationId.match(pattern);\r\n      if (match) {\r\n        return match[2].toLowerCase();\r\n      }\r\n    }\r\n\r\n    return \"general\";\r\n  }\r\n\r\n  private extractPathParameters(path: string): string[] {\r\n    const params: string[] = [];\r\n    const matches = path.match(/\\{([^}]+)\\}/g);\r\n\r\n    if (matches) {\r\n      params.push(...matches.map((match) => match.slice(1, -1)));\r\n    }\r\n\r\n    return params;\r\n  }\r\n\r\n  private extractQueryParameters(operation: any): string[] {\r\n    const params: string[] = [];\r\n\r\n    if (operation.parameters) {\r\n      for (const param of operation.parameters) {\r\n        if (param.in === \"query\") {\r\n          params.push(param.name);\r\n        }\r\n      }\r\n    }\r\n\r\n    return params;\r\n  }\r\n\r\n  private generateHookName(\r\n    operationId: string,\r\n    type: \"query\" | \"mutation\" | \"infiniteQuery\"\r\n  ): string {\r\n    let hookName = operationId;\r\n\r\n    if (type === \"query\" || type === \"infiniteQuery\") {\r\n      // Simplify query hook names\r\n      hookName = operationId\r\n        .replace(/^(get|fetch|list|find)/, \"\")\r\n        .replace(/ById$/, \"\");\r\n    }\r\n\r\n    const prefix = type === \"infiniteQuery\" ? \"useInfinite\" : \"use\";\r\n    return `${prefix}${hookName.charAt(0).toUpperCase()}${hookName.slice(1)}`;\r\n  }\r\n\r\n  private generateOperationId(method: string, path: string): string {\r\n    const pathParts = path\r\n      .split(\"/\")\r\n      .filter((part) => part && !part.startsWith(\"{\"))\r\n      .map((part) => part.replace(/[^a-zA-Z0-9]/g, \"\"));\r\n\r\n    const pathName = pathParts.length > 0 ? pathParts.join(\"\") : \"endpoint\";\r\n    return `${method}${pathName.charAt(0).toUpperCase() + pathName.slice(1)}`;\r\n  }\r\n\r\n  private getRequestType(operation: any): string | undefined {\r\n    const requestBody = operation.requestBody;\r\n    if (requestBody?.content?.[\"application/json\"]?.schema) {\r\n      return this.getTypeFromSchema(\r\n        requestBody.content[\"application/json\"].schema\r\n      );\r\n    }\r\n    return undefined;\r\n  }\r\n\r\n  private getResponseType(operation: any): string {\r\n    const responses = operation.responses;\r\n    const successResponse =\r\n      responses?.[\"200\"] || responses?.[\"201\"] || responses?.[\"204\"];\r\n\r\n    if (successResponse?.content?.[\"application/json\"]?.schema) {\r\n      return this.getTypeFromSchema(\r\n        successResponse.content[\"application/json\"].schema\r\n      );\r\n    }\r\n\r\n    return \"unknown\";\r\n  }\r\n\r\n  private getTypeFromSchema(schema: any): string {\r\n    if (schema.$ref) {\r\n      const refParts = schema.$ref.split(\"/\");\r\n      return refParts[refParts.length - 1];\r\n    }\r\n\r\n    if (schema.type === \"array\" && schema.items) {\r\n      const itemType = this.getTypeFromSchema(schema.items);\r\n      return `${itemType}[]`;\r\n    }\r\n\r\n    return schema.type || \"unknown\";\r\n  }\r\n\r\n  private isInfiniteQueryCandidate(operation: any, path: string): boolean {\r\n    // Detect if this is likely a paginated endpoint\r\n    const paginationKeywords = [\r\n      \"page\",\r\n      \"limit\",\r\n      \"offset\",\r\n      \"cursor\",\r\n      \"pageSize\",\r\n    ];\r\n\r\n    if (operation.parameters) {\r\n      for (const param of operation.parameters) {\r\n        if (\r\n          param.in === \"query\" &&\r\n          paginationKeywords.includes(param.name.toLowerCase())\r\n        ) {\r\n          return true;\r\n        }\r\n      }\r\n    }\r\n\r\n    // Check if path suggests a list endpoint\r\n    const listKeywords = [\"list\", \"search\", \"find\"];\r\n    return listKeywords.some(\r\n      (keyword) =>\r\n        path.toLowerCase().includes(keyword) ||\r\n        operation.operationId?.toLowerCase().includes(keyword)\r\n    );\r\n  }\r\n\r\n  private isAIEndpoint(path: string, operation: any): boolean {\r\n    const aiKeywords = [\r\n      \"ai\",\r\n      \"chat\",\r\n      \"completion\",\r\n      \"model\",\r\n      \"llm\",\r\n      \"embedding\",\r\n    ];\r\n    const fullPath =\r\n      `${path} ${operation.summary || \"\"} ${operation.description || \"\"}`.toLowerCase();\r\n    return aiKeywords.some((keyword) => fullPath.includes(keyword));\r\n  }\r\n\r\n  private generateChecksum(content: string): string {\r\n    return crypto.createHash(\"md5\").update(content).digest(\"hex\").slice(0, 8);\r\n  }\r\n}\r\n","import fs from \"fs-extra\";\r\nimport path from \"path\";\r\nimport crypto from \"crypto\";\r\nimport type { OpenAPISchema } from \"@farm-framework/types\";\r\n\r\n/** Options for the {@link AIHookGenerator}. */\r\nexport interface AIHookGeneratorOptions {\r\n  outputDir: string;\r\n  generateComments?: boolean;\r\n  includeSessionManagement?: boolean;\r\n  includeBatchInference?: boolean;\r\n  includeAdvancedFeatures?: boolean;\r\n  supportedProviders?: Array<\"ollama\" | \"openai\" | \"huggingface\">;\r\n  defaultProvider?: \"ollama\" | \"openai\" | \"huggingface\";\r\n  enableErrorHandling?: boolean;\r\n  enableOptimisticUpdates?: boolean;\r\n}\r\n\r\nexport interface AIGenerationResult {\r\n  path: string;\r\n  content?: string;\r\n  size?: number;\r\n  checksum?: string;\r\n  generatedAt?: Date;\r\n  type?: string;\r\n  hooks?: string[];\r\n}\r\n\r\n/**\r\n * Generates comprehensive React hooks for interacting with AI endpoints.\r\n * Provides streaming chat, model management, health monitoring, and session persistence.\r\n */\r\nexport class AIHookGenerator {\r\n  private options: AIHookGeneratorOptions;\r\n\r\n  constructor(options?: Partial<AIHookGeneratorOptions>) {\r\n    this.options = {\r\n      outputDir: \"./src/hooks\",\r\n      generateComments: true,\r\n      includeSessionManagement: true,\r\n      includeBatchInference: true,\r\n      includeAdvancedFeatures: true,\r\n      supportedProviders: [\"ollama\", \"openai\", \"huggingface\"],\r\n      defaultProvider: \"ollama\",\r\n      enableErrorHandling: true,\r\n      enableOptimisticUpdates: true,\r\n      ...options,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Generate AI hook source files from an OpenAPI schema.\r\n   *\r\n   * @param schema - Parsed OpenAPI schema\r\n   * @param opts - Generation options\r\n   * @returns Path to the generated file\r\n   */\r\n  async generate(\r\n    schema: OpenAPISchema,\r\n    opts: AIHookGeneratorOptions\r\n  ): Promise<AIGenerationResult> {\r\n    const finalOpts = { ...this.options, ...opts };\r\n    await fs.ensureDir(finalOpts.outputDir);\r\n\r\n    const content = this.generateAIHooksContent(schema, finalOpts);\r\n    const outPath = path.join(finalOpts.outputDir, \"ai-hooks.ts\");\r\n\r\n    await fs.writeFile(outPath, content);\r\n\r\n    return {\r\n      path: outPath,\r\n      content,\r\n      size: content.length,\r\n      checksum: this.generateChecksum(content),\r\n      generatedAt: new Date(),\r\n      type: \"ai-hooks\",\r\n      hooks: this.extractHookNames(content),\r\n    };\r\n  }\r\n\r\n  private generateAIHooksContent(\r\n    schema: OpenAPISchema,\r\n    opts: AIHookGeneratorOptions\r\n  ): string {\r\n    const aiEndpoints = this.detectAIEndpoints(schema);\r\n    const hooks: string[] = [];\r\n\r\n    // File header\r\n    let content = this.generateFileHeader(opts);\r\n\r\n    // Core hooks\r\n    hooks.push(this.generateStreamingChatHook(opts));\r\n    hooks.push(this.generateAIModelsHook(opts));\r\n    hooks.push(this.generateAIHealthHook(opts));\r\n    hooks.push(this.generateAIProviderHook(opts));\r\n\r\n    // Optional hooks based on configuration\r\n    if (opts.includeBatchInference) {\r\n      hooks.push(this.generateAIInferenceHook(opts));\r\n    }\r\n\r\n    if (opts.includeSessionManagement) {\r\n      hooks.push(this.generateChatSessionHook(opts));\r\n    }\r\n\r\n    if (opts.includeAdvancedFeatures) {\r\n      hooks.push(this.generateModelLoaderHook(opts));\r\n      hooks.push(this.generateAIConfigHook(opts));\r\n      hooks.push(this.generateTokenCounterHook(opts));\r\n    }\r\n\r\n    // Custom hooks for detected AI endpoints\r\n    for (const endpoint of aiEndpoints) {\r\n      hooks.push(this.generateCustomEndpointHook(endpoint, opts));\r\n    }\r\n\r\n    content += hooks.join(\"\\n\\n\");\r\n    content += this.generateExports(opts);\r\n\r\n    return content;\r\n  }\r\n\r\n  private generateFileHeader(opts: AIHookGeneratorOptions): string {\r\n    if (!opts.generateComments) return \"\";\r\n\r\n    return `/**\r\n * Auto-generated AI hooks for FARM framework\r\n * Generated at: ${new Date().toISOString()}\r\n * DO NOT EDIT - This file is auto-generated\r\n * \r\n * Provides comprehensive React hooks for AI functionality:\r\n * - Streaming chat with real-time responses\r\n * - Model management and loading\r\n * - Provider health monitoring\r\n * - Session persistence\r\n * - Batch inference\r\n * - Error handling and recovery\r\n */\r\n\r\nimport { useState, useCallback, useEffect, useRef } from 'react';\r\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\r\nimport { aiApi } from '../services/api';\r\nimport type * as AI from '../types/ai';\r\n\r\n// =============================================================================\r\n// AI Hooks\r\n// =============================================================================\r\n\r\n`;\r\n  }\r\n\r\n  private generateStreamingChatHook(opts: AIHookGeneratorOptions): string {\r\n    const providers =\r\n      opts.supportedProviders?.map((p) => `'${p}'`).join(\" | \") ||\r\n      \"'ollama' | 'openai' | 'huggingface'\";\r\n    const defaultProvider = opts.defaultProvider || \"ollama\";\r\n\r\n    return `/**\r\n * Hook for real-time streaming chat with AI providers\r\n * Supports ${opts.supportedProviders?.join(\", \")} with automatic provider routing\r\n * Features: Real-time streaming, error recovery, message persistence\r\n */\r\nexport function useStreamingChat(options: {\r\n  provider?: ${providers};\r\n  model?: string;\r\n  initialMessages?: AI.ChatMessage[];\r\n  onMessage?: (message: AI.ChatMessage) => void;\r\n  onError?: (error: Error) => void;\r\n  onStreamStart?: () => void;\r\n  onStreamEnd?: () => void;\r\n  temperature?: number;\r\n  maxTokens?: number;\r\n  systemPrompt?: string;\r\n} = {}) {\r\n  const [messages, setMessages] = useState<AI.ChatMessage[]>(\r\n    options.initialMessages || []\r\n  );\r\n  const [isStreaming, setIsStreaming] = useState(false);\r\n  const [currentResponse, setCurrentResponse] = useState('');\r\n  const eventSourceRef = useRef<EventSource | null>(null);\r\n  const abortControllerRef = useRef<AbortController | null>(null);\r\n\r\n  // Default to ${defaultProvider} in development, configurable in production\r\n  const defaultProvider = process.env.NODE_ENV === 'development' ? '${defaultProvider}' : (process.env.REACT_APP_AI_PROVIDER || '${defaultProvider}');\r\n  const provider = options.provider || defaultProvider;\r\n\r\n  const sendMessage = useCallback(async (\r\n    content: string, \r\n    messageOptions: Partial<AI.ChatRequest> = {}\r\n  ) => {\r\n    const userMessage: AI.ChatMessage = { \r\n      role: 'user', \r\n      content,\r\n      timestamp: new Date().toISOString()\r\n    };\r\n    const newMessages = [...messages, userMessage];\r\n    setMessages(newMessages);\r\n    setIsStreaming(true);\r\n    setCurrentResponse('');\r\n    options.onStreamStart?.();\r\n\r\n    try {\r\n      // Cancel any existing stream\r\n      if (eventSourceRef.current) {\r\n        eventSourceRef.current.close();\r\n      }\r\n      if (abortControllerRef.current) {\r\n        abortControllerRef.current.abort();\r\n      }\r\n\r\n      abortControllerRef.current = new AbortController();\r\n\r\n      // Create streaming request\r\n      const streamRequest: AI.ChatRequest = {\r\n        messages: newMessages,\r\n        model: options.model || 'llama3.1',\r\n        provider,\r\n        temperature: options.temperature || 0.7,\r\n        maxTokens: options.maxTokens || 1000,\r\n        systemPrompt: options.systemPrompt,\r\n        stream: true,\r\n        ...messageOptions\r\n      };\r\n\r\n      const eventSource = aiApi.chatStream(streamRequest);\r\n      eventSourceRef.current = eventSource;\r\n\r\n      let assistantMessage = '';\r\n      let isFirstChunk = true;\r\n\r\n      eventSource.onmessage = (event) => {\r\n        if (event.data === '[DONE]') {\r\n          setIsStreaming(false);\r\n          eventSource.close();\r\n          options.onStreamEnd?.();\r\n          \r\n          // Finalize the assistant message\r\n          const finalMessage: AI.ChatMessage = {\r\n            role: 'assistant',\r\n            content: assistantMessage,\r\n            timestamp: new Date().toISOString()\r\n          };\r\n          \r\n          setMessages(prev => {\r\n            const updated = [...prev];\r\n            if (updated[updated.length - 1]?.role === 'assistant') {\r\n              updated[updated.length - 1] = finalMessage;\r\n            } else {\r\n              updated.push(finalMessage);\r\n            }\r\n            return updated;\r\n          });\r\n          \r\n          options.onMessage?.(finalMessage);\r\n          setCurrentResponse('');\r\n          return;\r\n        }\r\n\r\n        try {\r\n          const data = JSON.parse(event.data);\r\n          if (data.content) {\r\n            assistantMessage += data.content;\r\n            setCurrentResponse(assistantMessage);\r\n\r\n            // Add or update the assistant message in real-time\r\n            setMessages(prev => {\r\n              const updated = [...prev];\r\n              const lastMessage = updated[updated.length - 1];\r\n              \r\n              if (lastMessage?.role === 'assistant') {\r\n                lastMessage.content = assistantMessage;\r\n                lastMessage.timestamp = new Date().toISOString();\r\n              } else {\r\n                updated.push({\r\n                  role: 'assistant',\r\n                  content: assistantMessage,\r\n                  timestamp: new Date().toISOString()\r\n                });\r\n              }\r\n              \r\n              return updated;\r\n            });\r\n\r\n            if (isFirstChunk) {\r\n              isFirstChunk = false;\r\n              options.onMessage?.({\r\n                role: 'assistant',\r\n                content: data.content,\r\n                timestamp: new Date().toISOString()\r\n              });\r\n            }\r\n          }\r\n        } catch (error) {\r\n          console.warn('Failed to parse streaming response:', error);\r\n        }\r\n      };\r\n\r\n      eventSource.onerror = (error) => {\r\n        setIsStreaming(false);\r\n        eventSource.close();\r\n        options.onStreamEnd?.();\r\n        const errorMessage = 'Failed to connect to AI service';\r\n        options.onError?.(new Error(errorMessage));\r\n        \r\n        // Add error message to chat\r\n        setMessages(prev => [...prev, {\r\n          role: 'assistant',\r\n          content: \\`❌ \\${errorMessage}. Please try again.\\`,\r\n          timestamp: new Date().toISOString()\r\n        }]);\r\n      };\r\n\r\n    } catch (error) {\r\n      setIsStreaming(false);\r\n      options.onStreamEnd?.();\r\n      const errorMessage = error instanceof Error ? error.message : 'Unknown error';\r\n      options.onError?.(new Error(errorMessage));\r\n      \r\n      // Add error message to chat\r\n      setMessages(prev => [...prev, {\r\n        role: 'assistant',\r\n        content: \\`❌ Error: \\${errorMessage}\\`,\r\n        timestamp: new Date().toISOString()\r\n      }]);\r\n    }\r\n  }, [messages, provider, options.model, options.onMessage, options.onError, options.onStreamStart, options.onStreamEnd]);\r\n\r\n  const stopGeneration = useCallback(() => {\r\n    if (eventSourceRef.current) {\r\n      eventSourceRef.current.close();\r\n      eventSourceRef.current = null;\r\n    }\r\n    if (abortControllerRef.current) {\r\n      abortControllerRef.current.abort();\r\n      abortControllerRef.current = null;\r\n    }\r\n    setIsStreaming(false);\r\n    setCurrentResponse('');\r\n    options.onStreamEnd?.();\r\n  }, [options.onStreamEnd]);\r\n\r\n  const clearMessages = useCallback(() => {\r\n    setMessages([]);\r\n    setCurrentResponse('');\r\n    stopGeneration();\r\n  }, [stopGeneration]);\r\n\r\n  const regenerateLastResponse = useCallback(() => {\r\n    const lastUserMessage = [...messages].reverse().find(m => m.role === 'user');\r\n    if (lastUserMessage) {\r\n      // Remove last assistant response if it exists\r\n      const filteredMessages = messages.filter((_, index) => \r\n        index < messages.length - 1 || messages[index].role !== 'assistant'\r\n      );\r\n      setMessages(filteredMessages);\r\n      sendMessage(lastUserMessage.content);\r\n    }\r\n  }, [messages, sendMessage]);\r\n\r\n  // Cleanup on unmount\r\n  useEffect(() => {\r\n    return () => {\r\n      stopGeneration();\r\n    };\r\n  }, [stopGeneration]);\r\n\r\n  return {\r\n    messages,\r\n    currentResponse,\r\n    isStreaming,\r\n    sendMessage,\r\n    stopGeneration,\r\n    clearMessages,\r\n    regenerateLastResponse,\r\n    provider,\r\n    model: options.model\r\n  };\r\n}`;\r\n  }\r\n\r\n  private generateAIModelsHook(opts: AIHookGeneratorOptions): string {\r\n    const providers =\r\n      opts.supportedProviders?.map((p) => `'${p}'`).join(\" | \") ||\r\n      \"'ollama' | 'openai' | 'huggingface'\";\r\n\r\n    return `/**\r\n * Hook for managing AI models across different providers\r\n * Provides model listing, filtering, and metadata\r\n */\r\nexport function useAIModels(provider?: ${providers}) {\r\n  return useQuery({\r\n    queryKey: ['ai-models', provider],\r\n    queryFn: () => aiApi.listModels(provider),\r\n    staleTime: 5 * 60 * 1000, // 5 minutes\r\n    refetchOnWindowFocus: false,\r\n    retry: 2,\r\n    retryDelay: attemptIndex => Math.min(1000 * 2 ** attemptIndex, 30000)\r\n  });\r\n}`;\r\n  }\r\n\r\n  private generateAIHealthHook(opts: AIHookGeneratorOptions): string {\r\n    return `/**\r\n * Hook for monitoring AI provider health and status\r\n * Provides real-time health monitoring with automatic retries\r\n */\r\nexport function useAIHealth() {\r\n  return useQuery({\r\n    queryKey: ['ai-health'],\r\n    queryFn: () => aiApi.healthCheck(),\r\n    refetchInterval: 30000, // Check every 30 seconds\r\n    retry: 1,\r\n    staleTime: 15000, // Consider data stale after 15 seconds\r\n    cacheTime: 60000, // Keep in cache for 1 minute\r\n    ${\r\n      opts.enableErrorHandling\r\n        ? `\r\n    onError: (error) => {\r\n      console.warn('AI health check failed:', error);\r\n    }`\r\n        : \"\"\r\n    }\r\n  });\r\n}`;\r\n  }\r\n\r\n  private generateAIProviderHook(opts: AIHookGeneratorOptions): string {\r\n    const defaultProvider = opts.defaultProvider || \"ollama\";\r\n\r\n    return `/**\r\n * Hook for managing AI provider selection and configuration\r\n * Handles automatic provider detection and fallback logic\r\n */\r\nexport function useAIProvider() {\r\n  const [selectedProvider, setSelectedProvider] = useState<string | null>(null);\r\n  const [selectedModel, setSelectedModel] = useState<string | null>(null);\r\n  \r\n  const { data: health } = useAIHealth();\r\n  const { data: models } = useAIModels(selectedProvider as any);\r\n\r\n  // Auto-select healthy provider if none selected\r\n  useEffect(() => {\r\n    if (!selectedProvider && health) {\r\n      // Priority order: ${opts.supportedProviders?.join(\", \")}\r\n      const providerPriority = [${opts.supportedProviders?.map((p) => `'${p}'`).join(\", \")}];\r\n      \r\n      for (const provider of providerPriority) {\r\n        if (health[provider]?.status === 'healthy') {\r\n          setSelectedProvider(provider);\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // Fallback to first healthy provider\r\n      if (!selectedProvider) {\r\n        const healthyProvider = Object.entries(health).find(\r\n          ([_, status]) => status.status === 'healthy'\r\n        );\r\n        if (healthyProvider) {\r\n          setSelectedProvider(healthyProvider[0]);\r\n        }\r\n      }\r\n    }\r\n  }, [health, selectedProvider]);\r\n\r\n  // Auto-select default model when provider changes\r\n  useEffect(() => {\r\n    if (models && models.length > 0 && !selectedModel) {\r\n      // Try to find a recommended model, fallback to first available\r\n      const recommendedModel = models.find(m => \r\n        m.name.includes('llama') || m.name.includes('gpt') || m.name.includes('claude')\r\n      );\r\n      setSelectedModel(recommendedModel?.name || models[0].name);\r\n    }\r\n  }, [models, selectedModel]);\r\n\r\n  const switchProvider = useCallback((provider: string, model?: string) => {\r\n    setSelectedProvider(provider);\r\n    if (model) {\r\n      setSelectedModel(model);\r\n    } else {\r\n      setSelectedModel(null); // Will auto-select in useEffect\r\n    }\r\n  }, []);\r\n\r\n  return {\r\n    selectedProvider,\r\n    selectedModel,\r\n    availableProviders: health ? Object.keys(health) : [],\r\n    availableModels: models || [],\r\n    switchProvider,\r\n    setSelectedModel,\r\n    providerHealth: health,\r\n    isHealthy: selectedProvider ? health?.[selectedProvider]?.status === 'healthy' : false\r\n  };\r\n}`;\r\n  }\r\n\r\n  private generateAIInferenceHook(opts: AIHookGeneratorOptions): string {\r\n    return `/**\r\n * Hook for single AI inference requests (non-streaming)\r\n * Optimized for batch processing and caching\r\n */\r\nexport function useAIInference(options: {\r\n  provider?: string;\r\n  model?: string;\r\n  enableCaching?: boolean;\r\n} = {}) {\r\n  const queryClient = useQueryClient();\r\n\r\n  return useMutation({\r\n    mutationFn: async (request: AI.ChatRequest) => {\r\n      const response = await aiApi.chat({\r\n        ...request,\r\n        provider: options.provider,\r\n        model: options.model || request.model,\r\n        stream: false\r\n      });\r\n      return response;\r\n    },\r\n    ${\r\n      opts.enableOptimisticUpdates\r\n        ? `\r\n    onMutate: async (variables) => {\r\n      // Optimistic update for immediate UI feedback\r\n      return { timestamp: Date.now() };\r\n    },`\r\n        : \"\"\r\n    }\r\n    onSuccess: (data, variables) => {\r\n      if (options.enableCaching !== false) {\r\n        // Cache successful responses for potential reuse\r\n        const cacheKey = JSON.stringify({\r\n          messages: variables.messages,\r\n          model: variables.model,\r\n          provider: variables.provider\r\n        });\r\n        queryClient.setQueryData(['ai-inference', cacheKey], data);\r\n      }\r\n    },\r\n    ${\r\n      opts.enableErrorHandling\r\n        ? `\r\n    onError: (error, variables) => {\r\n      console.error('AI inference failed:', error);\r\n      // Could add toast notification here\r\n    },`\r\n        : \"\"\r\n    }\r\n    retry: 1,\r\n    retryDelay: 2000\r\n  });\r\n}`;\r\n  }\r\n\r\n  private generateChatSessionHook(opts: AIHookGeneratorOptions): string {\r\n    return `/**\r\n * Hook for managing persistent chat sessions\r\n * Provides session storage, loading, and synchronization\r\n */\r\nexport function useChatSession(sessionId?: string) {\r\n  const [session, setSession] = useState<{\r\n    id: string;\r\n    messages: AI.ChatMessage[];\r\n    provider: string;\r\n    model: string;\r\n    createdAt: Date;\r\n    lastActivity: Date;\r\n    metadata?: Record<string, any>;\r\n  } | null>(null);\r\n\r\n  const saveSession = useCallback((\r\n    messages: AI.ChatMessage[], \r\n    provider: string, \r\n    model: string,\r\n    metadata?: Record<string, any>\r\n  ) => {\r\n    const newSession = {\r\n      id: sessionId || \\`session-\\${Date.now()}\\`,\r\n      messages,\r\n      provider,\r\n      model,\r\n      createdAt: new Date(),\r\n      lastActivity: new Date(),\r\n      metadata\r\n    };\r\n    \r\n    setSession(newSession);\r\n    \r\n    // Save to localStorage for persistence\r\n    try {\r\n      localStorage.setItem(\\`farm-chat-session-\\${newSession.id}\\`, JSON.stringify({\r\n        ...newSession,\r\n        createdAt: newSession.createdAt.toISOString(),\r\n        lastActivity: newSession.lastActivity.toISOString()\r\n      }));\r\n    } catch (error) {\r\n      console.warn('Failed to save chat session:', error);\r\n    }\r\n    \r\n    return newSession.id;\r\n  }, [sessionId]);\r\n\r\n  const loadSession = useCallback((id: string) => {\r\n    try {\r\n      const saved = localStorage.getItem(\\`farm-chat-session-\\${id}\\`);\r\n      if (saved) {\r\n        const parsed = JSON.parse(saved);\r\n        setSession({\r\n          ...parsed,\r\n          createdAt: new Date(parsed.createdAt),\r\n          lastActivity: new Date(parsed.lastActivity)\r\n        });\r\n        return parsed;\r\n      }\r\n    } catch (error) {\r\n      console.warn('Failed to load chat session:', error);\r\n    }\r\n    return null;\r\n  }, []);\r\n\r\n  const clearSession = useCallback(() => {\r\n    if (session) {\r\n      localStorage.removeItem(\\`farm-chat-session-\\${session.id}\\`);\r\n    }\r\n    setSession(null);\r\n  }, [session]);\r\n\r\n  const updateSessionMetadata = useCallback((metadata: Record<string, any>) => {\r\n    if (session) {\r\n      const updatedSession = {\r\n        ...session,\r\n        metadata: { ...session.metadata, ...metadata },\r\n        lastActivity: new Date()\r\n      };\r\n      setSession(updatedSession);\r\n      saveSession(updatedSession.messages, updatedSession.provider, updatedSession.model, updatedSession.metadata);\r\n    }\r\n  }, [session, saveSession]);\r\n\r\n  // Load session on mount if sessionId provided\r\n  useEffect(() => {\r\n    if (sessionId) {\r\n      loadSession(sessionId);\r\n    }\r\n  }, [sessionId, loadSession]);\r\n\r\n  return {\r\n    session,\r\n    saveSession,\r\n    loadSession,\r\n    clearSession,\r\n    updateSessionMetadata,\r\n    isLoaded: Boolean(session)\r\n  };\r\n}`;\r\n  }\r\n\r\n  private generateModelLoaderHook(opts: AIHookGeneratorOptions): string {\r\n    return `/**\r\n * Hook for loading/downloading AI models (primarily for Ollama)\r\n * Provides progress tracking and error handling\r\n */\r\nexport function useModelLoader() {\r\n  const queryClient = useQueryClient();\r\n  const [loadingProgress, setLoadingProgress] = useState<Record<string, number>>({});\r\n\r\n  return useMutation({\r\n    mutationFn: async ({ modelName, provider }: { modelName: string; provider?: string }) => {\r\n      setLoadingProgress(prev => ({ ...prev, [modelName]: 0 }));\r\n      \r\n      // Simulate progress for demonstration\r\n      const progressInterval = setInterval(() => {\r\n        setLoadingProgress(prev => ({\r\n          ...prev,\r\n          [modelName]: Math.min((prev[modelName] || 0) + Math.random() * 20, 95)\r\n        }));\r\n      }, 1000);\r\n\r\n      try {\r\n        const result = await aiApi.loadModel(modelName, provider);\r\n        clearInterval(progressInterval);\r\n        setLoadingProgress(prev => ({ ...prev, [modelName]: 100 }));\r\n        return result;\r\n      } catch (error) {\r\n        clearInterval(progressInterval);\r\n        setLoadingProgress(prev => {\r\n          const newProgress = { ...prev };\r\n          delete newProgress[modelName];\r\n          return newProgress;\r\n        });\r\n        throw error;\r\n      }\r\n    },\r\n    onSuccess: () => {\r\n      // Invalidate models list to show newly loaded model\r\n      queryClient.invalidateQueries({ queryKey: ['ai-models'] });\r\n      queryClient.invalidateQueries({ queryKey: ['ai-health'] });\r\n    },\r\n    ${\r\n      opts.enableErrorHandling\r\n        ? `\r\n    onError: (error, variables) => {\r\n      console.error(\\`Failed to load model \\${variables.modelName}:\\`, error);\r\n    }`\r\n        : \"\"\r\n    }\r\n  });\r\n}`;\r\n  }\r\n\r\n  private generateAIConfigHook(opts: AIHookGeneratorOptions): string {\r\n    return `/**\r\n * Hook for managing AI configuration and settings\r\n * Provides centralized configuration management\r\n */\r\nexport function useAIConfig() {\r\n  const [config, setConfig] = useState({\r\n    defaultProvider: '${opts.defaultProvider || \"ollama\"}',\r\n    defaultModel: 'llama3.1',\r\n    temperature: 0.7,\r\n    maxTokens: 1000,\r\n    enableStreaming: true,\r\n    enableCaching: true,\r\n    retryAttempts: 2\r\n  });\r\n\r\n  const updateConfig = useCallback((updates: Partial<typeof config>) => {\r\n    setConfig(prev => ({ ...prev, ...updates }));\r\n    \r\n    // Persist to localStorage\r\n    try {\r\n      localStorage.setItem('farm-ai-config', JSON.stringify({ ...config, ...updates }));\r\n    } catch (error) {\r\n      console.warn('Failed to save AI config:', error);\r\n    }\r\n  }, [config]);\r\n\r\n  // Load config from localStorage on mount\r\n  useEffect(() => {\r\n    try {\r\n      const saved = localStorage.getItem('farm-ai-config');\r\n      if (saved) {\r\n        setConfig(prev => ({ ...prev, ...JSON.parse(saved) }));\r\n      }\r\n    } catch (error) {\r\n      console.warn('Failed to load AI config:', error);\r\n    }\r\n  }, []);\r\n\r\n  return {\r\n    config,\r\n    updateConfig,\r\n    resetConfig: () => setConfig({\r\n      defaultProvider: '${opts.defaultProvider || \"ollama\"}',\r\n      defaultModel: 'llama3.1',\r\n      temperature: 0.7,\r\n      maxTokens: 1000,\r\n      enableStreaming: true,\r\n      enableCaching: true,\r\n      retryAttempts: 2\r\n    })\r\n  };\r\n}`;\r\n  }\r\n\r\n  private generateTokenCounterHook(opts: AIHookGeneratorOptions): string {\r\n    return `/**\r\n * Hook for estimating and tracking token usage\r\n * Provides cost estimation and usage analytics\r\n */\r\nexport function useTokenCounter() {\r\n  const [usage, setUsage] = useState({\r\n    totalTokens: 0,\r\n    promptTokens: 0,\r\n    completionTokens: 0,\r\n    estimatedCost: 0\r\n  });\r\n\r\n  const estimateTokens = useCallback((text: string): number => {\r\n    // Simple estimation: ~4 characters per token\r\n    return Math.ceil(text.length / 4);\r\n  }, []);\r\n\r\n  const trackUsage = useCallback((promptTokens: number, completionTokens: number, provider?: string) => {\r\n    const totalTokens = promptTokens + completionTokens;\r\n    \r\n    // Basic cost estimation (adjust rates as needed)\r\n    const rates = {\r\n      openai: { prompt: 0.0005, completion: 0.0015 }, // per 1K tokens\r\n      ollama: { prompt: 0, completion: 0 }, // Local, free\r\n      huggingface: { prompt: 0.0001, completion: 0.0002 }\r\n    };\r\n    \r\n    const rate = rates[provider as keyof typeof rates] || rates.ollama;\r\n    const cost = (promptTokens / 1000) * rate.prompt + (completionTokens / 1000) * rate.completion;\r\n\r\n    setUsage(prev => ({\r\n      totalTokens: prev.totalTokens + totalTokens,\r\n      promptTokens: prev.promptTokens + promptTokens,\r\n      completionTokens: prev.completionTokens + completionTokens,\r\n      estimatedCost: prev.estimatedCost + cost\r\n    }));\r\n  }, []);\r\n\r\n  const resetUsage = useCallback(() => {\r\n    setUsage({\r\n      totalTokens: 0,\r\n      promptTokens: 0,\r\n      completionTokens: 0,\r\n      estimatedCost: 0\r\n    });\r\n  }, []);\r\n\r\n  return {\r\n    usage,\r\n    estimateTokens,\r\n    trackUsage,\r\n    resetUsage\r\n  };\r\n}`;\r\n  }\r\n\r\n  private generateCustomEndpointHook(\r\n    endpoint: any,\r\n    opts: AIHookGeneratorOptions\r\n  ): string {\r\n    // Generate hooks for custom AI endpoints detected in the schema\r\n    const hookName = this.generateHookName(endpoint.path);\r\n\r\n    return `/**\r\n * Custom hook for ${endpoint.path}\r\n * Auto-generated from OpenAPI schema\r\n */\r\nexport function ${hookName}() {\r\n  return useMutation({\r\n    mutationFn: (params: any) => aiApi.customRequest('${endpoint.path}', params),\r\n    ${\r\n      opts.enableErrorHandling\r\n        ? `\r\n    onError: (error) => {\r\n      console.error('${hookName} failed:', error);\r\n    }`\r\n        : \"\"\r\n    }\r\n  });\r\n}`;\r\n  }\r\n\r\n  private generateExports(opts: AIHookGeneratorOptions): string {\r\n    const hooks = [\r\n      \"useStreamingChat\",\r\n      \"useAIModels\",\r\n      \"useAIHealth\",\r\n      \"useAIProvider\",\r\n    ];\r\n\r\n    if (opts.includeBatchInference) {\r\n      hooks.push(\"useAIInference\");\r\n    }\r\n\r\n    if (opts.includeSessionManagement) {\r\n      hooks.push(\"useChatSession\");\r\n    }\r\n\r\n    if (opts.includeAdvancedFeatures) {\r\n      hooks.push(\"useModelLoader\", \"useAIConfig\", \"useTokenCounter\");\r\n    }\r\n\r\n    return `\r\n\r\n// =============================================================================\r\n// Exports\r\n// =============================================================================\r\n\r\nexport {\r\n  ${hooks.join(\",\\n  \")}\r\n};\r\n\r\nexport type {\r\n  // Re-export AI types for convenience\r\n  AI.ChatMessage,\r\n  AI.ChatRequest,\r\n  AI.ChatResponse,\r\n  AI.ModelInfo,\r\n  AI.ProviderHealthResponse\r\n} from '../types/ai';\r\n`;\r\n  }\r\n\r\n  private detectAIEndpoints(schema: OpenAPISchema): any[] {\r\n    const aiEndpoints: any[] = [];\r\n\r\n    if (schema.paths) {\r\n      for (const [path, methods] of Object.entries(schema.paths)) {\r\n        if (\r\n          path.includes(\"/ai/\") ||\r\n          path.includes(\"/chat/\") ||\r\n          path.includes(\"/completion/\")\r\n        ) {\r\n          for (const [method, operation] of Object.entries(methods as any)) {\r\n            const operationDef = operation as any;\r\n            aiEndpoints.push({\r\n              path,\r\n              method,\r\n              operation: operationDef,\r\n              operationId: operationDef.operationId,\r\n            });\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    return aiEndpoints;\r\n  }\r\n\r\n  private generateHookName(path: string): string {\r\n    // Convert \"/ai/custom/endpoint\" to \"useAICustomEndpoint\"\r\n    return (\r\n      \"use\" +\r\n      path\r\n        .split(\"/\")\r\n        .filter(Boolean)\r\n        .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\r\n        .join(\"\")\r\n    );\r\n  }\r\n\r\n  private extractHookNames(content: string): string[] {\r\n    const hookRegex = /export function (use\\w+)/g;\r\n    const hooks: string[] = [];\r\n    let match;\r\n\r\n    while ((match = hookRegex.exec(content)) !== null) {\r\n      hooks.push(match[1]);\r\n    }\r\n\r\n    return hooks;\r\n  }\r\n\r\n  private generateChecksum(content: string): string {\r\n    return crypto.createHash(\"md5\").update(content).digest(\"hex\").slice(0, 8);\r\n  }\r\n}\r\n","// @farm/type-sync cache\r\nimport fs from \"fs-extra\";\r\nimport path from \"path\";\r\nimport crypto from \"crypto\";\r\nimport zlib from \"zlib\";\r\nimport { promisify } from \"util\";\r\n\r\nconst gzip = promisify(zlib.gzip);\r\nconst gunzip = promisify(zlib.gunzip);\r\n\r\ninterface CacheEntry {\r\n  schema: any;\r\n  results: any;\r\n  timestamp: number;\r\n  version: string;\r\n  metadata?: {\r\n    generationTime: number;\r\n    fileCount: number;\r\n    totalSize: number;\r\n  };\r\n}\r\n\r\ninterface CacheOptions {\r\n  timeout?: number; // Cache timeout in milliseconds\r\n  enableCompression?: boolean;\r\n  enableMetrics?: boolean;\r\n  maxSize?: number; // Maximum cache size in bytes\r\n  cleanupInterval?: number; // Auto-cleanup interval in milliseconds\r\n}\r\n\r\ninterface CacheMetrics {\r\n  hits: number;\r\n  misses: number;\r\n  evictions: number;\r\n  totalSize: number;\r\n  entryCount: number;\r\n}\r\n\r\n/**\r\n * Enhanced file system based cache for generated artifacts.\r\n * Features compression, metrics, TTL, and size limits.\r\n */\r\nexport class GenerationCache {\r\n  private options: Required<CacheOptions>;\r\n  private metrics: CacheMetrics;\r\n  private metadataPath: string;\r\n  private cleanupTimer?: NodeJS.Timeout;\r\n  private logger = console;\r\n\r\n  constructor(\r\n    private baseDir: string,\r\n    options?: CacheOptions\r\n  ) {\r\n    this.options = {\r\n      timeout: 300000, // 5 minutes default\r\n      enableCompression: true,\r\n      enableMetrics: true,\r\n      maxSize: 100 * 1024 * 1024, // 100MB default\r\n      cleanupInterval: 600000, // 10 minutes default\r\n      ...options,\r\n    };\r\n\r\n    this.metrics = {\r\n      hits: 0,\r\n      misses: 0,\r\n      evictions: 0,\r\n      totalSize: 0,\r\n      entryCount: 0,\r\n    };\r\n\r\n    this.metadataPath = path.join(this.baseDir, \".cache-metadata.json\");\r\n  }\r\n\r\n  /**\r\n   * Initialize the cache system.\r\n   */ async initialize(options?: CacheOptions): Promise<void> {\r\n    if (options) {\r\n      this.options = { ...this.options, ...options };\r\n    }\r\n\r\n    await fs.ensureDir(this.baseDir);\r\n    await this.loadMetrics();\r\n\r\n    // Clean up expired entries on initialization\r\n    await this.cleanup();\r\n\r\n    // Start periodic cleanup timer\r\n    if (this.options.cleanupInterval > 0) {\r\n      this.cleanupTimer = setInterval(() => {\r\n        this.cleanup().catch(console.error);\r\n      }, this.options.cleanupInterval);\r\n    }\r\n  }\r\n\r\n  private entryPath(hash: string): string {\r\n    return path.join(\r\n      this.baseDir,\r\n      `${hash}${this.options.enableCompression ? \".gz\" : \".json\"}`\r\n    );\r\n  }\r\n\r\n  private metricPath(hash: string): string {\r\n    return path.join(this.baseDir, `${hash}.meta.json`);\r\n  }\r\n\r\n  private async readAndDecompress(file: string): Promise<Buffer> {\r\n    const data = await fs.readFile(file);\r\n    if (this.options.enableCompression) {\r\n      return gunzip(data);\r\n    }\r\n    return Buffer.isBuffer(data) ? data : Buffer.from(data);\r\n  }\r\n\r\n  /**\r\n   * Compute a stable hash for an OpenAPI schema object.\r\n   */\r\n  hashSchema(schema: any): string {\r\n    const normalizedSchema = this.normalizeSchema(schema);\r\n    return crypto\r\n      .createHash(\"sha256\")\r\n      .update(JSON.stringify(normalizedSchema))\r\n      .digest(\"hex\")\r\n      .slice(0, 16);\r\n  }\r\n\r\n  /**\r\n   * Normalize schema for consistent hashing.\r\n   */\r\n  private normalizeSchema(schema: any): any {\r\n    // Remove volatile fields that shouldn't affect cache key\r\n    const normalized = { ...schema };\r\n\r\n    // Remove timestamps, server URLs, etc.\r\n    if (normalized.info) {\r\n      delete normalized.info.version;\r\n      delete normalized.info[\"x-generated-at\"];\r\n    }\r\n\r\n    if (normalized.servers) {\r\n      // Normalize server URLs to avoid cache misses due to port changes\r\n      normalized.servers = normalized.servers.map((server: any) => ({\r\n        ...server,\r\n        url: server.url?.replace(/:\\d+/, \":{{PORT}}\"),\r\n      }));\r\n    }\r\n\r\n    return normalized;\r\n  }\r\n  /**\r\n   * Get a cache entry by hash, handling decompression errors as cache-miss.\r\n   */\r\n  public async get(hash: string): Promise<CacheEntry | null> {\r\n    const file = this.entryPath(hash);\r\n    if (!(await fs.pathExists(file))) return null;\r\n\r\n    try {\r\n      const raw = await this.readAndDecompress(file);\r\n      return JSON.parse(raw.toString()) as CacheEntry;\r\n    } catch (err: any) {\r\n      // Log the error if logger is available\r\n      if (this.logger && typeof this.logger.warn === \"function\") {\r\n        this.logger.warn(\r\n          `Cache read failed for ${hash}: ${err.message}. Treating as miss.`\r\n        );\r\n      }\r\n\r\n      // Remove corrupted cache file\r\n      await fs.unlink(file).catch(() => {});\r\n\r\n      // Return null to treat as cache miss instead of throwing\r\n      return null;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Persist a cache entry to disk.\r\n   */\r\n  async set(hash: string, entry: CacheEntry): Promise<void> {\r\n    try {\r\n      await fs.ensureDir(this.baseDir);\r\n\r\n      // Add timestamp and version\r\n      const enhancedEntry: CacheEntry = {\r\n        ...entry,\r\n        timestamp: Date.now(),\r\n        version: \"1.0\",\r\n      };\r\n\r\n      // Serialize and optionally compress\r\n      const serialized = JSON.stringify(enhancedEntry);\r\n      let content: Buffer | string = serialized;\r\n\r\n      if (this.options.enableCompression) {\r\n        content = await gzip(Buffer.from(serialized));\r\n      }\r\n\r\n      // Write entry\r\n      const file = this.entryPath(hash);\r\n      if (this.options.enableCompression) {\r\n        await fs.writeFile(file, content as Buffer);\r\n      } else {\r\n        await fs.writeFile(file, content as string);\r\n      }\r\n\r\n      // Write metadata\r\n      const metaFile = this.metricPath(hash);\r\n      const metadata = {\r\n        timestamp: enhancedEntry.timestamp,\r\n        size: Buffer.byteLength(serialized),\r\n        compressed: this.options.enableCompression,\r\n        hash,\r\n      };\r\n      await fs.writeJson(metaFile, metadata);\r\n\r\n      // Update metrics\r\n      this.updateMetrics(metadata.size);\r\n\r\n      // Check cache size limits\r\n      if (\r\n        this.options.enableMetrics &&\r\n        this.metrics.totalSize > this.options.maxSize\r\n      ) {\r\n        await this.evictOldEntries();\r\n      }\r\n    } catch (error) {\r\n      console.warn(`Cache write failed for ${hash}:`, error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Remove a specific cache entry.\r\n   */\r\n  async remove(hash: string): Promise<void> {\r\n    const file = this.entryPath(hash);\r\n    const metaFile = this.metricPath(hash);\r\n\r\n    try {\r\n      // Get size before removal for metrics\r\n      let size = 0;\r\n      if (await fs.pathExists(metaFile)) {\r\n        const meta = await fs.readJson(metaFile);\r\n        size = meta.size || 0;\r\n      }\r\n\r\n      // Remove files\r\n      await Promise.all([\r\n        fs.remove(file).catch(() => {}),\r\n        fs.remove(metaFile).catch(() => {}),\r\n      ]);\r\n\r\n      // Update metrics\r\n      this.metrics.totalSize -= size;\r\n      this.metrics.entryCount = Math.max(0, this.metrics.entryCount - 1);\r\n    } catch (error) {\r\n      console.warn(`Cache removal failed for ${hash}:`, error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Clear all cache entries.\r\n   */\r\n  async clear(): Promise<void> {\r\n    try {\r\n      await fs.remove(this.baseDir);\r\n      await fs.ensureDir(this.baseDir);\r\n\r\n      this.metrics = {\r\n        hits: 0,\r\n        misses: 0,\r\n        evictions: 0,\r\n        totalSize: 0,\r\n        entryCount: 0,\r\n      };\r\n\r\n      await this.saveMetrics();\r\n    } catch (error) {\r\n      console.warn(\"Cache clear failed:\", error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Clean up expired entries.\r\n   */\r\n  async cleanup(): Promise<void> {\r\n    try {\r\n      if (!(await fs.pathExists(this.baseDir))) {\r\n        return;\r\n      }\r\n\r\n      const files = await fs.readdir(this.baseDir);\r\n      if (!files || !Array.isArray(files) || files.length === 0) {\r\n        return;\r\n      }\r\n\r\n      const metaFiles = files.filter((f) => f.endsWith(\".meta.json\"));\r\n\r\n      for (const metaFile of metaFiles) {\r\n        const metaPath = path.join(this.baseDir, metaFile);\r\n        const meta = await fs.readJson(metaPath);\r\n\r\n        if (\r\n          meta.timestamp &&\r\n          Date.now() - meta.timestamp > this.options.timeout\r\n        ) {\r\n          const hash = metaFile.replace(\".meta.json\", \"\");\r\n          await this.remove(hash);\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.warn(\"Cache cleanup failed:\", error);\r\n    }\r\n  }\r\n  /**\r\n   * Evict oldest entries to stay within size limit.\r\n   */\r\n  private async evictOldEntries(): Promise<void> {\r\n    try {\r\n      if (!(await fs.pathExists(this.baseDir))) {\r\n        return;\r\n      }\r\n\r\n      const files = await fs.readdir(this.baseDir);\r\n      if (!files) {\r\n        return;\r\n      }\r\n\r\n      const metaFiles = files.filter((f) => f.endsWith(\".meta.json\"));\r\n\r\n      // Sort by timestamp (oldest first)\r\n      const entries = await Promise.all(\r\n        metaFiles.map(async (file) => {\r\n          const metaPath = path.join(this.baseDir, file);\r\n          const meta = await fs.readJson(metaPath);\r\n          return {\r\n            hash: file.replace(\".meta.json\", \"\"),\r\n            timestamp: meta.timestamp || 0,\r\n            size: meta.size || 0,\r\n          };\r\n        })\r\n      );\r\n\r\n      entries.sort((a, b) => a.timestamp - b.timestamp);\r\n\r\n      // Remove oldest entries until we're under the size limit\r\n      const targetSize = this.options.maxSize * 0.8; // Remove to 80% of max size\r\n      let currentSize = this.metrics.totalSize;\r\n\r\n      for (const entry of entries) {\r\n        if (currentSize <= targetSize) break;\r\n\r\n        await this.remove(entry.hash);\r\n        currentSize -= entry.size;\r\n        this.metrics.evictions++;\r\n      }\r\n    } catch (error) {\r\n      console.warn(\"Cache eviction failed:\", error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get cache statistics.\r\n   */\r\n  getMetrics(): CacheMetrics {\r\n    return { ...this.metrics };\r\n  }\r\n\r\n  /**\r\n   * Get cache hit ratio.\r\n   */\r\n  getHitRatio(): number {\r\n    const total = this.metrics.hits + this.metrics.misses;\r\n    return total > 0 ? this.metrics.hits / total : 0;\r\n  }\r\n\r\n  private recordHit(): void {\r\n    if (this.options.enableMetrics) {\r\n      this.metrics.hits++;\r\n    }\r\n  }\r\n\r\n  private recordMiss(): void {\r\n    if (this.options.enableMetrics) {\r\n      this.metrics.misses++;\r\n    }\r\n  }\r\n\r\n  private updateMetrics(size: number): void {\r\n    if (this.options.enableMetrics) {\r\n      this.metrics.totalSize += size;\r\n      this.metrics.entryCount++;\r\n    }\r\n  }\r\n  /**\r\n   * Load metrics from disk.\r\n   */\r\n  private async loadMetrics(): Promise<void> {\r\n    if (!this.options.enableMetrics) return;\r\n\r\n    try {\r\n      if (await fs.pathExists(this.metadataPath)) {\r\n        const saved = await fs.readJson(this.metadataPath);\r\n        if (saved && typeof saved === \"object\") {\r\n          this.metrics = { ...this.metrics, ...saved };\r\n        }\r\n      } else {\r\n        // Calculate metrics from existing files\r\n        await this.recalculateMetrics();\r\n      }\r\n    } catch (error) {\r\n      console.warn(\"Failed to load cache metrics:\", error);\r\n      await this.recalculateMetrics();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Save metrics to disk.\r\n   */\r\n  private async saveMetrics(): Promise<void> {\r\n    if (!this.options.enableMetrics) return;\r\n\r\n    try {\r\n      await fs.writeJson(this.metadataPath, this.metrics);\r\n    } catch (error) {\r\n      console.warn(\"Failed to save cache metrics:\", error);\r\n    }\r\n  }\r\n  /**\r\n   * Recalculate metrics from existing cache files.\r\n   */\r\n  private async recalculateMetrics(): Promise<void> {\r\n    try {\r\n      if (!(await fs.pathExists(this.baseDir))) {\r\n        return;\r\n      }\r\n\r\n      const files = await fs.readdir(this.baseDir);\r\n      if (!files) {\r\n        return;\r\n      }\r\n\r\n      const metaFiles = files.filter((f) => f.endsWith(\".meta.json\"));\r\n      let totalSize = 0;\r\n      let entryCount = 0;\r\n\r\n      for (const metaFile of metaFiles) {\r\n        const metaPath = path.join(this.baseDir, metaFile);\r\n        try {\r\n          const meta = await fs.readJson(metaPath);\r\n          totalSize += meta.size || 0;\r\n          entryCount++;\r\n        } catch (error) {\r\n          console.warn(`Failed to read meta file ${metaFile}:`, error);\r\n        }\r\n      }\r\n\r\n      this.metrics.totalSize = totalSize;\r\n      this.metrics.entryCount = entryCount;\r\n    } catch (error) {\r\n      console.warn(\"Failed to recalculate cache metrics:\", error);\r\n    }\r\n  }\r\n  /**\r\n   * Periodically save metrics (call this in a background task).\r\n   */\r\n  async persistMetrics(): Promise<void> {\r\n    await this.saveMetrics();\r\n  }\r\n\r\n  /**\r\n   * Clean up resources and stop timers.\r\n   */\r\n  destroy(): void {\r\n    if (this.cleanupTimer) {\r\n      clearInterval(this.cleanupTimer);\r\n      this.cleanupTimer = undefined;\r\n    }\r\n  }\r\n}\r\n","import fs from \"fs-extra\";\r\nimport path from \"path\";\r\nimport { diffLines } from \"diff\";\r\n\r\n/**\r\n * Utility class used to detect schema changes between generations.\r\n */\r\nexport class TypeDiffer {\r\n  /**\r\n   * Determine if two JSON schema objects differ.\r\n   */\r\n  hasSchemaChanges(prev: any, next: any): boolean {\r\n    return JSON.stringify(prev) !== JSON.stringify(next);\r\n  }\r\n\r\n  /**\r\n   * Produce a diff of files between two directories.\r\n   */\r\n  async compareDirectories(dirA: string, dirB: string) {\r\n    const diffs: { file: string; message: string }[] = [];\r\n    const filesA = await fs.readdir(dirA);\r\n    for (const file of filesA) {\r\n      const aPath = path.join(dirA, file);\r\n      const bPath = path.join(dirB, file);\r\n      if (!fs.existsSync(bPath)) {\r\n        diffs.push({ file, message: \"missing in B\" });\r\n        continue;\r\n      }\r\n      const [aContent, bContent] = await Promise.all([\r\n        fs.readFile(aPath, \"utf-8\"),\r\n        fs.readFile(bPath, \"utf-8\"),\r\n      ]);\r\n      if (diffLines(aContent, bContent).some((d) => d.added || d.removed)) {\r\n        diffs.push({ file, message: \"content differs\" });\r\n      }\r\n    }\r\n    return diffs;\r\n  }\r\n}\r\n","export default class Diff {\n    diff(oldStr, newStr, \n    // Type below is not accurate/complete - see above for full possibilities - but it compiles\n    options = {}) {\n        let callback;\n        if (typeof options === 'function') {\n            callback = options;\n            options = {};\n        }\n        else if ('callback' in options) {\n            callback = options.callback;\n        }\n        // Allow subclasses to massage the input prior to running\n        const oldString = this.castInput(oldStr, options);\n        const newString = this.castInput(newStr, options);\n        const oldTokens = this.removeEmpty(this.tokenize(oldString, options));\n        const newTokens = this.removeEmpty(this.tokenize(newString, options));\n        return this.diffWithOptionsObj(oldTokens, newTokens, options, callback);\n    }\n    diffWithOptionsObj(oldTokens, newTokens, options, callback) {\n        var _a;\n        const done = (value) => {\n            value = this.postProcess(value, options);\n            if (callback) {\n                setTimeout(function () { callback(value); }, 0);\n                return undefined;\n            }\n            else {\n                return value;\n            }\n        };\n        const newLen = newTokens.length, oldLen = oldTokens.length;\n        let editLength = 1;\n        let maxEditLength = newLen + oldLen;\n        if (options.maxEditLength != null) {\n            maxEditLength = Math.min(maxEditLength, options.maxEditLength);\n        }\n        const maxExecutionTime = (_a = options.timeout) !== null && _a !== void 0 ? _a : Infinity;\n        const abortAfterTimestamp = Date.now() + maxExecutionTime;\n        const bestPath = [{ oldPos: -1, lastComponent: undefined }];\n        // Seed editLength = 0, i.e. the content starts with the same values\n        let newPos = this.extractCommon(bestPath[0], newTokens, oldTokens, 0, options);\n        if (bestPath[0].oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n            // Identity per the equality and tokenizer\n            return done(this.buildValues(bestPath[0].lastComponent, newTokens, oldTokens));\n        }\n        // Once we hit the right edge of the edit graph on some diagonal k, we can\n        // definitely reach the end of the edit graph in no more than k edits, so\n        // there's no point in considering any moves to diagonal k+1 any more (from\n        // which we're guaranteed to need at least k+1 more edits).\n        // Similarly, once we've reached the bottom of the edit graph, there's no\n        // point considering moves to lower diagonals.\n        // We record this fact by setting minDiagonalToConsider and\n        // maxDiagonalToConsider to some finite value once we've hit the edge of\n        // the edit graph.\n        // This optimization is not faithful to the original algorithm presented in\n        // Myers's paper, which instead pointlessly extends D-paths off the end of\n        // the edit graph - see page 7 of Myers's paper which notes this point\n        // explicitly and illustrates it with a diagram. This has major performance\n        // implications for some common scenarios. For instance, to compute a diff\n        // where the new text simply appends d characters on the end of the\n        // original text of length n, the true Myers algorithm will take O(n+d^2)\n        // time while this optimization needs only O(n+d) time.\n        let minDiagonalToConsider = -Infinity, maxDiagonalToConsider = Infinity;\n        // Main worker method. checks all permutations of a given edit length for acceptance.\n        const execEditLength = () => {\n            for (let diagonalPath = Math.max(minDiagonalToConsider, -editLength); diagonalPath <= Math.min(maxDiagonalToConsider, editLength); diagonalPath += 2) {\n                let basePath;\n                const removePath = bestPath[diagonalPath - 1], addPath = bestPath[diagonalPath + 1];\n                if (removePath) {\n                    // No one else is going to attempt to use this value, clear it\n                    // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n                    bestPath[diagonalPath - 1] = undefined;\n                }\n                let canAdd = false;\n                if (addPath) {\n                    // what newPos will be after we do an insertion:\n                    const addPathNewPos = addPath.oldPos - diagonalPath;\n                    canAdd = addPath && 0 <= addPathNewPos && addPathNewPos < newLen;\n                }\n                const canRemove = removePath && removePath.oldPos + 1 < oldLen;\n                if (!canAdd && !canRemove) {\n                    // If this path is a terminal then prune\n                    // @ts-expect-error - perf optimisation. This type-violating value will never be read.\n                    bestPath[diagonalPath] = undefined;\n                    continue;\n                }\n                // Select the diagonal that we want to branch from. We select the prior\n                // path whose position in the old string is the farthest from the origin\n                // and does not pass the bounds of the diff graph\n                if (!canRemove || (canAdd && removePath.oldPos < addPath.oldPos)) {\n                    basePath = this.addToPath(addPath, true, false, 0, options);\n                }\n                else {\n                    basePath = this.addToPath(removePath, false, true, 1, options);\n                }\n                newPos = this.extractCommon(basePath, newTokens, oldTokens, diagonalPath, options);\n                if (basePath.oldPos + 1 >= oldLen && newPos + 1 >= newLen) {\n                    // If we have hit the end of both strings, then we are done\n                    return done(this.buildValues(basePath.lastComponent, newTokens, oldTokens)) || true;\n                }\n                else {\n                    bestPath[diagonalPath] = basePath;\n                    if (basePath.oldPos + 1 >= oldLen) {\n                        maxDiagonalToConsider = Math.min(maxDiagonalToConsider, diagonalPath - 1);\n                    }\n                    if (newPos + 1 >= newLen) {\n                        minDiagonalToConsider = Math.max(minDiagonalToConsider, diagonalPath + 1);\n                    }\n                }\n            }\n            editLength++;\n        };\n        // Performs the length of edit iteration. Is a bit fugly as this has to support the\n        // sync and async mode which is never fun. Loops over execEditLength until a value\n        // is produced, or until the edit length exceeds options.maxEditLength (if given),\n        // in which case it will return undefined.\n        if (callback) {\n            (function exec() {\n                setTimeout(function () {\n                    if (editLength > maxEditLength || Date.now() > abortAfterTimestamp) {\n                        return callback(undefined);\n                    }\n                    if (!execEditLength()) {\n                        exec();\n                    }\n                }, 0);\n            }());\n        }\n        else {\n            while (editLength <= maxEditLength && Date.now() <= abortAfterTimestamp) {\n                const ret = execEditLength();\n                if (ret) {\n                    return ret;\n                }\n            }\n        }\n    }\n    addToPath(path, added, removed, oldPosInc, options) {\n        const last = path.lastComponent;\n        if (last && !options.oneChangePerToken && last.added === added && last.removed === removed) {\n            return {\n                oldPos: path.oldPos + oldPosInc,\n                lastComponent: { count: last.count + 1, added: added, removed: removed, previousComponent: last.previousComponent }\n            };\n        }\n        else {\n            return {\n                oldPos: path.oldPos + oldPosInc,\n                lastComponent: { count: 1, added: added, removed: removed, previousComponent: last }\n            };\n        }\n    }\n    extractCommon(basePath, newTokens, oldTokens, diagonalPath, options) {\n        const newLen = newTokens.length, oldLen = oldTokens.length;\n        let oldPos = basePath.oldPos, newPos = oldPos - diagonalPath, commonCount = 0;\n        while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(oldTokens[oldPos + 1], newTokens[newPos + 1], options)) {\n            newPos++;\n            oldPos++;\n            commonCount++;\n            if (options.oneChangePerToken) {\n                basePath.lastComponent = { count: 1, previousComponent: basePath.lastComponent, added: false, removed: false };\n            }\n        }\n        if (commonCount && !options.oneChangePerToken) {\n            basePath.lastComponent = { count: commonCount, previousComponent: basePath.lastComponent, added: false, removed: false };\n        }\n        basePath.oldPos = oldPos;\n        return newPos;\n    }\n    equals(left, right, options) {\n        if (options.comparator) {\n            return options.comparator(left, right);\n        }\n        else {\n            return left === right\n                || (!!options.ignoreCase && left.toLowerCase() === right.toLowerCase());\n        }\n    }\n    removeEmpty(array) {\n        const ret = [];\n        for (let i = 0; i < array.length; i++) {\n            if (array[i]) {\n                ret.push(array[i]);\n            }\n        }\n        return ret;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    castInput(value, options) {\n        return value;\n    }\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    tokenize(value, options) {\n        return Array.from(value);\n    }\n    join(chars) {\n        // Assumes ValueT is string, which is the case for most subclasses.\n        // When it's false, e.g. in diffArrays, this method needs to be overridden (e.g. with a no-op)\n        // Yes, the casts are verbose and ugly, because this pattern - of having the base class SORT OF\n        // assume tokens and values are strings, but not completely - is weird and janky.\n        return chars.join('');\n    }\n    postProcess(changeObjects, \n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    options) {\n        return changeObjects;\n    }\n    get useLongestToken() {\n        return false;\n    }\n    buildValues(lastComponent, newTokens, oldTokens) {\n        // First we convert our linked list of components in reverse order to an\n        // array in the right order:\n        const components = [];\n        let nextComponent;\n        while (lastComponent) {\n            components.push(lastComponent);\n            nextComponent = lastComponent.previousComponent;\n            delete lastComponent.previousComponent;\n            lastComponent = nextComponent;\n        }\n        components.reverse();\n        const componentLen = components.length;\n        let componentPos = 0, newPos = 0, oldPos = 0;\n        for (; componentPos < componentLen; componentPos++) {\n            const component = components[componentPos];\n            if (!component.removed) {\n                if (!component.added && this.useLongestToken) {\n                    let value = newTokens.slice(newPos, newPos + component.count);\n                    value = value.map(function (value, i) {\n                        const oldValue = oldTokens[oldPos + i];\n                        return oldValue.length > value.length ? oldValue : value;\n                    });\n                    component.value = this.join(value);\n                }\n                else {\n                    component.value = this.join(newTokens.slice(newPos, newPos + component.count));\n                }\n                newPos += component.count;\n                // Common case\n                if (!component.added) {\n                    oldPos += component.count;\n                }\n            }\n            else {\n                component.value = this.join(oldTokens.slice(oldPos, oldPos + component.count));\n                oldPos += component.count;\n            }\n        }\n        return components;\n    }\n}\n","import Diff from './base.js';\nimport { generateOptions } from '../util/params.js';\nclass LineDiff extends Diff {\n    constructor() {\n        super(...arguments);\n        this.tokenize = tokenize;\n    }\n    equals(left, right, options) {\n        // If we're ignoring whitespace, we need to normalise lines by stripping\n        // whitespace before checking equality. (This has an annoying interaction\n        // with newlineIsToken that requires special handling: if newlines get their\n        // own token, then we DON'T want to trim the *newline* tokens down to empty\n        // strings, since this would cause us to treat whitespace-only line content\n        // as equal to a separator between lines, which would be weird and\n        // inconsistent with the documented behavior of the options.)\n        if (options.ignoreWhitespace) {\n            if (!options.newlineIsToken || !left.includes('\\n')) {\n                left = left.trim();\n            }\n            if (!options.newlineIsToken || !right.includes('\\n')) {\n                right = right.trim();\n            }\n        }\n        else if (options.ignoreNewlineAtEof && !options.newlineIsToken) {\n            if (left.endsWith('\\n')) {\n                left = left.slice(0, -1);\n            }\n            if (right.endsWith('\\n')) {\n                right = right.slice(0, -1);\n            }\n        }\n        return super.equals(left, right, options);\n    }\n}\nexport const lineDiff = new LineDiff();\nexport function diffLines(oldStr, newStr, options) {\n    return lineDiff.diff(oldStr, newStr, options);\n}\nexport function diffTrimmedLines(oldStr, newStr, options) {\n    options = generateOptions(options, { ignoreWhitespace: true });\n    return lineDiff.diff(oldStr, newStr, options);\n}\n// Exported standalone so it can be used from jsonDiff too.\nexport function tokenize(value, options) {\n    if (options.stripTrailingCr) {\n        // remove one \\r before \\n to match GNU diff's --strip-trailing-cr behavior\n        value = value.replace(/\\r\\n/g, '\\n');\n    }\n    const retLines = [], linesAndNewlines = value.split(/(\\n|\\r\\n)/);\n    // Ignore the final empty token that occurs if the string ends with a new line\n    if (!linesAndNewlines[linesAndNewlines.length - 1]) {\n        linesAndNewlines.pop();\n    }\n    // Merge the content and line separators into single tokens\n    for (let i = 0; i < linesAndNewlines.length; i++) {\n        const line = linesAndNewlines[i];\n        if (i % 2 && !options.newlineIsToken) {\n            retLines[retLines.length - 1] += line;\n        }\n        else {\n            retLines.push(line);\n        }\n    }\n    return retLines;\n}\n","// packages/core/src/codegen/type-sync/orchestrator.ts\r\nimport { OpenAPIExtractor } from \"./extractors/openapi\";\r\nimport { TypeScriptGenerator } from \"./generators/typescript\";\r\nimport { APIClientGenerator } from \"./generators/api-client\";\r\nimport { ReactHookGenerator } from \"./generators/react-hooks\";\r\nimport { AIHookGenerator } from \"./generators/ai-hooks\";\r\nimport { GenerationCache } from \"./cache\";\r\nimport { TypeDiffer } from \"./type-sync\";\r\nimport fsExtra from \"fs-extra\";\r\nimport path from \"path\";\r\nimport crypto from \"crypto\";\r\nimport { performance } from \"perf_hooks\";\r\nimport type {\r\n  OpenAPISchema,\r\n  SyncOptions,\r\n  SyncResult,\r\n} from \"@farm-framework/types\";\r\nimport { TypeSyncError } from \"./errors\";\r\n\r\nconst fs = fsExtra;\r\nconst { ensureDir } = fsExtra;\r\n\r\n/** Visible, repo‑relative folder for generated artifacts */\r\nconst DEFAULT_OUTPUT_DIR = path.resolve(process.cwd(), \"generated\");\r\n\r\n/**\r\n * Performance metrics for monitoring generation cycles\r\n */\r\nexport interface PerformanceMetrics {\r\n  cycleStart: number;\r\n  extractionStart?: number;\r\n  extractionEnd?: number;\r\n  generationStart?: number;\r\n  generationEnd?: number;\r\n  cacheStart?: number;\r\n  cacheEnd?: number;\r\n  totalFiles: number;\r\n  cachedFiles: number;\r\n  generatedFiles: number;\r\n}\r\n\r\ninterface Generator {\r\n  generate: (\r\n    schema: OpenAPISchema,\r\n    opts: any\r\n  ) => Promise<{ path: string; checksum?: string; size?: number }>;\r\n}\r\n\r\n/**\r\n * Coordinates extraction of OpenAPI schemas and generation of TypeScript\r\n * artifacts used by the framework. Enhanced with performance monitoring,\r\n * incremental generation, and parallel processing.\r\n */\r\nexport class TypeSyncOrchestrator {\r\n  private extractor = new OpenAPIExtractor();\r\n  private cache = new GenerationCache(\".farm/cache/types\");\r\n  private differ = new TypeDiffer();\r\n  private generators = new Map<string, Generator>();\r\n  private config: SyncOptions | null = null;\r\n  private metrics: PerformanceMetrics | null = null;\r\n  private fileChecksums = new Map<string, string>();\r\n\r\n  /**\r\n   * Instantiate the orchestrator with default generators.\r\n   */\r\n  constructor() {\r\n    this.initializeGenerators();\r\n  }\r\n\r\n  /**\r\n   * Register built-in generator implementations.\r\n   */\r\n  private initializeGenerators() {\r\n    this.generators.set(\r\n      \"types\",\r\n      new TypeScriptGenerator() as unknown as Generator\r\n    );\r\n    this.generators.set(\r\n      \"client\",\r\n      new APIClientGenerator() as unknown as Generator\r\n    );\r\n    this.generators.set(\r\n      \"hooks\",\r\n      new ReactHookGenerator() as unknown as Generator\r\n    );\r\n    this.generators.set(\r\n      \"ai-hooks\",\r\n      new AIHookGenerator() as unknown as Generator\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Register a custom generator for a specific type.\r\n   */\r\n  registerGenerator(type: string, generator: Generator) {\r\n    this.generators.set(type, generator);\r\n  }\r\n\r\n  /**\r\n   * Prepare the orchestrator for operation.\r\n   */\r\n  async initialize(config: SyncOptions) {\r\n    const outputDir = config.outputDir ?? DEFAULT_OUTPUT_DIR;\r\n\r\n    this.config = {\r\n      ...config,\r\n      outputDir,\r\n      performance: {\r\n        enableMonitoring: true,\r\n        enableIncrementalGeneration: true,\r\n        maxConcurrency: 4,\r\n        cacheTimeout: 300000, // 5 minutes\r\n        ...config.performance,\r\n      },\r\n    };\r\n\r\n    await ensureDir(outputDir);\r\n\r\n    // Initialize cache with enhanced settings\r\n    await this.cache.initialize({\r\n      timeout: this.config.performance?.cacheTimeout || 300000,\r\n      enableCompression: true,\r\n      enableMetrics: this.config.performance?.enableMonitoring ?? true,\r\n    });\r\n\r\n    // Load existing file checksums for incremental generation\r\n    if (this.config.performance?.enableIncrementalGeneration) {\r\n      await this.loadFileChecksums();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Determine whether a generator should run based on current feature flags.\r\n   */\r\n  private isFeatureEnabled(genType: string): boolean {\r\n    if (!this.config) return false;\r\n    if (genType === \"client\") return this.config.features.client;\r\n    if (genType === \"hooks\") return this.config.features.hooks;\r\n    if (genType === \"ai-hooks\") return this.config.features.aiHooks;\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Run a single synchronization cycle, generating any necessary artifacts.\r\n   */\r\n  async syncOnce(opts?: Partial<SyncOptions>): Promise<SyncResult> {\r\n    if (!this.config) throw new Error(\"Orchestrator not initialized\");\r\n    const config = { ...this.config, ...opts } as SyncOptions;\r\n\r\n    // Initialize performance tracking\r\n    this.metrics = {\r\n      cycleStart: performance.now(),\r\n      totalFiles: 0,\r\n      cachedFiles: 0,\r\n      generatedFiles: 0,\r\n    };\r\n\r\n    try {\r\n      // Phase 1: Schema Extraction\r\n      this.metrics.extractionStart = performance.now();\r\n      const schema = await this.extractSchema(config);\r\n      this.metrics.extractionEnd = performance.now();\r\n\r\n      // Phase 2: Cache Check\r\n      this.metrics.cacheStart = performance.now();\r\n      const schemaHash = this.cache.hashSchema(schema);\r\n      const cached = await this.cache.get(schemaHash);\r\n\r\n      if (\r\n        cached &&\r\n        !this.differ.hasSchemaChanges(cached.schema, schema) &&\r\n        config.performance?.enableIncrementalGeneration &&\r\n        (await this.validateCachedFiles(cached.results))\r\n      ) {\r\n        this.metrics.cacheEnd = performance.now();\r\n        return this.buildCacheResult(cached.results);\r\n      }\r\n      this.metrics.cacheEnd = performance.now();\r\n\r\n      // Phase 3: Generation\r\n      this.metrics.generationStart = performance.now();\r\n      const results = await this.generateArtifacts(\r\n        schema,\r\n        config.outputDir!,\r\n        config\r\n      );\r\n      this.metrics.generationEnd = performance.now();\r\n\r\n      // Phase 4: Cache Update\r\n      await this.cache.set(schemaHash, {\r\n        schema,\r\n        results,\r\n        timestamp: Date.now(),\r\n        version: \"1.0\",\r\n      });\r\n\r\n      if (config.performance?.enableIncrementalGeneration) {\r\n        await this.updateFileChecksums(results);\r\n      }\r\n\r\n      return this.buildGenerationResult(results);\r\n    } catch (error) {\r\n      console.error(\"Sync cycle failed:\", error);\r\n      // Preserve old contract: reject the promise on fatal failure\r\n      throw new TypeSyncError(\"Connection refused\", error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Extract schema with error handling and performance tracking.\r\n   */\r\n  private async extractSchema(config: SyncOptions): Promise<OpenAPISchema> {\r\n    const outputPath = path.join(config.outputDir!, \"openapi.json\");\r\n\r\n    try {\r\n      const result = await this.extractor.extractFromFastAPI(\".\", outputPath, {\r\n        timeout: config.performance?.cacheTimeout || 30000,\r\n        enableCache: config.performance?.enableIncrementalGeneration !== false,\r\n        retries: 2,\r\n        healthCheckEndpoint: \"/health\",\r\n      });\r\n\r\n      if (config.performance?.enableMonitoring) {\r\n        console.log(\r\n          `📄 Schema extracted via ${result.source} in ${Math.round(\r\n            result.extractionTime\r\n          )}ms`\r\n        );\r\n        if (result.serverStartupTime) {\r\n          console.log(\r\n            `🚀 Server startup took ${Math.round(result.serverStartupTime)}ms`\r\n          );\r\n        }\r\n      }\r\n\r\n      return result.schema;\r\n    } catch (error) {\r\n      console.error(\"Schema extraction failed:\", error);\r\n\r\n      if (await fs.pathExists(outputPath)) {\r\n        console.warn(\"Using existing schema as fallback\");\r\n        return await fs.readJson(outputPath);\r\n      }\r\n\r\n      throw new Error(\"Schema extraction failed and no fallback available\");\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Validate that cached files still exist and match expected checksums.\r\n   */\r\n  private async validateCachedFiles(cachedResults: any[]): Promise<boolean> {\r\n    for (const result of cachedResults) {\r\n      if (!(await fs.pathExists(result.path))) return false;\r\n\r\n      if (result.checksum) {\r\n        const content = await fs.readFile(result.path, \"utf8\");\r\n        const currentChecksum = this.generateChecksum(content);\r\n        if (currentChecksum !== result.checksum) return false;\r\n      }\r\n    }\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Generate all artifacts for the provided schema with parallel processing.\r\n   */\r\n  private async generateArtifacts(\r\n    schema: OpenAPISchema,\r\n    outputDir: string,\r\n    config: SyncOptions\r\n  ) {\r\n    const results: Array<{\r\n      path: string;\r\n      checksum?: string;\r\n      size?: number;\r\n      generator?: string;\r\n      time?: number;\r\n    }> = [];\r\n    const order = [\"types\", \"client\", \"hooks\", \"ai-hooks\"];\r\n\r\n    const enabledGenerators = order.filter(\r\n      (type) => this.generators.get(type) && this.isFeatureEnabled(type)\r\n    );\r\n\r\n    this.metrics!.totalFiles = enabledGenerators.length;\r\n\r\n    const maxConcurrency = config.performance?.maxConcurrency || 4;\r\n    const useParallel = enabledGenerators.length > 1 && maxConcurrency > 1;\r\n\r\n    if (useParallel) {\r\n      const groups = this.groupGeneratorsByDependency(enabledGenerators);\r\n\r\n      for (const group of groups) {\r\n        const groupResults = await Promise.all(\r\n          group.map((type) =>\r\n            this.runGenerator(type, schema, outputDir, config)\r\n          )\r\n        );\r\n        results.push(...groupResults);\r\n      }\r\n    } else {\r\n      for (const type of enabledGenerators) {\r\n        results.push(await this.runGenerator(type, schema, outputDir, config));\r\n      }\r\n    }\r\n\r\n    return results;\r\n  }\r\n\r\n  /**\r\n   * Run a single generator with performance tracking.\r\n   */\r\n  private async runGenerator(\r\n    type: string,\r\n    schema: OpenAPISchema,\r\n    outputDir: string,\r\n    config: SyncOptions\r\n  ) {\r\n    const generator = this.generators.get(type);\r\n    if (!generator) throw new Error(`Generator '${type}' not found`);\r\n\r\n    const startTime = performance.now();\r\n    const generatorOpts = {\r\n      outputDir,\r\n      ...config.generators?.[type as keyof typeof config.generators],\r\n    };\r\n\r\n    try {\r\n      const result = await generator.generate(schema, generatorOpts);\r\n      const endTime = performance.now();\r\n\r\n      let size = result.size;\r\n      if (!size && (await fs.pathExists(result.path))) {\r\n        size = (await fs.stat(result.path)).size;\r\n      }\r\n\r\n      this.metrics!.generatedFiles++;\r\n\r\n      return {\r\n        ...result,\r\n        generator: type,\r\n        time: endTime - startTime,\r\n        size,\r\n      };\r\n    } catch (error) {\r\n      console.error(`Generator '${type}' failed:`, error);\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Group generators based on their dependencies for parallel execution.\r\n   */\r\n  private groupGeneratorsByDependency(generators: string[]): string[][] {\r\n    const groups: string[][] = [];\r\n\r\n    if (generators.includes(\"types\")) groups.push([\"types\"]);\r\n\r\n    const remaining = generators.filter((g) => g !== \"types\");\r\n    if (remaining.length) groups.push(remaining);\r\n\r\n    return groups;\r\n  }\r\n\r\n  /**\r\n   * Load existing file checksums for incremental generation.\r\n   */\r\n  private async loadFileChecksums() {\r\n    const checksumsPath = path.join(\".farm/cache\", \"file-checksums.json\");\r\n\r\n    try {\r\n      if (await fs.pathExists(checksumsPath)) {\r\n        const obj = await fs.readJson(checksumsPath);\r\n        if (obj && typeof obj === \"object\") {\r\n          this.fileChecksums = new Map(Object.entries(obj));\r\n        }\r\n      }\r\n    } catch (error) {\r\n      console.warn(\"Failed to load file checksums:\", error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update and persist file checksums.\r\n   */\r\n  private async updateFileChecksums(results: any[]) {\r\n    for (const r of results) {\r\n      if (r.checksum) this.fileChecksums.set(r.path, r.checksum);\r\n    }\r\n\r\n    const checksumsPath = path.join(\".farm/cache\", \"file-checksums.json\");\r\n    try {\r\n      await fs.ensureDir(path.dirname(checksumsPath));\r\n      await fs.writeJson(checksumsPath, Object.fromEntries(this.fileChecksums));\r\n    } catch (error) {\r\n      console.warn(\"Failed to save file checksums:\", error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Build result object for cached artifacts.\r\n   */\r\n  private buildCacheResult(cachedResults: any[]): SyncResult {\r\n    const result: SyncResult = {\r\n      filesGenerated: cachedResults.length,\r\n      fromCache: true,\r\n      artifacts: cachedResults.map((r: any) => r.path),\r\n    };\r\n\r\n    if (this.config?.performance?.enableMonitoring && this.metrics) {\r\n      result.performance = {\r\n        totalTime: performance.now() - this.metrics.cycleStart,\r\n        extractionTime:\r\n          this.metrics.extractionEnd! - this.metrics.extractionStart!,\r\n        generationTime: 0,\r\n        cacheTime: this.metrics.cacheEnd! - this.metrics.cacheStart!,\r\n        parallelJobs: 0,\r\n      };\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Build result object for newly generated artifacts.\r\n   */\r\n  private buildGenerationResult(results: any[]): SyncResult {\r\n    const result: SyncResult = {\r\n      filesGenerated: results.length,\r\n      fromCache: false,\r\n      artifacts: results.map((r: any) => r.path),\r\n    };\r\n\r\n    if (this.config?.performance?.enableMonitoring && this.metrics) {\r\n      result.performance = {\r\n        totalTime: performance.now() - this.metrics.cycleStart,\r\n        extractionTime:\r\n          (this.metrics.extractionEnd || 0) -\r\n          (this.metrics.extractionStart || 0),\r\n        generationTime:\r\n          (this.metrics.generationEnd || 0) -\r\n          (this.metrics.generationStart || 0),\r\n        cacheTime:\r\n          (this.metrics.cacheEnd || 0) - (this.metrics.cacheStart || 0),\r\n        parallelJobs: this.metrics.generatedFiles,\r\n      };\r\n\r\n      result.generationDetails = results.map((r) => ({\r\n        generator: r.generator || \"unknown\",\r\n        file: r.path,\r\n        time: r.time || 0,\r\n        fromCache: false,\r\n        size: r.size || 0,\r\n      }));\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Get performance metrics for the last sync cycle.\r\n   */\r\n  getLastMetrics(): PerformanceMetrics | null {\r\n    return this.metrics;\r\n  }\r\n\r\n  /**\r\n   * Generate MD5 checksum for content.\r\n   */\r\n  private generateChecksum(content: string): string {\r\n    return crypto.createHash(\"md5\").update(content).digest(\"hex\").slice(0, 8);\r\n  }\r\n\r\n  /**\r\n   * Watch for schema changes and automatically regenerate.\r\n   */\r\n  async watch(config: SyncOptions): Promise<void> {\r\n    const chokidar = await import(\"chokidar\");\r\n\r\n    const watchPaths = [\r\n      \"apps/api/**/*.py\",\r\n      \"packages/*/src/**/*.py\",\r\n      \".farm/config/**/*.json\",\r\n    ];\r\n\r\n    console.log(\"🔍 Watching for changes...\");\r\n\r\n    const watcher = chokidar.watch(watchPaths, {\r\n      ignored: /(^|[\\/\\\\])\\../,\r\n      persistent: true,\r\n      ignoreInitial: true,\r\n    });\r\n\r\n    let isGenerating = false;\r\n\r\n    const regenerate = async () => {\r\n      if (isGenerating) return;\r\n      isGenerating = true;\r\n\r\n      console.log(\"🔄 Schema changes detected, regenerating...\");\r\n      try {\r\n        const result = await this.syncOnce(config);\r\n        console.log(\r\n          `✅ Generated ${result.filesGenerated} files${\r\n            result.fromCache ? \" (from cache)\" : \"\"\r\n          }`\r\n        );\r\n        if (result.performance) {\r\n          console.log(\r\n            `📊 Total time: ${Math.round(result.performance.totalTime)}ms`\r\n          );\r\n        }\r\n      } catch (error) {\r\n        console.error(\"❌ Regeneration failed:\", error);\r\n      } finally {\r\n        isGenerating = false;\r\n      }\r\n    };\r\n\r\n    watcher\r\n      .on(\"change\", regenerate)\r\n      .on(\"add\", regenerate)\r\n      .on(\"unlink\", regenerate);\r\n\r\n    process.on(\"SIGINT\", () => {\r\n      console.log(\"\\n👋 Stopping watcher...\");\r\n      watcher.close();\r\n      process.exit(0);\r\n    });\r\n  }\r\n}\r\n","// packages/type-sync/src/errors.ts\nexport class TypeSyncError extends Error {\n  constructor(\n    message: string,\n    public readonly details?: unknown\n  ) {\n    super(message);\n    this.name = \"TypeSyncError\";\n  }\n}\n","// packages/type-sync/src/watcher.ts\r\nimport chokidar from \"chokidar\";\r\nimport fs from \"fs-extra\";\r\nimport { debounce } from \"lodash-es\";\r\nimport { TypeSyncOrchestrator } from \"./orchestrator\";\r\n\r\n/**\r\n * Watches Python source files for changes and triggers TypeScript type\r\n * regeneration when modifications are detected.\r\n */\r\nexport class TypeSyncWatcher {\r\n  private watcher: chokidar.FSWatcher | null = null;\r\n  private syncInProgress = false;\r\n\r\n  constructor(private orchestrator: TypeSyncOrchestrator) {\r\n    // Debounce is now applied directly to the event handler registration, not to the method itself.\r\n  }\r\n\r\n  /**\r\n   * Begin watching the configured file globs and respond to changes.\r\n   */\r\n  async start() {\r\n    this.watcher = chokidar.watch(\r\n      [\r\n        \"apps/api/src/models/**/*.py\",\r\n        \"apps/api/src/routes/**/*.py\",\r\n        \"apps/api/src/schemas/**/*.py\",\r\n        \"apps/api/src/ai/models/**/*.py\",\r\n      ],\r\n      {\r\n        ignored: [\"**/__pycache__/**\", \"**/*.pyc\"],\r\n        ignoreInitial: true,\r\n      }\r\n    );\r\n    this.watcher.on(\r\n      \"all\",\r\n      debounce(() => this.handleChange(), 500)\r\n    );\r\n    console.log(\"👀 Watching for Python model changes...\");\r\n  }\r\n\r\n  /**\r\n   * Stop watching for file changes.\r\n   */\r\n  async stop() {\r\n    await this.watcher?.close();\r\n  }\r\n\r\n  private handleChange = async () => {\r\n    if (this.syncInProgress) return;\r\n    console.log(\"🔄 Detected change, regenerating types...\");\r\n    try {\r\n      this.syncInProgress = true;\r\n      const start = Date.now();\r\n      const result = await this.orchestrator.syncOnce();\r\n      const duration = Date.now() - start;\r\n      console.log(\r\n        `✅ Types regenerated in ${duration}ms (${result.filesGenerated} files)`\r\n      );\r\n      await this.notifyFrontend();\r\n    } catch (err) {\r\n      console.error(\"❌ Type regeneration failed:\", err);\r\n    } finally {\r\n      this.syncInProgress = false;\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Touch a file within the generated types directory so that the frontend\r\n   * development server can react to new types.\r\n   */\r\n  private async notifyFrontend() {\r\n    const triggerPath = \".farm/types/generated/.timestamp\";\r\n    await fs.ensureFile(triggerPath);\r\n    await fs.writeFile(triggerPath, Date.now().toString());\r\n  }\r\n}\r\n","export async function fetchWithRetry(\r\n  url: string,\r\n  tries = 3,\r\n  sleep: (ms: number) => Promise<void> = (ms) =>\r\n    new Promise((r) => setTimeout(r, ms))\r\n) {\r\n  for (let i = 1; i <= tries; i++) {\r\n    try {\r\n      const res = await fetch(url);\r\n      if (!res.ok) {\r\n        throw new Error(`HTTP ${res.status}: ${res.statusText}`);\r\n      }\r\n      return await res.json();\r\n    } catch (error) {\r\n      if (i === tries) {\r\n        throw new Error(\r\n          `Failed after ${tries} attempts: ${error instanceof Error ? error.message : \"Unknown error\"}`\r\n        );\r\n      }\r\n      await sleep(500 * i); // exponential backoff\r\n    }\r\n  }\r\n}\r\n"],"mappings":"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","names":["fsExtra","import_fs_extra","import_path","fs","path","crypto","import_fs_extra","import_path","import_crypto","fs","path","exports","crypto","import_fs_extra","import_path","import_crypto","fs","path","crypto","import_fs_extra","import_path","import_crypto","fs","path","crypto","import_fs_extra","import_path","import_crypto","zlib","path","fs","crypto","import_fs_extra","import_path","path","value","fs","path","import_fs_extra","import_path","import_crypto","import_perf_hooks","fs","fsExtra","ensureDir","path","crypto","chokidar","import_fs_extra","chokidar","fs"]}