{"version":3,"sources":["../src/callbacks/callback.decorators.ts","../src/agent-ui/endpoint.registry.ts","../src/agent-ui/endpoint.decorators.ts","../src/agent-ui/ui-endpoints.discovery.ts","../src/agent-ui/ui-dispatch.controller.ts","../src/agent-ui/index.ts","../src/service-discovery/file-based.discovery.ts","../src/core/builder-registry.service.ts","../src/utils/graph-type.utils.ts","../src/graph/versioning/versioned-graph.service.ts","../src/callbacks/callback-store.ts","../src/callbacks/callback-registry.ts","../src/callbacks/idempotency-manager.ts","../src/callbacks/smart-callback.router.ts","../src/callbacks/universal-callback.service.ts","../src/callbacks/example.callback.ts","../src/callbacks/callback-acl.service.ts","../src/callbacks/callback-auditor.service.ts","../src/callbacks/callback-metrics.service.ts","../src/callbacks/callback-rate-limiter.ts","../src/callbacks/callback-patch.service.ts","../src/callbacks/telegram-patch.handler.ts","../src/callbacks/web-patch.handler.ts","../src/callbacks/index.ts","../src/callbacks/callback-token.guard.ts","../src/callbacks/callback.controller.ts","../src/graph/abstract-graph.builder.ts","../src/core/bootstrap.ts","../src/core/index.ts","../src/messages/attachments.ts","../src/messages/streaming.ts","../src/graph/graph-service.interface.ts","../src/graph/graph.controller.ts","../src/graph/graph-manifest.schema.ts","../src/graph/versioning/index.ts","../src/engines/api-call-tracer.utils.ts","../src/engines/graph-engine.factory.ts","../src/engines/langgraph/event-processor.utils.ts","../src/engines/langgraph/langgraph-engine.ts","../src/core/universal-graph.module.ts","../src/index.ts","../src/tools/mcp-converter.ts","../src/tools/mcp-tool-filter.ts","../src/tools/mcp-runtime-http.client.ts","../src/models/enums.ts","../src/models/rerankers/voyageai-rerank.ts","../src/models/model.initializer.ts","../src/retriever/enums.ts","../src/retriever/retriever.service.ts","../src/utils/index.ts","../src/service-discovery/index.ts","../src/service-discovery/static.discovery.ts"],"names":["EndpointRegistry","Logger","Injectable","ENDPOINT_METADATA_KEY","UIEndpointsDiscoveryService","getUIEndpointMethodsMetadata","Optional","UIDispatchController","NotFoundException","InternalServerErrorException","Post","ApiOperation","ApiResponse","Body","Get","ApiTags","Controller","FileBasedDiscovery","path2","os","fs","BuilderRegistryService","GraphTypeUtils","VersionedGraphService","randomBytes","IdempotencyStatus","IdempotencyManager","createHash","SmartCallbackRouter","resolve","CallbackACL","ForbiddenException","CallbackAuditAction","CallbackAuditor","randomUUID","entry","CallbackMetrics","Registry","collectDefaultMetrics","Counter","Histogram","Gauge","CallbackRateLimiter","CallbackPatchService","TelegramPatchHandler","WebPatchHandler","CallbackTokenGuard","UnauthorizedException","CallbackController","UseGuards","Req","path","getCallbackMetadata","getEndpointMetadata","createEndpointDescriptors","Inject","UniversalGraphService","findCallbackMethod","Module","net","logger","NestFactory","ValidationPipe","DocumentBuilder","SwaggerModule","AttachmentType","StreamChannel","GraphController","HttpException","HttpStatus","Res","ApiParam","Param","LangGraph","GraphEngineType","GraphEngineFactory","EventProcessor","chunk","LangGraphEngine","UniversalGraphModule","MetadataScanner","ModuleRef","ConfigModule","DiscoveryModule","z","DynamicStructuredTool","axios","response","McpRuntimeHttpClient","parseCallbackConfigArg","CallbackManager","ModelProvider","ModelType","ChatFeature","BaseDocumentCompressor","ChatOpenAI","AzureChatOpenAI","ChatAnthropic","ChatCohere","ChatMistralAI","CohereRerank","OpenAIEmbeddings","invokeConfig","finalConfig","RetrieverSearchType","RetrieverService","StaticDiscovery"],"mappings":"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","file":"index.cjs","sourcesContent":["// packages/sdk/src/decorators/callback.decorators.ts\n\nimport \"reflect-metadata\";\nimport { CallbackContext, CallbackResult } from \"./callback.interface\";\n\n/**\n * Metadata for a registered callback\n */\nexport interface CallbackMetadata {\n  handler: string;\n  method: string | symbol;\n  target: any;\n}\n\n/**\n * Metadata for callback methods\n */\nconst CALLBACK_METADATA_KEY = Symbol(\"callbacks\");\n\n/**\n * Metadata for classes with callbacks\n */\nconst CALLBACK_CLASS_METADATA_KEY = Symbol(\"callback_class\");\n\n/**\n * Extended callback context with access to builder\n */\nexport interface ExtendedCallbackContext extends CallbackContext {\n  /** Reference to graph builder for access to its methods and properties */\n  builder?: any;\n}\n\n/**\n * Type for basic callback handler\n * Re-export for compatibility\n */\nexport type { CallbackHandler } from \"./callback.interface\";\n\n/**\n * Type for extended callback handler with access to builder\n */\nexport type ExtendedCallbackHandler = (\n  context: ExtendedCallbackContext\n) => Promise<CallbackResult>;\n\n/**\n * @Callback decorator for methods\n *\n * @param handler Callback handler name\n *\n * @example\n * ```typescript\n * class LedgerCallbacks {\n *   @Callback('approve-transaction')\n *   async handleApprove(context: CallbackContext): Promise<CallbackResult> {\n *     return { success: true, message: 'Transaction approved' };\n *   }\n * }\n * ```\n */\nexport function Callback(handler: string) {\n  return function (\n    target: any,\n    propertyKey: string | symbol,\n    descriptor: PropertyDescriptor\n  ) {\n    // Get existing metadata\n    const existingCallbacks: CallbackMetadata[] =\n      Reflect.getMetadata(CALLBACK_METADATA_KEY, target.constructor) || [];\n\n    // Add new callback\n    const callbackMetadata: CallbackMetadata = {\n      handler,\n      method: propertyKey,\n      target: target.constructor,\n    };\n\n    existingCallbacks.push(callbackMetadata);\n\n    // Save updated metadata\n    Reflect.defineMetadata(\n      CALLBACK_METADATA_KEY,\n      existingCallbacks,\n      target.constructor\n    );\n\n    // Validate method signature\n    if (descriptor.value && typeof descriptor.value === \"function\") {\n      const originalMethod = descriptor.value;\n\n      descriptor.value = function (context: CallbackContext) {\n        // Additional validation logic can be added here\n        return originalMethod.call(this, context);\n      };\n    }\n\n    return descriptor;\n  };\n}\n\n/**\n * @WithCallbacks decorator for builder classes\n * Mixin approach: mixes methods from callback class into builder\n *\n * @param CallbacksClass Class with callbacks\n *\n * @example\n * ```typescript\n * @WithCallbacks(LedgerV1Callbacks)\n * export class LedgerV1Builder extends AbstractGraphBuilder {\n *   // Callbacks automatically become available as builder methods\n * }\n * ```\n */\nexport function WithCallbacks<T extends { new (...args: any[]): {} }>(\n  CallbacksClass: T\n) {\n  return function <U extends { new (...args: any[]): {} }>(BuilderClass: U) {\n    // Get callback metadata from callbacks class\n    const callbackMetadata: CallbackMetadata[] =\n      Reflect.getMetadata(CALLBACK_METADATA_KEY, CallbacksClass) || [];\n\n    // Create new class extending from builder\n    class WithCallbacksBuilder extends BuilderClass {\n      constructor(...args: any[]) {\n        super(...args);\n\n        // Create instance of callbacks class\n        const callbacksInstance = new CallbacksClass();\n\n        // Mix callback methods into current instance\n        callbackMetadata.forEach(({ method, handler }) => {\n          const callbackMethod = (callbacksInstance as any)[method];\n          if (typeof callbackMethod === \"function\") {\n            // Bind method to callbacks instance, but also give access to builder's this\n            (this as any)[method] = async (context: CallbackContext) => {\n              // Pass builder context to callback through special field\n              const enhancedContext = {\n                ...context,\n                builder: this, // Give access to builder's methods and properties\n              };\n              return callbackMethod.call(callbacksInstance, enhancedContext);\n            };\n          }\n        });\n      }\n    }\n\n    // Copy callback metadata to new class\n    Reflect.defineMetadata(\n      CALLBACK_METADATA_KEY,\n      callbackMetadata,\n      WithCallbacksBuilder\n    );\n\n    // Mark that class has callbacks\n    Reflect.defineMetadata(\n      CALLBACK_CLASS_METADATA_KEY,\n      true,\n      WithCallbacksBuilder\n    );\n\n    // Copy static properties and methods\n    Object.setPrototypeOf(WithCallbacksBuilder, BuilderClass);\n    Object.getOwnPropertyNames(BuilderClass).forEach(name => {\n      if (name !== \"length\" && name !== \"prototype\" && name !== \"name\") {\n        const descriptor = Object.getOwnPropertyDescriptor(BuilderClass, name);\n        if (descriptor) {\n          Object.defineProperty(WithCallbacksBuilder, name, descriptor);\n        }\n      }\n    });\n\n    return WithCallbacksBuilder as any;\n  };\n}\n\n/**\n * Gets all registered callbacks for a class\n */\nexport function getCallbackMetadata(target: any): CallbackMetadata[] {\n  return Reflect.getMetadata(CALLBACK_METADATA_KEY, target) || [];\n}\n\n/**\n * Checks if a class has callbacks\n */\nexport function hasCallbacks(target: any): boolean {\n  return Reflect.getMetadata(CALLBACK_CLASS_METADATA_KEY, target) === true;\n}\n\n/**\n * Finds callback handler method by name\n */\nexport function findCallbackMethod(\n  target: any,\n  handler: string\n): string | symbol | null {\n  const callbacks = getCallbackMetadata(target);\n  const callback = callbacks.find(cb => cb.handler === handler);\n  return callback ? callback.method : null;\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { JSONSchema7 } from \"json-schema\";\n\n/**\n * Request context for endpoint calls\n */\nexport interface RequestContext {\n  userId: string;\n  companyId?: string;\n  method: \"GET\" | \"POST\";\n  payload?: any;\n  channel: string; // 'web', 'webapp'\n  platform?: string; // 'telegram', 'slack', 'discord'\n}\n\n/**\n * Universal response envelope\n */\nexport interface DataEnvelope<T = any> {\n  schema: string; // Schema name or data type\n  data: T; // The actual data\n  meta?: {\n    total?: number; // For pagination\n    page?: number;\n    redirect?: string; // For navigation after action\n    message?: string; // Message to user\n  };\n}\n\n/**\n * Endpoint handler function type\n */\nexport type EndpointHandler = (ctx: RequestContext) => Promise<DataEnvelope>;\n\n/**\n * Endpoint descriptor interface\n */\nexport interface EndpointDescriptor {\n  name: string; // \"accounts.list\"\n  method: \"GET\" | \"POST\";\n  handler: EndpointHandler;\n  schema?: JSONSchema7;\n}\n\n/**\n * Registry for graph UI endpoints\n * Similar to CallbackRegistry but for synchronous data operations without TTL\n */\n@Injectable()\nexport class EndpointRegistry {\n  private readonly logger = new Logger(EndpointRegistry.name);\n\n  // Map<graphType, Map<endpointName, EndpointDescriptor>>\n  private readonly endpoints = new Map<\n    string,\n    Map<string, EndpointDescriptor>\n  >();\n\n  /**\n   * Register an endpoint for a specific graph type\n   * @param graphType The graph type (e.g., \"ledger::1.0.0\")\n   * @param endpoint The endpoint descriptor\n   */\n  register(graphType: string, endpoint: EndpointDescriptor): void {\n    if (!this.endpoints.has(graphType)) {\n      this.endpoints.set(graphType, new Map());\n    }\n\n    const graphEndpoints = this.endpoints.get(graphType)!;\n    graphEndpoints.set(endpoint.name, endpoint);\n\n    this.logger.debug(\n      `Registered endpoint \"${endpoint.name}\" for graph type \"${graphType}\"`\n    );\n  }\n\n  /**\n   * Register multiple endpoints for a graph type\n   * @param graphType The graph type\n   * @param endpoints Array of endpoint descriptors\n   */\n  registerMultiple(graphType: string, endpoints: EndpointDescriptor[]): void {\n    for (const endpoint of endpoints) {\n      this.register(graphType, endpoint);\n    }\n  }\n\n  /**\n   * Get an endpoint handler\n   * @param graphType The graph type\n   * @param endpointName The endpoint name\n   * @returns The endpoint descriptor or undefined\n   */\n  get(graphType: string, endpointName: string): EndpointDescriptor | undefined {\n    const graphEndpoints = this.endpoints.get(graphType);\n    return graphEndpoints?.get(endpointName);\n  }\n\n  /**\n   * List all endpoints for a graph type\n   * @param graphType The graph type\n   * @returns Array of endpoint names\n   */\n  list(graphType: string): string[] {\n    const graphEndpoints = this.endpoints.get(graphType);\n    if (!graphEndpoints) {\n      return [];\n    }\n    return Array.from(graphEndpoints.keys());\n  }\n\n  /**\n   * Alias for list() method for compatibility\n   */\n  listEndpoints(graphType: string): string[] {\n    return this.list(graphType);\n  }\n\n  /**\n   * List all registered graph types\n   * @returns Array of graph type names\n   */\n  listGraphTypes(): string[] {\n    return Array.from(this.endpoints.keys());\n  }\n\n  /**\n   * Call an endpoint\n   * @param graphType The graph type\n   * @param endpointName The endpoint name\n   * @param context The request context\n   * @returns The response envelope\n   */\n  async call(\n    graphType: string,\n    endpointName: string,\n    context: RequestContext\n  ): Promise<DataEnvelope> {\n    const endpoint = this.get(graphType, endpointName);\n\n    if (!endpoint) {\n      throw new Error(\n        `Endpoint \"${endpointName}\" not found for graph \"${graphType}\"`\n      );\n    }\n\n    // Validate HTTP method matches\n    if (endpoint.method !== context.method) {\n      throw new Error(\n        `Method mismatch: endpoint expects ${endpoint.method}, got ${context.method}`\n      );\n    }\n\n    this.logger.debug(\n      `Calling endpoint \"${endpointName}\" for graph \"${graphType}\" with method ${context.method}`\n    );\n\n    try {\n      return await endpoint.handler(context);\n    } catch (error) {\n      this.logger.error(\n        `Error calling endpoint \"${endpointName}\" for graph \"${graphType}\":`,\n        error\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Get statistics about registered endpoints\n   */\n  getStats(): {\n    totalGraphTypes: number;\n    totalEndpoints: number;\n    endpointsByGraph: Record<string, number>;\n  } {\n    const stats = {\n      totalGraphTypes: this.endpoints.size,\n      totalEndpoints: 0,\n      endpointsByGraph: {} as Record<string, number>,\n    };\n\n    for (const [graphType, endpoints] of this.endpoints) {\n      const count = endpoints.size;\n      stats.totalEndpoints += count;\n      stats.endpointsByGraph[graphType] = count;\n    }\n\n    return stats;\n  }\n\n  /**\n   * Clear all endpoints (mainly for testing)\n   */\n  clear(): void {\n    this.endpoints.clear();\n    this.logger.debug(\"Cleared all endpoints from registry\");\n  }\n\n  /**\n   * Clear endpoints for specific graph type (mainly for testing)\n   */\n  clearGraph(graphType: string): void {\n    this.endpoints.delete(graphType);\n    this.logger.debug(`Cleared endpoints for graph type \"${graphType}\"`);\n  }\n}\n","import \"reflect-metadata\";\nimport { JSONSchema7 } from \"json-schema\";\nimport { EndpointDescriptor } from \"./endpoint.registry\";\n\n/**\n * Metadata key for storing endpoint information\n */\nexport const ENDPOINT_METADATA_KEY = \"graph:endpoints\";\n\n/**\n * Endpoint metadata stored on classes\n */\nexport interface EndpointMetadata {\n  name: string;\n  method: \"GET\" | \"POST\";\n  methodName: string;\n  schema?: JSONSchema7;\n}\n\n/**\n * Options for endpoint decorator\n */\nexport interface EndpointOptions {\n  method: \"GET\" | \"POST\";\n  schema?: JSONSchema7;\n}\n\n/**\n * Decorator to mark a method as a graph endpoint\n * @param name Endpoint name (e.g., \"accounts.list\")\n * @param options Endpoint configuration\n */\nexport function Endpoint(name: string, options: EndpointOptions) {\n  return function (\n    target: any,\n    propertyKey: string,\n    descriptor: PropertyDescriptor\n  ) {\n    // Get existing metadata or initialize empty array\n    const existingMetadata: EndpointMetadata[] =\n      Reflect.getMetadata(ENDPOINT_METADATA_KEY, target.constructor) || [];\n\n    // Add new endpoint metadata\n    const metadata: EndpointMetadata = {\n      name,\n      method: options.method,\n      methodName: propertyKey,\n      schema: options.schema,\n    };\n\n    existingMetadata.push(metadata);\n\n    // Store updated metadata\n    Reflect.defineMetadata(\n      ENDPOINT_METADATA_KEY,\n      existingMetadata,\n      target.constructor\n    );\n  };\n}\n\n/**\n * Class decorator to mark a class as having endpoints\n * This ensures the metadata is properly initialized\n */\nexport function WithEndpoints(target: any) {\n  // Initialize metadata if not exists\n  if (!Reflect.hasMetadata(ENDPOINT_METADATA_KEY, target)) {\n    Reflect.defineMetadata(ENDPOINT_METADATA_KEY, [], target);\n  }\n}\n\n/**\n * Get endpoint metadata from a class constructor\n * @param constructor The class constructor\n * @returns Array of endpoint metadata\n */\nexport function getEndpointMetadata(constructor: any): EndpointMetadata[] {\n  return Reflect.getMetadata(ENDPOINT_METADATA_KEY, constructor) || [];\n}\n\n/**\n * Convert endpoint metadata to endpoint descriptors\n * @param instance The class instance\n * @param metadata Array of endpoint metadata\n * @returns Array of endpoint descriptors\n */\nexport function createEndpointDescriptors(\n  instance: any,\n  metadata: EndpointMetadata[]\n): EndpointDescriptor[] {\n  return metadata.map(meta => ({\n    name: meta.name,\n    method: meta.method,\n    schema: meta.schema,\n    handler: async ctx => {\n      const method = instance[meta.methodName];\n      if (typeof method !== \"function\") {\n        throw new Error(`Method ${meta.methodName} not found on instance`);\n      }\n      return method.call(instance, ctx);\n    },\n  }));\n}\n\n/**\n * Find endpoint method name by endpoint name\n * @param constructor Class constructor\n * @param endpointName Endpoint name to find\n * @returns Method name or undefined\n */\nexport function findEndpointMethod(\n  constructor: any,\n  endpointName: string\n): string | undefined {\n  const metadata = getEndpointMetadata(constructor);\n  const endpoint = metadata.find(meta => meta.name === endpointName);\n  return endpoint?.methodName;\n}\n\n// === UI ENDPOINTS DECORATORS ===\n\n/**\n * Metadata for UI endpoint classes\n */\nexport interface UIEndpointClassMetadata {\n  graphType: string;\n}\n\nexport interface UIEndpointMethodMetadata {\n  endpointName: string;\n  method: \"GET\" | \"POST\";\n  methodName: string | symbol;\n}\n\nconst UI_ENDPOINT_CLASS_METADATA_KEY = Symbol(\"ui_endpoint_class\");\nconst UI_ENDPOINT_METHOD_METADATA_KEY = Symbol(\"ui_endpoint_methods\");\n\n/**\n * Class decorator for UI Endpoints\n * Marks a class as containing UI endpoints for a specific graph type\n *\n * @example\n * ```typescript\n * @WithUIEndpoints('company.financial-ledger::1.0.0')\n * export class LedgerUIEndpoints {\n *   @UIEndpoint('accounts.list', 'GET')\n *   async listAccounts(ctx: RequestContext): Promise<DataEnvelope> { ... }\n * }\n * ```\n */\nexport function WithUIEndpoints(graphType: string) {\n  return function <T extends { new (...args: any[]): {} }>(constructor: T) {\n    // Mark class as having UI endpoints\n    Reflect.defineMetadata(\n      UI_ENDPOINT_CLASS_METADATA_KEY,\n      { graphType },\n      constructor\n    );\n    return constructor;\n  };\n}\n\n/**\n * Method decorator for individual UI endpoints\n *\n * @param endpointName The endpoint name (e.g., 'accounts.list')\n * @param method HTTP method (GET or POST)\n */\nexport function UIEndpoint(\n  endpointName: string,\n  method: \"GET\" | \"POST\" = \"GET\"\n) {\n  return function (\n    target: any,\n    propertyKey: string | symbol,\n    descriptor: PropertyDescriptor\n  ) {\n    // Get existing method metadata\n    const existingMethods: UIEndpointMethodMetadata[] =\n      Reflect.getMetadata(\n        UI_ENDPOINT_METHOD_METADATA_KEY,\n        target.constructor\n      ) || [];\n\n    // Add new method metadata\n    const methodMetadata: UIEndpointMethodMetadata = {\n      endpointName,\n      method,\n      methodName: propertyKey,\n    };\n\n    existingMethods.push(methodMetadata);\n\n    // Save updated metadata\n    Reflect.defineMetadata(\n      UI_ENDPOINT_METHOD_METADATA_KEY,\n      existingMethods,\n      target.constructor\n    );\n\n    return descriptor;\n  };\n}\n\n/**\n * Get UI endpoint class metadata\n */\nexport function getUIEndpointClassMetadata(\n  constructor: any\n): UIEndpointClassMetadata | null {\n  return (\n    Reflect.getMetadata(UI_ENDPOINT_CLASS_METADATA_KEY, constructor) || null\n  );\n}\n\n/**\n * Get all UI endpoint methods metadata for a class\n */\nexport function getUIEndpointMethodsMetadata(\n  constructor: any\n): UIEndpointMethodMetadata[] {\n  return (\n    Reflect.getMetadata(UI_ENDPOINT_METHOD_METADATA_KEY, constructor) || []\n  );\n}\n\n/**\n * Check if a class has UI endpoints\n */\nexport function hasUIEndpoints(constructor: any): boolean {\n  return getUIEndpointClassMetadata(constructor) !== null;\n}\n\n/**\n * Register UI endpoints from a class to the endpoint registry\n * @param endpointRegistry The endpoint registry\n * @param EndpointClass The UI endpoints class constructor\n * @param instance Optional pre-created instance (from DI container)\n */\nexport function registerUIEndpointsFromClass(\n  endpointRegistry: any, // EndpointRegistry type\n  EndpointClass: any,\n  instance?: any\n): void {\n  // Check if class has UI endpoints\n  const classMetadata = getUIEndpointClassMetadata(EndpointClass);\n  if (!classMetadata) {\n    return;\n  }\n\n  // Get method metadata\n  const methodsMetadata = getUIEndpointMethodsMetadata(EndpointClass);\n  if (methodsMetadata.length === 0) {\n    return;\n  }\n\n  // Use provided instance or create new one (for backward compatibility)\n  console.log(\"DEBUG: registerUIEndpointsFromClass\", {\n    hasInstance: !!instance,\n    willCreateNew: !instance,\n    className: EndpointClass.name,\n  });\n\n  const endpointInstance = instance || new EndpointClass();\n\n  // Convert to endpoint descriptors\n  const descriptors = methodsMetadata.map(meta => ({\n    name: meta.endpointName,\n    method: meta.method,\n    handler: async (ctx: any) => {\n      const method = endpointInstance[meta.methodName as string];\n      if (typeof method !== \"function\") {\n        throw new Error(\n          `Method ${String(meta.methodName)} not found on instance`\n        );\n      }\n      return method.call(endpointInstance, ctx);\n    },\n  }));\n\n  // Register all endpoints\n  endpointRegistry.registerMultiple(classMetadata.graphType, descriptors);\n}\n","// packages/sdk/src/endpoint-registry/ui-endpoints.discovery.ts\nimport { Injectable, Logger, OnModuleInit, Optional } from \"@nestjs/common\";\nimport { DiscoveryService, MetadataScanner } from \"@nestjs/core\";\nimport { EndpointRegistry } from \"./endpoint.registry\";\nimport {\n  hasUIEndpoints,\n  registerUIEndpointsFromClass,\n} from \"./endpoint.decorators\";\n\n/**\n * Service for auto-discovery of UI Endpoints in the application\n * Scans all providers for classes with @WithUIEndpoints decorator\n * and automatically registers them with the EndpointRegistry\n */\n@Injectable()\nexport class UIEndpointsDiscoveryService implements OnModuleInit {\n  private readonly logger = new Logger(UIEndpointsDiscoveryService.name);\n\n  constructor(\n    @Optional() private readonly discoveryService: DiscoveryService,\n    @Optional() private readonly metadataScanner: MetadataScanner,\n    private readonly endpointRegistry: EndpointRegistry\n  ) {}\n\n  async onModuleInit() {\n    await this.discoverUIEndpoints();\n  }\n\n  /**\n   * Discover and register all UI endpoint classes\n   * Called automatically during module initialization\n   */\n  async discoverUIEndpoints(): Promise<void> {\n    this.logger.log(\"Starting UI endpoints discovery...\");\n\n    // Check if DiscoveryService is available\n    if (!this.discoveryService) {\n      this.logger.warn(\n        \"DiscoveryService not available, skipping UI endpoints discovery\"\n      );\n      return;\n    }\n\n    // Get all providers from the entire application\n    const providers = this.discoveryService.getProviders();\n\n    let registeredCount = 0;\n    let totalEndpoints = 0;\n\n    for (const provider of providers) {\n      try {\n        const { instance, metatype } = provider;\n\n        // Skip if no metatype or instance\n        if (!metatype || !instance) {\n          continue;\n        }\n\n        // Check if this class has UI endpoints\n        if (hasUIEndpoints(metatype)) {\n          this.logger.debug(`Found UI endpoints class: ${metatype.name}`);\n          console.log(\"DEBUG: Discovery found instance\", {\n            className: metatype.name,\n            hasInstance: !!instance,\n            instanceType: typeof instance,\n          });\n\n          // Register the endpoints from this class\n          registerUIEndpointsFromClass(\n            this.endpointRegistry,\n            metatype,\n            instance\n          );\n\n          registeredCount++;\n\n          // Count endpoints for logging\n          const metadata = this.getUIEndpointMethodsCount(metatype);\n          totalEndpoints += metadata;\n\n          this.logger.log(\n            `Registered ${metadata} UI endpoints from ${metatype.name}`\n          );\n        }\n      } catch (error) {\n        this.logger.warn(`Failed to process provider: ${error.message}`);\n      }\n    }\n\n    this.logger.log(`UI endpoints discovery completed!`);\n    this.logger.log(\n      `Stats: ${registeredCount} classes, ${totalEndpoints} endpoints total`\n    );\n\n    // Log endpoint registry stats\n    const stats = this.endpointRegistry.getStats();\n    this.logger.log(\n      `Registry: ${stats.totalGraphTypes} graph types, ${stats.totalEndpoints} endpoints`\n    );\n  }\n\n  /**\n   * Get count of UI endpoint methods in a class\n   */\n  private getUIEndpointMethodsCount(metatype: any): number {\n    const { getUIEndpointMethodsMetadata } = require(\"./endpoint.decorators\");\n    const methods = getUIEndpointMethodsMetadata(metatype);\n    return methods.length;\n  }\n}\n","import {\n  Controller,\n  Post,\n  Get,\n  Body,\n  Param,\n  Headers,\n  Logger,\n  NotFoundException,\n  InternalServerErrorException,\n} from \"@nestjs/common\";\nimport { ApiTags, ApiOperation, ApiResponse } from \"@nestjs/swagger\";\nimport { DataEnvelope, EndpointRegistry, RequestContext } from \"./\";\nimport { BuilderRegistryService } from \"../core/builder-registry.service\";\n\nexport interface UIDispatchDto {\n  graphType: string;\n  endpoint: string;\n  method: \"GET\" | \"POST\";\n  data?: any;\n  context: {\n    userId: string;\n    companyId?: string;\n    channel?: string;\n    platform?: string;\n  };\n}\n\n/**\n * Controller for UI endpoint dispatch\n * Handles requests from backend to graph UI endpoints\n */\n@ApiTags(\"UI Dispatch\")\n@Controller(\"api/graph\")\nexport class UIDispatchController {\n  private readonly logger = new Logger(UIDispatchController.name);\n\n  constructor(\n    private readonly endpointRegistry: EndpointRegistry,\n    private readonly builderRegistry: BuilderRegistryService\n  ) {}\n\n  /**\n   * Dispatch a request to a UI endpoint\n   * Similar to callback dispatch but for synchronous UI operations\n   */\n  @Post(\"ui/dispatch\")\n  @ApiOperation({ summary: \"Dispatch request to UI endpoint\" })\n  @ApiResponse({\n    status: 200,\n    description: \"Successfully dispatched to endpoint\",\n  })\n  @ApiResponse({ status: 404, description: \"Endpoint not found\" })\n  async dispatchUIEndpoint(@Body() dto: UIDispatchDto): Promise<DataEnvelope> {\n    this.logger.debug(\n      `Dispatching UI request to ${dto.graphType}:${dto.endpoint}`\n    );\n\n    this.logger.debug(\"UIDispatchController received request\", {\n      graphType: dto.graphType,\n      endpoint: dto.endpoint,\n      method: dto.method,\n      data: dto.data,\n      context: dto.context,\n    });\n\n    try {\n      // Build request context\n      const context: RequestContext = {\n        userId: dto.context.userId,\n        companyId: dto.context.companyId,\n        method: dto.method,\n        payload: dto.data,\n        channel: dto.context.channel || \"web\",\n        platform: dto.context.platform,\n      };\n\n      this.logger.debug(\"Built RequestContext\", context);\n\n      // Call the endpoint through registry\n      const result = await this.endpointRegistry.call(\n        dto.graphType,\n        dto.endpoint,\n        context\n      );\n\n      this.logger.debug(\n        `Successfully dispatched to ${dto.graphType}:${dto.endpoint}`\n      );\n\n      return result;\n    } catch (error: any) {\n      this.logger.error(\n        `Failed to dispatch to ${dto.graphType}:${dto.endpoint}:`,\n        error.message\n      );\n\n      if (error.message.includes(\"not found\")) {\n        throw new NotFoundException(error.message);\n      }\n\n      throw new InternalServerErrorException(\n        `Failed to dispatch: ${error.message}`\n      );\n    }\n  }\n\n  /**\n   * Get manifest for a graph type\n   * Returns the graph configuration including UI section\n   */\n  @Get(\":graphType/manifest\")\n  @ApiOperation({ summary: \"Get graph manifest with UI configuration\" })\n  @ApiResponse({ status: 200, description: \"Graph manifest\" })\n  @ApiResponse({ status: 404, description: \"Graph not found\" })\n  async getGraphManifest(\n    @Param(\"graphType\") graphType: string,\n    @Headers(\"x-user-id\") userId: string\n  ): Promise<any> {\n    this.logger.debug(`Fetching manifest for graph ${graphType}`);\n\n    try {\n      // Get builder from registry\n      const builder = this.builderRegistry\n        .getBuilders()\n        .find(b => b.graphType === graphType);\n\n      if (!builder) {\n        throw new NotFoundException(`Graph ${graphType} not found in registry`);\n      }\n\n      // Get manifest from builder (it's already loaded from graph.manifest.json)\n      const manifest = (builder as any).manifest;\n\n      if (!manifest) {\n        this.logger.warn(\n          `Builder for ${graphType} exists but has no manifest loaded`\n        );\n        // Fallback: return basic manifest\n        return {\n          graphType,\n          name: graphType,\n          version: builder.version,\n          ui: {\n            enabled: false,\n          },\n        };\n      }\n\n      this.logger.debug(\n        `Found manifest for ${graphType} with UI enabled: ${!!manifest.ui?.enabled}`\n      );\n\n      return manifest;\n    } catch (error: any) {\n      this.logger.error(\n        `Failed to get manifest for ${graphType}:`,\n        error.message\n      );\n      throw new NotFoundException(`Graph ${graphType} not found`);\n    }\n  }\n\n  /**\n   * List all available UI endpoints for a graph\n   * Useful for debugging and discovery\n   */\n  @Get(\":graphType/endpoints\")\n  @ApiOperation({ summary: \"List UI endpoints for a graph\" })\n  @ApiResponse({\n    status: 200,\n    description: \"List of endpoint names\",\n    type: [String],\n  })\n  async listEndpoints(\n    @Param(\"graphType\") graphType: string,\n    @Headers(\"x-user-id\") userId: string\n  ): Promise<string[]> {\n    this.logger.debug(`Listing endpoints for graph ${graphType}`);\n\n    try {\n      const endpoints = this.endpointRegistry.listEndpoints(graphType);\n\n      this.logger.debug(`Found ${endpoints.length} endpoints for ${graphType}`);\n\n      return endpoints;\n    } catch (error: any) {\n      this.logger.error(\n        `Failed to list endpoints for ${graphType}:`,\n        error.message\n      );\n      return [];\n    }\n  }\n\n  /**\n   * Get catalog of all graphs\n   * Returns basic info about all registered graphs\n   */\n  @Get(\"catalog\")\n  @ApiOperation({ summary: \"Get catalog of all graphs\" })\n  @ApiResponse({\n    status: 200,\n    description: \"List of graphs with basic info\",\n  })\n  async getGraphCatalog(\n    @Headers(\"x-user-id\") userId: string,\n    @Headers(\"x-company-id\") companyId?: string\n  ): Promise<any[]> {\n    this.logger.debug(\"Fetching graph catalog\");\n\n    try {\n      // Get all registered graph types\n      const graphTypes = this.endpointRegistry.listGraphTypes();\n\n      // Build catalog with basic info\n      const catalog = graphTypes.map(graphType => ({\n        graphType,\n        name: graphType,\n        ui: {\n          enabled: this.endpointRegistry.listEndpoints(graphType).length > 0,\n        },\n      }));\n\n      this.logger.debug(`Returning catalog with ${catalog.length} graphs`);\n\n      return catalog;\n    } catch (error: any) {\n      this.logger.error(\"Failed to get graph catalog:\", error.message);\n      return [];\n    }\n  }\n}\n","export * from \"./endpoint.registry\";\nexport * from \"./endpoint.decorators\";\nexport * from \"./ui-endpoints.discovery\";\nexport * from \"./ui-dispatch.controller\";\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { ServiceDiscoveryProvider } from \"./service-discovery.provider\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\ninterface ServiceRegistration {\n  name: string;\n  address: string;\n  port: number;\n  metadata: Record<string, any>;\n  pid: number;\n  timestamp: number;\n  graphTypes: string[];\n}\n\n/**\n * File-based service discovery for local development\n * Services are registered in ~/.flutch/services/\n */\n@Injectable()\nexport class FileBasedDiscovery implements ServiceDiscoveryProvider {\n  private readonly logger = new Logger(FileBasedDiscovery.name);\n  private readonly servicesDir: string;\n\n  constructor() {\n    this.servicesDir = path.join(os.homedir(), \".flutch\", \"services\");\n    this.ensureServicesDirectory();\n    this.cleanupStaleServices();\n  }\n\n  /**\n   * Register service\n   */\n  async registerService(\n    name: string,\n    address: string,\n    port: number,\n    metadata: Record<string, any>,\n    graphTypes: string[] = []\n  ): Promise<void> {\n    const registration: ServiceRegistration = {\n      name,\n      address,\n      port,\n      metadata,\n      pid: process.pid,\n      timestamp: Date.now(),\n      graphTypes,\n    };\n\n    const serviceFile = path.join(\n      this.servicesDir,\n      `${name}-${process.pid}.json`\n    );\n\n    try {\n      await fs.promises.writeFile(\n        serviceFile,\n        JSON.stringify(registration, null, 2)\n      );\n\n      this.logger.log(`Registered service: ${name} at ${address}:${port}`);\n\n      // Automatic cleanup on process exit\n      process.on(\"exit\", () => this.unregisterService(name));\n      process.on(\"SIGINT\", () => {\n        this.unregisterService(name);\n        process.exit(0);\n      });\n      process.on(\"SIGTERM\", () => {\n        this.unregisterService(name);\n        process.exit(0);\n      });\n    } catch (error) {\n      this.logger.error(`Failed to register service ${name}: ${error.message}`);\n    }\n  }\n\n  /**\n   * Unregister service\n   */\n  async unregisterService(name: string): Promise<void> {\n    const serviceFile = path.join(\n      this.servicesDir,\n      `${name}-${process.pid}.json`\n    );\n\n    try {\n      if (fs.existsSync(serviceFile)) {\n        await fs.promises.unlink(serviceFile);\n        this.logger.log(`Unregistered service: ${name}`);\n      }\n    } catch (error) {\n      this.logger.error(\n        `Failed to unregister service ${name}: ${error.message}`\n      );\n    }\n  }\n\n  /**\n   * Get list of services by graph type\n   */\n  async getServices(graphType: string): Promise<\n    Array<{\n      name: string;\n      address: string;\n      port: number;\n      metadata: Record<string, any>;\n    }>\n  > {\n    try {\n      const files = await fs.promises.readdir(this.servicesDir);\n      const services: Array<{\n        name: string;\n        address: string;\n        port: number;\n        metadata: Record<string, any>;\n      }> = [];\n\n      for (const file of files) {\n        if (!file.endsWith(\".json\")) continue;\n\n        try {\n          const serviceFile = path.join(this.servicesDir, file);\n          const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n          const registration: ServiceRegistration = JSON.parse(content);\n\n          // Check if process is still alive\n          if (!this.isProcessAlive(registration.pid)) {\n            await fs.promises.unlink(serviceFile);\n            continue;\n          }\n\n          // Check if service supports required graph type\n          if (\n            registration.graphTypes.includes(graphType) ||\n            registration.metadata.graphTypes?.includes(graphType)\n          ) {\n            services.push({\n              name: registration.name,\n              address: registration.address,\n              port: registration.port,\n              metadata: registration.metadata,\n            });\n          }\n        } catch (error) {\n          this.logger.warn(\n            `Failed to parse service file ${file}: ${error.message}`\n          );\n        }\n      }\n\n      return services;\n    } catch (error) {\n      this.logger.error(`Failed to get services: ${error.message}`);\n      return [];\n    }\n  }\n\n  /**\n   * Find service by name\n   */\n  async findServiceByName(serviceName: string): Promise<{\n    name: string;\n    address: string;\n    port: number;\n    metadata: Record<string, any>;\n  } | null> {\n    try {\n      const files = await fs.promises.readdir(this.servicesDir);\n\n      for (const file of files) {\n        if (!file.endsWith(\".json\")) continue;\n\n        try {\n          const serviceFile = path.join(this.servicesDir, file);\n          const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n          const registration: ServiceRegistration = JSON.parse(content);\n\n          if (\n            registration.name === serviceName &&\n            this.isProcessAlive(registration.pid)\n          ) {\n            return {\n              name: registration.name,\n              address: registration.address,\n              port: registration.port,\n              metadata: registration.metadata,\n            };\n          }\n        } catch (error) {\n          this.logger.warn(\n            `Failed to parse service file ${file}: ${error.message}`\n          );\n        }\n      }\n\n      return null;\n    } catch (error) {\n      this.logger.error(\n        `Failed to find service ${serviceName}: ${error.message}`\n      );\n      return null;\n    }\n  }\n\n  /**\n   * Ensure services directory exists\n   */\n  private ensureServicesDirectory(): void {\n    try {\n      const amelieDir = path.join(os.homedir(), \".flutch\");\n      if (!fs.existsSync(amelieDir)) {\n        fs.mkdirSync(amelieDir, { recursive: true });\n      }\n\n      if (!fs.existsSync(this.servicesDir)) {\n        fs.mkdirSync(this.servicesDir, { recursive: true });\n      }\n    } catch (error) {\n      this.logger.error(\n        `Failed to create services directory: ${error.message}`\n      );\n    }\n  }\n\n  /**\n   * Cleanup stale services\n   */\n  private async cleanupStaleServices(): Promise<void> {\n    try {\n      const files = await fs.promises.readdir(this.servicesDir);\n\n      for (const file of files) {\n        if (!file.endsWith(\".json\")) continue;\n\n        try {\n          const serviceFile = path.join(this.servicesDir, file);\n          const content = await fs.promises.readFile(serviceFile, \"utf-8\");\n          const registration: ServiceRegistration = JSON.parse(content);\n\n          // Remove dead process entries\n          if (!this.isProcessAlive(registration.pid)) {\n            await fs.promises.unlink(serviceFile);\n            this.logger.debug(`Cleaned up stale service: ${registration.name}`);\n          }\n        } catch (error) {\n          // Remove corrupted files\n          try {\n            await fs.promises.unlink(path.join(this.servicesDir, file));\n          } catch {}\n        }\n      }\n    } catch (error) {\n      this.logger.error(`Failed to cleanup stale services: ${error.message}`);\n    }\n  }\n\n  /**\n   * Check if process is still alive\n   */\n  private isProcessAlive(pid: number): boolean {\n    try {\n      process.kill(pid, 0);\n      return true;\n    } catch (error) {\n      return false;\n    }\n  }\n}\n","// builder-registry.service.ts\nimport { Injectable } from \"@nestjs/common\";\nimport { AbstractGraphBuilder } from \"../graph/abstract-graph.builder\";\n\n@Injectable()\nexport class BuilderRegistryService {\n  private builders: AbstractGraphBuilder<string>[] = [];\n\n  registerBuilder(builder: AbstractGraphBuilder<string>) {\n    // Check if builder with this graphType is already registered\n    const existingBuilder = this.builders.find(\n      b => b.graphType === builder.graphType\n    );\n\n    if (!existingBuilder) {\n      this.builders.push(builder);\n    }\n    // If builder is already registered, simply ignore (avoid duplicates)\n  }\n\n  getBuilders(): AbstractGraphBuilder<string>[] {\n    return this.builders;\n  }\n}\n","/**\n * Utilities for working with versioned graph types\n * Format: \"company.name::version\"\n * Examples:\n * - \"global.simple::1.2.0\"\n * - \"company-123.customRag::2.1.0-beta\"\n * - \"global.simple\" (without version)\n * - \"simple\" (legacy format)\n */\nexport class GraphTypeUtils {\n  /**\n   * Parse full graph type\n   * @param fullType - full graph type\n   * @returns object with type components\n   */\n  static parse(fullType: string): {\n    companyId: string;\n    name: string;\n    version?: string;\n  } {\n    // Check for version presence\n    if (fullType.includes(\"::\")) {\n      const [baseType, version] = fullType.split(\"::\");\n      const [companyId, name] = baseType.split(\".\");\n      return { companyId, name, version };\n    }\n\n    // Without version: \"global.simple\" or legacy format \"simple\"\n    const parts = fullType.split(\".\");\n\n    // Legacy format: \"simple\" → \"global.simple\"\n    if (parts.length === 1) {\n      return { companyId: \"global\", name: parts[0] };\n    }\n\n    // Format without version: \"global.simple\"\n    return { companyId: parts[0], name: parts[1] };\n  }\n\n  /**\n   * Build full type from components\n   * @param companyId - company ID\n   * @param name - graph name\n   * @param version - version (optional)\n   * @returns full graph type\n   */\n  static build(companyId: string, name: string, version?: string): string {\n    const base = `${companyId}.${name}`;\n    return version ? `${base}::${version}` : base;\n  }\n\n  /**\n   * Normalize graph type for backward compatibility\n   * @param graphType - graph type in any format\n   * @returns normalized type\n   */\n  static normalize(graphType: string): string {\n    const { companyId, name, version } = this.parse(graphType);\n    return this.build(companyId, name, version);\n  }\n\n  /**\n   * Get base type without version\n   * @param graphType - full graph type\n   * @returns base type\n   */\n  static getBaseType(graphType: string): string {\n    if (graphType.includes(\"::\")) {\n      return graphType.split(\"::\")[0];\n    }\n    // Normalize legacy format\n    const { companyId, name } = this.parse(graphType);\n    return `${companyId}.${name}`;\n  }\n\n  /**\n   * Extract version from graph type\n   * @param graphType - full graph type\n   * @returns version or undefined\n   */\n  static getVersion(graphType: string): string | undefined {\n    return graphType.includes(\"::\") ? graphType.split(\"::\")[1] : undefined;\n  }\n\n  /**\n   * Validate version (basic semver check)\n   * @param version - version to check\n   * @returns true if version is valid\n   */\n  static isValidVersion(version: string): boolean {\n    // Basic semver pattern check\n    const semverRegex = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?$/;\n    return semverRegex.test(version);\n  }\n\n  /**\n   * Check if type is system (global)\n   * @param graphType - graph type\n   * @returns true if graph is system\n   */\n  static isSystemGraph(graphType: string): boolean {\n    const { companyId } = this.parse(graphType);\n    return companyId === \"global\";\n  }\n\n  /**\n   * Compare versions (simple comparison for sorting)\n   * @param a - first version\n   * @param b - second version\n   * @returns -1, 0, 1 for sorting\n   */\n  static compareVersions(a: string, b: string): number {\n    const parseVersion = (v: string) => {\n      const [main, prerelease] = v.split(\"-\");\n      const [major, minor, patch] = main.split(\".\").map(Number);\n      return { major, minor, patch, prerelease };\n    };\n\n    const versionA = parseVersion(a);\n    const versionB = parseVersion(b);\n\n    // Compare major\n    if (versionA.major !== versionB.major) {\n      return versionA.major - versionB.major;\n    }\n\n    // Compare minor\n    if (versionA.minor !== versionB.minor) {\n      return versionA.minor - versionB.minor;\n    }\n\n    // Compare patch\n    if (versionA.patch !== versionB.patch) {\n      return versionA.patch - versionB.patch;\n    }\n\n    // Compare prerelease\n    if (versionA.prerelease && !versionB.prerelease) return -1;\n    if (!versionA.prerelease && versionB.prerelease) return 1;\n    if (versionA.prerelease && versionB.prerelease) {\n      return versionA.prerelease.localeCompare(versionB.prerelease);\n    }\n\n    return 0;\n  }\n}\n","// packages/sdk/src/versioning/versioned-graph.service.ts\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { ModuleRef } from \"@nestjs/core\";\nimport { GraphTypeUtils } from \"../../utils/graph-type.utils\";\nimport { AbstractGraphBuilder } from \"../abstract-graph.builder\";\nimport {\n  VersioningConfig,\n  VersionRoute,\n  VersionResolution,\n  VersionResolutionOptions,\n} from \"./versioning.types\";\n\n/**\n * Service for managing graph versions\n * Abstracts versioning logic to the service-mesh level\n */\n@Injectable()\nexport class VersionedGraphService {\n  private readonly logger = new Logger(VersionedGraphService.name);\n  private readonly versionConfigs = new Map<string, VersioningConfig>();\n\n  constructor() {\n    // Initialization now happens through UniversalGraphModule\n    // ModuleRef will be provided when needed via method parameters\n  }\n\n  /**\n   * Register versioning configuration\n   */\n  registerVersioning(config: VersioningConfig): void {\n    this.versionConfigs.set(config.baseGraphType, config);\n    this.logger.log(\n      `Registered versioning for ${config.baseGraphType} with ${config.versions.length} versions`\n    );\n  }\n\n  /**\n   * Resolve graph version\n   */\n  async resolveVersion(\n    graphType: string,\n    options: VersionResolutionOptions = {}\n  ): Promise<VersionResolution> {\n    const parsed = GraphTypeUtils.parse(graphType);\n    const baseType = GraphTypeUtils.getBaseType(graphType);\n    const requestedVersion =\n      GraphTypeUtils.getVersion(graphType) || options.requestedVersion;\n\n    const config = this.versionConfigs.get(baseType);\n    if (!config) {\n      throw new Error(`No versioning configuration found for ${baseType}`);\n    }\n\n    // Find suitable version\n    const route = this.findBestVersionRoute(config, requestedVersion, options);\n    if (!route) {\n      throw new Error(\n        `No compatible version found for ${graphType} with options: ${JSON.stringify(options)}`\n      );\n    }\n\n    const fullGraphType = GraphTypeUtils.build(\n      parsed.companyId,\n      parsed.name,\n      route.version\n    );\n\n    return {\n      version: route.version,\n      builderClass: route.builderClass,\n      fullGraphType,\n    };\n  }\n\n  /**\n   * Create builder for specified version\n   */\n  async createVersionedBuilder(\n    graphType: string,\n    moduleRef?: ModuleRef,\n    options: VersionResolutionOptions = {}\n  ): Promise<AbstractGraphBuilder<any>> {\n    const resolution = await this.resolveVersion(graphType, options);\n\n    try {\n      if (!moduleRef) {\n        throw new Error(\n          \"ModuleRef is not available - falling back to direct instantiation\"\n        );\n      }\n      const builder = await moduleRef.create(resolution.builderClass);\n      this.logger.debug(\n        `Created versioned builder for ${resolution.fullGraphType}`\n      );\n      return builder;\n    } catch (error) {\n      this.logger.error(\n        `Failed to create builder for ${resolution.fullGraphType}: ${error.message}`\n      );\n      throw new Error(`Failed to create versioned builder: ${error.message}`);\n    }\n  }\n\n  /**\n   * Get all available versions for a graph\n   */\n  getAvailableVersions(baseGraphType: string): string[] {\n    const config = this.versionConfigs.get(baseGraphType);\n    if (!config) {\n      return [];\n    }\n\n    return config.versions\n      .map(route => route.version)\n      .sort((a, b) => GraphTypeUtils.compareVersions(b, a)); // Sort in descending order\n  }\n\n  /**\n   * Check version support\n   */\n  isVersionSupported(\n    graphType: string,\n    options: VersionResolutionOptions = {}\n  ): boolean {\n    try {\n      const baseType = GraphTypeUtils.getBaseType(graphType);\n      const requestedVersion = GraphTypeUtils.getVersion(graphType);\n      const config = this.versionConfigs.get(baseType);\n\n      if (!config) {\n        return false;\n      }\n\n      const route = this.findBestVersionRoute(\n        config,\n        requestedVersion,\n        options\n      );\n      return route !== null;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Find best version\n   */\n  private findBestVersionRoute(\n    config: VersioningConfig,\n    requestedVersion?: string,\n    options: VersionResolutionOptions = {}\n  ): VersionRoute | null {\n    const { strict = false } = options;\n    let candidates = [...config.versions];\n\n    // If a specific version is requested\n    if (requestedVersion) {\n      // Exact match\n      const exactMatch = candidates.find(\n        route => route.version === requestedVersion\n      );\n      if (exactMatch) {\n        return exactMatch;\n      }\n\n      // In strict mode, don't search for alternatives\n      if (strict) {\n        return null;\n      }\n\n      // Find compatible version (semantic versioning)\n      const compatibleVersions = candidates.filter(route =>\n        this.isVersionCompatible(requestedVersion, route.version)\n      );\n\n      if (compatibleVersions.length > 0) {\n        // Return the newest compatible version\n        return compatibleVersions.sort((a, b) =>\n          GraphTypeUtils.compareVersions(b.version, a.version)\n        )[0];\n      }\n    }\n\n    // Return default version\n    const defaultRoute = candidates.find(route => route.isDefault);\n    if (defaultRoute) {\n      return defaultRoute;\n    }\n\n    // If there's no explicit default version, use strategy\n    if (\n      config.defaultVersionStrategy === \"latest\" ||\n      !config.defaultVersionStrategy\n    ) {\n      const sortedVersions = candidates.sort((a, b) =>\n        GraphTypeUtils.compareVersions(b.version, a.version)\n      );\n      return sortedVersions[0] || null;\n    }\n\n    return null;\n  }\n\n  /**\n   * Check version compatibility (simplified semantics)\n   */\n  private isVersionCompatible(requested: string, available: string): boolean {\n    try {\n      const requestedParts = requested.split(\".\").map(Number);\n      const availableParts = available.split(\".\").map(Number);\n\n      // Major version must match\n      if (requestedParts[0] !== availableParts[0]) {\n        return false;\n      }\n\n      // Available version must be >= requested\n      return GraphTypeUtils.compareVersions(available, requested) >= 0;\n    } catch {\n      return false;\n    }\n  }\n\n  /**\n   * Get versioning configuration information\n   */\n  getVersioningInfo(baseGraphType: string): VersioningConfig | null {\n    return this.versionConfigs.get(baseGraphType) || null;\n  }\n}\n","import { randomBytes } from \"crypto\";\nimport type Redis from \"ioredis\";\nimport { CallbackEntry, CallbackRecord } from \"./callback.interface\";\n\n/**\n * CallbackStore manages callback tokens and their lifecycle.\n *\n * Production mode (NODE_ENV=production):\n * - Uses Lua scripts for atomic operations (better performance, guaranteed consistency)\n * - Prevents race conditions in high-concurrency scenarios\n * - Single network round-trip per operation\n *\n * Development mode (NODE_ENV!=production):\n * - Uses simple Redis operations for ioredis-mock compatibility\n * - Non-atomic operations (acceptable for development/testing)\n * - Better debugging and simpler error handling\n */\nexport class CallbackStore {\n  private readonly isProduction: boolean;\n\n  constructor(private readonly redis: Redis) {\n    this.isProduction = process.env.NODE_ENV === \"production\";\n  }\n\n  private generateToken(graphType: string): string {\n    // Use :: as separator since it's not used in base64url\n    // Format: cb::{graphType}::{random}\n    // 8 bytes = 64 bits of entropy, practically collision-free for short-lived tokens\n    return `cb::${graphType}::${randomBytes(8).toString(\"base64url\")}`;\n  }\n\n  /**\n   * Issues a new callback token and persists its payload.\n   */\n  async issue(entry: CallbackEntry): Promise<string> {\n    const token = this.generateToken(entry.graphType);\n    const record: CallbackRecord = {\n      ...entry,\n      token,\n      status: \"pending\",\n      createdAt: Date.now(),\n      retries: 0,\n    };\n    const ttl = entry.metadata?.ttlSec ?? 600; // default 10 minutes\n    await this.redis.setex(`callback:${token}`, ttl, JSON.stringify(record));\n    return token;\n  }\n\n  /**\n   * Atomically fetches callback data and acquires a lock.\n   */\n  async getAndLock(token: string): Promise<CallbackRecord | null> {\n    if (this.isProduction) {\n      return this.getAndLockAtomic(token);\n    } else {\n      return this.getAndLockSimple(token);\n    }\n  }\n\n  /**\n   * Production version with Lua script for atomicity\n   */\n  private async getAndLockAtomic(\n    token: string\n  ): Promise<CallbackRecord | null> {\n    const script = `\n      local data = redis.call('GET', KEYS[1])\n      if not data then return nil end\n      local record = cjson.decode(data)\n      if record.status ~= 'pending' then return nil end\n      record.status = 'processing'\n      redis.call('SET', KEYS[1], cjson.encode(record))\n      return cjson.encode(record)\n    `;\n    const result = await this.redis.eval(script, 1, `callback:${token}`);\n    return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n  }\n\n  /**\n   * Development version with simple operations for ioredis-mock compatibility\n   */\n  private async getAndLockSimple(\n    token: string\n  ): Promise<CallbackRecord | null> {\n    const key = `callback:${token}`;\n    const data = await this.redis.get(key);\n\n    if (!data) {\n      return null;\n    }\n\n    try {\n      const record = JSON.parse(data) as CallbackRecord;\n\n      if (record.status !== \"pending\") {\n        return null;\n      }\n\n      // Update status to processing\n      record.status = \"processing\";\n      await this.redis.set(key, JSON.stringify(record));\n\n      return record;\n    } catch (error) {\n      console.error(\"Failed to parse callback record:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Finalizes callback processing by removing token.\n   */\n  async finalize(token: string): Promise<void> {\n    await this.redis.del(`callback:${token}`);\n  }\n\n  /**\n   * Mark callback as failed and store error message.\n   */\n  async fail(token: string, error: string): Promise<CallbackRecord | null> {\n    if (this.isProduction) {\n      return this.failAtomic(token, error);\n    } else {\n      return this.failSimple(token, error);\n    }\n  }\n\n  /**\n   * Production version with Lua script for atomicity\n   */\n  private async failAtomic(\n    token: string,\n    error: string\n  ): Promise<CallbackRecord | null> {\n    const script = `\n      local data = redis.call('GET', KEYS[1])\n      if not data then return nil end\n      local record = cjson.decode(data)\n      record.status = 'failed'\n      record.retries = (record.retries or 0) + 1\n      record.lastError = ARGV[1]\n      redis.call('SET', KEYS[1], cjson.encode(record))\n      return cjson.encode(record)\n    `;\n    const result = await this.redis.eval(script, 1, `callback:${token}`, error);\n    return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n  }\n\n  /**\n   * Development version with simple operations for ioredis-mock compatibility\n   */\n  private async failSimple(\n    token: string,\n    error: string\n  ): Promise<CallbackRecord | null> {\n    const key = `callback:${token}`;\n    const data = await this.redis.get(key);\n\n    if (!data) {\n      return null;\n    }\n\n    try {\n      const record = JSON.parse(data) as CallbackRecord;\n      record.status = \"failed\";\n      record.retries = (record.retries || 0) + 1;\n      record.lastError = error;\n\n      await this.redis.set(key, JSON.stringify(record));\n      return record;\n    } catch (parseError) {\n      console.error(\"Failed to parse callback record:\", parseError);\n      return null;\n    }\n  }\n\n  /**\n   * Reset callback status to pending for retry.\n   */\n  async retry(token: string): Promise<CallbackRecord | null> {\n    if (this.isProduction) {\n      return this.retryAtomic(token);\n    } else {\n      return this.retrySimple(token);\n    }\n  }\n\n  /**\n   * Production version with Lua script for atomicity\n   */\n  private async retryAtomic(token: string): Promise<CallbackRecord | null> {\n    const script = `\n      local data = redis.call('GET', KEYS[1])\n      if not data then return nil end\n      local record = cjson.decode(data)\n      record.status = 'pending'\n      redis.call('SET', KEYS[1], cjson.encode(record))\n      return cjson.encode(record)\n    `;\n    const result = await this.redis.eval(script, 1, `callback:${token}`);\n    return result ? (JSON.parse(result as string) as CallbackRecord) : null;\n  }\n\n  /**\n   * Development version with simple operations for ioredis-mock compatibility\n   */\n  private async retrySimple(token: string): Promise<CallbackRecord | null> {\n    const key = `callback:${token}`;\n    const data = await this.redis.get(key);\n\n    if (!data) {\n      return null;\n    }\n\n    try {\n      const record = JSON.parse(data) as CallbackRecord;\n      record.status = \"pending\";\n\n      await this.redis.set(key, JSON.stringify(record));\n      return record;\n    } catch (parseError) {\n      console.error(\"Failed to parse callback record:\", parseError);\n      return null;\n    }\n  }\n}\n","import { CallbackHandler } from \"./callback.interface\";\n\nexport class CallbackRegistry {\n  private handlers = new Map<string, CallbackHandler>();\n\n  /**\n   * Register a callback with optional graph type for versioning\n   * @param handler Handler name (e.g., \"confirm-transaction\")\n   * @param callback The callback function\n   * @param graphType Optional graph type for version-specific registration\n   */\n  register(\n    handler: string,\n    callback: CallbackHandler,\n    graphType?: string\n  ): void {\n    // If graphType provided, use versioned key\n    const key = graphType ? `${graphType}::${handler}` : handler;\n    this.handlers.set(key, callback);\n\n    // Also register without version as fallback (for backward compatibility)\n    if (graphType) {\n      this.handlers.set(handler, callback);\n    }\n  }\n\n  /**\n   * Get a callback handler, with version-aware lookup\n   * @param handler Handler name\n   * @param graphType Optional graph type for version-specific lookup\n   */\n  get(handler: string, graphType?: string): CallbackHandler | undefined {\n    // First try version-specific lookup if graphType provided\n    if (graphType) {\n      const versionedHandler = this.handlers.get(`${graphType}::${handler}`);\n      if (versionedHandler) {\n        return versionedHandler;\n      }\n    }\n\n    // Fallback to non-versioned handler\n    return this.handlers.get(handler);\n  }\n\n  /**\n   * List all registered handlers (for debugging)\n   */\n  listHandlers(): string[] {\n    return Array.from(this.handlers.keys());\n  }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport type Redis from \"ioredis\";\nimport { createHash } from \"crypto\";\nimport { CallbackResult } from \"./callback.interface\";\n\nexport interface IdempotencyConfig {\n  ttlSeconds: number; // How long to cache results\n  keyPrefix: string; // Redis key prefix\n  hashPayload: boolean; // Whether to hash the payload for key generation\n  includeUserId: boolean; // Include userId in idempotency key\n}\n\nexport interface IdempotencyEntry {\n  key: string;\n  result: CallbackResult;\n  createdAt: number;\n  executedAt: number;\n  expiresAt: number;\n  requestHash: string;\n  attempts: number;\n}\n\nexport enum IdempotencyStatus {\n  NEW = \"NEW\",\n  IN_PROGRESS = \"IN_PROGRESS\",\n  COMPLETED = \"COMPLETED\",\n  FAILED = \"FAILED\",\n}\n\n/**\n * Manages idempotent callback execution to prevent duplicate operations.\n * Caches results and ensures exactly-once execution semantics.\n */\n@Injectable()\nexport class IdempotencyManager {\n  private readonly logger = new Logger(IdempotencyManager.name);\n  private readonly defaultConfig: IdempotencyConfig = {\n    ttlSeconds: 3600, // 1 hour default\n    keyPrefix: \"idempotency\",\n    hashPayload: true,\n    includeUserId: true,\n  };\n\n  constructor(private readonly redis: Redis) {}\n\n  /**\n   * Check if a request is idempotent and return cached result if available.\n   * If not, acquire a lock for execution.\n   */\n  async checkAndLock(\n    idempotencyKey: string | undefined,\n    requestData: {\n      userId?: string;\n      graphType: string;\n      handler: string;\n      params: Record<string, any>;\n    },\n    config?: Partial<IdempotencyConfig>\n  ): Promise<{\n    status: IdempotencyStatus;\n    result?: CallbackResult;\n    key: string;\n  }> {\n    const cfg = { ...this.defaultConfig, ...config };\n\n    // Generate idempotency key if not provided\n    const key = idempotencyKey || this.generateKey(requestData, cfg);\n    const redisKey = `${cfg.keyPrefix}:${key}`;\n\n    // Try to get existing result\n    const existing = await this.redis.get(redisKey);\n    if (existing) {\n      try {\n        const entry: IdempotencyEntry = JSON.parse(existing);\n\n        // Check if it's still being processed\n        if (entry.result === null && entry.executedAt === 0) {\n          // Check if it's stuck (processing for more than 5 minutes)\n          const processingTime = Date.now() - entry.createdAt;\n          if (processingTime > 300000) {\n            // Reset stuck entry\n            await this.redis.del(redisKey);\n          } else {\n            return {\n              status: IdempotencyStatus.IN_PROGRESS,\n              key,\n            };\n          }\n        }\n\n        // Return cached result\n        this.logger.debug(\n          `Returning cached result for idempotency key: ${key}`\n        );\n        return {\n          status: IdempotencyStatus.COMPLETED,\n          result: entry.result,\n          key,\n        };\n      } catch (error) {\n        this.logger.error(\n          `Failed to parse idempotency entry: ${error.message}`\n        );\n        await this.redis.del(redisKey);\n      }\n    }\n\n    // Try to acquire lock for new execution\n    const lockAcquired = await this.acquireLock(redisKey, cfg.ttlSeconds);\n    if (!lockAcquired) {\n      // Someone else is processing\n      return {\n        status: IdempotencyStatus.IN_PROGRESS,\n        key,\n      };\n    }\n\n    return {\n      status: IdempotencyStatus.NEW,\n      key,\n    };\n  }\n\n  /**\n   * Store the result of an idempotent operation.\n   */\n  async storeResult(\n    key: string,\n    result: CallbackResult,\n    config?: Partial<IdempotencyConfig>\n  ): Promise<void> {\n    const cfg = { ...this.defaultConfig, ...config };\n    const redisKey = `${cfg.keyPrefix}:${key}`;\n\n    const entry: IdempotencyEntry = {\n      key,\n      result,\n      createdAt: Date.now(),\n      executedAt: Date.now(),\n      expiresAt: Date.now() + cfg.ttlSeconds * 1000,\n      requestHash: \"\",\n      attempts: 1,\n    };\n\n    await this.redis.setex(redisKey, cfg.ttlSeconds, JSON.stringify(entry));\n\n    this.logger.debug(`Stored idempotent result for key: ${key}`);\n  }\n\n  /**\n   * Mark an idempotent operation as failed.\n   */\n  async markFailed(\n    key: string,\n    error: string,\n    config?: Partial<IdempotencyConfig>\n  ): Promise<void> {\n    const cfg = { ...this.defaultConfig, ...config };\n    const redisKey = `${cfg.keyPrefix}:${key}`;\n\n    // Store failure with shorter TTL (5 minutes)\n    const entry: IdempotencyEntry = {\n      key,\n      result: {\n        success: false,\n        error,\n      },\n      createdAt: Date.now(),\n      executedAt: Date.now(),\n      expiresAt: Date.now() + 300000, // 5 minutes\n      requestHash: \"\",\n      attempts: 1,\n    };\n\n    await this.redis.setex(\n      redisKey,\n      300, // 5 minutes TTL for failures\n      JSON.stringify(entry)\n    );\n\n    this.logger.debug(`Marked idempotent operation as failed for key: ${key}`);\n  }\n\n  /**\n   * Release lock if operation fails unexpectedly.\n   */\n  async releaseLock(\n    key: string,\n    config?: Partial<IdempotencyConfig>\n  ): Promise<void> {\n    const cfg = { ...this.defaultConfig, ...config };\n    const redisKey = `${cfg.keyPrefix}:${key}`;\n    await this.redis.del(redisKey);\n    this.logger.debug(`Released lock for key: ${key}`);\n  }\n\n  /**\n   * Generate idempotency key from request data.\n   */\n  private generateKey(\n    requestData: {\n      userId?: string;\n      graphType: string;\n      handler: string;\n      params: Record<string, any>;\n    },\n    config: IdempotencyConfig\n  ): string {\n    const components: string[] = [requestData.graphType, requestData.handler];\n\n    if (config.includeUserId && requestData.userId) {\n      components.push(requestData.userId);\n    }\n\n    // Create deterministic string from params\n    const paramsStr = this.deterministicStringify(requestData.params);\n\n    if (config.hashPayload) {\n      // Hash the params for shorter key\n      const hash = createHash(\"sha256\")\n        .update(paramsStr)\n        .digest(\"hex\")\n        .substring(0, 16);\n      components.push(hash);\n    } else {\n      components.push(paramsStr);\n    }\n\n    return components.join(\":\");\n  }\n\n  /**\n   * Acquire lock for idempotent operation.\n   */\n  private async acquireLock(key: string, ttlSeconds: number): Promise<boolean> {\n    // Create lock entry\n    const entry: IdempotencyEntry = {\n      key,\n      result: null as any,\n      createdAt: Date.now(),\n      executedAt: 0,\n      expiresAt: Date.now() + ttlSeconds * 1000,\n      requestHash: \"\",\n      attempts: 1,\n    };\n\n    // SET NX - only set if not exists\n    const result = await this.redis.set(\n      key,\n      JSON.stringify(entry),\n      \"EX\",\n      ttlSeconds,\n      \"NX\"\n    );\n\n    return result === \"OK\";\n  }\n\n  /**\n   * Create deterministic JSON stringify (sorted keys).\n   */\n  private deterministicStringify(obj: any): string {\n    return JSON.stringify(this.sortObject(obj));\n  }\n\n  /**\n   * Recursively sort object keys for deterministic stringification.\n   */\n  private sortObject(obj: any): any {\n    if (obj === null || typeof obj !== \"object\") {\n      return obj;\n    }\n\n    if (Array.isArray(obj)) {\n      return obj.map(item => this.sortObject(item));\n    }\n\n    const sorted: Record<string, any> = {};\n    Object.keys(obj)\n      .sort()\n      .forEach(key => {\n        sorted[key] = this.sortObject(obj[key]);\n      });\n\n    return sorted;\n  }\n\n  /**\n   * Clean up expired idempotency entries.\n   */\n  async cleanup(): Promise<number> {\n    const pattern = `${this.defaultConfig.keyPrefix}:*`;\n    const keys = await this.redis.keys(pattern);\n    let cleaned = 0;\n\n    for (const key of keys) {\n      const value = await this.redis.get(key);\n      if (value) {\n        try {\n          const entry: IdempotencyEntry = JSON.parse(value);\n          if (entry.expiresAt < Date.now()) {\n            await this.redis.del(key);\n            cleaned++;\n          }\n        } catch {\n          // Invalid entry, delete it\n          await this.redis.del(key);\n          cleaned++;\n        }\n      }\n    }\n\n    this.logger.log(`Cleaned up ${cleaned} expired idempotency entries`);\n    return cleaned;\n  }\n\n  /**\n   * Get statistics about idempotency cache.\n   */\n  async getStatistics(): Promise<{\n    totalEntries: number;\n    completedEntries: number;\n    inProgressEntries: number;\n    failedEntries: number;\n    cacheHitRate: number;\n  }> {\n    const pattern = `${this.defaultConfig.keyPrefix}:*`;\n    const keys = await this.redis.keys(pattern);\n\n    let completed = 0;\n    let inProgress = 0;\n    let failed = 0;\n\n    for (const key of keys) {\n      const value = await this.redis.get(key);\n      if (value) {\n        try {\n          const entry: IdempotencyEntry = JSON.parse(value);\n          if (entry.result === null) {\n            inProgress++;\n          } else if (entry.result.success === false) {\n            failed++;\n          } else {\n            completed++;\n          }\n        } catch {\n          // Skip invalid entries\n        }\n      }\n    }\n\n    const total = completed + inProgress + failed;\n    const cacheHitRate = total > 0 ? (completed / total) * 100 : 0;\n\n    return {\n      totalEntries: total,\n      completedEntries: completed,\n      inProgressEntries: inProgress,\n      failedEntries: failed,\n      cacheHitRate,\n    };\n  }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRegistry } from \"./callback-registry\";\nimport { CallbackRecord, CallbackResult } from \"./callback.interface\";\nimport { CallbackStore } from \"./callback-store\";\nimport { CallbackACL, CallbackUser } from \"./callback-acl.service\";\nimport { CallbackAuditor } from \"./callback-auditor.service\";\nimport { CallbackMetrics } from \"./callback-metrics.service\";\nimport { CallbackRateLimiter } from \"./callback-rate-limiter\";\nimport { IdempotencyManager, IdempotencyStatus } from \"./idempotency-manager\";\nimport { CallbackPatchService } from \"./callback-patch.service\";\n\nexport interface RouterConfig {\n  maxRetries?: number;\n  retryDelayMs?: number;\n  timeoutMs?: number;\n  enableCircuitBreaker?: boolean;\n  circuitBreakerThreshold?: number;\n  circuitBreakerResetMs?: number;\n}\n\ninterface CircuitBreakerState {\n  failures: number;\n  lastFailure?: number;\n  state: \"closed\" | \"open\" | \"half-open\";\n}\n\n/**\n * Enhanced Smart Callback Router with error handling, retry logic,\n * circuit breaker pattern, and comprehensive monitoring.\n */\n@Injectable()\nexport class SmartCallbackRouter {\n  private readonly logger = new Logger(SmartCallbackRouter.name);\n  private readonly circuitBreakers = new Map<string, CircuitBreakerState>();\n  private readonly defaultConfig: RouterConfig = {\n    maxRetries: 3,\n    retryDelayMs: 1000,\n    timeoutMs: 30000,\n    enableCircuitBreaker: true,\n    circuitBreakerThreshold: 5,\n    circuitBreakerResetMs: 60000,\n  };\n\n  constructor(\n    private readonly registry: CallbackRegistry,\n    private readonly store: CallbackStore,\n    private readonly acl: CallbackACL,\n    private readonly auditor: CallbackAuditor,\n    private readonly metrics: CallbackMetrics,\n    private readonly rateLimiter: CallbackRateLimiter,\n    private readonly idempotencyManager: IdempotencyManager,\n    private readonly patchService: CallbackPatchService\n  ) {}\n\n  /**\n   * Route and execute callback with full error handling and monitoring.\n   */\n  async route(\n    record: CallbackRecord,\n    user: CallbackUser | undefined,\n    requestMetadata?: {\n      ip?: string;\n      userAgent?: string;\n      platform?: string;\n      platformContext?: any;\n    },\n    config?: RouterConfig\n  ): Promise<CallbackResult> {\n    const cfg = { ...this.defaultConfig, ...config };\n    const startTime = Date.now();\n    const correlationId = await this.auditor.logExecutionStart(record, user);\n    let idempotencyCheck: any = null;\n\n    try {\n      // 1. Check idempotency first\n      const idempotencyKey = record.metadata?.idempotencyKey;\n      idempotencyCheck = await this.idempotencyManager.checkAndLock(\n        idempotencyKey,\n        {\n          userId: record.userId,\n          graphType: record.graphType,\n          handler: record.handler,\n          params: record.params,\n        }\n      );\n\n      // Return cached result if already executed\n      if (idempotencyCheck.status === IdempotencyStatus.COMPLETED) {\n        this.logger.debug(`Returning cached result for ${record.token}`);\n        return idempotencyCheck.result!;\n      }\n\n      // Wait if already in progress\n      if (idempotencyCheck.status === IdempotencyStatus.IN_PROGRESS) {\n        throw new Error(\"Request is already being processed\");\n      }\n\n      // 2. Check rate limits\n      await this.checkRateLimits(user, requestMetadata?.ip);\n\n      // ACL permissions already validated by CallbackTokenGuard\n      // No need to validate again here\n\n      // 3. Record token age\n      const tokenAge = Date.now() - record.createdAt;\n      this.metrics.recordTokenAge(record.graphType, tokenAge);\n\n      // 4. Check circuit breaker\n      this.checkCircuitBreaker(record.graphType, record.handler);\n\n      // 5. Start execution\n      this.metrics.recordExecutionStart(record.graphType, record.handler);\n\n      // 6. Execute with timeout and retry\n      const result = await this.executeWithRetry(\n        record,\n        user,\n        cfg,\n        correlationId\n      );\n\n      // 7. Record success\n      const duration = Date.now() - startTime;\n      await this.auditor.logExecutionSuccess(\n        record,\n        user,\n        result,\n        duration,\n        correlationId\n      );\n      this.metrics.recordExecutionComplete(\n        record.graphType,\n        record.handler,\n        duration,\n        true\n      );\n\n      // 8. Reset circuit breaker on success\n      this.resetCircuitBreaker(record.graphType, record.handler);\n\n      // 9. Store idempotent result\n      await this.idempotencyManager.storeResult(idempotencyCheck.key, result);\n\n      // 10. Finalize token\n      await this.store.finalize(record.token);\n\n      // 11. Apply patch if provided\n      if (result.patch) {\n        await this.patchService.apply(\n          record,\n          result.patch,\n          requestMetadata?.platformContext\n        );\n      }\n\n      return result;\n    } catch (error) {\n      // Record failure\n      const duration = Date.now() - startTime;\n      await this.auditor.logExecutionFailure(\n        record,\n        user,\n        error,\n        duration,\n        correlationId\n      );\n      this.metrics.recordExecutionComplete(\n        record.graphType,\n        record.handler,\n        duration,\n        false,\n        error.message\n      );\n\n      // Update circuit breaker\n      this.recordCircuitBreakerFailure(record.graphType, record.handler);\n\n      // Mark idempotency as failed\n      if (idempotencyCheck) {\n        await this.idempotencyManager.markFailed(\n          idempotencyCheck.key,\n          error.message\n        );\n      }\n\n      // Mark token as failed\n      await this.store.fail(record.token, error.message);\n\n      throw error;\n    }\n  }\n\n  /**\n   * Execute callback with retry logic.\n   */\n  private async executeWithRetry(\n    record: CallbackRecord,\n    user: CallbackUser | undefined,\n    config: RouterConfig,\n    correlationId: string\n  ): Promise<CallbackResult> {\n    let lastError: Error;\n\n    for (let attempt = 1; attempt <= config.maxRetries!; attempt++) {\n      try {\n        if (attempt > 1) {\n          // Log retry attempt\n          await this.auditor.logRetryAttempt(record, user, attempt);\n          this.metrics.recordRetry(record.graphType, record.handler);\n\n          // Wait before retry with exponential backoff\n          const delay = config.retryDelayMs! * Math.pow(2, attempt - 2);\n          await this.sleep(delay);\n        }\n\n        // Execute with timeout\n        return await this.executeWithTimeout(record, config.timeoutMs!);\n      } catch (error) {\n        lastError = error;\n        this.logger.warn(\n          `[${correlationId}] Attempt ${attempt}/${config.maxRetries} failed: ${error.message}`\n        );\n\n        // Don't retry on certain errors\n        if (this.isNonRetryableError(error)) {\n          throw error;\n        }\n      }\n    }\n\n    throw new Error(\n      `Callback execution failed after ${config.maxRetries} attempts: ${lastError!.message}`\n    );\n  }\n\n  /**\n   * Execute callback with timeout.\n   */\n  private async executeWithTimeout(\n    record: CallbackRecord,\n    timeoutMs: number\n  ): Promise<CallbackResult> {\n    const handler = this.registry.get(record.handler, record.graphType);\n    if (!handler) {\n      throw new Error(\n        `No callback handler registered for ${record.handler} (graphType: ${record.graphType})`\n      );\n    }\n\n    return Promise.race([\n      handler({\n        userId: record.userId,\n        threadId: record.threadId,\n        agentId: record.agentId,\n        params: record.params,\n        platform: record.metadata?.platform,\n        metadata: record.metadata,\n      }),\n      new Promise<never>((_, reject) =>\n        setTimeout(\n          () =>\n            reject(\n              new Error(`Callback execution timeout after ${timeoutMs}ms`)\n            ),\n          timeoutMs\n        )\n      ),\n    ]);\n  }\n\n  /**\n   * Check rate limits for user and IP.\n   */\n  private async checkRateLimits(\n    user: CallbackUser | undefined,\n    ip?: string\n  ): Promise<void> {\n    // Check user rate limit\n    if (user) {\n      const userLimit = await this.rateLimiter.checkUserLimit(user.userId);\n      if (!userLimit.allowed) {\n        this.metrics.recordRateLimited(\"user\");\n        await this.auditor.logRateLimited(\n          `user:${user.userId}`,\n          userLimit.retryAfter!\n        );\n        throw new Error(\n          `Rate limit exceeded. Retry after ${userLimit.retryAfter} seconds`\n        );\n      }\n    }\n\n    // Check IP rate limit\n    if (ip) {\n      const ipLimit = await this.rateLimiter.checkIpLimit(ip);\n      if (!ipLimit.allowed) {\n        this.metrics.recordRateLimited(\"ip\");\n        await this.auditor.logRateLimited(`ip:${ip}`, ipLimit.retryAfter!);\n        throw new Error(\n          `Rate limit exceeded. Retry after ${ipLimit.retryAfter} seconds`\n        );\n      }\n    }\n  }\n\n  /**\n   * Check circuit breaker state.\n   */\n  private checkCircuitBreaker(graphType: string, handler: string): void {\n    const key = `${graphType}::${handler}`;\n    const breaker = this.circuitBreakers.get(key);\n\n    if (!breaker) return;\n\n    if (breaker.state === \"open\") {\n      const now = Date.now();\n      const resetTime =\n        breaker.lastFailure! + this.defaultConfig.circuitBreakerResetMs!;\n\n      if (now < resetTime) {\n        throw new Error(\n          `Circuit breaker is open for ${key}. Service temporarily unavailable.`\n        );\n      } else {\n        // Move to half-open state\n        breaker.state = \"half-open\";\n      }\n    }\n  }\n\n  /**\n   * Record circuit breaker failure.\n   */\n  private recordCircuitBreakerFailure(\n    graphType: string,\n    handler: string\n  ): void {\n    const key = `${graphType}::${handler}`;\n    const breaker = this.circuitBreakers.get(key) || {\n      failures: 0,\n      state: \"closed\",\n    };\n\n    breaker.failures++;\n    breaker.lastFailure = Date.now();\n\n    if (breaker.failures >= this.defaultConfig.circuitBreakerThreshold!) {\n      breaker.state = \"open\";\n      this.logger.error(\n        `Circuit breaker opened for ${key} after ${breaker.failures} failures`\n      );\n    }\n\n    this.circuitBreakers.set(key, breaker);\n  }\n\n  /**\n   * Reset circuit breaker on success.\n   */\n  private resetCircuitBreaker(graphType: string, handler: string): void {\n    const key = `${graphType}::${handler}`;\n    this.circuitBreakers.delete(key);\n  }\n\n  /**\n   * Check if error is non-retryable.\n   */\n  private isNonRetryableError(error: Error): boolean {\n    const message = error.message.toLowerCase();\n    return (\n      message.includes(\"forbidden\") ||\n      message.includes(\"unauthorized\") ||\n      message.includes(\"invalid token\") ||\n      message.includes(\"expired\") ||\n      message.includes(\"rate limit\")\n    );\n  }\n\n  /**\n   * Sleep helper for retry delays.\n   */\n  private sleep(ms: number): Promise<void> {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  }\n\n  /**\n   * Get circuit breaker status.\n   */\n  getCircuitBreakerStatus(): Map<string, CircuitBreakerState> {\n    return new Map(this.circuitBreakers);\n  }\n}\n","import { CallbackStore } from \"./callback-store\";\nimport { SmartCallbackRouter } from \"./smart-callback.router\";\nimport { CallbackResult, CallbackRecord } from \"./callback.interface\";\n\nexport class UniversalCallbackService {\n  constructor(\n    private readonly store: CallbackStore,\n    private readonly router: SmartCallbackRouter\n  ) {}\n\n  async handle(\n    record: CallbackRecord,\n    user?: any,\n    metadata?: {\n      ip?: string;\n      userAgent?: string;\n      platform?: string;\n      platformContext?: any;\n    }\n  ): Promise<CallbackResult> {\n    try {\n      const result = await this.router.route(record, user, metadata);\n      // Note: finalization is now handled by the router\n      return result;\n    } catch (err: any) {\n      return { success: false, error: err?.message || \"Callback error\" };\n    }\n  }\n}\n","import { CallbackResult } from \"./callback.interface\";\nimport { CallbackRegistry } from \"./callback-registry\";\n\n/**\n * Example finance callback registration demonstrating how graph-specific\n * handlers can integrate with the universal callback system.\n */\nexport function registerFinanceExampleCallback(registry: CallbackRegistry) {\n  registry.register(\n    \"example\",\n    async (): Promise<CallbackResult> => ({\n      success: true,\n      message: \"Finance callback executed\",\n    }),\n    \"finance::1.0.0\" // Optional graph type for versioning\n  );\n}\n","import { Injectable, ForbiddenException, Logger } from \"@nestjs/common\";\nimport { CallbackRecord } from \"./callback.interface\";\n\nexport interface CallbackUser {\n  userId: string;\n  roles?: string[];\n  permissions?: string[];\n  companyId?: string;\n}\n\nexport interface ACLValidationResult {\n  allowed: boolean;\n  reason?: string;\n  requiredScopes?: string[];\n  userScopes?: string[];\n}\n\n/**\n * Access Control Layer for callback execution.\n * Validates that the user has permission to execute the callback.\n */\n@Injectable()\nexport class CallbackACL {\n  private readonly logger = new Logger(CallbackACL.name);\n\n  /**\n   * Validates if the user can execute the callback.\n   * @throws ForbiddenException if access is denied\n   */\n  async validate(\n    user: CallbackUser | undefined,\n    record: CallbackRecord\n  ): Promise<ACLValidationResult> {\n    const validationStart = Date.now();\n\n    try {\n      // 1. Check if user is authenticated\n      if (!user) {\n        this.logger.warn(\n          `Unauthenticated access attempt for callback ${record.token}`\n        );\n        throw new ForbiddenException(\n          \"Authentication required for callback execution\"\n        );\n      }\n\n      // 2. Check user ID match\n      if (record.userId && record.userId !== user.userId) {\n        this.logger.warn(\n          `User ${user.userId} attempted to execute callback for user ${record.userId}`\n        );\n        throw new ForbiddenException(\n          \"Cannot execute callback for another user\"\n        );\n      }\n\n      // TODO: Implement proper authorization on backend level\n      // - Check access to specific agent (not graph type)\n      // - Verify user has permission to use the agent\n      // - Check company/organization access\n      // - Backend should handle all business logic authorization\n\n      this.logger.log(\n        `ACL validation simplified: userId match only for callback ${record.token}`\n      );\n\n      // 6. Additional security checks\n      await this.performAdditionalSecurityChecks(user, record);\n\n      const validationTime = Date.now() - validationStart;\n      this.logger.debug(\n        `ACL validation passed for user ${user.userId} on callback ${record.token} ` +\n          `(${validationTime}ms)`\n      );\n\n      return {\n        allowed: true,\n      };\n    } catch (error) {\n      const validationTime = Date.now() - validationStart;\n      this.logger.error(\n        `ACL validation failed for callback ${record.token} (${validationTime}ms): ${error.message}`\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Validates if user has required scopes/permissions.\n   */\n  private validateScopes(\n    user: CallbackUser,\n    requiredScopes: string[]\n  ): boolean {\n    if (!user.permissions || user.permissions.length === 0) {\n      return false;\n    }\n\n    // Check if user has all required scopes\n    return requiredScopes.every(scope => {\n      // Support wildcard permissions (e.g., \"finance:*\" matches \"finance:write\")\n      const hasExactScope = user.permissions.includes(scope);\n      const hasWildcardScope = user.permissions.some(p => {\n        if (p.includes(\"*\")) {\n          const pattern = p.replace(\"*\", \".*\");\n          return new RegExp(`^${pattern}$`).test(scope);\n        }\n        return false;\n      });\n\n      return hasExactScope || hasWildcardScope;\n    });\n  }\n\n  /**\n   * Validates access to specific graph type.\n   * Can be extended to check graph-specific permissions.\n   */\n  private async validateGraphTypeAccess(\n    user: CallbackUser,\n    graphType: string\n  ): Promise<boolean> {\n    // Extract namespace from graphType (e.g., \"finance::1.0.0\" -> \"finance\")\n    const [namespace] = graphType.split(\"::\");\n\n    // Check if user has access to this graph namespace\n    const allowedNamespaces = this.getAllowedGraphNamespaces(user);\n\n    this.logger.log(`Graph access check for user ${user.userId}`, {\n      graphType,\n      namespace,\n      allowedNamespaces,\n      userRoles: user.roles,\n      userPermissions: user.permissions,\n      userCompanyId: user.companyId,\n    });\n\n    // Special case: public graphs are accessible to all authenticated users\n    if (namespace === \"public\") {\n      return true;\n    }\n\n    // Check if user has explicit access to this namespace\n    if (\n      !allowedNamespaces.includes(namespace) &&\n      !allowedNamespaces.includes(\"*\")\n    ) {\n      this.logger.warn(\n        `Access denied: namespace \"${namespace}\" not in allowed namespaces: ${allowedNamespaces.join(\", \")}`\n      );\n      return false;\n    }\n\n    // Additional graph-specific checks can be added here\n    // For example, checking if the graph belongs to user's company\n\n    return true;\n  }\n\n  /**\n   * Gets list of graph namespaces user has access to.\n   */\n  private getAllowedGraphNamespaces(user: CallbackUser): string[] {\n    const namespaces: string[] = [];\n\n    // Admin users have access to all graphs\n    if (user.roles?.includes(\"admin\")) {\n      namespaces.push(\"*\");\n    }\n\n    // Extract namespaces from user permissions\n    // e.g., \"graph:finance:read\" -> \"finance\"\n    user.permissions?.forEach(permission => {\n      const match = permission.match(/^graph:([^:]+):/);\n      if (match) {\n        namespaces.push(match[1]);\n      }\n    });\n\n    // Users always have access to their company's graphs\n    if (user.companyId) {\n      namespaces.push(user.companyId);\n    }\n\n    return [...new Set(namespaces)]; // Remove duplicates\n  }\n\n  /**\n   * Validates company-level access restrictions.\n   */\n  private validateCompanyAccess(\n    user: CallbackUser,\n    requiredCompanyId: string\n  ): boolean {\n    // Users can only access callbacks for their own company\n    return user.companyId === requiredCompanyId;\n  }\n\n  /**\n   * Performs additional security checks.\n   * Can be extended for custom security requirements.\n   */\n  private async performAdditionalSecurityChecks(\n    user: CallbackUser,\n    record: CallbackRecord\n  ): Promise<void> {\n    // Check if callback is expired (additional safety check)\n    const now = Date.now();\n    const age = now - record.createdAt;\n    const maxAge = (record.metadata?.ttlSec || 600) * 1000;\n\n    if (age > maxAge) {\n      throw new ForbiddenException(\"Callback token has expired\");\n    }\n\n    // Check if callback has been retried too many times\n    if (record.retries > 3) {\n      throw new ForbiddenException(\n        \"Callback has exceeded maximum retry attempts\"\n      );\n    }\n\n    // Check for suspicious activity patterns\n    // This could be extended to check rate limits, IP restrictions, etc.\n  }\n\n  /**\n   * Checks if a callback can be retried by the user.\n   */\n  async canRetry(user: CallbackUser, record: CallbackRecord): Promise<boolean> {\n    // Only the original user can retry their callbacks\n    if (record.userId !== user.userId) {\n      return false;\n    }\n\n    // Check if within retry limit\n    if (record.retries >= 3) {\n      return false;\n    }\n\n    // Check if callback is in retryable state\n    if (![\"failed\", \"processing\"].includes(record.status)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets detailed permissions for a callback.\n   * Useful for debugging and audit logs.\n   */\n  getPermissionDetails(\n    user: CallbackUser,\n    record: CallbackRecord\n  ): Record<string, any> {\n    return {\n      userId: user.userId,\n      callbackUserId: record.userId,\n      userIdMatch: user.userId === record.userId,\n      requiredScopes: record.metadata?.scopes || [],\n      userScopes: user.permissions || [],\n      userRoles: user.roles || [],\n      graphType: record.graphType,\n      companyId: user.companyId,\n      callbackCompanyId: record.metadata?.companyId,\n      companyMatch:\n        !record.metadata?.companyId ||\n        user.companyId === record.metadata.companyId,\n    };\n  }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRecord, CallbackResult } from \"./callback.interface\";\nimport { CallbackUser } from \"./callback-acl.service\";\nimport { randomUUID } from \"crypto\";\n\nexport interface AuditEntry {\n  id: string;\n  correlationId: string;\n  timestamp: number;\n  action: CallbackAuditAction;\n  userId?: string;\n  callbackToken: string;\n  graphType: string;\n  handler: string;\n  success: boolean;\n  duration?: number;\n  error?: string;\n  metadata: Record<string, any>;\n  ip?: string;\n  userAgent?: string;\n}\n\nexport enum CallbackAuditAction {\n  TOKEN_ISSUED = \"TOKEN_ISSUED\",\n  TOKEN_VALIDATED = \"TOKEN_VALIDATED\",\n  TOKEN_LOCKED = \"TOKEN_LOCKED\",\n  EXECUTION_STARTED = \"EXECUTION_STARTED\",\n  EXECUTION_COMPLETED = \"EXECUTION_COMPLETED\",\n  EXECUTION_FAILED = \"EXECUTION_FAILED\",\n  TOKEN_EXPIRED = \"TOKEN_EXPIRED\",\n  ACCESS_DENIED = \"ACCESS_DENIED\",\n  RATE_LIMITED = \"RATE_LIMITED\",\n  RETRY_ATTEMPTED = \"RETRY_ATTEMPTED\",\n}\n\n/**\n * Auditor service for callback operations.\n * Logs all callback-related activities for compliance and debugging.\n */\n@Injectable()\nexport class CallbackAuditor {\n  private readonly logger = new Logger(CallbackAuditor.name);\n  private readonly auditStore: Map<string, AuditEntry> = new Map();\n\n  /**\n   * Log callback token issuance.\n   */\n  async logTokenIssued(\n    token: string,\n    graphType: string,\n    handler: string,\n    userId: string,\n    metadata?: Record<string, any>\n  ): Promise<string> {\n    const correlationId = this.generateCorrelationId();\n    const entry: AuditEntry = {\n      id: randomUUID(),\n      correlationId,\n      timestamp: Date.now(),\n      action: CallbackAuditAction.TOKEN_ISSUED,\n      userId,\n      callbackToken: token,\n      graphType,\n      handler,\n      success: true,\n      metadata: {\n        ...metadata,\n        ttl: metadata?.ttlSec,\n        scopes: metadata?.scopes,\n      },\n    };\n\n    await this.persist(entry);\n    this.logger.log(\n      `[${correlationId}] Token issued: ${token} for ${graphType}::${handler} by user ${userId}`\n    );\n\n    return correlationId;\n  }\n\n  /**\n   * Log callback execution start.\n   */\n  async logExecutionStart(\n    record: CallbackRecord,\n    user: CallbackUser | undefined,\n    correlationId?: string\n  ): Promise<string> {\n    const corrId = correlationId || this.generateCorrelationId();\n    const entry: AuditEntry = {\n      id: randomUUID(),\n      correlationId: corrId,\n      timestamp: Date.now(),\n      action: CallbackAuditAction.EXECUTION_STARTED,\n      userId: user?.userId,\n      callbackToken: record.token,\n      graphType: record.graphType,\n      handler: record.handler,\n      success: true,\n      metadata: {\n        originalUserId: record.userId,\n        retries: record.retries,\n        age: Date.now() - record.createdAt,\n      },\n    };\n\n    await this.persist(entry);\n    this.logger.log(\n      `[${corrId}] Execution started: ${record.graphType}::${record.handler} by user ${user?.userId}`\n    );\n\n    return corrId;\n  }\n\n  /**\n   * Log successful callback execution.\n   */\n  async logExecutionSuccess(\n    record: CallbackRecord,\n    user: CallbackUser | undefined,\n    result: CallbackResult,\n    duration: number,\n    correlationId: string\n  ): Promise<void> {\n    const entry: AuditEntry = {\n      id: randomUUID(),\n      correlationId,\n      timestamp: Date.now(),\n      action: CallbackAuditAction.EXECUTION_COMPLETED,\n      userId: user?.userId,\n      callbackToken: record.token,\n      graphType: record.graphType,\n      handler: record.handler,\n      success: true,\n      duration,\n      metadata: {\n        hasAttachments: !!result.attachments?.length,\n        hasPatch: !!result.patch,\n        message: result.message,\n      },\n    };\n\n    await this.persist(entry);\n    this.logger.log(\n      `[${correlationId}] Execution completed: ${record.graphType}::${record.handler} ` +\n        `in ${duration}ms`\n    );\n  }\n\n  /**\n   * Log failed callback execution.\n   */\n  async logExecutionFailure(\n    record: CallbackRecord,\n    user: CallbackUser | undefined,\n    error: Error,\n    duration: number,\n    correlationId: string\n  ): Promise<void> {\n    const entry: AuditEntry = {\n      id: randomUUID(),\n      correlationId,\n      timestamp: Date.now(),\n      action: CallbackAuditAction.EXECUTION_FAILED,\n      userId: user?.userId,\n      callbackToken: record.token,\n      graphType: record.graphType,\n      handler: record.handler,\n      success: false,\n      duration,\n      error: error.message,\n      metadata: {\n        errorName: error.name,\n        errorStack: error.stack,\n        retries: record.retries,\n      },\n    };\n\n    await this.persist(entry);\n    this.logger.error(\n      `[${correlationId}] Execution failed: ${record.graphType}::${record.handler} - ${error.message}`,\n      error.stack\n    );\n  }\n\n  /**\n   * Log access denied event.\n   */\n  async logAccessDenied(\n    token: string,\n    userId?: string,\n    reason?: string,\n    metadata?: Record<string, any>\n  ): Promise<void> {\n    const correlationId = this.generateCorrelationId();\n    const entry: AuditEntry = {\n      id: randomUUID(),\n      correlationId,\n      timestamp: Date.now(),\n      action: CallbackAuditAction.ACCESS_DENIED,\n      userId,\n      callbackToken: token,\n      graphType: metadata?.graphType || \"unknown\",\n      handler: metadata?.handler || \"unknown\",\n      success: false,\n      error: reason,\n      metadata: metadata || {},\n    };\n\n    await this.persist(entry);\n    this.logger.warn(\n      `[${correlationId}] Access denied for token ${token}: ${reason}`\n    );\n  }\n\n  /**\n   * Log rate limit exceeded event.\n   */\n  async logRateLimited(\n    identifier: string,\n    retryAfter: number,\n    metadata?: Record<string, any>\n  ): Promise<void> {\n    const correlationId = this.generateCorrelationId();\n    const entry: AuditEntry = {\n      id: randomUUID(),\n      correlationId,\n      timestamp: Date.now(),\n      action: CallbackAuditAction.RATE_LIMITED,\n      callbackToken: metadata?.token || \"unknown\",\n      graphType: metadata?.graphType || \"unknown\",\n      handler: metadata?.handler || \"unknown\",\n      success: false,\n      metadata: {\n        identifier,\n        retryAfter,\n        ...metadata,\n      },\n    };\n\n    await this.persist(entry);\n    this.logger.warn(\n      `[${correlationId}] Rate limited: ${identifier}, retry after ${retryAfter}s`\n    );\n  }\n\n  /**\n   * Log retry attempt.\n   */\n  async logRetryAttempt(\n    record: CallbackRecord,\n    user: CallbackUser | undefined,\n    attemptNumber: number\n  ): Promise<string> {\n    const correlationId = this.generateCorrelationId();\n    const entry: AuditEntry = {\n      id: randomUUID(),\n      correlationId,\n      timestamp: Date.now(),\n      action: CallbackAuditAction.RETRY_ATTEMPTED,\n      userId: user?.userId,\n      callbackToken: record.token,\n      graphType: record.graphType,\n      handler: record.handler,\n      success: true,\n      metadata: {\n        attemptNumber,\n        totalRetries: record.retries,\n        lastError: record.lastError,\n      },\n    };\n\n    await this.persist(entry);\n    this.logger.log(\n      `[${correlationId}] Retry attempt #${attemptNumber} for ${record.graphType}::${record.handler}`\n    );\n\n    return correlationId;\n  }\n\n  /**\n   * Get audit trail for a specific token.\n   */\n  async getTokenAuditTrail(token: string): Promise<AuditEntry[]> {\n    const entries: AuditEntry[] = [];\n    for (const entry of this.auditStore.values()) {\n      if (entry.callbackToken === token) {\n        entries.push(entry);\n      }\n    }\n    return entries.sort((a, b) => a.timestamp - b.timestamp);\n  }\n\n  /**\n   * Get audit trail for a specific user.\n   */\n  async getUserAuditTrail(\n    userId: string,\n    startTime?: number,\n    endTime?: number\n  ): Promise<AuditEntry[]> {\n    const entries: AuditEntry[] = [];\n    const start = startTime || 0;\n    const end = endTime || Date.now();\n\n    for (const entry of this.auditStore.values()) {\n      if (\n        entry.userId === userId &&\n        entry.timestamp >= start &&\n        entry.timestamp <= end\n      ) {\n        entries.push(entry);\n      }\n    }\n    return entries.sort((a, b) => a.timestamp - b.timestamp);\n  }\n\n  /**\n   * Get audit statistics for reporting.\n   */\n  async getStatistics(\n    startTime: number,\n    endTime: number\n  ): Promise<Record<string, any>> {\n    const entries: AuditEntry[] = [];\n    for (const entry of this.auditStore.values()) {\n      if (entry.timestamp >= startTime && entry.timestamp <= endTime) {\n        entries.push(entry);\n      }\n    }\n\n    const stats = {\n      totalCallbacks: entries.length,\n      successfulExecutions: entries.filter(\n        e => e.action === CallbackAuditAction.EXECUTION_COMPLETED\n      ).length,\n      failedExecutions: entries.filter(\n        e => e.action === CallbackAuditAction.EXECUTION_FAILED\n      ).length,\n      accessDenied: entries.filter(\n        e => e.action === CallbackAuditAction.ACCESS_DENIED\n      ).length,\n      rateLimited: entries.filter(\n        e => e.action === CallbackAuditAction.RATE_LIMITED\n      ).length,\n      averageDuration: 0,\n      byGraphType: {} as Record<string, number>,\n      byHandler: {} as Record<string, number>,\n    };\n\n    // Calculate average duration\n    const durations = entries.filter(e => e.duration).map(e => e.duration!);\n    if (durations.length > 0) {\n      stats.averageDuration =\n        durations.reduce((a, b) => a + b, 0) / durations.length;\n    }\n\n    // Group by graph type and handler\n    entries.forEach(entry => {\n      stats.byGraphType[entry.graphType] =\n        (stats.byGraphType[entry.graphType] || 0) + 1;\n      const key = `${entry.graphType}::${entry.handler}`;\n      stats.byHandler[key] = (stats.byHandler[key] || 0) + 1;\n    });\n\n    return stats;\n  }\n\n  /**\n   * Persist audit entry.\n   * In production, this should write to a persistent store (DB, S3, etc.)\n   */\n  private async persist(entry: AuditEntry): Promise<void> {\n    // For now, store in memory. In production, write to database or audit log service\n    this.auditStore.set(entry.id, entry);\n\n    // Clean up old entries (keep last 10000)\n    if (this.auditStore.size > 10000) {\n      const entries = Array.from(this.auditStore.entries())\n        .sort((a, b) => b[1].timestamp - a[1].timestamp)\n        .slice(0, 10000);\n      this.auditStore.clear();\n      entries.forEach(([id, entry]) => this.auditStore.set(id, entry));\n    }\n\n    // In production, also send to external audit service\n    // await this.sendToAuditService(entry);\n  }\n\n  /**\n   * Generate correlation ID for tracking related events.\n   */\n  private generateCorrelationId(): string {\n    return `cb_${Date.now()}_${randomUUID().slice(0, 8)}`;\n  }\n\n  /**\n   * Export audit logs for compliance.\n   */\n  async exportAuditLogs(\n    startTime: number,\n    endTime: number,\n    format: \"json\" | \"csv\" = \"json\"\n  ): Promise<string> {\n    const entries: AuditEntry[] = [];\n    for (const entry of this.auditStore.values()) {\n      if (entry.timestamp >= startTime && entry.timestamp <= endTime) {\n        entries.push(entry);\n      }\n    }\n\n    if (format === \"json\") {\n      return JSON.stringify(entries, null, 2);\n    } else {\n      // CSV format\n      const headers = [\n        \"id\",\n        \"correlationId\",\n        \"timestamp\",\n        \"action\",\n        \"userId\",\n        \"callbackToken\",\n        \"graphType\",\n        \"handler\",\n        \"success\",\n        \"duration\",\n        \"error\",\n      ];\n      const rows = entries.map(e => [\n        e.id,\n        e.correlationId,\n        new Date(e.timestamp).toISOString(),\n        e.action,\n        e.userId || \"\",\n        e.callbackToken,\n        e.graphType,\n        e.handler,\n        e.success.toString(),\n        e.duration?.toString() || \"\",\n        e.error || \"\",\n      ]);\n      return [headers, ...rows].map(row => row.join(\",\")).join(\"\\n\");\n    }\n  }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport {\n  Counter,\n  Histogram,\n  Gauge,\n  Registry,\n  collectDefaultMetrics,\n} from \"prom-client\";\n\n/**\n * Prometheus metrics for callback system monitoring.\n */\n@Injectable()\nexport class CallbackMetrics {\n  private readonly registry: Registry;\n\n  // Counters\n  private readonly callbacksTotal: Counter;\n  private readonly callbacksSuccess: Counter;\n  private readonly callbacksFailed: Counter;\n  private readonly callbacksRetried: Counter;\n  private readonly accessDenied: Counter;\n  private readonly rateLimited: Counter;\n  private readonly tokensIssued: Counter;\n  private readonly tokensExpired: Counter;\n\n  // Histograms\n  private readonly executionDuration: Histogram;\n  private readonly aclValidationDuration: Histogram;\n  private readonly tokenAge: Histogram;\n\n  // Gauges\n  private readonly activeCallbacks: Gauge;\n  private readonly pendingCallbacks: Gauge;\n  private readonly queueSize: Gauge;\n\n  constructor(registry?: Registry) {\n    this.registry = registry ?? new Registry();\n\n    // Collect default Node.js metrics\n    collectDefaultMetrics({ register: this.registry });\n\n    // Initialize counters\n    this.callbacksTotal = new Counter({\n      name: \"graph_callbacks_total\",\n      help: \"Total number of callback executions\",\n      labelNames: [\"graph_type\", \"handler\", \"status\"],\n      registers: [this.registry],\n    });\n\n    this.callbacksSuccess = new Counter({\n      name: \"graph_callbacks_success_total\",\n      help: \"Total number of successful callback executions\",\n      labelNames: [\"graph_type\", \"handler\"],\n      registers: [this.registry],\n    });\n\n    this.callbacksFailed = new Counter({\n      name: \"graph_callbacks_failed_total\",\n      help: \"Total number of failed callback executions\",\n      labelNames: [\"graph_type\", \"handler\", \"error_type\"],\n      registers: [this.registry],\n    });\n\n    this.callbacksRetried = new Counter({\n      name: \"graph_callbacks_retried_total\",\n      help: \"Total number of retried callbacks\",\n      labelNames: [\"graph_type\", \"handler\"],\n      registers: [this.registry],\n    });\n\n    this.accessDenied = new Counter({\n      name: \"graph_callbacks_access_denied_total\",\n      help: \"Total number of access denied events\",\n      labelNames: [\"reason\"],\n      registers: [this.registry],\n    });\n\n    this.rateLimited = new Counter({\n      name: \"graph_callbacks_rate_limited_total\",\n      help: \"Total number of rate limited requests\",\n      labelNames: [\"identifier_type\"],\n      registers: [this.registry],\n    });\n\n    this.tokensIssued = new Counter({\n      name: \"graph_callback_tokens_issued_total\",\n      help: \"Total number of callback tokens issued\",\n      labelNames: [\"graph_type\", \"handler\"],\n      registers: [this.registry],\n    });\n\n    this.tokensExpired = new Counter({\n      name: \"graph_callback_tokens_expired_total\",\n      help: \"Total number of expired callback tokens\",\n      labelNames: [\"graph_type\"],\n      registers: [this.registry],\n    });\n\n    // Initialize histograms\n    this.executionDuration = new Histogram({\n      name: \"graph_callback_execution_duration_seconds\",\n      help: \"Duration of callback execution in seconds\",\n      labelNames: [\"graph_type\", \"handler\", \"status\"],\n      buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5, 10],\n      registers: [this.registry],\n    });\n\n    this.aclValidationDuration = new Histogram({\n      name: \"graph_callback_acl_validation_duration_seconds\",\n      help: \"Duration of ACL validation in seconds\",\n      labelNames: [\"result\"],\n      buckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1],\n      registers: [this.registry],\n    });\n\n    this.tokenAge = new Histogram({\n      name: \"graph_callback_token_age_seconds\",\n      help: \"Age of callback token when executed\",\n      labelNames: [\"graph_type\"],\n      buckets: [1, 5, 10, 30, 60, 120, 300, 600],\n      registers: [this.registry],\n    });\n\n    // Initialize gauges\n    this.activeCallbacks = new Gauge({\n      name: \"graph_callbacks_active\",\n      help: \"Number of currently executing callbacks\",\n      labelNames: [\"graph_type\"],\n      registers: [this.registry],\n    });\n\n    this.pendingCallbacks = new Gauge({\n      name: \"graph_callbacks_pending\",\n      help: \"Number of pending callbacks in queue\",\n      labelNames: [\"graph_type\"],\n      registers: [this.registry],\n    });\n\n    this.queueSize = new Gauge({\n      name: \"graph_callback_queue_size\",\n      help: \"Current size of callback queue\",\n      registers: [this.registry],\n    });\n  }\n\n  /**\n   * Record callback execution start.\n   */\n  recordExecutionStart(graphType: string, handler?: string): void {\n    const labels = { graph_type: graphType };\n    this.activeCallbacks.inc(labels);\n    this.pendingCallbacks.dec(labels);\n  }\n\n  /**\n   * Record callback execution completion.\n   */\n  recordExecutionComplete(\n    graphType: string,\n    handler: string,\n    duration: number,\n    success: boolean,\n    error?: string\n  ): void {\n    const status = success ? \"success\" : \"failure\";\n\n    // Update counters\n    this.callbacksTotal.inc({ graph_type: graphType, handler, status });\n\n    if (success) {\n      this.callbacksSuccess.inc({ graph_type: graphType, handler });\n    } else {\n      const errorType = this.classifyError(error);\n      this.callbacksFailed.inc({\n        graph_type: graphType,\n        handler,\n        error_type: errorType,\n      });\n    }\n\n    // Record duration\n    this.executionDuration.observe(\n      { graph_type: graphType, handler, status },\n      duration / 1000 // Convert to seconds\n    );\n\n    // Update active callbacks gauge\n    this.activeCallbacks.dec({ graph_type: graphType });\n  }\n\n  /**\n   * Record token issuance.\n   */\n  recordTokenIssued(graphType: string, handler: string): void {\n    this.tokensIssued.inc({ graph_type: graphType, handler });\n    this.pendingCallbacks.inc({ graph_type: graphType });\n  }\n\n  /**\n   * Record token expiration.\n   */\n  recordTokenExpired(graphType: string): void {\n    this.tokensExpired.inc({ graph_type: graphType });\n    this.pendingCallbacks.dec({ graph_type: graphType });\n  }\n\n  /**\n   * Record token age when executed.\n   */\n  recordTokenAge(graphType: string, ageMs: number): void {\n    this.tokenAge.observe({ graph_type: graphType }, ageMs / 1000);\n  }\n\n  /**\n   * Record ACL validation.\n   */\n  recordAclValidation(allowed: boolean, durationMs: number): void {\n    const result = allowed ? \"allowed\" : \"denied\";\n    this.aclValidationDuration.observe({ result }, durationMs / 1000);\n\n    if (!allowed) {\n      this.accessDenied.inc({ reason: \"acl_validation\" });\n    }\n  }\n\n  /**\n   * Record access denied event.\n   */\n  recordAccessDenied(reason: string): void {\n    this.accessDenied.inc({ reason });\n  }\n\n  /**\n   * Record rate limiting.\n   */\n  recordRateLimited(identifierType: \"user\" | \"ip\" | \"token\"): void {\n    this.rateLimited.inc({ identifier_type: identifierType });\n  }\n\n  /**\n   * Record retry attempt.\n   */\n  recordRetry(graphType: string, handler: string): void {\n    this.callbacksRetried.inc({ graph_type: graphType, handler });\n  }\n\n  /**\n   * Update queue size.\n   */\n  updateQueueSize(size: number): void {\n    this.queueSize.set(size);\n  }\n\n  /**\n   * Get metrics in Prometheus format.\n   */\n  async getMetrics(): Promise<string> {\n    return this.registry.metrics();\n  }\n\n  /**\n   * Get metrics content type.\n   */\n  getContentType(): string {\n    return this.registry.contentType;\n  }\n\n  /**\n   * Reset all metrics (useful for testing).\n   */\n  reset(): void {\n    this.registry.resetMetrics();\n  }\n\n  /**\n   * Classify error for metrics labeling.\n   */\n  private classifyError(error?: string): string {\n    if (!error) return \"unknown\";\n\n    const lowerError = error.toLowerCase();\n\n    if (lowerError.includes(\"timeout\")) return \"timeout\";\n    if (lowerError.includes(\"network\")) return \"network\";\n    if (lowerError.includes(\"validation\")) return \"validation\";\n    if (lowerError.includes(\"permission\") || lowerError.includes(\"forbidden\"))\n      return \"permission\";\n    if (lowerError.includes(\"not found\")) return \"not_found\";\n    if (lowerError.includes(\"rate limit\")) return \"rate_limit\";\n    if (lowerError.includes(\"retry\")) return \"retry_exhausted\";\n\n    return \"application\";\n  }\n\n  /**\n   * Get current metrics summary.\n   */\n  async getSummary(): Promise<Record<string, any>> {\n    const metrics = await this.registry.getMetricsAsJSON();\n    const summary: Record<string, any> = {};\n\n    metrics.forEach((metric: any) => {\n      if (metric.name === \"graph_callbacks_total\") {\n        summary.totalCallbacks = metric.values.reduce(\n          (sum: number, v: any) => sum + v.value,\n          0\n        );\n      }\n      if (metric.name === \"graph_callbacks_success_total\") {\n        summary.successfulCallbacks = metric.values.reduce(\n          (sum: number, v: any) => sum + v.value,\n          0\n        );\n      }\n      if (metric.name === \"graph_callbacks_failed_total\") {\n        summary.failedCallbacks = metric.values.reduce(\n          (sum: number, v: any) => sum + v.value,\n          0\n        );\n      }\n      if (metric.name === \"graph_callbacks_active\") {\n        summary.activeCallbacks = metric.values.reduce(\n          (sum: number, v: any) => sum + v.value,\n          0\n        );\n      }\n    });\n\n    if (summary.totalCallbacks > 0) {\n      summary.successRate =\n        (summary.successfulCallbacks / summary.totalCallbacks) * 100;\n    }\n\n    return summary;\n  }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport type Redis from \"ioredis\";\n\nexport interface RateLimitConfig {\n  windowMs: number; // Time window in milliseconds\n  maxRequests: number; // Max requests per window\n  keyPrefix?: string; // Redis key prefix\n  skipFailedRequests?: boolean; // Don't count failed requests\n}\n\nexport interface RateLimitResult {\n  allowed: boolean;\n  limit: number;\n  remaining: number;\n  resetAt: number;\n  retryAfter?: number;\n}\n\n/**\n * Rate limiter for callback execution using sliding window algorithm.\n * Prevents abuse and protects against brute force attacks.\n */\n@Injectable()\nexport class CallbackRateLimiter {\n  private readonly logger = new Logger(CallbackRateLimiter.name);\n  private readonly defaultConfig: RateLimitConfig = {\n    windowMs: 60000, // 1 minute\n    maxRequests: 10, // 10 requests per minute\n    keyPrefix: \"ratelimit:callback\",\n    skipFailedRequests: false,\n  };\n\n  constructor(private readonly redis: Redis) {}\n\n  /**\n   * Check if request is allowed based on rate limit.\n   */\n  async checkLimit(\n    identifier: string,\n    config?: Partial<RateLimitConfig>\n  ): Promise<RateLimitResult> {\n    const cfg = { ...this.defaultConfig, ...config };\n    const key = `${cfg.keyPrefix}:${identifier}`;\n    const now = Date.now();\n    const windowStart = now - cfg.windowMs;\n\n    // Use Lua script for atomic operation\n    const script = `\n      local key = KEYS[1]\n      local now = tonumber(ARGV[1])\n      local window_start = tonumber(ARGV[2])\n      local max_requests = tonumber(ARGV[3])\n      local window_ms = tonumber(ARGV[4])\n      \n      -- Remove old entries outside the window\n      redis.call('ZREMRANGEBYSCORE', key, 0, window_start)\n      \n      -- Count requests in current window\n      local current_requests = redis.call('ZCARD', key)\n      \n      if current_requests < max_requests then\n        -- Add current request\n        redis.call('ZADD', key, now, now)\n        -- Set expiry\n        redis.call('EXPIRE', key, math.ceil(window_ms / 1000))\n        \n        return {1, max_requests, max_requests - current_requests - 1, 0}\n      else\n        -- Get oldest request in window to calculate retry time\n        local oldest = redis.call('ZRANGE', key, 0, 0, 'WITHSCORES')\n        local reset_at = oldest[2] and (tonumber(oldest[2]) + window_ms) or (now + window_ms)\n        \n        return {0, max_requests, 0, reset_at}\n      end\n    `;\n\n    const result = (await this.redis.eval(\n      script,\n      1,\n      key,\n      now,\n      windowStart,\n      cfg.maxRequests,\n      cfg.windowMs\n    )) as [number, number, number, number];\n\n    const [allowed, limit, remaining, resetAt] = result;\n\n    const rateLimitResult: RateLimitResult = {\n      allowed: allowed === 1,\n      limit,\n      remaining: Math.max(0, remaining),\n      resetAt,\n    };\n\n    if (!rateLimitResult.allowed) {\n      rateLimitResult.retryAfter = Math.ceil((resetAt - now) / 1000);\n      this.logger.warn(\n        `Rate limit exceeded for ${identifier}. Retry after ${rateLimitResult.retryAfter}s`\n      );\n    }\n\n    return rateLimitResult;\n  }\n\n  /**\n   * Check rate limit for user-specific operations.\n   */\n  async checkUserLimit(\n    userId: string,\n    config?: Partial<RateLimitConfig>\n  ): Promise<RateLimitResult> {\n    return this.checkLimit(`user:${userId}`, {\n      windowMs: 60000, // 1 minute\n      maxRequests: 20, // 20 requests per minute per user\n      ...config,\n    });\n  }\n\n  /**\n   * Check rate limit for IP-based operations.\n   */\n  async checkIpLimit(\n    ip: string,\n    config?: Partial<RateLimitConfig>\n  ): Promise<RateLimitResult> {\n    return this.checkLimit(`ip:${ip}`, {\n      windowMs: 60000, // 1 minute\n      maxRequests: 30, // 30 requests per minute per IP\n      ...config,\n    });\n  }\n\n  /**\n   * Check rate limit for token validation attempts (stricter).\n   */\n  async checkTokenLimit(\n    identifier: string,\n    config?: Partial<RateLimitConfig>\n  ): Promise<RateLimitResult> {\n    return this.checkLimit(`token:${identifier}`, {\n      windowMs: 300000, // 5 minutes\n      maxRequests: 5, // 5 attempts per 5 minutes\n      ...config,\n    });\n  }\n\n  /**\n   * Reset rate limit for an identifier.\n   * Useful for admin operations or testing.\n   */\n  async reset(identifier: string, keyPrefix?: string): Promise<void> {\n    const prefix = keyPrefix || this.defaultConfig.keyPrefix;\n    const key = `${prefix}:${identifier}`;\n    await this.redis.del(key);\n    this.logger.debug(`Rate limit reset for ${identifier}`);\n  }\n\n  /**\n   * Get current rate limit status without incrementing counter.\n   */\n  async getStatus(\n    identifier: string,\n    config?: Partial<RateLimitConfig>\n  ): Promise<RateLimitResult> {\n    const cfg = { ...this.defaultConfig, ...config };\n    const key = `${cfg.keyPrefix}:${identifier}`;\n    const now = Date.now();\n    const windowStart = now - cfg.windowMs;\n\n    // Remove old entries and count current\n    await this.redis.zremrangebyscore(key, 0, windowStart);\n    const currentRequests = await this.redis.zcard(key);\n\n    const remaining = Math.max(0, cfg.maxRequests - currentRequests);\n    const allowed = currentRequests < cfg.maxRequests;\n\n    let resetAt = now + cfg.windowMs;\n    if (!allowed) {\n      const oldest = await this.redis.zrange(key, 0, 0, \"WITHSCORES\");\n      if (oldest.length >= 2) {\n        resetAt = parseInt(oldest[1]) + cfg.windowMs;\n      }\n    }\n\n    return {\n      allowed,\n      limit: cfg.maxRequests,\n      remaining,\n      resetAt,\n      retryAfter: allowed ? undefined : Math.ceil((resetAt - now) / 1000),\n    };\n  }\n\n  /**\n   * Create rate limit headers for HTTP response.\n   */\n  createHeaders(result: RateLimitResult): Record<string, string> {\n    const headers: Record<string, string> = {\n      \"X-RateLimit-Limit\": result.limit.toString(),\n      \"X-RateLimit-Remaining\": result.remaining.toString(),\n      \"X-RateLimit-Reset\": new Date(result.resetAt).toISOString(),\n    };\n\n    if (result.retryAfter) {\n      headers[\"Retry-After\"] = result.retryAfter.toString();\n    }\n\n    return headers;\n  }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackRecord, CallbackPatch } from \"./callback.interface\";\nimport { TelegramPatchHandler } from \"./telegram-patch.handler\";\nimport { WebPatchHandler } from \"./web-patch.handler\";\n\nexport interface CallbackPatchHandler {\n  apply(patch: CallbackPatch, context?: any): Promise<void>;\n}\n\n@Injectable()\nexport class CallbackPatchService {\n  private readonly logger = new Logger(CallbackPatchService.name);\n  constructor(\n    private readonly telegram: TelegramPatchHandler,\n    private readonly web: WebPatchHandler\n  ) {}\n\n  async apply(\n    record: CallbackRecord,\n    patch: CallbackPatch,\n    context?: any\n  ): Promise<void> {\n    if (!patch) return;\n    const platform = record.metadata?.platform;\n    try {\n      switch (platform) {\n        case \"telegram\":\n          await this.telegram.apply(patch, context);\n          break;\n        case \"web\":\n          await this.web.apply(patch, context);\n          break;\n        default:\n          this.logger.warn(`Unsupported patch platform: ${platform}`);\n      }\n    } catch (err) {\n      this.logger.error(\n        `Failed to apply patch for ${record.graphType}::${record.handler}`,\n        err instanceof Error ? err.stack : undefined\n      );\n    }\n  }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackPatch } from \"./callback.interface\";\nimport { CallbackPatchHandler } from \"./callback-patch.service\";\n\n@Injectable()\nexport class TelegramPatchHandler implements CallbackPatchHandler {\n  private readonly logger = new Logger(TelegramPatchHandler.name);\n\n  async apply(patch: CallbackPatch, context?: any): Promise<void> {\n    this.logger.debug(\n      `Applying Telegram patch ${JSON.stringify(patch)} with context ${JSON.stringify(\n        context\n      )}`\n    );\n  }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { CallbackPatch } from \"./callback.interface\";\nimport { CallbackPatchHandler } from \"./callback-patch.service\";\n\n@Injectable()\nexport class WebPatchHandler implements CallbackPatchHandler {\n  private readonly logger = new Logger(WebPatchHandler.name);\n\n  async apply(patch: CallbackPatch, context?: any): Promise<void> {\n    this.logger.debug(\n      `Applying Web patch ${JSON.stringify(patch)} with context ${JSON.stringify(\n        context\n      )}`\n    );\n  }\n}\n","export * from \"./callback-store\";\nexport * from \"./callback-registry\";\nexport * from \"./smart-callback.router\";\nexport * from \"./universal-callback.service\";\nexport * from \"./example.callback\";\nexport * from \"./callback-acl.service\";\nexport * from \"./callback-auditor.service\";\nexport * from \"./callback-metrics.service\";\nexport * from \"./callback-rate-limiter\";\nexport * from \"./idempotency-manager\";\nexport * from \"./callback-patch.service\";\nexport * from \"./telegram-patch.handler\";\nexport * from \"./web-patch.handler\";\nexport * from \"./callback.decorators\";\nexport * from \"./callback-token.guard\";\nexport * from \"./callback.controller\";\nexport * from \"./callback.interface\";\n","import {\n  CanActivate,\n  ExecutionContext,\n  Injectable,\n  UnauthorizedException,\n  Logger,\n} from \"@nestjs/common\";\nimport { Request } from \"express\";\nimport { CallbackStore } from \"../callbacks\";\nimport { CallbackRecord } from \"./callback.interface\";\nimport { CallbackACL, CallbackUser } from \"../callbacks/callback-acl.service\";\n\nexport interface CallbackRequest extends Request {\n  callbackRecord: CallbackRecord;\n  user?: CallbackUser;\n}\n\n@Injectable()\nexport class CallbackTokenGuard implements CanActivate {\n  private readonly logger = new Logger(CallbackTokenGuard.name);\n\n  constructor(\n    private readonly store: CallbackStore,\n    private readonly acl: CallbackACL\n  ) {}\n\n  async canActivate(context: ExecutionContext): Promise<boolean> {\n    const request = context.switchToHttp().getRequest<CallbackRequest>();\n    const token = request.body?.token;\n    if (!token) {\n      throw new UnauthorizedException(\"Callback token missing\");\n    }\n    const record = await this.store.getAndLock(token);\n    if (!record) {\n      throw new UnauthorizedException(\"Invalid callback token\");\n    }\n\n    // Extract user from request (assumes JWT auth middleware has run)\n    const user = this.extractUser(request);\n\n    // Validate ACL permissions\n    await this.acl.validate(user, record);\n\n    request.callbackRecord = record;\n    request.user = user;\n    return true;\n  }\n\n  private extractUser(request: CallbackRequest): CallbackUser | undefined {\n    this.logger.log(`Extracting user from request`, {\n      hasRequestUser: !!request.user,\n      hasPlatformContext: !!request.body?.platformContext,\n      platformContextKeys: request.body?.platformContext\n        ? Object.keys(request.body.platformContext)\n        : [],\n    });\n\n    // Try to extract user from JWT middleware first (direct API calls)\n    if (request.user) {\n      this.logger.log(\n        `Found user from JWT middleware: ${request.user[\"id\"] || request.user[\"sub\"]}`\n      );\n      return {\n        userId: request.user[\"id\"] || request.user[\"sub\"],\n        roles: request.user[\"roles\"],\n        permissions: request.user[\"permissions\"],\n        companyId: request.user[\"companyId\"],\n      };\n    }\n\n    // For inter-service calls, extract user from platformContext\n    const platformContext = request.body?.platformContext;\n    if (\n      platformContext &&\n      platformContext.userId &&\n      platformContext.authenticated\n    ) {\n      this.logger.log(\n        `Found user from platformContext: ${platformContext.userId}`\n      );\n      return {\n        userId: platformContext.userId,\n        roles: platformContext.roles || [],\n        permissions: platformContext.permissions || [],\n        companyId: platformContext.companyId,\n      };\n    }\n\n    this.logger.warn(`No user found in request or platformContext`);\n    return undefined;\n  }\n}\n","import { Controller, Post, Req, UseGuards } from \"@nestjs/common\";\nimport { ApiTags, ApiOperation, ApiResponse } from \"@nestjs/swagger\";\nimport { UniversalCallbackService } from \"../callbacks\";\nimport { CallbackTokenGuard, CallbackRequest } from \"./callback-token.guard\";\n\n@ApiTags(\"Callbacks\")\n@Controller()\nexport class CallbackController {\n  constructor(private readonly callbackService: UniversalCallbackService) {}\n\n  @Post(\"callback\")\n  @UseGuards(CallbackTokenGuard)\n  @ApiOperation({ summary: \"Process callback by token\" })\n  @ApiResponse({ status: 200, description: \"Callback executed\" })\n  async handleCallback(@Req() req: CallbackRequest) {\n    return this.callbackService.handle(req.callbackRecord, req.user);\n  }\n}\n","// packages/sdk/src/abstract-graph.builder.ts\nimport { Inject, Injectable, Type, Logger, Optional } from \"@nestjs/common\";\nimport { ConfigService } from \"@nestjs/config\";\nimport * as path from \"path\";\n// Remove dependency on legacy BaseGraphService\nimport { IGraphRequestPayload, IGraphResponsePayload, IGraphService } from \".\";\nimport {\n  CallbackResult,\n  CallbackHandler,\n  CallbackRegistry,\n} from \"../callbacks\";\nimport { EndpointRegistry } from \"../agent-ui\";\n\n/**\n * Interface for graph manifest\n */\nexport interface IGraphManifest {\n  // === BASIC INFORMATION ===\n  companySlug: string;\n  name: string;\n  title: string;\n  description: string;\n  detailedDescription: string;\n\n  // === METADATA ===\n  category?: string;\n  author?: string;\n  maintainer?: string;\n  repository?: string;\n  tags?: string[];\n\n  // === UI CONFIGURATION (graph level) ===\n  ui?: {\n    enabled: boolean;\n    title: string;\n    description?: string;\n    defaultScreen: string;\n    menu: string[];\n    screens: Record<string, any>;\n    theme?: Record<string, any>;\n    permissions?: Record<string, any>;\n  };\n\n  // === VERSIONING ===\n  versioning: {\n    strategy: \"semver\";\n    defaultVersion: string;\n    supportedVersions: string[];\n  };\n\n  // === VERSIONS ===\n  versions: Record<\n    string,\n    {\n      status: string;\n      releaseDate: string;\n      isActive: boolean;\n      visibility: \"public\" | \"private\";\n      configSchemaPath?: string;\n    }\n  >;\n}\n\n/**\n * Base abstraction for versioned graphs\n * All graphs should specify only version (e.g. \"1.0.0\")\n * Full graphType is auto-generated from baseGraphType + version\n */\nexport abstract class AbstractGraphBuilder<V extends string = string> {\n  /**\n   * Graph version in semver format (e.g. \"1.0.0\", \"2.1.3\")\n   */\n  abstract readonly version: V;\n\n  protected logger = new Logger(AbstractGraphBuilder.name);\n\n  @Inject(CallbackRegistry)\n  protected callbackRegistry: CallbackRegistry;\n\n  @Inject(EndpointRegistry)\n  protected endpointRegistry: EndpointRegistry;\n\n  /**\n   * Returns full graph type (companySlug.name::version)\n   * Auto-generated from manifest's companySlug.name and version\n   */\n  get graphType(): string {\n    // Generate from companySlug.name + version\n    if (this.manifest?.companySlug && this.manifest?.name) {\n      return `${this.manifest.companySlug}.${this.manifest.name}::${this.version}`;\n    }\n\n    // Fallback - will be determined when manifest is loaded\n    return `unknown::${this.version}`;\n  }\n\n  /**\n   * Path to root graph manifest (defaults to graph.manifest.json in root)\n   */\n  protected manifestPath: string = path.join(\n    process.cwd(),\n    \"graph.manifest.json\"\n  );\n\n  /**\n   * Loaded graph manifest\n   */\n  protected manifest?: IGraphManifest;\n\n  constructor() {\n    // Load manifest synchronously to get correct graphType\n    try {\n      this.loadManifestSync();\n      if (this.manifest) {\n        this.logger.debug(\n          `Loaded manifest for ${this.manifest.companySlug}.${this.manifest.name} (${this.constructor.name})`\n        );\n      }\n    } catch (error) {\n      this.logger.warn(\n        `Failed to load manifest in constructor: ${error.message}`\n      );\n    }\n\n    // Register callbacks and endpoints after the derived class is fully constructed\n    setImmediate(() => {\n      this.logger.debug(\n        `Starting callback and endpoint registration for ${this.constructor.name}`\n      );\n\n      this.registerCallbacks().catch(error => {\n        this.logger.error(\n          `Failed to register callbacks in constructor: ${error.message}`\n        );\n      });\n\n      this.registerEndpoints().catch(error => {\n        this.logger.error(\n          `Failed to register endpoints in constructor: ${error.message}`\n        );\n      });\n    });\n  }\n\n  /**\n   * Build graph\n   */\n  abstract buildGraph(config: any): Promise<any>;\n\n  /**\n   * Creates execution context for graph with tracer and usageRecorder\n   * This method can be overridden in child classes for customization\n   */\n  protected createGraphContext(payload: IGraphRequestPayload): {\n    messageId?: string;\n    threadId: string;\n    userId: string;\n    agentId: string;\n    companyId?: string;\n  } {\n    return {\n      messageId: (payload as any).messageId,\n      threadId: payload.threadId,\n      userId: payload.userId,\n      agentId: payload.agentId,\n      companyId: (payload as any).companyId,\n    };\n  }\n\n  /**\n   * Basic configuration preparation for graph execution\n   * Automatically creates context with tracer and usageRecorder\n   * Can be overridden in child classes to add specific logic\n   */\n  async prepareConfig(payload: IGraphRequestPayload): Promise<any> {\n    const context = this.createGraphContext(payload);\n\n    return {\n      configurable: {\n        thread_id: payload.threadId,\n        context,\n        // Add metadata for compatibility\n        metadata: {\n          userId: payload.userId,\n          agentId: payload.agentId,\n          requestId: payload.requestId,\n          graphType: this.graphType,\n          version: this.version,\n        },\n      },\n    };\n  }\n\n  /**\n   * Load graph manifest (if using manifest-based approach)\n   */\n  protected async loadManifest(): Promise<IGraphManifest | null> {\n    if (!this.manifestPath) {\n      return null;\n    }\n\n    try {\n      const fs = await import(\"fs/promises\");\n      const path = await import(\"path\");\n\n      const manifestFullPath = path.resolve(this.manifestPath);\n      const manifestContent = await fs.readFile(manifestFullPath, \"utf-8\");\n      const manifest = JSON.parse(manifestContent) as IGraphManifest;\n\n      // Manifest validation disabled - new structure is used\n      // this.validateManifest(manifest);\n\n      this.manifest = manifest;\n      return manifest;\n    } catch (error) {\n      console.error(\n        `Failed to load manifest from ${this.manifestPath}: ${error instanceof Error ? error.message : String(error)}`\n      );\n      return null;\n    }\n  }\n\n  /**\n   * Synchronous manifest loading for use in constructor\n   */\n  protected loadManifestSync(): IGraphManifest | null {\n    if (!this.manifestPath) {\n      return null;\n    }\n\n    try {\n      const fs = require(\"fs\");\n      const path = require(\"path\");\n\n      const manifestFullPath = path.resolve(this.manifestPath);\n      const manifestContent = fs.readFileSync(manifestFullPath, \"utf-8\");\n      const manifest = JSON.parse(manifestContent) as IGraphManifest;\n\n      // Manifest validation disabled - new structure is used\n      // this.validateManifest(manifest);\n\n      this.manifest = manifest;\n      return manifest;\n    } catch (error) {\n      console.error(\n        `Failed to load manifest from ${this.manifestPath}: ${error instanceof Error ? error.message : String(error)}`\n      );\n      return null;\n    }\n  }\n\n  /**\n   * Validate graph manifest\n   */\n  protected validateManifest(manifest: IGraphManifest): void {\n    // Validation temporarily disabled for new manifest structure\n    // TODO: Create new validator for structure with baseType and versions\n    // GraphManifestValidator.validateOrThrow(manifest);\n  }\n\n  /**\n   * Get graph metadata (from manifest or decorator)\n   */\n  async getGraphMetadata(): Promise<IGraphManifest | null> {\n    if (this.manifest) {\n      return this.manifest;\n    }\n\n    return await this.loadManifest();\n  }\n\n  /**\n   * Get specific version configuration of the graph\n   */\n  async getVersionConfig() {\n    const manifest = await this.loadManifest();\n    if (!manifest) {\n      throw new Error(`Manifest not found at ${this.manifestPath}`);\n    }\n\n    const versionConfig = manifest.versions[this.version];\n    if (!versionConfig) {\n      throw new Error(`Version ${this.version} not found in manifest`);\n    }\n\n    // Load config schema if path is specified\n    let configSchema = null;\n    if (versionConfig.configSchemaPath) {\n      try {\n        const fs = await import(\"fs/promises\");\n        const schemaPath = path.resolve(\n          process.cwd(),\n          versionConfig.configSchemaPath\n        );\n        const schemaContent = await fs.readFile(schemaPath, \"utf-8\");\n        const schemaData = JSON.parse(schemaContent);\n        configSchema = schemaData.schema;\n      } catch (error) {\n        this.logger.warn(`Failed to load config schema: ${error.message}`);\n      }\n    }\n\n    return {\n      // Basic graph information\n      companySlug: manifest.companySlug,\n      name: manifest.name,\n      title: manifest.title,\n      description: manifest.description,\n      detailedDescription: manifest.detailedDescription,\n      category: manifest.category,\n      tags: manifest.tags,\n\n      // UI configuration\n      ui: manifest.ui,\n\n      // Version information\n      ...versionConfig,\n\n      // Config schema (if exists)\n      configSchema,\n\n      // Full graphType for compatibility\n      graphType: this.graphType,\n      version: this.version,\n    };\n  }\n\n  /**\n   * Get full graph type\n   * REQUIRES baseGraphType - no more legacy support!\n   */\n  getFullGraphType(baseGraphType: string): string {\n    if (!baseGraphType) {\n      throw new Error(\"baseGraphType is required for versioned graphs\");\n    }\n\n    return `${baseGraphType}::${this.version}`;\n  }\n\n  /**\n   * Version validation\n   */\n  validateVersion(): boolean {\n    const versionRegex = /^\\d+\\.\\d+\\.\\d+$/;\n    if (!versionRegex.test(this.version)) {\n      throw new Error(\n        `Invalid version format: ${this.version}. Expected format: X.Y.Z`\n      );\n    }\n    return true;\n  }\n\n  /**\n   * Register callbacks from @Callback decorators\n   * This is called automatically after the builder is constructed\n   */\n  protected async registerCallbacks(): Promise<void> {\n    this.logger.log(`CallbackRegistry instance: ${!!this.callbackRegistry}`);\n\n    if (!this.callbackRegistry) {\n      this.logger.error(\n        \"CallbackRegistry not injected! This should not happen.\"\n      );\n      return;\n    }\n\n    try {\n      // Dynamically import decorator utilities to avoid circular dependencies\n      const { getCallbackMetadata } = await import(\n        \"../callbacks/callback.decorators.js\"\n      );\n\n      // Get callback metadata from the current class\n      const callbackMetadata = getCallbackMetadata(this.constructor);\n\n      this.logger.log(\n        `Found ${callbackMetadata?.length || 0} callbacks for ${this.constructor.name}`\n      );\n      this.logger.log(\n        `Callback metadata:`,\n        JSON.stringify(callbackMetadata, null, 2)\n      );\n\n      if (!callbackMetadata || callbackMetadata.length === 0) {\n        this.logger.warn(\n          `No callbacks found for ${this.constructor.name}. Check @WithCallbacks decorator.`\n        );\n        return;\n      }\n\n      // Get the full graph type for versioned registration\n      const fullGraphType = this.graphType; // This should return the full type like \"company.financial-ledger::1.0.0\"\n\n      // Register each callback with version\n      for (const { handler, method } of callbackMetadata) {\n        const callbackMethod = (this as any)[method];\n        if (typeof callbackMethod === \"function\") {\n          // Create a wrapper that binds the method to this instance\n          const boundCallback: CallbackHandler = async context => {\n            return callbackMethod.call(this, context);\n          };\n\n          // Register with version-specific key\n          this.callbackRegistry.register(handler, boundCallback, fullGraphType);\n\n          this.logger.log(\n            `Registered callback \"${handler}\" for graph type \"${fullGraphType}\"`\n          );\n        }\n      }\n\n      this.logger.log(\n        `Registered ${callbackMetadata.length} callbacks for ${this.constructor.name}`\n      );\n    } catch (error) {\n      this.logger.error(\n        `Failed to register callbacks: ${error instanceof Error ? error.message : String(error)}`\n      );\n    }\n  }\n\n  /**\n   * Register endpoints from @Endpoint decorators\n   * This is called automatically after the builder is constructed\n   */\n  protected async registerEndpoints(): Promise<void> {\n    this.logger.log(`EndpointRegistry instance: ${!!this.endpointRegistry}`);\n\n    if (!this.endpointRegistry) {\n      this.logger.error(\n        \"EndpointRegistry not injected! This should not happen.\"\n      );\n      return;\n    }\n\n    try {\n      // Dynamically import decorator utilities to avoid circular dependencies\n      const { getEndpointMetadata, createEndpointDescriptors } = await import(\n        \"../agent-ui\"\n      );\n\n      // Get endpoint metadata from the current class\n      const endpointMetadata = getEndpointMetadata(this.constructor);\n\n      if (!endpointMetadata || endpointMetadata.length === 0) {\n        // Only log if we expected endpoints (avoid confusing logs for callback-only builders)\n        return;\n      }\n\n      this.logger.log(\n        `Found ${endpointMetadata.length} endpoints for ${this.constructor.name}`\n      );\n      this.logger.debug(\n        `Endpoint metadata:`,\n        JSON.stringify(endpointMetadata, null, 2)\n      );\n\n      // Get the full graph type for versioned registration\n      const fullGraphType = this.graphType; // This should return the full type like \"ledger::1.0.0\"\n\n      // Create endpoint descriptors and register them\n      const endpointDescriptors = createEndpointDescriptors(\n        this,\n        endpointMetadata\n      );\n\n      for (const descriptor of endpointDescriptors) {\n        this.endpointRegistry.register(fullGraphType, descriptor);\n\n        this.logger.log(\n          `Registered endpoint \"${descriptor.name}\" for graph type \"${fullGraphType}\"`\n        );\n      }\n\n      this.logger.log(\n        `Registered ${endpointDescriptors.length} endpoints for ${this.constructor.name}`\n      );\n    } catch (error) {\n      this.logger.error(\n        `Failed to register endpoints: ${error instanceof Error ? error.message : String(error)}`\n      );\n    }\n  }\n\n  /**\n   * Helper method to manually register endpoints (for classes that don't use decorators)\n   * @param endpoints Endpoint descriptors to register\n   */\n  protected registerEndpointsManually(\n    endpoints: import(\"../agent-ui\").EndpointDescriptor[]\n  ): void {\n    if (!this.endpointRegistry) {\n      this.logger.error(\"EndpointRegistry not available\");\n      return;\n    }\n\n    const fullGraphType = this.graphType;\n    for (const endpoint of endpoints) {\n      this.endpointRegistry.register(fullGraphType, endpoint);\n      this.logger.log(\n        `Manually registered endpoint \"${endpoint.name}\" for graph type \"${fullGraphType}\"`\n      );\n    }\n  }\n}\n\n/**\n * Interface for graph engine\n */\nexport interface IGraphEngine {\n  invokeGraph(graph: any, config: any, signal?: AbortSignal): Promise<any>;\n  streamGraph(\n    graph: any,\n    config: any,\n    onPartial: (chunk: string) => void,\n    signal?: AbortSignal\n  ): Promise<any>;\n}\n\n/**\n * Universal graph service that delegates execution to builder and engine\n */\n@Injectable()\nexport class UniversalGraphService implements IGraphService {\n  readonly logger = new Logger(UniversalGraphService.name);\n\n  constructor(\n    protected readonly configService: ConfigService,\n    @Inject(\"GRAPH_BUILDERS\")\n    private readonly builders: AbstractGraphBuilder<string>[],\n    @Inject(\"GRAPH_ENGINE\")\n    private readonly engine: IGraphEngine,\n    @Inject(EndpointRegistry)\n    private readonly endpointRegistry: EndpointRegistry\n  ) {\n    this.logger.log(\"UniversalGraphService initialized\");\n    if (!this.engine) {\n      this.logger.error(\"GRAPH_ENGINE is not properly injected!\");\n    }\n  }\n\n  /**\n   * Returns graph types supported by the service\n   */\n  async getSupportedGraphTypes(): Promise<string[]> {\n    // console.log('Registered builders:', this.builders);\n    return this.builders.map(builder => {\n      // console.log(`Builder: ${builder.constructor.name}, graphType:`, builder.graphType);\n      return builder.graphType;\n    });\n  }\n\n  /**\n   * Generate answer without streaming\n   */\n  async generateAnswer(\n    payload: IGraphRequestPayload\n  ): Promise<IGraphResponsePayload> {\n    const builder = this.getBuilderForType(payload.graphType);\n\n    // Build graph\n    const graph = await builder.buildGraph(payload);\n\n    // Prepare execution configuration\n    const config = await builder.prepareConfig(payload);\n\n    // Track generation cancellation\n    const abortController = new AbortController();\n    this.registerActiveGeneration(payload.requestId, () => {\n      abortController.abort();\n    });\n\n    try {\n      // Execute graph through engine\n      const result = await this.engine.invokeGraph(\n        graph,\n        config,\n        abortController.signal\n      );\n\n      // Form response\n      return {\n        requestId: payload.requestId,\n        text: result.text || \"\",\n        attachments: result.attachments || [],\n        metadata: result.metadata || {},\n        reasoningChains: result.reasoningChains || [], // Add reasoning chains\n      };\n    } finally {\n      this.unregisterActiveGeneration(payload.requestId);\n    }\n  }\n\n  /**\n   * Stream answer generation\n   */\n  async streamAnswer(payload, onPartial) {\n    this.logger.debug(\n      `>>> Entering streamAnswer with requestId: ${payload.requestId}`\n    );\n    const abortController = new AbortController();\n\n    try {\n      // Existing code remains here\n      const builder = this.getBuilderForType(payload.graphType);\n      this.logger.debug(`Got builder for graph type: ${payload.graphType}`);\n\n      // Build graph\n      const graph = await builder.buildGraph(payload);\n      this.logger.debug(`Graph built for requestId: ${payload.requestId}`);\n\n      // Prepare execution configuration\n      this.logger.debug(`Preparing config for requestId: ${payload.requestId}`);\n      const config = await builder.prepareConfig(payload);\n      this.logger.debug(`Config prepared`);\n\n      // Track generation cancellation\n      this.registerActiveGeneration(payload.requestId, () => {\n        abortController.abort();\n      });\n      this.logger.debug(`Active generation registered: ${payload.requestId}`);\n\n      this.logger.debug(\n        `Calling engine.streamGraph for requestId: ${payload.requestId}`\n      );\n      const result = await this.engine.streamGraph(\n        graph,\n        config,\n        onPartial,\n        abortController.signal\n      );\n\n      this.logger.debug(`[STREAM-RESULT] Engine returned:`, {\n        hasText: !!result.text,\n        textLength: result.text?.length || 0,\n        attachmentsCount: result.attachments?.length || 0,\n        reasoningChainsCount: result.reasoningChains?.length || 0,\n        resultKeys: Object.keys(result || {}),\n      });\n\n      // Form response\n      return {\n        requestId: payload.requestId,\n        text: result.text || \"\",\n        attachments: result.attachments || [],\n        metadata: result.metadata || {},\n        reasoningChains: result.reasoningChains || [], // Add reasoning chains\n      };\n    } catch (error) {\n      this.logger.error(`Error in streamAnswer: ${error.message}`);\n      this.logger.error(`Stack trace: ${error.stack}`);\n      throw error; // Rethrow error\n    } finally {\n      abortController.abort();\n      this.unregisterActiveGeneration(payload.requestId);\n    }\n  }\n\n  /**\n   * Service health check\n   */\n  async healthCheck(): Promise<boolean> {\n    try {\n      // Check that there are registered builders\n      if (this.builders.length === 0) {\n        this.logger.warn(\"No builders registered\");\n        return false;\n      }\n\n      return true;\n    } catch (error) {\n      this.logger.error(`Health check failed: ${error.message}`);\n      return false;\n    }\n  }\n\n  /**\n   * Cancel generation\n   */\n  async cancelGeneration(requestId: string): Promise<void> {\n    const generation = this.activeGenerations.get(requestId);\n\n    if (generation) {\n      generation.cancel();\n      this.activeGenerations.delete(requestId);\n      this.logger.log(`Cancelled generation for request: ${requestId}`);\n    } else {\n      this.logger.warn(`No active generation found for request: ${requestId}`);\n    }\n  }\n\n  // Active generations that can be cancelled\n  private readonly activeGenerations = new Map<\n    string,\n    { cancel: () => void }\n  >();\n\n  /**\n   * Register active generation\n   */\n  private registerActiveGeneration(\n    requestId: string,\n    cancel: () => void\n  ): void {\n    this.activeGenerations.set(requestId, { cancel });\n\n    // Automatic cleanup after 10 minutes\n    setTimeout(\n      () => {\n        if (this.activeGenerations.has(requestId)) {\n          this.activeGenerations.delete(requestId);\n          this.logger.debug(\n            `Auto-cleaned generation for request: ${requestId}`\n          );\n        }\n      },\n      10 * 60 * 1000\n    );\n  }\n\n  /**\n   * Remove active generation\n   */\n  private unregisterActiveGeneration(requestId: string): void {\n    this.activeGenerations.delete(requestId);\n  }\n\n  /**\n   * Execute callback through decorators\n   */\n  async executeCallback(\n    token: string,\n    platform?: string,\n    platformContext?: any\n  ): Promise<CallbackResult> {\n    this.logger.debug(`Executing callback with token: ${token}`);\n\n    try {\n      // Try to find callback among builders through decorators\n      const result = await this.executeCallbackFromDecorators(\n        token,\n        platform,\n        platformContext\n      );\n\n      if (result) {\n        return result;\n      }\n\n      // If not found through decorators, try old system (SmartCallbackRouter)\n      // TODO: integrate with existing callback system if backward compatibility is needed\n\n      return {\n        success: false,\n        error: \"Callback handler not found\",\n      };\n    } catch (error) {\n      this.logger.error(\n        `Error executing callback: ${error instanceof Error ? error.message : String(error)}`\n      );\n      return {\n        success: false,\n        error: error instanceof Error ? error.message : \"Unknown error\",\n      };\n    }\n  }\n\n  /**\n   * Execute callback through decorator system\n   */\n  private async executeCallbackFromDecorators(\n    token: string,\n    platform?: string,\n    platformContext?: any\n  ): Promise<CallbackResult | null> {\n    // Import functions for working with decorators\n    const { getCallbackMetadata, findCallbackMethod } = await import(\n      \"../callbacks/callback.decorators.js\"\n    );\n\n    // Parse token to extract graph type and handler\n    const { graphType, handler } = this.parseCallbackToken(token);\n\n    // Find builder for this graph type\n    const builder = this.builders.find(b => b.graphType === graphType);\n    if (!builder) {\n      this.logger.warn(`No builder found for graph type: ${graphType}`);\n      return null;\n    }\n\n    // Find callback method in builder\n    const methodName = findCallbackMethod(builder.constructor, handler);\n    if (!methodName || typeof (builder as any)[methodName] !== \"function\") {\n      this.logger.warn(\n        `No callback method found for handler: ${handler} in ${graphType}`\n      );\n      return null;\n    }\n\n    // Create callback context\n    const context = {\n      userId: platformContext?.userId || \"unknown\",\n      threadId: platformContext?.threadId,\n      agentId: platformContext?.agentId,\n      params: this.parseCallbackParams(token),\n      platform,\n      metadata: {\n        token,\n        platformContext,\n        graphType,\n        handler,\n      },\n    };\n\n    // Call callback method\n    this.logger.debug(`Executing callback ${handler} on builder ${graphType}`);\n    const result = await (builder as any)[methodName](context);\n\n    return result;\n  }\n\n  /**\n   * Parse callback token to extract information\n   * Expected format: cb_{graphName}_{handler}_{encodedParams}\n   */\n  private parseCallbackToken(token: string): {\n    graphType: string;\n    handler: string;\n  } {\n    const parts = token.split(\"_\");\n\n    if (parts.length < 4 || parts[0] !== \"cb\") {\n      throw new Error(`Invalid callback token format: ${token}`);\n    }\n\n    const graphName = parts[1];\n    const handler = parts[2];\n\n    // TODO: Add default version or extract from token\n    const graphType = `${graphName}::1.0.0`;\n\n    return { graphType, handler };\n  }\n\n  /**\n   * Extract parameters from callback token\n   */\n  private parseCallbackParams(token: string): Record<string, any> {\n    const parts = token.split(\"_\");\n\n    if (parts.length < 4) {\n      return {};\n    }\n\n    try {\n      // Last part of token contains encoded parameters\n      const encodedParams = parts.slice(3).join(\"_\");\n      const decodedParams = Buffer.from(encodedParams, \"base64url\").toString(\n        \"utf8\"\n      );\n      return JSON.parse(decodedParams);\n    } catch (error) {\n      this.logger.warn(\n        `Failed to parse callback params from token: ${token}`,\n        error\n      );\n      return {};\n    }\n  }\n\n  /**\n   * Call a graph endpoint\n   * @param graphType Graph type\n   * @param endpointName Endpoint name\n   * @param context Request context\n   * @returns Response envelope\n   */\n  async callEndpoint(\n    graphType: string,\n    endpointName: string,\n    context: import(\"../agent-ui\").RequestContext\n  ): Promise<import(\"../agent-ui\").DataEnvelope> {\n    this.logger.debug(\n      `Calling endpoint \"${endpointName}\" for graph \"${graphType}\"`\n    );\n\n    return await this.endpointRegistry.call(graphType, endpointName, context);\n  }\n\n  /**\n   * List all endpoints for a graph type\n   * @param graphType Graph type\n   * @returns Array of endpoint names\n   */\n  listEndpoints(graphType: string): string[] {\n    return this.endpointRegistry.list(graphType);\n  }\n\n  /**\n   * List all graph types that have endpoints\n   * @returns Array of graph types\n   */\n  listGraphTypesWithEndpoints(): string[] {\n    return this.endpointRegistry.listGraphTypes();\n  }\n\n  /**\n   * Get builder for specified graph type\n   */\n  private getBuilderForType(graphType: string): AbstractGraphBuilder<string> {\n    const builder = this.builders.find(b => b.graphType === graphType);\n\n    if (!builder) {\n      throw new Error(`No builder found for graph type: ${graphType}`);\n    }\n\n    return builder;\n  }\n}\n","import { NestFactory } from \"@nestjs/core\";\nimport { Logger, ValidationPipe } from \"@nestjs/common\";\nimport { SwaggerModule, DocumentBuilder } from \"@nestjs/swagger\";\nimport * as net from \"net\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\n/**\n * Setup Redis mock for development environment\n * Intercepts ioredis requires and redirects to ioredis-mock\n */\nfunction setupRedisMock() {\n  if (\n    process.env.NODE_ENV === \"development\" &&\n    !process.env.KUBERNETES_SERVICE_HOST\n  ) {\n    console.log(\"[REDIS_MOCK] Intercepting ioredis requires for development\");\n    const Module = require(\"module\");\n    const originalRequire = Module.prototype.require;\n\n    Module.prototype.require = function (...args: any[]) {\n      if (args[0] === \"ioredis\") {\n        console.log(\"[REDIS_MOCK] Redirecting ioredis to ioredis-mock\");\n        return originalRequire.apply(this, [\"ioredis-mock\"]);\n      }\n      return originalRequire.apply(this, args);\n    };\n  }\n}\n\n/**\n * Check port availability\n */\nasync function isPortAvailable(port: number): Promise<boolean> {\n  return new Promise(resolve => {\n    const server = net.createServer();\n    server.listen(port, () => {\n      server.close(() => resolve(true));\n    });\n    server.on(\"error\", () => resolve(false));\n  });\n}\n\n/**\n * Find available port starting from the given one\n */\nasync function findAvailablePort(startPort: number): Promise<number> {\n  let port = startPort;\n  while (port < startPort + 100) {\n    // Check up to 100 ports\n    if (await isPortAvailable(port)) {\n      return port;\n    }\n    port++;\n  }\n  throw new Error(\n    `No available ports found in range ${startPort}-${startPort + 99}`\n  );\n}\n\n/**\n * Automatic service discovery registration\n * NOTE: This feature requires @amelie/graph-service-registry package\n * which is an optional dependency. Commented out for standalone SDK usage.\n * Uncomment and install @amelie/graph-service-registry if needed.\n */\nasync function registerWithServiceDiscovery(\n  AppModule: any,\n  port: number,\n  logger: Logger,\n  app?: any\n): Promise<void> {\n  try {\n    logger.debug(\n      \"[SERVICE_DISCOVERY] Starting service discovery registration...\"\n    );\n\n    // Import FileBasedDiscovery from SDK\n    const { FileBasedDiscovery } = await import(\n      \"../service-discovery/file-based.discovery\"\n    );\n\n    logger.debug(\n      \"[SERVICE_DISCOVERY] FileBasedDiscovery imported successfully\"\n    );\n    const discovery = new FileBasedDiscovery();\n    logger.debug(\"[SERVICE_DISCOVERY] FileBasedDiscovery instance created\");\n\n    // Derive service name from module name\n    const serviceName = AppModule.name.replace(\"Module\", \"\").toLowerCase();\n\n    // Extract supported graph types from registered builders\n    let graphTypes: string[] = [];\n    try {\n      if (app) {\n        // Get BuilderRegistry from application\n        const { BuilderRegistryService } = await import(\n          \"./builder-registry.service\"\n        );\n        const builderRegistry = app.get(BuilderRegistryService, {\n          strict: false,\n        });\n        logger.debug(\n          `BuilderRegistryService found in DI: ${!!builderRegistry}`\n        );\n\n        if (builderRegistry) {\n          const builders = builderRegistry.getBuilders();\n          logger.debug(`Found ${builders.length} builders in registry`);\n          const baseGraphTypes = builders.map(builder => builder.graphType);\n          logger.debug(`Base graph types: [${baseGraphTypes.join(\", \")}]`);\n\n          // Try to get versioned types from VersionedGraphService\n          try {\n            logger.debug(\"Attempting to import VersionedGraphService...\");\n            const { VersionedGraphService } = await import(\n              \"../graph/versioning/versioned-graph.service\"\n            );\n            logger.debug(\"VersionedGraphService imported successfully\");\n\n            const versionedService = app.get(VersionedGraphService, {\n              strict: false,\n            });\n            logger.debug(\n              `VersionedGraphService found in DI: ${!!versionedService}`\n            );\n\n            if (versionedService) {\n              // Collect all versions for each base type\n              const allVersionedTypes: string[] = [];\n              for (const baseType of baseGraphTypes) {\n                logger.debug(`Getting versions for base type: ${baseType}`);\n                const versions =\n                  versionedService.getAvailableVersions(baseType);\n                logger.debug(\n                  `Found ${versions.length} versions for ${baseType}: [${versions.join(\", \")}]`\n                );\n\n                if (versions.length > 0) {\n                  // Add base type and all its versions\n                  allVersionedTypes.push(baseType);\n                  versions.forEach(version => {\n                    allVersionedTypes.push(`${baseType}::${version}`);\n                  });\n                } else {\n                  // If no versions, add only base type\n                  allVersionedTypes.push(baseType);\n                }\n              }\n              graphTypes = allVersionedTypes;\n              logger.debug(\n                `Found ${baseGraphTypes.length} base types with ${graphTypes.length} total versioned types: ${graphTypes.join(\", \")}`\n              );\n            } else {\n              // Fallback to base types if VersionedGraphService is not available\n              graphTypes = baseGraphTypes;\n              logger.debug(\n                `VersionedGraphService not found in DI container, using base types: ${graphTypes.join(\", \")}`\n              );\n            }\n          } catch (error) {\n            // Fallback to base types if error getting versions\n            graphTypes = baseGraphTypes;\n            logger.debug(\n              `Failed to get versioned types, using base types: ${error.message}`\n            );\n            logger.debug(`Stack trace: ${error.stack}`);\n          }\n        }\n      }\n    } catch (error) {\n      logger.debug(`Failed to get graph types from builders: ${error.message}`);\n    }\n\n    // Fallback to service name if no builders found\n    if (graphTypes.length === 0) {\n      logger.debug(\"No builders found, using service name as graph type\");\n      graphTypes = [serviceName];\n    }\n\n    await discovery.registerService(\n      serviceName,\n      \"localhost\",\n      port,\n      {\n        graphTypes,\n        environment: \"development\",\n        startTime: new Date().toISOString(),\n        version: process.env.npm_package_version || \"1.0.0\",\n      },\n      graphTypes\n    );\n\n    logger.log(\n      `📡 Service registered with discovery: ${serviceName} (types: ${graphTypes.join(\", \")})`\n    );\n  } catch (error) {\n    logger.warn(`Failed to register with service discovery: ${error.message}`);\n  }\n}\n\n/**\n * Bootstrap function for graph microservices\n */\nexport async function bootstrap(\n  AppModule: any,\n  options: { port?: number; globalPrefix?: string } = {}\n) {\n  // Setup Redis mock for development (must be called before any module imports)\n  setupRedisMock();\n\n  const app = await NestFactory.create(AppModule);\n  const logger = new Logger(\"Bootstrap\");\n\n  // Configuration\n  const requestedPort =\n    options.port || parseInt(process.env.PORT || \"3100\", 10);\n  const port = await findAvailablePort(requestedPort);\n  const globalPrefix = options.globalPrefix;\n\n  if (port !== requestedPort) {\n    logger.warn(`Port ${requestedPort} is busy, using port ${port} instead`);\n  }\n\n  // Global prefix (only if specified)\n  if (globalPrefix) {\n    app.setGlobalPrefix(globalPrefix);\n  }\n\n  // Global validation pipe\n  app.useGlobalPipes(\n    new ValidationPipe({\n      whitelist: true,\n      forbidNonWhitelisted: true,\n      transform: true,\n    })\n  );\n\n  // CORS\n  app.enableCors({\n    origin: true,\n    credentials: true,\n  });\n\n  // Swagger documentation\n  const config = new DocumentBuilder()\n    .setTitle(\"Graph Service API\")\n    .setDescription(\"API for graph service microservice\")\n    .setVersion(\"1.0\")\n    .addBearerAuth()\n    .build();\n\n  const document = SwaggerModule.createDocument(app, config);\n  SwaggerModule.setup(\"api/docs\", app, document);\n\n  // Start the server\n  await app.listen(port);\n\n  const baseUrl = globalPrefix\n    ? `http://localhost:${port}/${globalPrefix}`\n    : `http://localhost:${port}`;\n  logger.log(`🚀 Graph service is running on: ${baseUrl}`);\n  logger.log(`📚 API Documentation: http://localhost:${port}/api/docs`);\n\n  // Service Discovery Registration (only in development)\n  if (process.env.NODE_ENV !== \"production\") {\n    logger.debug(\n      `Attempting service discovery registration (NODE_ENV: ${process.env.NODE_ENV || \"undefined\"})`\n    );\n    await registerWithServiceDiscovery(AppModule, port, logger, app);\n  } else {\n    logger.debug(\n      `Skipping service discovery registration (NODE_ENV: ${process.env.NODE_ENV})`\n    );\n  }\n\n  return app;\n}\n","export * from \"../graph/abstract-graph.builder\";\nexport * from \"./base-entity\";\nexport * from \"./bootstrap\";\nexport * from \"./builder-registry.service\";\nexport * from \"./universal-graph.module\";\n","/**\n * Message attachment types\n */\n\nexport enum AttachmentType {\n  IMAGE = \"image\",\n  VOICE = \"voice\",\n  FILE = \"file\",\n  BUTTON = \"button\",\n  CITATION = \"citation\",\n  SUGGESTION = \"suggestion\",\n  WEBAPP = \"webapp\",\n  SOURCE = \"source\",\n  CARD = \"card\",\n  CHART = \"chart\",\n}\n\n/** Attachment interface */\nexport interface IAttachment {\n  type: AttachmentType;\n  value: any;\n  metadata?: Record<string, any>;\n}\n\n/** Citation attachment value */\nexport type CitationValue = {\n  source: {\n    url: string;\n    title: string;\n    type: \"webpage\" | \"pdf\" | \"article\";\n    articleId?: string;\n    knowledgeBaseId?: string;\n  };\n};\n","/**\n * Streaming types\n */\n\nexport enum StreamChannel {\n  TEXT = \"text\",\n  PROCESSING = \"processing\",\n  TOOLS = \"tools\",\n}\n","// packages/sdk/src/interfaces/graph-service.interface.ts\nimport { HumanMessage } from \"@langchain/core/messages\";\nimport { CallbackResult } from \"../callbacks/callback.interface\";\nimport {\n  IAttachment,\n  IUsageMetrics,\n  IReasoningChain,\n  IStoredMessageContent,\n} from \"../messages\";\nexport {\n  IStoredMessageContent,\n  IAttachment,\n  IUsageMetrics,\n  IReasoningChain,\n} from \"../messages\";\n// Minimal interfaces required for data exchange.\n// In the main system they can be extended with richer types.\n\n/**\n * Base contract for all graph services\n */\nexport interface IGraphService {\n  /**\n   * Check service availability\n   */\n  healthCheck(): Promise<boolean>;\n\n  /**\n   * Get list of supported graph types\n   */\n  getSupportedGraphTypes(): Promise<string[]>;\n\n  /**\n   * Generate answer (without streaming)\n   */\n  generateAnswer(payload: IGraphRequestPayload): Promise<IGraphResponsePayload>;\n\n  /**\n   * Stream answer generation\n   */\n  streamAnswer(\n    payload: IGraphRequestPayload,\n    onPartial: (chunk: string) => void\n  ): Promise<IGraphResponsePayload>;\n\n  /**\n   * Cancel generation\n   */\n  cancelGeneration(requestId: string): Promise<void>;\n\n  /**\n   * Execute callback\n   */\n  executeCallback(\n    token: string,\n    platform?: string,\n    platformContext?: any\n  ): Promise<CallbackResult>;\n}\n\n/**\n * Request to graph service\n */\nexport interface IGraphRequestPayload {\n  /**\n   * Unique request ID\n   */\n  requestId: string;\n\n  /**\n   * Thread ID\n   */\n  threadId: string;\n\n  /**\n   * User ID\n   */\n  userId: string;\n\n  /**\n   * Agent ID\n   */\n  agentId: string;\n\n  /**\n   * User message\n   */\n  message: HumanMessage;\n\n  /**\n   * Graph type\n   */\n  graphType: string;\n\n  /**\n   * Graph settings ID\n   */\n  graphSettings: any;\n\n  /**\n   * Additional context (message history, etc)\n   */\n  context?: Record<string, any>;\n\n  metadata?: Record<string, any>;\n}\n\n/**\n * Response from graph service\n */\nexport interface IGraphResponsePayload {\n  /**\n   * Request ID\n   */\n  requestId: string;\n\n  /**\n   * Response text\n   */\n  text: string;\n\n  /**\n   * Attachments\n   */\n  attachments?: IAttachment[];\n\n  /**\n   * Reasoning chains\n   */\n  reasoningChains?: IReasoningChain[];\n\n  /**\n   * Metadata\n   */\n  metadata: {\n    /**\n     * Usage metrics (tokens, etc.)\n     */\n    usageMetrics: IUsageMetrics;\n\n    /**\n     * Other metadata\n     */\n    [key: string]: any;\n  };\n}\n\n/**\n * Constants for injection tokens\n */\nexport const GraphServiceTokens = {\n  REGISTRY: \"GRAPH_SERVICE_REGISTRY\",\n  CLIENT: \"GRAPH_SERVICE_CLIENT\",\n  SETTINGS_REPOSITORY: \"GRAPH_SERVICE_SETTINGS_REPOSITORY\",\n};\n\n/**\n * Repository for graph settings\n */\nexport interface IGraphSettingsRepository {\n  /**\n   * Get graph settings by ID\n   */\n  getSettings(settingsId: string): Promise<any>;\n\n  /**\n   * Get graph settings by agent and graph type\n   */\n  getSettingsByAgentAndType(agentId: string, graphType: string): Promise<any>;\n\n  /**\n   * Save graph settings\n   */\n  saveSettings(\n    agentId: string,\n    graphType: string,\n    settings: any\n  ): Promise<string>;\n}\n","// packages/sdk/src/api/graph.controller.ts\nimport {\n  Controller,\n  Get,\n  Post,\n  Body,\n  Headers,\n  Res,\n  HttpStatus,\n  HttpException,\n  Inject,\n  Logger,\n  Query,\n  Param,\n} from \"@nestjs/common\";\nimport { Response } from \"express\";\nimport {\n  ApiTags,\n  ApiOperation,\n  ApiResponse,\n  ApiQuery,\n  ApiParam,\n} from \"@nestjs/swagger\";\nimport {\n  IGraphRequestPayload,\n  IGraphResponsePayload,\n  IGraphService,\n} from \"./graph-service.interface\";\nimport { BuilderRegistryService } from \"../core/builder-registry.service\";\n\n/**\n * Unified controller for Graph API\n * Includes core graph operations and registry\n */\n@ApiTags(\"Graphs\")\n@Controller()\nexport class GraphController {\n  protected readonly logger = new Logger(GraphController.name);\n\n  constructor(\n    @Inject(\"GRAPH_SERVICE\")\n    protected readonly graphService: IGraphService,\n    private readonly builderRegistry: BuilderRegistryService\n  ) {}\n\n  // ========== Core Graph Operations ==========\n\n  @Get(\"health\")\n  @ApiOperation({ summary: \"Check graph service health\" })\n  @ApiResponse({ status: 200, description: \"Service is available\" })\n  async healthCheck(): Promise<{ status: string; timestamp: string }> {\n    try {\n      const isHealthy = await this.graphService.healthCheck();\n      return {\n        status: isHealthy ? \"healthy\" : \"unhealthy\",\n        timestamp: new Date().toISOString(),\n      };\n    } catch (error) {\n      this.logger.error(`Health check failed: ${error.message}`);\n      throw new HttpException(\n        \"Service unhealthy\",\n        HttpStatus.SERVICE_UNAVAILABLE\n      );\n    }\n  }\n\n  @Get(\"graph-types\")\n  @ApiOperation({ summary: \"Get supported graph types\" })\n  @ApiResponse({ status: 200, description: \"List of graph types\" })\n  async getSupportedGraphTypes(): Promise<string[]> {\n    return this.graphService.getSupportedGraphTypes();\n  }\n\n  @Post(\"generate\")\n  @ApiOperation({ summary: \"Generate answer (non-streaming)\" })\n  @ApiResponse({ status: 200, description: \"Answer generated\" })\n  async generateAnswer(\n    @Body() payload: IGraphRequestPayload\n  ): Promise<IGraphResponsePayload> {\n    try {\n      return await this.graphService.generateAnswer(payload);\n    } catch (error) {\n      this.logger.error(`Generation failed: ${error.message}`);\n      throw new HttpException(\n        `Generation failed: ${error.message}`,\n        HttpStatus.INTERNAL_SERVER_ERROR\n      );\n    }\n  }\n\n  @Post(\"stream\")\n  @ApiOperation({ summary: \"Stream answer generation\" })\n  @ApiResponse({ status: 200, description: \"Streaming response\" })\n  async streamAnswer(\n    @Body() payload: IGraphRequestPayload,\n    @Res() res: Response\n  ): Promise<void> {\n    res.setHeader(\"Content-Type\", \"text/event-stream\");\n    res.setHeader(\"Transfer-Encoding\", \"chunked\");\n    res.setHeader(\"Cache-Control\", \"no-cache\");\n    res.setHeader(\"Connection\", \"keep-alive\");\n\n    try {\n      this.logger.debug(\n        `[CONTROLLER] Starting streamAnswer for requestId: ${payload.requestId}`\n      );\n\n      const result = await this.graphService.streamAnswer(\n        payload,\n        (chunk: string) => {\n          // this.logger.debug(`[CONTROLLER] Sending chunk: ${chunk}`);\n          res.write(`event: stream_event\\n`);\n          res.write(`data: ${chunk}\\n\\n`);\n        }\n      );\n\n      this.logger.debug(\n        `[CONTROLLER] Got final result: ${JSON.stringify(result)}...`\n      );\n\n      this.logger.debug(`[CONTROLLER] Final result details:`, {\n        hasText: !!result.text,\n        textLength: result.text?.length || 0,\n        attachmentsCount: result.attachments?.length || 0,\n        reasoningChainsCount: result.reasoningChains?.length || 0,\n        resultKeys: Object.keys(result || {}),\n      });\n\n      // Send final result as SSE event\n      res.write(`event: final\\n`);\n      res.write(`data: ${JSON.stringify(result)}\\n\\n`);\n      res.end();\n\n      this.logger.debug(`[CONTROLLER] Stream completed successfully`);\n    } catch (error) {\n      this.logger.error(`[CONTROLLER] Streaming failed: ${error.message}`);\n      this.logger.error(`[CONTROLLER] Error stack: ${error.stack}`);\n      // Send error as SSE event\n      res.write(`event: error\\n`);\n      res.write(`data: ${JSON.stringify({ message: error.message })}\\n\\n`);\n      res.end();\n    }\n  }\n\n  @Post(\"cancel/:requestId\")\n  @ApiOperation({ summary: \"Cancel generation\" })\n  @ApiParam({ name: \"requestId\", description: \"Request ID to cancel\" })\n  @ApiResponse({ status: 200, description: \"Generation cancelled\" })\n  async cancelGeneration(\n    @Param(\"requestId\") requestId: string\n  ): Promise<{ message: string }> {\n    try {\n      await this.graphService.cancelGeneration(requestId);\n      return { message: `Generation ${requestId} cancelled` };\n    } catch (error) {\n      this.logger.error(`Cancellation failed: ${error.message}`);\n      throw new HttpException(\n        `Cancellation failed: ${error.message}`,\n        HttpStatus.INTERNAL_SERVER_ERROR\n      );\n    }\n  }\n\n  // ========== Graph Registry ==========\n\n  @Get(\"registry\")\n  @ApiOperation({ summary: \"Get all registered graphs\" })\n  @ApiResponse({ status: 200, description: \"List of registered graphs\" })\n  async getRegisteredGraphs(): Promise<{\n    total: number;\n    graphs: Array<{ graphType: string; builderName: string }>;\n  }> {\n    const builders = this.builderRegistry.getBuilders();\n    return {\n      total: builders.length,\n      graphs: builders.map(builder => ({\n        graphType: builder.graphType,\n        builderName: builder.constructor.name,\n      })),\n    };\n  }\n\n  @Get(\"registry/stats\")\n  @ApiOperation({ summary: \"Graph registry statistics\" })\n  @ApiResponse({ status: 200, description: \"Statistics\" })\n  async getRegistryStats(): Promise<{\n    totalBuilders: number;\n    graphTypes: string[];\n    builderTypes: Record<string, number>;\n  }> {\n    const builders = this.builderRegistry.getBuilders();\n    const graphTypes = builders.map(b => b.graphType);\n    const builderTypes: Record<string, number> = {};\n\n    builders.forEach(builder => {\n      const name = builder.constructor.name;\n      builderTypes[name] = (builderTypes[name] || 0) + 1;\n    });\n\n    return {\n      totalBuilders: builders.length,\n      graphTypes,\n      builderTypes,\n    };\n  }\n}\n","/**\n * JSON Schema for graph manifest validation\n */\nexport const GraphManifestSchema = {\n  $schema: \"http://json-schema.org/draft-07/schema#\",\n  type: \"object\",\n  title: \"Graph Manifest Schema\",\n  description: \"Schema for validating graph manifest files\",\n  properties: {\n    graphType: {\n      type: \"string\",\n      description: \"Unique identifier for the graph type\",\n      pattern: \"^[a-z][a-zA-Z0-9]*$\",\n    },\n    title: {\n      type: \"string\",\n      description: \"Human-readable title for the graph\",\n      minLength: 1,\n      maxLength: 100,\n    },\n    description: {\n      type: \"string\",\n      description: \"Short description of the graph\",\n      minLength: 1,\n      maxLength: 500,\n    },\n    detailedDescription: {\n      type: \"string\",\n      description: \"Detailed description with markdown support\",\n      minLength: 1,\n    },\n    category: {\n      type: \"string\",\n      description: \"Category for grouping graphs\",\n      enum: [\"basic\", \"specialized\", \"advanced\", \"experimental\"],\n    },\n    tags: {\n      type: \"array\",\n      description: \"Tags for filtering and searching\",\n      items: {\n        type: \"string\",\n        pattern: \"^[a-z][a-zA-Z0-9-]*$\",\n      },\n      uniqueItems: true,\n    },\n    hue: {\n      type: \"number\",\n      description: \"Color hue for UI representation (0-360)\",\n      minimum: 0,\n      maximum: 360,\n    },\n    visibility: {\n      type: \"string\",\n      description: \"Visibility level for the graph\",\n      enum: [\"public\", \"private\"],\n      default: \"public\",\n    },\n    isEmbedded: {\n      type: \"boolean\",\n      description: \"Whether the graph runs in embedded mode\",\n      default: true,\n    },\n    isActive: {\n      type: \"boolean\",\n      description: \"Whether the graph is currently active\",\n      default: true,\n    },\n    schema: {\n      type: \"object\",\n      description: \"JSON Schema for graph configuration\",\n      properties: {\n        type: {\n          type: \"string\",\n          const: \"object\",\n        },\n        properties: {\n          type: \"object\",\n          additionalProperties: {\n            type: \"object\",\n            properties: {\n              type: { type: \"string\" },\n              title: { type: \"string\" },\n              description: { type: \"string\" },\n              default: {},\n              minimum: { type: \"number\" },\n              maximum: { type: \"number\" },\n              minLength: { type: \"number\" },\n              maxLength: { type: \"number\" },\n              format: { type: \"string\" },\n              enum: { type: \"array\" },\n            },\n            required: [\"type\", \"title\"],\n          },\n        },\n        required: {\n          type: \"array\",\n          items: { type: \"string\" },\n        },\n      },\n      required: [\"type\", \"properties\", \"required\"],\n      additionalProperties: false,\n    },\n    defaultSettings: {\n      type: \"object\",\n      description: \"Default settings for the graph\",\n    },\n  },\n  required: [\"graphType\", \"title\", \"description\", \"schema\"],\n  additionalProperties: false,\n};\n\n/**\n * Validation functions for graph manifests\n */\nexport class GraphManifestValidator {\n  /**\n   * Validate a graph manifest against the schema\n   */\n  static validate(manifest: any): { isValid: boolean; errors: string[] } {\n    const errors: string[] = [];\n\n    try {\n      // Check required fields\n      const required = GraphManifestSchema.required as string[];\n      for (const field of required) {\n        if (!manifest.hasOwnProperty(field)) {\n          errors.push(`Missing required field: ${field}`);\n        }\n      }\n\n      // Validate graphType format - allow dots, colons, and hyphens for versioned types\n      if (\n        manifest.graphType &&\n        !/^[a-z][a-zA-Z0-9._:-]*$/.test(manifest.graphType)\n      ) {\n        errors.push(`graphType must match pattern: ^[a-z][a-zA-Z0-9._:-]*$`);\n      }\n\n      // Validate category\n      if (\n        manifest.category &&\n        ![\"basic\", \"specialized\", \"advanced\", \"experimental\"].includes(\n          manifest.category\n        )\n      ) {\n        errors.push(\n          `category must be one of: basic, specialized, advanced, experimental`\n        );\n      }\n\n      // Validate visibility\n      if (\n        manifest.visibility &&\n        ![\"public\", \"private\"].includes(manifest.visibility)\n      ) {\n        errors.push(`visibility must be one of: public, private`);\n      }\n\n      // Validate hue range\n      if (\n        manifest.hue !== undefined &&\n        (manifest.hue < 0 || manifest.hue > 360)\n      ) {\n        errors.push(`hue must be between 0 and 360`);\n      }\n\n      // Validate schema structure\n      if (manifest.schema) {\n        if (manifest.schema.type !== \"object\") {\n          errors.push(`schema.type must be \"object\"`);\n        }\n        if (\n          !manifest.schema.properties ||\n          typeof manifest.schema.properties !== \"object\"\n        ) {\n          errors.push(`schema.properties must be an object`);\n        }\n        if (!Array.isArray(manifest.schema.required)) {\n          errors.push(`schema.required must be an array`);\n        }\n      }\n\n      // Validate tags\n      if (manifest.tags && Array.isArray(manifest.tags)) {\n        for (const tag of manifest.tags) {\n          if (typeof tag !== \"string\" || !/^[a-z][a-zA-Z0-9-]*$/.test(tag)) {\n            errors.push(\n              `Invalid tag format: ${tag}. Tags must match pattern: ^[a-z][a-zA-Z0-9-]*$`\n            );\n          }\n        }\n\n        // Check for duplicate tags\n        const uniqueTags = new Set(manifest.tags);\n        if (uniqueTags.size !== manifest.tags.length) {\n          errors.push(`Duplicate tags found`);\n        }\n      }\n\n      return {\n        isValid: errors.length === 0,\n        errors,\n      };\n    } catch (error: any) {\n      return {\n        isValid: false,\n        errors: [`Validation error: ${error.message}`],\n      };\n    }\n  }\n\n  /**\n   * Validate and throw if invalid\n   */\n  static validateOrThrow(manifest: any): void {\n    const result = this.validate(manifest);\n    if (!result.isValid) {\n      throw new Error(\n        `Graph manifest validation failed:\\n${result.errors.join(\"\\n\")}`\n      );\n    }\n  }\n}\n","// packages/sdk/src/versioning/index.ts\nexport * from \"./versioned-graph.service\";\nexport * from \"./versioning.types\";\n","import * as LangGraph from \"@langchain/langgraph\";\nimport { Logger } from \"@nestjs/common\";\n\nconst logger = new Logger(\"ApiCallTracer\");\n\nexport interface ApiCallTracerOptions {\n  /** Maximum length for string values before truncation (default: 5000) */\n  maxStringLength?: number;\n  /** Maximum depth for nested object traversal (default: 15) */\n  maxDepth?: number;\n}\n\nexport const DEFAULT_TRACER_OPTIONS: Required<ApiCallTracerOptions> = {\n  maxStringLength: 5000,\n  maxDepth: 15,\n};\n\ntype LangGraphDispatchFn = (\n  eventName: string,\n  payload?: Record<string, unknown>\n) => void;\n\nlet cachedDispatch: LangGraphDispatchFn | null | undefined;\nlet dispatchUnavailableLogged = false;\n\nexport interface TraceApiCallResult<TResult> {\n  /** Result returned from the wrapped API call */\n  result: TResult;\n  /** Unix timestamp in milliseconds when the call started */\n  startedAt: number;\n  /** Unix timestamp in milliseconds when the call completed */\n  completedAt: number;\n  /** Milliseconds spent inside the API call */\n  durationMs: number;\n}\n\nexport async function traceApiCall<TResult>(\n  execute: () => Promise<TResult>,\n  options?: ApiCallTracerOptions\n): Promise<TraceApiCallResult<TResult>> {\n  const startedAt = Date.now();\n\n  dispatchApiTraceEvent(\"custom_api_call_start\");\n\n  try {\n    const result = await execute();\n    const completedAt = Date.now();\n    const durationMs = completedAt - startedAt;\n\n    dispatchApiTraceEvent(\"custom_api_call_end\", {\n      result: sanitizeTraceData(result, 0, new WeakSet(), options),\n      startedAt,\n      completedAt,\n      durationMs,\n    });\n\n    return { result, startedAt, completedAt, durationMs };\n  } catch (error) {\n    const failedAt = Date.now();\n    const durationMs = failedAt - startedAt;\n\n    dispatchApiTraceEvent(\"custom_api_call_error\", {\n      error: sanitizeTraceError(error, options),\n      startedAt,\n      failedAt,\n      durationMs,\n    });\n\n    throw error;\n  }\n}\n\nfunction dispatchApiTraceEvent(\n  eventName: string,\n  payload?: Record<string, unknown>\n): void {\n  const dispatch = getLangGraphDispatch();\n\n  if (!dispatch) {\n    if (!dispatchUnavailableLogged) {\n      logger.debug(\"LangGraph dispatchCustomEvent is not available\");\n      dispatchUnavailableLogged = true;\n    }\n    return;\n  }\n\n  try {\n    dispatch(eventName, payload);\n  } catch (error) {\n    logger.warn(\"Failed to emit API trace event\", {\n      error: error instanceof Error ? error.message : String(error),\n      eventName,\n    });\n  }\n}\n\nfunction getLangGraphDispatch(): LangGraphDispatchFn | null {\n  if (cachedDispatch !== undefined) {\n    return cachedDispatch;\n  }\n\n  const { dispatchCustomEvent } = LangGraph as unknown as {\n    dispatchCustomEvent?: LangGraphDispatchFn;\n  };\n\n  cachedDispatch =\n    typeof dispatchCustomEvent === \"function\" ? dispatchCustomEvent : null;\n\n  return cachedDispatch;\n}\n\nexport function sanitizeTraceData(\n  value: unknown,\n  depth = 0,\n  seen = new WeakSet<object>(),\n  options?: ApiCallTracerOptions\n): unknown {\n  const opts = { ...DEFAULT_TRACER_OPTIONS, ...options };\n\n  if (value === undefined) {\n    return undefined;\n  }\n\n  if (value === null) {\n    return null;\n  }\n\n  if (typeof value === \"string\") {\n    // No truncation - we need full tool inputs/outputs for proper processing\n    return value;\n  }\n\n  if (typeof value === \"number\" || typeof value === \"boolean\") {\n    return value;\n  }\n\n  if (typeof value === \"bigint\") {\n    return value.toString();\n  }\n\n  if (value instanceof Date) {\n    return value.toISOString();\n  }\n\n  if (value instanceof Error) {\n    return sanitizeTraceError(value, options);\n  }\n\n  if (depth >= opts.maxDepth) {\n    return Array.isArray(value) ? \"[Array]\" : \"[Object]\";\n  }\n\n  if (typeof value === \"object\") {\n    if (seen.has(value as object)) {\n      // Skip circular references instead of returning \"[Circular]\" string\n      return undefined;\n    }\n\n    seen.add(value as object);\n\n    if (Array.isArray(value)) {\n      // Don't truncate arrays - we need all tool calls, all messages, etc.\n      return value\n        .map(item => sanitizeTraceData(item, depth + 1, seen, options))\n        .filter(item => item !== undefined); // Remove circular refs from array\n    }\n\n    if (value instanceof Set) {\n      return Array.from(value)\n        .map(item => sanitizeTraceData(item, depth + 1, seen, options))\n        .filter(item => item !== undefined);\n    }\n\n    if (value instanceof Map) {\n      const entries: Record<string, unknown> = {};\n      for (const [key, entryValue] of value.entries()) {\n        const sanitized = sanitizeTraceData(\n          entryValue,\n          depth + 1,\n          seen,\n          options\n        );\n        if (sanitized !== undefined) {\n          entries[String(key)] = sanitized;\n        }\n      }\n      return entries;\n    }\n\n    const result: Record<string, unknown> = {};\n    for (const [key, entryValue] of Object.entries(\n      value as Record<string, unknown>\n    )) {\n      const sanitized = sanitizeTraceData(entryValue, depth + 1, seen, options);\n      // Skip circular references instead of adding \"[Circular]\" string\n      if (sanitized !== undefined) {\n        result[key] = sanitized;\n      }\n    }\n    return result;\n  }\n\n  return String(value);\n}\n\nfunction sanitizeTraceError(\n  error: unknown,\n  options?: ApiCallTracerOptions\n): Record<string, unknown> {\n  const opts = { ...DEFAULT_TRACER_OPTIONS, ...options };\n\n  if (error instanceof Error) {\n    return {\n      name: error.name,\n      message: error.message,\n      stack: error.stack\n        ? sanitizeTraceData(error.stack, 0, new WeakSet(), options)\n        : undefined,\n    };\n  }\n\n  if (typeof error === \"string\") {\n    return {\n      message:\n        error.length > opts.maxStringLength\n          ? `${error.slice(0, opts.maxStringLength)}…`\n          : error,\n    };\n  }\n\n  return {\n    message: \"Unknown error\",\n    raw: sanitizeTraceData(error, 0, new WeakSet(), options),\n  };\n}\n","// packages/sdk/src/graph-engine.factory.ts\nimport { Inject, Injectable } from \"@nestjs/common\";\nimport { IGraphEngine } from \"../graph/abstract-graph.builder\";\nimport { LangGraphEngine } from \"./langgraph/langgraph-engine\";\n\n/**\n * Graph engine type\n */\nexport enum GraphEngineType {\n  LANGGRAPH = \"langgraph\",\n  LANGFLOW = \"langflow\",\n  FLOWISE = \"flowise\",\n}\n\n/**\n * Factory for creating graph engines\n */\n@Injectable()\nexport class GraphEngineFactory {\n  constructor(private readonly langgraph: LangGraphEngine) {}\n\n  /**\n   * Get engine for the specified type\n   */\n  getEngine(engineType: GraphEngineType): IGraphEngine {\n    switch (engineType) {\n      case GraphEngineType.LANGGRAPH:\n        return this.langgraph;\n      // Will add other types in the future\n      // case GraphEngineType.LANGFLOW:\n      //   return new LangFlowEngine();\n      // case GraphEngineType.FLOWISE:\n      //   return new FlowiseEngine();\n      default:\n        throw new Error(`Unsupported graph engine type: ${engineType}`);\n    }\n  }\n}\n","/**\n * Universal LangGraph stream processing and result extraction utilities\n */\n\nimport {\n  IReasoningStep,\n  IReasoningChain,\n  StreamChannel,\n  IStoredMessageContent,\n} from \"../../messages\";\nimport { IGraphTraceEvent } from \"../../graph/tracing\";\nimport { Injectable, Logger } from \"@nestjs/common\";\nimport { sanitizeTraceData } from \"../api-call-tracer.utils\";\n\n/**\n * LLM call record collected from on_chat_model_end events\n */\nexport interface LLMCallRecord {\n  modelId: string; // Internal MongoDB model ID\n  promptTokens: number;\n  completionTokens: number;\n  totalTokens: number;\n  timestamp: number;\n  nodeName?: string; // LangGraph node name\n}\n\n/**\n * Stream accumulator for collecting events during graph execution\n * Each stream creates its own accumulator to ensure thread-safety\n */\nexport interface StreamAccumulator {\n  streamedText: string; // Accumulated text from TEXT channel (for fallback)\n  reasoningChains: IReasoningChain[]; // All reasoning chains from PROCESSING channel\n  generation: IStoredMessageContent | null; // Final generation from on_chain_end\n  llmCalls: LLMCallRecord[]; // Collected LLM metrics from on_chat_model_end events\n  traceEvents: IGraphTraceEvent[];\n  traceStartedAt: number | null;\n  traceCompletedAt: number | null;\n  // Real-time reasoning step accumulator for streaming\n  currentReasoningSteps: IReasoningStep[]; // Current reasoning steps being accumulated\n  currentToolUse: IReasoningStep | null; // Current tool_use being built from input_json_delta events\n}\n\n/**\n * Stateless event processor for LangGraph streams\n * Thread-safe: state is passed via accumulator parameter, not stored in class\n */\n@Injectable()\nexport class EventProcessor {\n  private readonly logger = new Logger(EventProcessor.name);\n\n  /**\n   * Create new accumulator for a stream\n   */\n  createAccumulator(): StreamAccumulator {\n    return {\n      streamedText: \"\",\n      reasoningChains: [],\n      generation: null,\n      llmCalls: [],\n      traceEvents: [],\n      traceStartedAt: null,\n      traceCompletedAt: null,\n      currentReasoningSteps: [],\n      currentToolUse: null,\n    };\n  }\n\n  /**\n   * Normalize content to unified array of blocks\n   * Handles string, array, or single object formats\n   *\n   * Output format examples:\n   * - Text: [{ type: \"text\", text: \"Hello\" }]\n   * - Tool call: [{ type: \"tool_use\", id: \"toolu_123\", name: \"get_weather\", input: {...} }]\n   * - Tool input delta: [{ type: \"input_json_delta\", input: \"{\\\"city\\\": \\\"\" }]\n   * - Mixed: [{ type: \"tool_use\", ... }, { type: \"text\", text: \"...\" }]\n   */\n  private normalizeContentBlocks(content: any): any[] {\n    if (!content) {\n      return [];\n    }\n\n    // Already an array of blocks\n    if (Array.isArray(content)) {\n      return content;\n    }\n\n    // String content -> wrap in text block\n    if (typeof content === \"string\") {\n      return content.trim() ? [{ type: \"text\", text: content }] : [];\n    }\n\n    // Single object block\n    if (typeof content === \"object\") {\n      return [content];\n    }\n\n    return [];\n  }\n\n  /**\n   * Groups tool_use and input_json_delta into proper structure\n   * tool_use.input → output (tool execution result)\n   * input_json_delta.input → output (tool execution result, accumulated)\n   */\n  private mapReasoningSteps(rawSteps: any[]): IReasoningStep[] {\n    const steps: IReasoningStep[] = [];\n    let currentToolUse: IReasoningStep | null = null;\n\n    for (const raw of rawSteps) {\n      if (raw.type === \"tool_use\" || raw.type === \"tool_call\") {\n        // Save previous tool_use if exists\n        if (currentToolUse) {\n          steps.push(currentToolUse);\n        }\n\n        // Create new tool_use\n        // tool_use.input contains tool execution result (OUT)\n        currentToolUse = {\n          index: raw.index || 0,\n          type: \"tool_use\",\n          name: raw.name,\n          id: raw.id,\n          input: \"\", // Parameters (IN) - filled separately or empty\n          output: raw.input || \"\", // Result (OUT) - comes in tool_use.input\n        };\n      } else if (raw.type === \"input_json_delta\") {\n        // input_json_delta.input contains execution result (streaming) → output\n        if (currentToolUse) {\n          currentToolUse.output =\n            (currentToolUse.output || \"\") + (raw.input || \"\");\n        }\n      } else {\n        // Regular step (text, thinking, tool_result)\n        if (currentToolUse) {\n          steps.push(currentToolUse);\n          currentToolUse = null;\n        }\n\n        steps.push({\n          index: raw.index || 0,\n          type: raw.type,\n          text: raw.text || \"\",\n          metadata: raw.metadata,\n        });\n      }\n    }\n\n    // Don't forget the last tool_use\n    if (currentToolUse) {\n      steps.push(currentToolUse);\n    }\n\n    return steps;\n  }\n\n  /**\n   * Process a LangGraph stream event\n   * Mutates accumulator to collect data from different channels\n   * @param onPartial Optional callback for streaming chunks to UI (omit for invoke without streaming)\n   */\n  processEvent(\n    acc: StreamAccumulator,\n    event: any,\n    onPartial?: (chunk: string) => void\n  ): void {\n    this.captureTraceEvent(acc, event);\n\n    // 1. Streaming TEXT channel: normalize and send all content blocks to UI\n    if (\n      event.event === \"on_chat_model_stream\" &&\n      event.metadata?.stream_channel === StreamChannel.TEXT &&\n      event.data?.chunk?.content\n    ) {\n      const chunk = event.data.chunk.content;\n\n      // Normalize content to array of blocks for unified frontend handling\n      const blocks = this.normalizeContentBlocks(chunk);\n\n      // Send all blocks to UI (tool_use, input_json_delta, text)\n      if (blocks.length > 0 && onPartial) {\n        onPartial(JSON.stringify({ text: blocks }));\n      }\n\n      // Accumulate only text blocks for fallback\n      const textOnly = blocks\n        .filter((block: any) => block?.type === \"text\")\n        .map((block: any) => block.text || \"\")\n        .join(\"\");\n\n      if (textOnly) {\n        acc.streamedText += textOnly;\n      }\n\n      return;\n    }\n\n    // 2. Streaming PROCESSING channel: send delta events\n    if (\n      event.event === \"on_chat_model_stream\" &&\n      event.metadata?.stream_channel === StreamChannel.PROCESSING &&\n      event.data?.chunk?.content\n    ) {\n      const chunk = event.data.chunk.content;\n\n      // Normalize content to array of blocks\n      const blocks = this.normalizeContentBlocks(chunk);\n\n      // Process each block and send delta updates\n      for (const block of blocks) {\n        if (block.type === \"tool_use\" || block.type === \"tool_call\") {\n          // Save previous tool_use if exists\n          if (acc.currentToolUse) {\n            acc.currentReasoningSteps.push(acc.currentToolUse);\n          }\n\n          // Create new tool_use\n          acc.currentToolUse = {\n            index: acc.currentReasoningSteps.length,\n            type: \"tool_use\",\n            name: block.name,\n            id: block.id,\n            input: block.input || \"\",\n            output: \"\",\n          };\n\n          // Send step_started event\n          if (onPartial) {\n            onPartial(\n              JSON.stringify({\n                processing_delta: {\n                  type: \"step_started\",\n                  step: acc.currentToolUse,\n                },\n              })\n            );\n          }\n        } else if (block.type === \"input_json_delta\") {\n          // Accumulate output and send chunk\n          if (acc.currentToolUse && onPartial) {\n            const chunk = block.input || \"\";\n            acc.currentToolUse.output += chunk;\n\n            // Send output_chunk event\n            onPartial(\n              JSON.stringify({\n                processing_delta: {\n                  type: \"output_chunk\",\n                  stepId: acc.currentToolUse.id,\n                  chunk: chunk,\n                },\n              })\n            );\n          }\n        }\n      }\n\n      return;\n    }\n\n    // 3. Tool events: log tool execution lifecycle\n    if (event.event === \"on_tool_start\") {\n      this.logger.log(\"🔧 Tool execution started\", {\n        toolName: event.name,\n        input: event.data?.input,\n        runId: event.run_id,\n        metadata: event.metadata,\n      });\n      return;\n    }\n\n    if (event.event === \"on_tool_end\") {\n      this.logger.log(\"✅ Tool execution completed\", {\n        toolName: event.name,\n        output:\n          typeof event.data?.output === \"string\"\n            ? event.data.output.substring(0, 200) +\n              (event.data.output.length > 200 ? \"...\" : \"\")\n            : event.data?.output,\n        runId: event.run_id,\n      });\n      return;\n    }\n\n    if (event.event === \"on_tool_error\") {\n      this.logger.error(\"❌ Tool execution failed\", {\n        toolName: event.name,\n        error: event.data?.error,\n        runId: event.run_id,\n      });\n      return;\n    }\n\n    // 4. Finalize LLM call: collect metrics from all on_chat_model_end events\n    if (event.event === \"on_chat_model_end\") {\n      // Extract usage metrics from the event\n      const output = event.data?.output;\n      const usageMetadata = output?.usage_metadata || output?.usageMetadata;\n      const modelId = event.metadata?.modelId;\n\n      if (usageMetadata && modelId) {\n        const llmCall: LLMCallRecord = {\n          modelId,\n          promptTokens: usageMetadata.input_tokens || 0,\n          completionTokens: usageMetadata.output_tokens || 0,\n          totalTokens: usageMetadata.total_tokens || 0,\n          timestamp: Date.now(),\n          nodeName: event.metadata?.langgraph_node || event.name,\n        };\n\n        acc.llmCalls.push(llmCall);\n\n        this.logger.log(\"✅ LLM call recorded\", {\n          modelId,\n          tokens: llmCall.totalTokens,\n          nodeName: llmCall.nodeName,\n          totalRecorded: acc.llmCalls.length,\n        });\n      } else {\n        this.logger.warn(\n          \"⚠️ Missing usage metadata or modelId in on_chat_model_end\",\n          {\n            hasUsageMetadata: !!usageMetadata,\n            hasModelId: !!modelId,\n            eventName: event.name,\n            metadataKeys: event.metadata ? Object.keys(event.metadata) : [],\n            outputKeys: output ? Object.keys(output) : [],\n          }\n        );\n      }\n\n      // Finalize reasoning chain from PROCESSING channel\n      if (event.metadata?.stream_channel === StreamChannel.PROCESSING) {\n        // Finalize any pending tool_use\n        if (acc.currentToolUse) {\n          acc.currentReasoningSteps.push(acc.currentToolUse);\n          acc.currentToolUse = null;\n        }\n\n        // Save completed chain\n        if (acc.currentReasoningSteps.length > 0) {\n          acc.reasoningChains.push({\n            steps: acc.currentReasoningSteps,\n            isComplete: true,\n          });\n\n          // Send chain_completed event\n          if (onPartial) {\n            onPartial(\n              JSON.stringify({\n                processing_delta: {\n                  type: \"chain_completed\",\n                },\n              })\n            );\n          }\n\n          // Reset for next chain\n          acc.currentReasoningSteps = [];\n        } else {\n          // Fallback: parse from output if streaming didn't accumulate steps\n          const stepsRaw =\n            output?.content || // AIMessageChunk object (direct)\n            output?.kwargs?.content || // Serialized LangChain format\n            event.data?.chunk?.content || // Older version\n            [];\n\n          let steps: IReasoningStep[];\n\n          // Normalize to array of IReasoningStep\n          if (Array.isArray(stepsRaw)) {\n            // Map tool_use and input_json_delta to proper structure\n            steps = this.mapReasoningSteps(stepsRaw);\n          } else if (\n            typeof stepsRaw === \"string\" &&\n            stepsRaw.trim().length > 0\n          ) {\n            // Convert string to single text step\n            // This happens when LLM returns reasoning as plain text instead of structured steps\n            steps = [\n              {\n                index: 0,\n                type: \"text\",\n                text: stepsRaw.trim(),\n              },\n            ];\n          } else {\n            // Empty or invalid - skip\n            steps = [];\n          }\n\n          if (steps.length > 0) {\n            acc.reasoningChains.push({\n              steps,\n              isComplete: true,\n            });\n\n            // Send chain_completed event\n            if (onPartial) {\n              onPartial(\n                JSON.stringify({\n                  processing_delta: {\n                    type: \"chain_completed\",\n                  },\n                })\n              );\n            }\n          }\n        }\n      }\n      return;\n    }\n\n    // 4. Finalize TEXT: save generation object (final result)\n    if (\n      event.event === \"on_chain_end\" &&\n      event.metadata?.stream_channel === StreamChannel.TEXT\n    ) {\n      const output = event.data.output;\n\n      // Normalize different graph output formats to standard IStoredMessageContent:\n      // - React graph: { answer: { text } }\n      // - RAG graph: { generation: { text, attachments } }\n      // - Simple graph: { generation: AIMessage }\n      // - Direct: { text, attachments, metadata }\n      let generation: IStoredMessageContent | null = null;\n\n      if (output?.answer?.text) {\n        // React graph format\n        generation = {\n          text: output.answer.text,\n          attachments: output.answer.attachments || [],\n          metadata: output.answer.metadata || {},\n        };\n      } else if (output?.generation?.text) {\n        // RAG graph format\n        generation = {\n          text: output.generation.text,\n          attachments: output.generation.attachments || [],\n          metadata: output.generation.metadata || {},\n        };\n      } else if (output?.generation?.content) {\n        // Simple graph format (AIMessage object)\n        generation = {\n          text: output.generation.content,\n          attachments: [],\n          metadata: {},\n        };\n      } else if (output?.text) {\n        // Direct format\n        generation = {\n          text: output.text,\n          attachments: output.attachments || [],\n          metadata: output.metadata || {},\n        };\n      }\n\n      // DON'T send full text via onPartial here - it was already streamed via on_chat_model_stream\n      // This generation object is only used as fallback if streaming didn't work\n      // Sending it here causes duplicate full-text events on the frontend\n\n      acc.generation = generation;\n      return;\n    }\n  }\n\n  /**\n   * Build final result from accumulator\n   * Uses generation if available, otherwise falls back to streamed text\n   * Returns content and trace events (metrics should be extracted from trace on backend)\n   */\n  getResult(acc: StreamAccumulator): {\n    content: IStoredMessageContent;\n    trace: {\n      events: IGraphTraceEvent[];\n      startedAt: number;\n      completedAt: number;\n      durationMs: number;\n      totalEvents: number;\n      totalModelCalls: number;\n    } | null;\n  } {\n    const startedAt = acc.traceStartedAt ?? Date.now();\n    const completedAt = acc.traceCompletedAt ?? startedAt;\n    const trace =\n      acc.traceEvents.length > 0\n        ? {\n            events: acc.traceEvents,\n            startedAt,\n            completedAt,\n            durationMs: Math.max(0, completedAt - startedAt),\n            totalEvents: acc.traceEvents.length,\n            totalModelCalls: acc.llmCalls.length,\n          }\n        : null;\n\n    if (trace) {\n      this.logger.log(\"📊 [EventProcessor] Final trace assembled\", {\n        totalEvents: trace.totalEvents,\n        eventsArrayLength: trace.events.length,\n        firstEventType: trace.events[0]?.type,\n        lastEventType: trace.events[trace.events.length - 1]?.type,\n        firstEventSample: trace.events[0]\n          ? JSON.stringify(trace.events[0]).substring(0, 150)\n          : null,\n        allEventsNull: trace.events.every(e => e === null),\n        someEventsNull: trace.events.some(e => e === null),\n      });\n    }\n\n    return {\n      content: {\n        text: acc.generation?.text || acc.streamedText || \"\",\n        attachments: acc.generation?.attachments || [],\n        metadata: acc.generation?.metadata || {},\n        reasoningChains:\n          acc.reasoningChains.length > 0 ? acc.reasoningChains : undefined,\n      },\n      trace,\n    };\n  }\n\n  private captureTraceEvent(acc: StreamAccumulator, event: any): void {\n    // Normalize the event before storing\n    const normalized = this.normalizeTraceEvent(event);\n\n    if (!normalized) {\n      return; // Skip events that can't be normalized (stream chunks, etc.)\n    }\n\n    acc.traceEvents.push(normalized);\n    this.logger.debug(\n      `[TRACE] Captured trace event ${normalized.type} for node ${normalized.nodeName} (${acc.traceEvents.length} total)`\n    );\n  }\n\n  private normalizeTraceEvent(event: any): IGraphTraceEvent | null {\n    const type = event?.event ?? event?.type;\n    if (!type) {\n      return null;\n    }\n\n    const normalizedType = String(type);\n\n    // Debug: Log raw event structure for chain events\n    if (normalizedType.includes(\"chain\") && !event?.name) {\n      this.logger.debug(`[TRACE] Chain event WITHOUT name field:`, {\n        type: normalizedType,\n        eventKeys: Object.keys(event || {}).join(\", \"),\n        hasMetadata: !!event?.metadata,\n        metadataKeys: event?.metadata\n          ? Object.keys(event.metadata).join(\", \")\n          : \"none\",\n      });\n    }\n\n    // Skip streaming chunk events\n    if (normalizedType.toLowerCase() === \"stream_chunk\") {\n      return null;\n    }\n\n    const chunkType = event?.data?.chunk?.type || event?.data?.chunk?.event;\n    if (\n      typeof chunkType === \"string\" &&\n      chunkType.toLowerCase() === \"stream_chunk\"\n    ) {\n      return null;\n    }\n\n    // Skip on_chat_model_stream events - they generate too many trace entries\n    // We only need on_chat_model_end for token tracking\n    if (normalizedType === \"on_chat_model_stream\") {\n      return null;\n    }\n\n    const name = event?.name ? String(event.name) : undefined;\n\n    // Skip internal LangGraph infrastructure events first\n    if (\n      name &&\n      (name.includes(\"ChannelWrite\") ||\n        name.includes(\"ChannelRead\") ||\n        name.includes(\"ChannelInvoke\") ||\n        name.includes(\"Branch<\"))\n    ) {\n      this.logger.debug(\n        `[TRACE] Skipping infrastructure event: ${name} (type: ${normalizedType})`\n      );\n      return null;\n    }\n\n    // Log events that pass the filter to see what's being stored\n    if (normalizedType.includes(\"chain\") && name) {\n      this.logger.debug(\n        `[TRACE] Accepting event: name=\"${name}\", type=\"${normalizedType}\", hasNode=${!!event?.metadata?.langgraph_node}`\n      );\n    }\n\n    // Skip wrapper LangGraph events (they have no langgraph_node in metadata)\n    // These are top-level graph events that duplicate info from inner nodes\n    const hasLangGraphNode = event?.metadata?.langgraph_node;\n    if (!hasLangGraphNode && type.startsWith(\"on_chain\")) {\n      return null; // Skip top-level graph wrapper events\n    }\n\n    // Use unified sanitization from api-call-tracer\n    // NOTE: We sanitize metadata and data, but NOT the events array itself\n    // to avoid truncating the array to MAX_COLLECTION_LENGTH (20 items)\n    const metadata = sanitizeTraceData(event?.metadata) as\n      | Record<string, unknown>\n      | undefined;\n    const data = sanitizeTraceData(event?.data) as\n      | Record<string, unknown>\n      | undefined;\n\n    const timestampSource =\n      event?.timestamp ??\n      event?.time ??\n      event?.data?.timestamp ??\n      event?.data?.ts ??\n      Date.now();\n\n    const timestamp = Number(timestampSource) || Date.now();\n\n    const streamChannel =\n      typeof event?.metadata?.stream_channel === \"string\"\n        ? event.metadata.stream_channel\n        : typeof (metadata as any)?.stream_channel === \"string\"\n          ? ((metadata as any).stream_channel as string)\n          : undefined;\n\n    const nodeNameFromMetadata = (metadata as any)?.langgraph_node;\n    const fallbackNodeName = (metadata as any)?.node_name;\n\n    return {\n      type: normalizedType,\n      name,\n      channel: streamChannel,\n      nodeName:\n        (typeof nodeNameFromMetadata === \"string\"\n          ? nodeNameFromMetadata\n          : typeof fallbackNodeName === \"string\"\n            ? fallbackNodeName\n            : name) || undefined,\n      timestamp,\n      metadata,\n      data,\n    };\n  }\n}\n","import { Inject, Injectable, Logger, Optional } from \"@nestjs/common\";\nimport { IGraphEngine } from \"../../core\";\nimport { EventProcessor } from \"./event-processor.utils\";\nimport { ConfigService } from \"@nestjs/config\";\n/**\n * Graph engine implemented using LangGraph.js\n */\n\nprocess.setMaxListeners(0);\n@Injectable()\nexport class LangGraphEngine implements IGraphEngine {\n  private readonly logger = new Logger(LangGraphEngine.name);\n\n  constructor(\n    private readonly eventProcessor: EventProcessor,\n    @Optional() private readonly configService?: ConfigService\n  ) {\n    if (!eventProcessor) {\n      this.logger.error(\"EventProcessor is undefined/null!\");\n    }\n  }\n\n  /**\n   * Method to invoke LangGraph\n   */\n  async invokeGraph(\n    graph: any,\n    config: any,\n    signal?: AbortSignal\n  ): Promise<any> {\n    // Add abort signal to configuration\n    if (signal) {\n      config.signal = signal;\n    }\n\n    // Invoke the graph\n    const result = await graph.invoke(config.input || {}, config);\n\n    // Transform the result\n    return this.processGraphResult(result);\n  }\n\n  async streamGraph(\n    graph: any,\n    config: any,\n    onPartial: (chunk: string) => void,\n    signal?: AbortSignal\n  ): Promise<any> {\n    try {\n      if (signal) {\n        config.signal = signal;\n      }\n      //TODO: migrate to v.1\n      const eventStream = await graph.streamEvents(config.input || {}, {\n        ...config,\n        version: \"v2\", // Important for correct operation\n      });\n\n      // Create accumulator to collect data from events\n      const acc = this.eventProcessor.createAccumulator();\n\n      // Process the event stream\n      for await (const event of eventStream) {\n        try {\n          this.eventProcessor.processEvent(acc, event, onPartial);\n        } catch (error) {\n          this.logger.warn(\n            `[STREAM-EVENT-ERROR] Error processing event: ${error.message}`\n          );\n        }\n      }\n\n      // Get final result from accumulator\n      const { content, trace } = this.eventProcessor.getResult(acc);\n\n      this.logger.debug(\"[STREAM-RESULT] Got result from EventProcessor\", {\n        hasContent: !!content,\n        hasContext: !!config.configurable?.context,\n        hasTrace: !!trace,\n        traceEvents: trace?.events?.length || 0,\n        totalModelCalls: trace?.totalModelCalls || 0,\n      });\n\n      // NOTE: Metrics are NO LONGER sent separately via webhook\n      // Backend will extract metrics from trace events in UsageTrackerService\n\n      if (trace && trace.events.length > 0 && config.configurable?.context) {\n        const context = config.configurable.context;\n\n        this.logger.debug(\"[TRACE-WEBHOOK] Sending trace events batch\", {\n          messageId: context.messageId,\n          totalEvents: trace.totalEvents,\n          eventsArrayLength: trace.events.length,\n          firstEventType: trace.events[0]?.type,\n        });\n\n        // Send trace events batch to TimeSeries collection\n        await this.sendTraceEventsBatch({\n          messageId: context.messageId || \"unknown\",\n          threadId: context.threadId || \"unknown\",\n          userId: context.userId || \"unknown\",\n          agentId: context.agentId || \"unknown\",\n          companyId: context.companyId || \"unknown\",\n          events: trace.events,\n          totalEvents: trace.totalEvents,\n          totalModelCalls: trace.totalModelCalls,\n          startedAt: trace.startedAt,\n          completedAt: trace.completedAt,\n          durationMs: trace.durationMs,\n        });\n      } else {\n        this.logger.debug(\"[TRACE-WEBHOOK] Skipping webhook\", {\n          hasTrace: !!trace,\n          traceEvents: trace?.events?.length || 0,\n          hasContext: !!config.configurable?.context,\n          contextKeys: config.configurable?.context\n            ? Object.keys(config.configurable.context)\n            : [],\n        });\n      }\n\n      return content;\n    } catch (error) {\n      this.logger.error(\n        `[STREAM-ERROR] Error in streamGraph: ${error.message}`\n      );\n      this.logger.error(`[STREAM-ERROR] Stack trace: ${error.stack}`);\n      throw error;\n    }\n  }\n\n  /**\n   * Send usage metrics to backend webhook\n   */\n  private async sendMetricsWebhook(payload: {\n    messageId: string;\n    threadId: string;\n    userId: string;\n    agentId: string;\n    companyId: string;\n    metrics: any;\n  }): Promise<void> {\n    try {\n      const backendUrl =\n        this.configService?.get<string>(\"API_URL\") || \"http://amelie-service\";\n      const internalToken =\n        this.configService?.get<string>(\"INTERNAL_API_TOKEN\");\n\n      if (!internalToken) {\n        this.logger.warn(\n          \"[METRICS-WEBHOOK] INTERNAL_API_TOKEN not configured, skipping webhook\"\n        );\n        return;\n      }\n\n      const webhookUrl = `${backendUrl}/internal/usage/metrics`;\n\n      this.logger.debug(\"[METRICS-WEBHOOK] Sending metrics to backend\", {\n        url: webhookUrl,\n        messageId: payload.messageId,\n        modelCallsCount: payload.metrics.modelCalls.length,\n      });\n\n      const response = await fetch(webhookUrl, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"x-internal-token\": internalToken,\n        },\n        body: JSON.stringify(payload),\n      });\n\n      if (!response.ok) {\n        throw new Error(\n          `Webhook failed with status ${response.status}: ${response.statusText}`\n        );\n      }\n\n      this.logger.log(\"✅ Metrics webhook sent successfully\", {\n        messageId: payload.messageId,\n        modelCallsCount: payload.metrics.modelCalls.length,\n      });\n    } catch (error) {\n      this.logger.error(\"[METRICS-WEBHOOK] Failed to send metrics webhook\", {\n        error: error.message,\n        messageId: payload.messageId,\n      });\n      // Don't throw - metrics webhook failure shouldn't break graph execution\n    }\n  }\n\n  private async sendTraceEventsBatch(payload: {\n    messageId: string;\n    threadId: string;\n    userId: string;\n    agentId: string;\n    companyId: string;\n    events: any[];\n    totalEvents: number;\n    totalModelCalls: number;\n    startedAt: number;\n    completedAt: number;\n    durationMs: number;\n  }): Promise<void> {\n    try {\n      const backendUrl =\n        this.configService?.get<string>(\"API_URL\") || \"http://amelie-service\";\n      const internalToken =\n        this.configService?.get<string>(\"INTERNAL_API_TOKEN\");\n\n      if (!internalToken) {\n        this.logger.warn(\n          \"[TRACE-EVENTS-BATCH] INTERNAL_API_TOKEN not configured, skipping batch webhook\"\n        );\n        return;\n      }\n\n      const webhookUrl = `${backendUrl}/internal/usage/trace-events/batch`;\n\n      // Transform events to batch format\n      const batchPayload = {\n        messageId: payload.messageId,\n        threadId: payload.threadId,\n        userId: payload.userId,\n        agentId: payload.agentId,\n        companyId: payload.companyId,\n        totalEvents: payload.totalEvents,\n        totalModelCalls: payload.totalModelCalls,\n        startedAt: payload.startedAt,\n        completedAt: payload.completedAt,\n        durationMs: payload.durationMs,\n        events: payload.events.map(event => ({\n          timestamp: event.timestamp\n            ? new Date(event.timestamp).toISOString()\n            : new Date().toISOString(),\n          meta: {\n            messageId: payload.messageId,\n            threadId: payload.threadId,\n            userId: payload.userId,\n            agentId: payload.agentId,\n            companyId: payload.companyId,\n            type: event.type,\n            nodeName: event.nodeName,\n            channel: event.channel,\n          },\n          event: event,\n        })),\n      };\n\n      this.logger.debug(\"[TRACE-EVENTS-BATCH] Sending batch to backend\", {\n        url: webhookUrl,\n        messageId: payload.messageId,\n        eventsCount: batchPayload.events.length,\n      });\n\n      const response = await fetch(webhookUrl, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          \"x-internal-token\": internalToken,\n        },\n        body: JSON.stringify(batchPayload),\n      });\n\n      if (!response.ok) {\n        const responseText = await response.text();\n        throw new Error(\n          `Batch webhook failed with status ${response.status}: ${responseText}`\n        );\n      }\n\n      const responseData = await response.json();\n\n      this.logger.log(\"✅ Trace events batch sent successfully\", {\n        messageId: payload.messageId,\n        sent: batchPayload.events.length,\n        stored: responseData.stored,\n      });\n    } catch (error) {\n      this.logger.error(\"[TRACE-EVENTS-BATCH] Failed to send batch webhook\", {\n        error: error instanceof Error ? error.message : String(error),\n        messageId: payload.messageId,\n        eventsCount: payload.events.length,\n      });\n      // Don't throw - batch webhook failure shouldn't break graph execution\n    }\n  }\n\n  /**\n   * Process graph execution result\n   */\n  private processGraphResult(result: any): any {\n    return {\n      text: result.text,\n      attachments: result.attachments,\n      metadata: {\n        ...result.metadata,\n        usageMetrics: result?.usageRecorder,\n      },\n    };\n  }\n}\n","// packages/sdk/src/universal-graph.module.ts\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport { ModuleRef, DiscoveryModule, MetadataScanner } from \"@nestjs/core\";\nimport { ConfigModule } from \"@nestjs/config\";\nimport {\n  AbstractGraphBuilder,\n  IGraphRequestPayload,\n  GraphController,\n  UniversalGraphService,\n  VersionedGraphService,\n  VersioningConfig,\n} from \"../graph\";\nimport {\n  EventProcessor,\n  GraphEngineFactory,\n  GraphEngineType,\n  LangGraphEngine,\n} from \"../engines\";\nimport { BuilderRegistryService } from \"./builder-registry.service\";\nimport { Registry } from \"prom-client\";\nimport {\n  CallbackStore,\n  CallbackRegistry,\n  CallbackController,\n  CallbackTokenGuard,\n  SmartCallbackRouter,\n  UniversalCallbackService,\n  registerFinanceExampleCallback,\n  CallbackACL,\n  CallbackAuditor,\n  CallbackMetrics,\n  CallbackRateLimiter,\n  IdempotencyManager,\n  CallbackPatchService,\n  TelegramPatchHandler,\n  WebPatchHandler,\n} from \"../callbacks\";\nimport {\n  EndpointRegistry,\n  UIEndpointsDiscoveryService,\n  UIDispatchController,\n} from \"../agent-ui\";\n\n/**\n * Options for UniversalGraphModule configuration\n */\nexport interface UniversalGraphModuleOptions {\n  /** Graph engine type */\n  engineType?: GraphEngineType;\n  /** Versioning configurations for graphs */\n  versioning?: VersioningConfig[];\n}\n\n/**\n * Create simple meta-builder for versioning\n */\nfunction createMetaBuilder(\n  config: VersioningConfig,\n  versionedGraphService: VersionedGraphService,\n  moduleRef: ModuleRef,\n  callbackRegistry: CallbackRegistry,\n  endpointRegistry: EndpointRegistry\n) {\n  // Create dynamic class with meaningful name\n  const className = `${config.baseGraphType.replace(/\\./g, \"\")}VersionRouter`;\n\n  class VersionRouter extends AbstractGraphBuilder<any> {\n    readonly version = \"router\" as any; // Version router\n\n    // Inject CallbackRegistry and EndpointRegistry manually since we can't use decorators in dynamic classes\n    constructor() {\n      super();\n      // Manually assign the registry instances\n      (this as any).callbackRegistry = callbackRegistry;\n      (this as any).endpointRegistry = endpointRegistry;\n    }\n\n    // Override graphType to display base type\n    get graphType(): string {\n      return config.baseGraphType;\n    }\n\n    async buildGraph(payload: IGraphRequestPayload): Promise<any> {\n      const graphType = payload.graphSettings?.graphType;\n      if (!graphType) {\n        throw new Error(\"GraphType is required in payload.graphSettings\");\n      }\n\n      const resolution = await versionedGraphService.resolveVersion(graphType, {\n        strict: false,\n      });\n\n      // Try to get existing instance, fallback to creating new one\n      try {\n        const versionedBuilder = moduleRef.get(resolution.builderClass, {\n          strict: false,\n        });\n        return versionedBuilder.buildGraph(payload);\n      } catch (error) {\n        // Fallback: create instance manually\n        const versionedBuilder = await moduleRef.create(\n          resolution.builderClass\n        );\n        return versionedBuilder.buildGraph(payload);\n      }\n    }\n\n    async prepareConfig(payload: IGraphRequestPayload): Promise<any> {\n      const graphType = payload.graphSettings?.graphType;\n      if (!graphType) {\n        throw new Error(\"GraphType is required in payload.graphSettings\");\n      }\n\n      const resolution = await versionedGraphService.resolveVersion(graphType, {\n        strict: false,\n      });\n\n      // Try to get existing instance, fallback to creating new one\n      let versionedBuilder;\n      try {\n        versionedBuilder = moduleRef.get(resolution.builderClass, {\n          strict: false,\n        });\n      } catch (error) {\n        versionedBuilder = await moduleRef.create(resolution.builderClass);\n      }\n\n      const updatedPayload = {\n        ...payload,\n        graphSettings: {\n          ...payload.graphSettings,\n          graphType: resolution.fullGraphType,\n        },\n      };\n\n      return versionedBuilder.prepareConfig(updatedPayload);\n    }\n  }\n\n  // Set meaningful name for the class\n  Object.defineProperty(VersionRouter, \"name\", { value: className });\n\n  return VersionRouter;\n}\n\n@Module({})\nexport class UniversalGraphModule {\n  static forRoot(options: UniversalGraphModuleOptions): DynamicModule {\n    const providers: Provider[] = [\n      // Discovery services from @nestjs/core\n      MetadataScanner,\n      // Event processor for stream handling\n      {\n        provide: EventProcessor,\n        useFactory: () => new EventProcessor(),\n      },\n      // Graph engines\n      {\n        provide: LangGraphEngine,\n        useFactory: (eventProcessor: EventProcessor) =>\n          new LangGraphEngine(eventProcessor, undefined),\n        inject: [EventProcessor],\n      },\n      BuilderRegistryService,\n      GraphEngineFactory,\n      VersionedGraphService,\n      UniversalGraphService,\n      // Callback infrastructure - Redis client (ioredis or ioredis-mock via main.ts interceptor)\n      {\n        provide: \"REDIS_CLIENT\",\n        useFactory: () => {\n          const Redis = require(\"ioredis\");\n          return new Redis(process.env.REDIS_URL || \"redis://redis:6379\");\n        },\n      },\n      {\n        provide: \"PROMETHEUS_REGISTRY\",\n        useValue: new Registry(),\n      },\n      {\n        provide: CallbackStore,\n        useFactory: (redis: any) => new CallbackStore(redis),\n        inject: [\"REDIS_CLIENT\"],\n      },\n      {\n        provide: CallbackRegistry,\n        useClass: CallbackRegistry,\n      },\n      EndpointRegistry,\n      UIEndpointsDiscoveryService,\n      {\n        provide: CallbackACL,\n        useClass: CallbackACL,\n      },\n      {\n        provide: CallbackAuditor,\n        useClass: CallbackAuditor,\n      },\n      {\n        provide: CallbackMetrics,\n        useFactory: (registry: Registry) => new CallbackMetrics(registry),\n        inject: [\"PROMETHEUS_REGISTRY\"],\n      },\n      {\n        provide: CallbackRateLimiter,\n        useFactory: (redis: any) => new CallbackRateLimiter(redis),\n        inject: [\"REDIS_CLIENT\"],\n      },\n      {\n        provide: IdempotencyManager,\n        useFactory: (redis: any) => new IdempotencyManager(redis),\n        inject: [\"REDIS_CLIENT\"],\n      },\n      {\n        provide: TelegramPatchHandler,\n        useClass: TelegramPatchHandler,\n      },\n      {\n        provide: WebPatchHandler,\n        useClass: WebPatchHandler,\n      },\n      {\n        provide: CallbackPatchService,\n        useFactory: (telegram: TelegramPatchHandler, web: WebPatchHandler) =>\n          new CallbackPatchService(telegram, web),\n        inject: [TelegramPatchHandler, WebPatchHandler],\n      },\n      {\n        provide: SmartCallbackRouter,\n        useFactory: (\n          registry: CallbackRegistry,\n          store: CallbackStore,\n          acl: CallbackACL,\n          auditor: CallbackAuditor,\n          metrics: CallbackMetrics,\n          rateLimiter: CallbackRateLimiter,\n          idempotencyManager: IdempotencyManager,\n          patchService: CallbackPatchService\n        ) =>\n          new SmartCallbackRouter(\n            registry,\n            store,\n            acl,\n            auditor,\n            metrics,\n            rateLimiter,\n            idempotencyManager,\n            patchService\n          ),\n        inject: [\n          CallbackRegistry,\n          CallbackStore,\n          CallbackACL,\n          CallbackAuditor,\n          CallbackMetrics,\n          CallbackRateLimiter,\n          IdempotencyManager,\n          CallbackPatchService,\n        ],\n      },\n      {\n        provide: UniversalCallbackService,\n        useFactory: (store: CallbackStore, router: SmartCallbackRouter) =>\n          new UniversalCallbackService(store, router),\n        inject: [CallbackStore, SmartCallbackRouter],\n      },\n      {\n        provide: CallbackTokenGuard,\n        useFactory: (store: CallbackStore, acl: CallbackACL) =>\n          new CallbackTokenGuard(store, acl),\n        inject: [CallbackStore, CallbackACL],\n      },\n      {\n        provide: \"CALLBACK_EXAMPLE_REGISTRATION\",\n        useFactory: (registry: CallbackRegistry) => {\n          registerFinanceExampleCallback(registry);\n        },\n        inject: [CallbackRegistry],\n      },\n      {\n        provide: \"GRAPH_ENGINE\",\n        useFactory: (langGraphEngine: LangGraphEngine) => langGraphEngine,\n        inject: [LangGraphEngine],\n      },\n      {\n        provide: \"GRAPH_BUILDERS\",\n        useFactory: (registry: BuilderRegistryService) => {\n          return registry.getBuilders(); // Get builders from registry\n        },\n        inject: [BuilderRegistryService],\n      },\n      {\n        provide: \"GRAPH_SERVICE\",\n        useExisting: UniversalGraphService,\n      },\n      {\n        provide: \"VERSIONING_CONFIGS\",\n        useValue: options.versioning || [],\n      },\n      // Automatic versioning initialization (synchronous)\n      {\n        provide: \"VERSIONING_INITIALIZER\",\n        useFactory: (\n          builderRegistry: BuilderRegistryService,\n          versionedGraphService: VersionedGraphService,\n          configs: VersioningConfig[],\n          callbackRegistry: CallbackRegistry,\n          moduleRef: ModuleRef,\n          endpointRegistry: EndpointRegistry\n        ) => {\n          console.log(\n            \"🔧 VERSIONING_INITIALIZER running with configs:\",\n            configs?.length || 0\n          );\n          console.log(\"🔧 ModuleRef available:\", !!moduleRef);\n          console.log(\"🔧 BuilderRegistry available:\", !!builderRegistry);\n\n          // Deferred initialization - register configurations\n          configs.forEach(config =>\n            versionedGraphService.registerVersioning(config)\n          );\n\n          // Create and register version routers synchronously\n          configs.forEach(config => {\n            if (moduleRef) {\n              const VersionRouterClass = createMetaBuilder(\n                config,\n                versionedGraphService,\n                moduleRef,\n                callbackRegistry,\n                endpointRegistry\n              );\n              const versionRouter = new VersionRouterClass();\n              console.log(\n                \"🔧 Registering VersionRouter for\",\n                config.baseGraphType\n              );\n              builderRegistry.registerBuilder(versionRouter);\n            } else {\n              // Fallback: create simple meta-builder without ModuleRef dependency\n              class SimpleVersionRouter extends AbstractGraphBuilder<any> {\n                readonly version = \"router\" as any;\n\n                constructor() {\n                  super();\n                  // Manually assign the registry instances\n                  (this as any).callbackRegistry = callbackRegistry;\n                  (this as any).endpointRegistry = endpointRegistry;\n                }\n\n                get graphType(): string {\n                  return config.baseGraphType;\n                }\n\n                async buildGraph(payload: any): Promise<any> {\n                  throw new Error(\n                    \"ModuleRef not available - cannot build graph\"\n                  );\n                }\n\n                async prepareConfig(payload: any): Promise<any> {\n                  throw new Error(\n                    \"ModuleRef not available - cannot prepare config\"\n                  );\n                }\n              }\n\n              const simpleRouter = new SimpleVersionRouter();\n              console.log(\n                \"🔧 Registering SimpleRouter for\",\n                config.baseGraphType,\n                \"(no ModuleRef)\"\n              );\n              builderRegistry.registerBuilder(simpleRouter);\n            }\n          });\n\n          return true;\n        },\n        inject: [\n          BuilderRegistryService,\n          VersionedGraphService,\n          \"VERSIONING_CONFIGS\",\n          CallbackRegistry,\n          ModuleRef,\n          EndpointRegistry,\n        ],\n      },\n    ];\n\n    return {\n      global: true,\n      module: UniversalGraphModule,\n      imports: [ConfigModule.forRoot({ isGlobal: true }), DiscoveryModule],\n      controllers: [GraphController, CallbackController, UIDispatchController],\n      providers,\n      exports: [\n        \"GRAPH_SERVICE\",\n        \"GRAPH_ENGINE\",\n        UniversalGraphService,\n        BuilderRegistryService,\n        VersionedGraphService,\n        UniversalCallbackService,\n        CallbackStore,\n        CallbackRegistry,\n        EndpointRegistry,\n        UIEndpointsDiscoveryService,\n      ],\n    };\n  }\n}\n","// packages/sdk/src/index.ts\n\nexport * from \"./core\";\nexport * from \"./callbacks\";\nexport * from \"./graph\";\nexport * from \"./engines\";\nexport * from \"./agent-ui\";\nexport * from \"./tools\";\nexport * from \"./messages\";\nexport * from \"./models\";\nexport * from \"./retriever\";\nexport * from \"./utils\";\nexport * from \"./service-discovery\";\n\n// ===== LEGACY (for backward compatibility) =====\n// Export aliases for core components\nexport { GraphController as BaseGraphServiceController } from \"./graph/graph.controller\";\nexport { UniversalGraphModule as BaseGraphServiceModule } from \"./core/universal-graph.module\";\n","import { DynamicStructuredTool, StructuredTool } from \"@langchain/core/tools\";\nimport { z } from \"zod\";\nimport axios from \"axios\";\nimport { Logger } from \"@nestjs/common\";\nimport { McpTool } from \"./mcp.interfaces\";\n\ninterface ToolExecutionRequest {\n  name: string;\n  arguments: Record<string, any>;\n}\n\ninterface ToolExecutionResult {\n  success: boolean;\n  result?: any;\n  error?: string;\n}\n\n/**\n * Converts MCP tools to LangChain DynamicStructuredTools with proper schema support\n */\ntype LangChainStructuredTool = StructuredTool<any, any, any, string>;\n\nexport class McpConverter {\n  private readonly logger = new Logger(McpConverter.name);\n  private readonly mcpRuntimeUrl: string;\n\n  constructor(mcpRuntimeUrl: string = \"http://localhost:3004\") {\n    this.mcpRuntimeUrl = mcpRuntimeUrl;\n    this.logger.log(\n      `🔧 McpConverter initialized with SDK version 0.1.8 (manual jsonSchemaToZod)`\n    );\n  }\n\n  /**\n   * Convert JSON Schema to Zod schema manually\n   * This creates a standard Zod schema that zodToJsonSchema can convert back properly\n   */\n  private jsonSchemaToZod(jsonSchema: any): z.ZodTypeAny {\n    if (!jsonSchema || typeof jsonSchema !== \"object\") {\n      return z.any();\n    }\n\n    try {\n      // Handle object type with properties\n      if (jsonSchema.type === \"object\" && jsonSchema.properties) {\n        const shape: Record<string, z.ZodTypeAny> = {};\n\n        for (const [key, propSchema] of Object.entries(jsonSchema.properties)) {\n          const prop = propSchema as any;\n          let zodProp: z.ZodTypeAny;\n\n          // Convert property based on type\n          switch (prop.type) {\n            case \"string\":\n              zodProp = z.string();\n              break;\n            case \"number\":\n              zodProp = z.number();\n              break;\n            case \"boolean\":\n              zodProp = z.boolean();\n              break;\n            case \"integer\":\n              zodProp = z.number().int();\n              break;\n            case \"array\":\n              zodProp = z.array(z.any());\n              break;\n            case \"object\":\n              zodProp = z.record(z.any());\n              break;\n            default:\n              zodProp = z.any();\n          }\n\n          // Add description if present\n          if (prop.description) {\n            zodProp = zodProp.describe(prop.description);\n          }\n\n          // Make optional if not in required array\n          if (!jsonSchema.required?.includes(key)) {\n            zodProp = zodProp.optional();\n          }\n\n          shape[key] = zodProp;\n        }\n\n        return z.object(shape);\n      }\n\n      // Fallback to z.any() for other types\n      this.logger.warn(\n        `Unsupported JSON Schema structure, falling back to z.any()`\n      );\n      return z.any();\n    } catch (error) {\n      this.logger.warn(\n        `Failed to convert JSON Schema, falling back to z.any(): ${error}`\n      );\n      return z.any();\n    }\n  }\n\n  /**\n   * Convert a single MCP tool to LangChain DynamicStructuredTool\n   */\n  convertTool(mcpTool: McpTool): LangChainStructuredTool {\n    const logger = this.logger;\n    const mcpRuntimeUrl = this.mcpRuntimeUrl;\n\n    // Enhance tool description with parameter descriptions\n    // This is a workaround because zodToJsonSchema doesn't preserve .describe() properly\n    let enhancedDescription = mcpTool.description;\n\n    if (mcpTool.inputSchema?.properties) {\n      const paramDescriptions: string[] = [];\n      for (const [key, propSchema] of Object.entries(\n        mcpTool.inputSchema.properties\n      )) {\n        const prop = propSchema as any;\n        if (prop.description) {\n          const isRequired = mcpTool.inputSchema.required?.includes(key);\n          paramDescriptions.push(\n            `- ${key}${isRequired ? \" (required)\" : \"\"}: ${prop.description}`\n          );\n        }\n      }\n\n      if (paramDescriptions.length > 0) {\n        enhancedDescription = `${mcpTool.description}\\n\\nParameters:\\n${paramDescriptions.join(\"\\n\")}`;\n      }\n    }\n\n    const schema = this.jsonSchemaToZod(mcpTool.inputSchema);\n\n    logger.debug(\n      `🔧 [${mcpTool.name}] Original schema:`,\n      JSON.stringify(mcpTool.inputSchema, null, 2)\n    );\n    logger.debug(\n      `🔧 [${mcpTool.name}] Using schema type: ${(schema as any)?._def?.typeName ?? \"unknown\"}`\n    );\n\n    // Log converted Zod schema details to verify descriptions are preserved\n    if (\n      (schema as any)?._def?.shape &&\n      typeof (schema as any)._def.shape === \"function\"\n    ) {\n      try {\n        const shape = (schema as any)._def.shape();\n        logger.debug(\n          `🔧 [${mcpTool.name}] Converted Zod schema shape:`,\n          JSON.stringify(\n            Object.entries(shape).reduce(\n              (acc, [key, val]: [string, any]) => {\n                acc[key] = {\n                  type: val?._def?.typeName,\n                  description: val?._def?.description,\n                  optional: val?._def?.typeName === \"ZodOptional\",\n                };\n                return acc;\n              },\n              {} as Record<string, any>\n            ),\n            null,\n            2\n          )\n        );\n      } catch (error) {\n        logger.debug(\n          `🔧 [${mcpTool.name}] Could not extract Zod schema shape: ${error}`\n        );\n      }\n    }\n\n    // CRITICAL CHECK: Convert Zod back to JSON Schema to see what LangChain will send to LLM\n    try {\n      const { zodToJsonSchema } = require(\"zod-to-json-schema\");\n      const convertedJsonSchema = zodToJsonSchema(schema);\n      logger.warn(\n        `🔧 [${mcpTool.name}] JSON Schema that LangChain will use:`,\n        JSON.stringify(convertedJsonSchema, null, 2)\n      );\n    } catch (error) {\n      logger.warn(\n        `🔧 [${mcpTool.name}] Could not convert Zod to JSON Schema: ${error}`\n      );\n    }\n\n    return new DynamicStructuredTool<\n      z.ZodTypeAny,\n      Record<string, any>,\n      any,\n      string\n    >({\n      name: mcpTool.name,\n      description: enhancedDescription,\n      schema,\n      func: async (input: Record<string, any>): Promise<string> => {\n        logger.log(`🔧 [${mcpTool.name}] LLM INPUT: ${JSON.stringify(input)}`);\n\n        try {\n          const request: ToolExecutionRequest = {\n            name: mcpTool.name,\n            arguments: input ?? {},\n          };\n\n          logger.log(`🔧 [${mcpTool.name}] Calling MCP Runtime...`);\n\n          const response = await axios.post(\n            `${mcpRuntimeUrl}/tools/execute`,\n            request,\n            { timeout: 30000 }\n          );\n\n          const result: ToolExecutionResult = response.data;\n          logger.log(\n            `🔧 [${mcpTool.name}] MCP Runtime response: success=${result.success}`\n          );\n\n          if (!result.success) {\n            const errorMessage = result.error || \"Tool execution failed\";\n            logger.error(\n              `🔧 [${mcpTool.name}] MCP Runtime error: ${errorMessage}`\n            );\n            throw new Error(errorMessage);\n          }\n\n          const output =\n            typeof result.result === \"string\"\n              ? result.result\n              : JSON.stringify(result.result, null, 2);\n\n          logger.log(\n            `🔧 [${mcpTool.name}] TOOL OUTPUT: ${output.length > 200 ? output.substring(0, 200) + \"...\" : output}`\n          );\n\n          return output;\n        } catch (error) {\n          logger.error(\n            `🔧 [${mcpTool.name}] Exception during execution`,\n            error\n          );\n          if (axios.isAxiosError(error)) {\n            throw new Error(`MCP Runtime error: ${error.message}`);\n          }\n          throw error instanceof Error ? error : new Error(String(error));\n        }\n      },\n    }) as unknown as LangChainStructuredTool;\n  }\n\n  /**\n   * Convert multiple MCP tools to LangChain tools\n   */\n  async convertTools(mcpTools: McpTool[]): Promise<LangChainStructuredTool[]> {\n    return mcpTools.map(tool => this.convertTool(tool));\n  }\n\n  /**\n   * Fetch and convert tools from MCP Runtime\n   */\n  async fetchAndConvertTools(\n    filter?: string\n  ): Promise<LangChainStructuredTool[]> {\n    try {\n      const params = filter ? { filter } : {};\n      const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n        params,\n        timeout: 5000,\n      });\n\n      const mcpTools: McpTool[] = response.data;\n      this.logger.log(`Fetched ${mcpTools.length} tools from MCP Runtime`);\n\n      return this.convertTools(mcpTools);\n    } catch (error) {\n      this.logger.error(\"Failed to fetch MCP tools:\", error);\n      throw new Error(`Cannot connect to MCP Runtime at ${this.mcpRuntimeUrl}`);\n    }\n  }\n\n  /**\n   * Health check for MCP Runtime\n   */\n  async healthCheck(): Promise<boolean> {\n    try {\n      const response = await axios.get(\n        `${this.mcpRuntimeUrl}/tools/health/check`,\n        { timeout: 5000 }\n      );\n      return response.data.status === \"ok\";\n    } catch {\n      return false;\n    }\n  }\n}\n","import { StructuredTool } from \"@langchain/core/tools\";\nimport { Logger } from \"@nestjs/common\";\nimport axios from \"axios\";\nimport { McpConverter } from \"./mcp-converter\";\nimport { McpTool, McpRuntimeClient } from \"./mcp.interfaces\";\n\n/**\n * Utility for fetching and filtering MCP tools from runtime\n * Provides efficient tool filtering and conversion to LangChain tools\n */\nexport class McpToolFilter {\n  private readonly logger = new Logger(McpToolFilter.name);\n  private readonly mcpConverter: McpConverter;\n\n  constructor(\n    private readonly mcpRuntimeUrl: string = process.env.MCP_RUNTIME_URL ||\n      \"http://localhost:3004\"\n  ) {\n    this.mcpConverter = new McpConverter(this.mcpRuntimeUrl);\n  }\n\n  /**\n   * Fetch available tools from MCP runtime with optional filtering\n   * @param enabledTools Array of tool names to filter for\n   * @returns Array of LangChain Tool instances\n   */\n  async getFilteredTools(\n    enabledTools: string[] = []\n  ): Promise<StructuredTool[]> {\n    this.logger.debug(\n      `[DEBUG] Getting filtered tools. Enabled: ${enabledTools.join(\", \")}`\n    );\n    this.logger.debug(`[DEBUG] MCP Runtime URL: ${this.mcpRuntimeUrl}`);\n\n    if (enabledTools.length === 0) {\n      this.logger.debug(\"No tools enabled, returning empty array\");\n      return [];\n    }\n\n    try {\n      // Fetch filtered tools from MCP runtime using the filter parameter\n      const filterParam = enabledTools.join(\",\");\n      this.logger.debug(\n        `[DEBUG] Making HTTP request to: ${this.mcpRuntimeUrl}/tools/list with filter: ${filterParam}`\n      );\n\n      const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n        params: { filter: filterParam },\n        timeout: 5000,\n      });\n\n      this.logger.debug(\n        `[DEBUG] HTTP response status: ${response.status}, data length: ${Array.isArray(response.data) ? response.data.length : \"not array\"}`\n      );\n\n      const filteredTools: McpTool[] = Array.isArray(response.data)\n        ? response.data\n        : [];\n      this.logger.debug(\n        `Retrieved ${filteredTools.length} filtered MCP tools for: ${enabledTools.join(\", \")}`\n      );\n\n      // Create a simple MCP client for tool execution\n      const mcpClient: McpRuntimeClient = {\n        getTools: async () => filteredTools,\n        executeTool: async (name: string, args: any) => {\n          this.logger.debug(`[DEBUG] Executing tool ${name} with args:`, args);\n          const response = await axios.post(\n            `${this.mcpRuntimeUrl}/tools/execute`,\n            {\n              name,\n              arguments: args || {},\n            }\n          );\n          return response.data;\n        },\n        isHealthy: async () => true,\n      };\n\n      // Convert to LangChain tools\n      this.logger.log(\n        `🚀 [McpToolFilter] Converting ${filteredTools.length} tools using new McpConverter`\n      );\n      const tools = await this.mcpConverter.convertTools(filteredTools);\n      this.logger.log(\n        `🚀 [McpToolFilter] Converted tools: ${tools.map(t => t.name).join(\", \")}`\n      );\n\n      this.logger.log(\n        `Configured ${tools.length} tools from MCP runtime: ${filteredTools.map(t => t.name).join(\", \")}`\n      );\n      return tools;\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : String(error);\n      this.logger.warn(\n        `[DEBUG] Failed to fetch tools from MCP runtime (${this.mcpRuntimeUrl}): ${errorMessage}`\n      );\n      this.logger.warn(`[DEBUG] Error details:`, {\n        error,\n        stack: error instanceof Error ? error.stack : \"no stack\",\n      });\n      return [];\n    }\n  }\n\n  /**\n   * Get all available tools without filtering\n   * @returns Array of LangChain Tool instances\n   */\n  async getAllTools(): Promise<StructuredTool[]> {\n    try {\n      const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n        timeout: 5000,\n      });\n\n      const allTools: McpTool[] = Array.isArray(response.data)\n        ? response.data\n        : [];\n      this.logger.debug(`Retrieved ${allTools.length} total MCP tools`);\n\n      const mcpClient: McpRuntimeClient = {\n        getTools: async () => allTools,\n        executeTool: async (name: string, args: any) => {\n          const response = await axios.post(\n            `${this.mcpRuntimeUrl}/tools/execute`,\n            {\n              name,\n              arguments: args || {},\n            }\n          );\n          return response.data;\n        },\n        isHealthy: async () => true,\n      };\n\n      const tools = await this.mcpConverter.convertTools(allTools);\n      this.logger.log(`Configured ${tools.length} tools from MCP runtime`);\n      return tools;\n    } catch (error) {\n      const errorMessage =\n        error instanceof Error ? error.message : String(error);\n      this.logger.warn(\n        `Failed to fetch all tools from MCP runtime (${this.mcpRuntimeUrl}): ${errorMessage}`\n      );\n      return [];\n    }\n  }\n\n  /**\n   * Check if MCP runtime is healthy\n   * @returns boolean indicating health status\n   */\n  async isHealthy(): Promise<boolean> {\n    try {\n      const response = await axios.get(\n        `${this.mcpRuntimeUrl}/tools/health/check`,\n        {\n          timeout: 3000,\n        }\n      );\n      return response.data.status === \"ok\";\n    } catch (error) {\n      this.logger.warn(\n        `MCP runtime health check failed: ${error instanceof Error ? error.message : String(error)}`\n      );\n      return false;\n    }\n  }\n\n  /**\n   * Get available tool names from MCP runtime\n   * @returns Array of tool names\n   */\n  async getAvailableToolNames(): Promise<string[]> {\n    try {\n      const response = await axios.get(`${this.mcpRuntimeUrl}/tools/list`, {\n        timeout: 5000,\n      });\n\n      const tools: McpTool[] = Array.isArray(response.data)\n        ? response.data\n        : [];\n      return tools.map(tool => tool.name);\n    } catch (error) {\n      this.logger.warn(\n        `Failed to fetch tool names: ${error instanceof Error ? error.message : String(error)}`\n      );\n      return [];\n    }\n  }\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport axios, { AxiosInstance } from \"axios\";\nimport {\n  McpTool,\n  ToolExecutionResult,\n  McpRuntimeClient,\n} from \"./mcp.interfaces\";\nimport {\n  CallbackManager,\n  parseCallbackConfigArg,\n} from \"@langchain/core/callbacks/manager\";\nimport { RunnableConfig } from \"@langchain/core/runnables\";\n\n/**\n * HTTP client implementation for MCP Runtime\n * Provides communication with MCP Runtime service via REST API\n */\n@Injectable()\nexport class McpRuntimeHttpClient implements McpRuntimeClient {\n  private readonly logger = new Logger(McpRuntimeHttpClient.name);\n  private readonly httpClient: AxiosInstance;\n  private readonly baseUrl: string;\n\n  constructor(mcpRuntimeUrl?: string) {\n    this.baseUrl =\n      mcpRuntimeUrl || process.env.MCP_RUNTIME_URL || \"http://localhost:3004\";\n    this.httpClient = axios.create({\n      baseURL: this.baseUrl,\n      timeout: 30000, // 30 seconds\n    });\n\n    this.logger.log(\n      `MCP Runtime HTTP Client initialized with URL: ${this.baseUrl}`\n    );\n  }\n\n  /**\n   * Get all available tools from MCP Runtime\n   */\n  async getTools(): Promise<McpTool[]> {\n    try {\n      this.logger.debug(\"Fetching available tools from MCP runtime\");\n      const response = await this.httpClient.get(\"/tools/list\");\n      // MCP Runtime returns array of tools directly, not in wrapper object\n      const tools = Array.isArray(response.data) ? response.data : [];\n      this.logger.log(`Retrieved ${tools.length} tools from MCP runtime`);\n      return tools;\n    } catch (error) {\n      this.logger.error(\"Failed to fetch tools from MCP runtime:\", error);\n      throw new Error(`Failed to fetch tools: ${error.message}`);\n    }\n  }\n\n  /**\n   * Execute a tool by name with given arguments\n   */\n  async executeTool(\n    name: string,\n    args: any,\n    context?: any\n  ): Promise<ToolExecutionResult> {\n    try {\n      this.logger.debug(`Executing tool: ${name} with args:`, args);\n\n      const payload: any = {\n        name,\n        arguments: args || {},\n      };\n\n      // Add context if provided\n      if (context) {\n        payload.context = context;\n      }\n\n      const response = await this.httpClient.post(\"/tools/execute\", payload);\n\n      this.logger.log(`Tool ${name} executed successfully`);\n      return response.data;\n    } catch (error) {\n      this.logger.error(`Failed to execute tool ${name}:`, error);\n\n      // Handle axios errors\n      if (error.response) {\n        return {\n          success: false,\n          error:\n            error.response.data.message ||\n            error.response.data.error ||\n            \"Tool execution failed\",\n        };\n      }\n\n      return {\n        success: false,\n        error: error.message || \"Unknown error occurred\",\n      };\n    }\n  }\n\n  /**\n   * Get tool execution statistics from MCP Runtime\n   */\n  async getToolStats() {\n    try {\n      const response = await this.httpClient.get(\"/tools/stats\");\n      return response.data;\n    } catch (error) {\n      this.logger.error(\"Failed to fetch tool stats:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Health check for MCP Runtime service\n   */\n  async isHealthy(): Promise<boolean> {\n    try {\n      const response = await this.httpClient.get(\"/\", { timeout: 5000 });\n      return response.status === 200;\n    } catch (error) {\n      this.logger.warn(\"MCP Runtime health check failed:\", error.message);\n      return false;\n    }\n  }\n\n  /**\n   * Execute tool with LangChain event emission\n   * @param toolCallId - Tool call ID from LLM\n   * @param toolName - Tool name\n   * @param enrichedArgs - Merged arguments (toolConfig + LLM args)\n   * @param executionContext - Execution context (userId, agentId, etc.)\n   * @param config - RunnableConfig with callbacks\n   * @returns Tool execution result with content\n   */\n  async executeToolWithEvents(\n    toolCallId: string,\n    toolName: string,\n    enrichedArgs: Record<string, any>,\n    executionContext: Record<string, any>,\n    config?: RunnableConfig\n  ): Promise<{ content: string; success: boolean }> {\n    // Parse callback configuration\n    const parsedConfig = parseCallbackConfigArg(config);\n    const callbackManager = CallbackManager.configure(parsedConfig.callbacks);\n\n    let runManager;\n\n    try {\n      // Emit on_tool_start event\n      runManager = await callbackManager?.handleToolStart(\n        {\n          name: toolName,\n          lc: 1,\n          type: \"not_implemented\",\n          id: [\"langchain\", \"tools\", \"mcp\", toolName],\n        },\n        JSON.stringify(enrichedArgs),\n        parsedConfig.runId,\n        undefined,\n        parsedConfig.tags,\n        parsedConfig.metadata,\n        toolName\n      );\n\n      // Execute tool\n      const result = await this.executeTool(\n        toolName,\n        enrichedArgs,\n        executionContext\n      );\n\n      // Create content\n      const content = result.success\n        ? JSON.stringify(result)\n        : result.error || JSON.stringify(result);\n\n      // Emit on_tool_end event\n      await runManager?.handleToolEnd(content);\n\n      return {\n        content,\n        success: result.success,\n      };\n    } catch (error) {\n      this.logger.error(`Error executing tool ${toolName}:`, error);\n\n      // Emit on_tool_error event\n      await runManager?.handleToolError(error);\n\n      // Return error result\n      const errorContent = JSON.stringify({\n        success: false,\n        error: error instanceof Error ? error.message : \"Tool execution failed\",\n      });\n\n      return {\n        content: errorContent,\n        success: false,\n      };\n    }\n  }\n}\n","/**\n * Model-related enums\n */\n\nexport enum ModelProvider {\n  FLUTCH = \"flutch\",\n  FLUTCH_MISTRAL = \"flutch-mistral\",\n  FLUTCH_OPENAI = \"flutch-openai\",\n  FLUTCH_ANTHROPIC = \"flutch-anthropic\",\n  MISTRAL = \"mistral\",\n  OPENAI = \"openai\",\n  ANTHROPIC = \"anthropic\",\n  AWS = \"aws\",\n  COHERE = \"cohere\",\n  VOYAGEAI = \"voyageai\",\n}\n\nexport enum ModelType {\n  CHAT = \"chat\", // LLM for text generation\n  RERANK = \"rerank\", // Cross-encoder for document reranking\n  EMBEDDING = \"embedding\", // Models for vectorization\n  IMAGE = \"image\", // Models for image generation\n  SPEECH = \"speech\", // Models for TTS/STT\n}\n\nexport enum ChatFeature {\n  STREAMING = \"streaming\",\n  TOOLS = \"tools\",\n  VISION = \"vision\",\n  FUNCTION_CALLING = \"function_calling\",\n  JSON_MODE = \"json_mode\",\n}\n","import { BaseDocumentCompressor } from \"@langchain/core/retrievers/document_compressors\";\nimport { Document } from \"@langchain/core/documents\";\n\nexport interface VoyageAIRerankConfig {\n  apiKey?: string;\n  model?: string;\n  topN?: number;\n  truncation?: boolean;\n}\n\n/**\n * VoyageAI Reranker implementation\n * Note: This is a placeholder implementation until official LangChain.js support is available\n * VoyageAI currently only has Python SDK support for reranking\n */\nexport class VoyageAIRerank extends BaseDocumentCompressor {\n  private apiKey: string;\n  private model: string;\n  private topN: number;\n  private truncation: boolean;\n  private baseUrl = \"https://api.voyageai.com/v1/rerank\";\n\n  constructor(config: VoyageAIRerankConfig) {\n    super();\n    this.apiKey = config.apiKey || process.env.VOYAGEAI_API_KEY || \"\";\n    this.model = config.model || \"rerank-2\";\n    this.topN = config.topN || 20;\n    this.truncation = config.truncation ?? true;\n\n    if (!this.apiKey) {\n      throw new Error(\n        \"VoyageAI API key is required. Set VOYAGEAI_API_KEY environment variable or pass apiKey in config.\"\n      );\n    }\n  }\n\n  async compressDocuments(\n    documents: Document[],\n    query: string,\n    callbacks?: any\n  ): Promise<Document[]> {\n    if (documents.length === 0) {\n      return [];\n    }\n\n    const texts = documents.map(doc => doc.pageContent);\n\n    try {\n      const response = await fetch(this.baseUrl, {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${this.apiKey}`,\n        },\n        body: JSON.stringify({\n          model: this.model,\n          query: query,\n          documents: texts,\n          top_k: Math.min(this.topN, documents.length),\n          truncation: this.truncation,\n        }),\n      });\n\n      if (!response.ok) {\n        const error = await response.text();\n        throw new Error(`VoyageAI API error: ${response.status} - ${error}`);\n      }\n\n      const data = await response.json();\n\n      // VoyageAI returns results with relevance scores\n      // Sort by relevance and return top N documents\n      const rerankedIndices = data.results\n        .sort((a: any, b: any) => b.relevance_score - a.relevance_score)\n        .slice(0, this.topN)\n        .map((result: any) => result.index);\n\n      return rerankedIndices.map((index: number) => documents[index]);\n    } catch (error) {\n      console.error(\"Error calling VoyageAI rerank API:\", error);\n      // Fallback: return original documents if reranking fails\n      return documents.slice(0, this.topN);\n    }\n  }\n}\n","import { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseDocumentCompressor } from \"@langchain/core/retrievers/document_compressors\";\nimport { Embeddings } from \"@langchain/core/embeddings\";\nimport { ChatOpenAI } from \"@langchain/openai\";\nimport { AzureChatOpenAI } from \"@langchain/azure-openai\";\nimport { Logger } from \"@nestjs/common\";\nimport { StructuredTool } from \"@langchain/core/tools\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { BaseLanguageModelInput } from \"@langchain/core/language_models/base\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport { BaseChatModelCallOptions } from \"@langchain/core/language_models/chat_models\";\n\n// WORKAROUND: Temporary monkey patch for GPT-5 support in LangChain\n// LangChain doesn't yet recognize GPT-5 as a reasoning model and has issues:\n// 1. Uses max_tokens instead of max_completion_tokens\n// 2. Doesn't set mandatory temperature = 1 for GPT-5 models\n// TODO: Remove this patch after official GPT-5 support in LangChain\nfunction patchChatOpenAIForGPT5() {\n  const logger = new Logger(\"ModelInitializer.Patch\");\n\n  logger.warn(\n    `TEMPORARY WORKAROUND: Applying monkey patch for GPT-5 support in LangChain. Fixes: max_tokens->max_completion_tokens, temperature->1. This patch will be removed once LangChain officially supports GPT-5 models.`\n  );\n\n  // Patch both ChatOpenAI and AzureChatOpenAI\n  const prototypes = [\n    ChatOpenAI.prototype as any,\n    AzureChatOpenAI.prototype as any,\n  ];\n\n  prototypes.forEach((prototype, index) => {\n    const modelName = index === 0 ? \"ChatOpenAI\" : \"AzureChatOpenAI\";\n    logger.warn(`Patching ${modelName} for GPT-5 support`);\n\n    // Patch the invocationParams method that prepares parameters for the API\n    const originalInvocationParams = prototype.invocationParams;\n\n    if (originalInvocationParams) {\n      prototype.invocationParams = function (options: any) {\n        const params = originalInvocationParams.call(this, options);\n\n        // Note: GPT-5 patch applied - params will be converted\n\n        // If this is a GPT-5 model, apply all necessary patches\n        if (\n          params.model &&\n          (params.model.includes(\"gpt-5\") ||\n            /^gpt-(5|6|7|8|9)/.test(params.model))\n        ) {\n          // 1. Convert max_tokens to max_completion_tokens\n          if (params.max_tokens !== undefined) {\n            params.max_completion_tokens = params.max_tokens;\n            delete params.max_tokens;\n          }\n\n          // Also check max_output_tokens (may be used in Responses API)\n          if (\n            params.max_output_tokens !== undefined &&\n            !params.max_completion_tokens\n          ) {\n            params.max_completion_tokens = params.max_output_tokens;\n            delete params.max_output_tokens;\n          }\n\n          // 2. Force set temperature = 1 for GPT-5 models\n          // GPT-5 models only support temperature = 1 (default value)\n          const originalTemperature = params.temperature;\n          if (params.temperature !== undefined && params.temperature !== 1) {\n            params.temperature = 1;\n            logger.debug(\n              `Fixed temperature for ${params.model}: ${originalTemperature} -> 1 (GPT-5 models only support temperature=1)`\n            );\n          }\n\n          // Parameters converted for GPT-5 compatibility\n        }\n\n        // Add stream_options to get usage information from Azure OpenAI\n        if (\n          params.model &&\n          (params.model.includes(\"gpt-5\") ||\n            /^gpt-(5|6|7|8|9)/.test(params.model))\n        ) {\n          // Enable usage tracking for streaming responses\n          if (!params.stream_options) {\n            params.stream_options = { include_usage: true };\n            logger.warn(\n              `[GPT-5 PATCH] Added stream_options.include_usage=true for ${params.model}`\n            );\n          } else if (params.stream_options.include_usage !== true) {\n            params.stream_options.include_usage = true;\n            logger.warn(\n              `[GPT-5 PATCH] Updated stream_options.include_usage=true for ${params.model}`\n            );\n          }\n        }\n\n        return params;\n      };\n\n      logger.warn(\n        `Successfully patched ${modelName}.invocationParams for GPT-5 support (TEMPORARY WORKAROUND)`\n      );\n    } else {\n      logger.warn(\n        `Could not find invocationParams method to patch in ${modelName}`\n      );\n    }\n\n    // Additionally patch completionWithRetry for low-level interception\n    const originalCompletionWithRetry = prototype.completionWithRetry;\n\n    if (originalCompletionWithRetry) {\n      prototype.completionWithRetry = async function (\n        request: any,\n        options?: any\n      ) {\n        // Check and fix parameters right before sending\n        if (\n          request?.model &&\n          (request.model.includes(\"gpt-5\") ||\n            /^gpt-(5|6|7|8|9)/.test(request.model))\n        ) {\n          let hasChanges = false;\n\n          // 1. Fix max_tokens\n          if (request.max_tokens !== undefined) {\n            request.max_completion_tokens = request.max_tokens;\n            delete request.max_tokens;\n            hasChanges = true;\n          }\n\n          // 2. Fix temperature\n          if (request.temperature !== undefined && request.temperature !== 1) {\n            const originalTemp = request.temperature;\n            request.temperature = 1;\n            logger.debug(\n              `Fixed temperature in completionWithRetry for ${request.model}: ${originalTemp} -> 1`\n            );\n            hasChanges = true;\n          }\n\n          // 3. Add stream_options for usage tracking\n          if (!request.stream_options) {\n            request.stream_options = { include_usage: true };\n            logger.debug(\n              `Added stream_options.include_usage=true in completionWithRetry for ${request.model}`\n            );\n            hasChanges = true;\n          } else if (request.stream_options.include_usage !== true) {\n            request.stream_options.include_usage = true;\n            logger.debug(\n              `Updated stream_options.include_usage=true in completionWithRetry for ${request.model}`\n            );\n            hasChanges = true;\n          }\n\n          if (hasChanges) {\n            logger.debug(\n              `Fixed request params in completionWithRetry for ${request.model}`\n            );\n          }\n        }\n\n        const result = await originalCompletionWithRetry.call(\n          this,\n          request,\n          options\n        );\n\n        // Log response for usage information debugging\n        if (\n          request?.model &&\n          (request.model.includes(\"gpt-5\") ||\n            /^gpt-(5|6|7|8|9)/.test(request.model))\n        ) {\n          logger.warn(\n            `[GPT-5 PATCH] Azure OpenAI Response for ${request.model}:`\n          );\n          logger.warn(`Response keys: ${Object.keys(result || {}).join(\", \")}`);\n\n          if (result?.usage) {\n            logger.warn(\n              `Usage found: ${JSON.stringify(result.usage, null, 2)}`\n            );\n          } else {\n            logger.warn(`No usage found in response`);\n          }\n\n          if (result?.choices && result.choices[0]) {\n            logger.warn(\n              `First choice keys: ${Object.keys(result.choices[0]).join(\", \")}`\n            );\n          }\n        }\n\n        return result;\n      };\n\n      logger.warn(\n        `Successfully patched ${modelName}.completionWithRetry for GPT-5 support (TEMPORARY WORKAROUND)`\n      );\n    }\n\n    // Additionally patch isReasoningModel for correct reasoning model detection\n    const originalIsReasoningModel = prototype.isReasoningModel;\n\n    if (originalIsReasoningModel) {\n      prototype.isReasoningModel = function () {\n        const model =\n          this.modelName || this.model || (this as any).lc_kwargs?.modelName;\n\n        // Correct logic for identifying reasoning models:\n        // 1. o1, o2, o3, o4 series - these are reasoning models\n        // 2. gpt-5+ - these are reasoning models\n        const isReasoning =\n          /^o\\d/.test(model) ||\n          model.includes(\"gpt-5\") ||\n          /^gpt-(6|7|8|9)/.test(model);\n\n        const originalResult = originalIsReasoningModel.call(this);\n\n        logger.warn(\n          `[GPT-5 PATCH] isReasoningModel check for \"${model}\": patched=${isReasoning}, original=${originalResult}, modelName=${this.modelName}, model=${(this as any).model}, lc_kwargs=${JSON.stringify((this as any).lc_kwargs?.modelName)}`\n        );\n\n        return isReasoning;\n      };\n\n      logger.warn(\n        `Successfully patched ${modelName}.isReasoningModel for GPT-5+ reasoning models (TEMPORARY WORKAROUND)`\n      );\n    } else {\n      logger.warn(\n        `Could not find isReasoningModel method to patch in ${modelName}`\n      );\n    }\n\n    // Remove bindTools patch - let it work natively\n\n    // Remove custom token counting patches - let LangChain handle it\n\n    // Patch invoke method for response logging\n    const originalInvoke = prototype.invoke;\n\n    if (originalInvoke) {\n      prototype.invoke = async function (...args: any[]) {\n        const model =\n          this.modelName || this.model || (this as any).lc_kwargs?.modelName;\n\n        if (model && model.includes(\"gpt-5\")) {\n          logger.warn(`[GPT-5 PATCH] Starting invoke for ${model}`);\n\n          // Log invocation parameters\n          if (args[1]) {\n            const config = args[1];\n            logger.warn(\n              `[GPT-5 PATCH] Invoke config keys: ${Object.keys(config || {}).join(\", \")}`\n            );\n            if (config.tools) {\n              logger.warn(\n                `[GPT-5 PATCH] Tools in config: ${config.tools.length} tools`\n              );\n            }\n          }\n\n          // Log model state\n          const boundTools =\n            (this as any).bound ||\n            (this as any).boundTools ||\n            (this as any).tools;\n          if (boundTools) {\n            logger.warn(\n              `[GPT-5 PATCH] Model has bound tools: ${Array.isArray(boundTools) ? boundTools.length : \"yes\"}`\n            );\n          } else {\n            logger.warn(`[GPT-5 PATCH] Model has NO bound tools`);\n          }\n        }\n\n        let result;\n        try {\n          result = await originalInvoke.apply(this, args);\n        } catch (error) {\n          if (model && model.includes(\"gpt-5\")) {\n            logger.error(\n              `[GPT-5 PATCH] Azure OpenAI invoke failed for ${model}:`,\n              {\n                errorMessage:\n                  error instanceof Error ? error.message : String(error),\n                errorStack: error instanceof Error ? error.stack : undefined,\n                errorType: error?.constructor?.name,\n                args: args.length,\n                hasConfig: !!args[1],\n                configKeys: args[1] ? Object.keys(args[1] || {}) : [],\n                tools: args[1]?.tools?.length || 0,\n              }\n            );\n          }\n          throw error;\n        }\n\n        if (model && model.includes(\"gpt-5\")) {\n          logger.warn(`[GPT-5 PATCH] Azure OpenAI invoke result for ${model}:`);\n          logger.warn(`Result keys: ${Object.keys(result || {}).join(\", \")}`);\n\n          if (result?.usage_metadata || result?.usageMetadata) {\n            const usage = result.usage_metadata || result.usageMetadata;\n            logger.warn(\n              `Usage metadata found: ${JSON.stringify(usage, null, 2)}`\n            );\n          }\n\n          if (result?.response_metadata || result?.responseMetadata) {\n            const responseMetadata =\n              result.response_metadata || result.responseMetadata;\n            logger.warn(\n              `Response metadata found: ${JSON.stringify(responseMetadata, null, 2)}`\n            );\n\n            // Create usage_metadata from estimatedTokenUsage if not present\n            if (\n              !result.usage_metadata &&\n              responseMetadata?.estimatedTokenUsage\n            ) {\n              const estimatedUsage = responseMetadata.estimatedTokenUsage;\n              result.usage_metadata = {\n                input_tokens: estimatedUsage.promptTokens || 0,\n                output_tokens: estimatedUsage.completionTokens || 0,\n                total_tokens: estimatedUsage.totalTokens || 0,\n              };\n\n              logger.warn(\n                `[GPT-5 PATCH] Created usage_metadata from estimatedTokenUsage: ${JSON.stringify(result.usage_metadata, null, 2)}`\n              );\n            }\n          }\n\n          if (!result?.usage_metadata && !result?.usageMetadata) {\n            logger.warn(`No usage_metadata found in invoke result`);\n          }\n        }\n\n        return result;\n      };\n\n      logger.warn(\n        `Successfully patched ${modelName}.invoke for GPT-5 response logging (TEMPORARY WORKAROUND)`\n      );\n    }\n  });\n}\n\n// Apply patch on module load\npatchChatOpenAIForGPT5();\nimport { OpenAIEmbeddings } from \"@langchain/openai\";\nimport { ChatAnthropic } from \"@langchain/anthropic\";\nimport { ChatCohere } from \"@langchain/cohere\";\nimport { CohereRerank } from \"@langchain/cohere\";\nimport { VoyageAIRerank } from \"./rerankers/voyageai-rerank\";\nimport { ChatMistralAI } from \"@langchain/mistralai\";\n\nimport { ModelProvider, ModelType } from \"./enums\";\nimport {\n  IModelInitializer,\n  Model,\n  ModelByIdWithTypeConfig,\n  ModelConfigWithTokenAndType,\n  ChatModelCreator,\n  RerankModelCreator,\n  EmbeddingModelCreator,\n} from \"./model.interface\";\nimport { ModelByIdConfig, ModelConfigFetcher } from \"./llm.types\";\n\nexport class ModelInitializer implements IModelInitializer {\n  private logger: Logger;\n\n  // Cache for model configurations to avoid repeated API calls\n  private modelConfigCache = new Map<string, ModelConfigWithTokenAndType>();\n\n  // Cache for model instances to avoid recreating identical models\n  private modelInstanceCache = new Map<string, Model>();\n\n  constructor(\n    private configFetcher?: ModelConfigFetcher,\n    logger?: Logger\n  ) {\n    this.logger = logger || new Logger(ModelInitializer.name);\n  }\n\n  /**\n   * Generate cache key for model instances based on configuration\n   */\n  private generateModelCacheKey(\n    modelId: string,\n    temperature?: number,\n    maxTokens?: number,\n    modelType?: ModelType\n  ): string {\n    return `${modelId}:${temperature || \"default\"}:${maxTokens || \"default\"}:${modelType || ModelType.CHAT}`;\n  }\n\n  /**\n   * TEMPORARY SOLUTION for compatibility with new OpenAI models\n   *\n   * OpenAI changed the API for new models (gpt-5, o-series):\n   * - Old models (gpt-3.5, gpt-4, gpt-4o): use maxTokens, support custom temperature\n   * - New reasoning models (gpt-5, gpt-o1, gpt-o3, gpt-o4): use maxCompletionTokens, only temperature = 1\n   *\n   * Patch fixes:\n   * 1. max_tokens -> max_completion_tokens for reasoning GPT-5+ models\n   * 2. temperature -> 1 (forced) for reasoning GPT-5+ models\n   *\n   * @param modelName - OpenAI model name\n   * @returns true if model requires maxCompletionTokens and temperature = 1\n   */\n  private requiresMaxCompletionTokens(modelName: string): boolean {\n    const requiresNew =\n      modelName.includes(\"gpt-5\") ||\n      modelName.includes(\"gpt-o1\") ||\n      modelName.includes(\"gpt-o2\") ||\n      modelName.includes(\"gpt-o3\") ||\n      modelName.includes(\"gpt-o4\") ||\n      // Add other patterns as new models are released\n      /^gpt-(5|6|7|8|9)/.test(modelName) ||\n      /^gpt-o[1-4]/.test(modelName);\n\n    this.logger.debug(`Checking token parameter for model \"${modelName}\"`, {\n      modelName,\n      requiresMaxCompletionTokens: requiresNew,\n      checks: {\n        includesGpt5: modelName.includes(\"gpt-5\"),\n        includesO1: modelName.includes(\"gpt-o1\"),\n        includesO2: modelName.includes(\"gpt-o2\"),\n        includesO3: modelName.includes(\"gpt-o3\"),\n        includesO4: modelName.includes(\"gpt-o4\"),\n        regexGpt5Plus: /^gpt-(5|6|7|8|9)/.test(modelName),\n        regexO1to4: /^gpt-o[1-4]/.test(modelName),\n      },\n    });\n\n    return requiresNew;\n  }\n\n  // Chat model creators (inherit from original LLMInitializer)\n  private readonly chatModelCreators: Partial<\n    Record<ModelProvider, ChatModelCreator>\n  > = {\n    [ModelProvider.OPENAI]: ({\n      modelName,\n      defaultTemperature,\n      defaultMaxTokens,\n      apiToken,\n    }) => {\n      // HARDCODED: Create clean configuration depending on model type for regular OpenAI models\n      if (this.requiresMaxCompletionTokens(modelName)) {\n        // Configuration for new GPT-5+ models\n        // GPT-5+ models only support temperature = 1\n        const fixedTemperature = 1;\n        const config = {\n          modelName,\n          temperature: fixedTemperature, // Force set to 1\n          maxCompletionTokens: defaultMaxTokens, // Only this parameter for new models\n          streaming: true,\n          openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n        };\n\n        if (defaultTemperature !== 1) {\n          this.logger.debug(\n            `Fixed temperature for GPT-5+ model ${modelName}: ${defaultTemperature} -> 1 (GPT-5+ models only support temperature=1)`\n          );\n        }\n\n        // Creating GPT-5+ model with fixed parameters\n\n        const chatOpenAI = new ChatOpenAI(config);\n\n        // ChatOpenAI instance created\n\n        return chatOpenAI;\n      } else {\n        // Configuration for legacy GPT-3.5/GPT-4 models\n        const config = {\n          modelName,\n          temperature: defaultTemperature,\n          maxTokens: defaultMaxTokens, // Only this parameter for legacy models\n          streaming: true,\n          openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n        };\n\n        // Creating legacy OpenAI model\n\n        const chatOpenAI = new ChatOpenAI(config);\n\n        // Legacy ChatOpenAI instance created\n\n        return chatOpenAI;\n      }\n    },\n\n    [ModelProvider.ANTHROPIC]: ({\n      modelName,\n      defaultTemperature,\n      defaultMaxTokens,\n      apiToken,\n    }) =>\n      new ChatAnthropic({\n        modelName,\n        temperature: defaultTemperature,\n        maxTokens: defaultMaxTokens,\n        anthropicApiKey: apiToken || process.env.ANTHROPIC_API_KEY,\n      }) as unknown as BaseChatModel,\n\n    [ModelProvider.COHERE]: ({\n      modelName,\n      defaultTemperature,\n      defaultMaxTokens,\n      apiToken,\n    }) =>\n      new ChatCohere({\n        model: modelName,\n        temperature: defaultTemperature,\n        // Cohere uses maxTokens via max_tokens parameter, but it's not supported in ChatCohere API\n        apiKey: apiToken || process.env.COHERE_API_KEY,\n      }),\n\n    [ModelProvider.MISTRAL]: ({\n      modelName,\n      defaultTemperature,\n      defaultMaxTokens,\n      apiToken,\n    }) =>\n      new ChatMistralAI({\n        model: modelName,\n        temperature: defaultTemperature,\n        maxTokens: defaultMaxTokens,\n        apiKey: apiToken || process.env.MISTRAL_API_KEY,\n      }),\n\n    // AWS Bedrock support removed - use Anthropic or OpenAI directly instead\n\n    [ModelProvider.FLUTCH_OPENAI]: ({\n      modelName,\n      defaultTemperature,\n      defaultMaxTokens,\n      apiToken,\n    }) => {\n      // HARDCODED: Create clean configuration depending on model type (same as for regular OpenAI)\n      if (this.requiresMaxCompletionTokens(modelName)) {\n        // Configuration for new GPT-5+ models\n        // GPT-5+ models only support temperature = 1\n        const fixedTemperature = 1;\n        const config = {\n          modelName,\n          temperature: fixedTemperature, // Force set to 1\n          maxCompletionTokens: defaultMaxTokens, // Only this parameter for new models\n          streaming: true,\n          openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n        };\n\n        if (defaultTemperature !== 1) {\n          this.logger.debug(\n            `Fixed temperature for FLUTCH GPT-5+ model ${modelName}: ${defaultTemperature} -> 1 (GPT-5+ models only support temperature=1)`\n          );\n        }\n\n        this.logger.debug(`Creating FLUTCH GPT-5+ model with config`, {\n          modelName,\n          maxCompletionTokens: defaultMaxTokens,\n          temperature: fixedTemperature,\n          originalTemperature: defaultTemperature,\n          hasApiKey: !!config.openAIApiKey,\n        });\n\n        const chatOpenAI = new ChatOpenAI(config);\n\n        // Log initialized instance for debugging\n        this.logger.debug(`FLUTCH ChatOpenAI GPT-5+ instance created`, {\n          modelName: modelName, // Use modelName from parameters\n          maxTokens: (chatOpenAI as any).maxTokens,\n          maxCompletionTokens: (chatOpenAI as any).maxCompletionTokens,\n          temperature: chatOpenAI.temperature,\n          streaming: chatOpenAI.streaming,\n          // Try to get internal parameters\n          clientConfig: (chatOpenAI as any).clientConfig,\n          kwargs: (chatOpenAI as any).kwargs,\n        });\n\n        return chatOpenAI;\n      } else {\n        // Configuration for legacy GPT-3.5/GPT-4 models\n        const config = {\n          modelName,\n          temperature: defaultTemperature,\n          maxTokens: defaultMaxTokens, // Only this parameter for legacy models\n          streaming: true,\n          openAIApiKey: apiToken || process.env.OPENAI_API_KEY,\n        };\n\n        this.logger.debug(`Creating FLUTCH legacy model with config`, {\n          modelName,\n          maxTokens: defaultMaxTokens,\n          temperature: defaultTemperature,\n          hasApiKey: !!config.openAIApiKey,\n        });\n\n        const chatOpenAI = new ChatOpenAI(config);\n\n        // Log initialized instance for debugging\n        this.logger.debug(`FLUTCH ChatOpenAI legacy instance created`, {\n          modelName: modelName, // Use modelName from parameters\n          maxTokens: (chatOpenAI as any).maxTokens,\n          maxCompletionTokens: (chatOpenAI as any).maxCompletionTokens,\n          temperature: chatOpenAI.temperature,\n          streaming: chatOpenAI.streaming,\n          // Try to get internal parameters\n          clientConfig: (chatOpenAI as any).clientConfig,\n          kwargs: (chatOpenAI as any).kwargs,\n        });\n\n        return chatOpenAI;\n      }\n    },\n\n    // Other providers not yet implemented for chat\n    [ModelProvider.FLUTCH]: () => {\n      throw new Error(\"Flutch chat models not implemented\");\n    },\n    [ModelProvider.FLUTCH_MISTRAL]: () => {\n      throw new Error(\"Flutch Mistral chat models not implemented\");\n    },\n    [ModelProvider.FLUTCH_ANTHROPIC]: () => {\n      throw new Error(\"Flutch Anthropic chat models not implemented\");\n    },\n    [ModelProvider.VOYAGEAI]: () => {\n      throw new Error(\"VoyageAI chat models not implemented\");\n    },\n  };\n\n  // Rerank model creators\n  private readonly rerankModelCreators: Record<\n    ModelProvider,\n    RerankModelCreator | undefined\n  > = {\n    [ModelProvider.COHERE]: ({ modelName, apiToken, maxDocuments }) => {\n      return new CohereRerank({\n        apiKey: apiToken || process.env.COHERE_API_KEY,\n        model: modelName,\n        topN: maxDocuments || 20,\n      });\n    },\n\n    [ModelProvider.VOYAGEAI]: ({ modelName, apiToken, maxDocuments }) => {\n      return new VoyageAIRerank({\n        apiKey: apiToken || process.env.VOYAGEAI_API_KEY,\n        model: modelName,\n        topN: maxDocuments || 20,\n      });\n    },\n\n    // Other providers don't support rerank yet\n    [ModelProvider.OPENAI]: undefined,\n    [ModelProvider.ANTHROPIC]: undefined,\n    [ModelProvider.MISTRAL]: undefined,\n    [ModelProvider.AWS]: undefined,\n    [ModelProvider.FLUTCH]: undefined,\n    [ModelProvider.FLUTCH_MISTRAL]: undefined,\n    [ModelProvider.FLUTCH_OPENAI]: undefined,\n    [ModelProvider.FLUTCH_ANTHROPIC]: undefined,\n  };\n\n  // Embedding model creators\n  private readonly embeddingModelCreators: Record<\n    ModelProvider,\n    EmbeddingModelCreator | undefined\n  > = {\n    [ModelProvider.OPENAI]: ({ modelName, apiToken }) =>\n      new OpenAIEmbeddings({\n        model: modelName,\n        apiKey: apiToken || process.env.OPENAI_API_KEY,\n      }),\n\n    // Other providers not yet implemented for embeddings\n    [ModelProvider.ANTHROPIC]: undefined,\n    [ModelProvider.COHERE]: undefined,\n    [ModelProvider.MISTRAL]: undefined,\n    [ModelProvider.AWS]: undefined,\n    [ModelProvider.FLUTCH]: undefined,\n    [ModelProvider.FLUTCH_MISTRAL]: undefined,\n    [ModelProvider.FLUTCH_OPENAI]: undefined,\n    [ModelProvider.FLUTCH_ANTHROPIC]: undefined,\n    [ModelProvider.VOYAGEAI]: undefined,\n  };\n\n  async initializeChatModel(config: ModelByIdConfig): Promise<BaseChatModel> {\n    // Generate cache key for this specific model configuration\n    const cacheKey = this.generateModelCacheKey(\n      config.modelId,\n      config.temperature,\n      config.maxTokens,\n      ModelType.CHAT\n    );\n\n    // Check if we already have this exact model instance cached\n    const cachedModel = this.modelInstanceCache.get(cacheKey);\n    if (cachedModel) {\n      this.logger.debug(`Using cached chat model instance: ${cacheKey}`);\n      return cachedModel as BaseChatModel;\n    }\n\n    const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n    if (modelConfig.modelType !== ModelType.CHAT) {\n      throw new Error(\n        `Model ${config.modelId} is not a chat model (type: ${modelConfig.modelType})`\n      );\n    }\n\n    const creator = this.chatModelCreators[modelConfig.provider];\n    if (!creator) {\n      throw new Error(\n        `Chat models not supported for provider: ${modelConfig.provider}`\n      );\n    }\n\n    // Override parameters from request\n    const finalConfig: ModelConfigWithTokenAndType = {\n      ...modelConfig,\n      defaultTemperature: Number(\n        config.temperature ?? modelConfig.defaultTemperature\n      ),\n      defaultMaxTokens: Number(\n        config.maxTokens ?? modelConfig.defaultMaxTokens\n      ),\n    };\n\n    this.logger.debug(`Creating new chat model instance: ${cacheKey}`);\n    const model = creator(finalConfig);\n\n    // Attach modelId to model metadata - will automatically propagate to all LangChain events\n    model.metadata = {\n      ...model.metadata,\n      modelId: config.modelId,\n    };\n\n    this.logger.debug(\"🔧 Model initialized with metadata\", {\n      modelId: config.modelId,\n      metadataKeys: Object.keys(model.metadata || {}),\n      hasModelId: !!model.metadata?.modelId,\n    });\n\n    // Cache the created model instance\n    this.modelInstanceCache.set(cacheKey, model);\n\n    return model;\n  }\n\n  async initializeRerankModel(\n    config: ModelByIdConfig\n  ): Promise<BaseDocumentCompressor> {\n    // Generate cache key for this rerank model configuration\n    const cacheKey = this.generateModelCacheKey(\n      config.modelId,\n      undefined, // rerank models typically don't use temperature\n      config.maxTokens,\n      ModelType.RERANK\n    );\n\n    // Check if we already have this exact model instance cached\n    const cachedModel = this.modelInstanceCache.get(cacheKey);\n    if (cachedModel) {\n      this.logger.debug(`Using cached rerank model instance: ${cacheKey}`);\n      return cachedModel as BaseDocumentCompressor;\n    }\n\n    const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n    if (modelConfig.modelType !== ModelType.RERANK) {\n      throw new Error(\n        `Model ${config.modelId} is not a rerank model (type: ${modelConfig.modelType})`\n      );\n    }\n\n    const creator = this.rerankModelCreators[modelConfig.provider];\n    if (!creator) {\n      throw new Error(\n        `Rerank models not supported for provider: ${modelConfig.provider}`\n      );\n    }\n\n    this.logger.debug(`Creating new rerank model instance: ${cacheKey}`);\n    const model = creator(modelConfig);\n\n    // Attach modelId to model metadata - will automatically propagate to all events\n    (model as any).metadata = {\n      ...(model as any).metadata,\n      modelId: config.modelId,\n    };\n\n    // Cache the created model instance\n    this.modelInstanceCache.set(cacheKey, model);\n\n    return model;\n  }\n\n  async initializeEmbeddingModel(config: ModelByIdConfig): Promise<Embeddings> {\n    // Generate cache key for this embedding model configuration\n    const cacheKey = this.generateModelCacheKey(\n      config.modelId,\n      undefined, // embedding models typically don't use temperature\n      undefined, // embedding models typically don't use maxTokens\n      ModelType.EMBEDDING\n    );\n\n    // Check if we already have this exact model instance cached\n    const cachedModel = this.modelInstanceCache.get(cacheKey);\n    if (cachedModel) {\n      this.logger.debug(`Using cached embedding model instance: ${cacheKey}`);\n      return cachedModel as Embeddings;\n    }\n\n    const modelConfig = await this.getModelConfigWithType(config.modelId);\n\n    if (modelConfig.modelType !== ModelType.EMBEDDING) {\n      throw new Error(\n        `Model ${config.modelId} is not an embedding model (type: ${modelConfig.modelType})`\n      );\n    }\n\n    const creator = this.embeddingModelCreators[modelConfig.provider];\n    if (!creator) {\n      throw new Error(\n        `Embedding models not supported for provider: ${modelConfig.provider}`\n      );\n    }\n\n    this.logger.debug(`Creating new embedding model instance: ${cacheKey}`);\n    const model = creator(modelConfig);\n\n    // Attach modelId to model metadata - will automatically propagate to all events\n    (model as any).metadata = {\n      ...(model as any).metadata,\n      modelId: config.modelId,\n    };\n\n    // Cache the created model instance\n    this.modelInstanceCache.set(cacheKey, model);\n\n    return model;\n  }\n\n  // === NEW TYPED METHODS ===\n\n  async createChatModelById(modelId: string): Promise<BaseChatModel> {\n    const config = await this.getModelConfigWithType(modelId);\n\n    if (config.modelType !== ModelType.CHAT) {\n      throw new Error(\n        `Model ${modelId} is not a chat model, got: ${config.modelType}`\n      );\n    }\n\n    return this.initializeChatModel(config);\n  }\n\n  async createRerankModelById(\n    modelId: string\n  ): Promise<BaseDocumentCompressor> {\n    const config = await this.getModelConfigWithType(modelId);\n\n    if (config.modelType !== ModelType.RERANK) {\n      throw new Error(\n        `Model ${modelId} is not a rerank model, got: ${config.modelType}`\n      );\n    }\n\n    return this.initializeRerankModel(config);\n  }\n\n  async createEmbeddingModelById(modelId: string): Promise<Embeddings> {\n    const config = await this.getModelConfigWithType(modelId);\n\n    if (config.modelType !== ModelType.EMBEDDING) {\n      throw new Error(\n        `Model ${modelId} is not an embedding model, got: ${config.modelType}`\n      );\n    }\n\n    return this.initializeEmbeddingModel(config);\n  }\n\n  async createModelById(\n    modelId: string,\n    expectedType?: ModelType\n  ): Promise<Model> {\n    const config = await this.getModelConfigWithType(modelId);\n\n    // Check if it matches the expected type\n    if (expectedType && config.modelType !== expectedType) {\n      throw new Error(\n        `Model ${modelId} expected to be ${expectedType}, but got: ${config.modelType}`\n      );\n    }\n\n    return this.initializeModelByType(config);\n  }\n\n  // === LEGACY METHODS ===\n\n  async initializeModelByType(config: ModelByIdWithTypeConfig): Promise<Model> {\n    switch (config.modelType) {\n      case ModelType.CHAT:\n        return this.initializeChatModel(config);\n\n      case ModelType.RERANK:\n        return this.initializeRerankModel(config);\n\n      case ModelType.EMBEDDING:\n        return this.initializeEmbeddingModel(config);\n\n      case ModelType.IMAGE:\n      case ModelType.SPEECH:\n        throw new Error(`Model type ${config.modelType} not yet supported`);\n\n      default:\n        throw new Error(`Unknown model type: ${config.modelType}`);\n    }\n  }\n\n  async getModelConfigWithType(\n    modelId: string\n  ): Promise<ModelConfigWithTokenAndType> {\n    // Check if we already have this model config cached\n    const cachedConfig = this.modelConfigCache.get(modelId);\n    if (cachedConfig) {\n      this.logger.debug(`Using cached model config: ${modelId}`);\n      return cachedConfig;\n    }\n\n    this.logger.debug(`Fetching model config: ${modelId}`);\n\n    // Get base configuration\n    const baseConfig = this.configFetcher\n      ? await this.configFetcher(modelId)\n      : await this.fetchFromApi(modelId);\n\n    // Model config loaded successfully\n\n    // Extend with model type and additional fields\n    const result = {\n      ...baseConfig,\n      modelType: (baseConfig as any).modelType || ModelType.CHAT, // Fallback for legacy models\n      maxDocuments: (baseConfig as any).maxDocuments,\n      dimensions: (baseConfig as any).dimensions,\n      supportedFormats: (baseConfig as any).supportedFormats,\n    };\n\n    // Model type resolved\n\n    // Cache the result to avoid repeated API calls\n    this.modelConfigCache.set(modelId, result);\n\n    return result;\n  }\n\n  isModelTypeSupported(modelType: ModelType): boolean {\n    return [ModelType.CHAT, ModelType.RERANK, ModelType.EMBEDDING].includes(\n      modelType\n    );\n  }\n\n  getSupportedModelTypes(): ModelType[] {\n    return [ModelType.CHAT, ModelType.RERANK, ModelType.EMBEDDING];\n  }\n\n  /**\n   * Clear all cached model configurations and instances\n   */\n  clearCache(): void {\n    this.logger.debug(\n      `Clearing ModelInitializer cache: ${this.modelConfigCache.size} configs, ${this.modelInstanceCache.size} instances`\n    );\n    this.modelConfigCache.clear();\n    this.modelInstanceCache.clear();\n  }\n\n  /**\n   * Clear cached data for a specific model ID\n   */\n  clearModelCache(modelId: string): void {\n    this.modelConfigCache.delete(modelId);\n\n    // Clear all instances that use this model ID\n    const keysToDelete: string[] = [];\n    for (const [key] of this.modelInstanceCache.entries()) {\n      if (key.startsWith(`${modelId}:`)) {\n        keysToDelete.push(key);\n      }\n    }\n\n    keysToDelete.forEach(key => {\n      this.modelInstanceCache.delete(key);\n    });\n\n    this.logger.debug(\n      `Cleared cache for model ${modelId}: ${keysToDelete.length} instances`\n    );\n  }\n\n  /**\n   * Get cache statistics for monitoring\n   */\n  getCacheStats() {\n    return {\n      configCacheSize: this.modelConfigCache.size,\n      instanceCacheSize: this.modelInstanceCache.size,\n      configCacheKeys: Array.from(this.modelConfigCache.keys()),\n      instanceCacheKeys: Array.from(this.modelInstanceCache.keys()),\n    };\n  }\n\n  // Simple API request for microservices (copy from original LLMInitializer)\n  private async fetchFromApi(\n    modelId: string\n  ): Promise<ModelConfigWithTokenAndType> {\n    const apiUrl = process.env.API_URL || \"http://amelie-service\";\n    const token = process.env.INTERNAL_API_TOKEN;\n\n    if (!token) {\n      throw new Error(\"INTERNAL_API_TOKEN required for API mode\");\n    }\n\n    const url = `${apiUrl}/internal/model-catalog/models/${modelId}/config`;\n\n    const response = await fetch(url, {\n      method: \"GET\",\n      headers: {\n        \"x-internal-token\": token,\n        \"Content-Type\": \"application/json\",\n      },\n    });\n\n    if (!response.ok) {\n      throw new Error(\n        `Failed to fetch model config: ${response.status} ${response.statusText}`\n      );\n    }\n\n    const config = await response.json();\n\n    console.debug(\n      `ModelInitializer.fetchFromApi - API response for ${modelId}:`,\n      {\n        url,\n        statusCode: response.status,\n        configKeys: Object.keys(config),\n        modelType: config.modelType,\n        hasModelType: !!config.modelType,\n        fullConfig: config,\n      }\n    );\n\n    // Extend configuration with model type\n    const result = {\n      ...config,\n      modelType: config.modelType || ModelType.CHAT, // Fallback for compatibility\n    };\n\n    console.debug(`ModelInitializer.fetchFromApi - final result:`, {\n      modelId,\n      resultModelType: result.modelType,\n      usedFallback: !config.modelType,\n      resultKeys: Object.keys(result),\n    });\n\n    return result;\n  }\n}\n\n/**\n * Helper function for Azure OpenAI tools binding\n *\n * Azure OpenAI doesn't support bindTools method, so we need to:\n * 1. Check if model has bindTools (regular OpenAI models)\n * 2. If yes - use bindTools normally\n * 3. If no (Azure) - pass tools manually in config\n *\n * @param model - LangChain chat model instance\n * @param tools - Array of tools to bind/configure\n * @param baseConfig - Base configuration for invoke\n * @returns Object with prepared model and config for tools\n */\nexport function prepareModelWithTools(\n  model: BaseChatModel,\n  tools: StructuredTool[],\n  baseConfig: any = {}\n): {\n  modelWithTools: any; // Can be BaseChatModel or result of bindTools\n  finalConfig: any;\n  toolsMethod: \"bindTools\" | \"manual\" | \"none\";\n} {\n  if (tools.length === 0) {\n    return {\n      modelWithTools: model,\n      finalConfig: baseConfig,\n      toolsMethod: \"none\",\n    };\n  }\n\n  // Check if model supports bindTools (regular OpenAI models)\n  if (model.bindTools && typeof model.bindTools === \"function\") {\n    try {\n      const modelWithTools = model.bindTools(tools);\n      return {\n        modelWithTools,\n        finalConfig: baseConfig,\n        toolsMethod: \"bindTools\",\n      };\n    } catch (error) {\n      // Fallback to manual if bindTools fails\n      const invokeConfig = { tools };\n      const finalConfig = { ...baseConfig, ...invokeConfig };\n      return {\n        modelWithTools: model,\n        finalConfig,\n        toolsMethod: \"manual\",\n      };\n    }\n  }\n\n  // Azure OpenAI case - pass tools manually in config\n  const invokeConfig = { tools };\n  const finalConfig = { ...baseConfig, ...invokeConfig };\n\n  return {\n    modelWithTools: model,\n    finalConfig,\n    toolsMethod: \"manual\",\n  };\n}\n","/**\n * Retriever enums\n */\n\nexport enum RetrieverSearchType {\n  Search = \"search\",\n  MMR = \"mmr\",\n  Similarity = \"similarity\",\n}\n","import { Injectable, Logger } from \"@nestjs/common\";\nimport { RetrieverSearchType } from \"./enums\";\nimport {\n  CustomDocument,\n  RetrieveQueryOptions,\n  KnowledgeBaseInfo,\n} from \"./types\";\n\nexport interface RetrieverConfig {\n  /**\n   * Base URL for the main backend service (k8s endpoint)\n   * If not specified, will use environment variable\n   */\n  apiUrl?: string;\n  /**\n   * Internal API token for backend communication\n   * If not specified, will use environment variable\n   */\n  internalToken?: string;\n  /**\n   * Request timeout in milliseconds\n   */\n  timeout?: number;\n  /**\n   * Number of retries for failed requests\n   */\n  retries?: number;\n}\n\n/**\n * Retriever Service\n * HTTP-based service for knowledge base retrieval through main backend\n * Follows the same pattern as LLM initializer for k8s communication\n */\n@Injectable()\nexport class RetrieverService {\n  private readonly logger = new Logger(RetrieverService.name);\n  private readonly apiUrl: string;\n  private readonly internalToken: string;\n  private readonly timeout: number;\n  private readonly retries: number;\n\n  constructor(config: RetrieverConfig = {}) {\n    // this.logger = config.logger || new ConsoleLogger();\n\n    // Priority: config values > environment variables > defaults\n    this.apiUrl =\n      config.apiUrl || process.env.API_URL || \"http://amelie-service\";\n    this.internalToken =\n      config.internalToken || process.env.INTERNAL_API_TOKEN || \"\";\n    this.timeout = config.timeout || 30000; // 30 seconds default\n    this.retries = config.retries || 3;\n\n    if (!this.internalToken) {\n      throw new Error(\"INTERNAL_API_TOKEN required for backend communication\");\n    }\n\n    this.logger.log(\n      `RetrieverService initialized with API URL: ${this.apiUrl}`\n    );\n  }\n\n  /**\n   * Make HTTP request to backend with retry logic\n   */\n  private async makeRequest<T>(\n    endpoint: string,\n    options: {\n      method?: \"GET\" | \"POST\";\n      body?: any;\n      timeout?: number;\n    } = {}\n  ): Promise<T> {\n    const { method = \"GET\", body, timeout = this.timeout } = options;\n    const url = `${this.apiUrl}${endpoint}`;\n\n    let lastError: Error | undefined;\n\n    for (let attempt = 1; attempt <= this.retries; attempt++) {\n      try {\n        this.logger.debug?.(\n          `Making ${method} request to ${url} (attempt ${attempt}/${this.retries})`\n        );\n\n        const response = await fetch(url, {\n          method,\n          headers: {\n            \"x-internal-token\": this.internalToken,\n            \"Content-Type\": \"application/json\",\n            \"User-Agent\": \"RetrieverService/1.0.0\",\n          },\n          body: body ? JSON.stringify(body) : undefined,\n          signal: AbortSignal.timeout(timeout),\n        });\n\n        if (!response.ok) {\n          const errorText = await response.text().catch(() => \"Unknown error\");\n          throw new Error(\n            `HTTP ${response.status} ${response.statusText}: ${errorText}`\n          );\n        }\n\n        const data = await response.json();\n        this.logger.debug?.(`Request successful on attempt ${attempt}`);\n        return data;\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        if (attempt === this.retries) {\n          this.logger.error(\n            `Request failed after ${this.retries} attempts: ${lastError.message}`\n          );\n          break;\n        }\n\n        const backoffDelay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\n        this.logger.warn(\n          `Request failed (attempt ${attempt}/${this.retries}), retrying in ${backoffDelay}ms: ${lastError.message}`\n        );\n\n        await new Promise(resolve => setTimeout(resolve, backoffDelay));\n      }\n    }\n\n    if (!lastError) {\n      throw new Error(\"Request failed with unknown error\");\n    }\n\n    throw lastError;\n  }\n\n  /**\n   * Health check for the service\n   */\n  async healthCheck(): Promise<boolean> {\n    try {\n      await this.makeRequest(\"/health\", { timeout: 5000 });\n      return true;\n    } catch (error) {\n      this.logger.warn(`Health check failed: ${error}`);\n      return false;\n    }\n  }\n\n  /**\n   * Search documents in knowledge base through backend API\n   */\n  async search(\n    query: string,\n    searchType: RetrieverSearchType,\n    knowledgeBaseIds: string[],\n    options?: RetrieveQueryOptions\n  ): Promise<CustomDocument[]> {\n    if (!query?.trim()) {\n      this.logger.warn(\"Empty query provided to search\");\n      return [];\n    }\n\n    if (!knowledgeBaseIds?.length) {\n      this.logger.warn(\"No knowledge base IDs provided\");\n      return [];\n    }\n\n    const searchOptions = {\n      k: options?.k || 10,\n      threshold: options?.threshold || 0.7,\n      metadata: options?.metadata || {},\n    };\n\n    this.logger.debug?.(`Searching documents: \"${query}\"`, {\n      searchType,\n      knowledgeBaseIds: knowledgeBaseIds.length,\n      options: searchOptions,\n    });\n\n    try {\n      const response = await this.makeRequest<{\n        documents: CustomDocument[];\n        totalFound: number;\n        searchType: string;\n      }>(\"/internal/knowledge-base/search\", {\n        method: \"POST\",\n        body: {\n          query: query.trim(),\n          searchType,\n          knowledgeBaseIds,\n          options: searchOptions,\n        },\n      });\n\n      const documents = response.documents || [];\n\n      this.logger.debug?.(\n        `Found ${documents.length} documents from ${response.totalFound || 0} total matches`\n      );\n\n      // Validate document structure\n      return documents.filter(doc => {\n        if (!doc.id || !doc.content) {\n          this.logger.warn(\"Invalid document structure detected, skipping\");\n          return false;\n        }\n        return true;\n      });\n    } catch (error) {\n      this.logger.error(`Failed to search documents: ${error}`, {\n        query,\n        searchType,\n        knowledgeBaseIds,\n        options: searchOptions,\n      });\n\n      // Return empty array on error to allow graph to continue\n      return [];\n    }\n  }\n\n  /**\n   * Get documents by their IDs\n   */\n  async getDocumentsByIds(ids: string[]): Promise<CustomDocument[]> {\n    if (!ids?.length) {\n      this.logger.warn(\"No document IDs provided\");\n      return [];\n    }\n\n    // Validate IDs format\n    const validIds = ids\n      .filter(id => {\n        if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n          this.logger.warn(`Invalid document ID: ${id}`);\n          return false;\n        }\n        return true;\n      })\n      .map(id => id.trim());\n\n    if (!validIds.length) {\n      this.logger.warn(\"No valid document IDs provided\");\n      return [];\n    }\n\n    this.logger.debug?.(`Fetching ${validIds.length} documents by IDs`);\n\n    try {\n      const response = await this.makeRequest<{\n        documents: CustomDocument[];\n      }>(\"/internal/knowledge-base/documents/batch\", {\n        method: \"POST\",\n        body: { ids: validIds },\n      });\n\n      const documents = response.documents || [];\n\n      this.logger.debug?.(\n        `Retrieved ${documents.length}/${validIds.length} documents`\n      );\n\n      return documents;\n    } catch (error) {\n      this.logger.error(`Failed to get documents by IDs: ${error}`, {\n        requestedIds: validIds.length,\n      });\n\n      return [];\n    }\n  }\n\n  /**\n   * Check if knowledge base exists and is accessible\n   */\n  async knowledgeBaseExists(knowledgeBaseId: string): Promise<boolean> {\n    if (!knowledgeBaseId?.trim()) {\n      this.logger.warn(\"Empty knowledge base ID provided\");\n      return false;\n    }\n\n    try {\n      const response = await this.makeRequest<{\n        exists: boolean;\n        accessible: boolean;\n      }>(`/internal/knowledge-base/${knowledgeBaseId.trim()}/status`);\n\n      const exists = response.exists && response.accessible;\n\n      this.logger.debug?.(\n        `Knowledge base ${knowledgeBaseId} ${exists ? \"exists and is accessible\" : \"does not exist or is not accessible\"}`\n      );\n\n      return exists;\n    } catch (error) {\n      this.logger.error(`Failed to check KB existence: ${error}`, {\n        knowledgeBaseId,\n      });\n\n      return false;\n    }\n  }\n\n  /**\n   * Get knowledge base information\n   */\n  async getKnowledgeBaseInfo(\n    knowledgeBaseId: string\n  ): Promise<KnowledgeBaseInfo | null> {\n    if (!knowledgeBaseId?.trim()) {\n      this.logger.warn(\"Empty knowledge base ID provided\");\n      return null;\n    }\n\n    try {\n      const response = await this.makeRequest<KnowledgeBaseInfo>(\n        `/internal/knowledge-base/${knowledgeBaseId.trim()}/info`\n      );\n\n      this.logger.debug?.(`Retrieved KB info for ${knowledgeBaseId}`, {\n        name: response.name,\n        documentsCount: response.documentsCount,\n      });\n\n      return response;\n    } catch (error) {\n      this.logger.error(`Failed to get KB info: ${error}`, {\n        knowledgeBaseId,\n      });\n\n      return null;\n    }\n  }\n\n  /**\n   * Simple text search (fallback for when vector search is not available)\n   */\n  async textSearch(\n    query: string,\n    knowledgeBaseIds: string[],\n    limit: number = 10\n  ): Promise<CustomDocument[]> {\n    if (!query?.trim()) {\n      this.logger.warn(\"Empty query provided to text search\");\n      return [];\n    }\n\n    if (!knowledgeBaseIds?.length) {\n      this.logger.warn(\"No knowledge base IDs provided to text search\");\n      return [];\n    }\n\n    this.logger.debug?.(`Performing text search: \"${query}\"`, {\n      knowledgeBaseIds: knowledgeBaseIds.length,\n      limit,\n    });\n\n    try {\n      const response = await this.makeRequest<{\n        documents: CustomDocument[];\n      }>(\"/internal/knowledge-base/text-search\", {\n        method: \"POST\",\n        body: {\n          query: query.trim(),\n          knowledgeBaseIds,\n          limit: Math.max(1, Math.min(limit, 100)), // Ensure reasonable limits\n        },\n      });\n\n      const documents = response.documents || [];\n\n      this.logger.debug?.(`Text search found ${documents.length} documents`);\n\n      return documents;\n    } catch (error) {\n      this.logger.error(`Failed to perform text search: ${error}`, {\n        query,\n        knowledgeBaseIds,\n        limit,\n      });\n\n      return [];\n    }\n  }\n\n  /**\n   * Get available knowledge bases for the current context\n   */\n  async getAvailableKnowledgeBases(): Promise<KnowledgeBaseInfo[]> {\n    try {\n      const response = await this.makeRequest<{\n        knowledgeBases: KnowledgeBaseInfo[];\n      }>(\"/internal/knowledge-base/available\");\n\n      const kbs = response.knowledgeBases || [];\n\n      this.logger.debug?.(`Found ${kbs.length} available knowledge bases`);\n\n      return kbs;\n    } catch (error) {\n      this.logger.error(`Failed to get available knowledge bases: ${error}`);\n\n      return [];\n    }\n  }\n\n  /**\n   * Check service health and configuration\n   */\n  check(): string {\n    return `RetrieverService configured with API URL: ${this.apiUrl}, timeout: ${this.timeout}ms, retries: ${this.retries}`;\n  }\n}\n","// packages/sdk/src/utils/index.ts\nexport * from \"./graph-type.utils\";\n","// Service discovery exports\nexport * from \"./service-discovery.provider\";\nexport * from \"./file-based.discovery\";\nexport * from \"./static.discovery\";\n\n// Optional: Uncomment when consul, @kubernetes/client-node packages are installed\n// export * from \"./consul.discovery\";\n// export * from \"./kubernetes.discovery\";\n// export * from \"./knative.discovery\";\n// export * from \"./knative-service.registry\";\n","// packages/graph-services/graph-service-registry/src/service-discovery/static.discovery.ts\nimport { Injectable } from \"@nestjs/common\";\nimport { ServiceDiscoveryProvider } from \"./service-discovery.provider\";\n\n/**\n * Static service discovery provider (for local development)\n */\n@Injectable()\nexport class StaticDiscovery implements ServiceDiscoveryProvider {\n  constructor(\n    private readonly services: Array<{\n      name: string;\n      address: string;\n      port: number;\n      metadata: Record<string, any>;\n      category?: string;\n    }>\n  ) {}\n\n  /**\n   * Get list of services by category\n   */\n  async getServices(category: string): Promise<\n    Array<{\n      name: string;\n      address: string;\n      port: number;\n      metadata: Record<string, any>;\n    }>\n  > {\n    return this.services.filter(\n      service =>\n        service.category === category || service.metadata?.category === category\n    );\n  }\n}\n"]}