{"version":3,"sources":["../src/config/dependencies.ts","../src/utils/common/hash.ts","../src/utils/common/id.ts","../src/utils/common/values.ts","../src/utils/common/object.ts","../src/utils/common/typeGuards.ts","../src/utils/common/time.ts","../src/utils/common/validation.ts","../src/utils/common/index.ts","../src/events/CoreEventManager.ts","../src/services/ApiClientService.ts","../src/base/observability/BaseAdapter.ts","../src/base/observability/LoggerAdapter.ts","../src/base/observability/ObservabilityService.ts","../src/base/observability/index.ts","../src/init/ServiceRegistry.ts","../src/events/streaming/StreamConnectionManager.ts","../src/events/streaming/StreamBroadcaster.ts","../src/events/streaming/auth/BaseAuthAdapter.ts","../src/events/streaming/auth/adapters/AnonymousAuthAdapter.ts","../src/events/streaming/transports/BaseTransportAdapter.ts","../src/events/streaming/transports/adapters/SSETransportAdapter.ts","../src/events/streaming/frameworks/BaseFrameworkAdapter.ts","../src/events/streaming/frameworks/NextJSFrameworkAdapter.ts","../src/events/streaming/frameworks/ExpressFrameworkAdapter.ts","../src/events/streaming/frameworks/NestJSFrameworkAdapter.ts","../src/events/streaming/frameworks/index.ts","../src/events/streaming/StreamServer.ts","../src/events/streaming/auth/adapters/TokenAuthAdapter.ts","../src/events/streaming/auth/adapters/index.ts","../src/events/streaming/auth/index.ts","../src/events/streaming/transports/adapters/WebSocketTransportAdapter.ts","../src/events/streaming/transports/adapters/index.ts","../src/events/streaming/transports/index.ts","../src/events/streaming/StreamRegistry.ts","../src/events/streaming/base/BaseStreamEndpoint.ts","../src/events/streaming/channels/BaseChannelController.ts","../src/domain/files/streaming/FilesChannelController.ts","../src/domain/files/streaming/FilesStreamEndpoint.ts","../src/domain/files/streaming/index.ts","../src/domain/notifications/streaming/NotificationsChannelController.ts","../src/domain/notifications/streaming/NotificationsStreamEndpoint.ts","../src/domain/notifications/streaming/index.ts","../src/events/streaming/endpoints/system/SystemChannelController.ts","../src/events/streaming/endpoints/system/SystemStreamEndpoint.ts","../src/events/streaming/endpoints/system/index.ts","../src/events/streaming/endpoints/index.ts","../src/events/streaming/middleware/MiddlewareChain.ts","../src/events/streaming/middleware/RateLimitMiddleware.ts","../src/events/streaming/middleware/index.ts","../src/events/streaming/index.ts","../src/utils/runtime.ts","../src/init/CoreInitializer.ts","../src/domain/base/BaseDomainService.ts","../src/domain/base/BaseFrontendDomainService.ts","../src/events/BackendEventPersistenceHandler.ts","../src/events/FrontendEventPersistenceHandler.ts","../src/events/index.ts","../src/base/cache/strategies/memory.ts","../src/base/cache/CacheKeyBuilder.ts","../src/base/cache/strategies/redis.ts","../src/base/cache/index.ts","../src/domain/base/BaseBackendDomainService.ts","../src/domain/base/BaseMapper.ts","../src/domain/base/BaseValidator.ts","../src/utils/mapperUtils.ts","../src/domain/base/index.ts","../src/domain/example/mappers/ExampleMapper.ts","../src/domain/example/FrontendExampleDomainService.ts","../src/domain/files/mappers/FilesMapper.ts","../src/domain/files/FrontendFilesDomainService.ts","../src/domain/notifications/mappers/NotificationsMapper.ts","../src/domain/notifications/validators/NotificationsValidator.ts","../src/domain/notifications/FrontendNotificationsDomainService.ts","../src/services/DbService.ts","../src/models/example/ExampleRepository.ts","../src/models/example/index.ts","../src/domain/example/validators/ExampleValidator.ts","../src/domain/example/BackendExampleDomainService.ts","../src/models/files/FilesRepository.ts","../src/models/files/MediaVariantsRepository.ts","../src/models/files/index.ts","../src/domain/files/validators/FilesValidator.ts","../src/domain/files/BackendFilesDomainService.ts","../src/models/notifications/NotificationsRepository.ts","../src/models/notifications/NotificationPreferencesRepository.ts","../src/models/notifications/index.ts","../src/models/shortUrls/ShortUrlRepository.ts","../src/models/shortUrls/index.ts","../src/domain/notifications/BackendNotificationsDomainService.ts","../src/entry-backend.ts","../src/init/getCoreDomainServices.ts","../src/init/getCoreStreamEndpoints.ts","../src/services/CacheService.ts","../src/services/StorageService.ts","../src/services/NotificationService.ts","../src/init/index.ts","../src/models/featureFlags/FeatureFlagRepository.ts","../src/engine/featureFlags/engine.ts","../src/utils/featureFlags/context.ts","../src/utils/featureFlags/conditions.ts","../src/utils/index.ts","../src/utils/files.ts","../src/utils/hmr-singleton.ts","../src/version.ts","../src/config/index.ts","../src/backend/example/example.controller.ts","../src/backend/example/example.module.ts","../src/domain/files/utils/guards.ts","../src/backend/pipes/validation/schema.ts","../src/backend/files/files.controller.ts","../src/backend/files/files.module.ts","../src/backend/notifications/notifications.controller.ts","../src/backend/notifications/notifications.module.ts","../src/backend/featureFlags/FeatureFlagDomainService.ts","../src/domain/featureFlags/service.ts","../src/domain/featureFlags/provider.ts","../src/domain/featureFlags/providers/memory.ts","../src/domain/featureFlags/providers/file.ts","../src/domain/featureFlags/providers/redis.ts","../src/domain/featureFlags/providers/api.ts","../src/domain/featureFlags/providers/database.ts","../src/domain/featureFlags/providers/factory.ts","../src/domain/featureFlags/module.ts","../src/backend/featureFlags/feature-flag.controller.ts","../src/backend/featureFlags/feature-flag.module.ts","../src/backend/featureFlags/decorators/feature-flag.decorator.ts","../src/backend/featureFlags/decorators/feature-disabled.decorator.ts","../src/backend/featureFlags/decorators/feature-enabled.decorator.ts","../src/backend/featureFlags/guards/feature-flag.guard.ts","../src/backend/featureFlags/middleware/feature-flag-middleware.ts","../src/backend/featureFlags/interceptors/feature-flag-logging-interceptor.ts","../src/backend/featureFlags/interceptors/error-handling-interceptor.ts","../src/backend/featureFlags/config/validation.ts","../src/backend/featureFlags/config/feature-flag.config.ts","../src/backend/webhooks/webhooks.controller.ts","../src/backend/webhooks/webhooks.module.ts","../src/base/cache/feature/caching.ts","../src/init/nestjs/index.ts","../src/init/nestjs/configureNestApp.ts","../src/adapters/nextjs.ts","../src/adapters/nestjs.ts"],"names":["MATH_CONSTANTS","path","TIME_CONSTANTS","FEATURE_FLAG_PROVIDERS","ERROR_CODES","ERROR_CATEGORY","CORE_EVENTS","PackageLogger","logger","CorePackageError","DbService","CacheService","StorageService","NotificationService","DEFAULT_STALE_MINUTES","DEFAULT_MAX_STALE_AGE","STREAM_ERROR_CODES","HTTP_STATUS","StreamPackageError","init_adapters","CoreLogger","init_streaming","STREAMING_DEFAULTS","BACKEND_RUNTIMES","FRONTEND_RUNTIMES","state","ServerErrorMiddleware","setDefaultApiClient","STORE_KEYS","BaseError","OBSERVABILITY_METRICS","uploadFileFetcher","uploadFilesFetcher","generateDocumentFetcher","defaultConfig","resolve","RedisCacheStrategy","API_ERROR_CODES","SERVICE_KEYS","PAGINATION_DEFAULTS","PAGE_SIZES","SYSTEM_USER_ID","_instance","DEFAULT_CONFIG","row","DatabasePackageError","DATABASE_ERROR_CODES","BaseRepository","TABLE_NAME","DEFAULT_LIMIT","NotificationPackageError","NOTIFICATION_ERROR_CODES","FrontendExampleDomainService","FrontendFilesDomainService","FrontendNotificationsDomainService","BackendExampleDomainService","BackendFilesDomainService","BackendNotificationsDomainService","FilesStreamEndpoint","NotificationsStreamEndpoint","SystemStreamEndpoint","StorageServiceImpl","STORAGE_ERROR_CODES","NotificationServiceImpl","require","FILE_CATEGORY","ENTITY_TYPE","SuccessResponseStandard","Get","ApiOperation","Post","HttpCode","HttpStatus","ApiBody","ApiResponse","Body","ApiParam","Param","Delete","ApiTags","Controller","Inject","Module","Patch","readFile","writeFile","access","mkdir","fileURLToPath","apiEvaluateAllFlags","apiCreateFlag","apiUpdateFlag","apiDeleteFlag","apiFetchRules","FEATURE_FLAG_CACHE_TTL_DEFAULT","FEATURE_FLAG_METADATA","FEATURES","Injectable","ValidationError","NODE_ENVIRONMENTS","CORE_ERROR_CODES","Headers","tap","isProduction","document","configureNestApp","loadDotenv"],"mappings":"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","file":"entry-backend.mjs","sourcesContent":["/**\n * Core Dependencies Configuration\n *\n * Similar to @plyaz/api's setGlobalConfig pattern.\n * Backend services are registered here by entry points, not imported directly.\n *\n * IMPORTANT: This file must NOT import from backend service files (DbService, CacheService, etc.)\n * as that would cause the bundler to include backend dependencies in the frontend bundle.\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { setCoreDependencies } from './config/dependencies';\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n *   DbService,\n *   CacheService,\n *   StorageService,\n *   NotificationService,\n * });\n *\n * // entry-frontend.ts\n * // Don't call setCoreDependencies - no backend deps loaded\n * ```\n */\n\nimport type {\n  CoreDbServiceStatic,\n  CoreCacheServiceStatic,\n  CoreStorageServiceStatic,\n  CoreNotificationServiceStatic,\n  CoreServerErrorMiddlewareStatic,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dependencies Container\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface CoreDependencies {\n  DbService?: CoreDbServiceStatic;\n  CacheService?: CoreCacheServiceStatic;\n  StorageService?: CoreStorageServiceStatic;\n  NotificationService?: CoreNotificationServiceStatic;\n  ServerErrorMiddleware?: CoreServerErrorMiddlewareStatic;\n}\n\n// Global dependencies container\nlet _dependencies: CoreDependencies = {};\n\n/**\n * Set core dependencies (called by entry points)\n *\n * @example\n * ```typescript\n * // entry-backend.ts\n * import { DbService } from './services/DbService';\n * import { CacheService } from './services/CacheService';\n *\n * setCoreDependencies({\n *   DbService,\n *   CacheService,\n * });\n * ```\n */\nexport function setCoreDependencies(deps: CoreDependencies): void {\n  _dependencies = { ..._dependencies, ...deps };\n}\n\n/**\n * Get core dependencies\n */\nexport function getCoreDependencies(): CoreDependencies {\n  return _dependencies;\n}\n\n/**\n * Check if a dependency is available\n */\nexport function hasCoreDependency(key: keyof CoreDependencies): boolean {\n  return _dependencies[key] !== undefined;\n}\n\n/**\n * Get a specific dependency\n */\nexport function getCoreDependency<K extends keyof CoreDependencies>(\n  key: K\n): CoreDependencies[K] | undefined {\n  return _dependencies[key];\n}\n\n/**\n * Clear all dependencies (useful for testing)\n */\nexport function clearCoreDependencies(): void {\n  _dependencies = {};\n}\n","/**\n * Hash Utilities\n *\n * Common hashing functions for consistent data distribution and rollouts.\n *\n * @fileoverview Hash utility functions\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS, FNV_CONSTANTS, HASH_SEED_CONSTANTS } from '@plyaz/config';\n\n/**\n * Optimized string hashing function for consistent distribution.\n * Uses FNV-1a hash algorithm for better distribution and performance.\n * FNV-1a provides excellent avalanche properties and is faster than\n * polynomial rolling hash for short to medium strings.\n *\n * @param str - String to hash\n * @returns Positive hash value\n *\n * @example\n * ```typescript\n * const hash = hashString('user123:AUTH_GOOGLE');\n * const bucket = hash % 100; // 0-99\n * ```\n *\n * @remarks\n * FNV-1a algorithm benefits:\n * - Excellent distribution for hash tables\n * - Fast computation with minimal operations\n * - Good avalanche effect (small input changes create large output changes)\n * - Consistent timing reduces timing attack vulnerabilities\n */\nexport function hashString(str: string): number {\n  // Handle empty string edge case early\n  if (str.length === 0) return 0;\n\n  // Use FNV-1a constants from config\n  let hash: number = FNV_CONSTANTS.FNV_32_OFFSET;\n\n  // Process string with FNV-1a algorithm\n  // Using charCodeAt is faster than alternatives and handles Unicode correctly\n  for (let i = 0; i < str.length; i++) {\n    // XOR with byte value then multiply by prime\n    // This order (XOR first) is what makes it FNV-1a vs FNV-1\n    hash ^= str.charCodeAt(i);\n    hash = Math.imul(hash, FNV_CONSTANTS.FNV_32_PRIME) >>> 0; // Ensure 32-bit unsigned\n  }\n\n  // Ensure positive value using >>> 0 for unsigned 32-bit conversion\n  // This is more efficient than Math.abs() and handles edge cases better\n  return hash >>> 0;\n}\n\n/**\n * Determines if a user should be included in a rollout based on percentage.\n * Uses consistent hashing to ensure the same user always gets the same result.\n *\n * @param identifier - Unique identifier for consistency (e.g., userId, flagKey)\n * @param percentage - Rollout percentage (0-100)\n * @returns true if identifier should be included in rollout\n *\n * @example\n * ```typescript\n * const shouldInclude = isInRollout('user123:AUTH_GOOGLE', 25); // 25% rollout\n * ```\n */\nexport function isInRollout(identifier: string, percentage: number): boolean {\n  if (percentage >= MATH_CONSTANTS.PERCENTAGE_MAX) return true;\n  if (percentage <= 0) return false;\n\n  const hash = hashString(identifier);\n  return hash % MATH_CONSTANTS.PERCENTAGE_MAX < percentage;\n}\n\n/**\n * Creates a consistent rollout identifier for a user and feature.\n *\n * @param featureKey - Feature or flag key\n * @param userId - User identifier (defaults to 'anonymous')\n * @returns Consistent identifier for rollout calculations\n *\n * @example\n * ```typescript\n * const identifier = createRolloutIdentifier('AUTH_GOOGLE', 'user123');\n * const inRollout = isInRollout(identifier, 50);\n * ```\n */\nexport function createRolloutIdentifier(featureKey: string, userId?: string): string {\n  const trimmedUserId = userId?.trim();\n  const effectiveUserId = trimmedUserId && trimmedUserId.length > 0 ? trimmedUserId : 'anonymous';\n  return `${featureKey}:${effectiveUserId}`;\n}\n\n/**\n * Hash-based utilities for consistent data operations.\n */\nexport const HashUtils = {\n  /**\n   * Generates a hash-based bucket for load balancing or distribution.\n   *\n   * @param identifier - Unique identifier\n   * @param bucketCount - Number of buckets (default: 10)\n   * @returns Bucket number (0 to bucketCount-1)\n   */\n  getBucket: (identifier: string, bucketCount: number = 10): number => {\n    return hashString(identifier) % bucketCount;\n  },\n\n  /**\n   * Checks if an identifier falls within a specific bucket range.\n   *\n   * @param identifier - Unique identifier\n   * @param startBucket - Starting bucket (inclusive)\n   * @param endBucket - Ending bucket (inclusive)\n   * @param totalBuckets - Total number of buckets (default: 100)\n   * @returns true if identifier is in the bucket range\n   */\n  isInBucketRange: (\n    identifier: string,\n    startBucket: number,\n    endBucket: number,\n    totalBuckets: number = MATH_CONSTANTS.PERCENTAGE_MAX\n  ): boolean => {\n    const bucket = hashString(identifier) % totalBuckets;\n    return bucket >= startBucket && bucket <= endBucket;\n  },\n\n  /**\n   * Creates a deterministic random seed from a string.\n   * Uses the improved hash function and ensures the seed is within\n   * the safe range for JavaScript's Math.random seeding.\n   *\n   * @param str - String to convert to seed\n   * @returns Deterministic seed value (0 to 2^31-1)\n   */\n  createSeed: (str: string): number => {\n    // Use constant from config for consistency\n    return hashString(str) % HASH_SEED_CONSTANTS.MAX_SAFE_SEED;\n  },\n} as const;\n","/**\n * ID Generation Utilities\n *\n * Provides consistent ID generation across the application.\n * Uses globalThis.crypto when available, with a fallback for environments without it.\n *\n * @fileoverview ID generation utility functions\n */\n\n// Constants for ID generation\nconst RANDOM_ID_RADIX = 36;\nconst RANDOM_ID_SLICE_START = 2;\nconst SHORT_ID_LENGTH = 8;\nconst HEX_RADIX = 16;\nconst HEX_SLICE_START = 2;\nconst HEX_SLICE_END = 18;\nconst SPAN_ID_LENGTH = 16;\n\n/**\n * Generate a UUID v4 string.\n * Uses crypto.randomUUID when available, otherwise falls back to a timestamp-based ID.\n *\n * @returns A UUID v4 string or fallback ID\n *\n * @example\n * ```typescript\n * const id = generateId();\n * // => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' (crypto available)\n * // => '1701475200000-x7k9m2' (fallback)\n * ```\n */\nexport function generateId(): string {\n  const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n  if (cryptoApi?.randomUUID) {\n    return cryptoApi.randomUUID();\n  }\n  return `${Date.now()}-${Math.random().toString(RANDOM_ID_RADIX).slice(RANDOM_ID_SLICE_START)}`;\n}\n\n/**\n * Generate a short random ID (8 characters).\n * Useful for correlation IDs, short references, etc.\n *\n * @returns A short random string\n *\n * @example\n * ```typescript\n * const shortId = generateShortId();\n * // => 'x7k9m2ab'\n * ```\n */\nexport function generateShortId(): string {\n  const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n  if (cryptoApi?.randomUUID) {\n    return cryptoApi.randomUUID().replace(/-/g, '').slice(0, SHORT_ID_LENGTH);\n  }\n  return Math.random()\n    .toString(RANDOM_ID_RADIX)\n    .slice(RANDOM_ID_SLICE_START, RANDOM_ID_SLICE_START + SHORT_ID_LENGTH);\n}\n\n/**\n * Generate a correlation ID for tracing.\n * Format: timestamp-randomString\n *\n * @returns A correlation ID string\n *\n * @example\n * ```typescript\n * const correlationId = generateCorrelationId();\n * // => '1701475200000-x7k9m2'\n * ```\n */\nexport function generateCorrelationId(): string {\n  return `${Date.now()}-${generateShortId()}`;\n}\n\n/**\n * Generate a trace ID for distributed tracing (32 hex characters / 128 bits).\n *\n * @returns A 32-character hex string\n *\n * @example\n * ```typescript\n * const traceId = generateTraceId();\n * // => 'a1b2c3d4e5f67890abcdef1234567890'\n * ```\n */\nexport function generateTraceId(): string {\n  const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n  if (cryptoApi?.randomUUID) {\n    // Use two UUIDs without dashes to get 64 hex chars, take first 32\n    return cryptoApi.randomUUID().replace(/-/g, '');\n  }\n  // Fallback: concatenate two random hex strings\n  return (\n    Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END) +\n    Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END)\n  );\n}\n\n/**\n * Generate a span ID for distributed tracing (16 hex characters / 64 bits).\n *\n * @returns A 16-character hex string\n *\n * @example\n * ```typescript\n * const spanId = generateSpanId();\n * // => 'a1b2c3d4e5f67890'\n * ```\n */\nexport function generateSpanId(): string {\n  const cryptoApi = globalThis.crypto as { randomUUID?: () => string } | undefined;\n  if (cryptoApi?.randomUUID) {\n    // Use UUID without dashes, take first 16 chars\n    return cryptoApi.randomUUID().replace(/-/g, '').substring(0, SPAN_ID_LENGTH);\n  }\n  // Fallback: random hex string\n  return Math.random().toString(HEX_RADIX).substring(HEX_SLICE_START, HEX_SLICE_END);\n}\n\n/**\n * UUID v4 regex pattern.\n * Matches standard UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n */\nconst UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n/**\n * Check if a string is a valid UUID v4.\n *\n * @param value - The string to check\n * @returns true if the string is a valid UUID\n *\n * @example\n * ```typescript\n * isValidUUID('a1b2c3d4-e5f6-4890-abcd-ef1234567890'); // true\n * isValidUUID('not-a-uuid'); // false\n * isValidUUID('bulk-upload-123456'); // false\n * ```\n */\nexport function isValidUUID(value: string | null | undefined): boolean {\n  if (!value) return false;\n  return UUID_REGEX.test(value);\n}\n\n/**\n * ID generation utilities object for convenient access.\n */\nexport const IdUtils = {\n  generate: generateId,\n  generateShort: generateShortId,\n  generateCorrelation: generateCorrelationId,\n  generateTraceId,\n  generateSpanId,\n  isValidUUID,\n} as const;\n","/* eslint-disable complexity */\n/**\n * Value Utilities\n *\n * Common utility functions for working with different value types.\n *\n * @fileoverview Value manipulation utilities\n * @version 1.0.0\n */\n\nimport { MATH_CONSTANTS } from '@plyaz/config';\n\n/**\n * Determines if a value should be considered 'truthy' for feature flags.\n * More strict than JavaScript's built-in truthiness.\n *\n * @param value - The value to check\n * @returns true if the value is considered enabled/truthy\n *\n * @example\n * ```typescript\n * isTruthy(true)        // true\n * isTruthy('enabled')   // true\n * isTruthy('')          // false\n * isTruthy('false')     // false\n * isTruthy(0)           // false\n * isTruthy(42)          // true\n * isTruthy({})          // false\n * ```\n */\n// Helper function to check if a string is falsy\nfunction isStringFalsy(value: string): boolean {\n  if (value === '') return true;\n  const lower = value.toLowerCase().trim();\n  return ['false', 'no', '0', 'off', 'disabled'].includes(lower);\n}\n\n// Helper function to check if an object is truthy\nfunction isObjectTruthy(value: object): boolean {\n  if (Array.isArray(value)) return value.length > 0;\n  if (value instanceof Map || value instanceof Set) return value.size > 0;\n  if (value.constructor === Object) return Object.keys(value).length > 0;\n  return true; // All other objects (Date, RegExp, etc) are truthy\n}\n\nexport function isTruthy(value: unknown): boolean {\n  if (value === null || value === undefined) return false;\n\n  switch (typeof value) {\n    case 'boolean':\n      return value;\n    case 'string':\n      return !isStringFalsy(value);\n    case 'number':\n      return value !== 0 && !isNaN(value);\n    case 'function':\n    case 'symbol':\n      return true;\n    case 'object':\n      return isObjectTruthy(value);\n    default:\n      return false;\n  }\n}\n\n/**\n * Safely converts a value to a boolean with feature flag semantics.\n *\n * @param value - Value to convert\n * @param defaultValue - Default if conversion fails (default: false)\n * @returns Boolean representation\n *\n * @example\n * ```typescript\n * toBoolean('true')     // true\n * toBoolean('yes')      // true\n * toBoolean('1')        // true\n * toBoolean('false')    // false\n * toBoolean('no')       // false\n * toBoolean('0')        // false\n * ```\n */\n// Helper function to parse string to boolean\nfunction parseStringToBoolean(value: string, defaultValue: boolean): boolean {\n  const lower = value.toLowerCase();\n  if (['true', 'yes', '1', 'on', 'enabled'].includes(lower)) return true;\n  if (['false', 'no', '0', 'off', 'disabled'].includes(lower)) return false;\n  return defaultValue;\n}\n\nexport function toBoolean(value: unknown, defaultValue: boolean = false): boolean {\n  if (value === null || value === undefined) return false;\n\n  switch (typeof value) {\n    case 'boolean':\n      return value;\n    case 'string':\n      return parseStringToBoolean(value, defaultValue);\n    case 'number':\n      return value !== 0 && !isNaN(value);\n    case 'object':\n    case 'function':\n      return true;\n    default:\n      return defaultValue;\n  }\n}\n\n/**\n * Safely converts a value to a number.\n * Handles bigint, string, and number types.\n *\n * @param value - Value to convert (bigint, number, or string)\n * @param defaultValue - Default if conversion fails (default: 0)\n * @returns Number representation\n *\n * @example\n * ```typescript\n * toNumber(42)              // 42\n * toNumber(BigInt(100))     // 100\n * toNumber('123')           // 123\n * toNumber('invalid')       // 0 (default)\n * toNumber('invalid', -1)   // -1 (custom default)\n * ```\n */\nexport function toNumber(\n  value: bigint | number | string | unknown,\n  defaultValue: number = 0\n): number {\n  if (value === null || value === undefined) return defaultValue;\n\n  if (typeof value === 'bigint') return Number(value);\n  if (typeof value === 'number') return isNaN(value) ? defaultValue : value;\n  if (typeof value === 'string') {\n    const parsed = Number.parseFloat(value);\n    return isNaN(parsed) ? defaultValue : parsed;\n  }\n\n  return defaultValue;\n}\n\n/**\n * Value validation and conversion utilities.\n */\nexport const ValueUtils = {\n  /**\n   * Checks if a value is a valid percentage (0-100).\n   *\n   * @param value - Value to check\n   * @returns true if valid percentage\n   */\n  isValidPercentage: (value: unknown): boolean => {\n    if (typeof value !== 'number') return false;\n    return !isNaN(value) && isFinite(value) && value >= 0 && value <= MATH_CONSTANTS.PERCENTAGE_MAX;\n  },\n\n  /**\n   * Clamps a number to a specific range.\n   *\n   * @param value - Value to clamp\n   * @param min - Minimum value\n   * @param max - Maximum value\n   * @returns Clamped value\n   */\n  clamp: (value: number, min: number, max: number): number => {\n    return Math.min(Math.max(value, min), max);\n  },\n\n  /**\n   * Checks if a value is empty (null, undefined, empty string, empty array).\n   *\n   * @param value - Value to check\n   * @returns true if empty\n   */\n  isEmpty: (value: unknown): boolean => {\n    if (value === null || value === undefined) return true;\n    if (typeof value === 'string') return value.trim() === '';\n    if (Array.isArray(value)) return value.length === 0;\n    if (typeof value === 'object') return Object.keys(value).length === 0;\n    return false;\n  },\n\n  /**\n   * Safely gets a nested property from an object.\n   *\n   * @param obj - Object to query\n   * @param path - Dot-separated path (e.g., 'user.profile.name')\n   * @param defaultValue - Default if path doesn't exist\n   * @returns Property value or default\n   */\n  getNestedProperty: (obj: unknown, path: string, defaultValue?: unknown): unknown => {\n    if (!obj || typeof obj !== 'object') return defaultValue;\n\n    const keys = path.split('.');\n    let current: unknown = obj;\n\n    for (const key of keys) {\n      if (current == null || typeof current !== 'object') return defaultValue;\n      current = (current as Record<string, unknown>)[key];\n      if (current === undefined) return defaultValue;\n    }\n\n    return current;\n  },\n} as const;\n","/**\n * Object Utilities\n *\n * Provides utilities for working with nested object paths and property access.\n *\n * @fileoverview Object manipulation utilities\n */\n\n/**\n * Sets a value at a nested path in an object, creating intermediate objects as needed.\n *\n * @param obj - The target object to modify\n * @param path - Dot-separated path to the property (e.g., 'user.profile.name')\n * @param value - The value to set at the path\n *\n * @example\n * ```typescript\n * const obj = { user: { id: 1 } };\n * setNestedProperty(obj, 'user.profile.name', 'John');\n * // Result: { user: { id: 1, profile: { name: 'John' } } }\n * ```\n */\nexport function setNestedProperty(\n  obj: Record<string, unknown>,\n  path: string,\n  value: unknown\n): void {\n  const keys = path.split('.');\n  let current: Record<string, unknown> = obj;\n\n  // Navigate to the parent object, creating intermediate objects as needed\n  for (let i = 0; i < keys.length - 1; i++) {\n    const key = keys[i];\n    if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {\n      current[key] = {};\n    }\n    current = current[key] as Record<string, unknown>;\n  }\n\n  // Set the final property\n  const finalKey = keys[keys.length - 1];\n  current[finalKey] = value;\n}\n\n/**\n * Gets a value at a nested path in an object.\n *\n * @param obj - The source object to read from\n * @param path - Dot-separated path to the property (e.g., 'user.profile.name')\n * @param defaultValue - Optional default value if the path doesn't exist\n * @returns The value at the path, or defaultValue if not found\n *\n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * getNestedProperty(obj, 'user.profile.name'); // 'John'\n * getNestedProperty(obj, 'user.settings.theme', 'dark'); // 'dark' (default)\n * ```\n */\nexport function getNestedProperty<T = unknown>(\n  obj: Record<string, unknown>,\n  path: string,\n  defaultValue?: T\n): T | undefined {\n  const keys = path.split('.');\n  let current: unknown = obj;\n\n  // Navigate through the path\n  for (const key of keys) {\n    if (current === null || current === undefined || typeof current !== 'object') {\n      return defaultValue;\n    }\n    current = (current as Record<string, unknown>)[key];\n  }\n\n  return current !== undefined ? (current as T) : defaultValue;\n}\n\n/**\n * Checks if a nested path exists in an object.\n *\n * @param obj - The object to check\n * @param path - Dot-separated path to check (e.g., 'user.profile.name')\n * @returns True if the path exists and is not undefined\n *\n * @example\n * ```typescript\n * const obj = { user: { profile: { name: 'John' } } };\n * hasNestedProperty(obj, 'user.profile.name'); // true\n * hasNestedProperty(obj, 'user.settings.theme'); // false\n * ```\n */\nexport function hasNestedProperty(obj: Record<string, unknown>, path: string): boolean {\n  const keys = path.split('.');\n  let current: unknown = obj;\n\n  for (const key of keys) {\n    if (current === null || current === undefined || typeof current !== 'object') {\n      return false;\n    }\n    if (!(key in (current as Record<string, unknown>))) {\n      return false;\n    }\n    current = (current as Record<string, unknown>)[key];\n  }\n\n  return current !== undefined;\n}\n\n/**\n * Object utilities namespace for convenient grouped access.\n *\n * @example\n * ```typescript\n * import { ObjectUtils } from '@plyaz/core/utils';\n *\n * ObjectUtils.setNestedProperty(obj, 'user.name', 'John');\n * const name = ObjectUtils.getNestedProperty(obj, 'user.name');\n * ```\n */\nexport const ObjectUtils = {\n  setNestedProperty,\n  getNestedProperty,\n  hasNestedProperty,\n} as const;\n","/**\n * Type Guards Utilities\n *\n * Common type guard functions for runtime type checking.\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Generic Type Guards\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Check if value is a non-null object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null;\n}\n\n/**\n * Check if object has a specific property\n */\nexport function hasProperty<K extends string>(obj: unknown, key: K): obj is Record<K, unknown> {\n  return isObject(obj) && key in obj;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Type Guard Utilities Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Type guard utilities grouped in a class for namespaced access\n */\nexport const TypeGuardUtils = {\n  isObject,\n  hasProperty,\n} as const;\n","/**\n * Time Utilities\n *\n * Utility functions for time-related operations.\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config/time';\n\n/**\n * Check if current time is within quiet hours.\n *\n * @param quietHoursStart - Start time in HH:MM format\n * @param quietHoursEnd - End time in HH:MM format\n * @param timezone - Timezone string (default: 'UTC')\n * @returns true if currently in quiet hours\n *\n * @example\n * ```typescript\n * // Check if 22:00 - 08:00 quiet hours are active\n * const inQuietHours = isInQuietHours('22:00', '08:00', 'America/New_York');\n * ```\n */\nexport function isInQuietHours(\n  quietHoursStart: string | null | undefined,\n  quietHoursEnd: string | null | undefined,\n  timezone: string = 'UTC'\n): boolean {\n  if (!quietHoursStart || !quietHoursEnd) return false;\n\n  try {\n    const now = new Date();\n    const formatter = new Intl.DateTimeFormat('en-US', {\n      timeZone: timezone,\n      hour: '2-digit',\n      minute: '2-digit',\n      hour12: false,\n    });\n    const parts = formatter.formatToParts(now);\n    const hour = Number.parseInt(parts.find(p => p.type === 'hour')?.value ?? '0', 10);\n    const minute = Number.parseInt(parts.find(p => p.type === 'minute')?.value ?? '0', 10);\n    const currentMinutes = hour * TIME_CONSTANTS.MINUTES_PER_HOUR + minute;\n\n    const [startHour, startMinute] = quietHoursStart.split(':').map(Number);\n    const [endHour, endMinute] = quietHoursEnd.split(':').map(Number);\n    const startMinutes = startHour * TIME_CONSTANTS.MINUTES_PER_HOUR + startMinute;\n    const endMinutes = endHour * TIME_CONSTANTS.MINUTES_PER_HOUR + endMinute;\n\n    // Handle overnight quiet hours (e.g., 22:00 - 08:00)\n    if (startMinutes > endMinutes) {\n      return currentMinutes >= startMinutes || currentMinutes < endMinutes;\n    }\n    return currentMinutes >= startMinutes && currentMinutes < endMinutes;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Check if a campaign is expired based on start date and duration\n */\nexport function isCampaignExpired(\n  startDate: Date | undefined,\n  duration: number | undefined\n): boolean {\n  if (!startDate || !duration) return false;\n  const endDate = new Date(startDate.getTime() + duration * TIME_CONSTANTS.DAY);\n  return new Date() > endDate;\n}\n\n/**\n * Calculate remaining days for a campaign\n */\nexport function getCampaignDaysRemaining(\n  startDate: Date | undefined,\n  duration: number | undefined\n): number {\n  if (!startDate || !duration) return 0;\n  const endDate = new Date(startDate.getTime() + duration * TIME_CONSTANTS.DAY);\n  const now = new Date();\n  const diffTime = endDate.getTime() - now.getTime();\n  return Math.max(0, Math.ceil(diffTime / TIME_CONSTANTS.DAY));\n}\n\n/** Time utilities namespace */\nexport const TimeUtils = {\n  isInQuietHours,\n  isCampaignExpired,\n  getCampaignDaysRemaining,\n} as const;\n","/**\n * Validation Utility Functions\n */\n\nimport { FEATURE_FLAG_PROVIDERS } from '@plyaz/types';\n\n/**\n * Type guard to check if value is string\n */\nexport const isString = (value: unknown): value is string => typeof value === 'string';\n\n/**\n * Type guard to check if value is defined (not undefined)\n */\nexport const isDefined = <T>(value: T | undefined): value is T => value !== undefined;\n\n/**\n * Type guard to check if value is number\n */\nexport const isNumber = (value: unknown): value is number => typeof value === 'number';\n\n/**\n * Helper function to get all valid provider types as array\n */\nexport const getValidProviders = (): string[] => Object.values(FEATURE_FLAG_PROVIDERS);\n","/**\n * Common Utilities - Main Export\n *\n * Exports all common utility functions that can be reused across the application.\n *\n * @fileoverview Common utilities export\n */\n\n// Hash utilities for consistent distribution and rollouts\nexport { hashString, isInRollout, createRolloutIdentifier, HashUtils } from './hash';\n\n// ID generation utilities\nexport {\n  generateId,\n  generateShortId,\n  generateCorrelationId,\n  generateTraceId,\n  generateSpanId,\n  isValidUUID,\n  IdUtils,\n} from './id';\n\n// Value utilities for type conversion and validation\nexport { isTruthy, toBoolean, toNumber, ValueUtils } from './values';\n\n// Object utilities for nested property access\nexport { setNestedProperty, getNestedProperty, hasNestedProperty, ObjectUtils } from './object';\n\n// Type guard utilities\nexport { isObject, hasProperty, TypeGuardUtils } from './typeGuards';\n\n// Time utilities\nexport { isInQuietHours, TimeUtils } from './time';\n\nexport * from './validation';\n","/**\n * Core Event Manager\n *\n * Type-safe event system for the Plyaz ecosystem.\n * Services emit events → Store, API cache, and UI subscribe independently.\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe emission (using CORE_EVENTS constants)\n * CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, {\n *   method: 'GET',\n *   url: '/api/users',\n *   requestId: '123',\n *   error: new Error('Failed'),\n *   duration: 500,\n * });\n *\n * // Type-safe subscription\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n *   console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom events (with generic type)\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\nimport { EventEmitter } from 'events';\nimport type { CoreEventPayloadMap, CoreEventScopeType, CoreEvent } from '@plyaz/types/core';\nimport { generateCorrelationId } from '../utils/common';\n\n/**\n * Core Event Manager\n *\n * Features:\n * - Type-safe event emission and subscription via CORE_EVENTS constants\n * - Scope-based event filtering\n * - Wildcard subscriptions\n * - Auto cleanup on dispose\n * - Correlation IDs for tracing\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS } from '@plyaz/core/events';\n *\n * // Type-safe with CORE_EVENTS\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, {\n *   userId: '123',\n *   method: 'email',\n * });\n *\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n *   console.log(event.data.userId); // Typed as string!\n * });\n *\n * // Custom events with explicit type\n * interface MyPayload { custom: string }\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\n\n// Constants\nconst MAX_EVENT_LISTENERS = 100;\n\nclass CoreEventManagerClass {\n  private emitter = new EventEmitter();\n  private subscriptions = new Map<string, Set<(event: CoreEvent<unknown, string>) => void>>();\n\n  constructor() {\n    // Increase max listeners for large apps\n    this.emitter.setMaxListeners(MAX_EVENT_LISTENERS);\n  }\n\n  /**\n   * Emit an event\n   *\n   * @param eventType - Event type from CORE_EVENTS or custom string\n   * @param data - Event payload (type-safe when using CORE_EVENTS)\n   *\n   * @example\n   * ```typescript\n   * // Type-safe with CORE_EVENTS\n   * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, { userId: '123', method: 'email' });\n   *\n   * // Custom event\n   * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n   * ```\n   */\n  emit<T extends keyof CoreEventPayloadMap>(eventType: T, data: CoreEventPayloadMap[T]): boolean;\n  emit<TData = unknown>(eventType: string, data?: TData): boolean;\n  emit<TData = unknown>(eventType: string, data?: TData): boolean {\n    const [scope] = eventType.split(':');\n    const event: CoreEvent<TData, string> = {\n      type: eventType,\n      scope: scope ?? 'system',\n      timestamp: Date.now(),\n      correlationId: this.getCorrelationId(),\n      data: data as TData,\n    };\n\n    // Emit to specific listeners\n    this.emitter.emit(eventType, event);\n\n    // Emit to wildcard listeners\n    this.emitter.emit('*', event);\n\n    return true;\n  }\n\n  /**\n   * Subscribe to an event\n   *\n   * @param eventType - Event type from CORE_EVENTS or custom string\n   * @param handler - Event handler (type-safe when using CORE_EVENTS)\n   * @returns Unsubscribe function\n   *\n   * @example\n   * ```typescript\n   * // Type-safe with CORE_EVENTS\n   * const unsub = CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n   *   console.log(event.data.userId); // Typed!\n   * });\n   *\n   * // Custom event\n   * CoreEventManager.on<MyPayload>('custom:event', (event) => {\n   *   console.log(event.data.custom);\n   * });\n   * ```\n   */\n  on<T extends keyof CoreEventPayloadMap>(\n    eventType: T,\n    handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n  ): () => void;\n  on<TData = unknown, TScope extends string = string>(\n    eventType: string,\n    handler: (event: CoreEvent<TData, TScope>) => void\n  ): () => void;\n  on<TData = unknown, TScope extends string = string>(\n    eventType: string,\n    handler: (event: CoreEvent<TData, TScope>) => void\n  ): () => void {\n    this.emitter.on(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n\n    // Track for cleanup\n    if (!this.subscriptions.has(eventType)) {\n      this.subscriptions.set(eventType, new Set());\n    }\n    this.subscriptions.get(eventType)!.add(handler as (event: CoreEvent<unknown, string>) => void);\n\n    // Return unsubscribe function\n    return () => {\n      this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n      this.subscriptions\n        .get(eventType)\n        ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n    };\n  }\n\n  /**\n   * Subscribe once to an event\n   *\n   * @param eventType - Event type from CORE_EVENTS or custom string\n   * @param handler - Event handler\n   * @returns Unsubscribe function\n   */\n  once<T extends keyof CoreEventPayloadMap>(\n    eventType: T,\n    handler: (event: CoreEvent<CoreEventPayloadMap[T], CoreEventScopeType>) => void\n  ): () => void;\n  once<TData = unknown, TScope extends string = string>(\n    eventType: string,\n    handler: (event: CoreEvent<TData, TScope>) => void\n  ): () => void;\n  once<TData = unknown, TScope extends string = string>(\n    eventType: string,\n    handler: (event: CoreEvent<TData, TScope>) => void\n  ): () => void {\n    const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n      handler(event);\n      this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n      this.subscriptions\n        .get(eventType)\n        ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n    };\n\n    this.emitter.on(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n    // Track for cleanup\n    if (!this.subscriptions.has(eventType)) {\n      this.subscriptions.set(eventType, new Set());\n    }\n    this.subscriptions\n      .get(eventType)!\n      .add(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n\n    // Return unsubscribe function\n    return () => {\n      this.emitter.off(eventType, wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n      this.subscriptions\n        .get(eventType)\n        ?.delete(wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n    };\n  }\n\n  /**\n   * Subscribe to all events in a scope\n   *\n   * @param scope - Event scope to listen to (e.g., CoreEventScope.AUTH)\n   * @param handler - Event handler\n   * @returns Unsubscribe function\n   *\n   * @example\n   * ```typescript\n   * CoreEventManager.onScope(CoreEventScope.AUTH, (event) => {\n   *   // Handles auth:login, auth:logout, auth:tokenRefresh, etc.\n   *   console.log(`Auth event: ${event.type}`, event.data);\n   * });\n   * ```\n   */\n  onScope<TScope extends string = string, TData = unknown>(\n    scope: TScope,\n    handler: (event: CoreEvent<TData, TScope>) => void\n  ): () => void {\n    const wrappedHandler = (event: CoreEvent<TData, TScope>): void => {\n      if (event.scope === scope) {\n        handler(event);\n      }\n    };\n    return this.on('*', wrappedHandler as (event: CoreEvent<unknown, string>) => void);\n  }\n\n  /**\n   * Remove a specific handler from an event\n   *\n   * @param eventType - Event type\n   * @param handler - Handler to remove\n   */\n  off<TData = unknown, TScope extends string = string>(\n    eventType: string,\n    handler: (event: CoreEvent<TData, TScope>) => void\n  ): void {\n    this.emitter.off(eventType, handler as (event: CoreEvent<unknown, string>) => void);\n    this.subscriptions\n      .get(eventType)\n      ?.delete(handler as (event: CoreEvent<unknown, string>) => void);\n  }\n\n  /**\n   * Dispose all subscriptions\n   */\n  dispose(): void {\n    this.subscriptions.forEach((handlers, eventType) => {\n      handlers.forEach(handler => this.emitter.off(eventType, handler));\n    });\n    this.subscriptions.clear();\n    this.emitter.removeAllListeners();\n  }\n\n  /**\n   * Generate correlation ID for event tracing\n   */\n  private getCorrelationId(): string {\n    return generateCorrelationId();\n  }\n}\n\n/**\n * Global Singleton Pattern using globalThis\n *\n * WHY THIS IS NEEDED:\n * In Next.js (and similar frameworks with module isolation), different parts of the application\n * can have separate module instances. For example:\n * - API routes may run in isolated module contexts\n * - Hot Module Replacement (HMR) during development creates new module instances\n * - Server Components vs API routes may have different module caches\n *\n * This causes a critical issue: if CoreEventManager is instantiated as a simple module-level\n * singleton (`export const X = new XClass()`), each isolated context gets its OWN instance.\n * Events emitted in one context (e.g., API route) won't reach listeners in another context\n * (e.g., streaming endpoints).\n *\n * THE SOLUTION:\n * Using `globalThis` with `Symbol.for()` ensures a TRUE singleton across all module boundaries:\n * - `globalThis` is the global object in any JavaScript environment (Node.js, browsers, workers)\n * - `Symbol.for('key')` returns the SAME symbol from the global symbol registry, even across\n *   different module instances\n * - This combination guarantees ONE instance per process, regardless of how many times the\n *   module is loaded\n *\n * WORKS WITH:\n * - Next.js (API routes, server components, middleware)\n * - Express/NestJS/Fastify (single process, but safe for hot reload)\n * - Bun/Deno (same globalThis semantics)\n *\n * DOES NOT HELP WITH:\n * - Truly isolated serverless functions (each invocation = new process)\n * - Multi-process clusters (need Redis pub/sub or similar for cross-process events)\n */\nconst GLOBAL_KEY = Symbol.for('plyaz.CoreEventManager');\n\nfunction getCoreEventManager(): CoreEventManagerClass {\n  const globalAny = globalThis as unknown as { [key: symbol]: CoreEventManagerClass };\n\n  if (!globalAny[GLOBAL_KEY]) {\n    globalAny[GLOBAL_KEY] = new CoreEventManagerClass();\n  }\n\n  return globalAny[GLOBAL_KEY];\n}\n\nexport const CoreEventManager = getCoreEventManager();\n","/**\n * API Client Singleton Service (@plyaz/core)\n * Manages the API client with environment-specific configurations and intelligent defaults\n *\n * The app reads process.env and constructs ApiClientOptions, then passes to this service.\n * Service never touches process.env directly - all env reading happens in the app layer.\n *\n * @module services/ApiClientService\n */\n\n// Imports from @plyaz/api (dependency)\nimport { createApiClient, mergeConfigs, setDefaultApiClient } from '@plyaz/api/frontend';\nimport type { ApiClientWithEvents, ApiClientOptions, ApiConfig } from '@plyaz/types/api';\nimport { type ClientEventManager, type EndpointsList, ApiPackageError } from '@plyaz/api/frontend';\nimport { PRODUCTION_CONFIG, STAGING_CONFIG, DEVELOPMENT_CONFIG } from '@plyaz/config';\nimport {\n  API_ERROR_CODES,\n  PACKAGE_STATUS_CODES,\n  OPERATIONS,\n  ERROR_CODES,\n  ERROR_CATEGORY,\n  HTTP_STATUS,\n  CORE_EVENTS,\n} from '@plyaz/types';\nimport type { CoreApiRequestErrorPayload, CoreApiEnvironmentConfig } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { generateRequestId } from '@plyaz/errors';\nimport type { ResponseError } from 'fetchff';\n// Note: Root store is injected by Core.initialize(), not created here\n\n/**\n * Minimum retry attempts recommended for production environments\n *\n * Production services should have sufficient retries to handle transient failures\n * while maintaining acceptable response times for end users.\n *\n * @constant\n * @default 3\n */\nconst MIN_RETRY_ATTEMPTS_PRODUCTION = 3;\n\n/**\n * Get configuration based on environment\n *\n * Returns environment-specific defaults that will be merged with user configuration.\n * Each environment has optimized settings for its use case:\n *\n * - **Production**: Aggressive retries (5), encryption required, telemetry enabled\n * - **Staging**: Mirrors production for accurate pre-deployment testing\n * - **Development/Test**: Conservative retries (1), encryption optional, full debug mode\n *\n * These defaults come from `@plyaz/config` and can be overridden via the `apiConfig` parameter.\n *\n * @param env - Environment name determining which defaults to apply\n * @returns Environment-specific configuration from @plyaz/config\n *\n * @example\n * ```typescript\n * const prodDefaults = getConfigForEnvironment('production');\n * // Returns PRODUCTION_CONFIG with aggressive retries, encryption, etc.\n *\n * const devDefaults = getConfigForEnvironment('development');\n * // Returns DEVELOPMENT_CONFIG with conservative retries, no encryption\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.env} - Environment types\n * @internal\n */\nfunction getConfigForEnvironment(env: CoreApiEnvironmentConfig['env']): Partial<ApiConfig> {\n  switch (env) {\n    case 'production':\n      return PRODUCTION_CONFIG as Partial<ApiConfig>;\n    case 'staging':\n      return STAGING_CONFIG as Partial<ApiConfig>;\n    case 'development':\n    case 'test':\n    default:\n      return DEVELOPMENT_CONFIG as Partial<ApiConfig>;\n  }\n}\n\n/**\n * Validate base URL requirement\n *\n * Ensures that a baseURL is provided in the configuration. The baseURL is mandatory\n * for all API clients as it defines where requests should be sent.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append validation errors to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * validateBaseURL(mergedConfig, errors);\n *\n * if (errors.length > 0) {\n *   // baseURL is missing\n * }\n * ```\n *\n * @internal\n */\nfunction validateBaseURL(mergedConfig: ApiClientOptions, errors: string[]): void {\n  // Allow empty string '' for same-origin requests (e.g., Next.js API routes on same host)\n  // Only require baseURL when it's undefined or null\n  if (mergedConfig.baseURL === undefined || mergedConfig.baseURL === null) {\n    errors.push('baseURL is required in API configuration (apiConfig parameter)');\n  }\n}\n\n/**\n * Validate production encryption configuration\n *\n * Production environments MUST have encryption properly configured to protect sensitive data.\n * This function validates that:\n * - If encryption is enabled, an encryption key MUST be provided\n * - If encryption is disabled, a security warning is issued\n *\n * **Why encryption is required in production**:\n * - Compliance: GDPR, CCPA, PIPL, HIPAA regulations require data protection\n * - Security: Protects PII, payment info, health data, crypto wallet addresses\n * - 50+ sensitive field patterns: email, SSN, card numbers, API keys, etc.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append non-critical warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateProductionEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED when encryption is enabled in production...']\n *\n * // If encryption disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in production...']\n * ```\n *\n * @internal\n */\nfunction validateProductionEncryption(\n  mergedConfig: ApiClientOptions,\n  errors: string[],\n  warnings: string[]\n): void {\n  if (mergedConfig.encryption?.enabled) {\n    if (!mergedConfig.encryption?.key) {\n      errors.push(\n        'encryption.key is REQUIRED when encryption is enabled in production. ' +\n          'Pass it in apiConfig: { encryption: { key: { id: \"prod-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n      );\n    }\n  } else {\n    warnings.push(\n      '[SECURITY WARNING] Encryption is disabled in production. ' +\n        'This is not recommended for handling sensitive data (PII, payment info, etc.).'\n    );\n  }\n}\n\n/**\n * Validate production performance settings\n *\n * Validates production configuration for optimal performance, reliability, and monitoring:\n * - **Network-aware features**: Adapts to varying network conditions for better UX\n * - **Telemetry**: Required for production monitoring and alerting\n * - **Retry attempts**: Minimum 3 retries recommended for reliability\n *\n * These are warnings (not errors) as they don't prevent the client from working,\n * but indicate suboptimal production configuration.\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append performance warnings to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateProductionPerformance(mergedConfig, warnings);\n *\n * // Possible warnings:\n * // - '[PERFORMANCE WARNING] networkAware is disabled in production...'\n * // - '[MONITORING WARNING] telemetry is disabled in production...'\n * // - '[RELIABILITY WARNING] Only 1 retry attempts configured...'\n * ```\n *\n * @internal\n */\nfunction validateProductionPerformance(mergedConfig: ApiClientOptions, warnings: string[]): void {\n  if (!mergedConfig.networkAware?.enabled) {\n    warnings.push(\n      '[PERFORMANCE WARNING] networkAware is disabled in production. ' +\n        'Enable it for better user experience on varying network conditions.'\n    );\n  }\n\n  if (!mergedConfig.tracking?.telemetry) {\n    warnings.push(\n      '[MONITORING WARNING] telemetry is disabled in production. ' +\n        'Enable it for production monitoring and alerting.'\n    );\n  }\n\n  if (\n    mergedConfig.retry &&\n    mergedConfig.retry.attempts !== undefined &&\n    mergedConfig.retry.attempts < MIN_RETRY_ATTEMPTS_PRODUCTION\n  ) {\n    warnings.push(\n      `[RELIABILITY WARNING] Only ${mergedConfig.retry.attempts} retry attempts configured. ` +\n        'Consider increasing to 3-5 for better reliability in production.'\n    );\n  }\n}\n\n/**\n * Validate staging encryption configuration\n *\n * Staging environments should mirror production configuration for accurate pre-deployment testing.\n * This function validates:\n * - If encryption is enabled, an encryption key MUST be provided (same as production)\n * - If encryption is disabled, issues a warning (staging should match production)\n * - Telemetry should be enabled to test monitoring before production\n *\n * **Why staging should mirror production**:\n * - Catches configuration issues before they reach production\n * - Tests encryption/decryption with real-world-like data\n * - Validates monitoring and alerting pipelines\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param errors - Error array to append critical validation errors to\n * @param warnings - Warning array to append configuration warnings to\n *\n * @example\n * ```typescript\n * const errors: string[] = [];\n * const warnings: string[] = [];\n *\n * validateStagingEncryption(mergedConfig, errors, warnings);\n *\n * // If encryption enabled but no key:\n * // errors = ['encryption.key is REQUIRED in staging (aligned with production)...']\n *\n * // If encryption or telemetry disabled:\n * // warnings = ['[SECURITY WARNING] Encryption is disabled in staging...']\n * ```\n *\n * @internal\n */\nfunction validateStagingEncryption(\n  mergedConfig: ApiClientOptions,\n  errors: string[],\n  warnings: string[]\n): void {\n  if (mergedConfig.encryption?.enabled) {\n    if (!mergedConfig.encryption?.key) {\n      errors.push(\n        'encryption.key is REQUIRED in staging (aligned with production). ' +\n          'Pass it in apiConfig: { encryption: { key: { id: \"staging-key-v1\", key: process.env.ENCRYPTION_KEY!, algorithm: \"AES-GCM\", format: \"raw\" } } }'\n      );\n    }\n  } else {\n    warnings.push(\n      '[SECURITY WARNING] Encryption is disabled in staging. ' +\n        'Staging should mirror production for accurate testing.'\n    );\n  }\n\n  if (!mergedConfig.tracking?.telemetry) {\n    warnings.push(\n      '[MONITORING WARNING] telemetry is disabled in staging. ' +\n        'Enable it to test monitoring before production deployment.'\n    );\n  }\n}\n\n/**\n * Validate development encryption configuration\n *\n * Development environments have more relaxed requirements to facilitate rapid development:\n * - Encryption is OPTIONAL (enabled flag can be true, but key is not required)\n * - When encryption is enabled without a key, issues an informational warning\n *\n * **Why encryption is optional in development**:\n * - Faster iteration without needing to manage encryption keys\n * - Easier debugging of request/response payloads\n * - Test data typically doesn't contain real sensitive information\n *\n * @param mergedConfig - Merged configuration after applying all defaults\n * @param warnings - Warning array to append informational messages to\n *\n * @example\n * ```typescript\n * const warnings: string[] = [];\n * validateDevelopmentEncryption(mergedConfig, warnings);\n *\n * // If encryption enabled without key:\n * // warnings = ['[DEV INFO] Encryption is enabled but no key provided...']\n * ```\n *\n * @internal\n */\nfunction validateDevelopmentEncryption(mergedConfig: ApiClientOptions, warnings: string[]): void {\n  if (mergedConfig.encryption?.enabled && !mergedConfig.encryption?.key) {\n    warnings.push(\n      '[DEV INFO] Encryption is enabled but no key provided in apiConfig. ' +\n        'Encryption will be skipped in development (this is normal).'\n    );\n  }\n}\n\n/**\n * Map environment metadata to API configuration structure\n *\n * Converts environment-level metadata from `CoreApiEnvironmentConfig` into `ApiConfig` format\n * that can be merged with other configurations. Currently maps:\n *\n * - **apiKey**: Converted to static header `X-API-Key`\n * - **rateLimit**: Reserved for future use (not currently mapped)\n *\n * **Note**: This mapping is applied AFTER environment defaults but BEFORE user-provided\n * apiConfig, giving it medium priority in the configuration merge hierarchy.\n *\n * @param envConfig - Environment configuration containing metadata\n * @param envDefaults - Environment-specific defaults from @plyaz/config\n * @returns Partial API configuration with mapped environment metadata\n *\n * @example\n * ```typescript\n * const envConfig = { env: 'production', apiKey: 'my-api-key' };\n * const envDefaults = PRODUCTION_CONFIG;\n *\n * const mapped = mapEnvironmentMetadata(envConfig, envDefaults);\n * // Returns: { headers: { static: { 'X-API-Key': 'my-api-key' } } }\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig} - Environment configuration interface\n * @internal\n */\nfunction mapEnvironmentMetadata(\n  envConfig: CoreApiEnvironmentConfig,\n  envDefaults: Partial<ApiConfig>\n): Partial<ApiConfig> {\n  const mapped: Partial<ApiConfig> = {};\n\n  // Add API key to headers if provided\n  if (envConfig.apiKey) {\n    // Extract existing static headers if headers is an object with static property\n    const existingStatic =\n      envDefaults.headers &&\n      typeof envDefaults.headers === 'object' &&\n      'static' in envDefaults.headers &&\n      typeof envDefaults.headers.static === 'object'\n        ? envDefaults.headers.static\n        : {};\n\n    mapped.headers = {\n      static: { ...(existingStatic ?? {}), 'X-API-Key': envConfig.apiKey },\n    };\n  }\n\n  // Note: rateLimit from envConfig is not mapped to ApiConfig\n  // Rate limiting is typically handled at the server/API gateway level\n  // If needed in the future, it should be added to ApiConfig interface first\n\n  return mapped;\n}\n\n/**\n * Apply default client setting to @plyaz/api services and hooks\n *\n * Conditionally calls `setDefaultApiClient()` based on the `setAsDefault` flag in environment config.\n * When enabled, all services and hooks from @plyaz/api will automatically use this client instance\n * without needing to pass it explicitly via `ServiceOptions.apiClient`.\n *\n * **Default behavior**: If `setAsDefault` is not specified, it defaults to `true`.\n *\n * **Use cases**:\n * - `true` (default): Single API client for the entire application (recommended for most apps)\n * - `false`: Multiple API clients (main API, analytics API, etc.) or testing scenarios\n *\n * @param client - The API client instance to set as default\n * @param envConfig - Environment configuration containing the setAsDefault flag\n *\n * @example\n * ```typescript\n * const client = await createApiClient(config);\n * const envConfig = { env: 'production', setAsDefault: true };\n *\n * applyDefaultClientSetting(client, envConfig);\n * // Now all @plyaz/api services use this client automatically\n *\n * const campaigns = await fetchCampaigns({ page: 1 });\n * // No need to pass apiClient - uses the default\n * ```\n *\n * @example\n * ```typescript\n * // Multiple clients scenario\n * const mainClient = await createApiClient(mainConfig);\n * const analyticsClient = await createApiClient(analyticsConfig);\n *\n * applyDefaultClientSetting(mainClient, { env: 'production', setAsDefault: true });\n * applyDefaultClientSetting(analyticsClient, { env: 'production', setAsDefault: false });\n *\n * // Main API uses default\n * const campaigns = await fetchCampaigns({ page: 1 });\n *\n * // Analytics API must be passed explicitly\n * const analytics = await fetchAnalytics(\n *   { date: '2025-10-16' },\n *   { apiClient: analyticsClient }\n * );\n * ```\n *\n * @see {@link CoreApiEnvironmentConfig.setAsDefault} - Flag documentation\n * @see {@link ServiceOptions.apiClient} - How to override the default client\n * @internal\n */\nfunction applyDefaultClientSetting(\n  client: ApiClientWithEvents<ClientEventManager, EndpointsList>,\n  envConfig: CoreApiEnvironmentConfig\n): void {\n  const shouldSetAsDefault = envConfig.setAsDefault !== false;\n  if (shouldSetAsDefault) {\n    setDefaultApiClient(client);\n  }\n}\n\n/**\n * Validate environment configuration for production readiness.\n * Ensures critical settings are properly configured based on environment.\n *\n * @param envConfig - Environment configuration\n * @param mergedConfig - Merged configuration after applying all defaults\n * @throws {ApiPackageError} If validation fails\n */\nfunction validateEnvironmentConfig(\n  envConfig: CoreApiEnvironmentConfig,\n  mergedConfig: ApiClientOptions\n): void {\n  const errors: string[] = [];\n  const warnings: string[] = [];\n\n  // Validate required base URL\n  validateBaseURL(mergedConfig, errors);\n\n  // Environment-specific validation\n  if (envConfig.env === 'production') {\n    validateProductionEncryption(mergedConfig, errors, warnings);\n    validateProductionPerformance(mergedConfig, warnings);\n  } else if (envConfig.env === 'staging') {\n    validateStagingEncryption(mergedConfig, errors, warnings);\n  } else if (envConfig.env === 'development') {\n    validateDevelopmentEncryption(mergedConfig, warnings);\n  }\n\n  // Log warnings (intentional console usage for config validation)\n  if (warnings.length > 0) {\n    globalThis.console.warn('[ApiClientService] Configuration warnings:', warnings);\n  }\n\n  // Throw if there are errors\n  if (errors.length > 0) {\n    throw new ApiPackageError(\n      'service.validation.failed',\n      PACKAGE_STATUS_CODES.INVALID_CONFIGURATION,\n      API_ERROR_CODES.CONFIG_VALIDATION_FAILED,\n      {\n        context: {\n          operation: OPERATIONS.VALIDATION,\n          // Ensure error details conform to ErrorDetail shape (include errorCode)\n          errors: errors.map(err => ({\n            field: 'config',\n            message: err,\n            errorCode: String(API_ERROR_CODES.CONFIG_VALIDATION_FAILED),\n          })),\n          i18n: {\n            errors: errors.join('; '),\n            warnings: warnings.join('; '),\n          },\n        },\n      }\n    );\n  }\n}\n\n/**\n * API Client Singleton Service\n * Manages API client instance lifecycle with environment-specific configurations\n *\n * @example\n * ```typescript\n * // In your app initialization (Next.js, React, etc.)\n * import { ApiClientService } from '@plyaz/core';\n *\n * // Environment metadata\n * const envConfig = {\n *   env: process.env.NODE_ENV as 'production',\n *   apiKey: process.env.API_KEY,\n * };\n *\n * // API configuration with event handlers\n * await ApiClientService.init(envConfig, {\n *   baseURL: process.env.API_URL!,\n *   encryption: {\n *     key: {\n *       id: 'prod-key-v1',\n *       key: process.env.ENCRYPTION_KEY!,\n *       algorithm: 'AES-GCM'\n *     }\n *   },\n *   clientEvents: {\n *     onRequestStart: (event) => apiStore.trackRequest(event),\n *   },\n * });\n *\n * // Later, anywhere in your app\n * const client = ApiClientService.getClient();\n * ```\n */\n/**\n * Global Singleton Pattern using globalThis\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple singleton\n * instances. Using globalThis + Symbol.for() ensures ONE instance per process, preventing\n * issues like multiple API client instances with different configurations across API routes.\n */\ninterface ApiClientServiceState {\n  instance: ApiClientWithEvents<ClientEventManager, EndpointsList> | null;\n  isInitializing: boolean;\n  initPromise: Promise<void> | null;\n}\n\nconst API_CLIENT_SERVICE_KEY = Symbol.for('plyaz.ApiClientService');\n\nfunction getApiClientServiceState(): ApiClientServiceState {\n  const globalAny = globalThis as unknown as { [key: symbol]: ApiClientServiceState };\n  if (!globalAny[API_CLIENT_SERVICE_KEY]) {\n    globalAny[API_CLIENT_SERVICE_KEY] = {\n      instance: null,\n      isInitializing: false,\n      initPromise: null,\n    };\n  }\n  return globalAny[API_CLIENT_SERVICE_KEY];\n}\n\nexport class ApiClientService {\n  // State accessors using globalThis\n  private static get instance(): ApiClientWithEvents<ClientEventManager, EndpointsList> | null {\n    return getApiClientServiceState().instance;\n  }\n  private static set instance(\n    value: ApiClientWithEvents<ClientEventManager, EndpointsList> | null\n  ) {\n    getApiClientServiceState().instance = value;\n  }\n  private static get isInitializing(): boolean {\n    return getApiClientServiceState().isInitializing;\n  }\n  private static set isInitializing(value: boolean) {\n    getApiClientServiceState().isInitializing = value;\n  }\n  private static get initPromise(): Promise<void> | null {\n    return getApiClientServiceState().initPromise;\n  }\n  private static set initPromise(value: Promise<void> | null) {\n    getApiClientServiceState().initPromise = value;\n  }\n\n  /**\n   * Build the core error handler for API clients.\n   * This handler emits errors to CoreEventManager for global error handling.\n   *\n   * Handles:\n   * - Single errors (network, timeout)\n   * - Array of errors from API responses (validation, business logic)\n   * - Serialization to unified SerializedError format\n   * - Event emission to CORE_EVENTS.SYSTEM.ERROR and CORE_EVENTS.API.REQUEST_ERROR\n   *\n   * @returns Error handler function compatible with ApiClientOptions.onError\n   */\n\n  static buildCoreErrorHandler(): (\n    error: ResponseError<unknown, unknown, unknown, unknown>\n  ) => Promise<void> {\n    // eslint-disable-next-line complexity\n    return async (error: ResponseError<unknown, unknown, unknown, unknown>): Promise<void> => {\n      const requestId = generateRequestId();\n      const method = error.config?.method ?? 'UNKNOWN';\n      const url = error.config?.url ?? 'unknown';\n\n      // CRITICAL: Emit error event to Core\n      // Core will handle updating the appropriate store based on runtime context:\n      // - Backend: In-memory store (ServerErrorMiddleware)\n      // - Frontend: Zustand store (useRootStore)\n      try {\n        // API returns ErrorResponse (array of error details)\n        const errorDetails = Array.isArray(error.response?.data) ? error.response.data : [];\n\n        // If no error details from API, create a fallback error\n        if (errorDetails.length === 0) {\n          const serializedError = {\n            id: requestId,\n            code: ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n            message: error.message ?? 'API request failed',\n            status: error.status,\n            category: ERROR_CATEGORY.Network,\n            timestamp: new Date().toISOString(),\n            isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n            source: 'api-client',\n            dismissed: false,\n            context: {\n              method,\n              url,\n              requestId,\n            },\n          };\n\n          // Emit single error to Core\n          CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: [serializedError] });\n        } else {\n          // Convert ErrorResponse (API error details array) to SerializedError[]\n          const serializedErrors = errorDetails.map(\n            (detail: Record<string, unknown>, index: number) => ({\n              id: `${requestId}-${index}`,\n              code: (detail.errorCode as string) ?? ERROR_CODES.CORE_API_CLIENT_REQUEST_FAILED,\n              message: (detail.message as string) ?? error.message ?? 'API request failed',\n              status: error.status,\n              category: ERROR_CATEGORY.Network,\n              timestamp: new Date().toISOString(),\n              isRetryable: error.status ? error.status >= HTTP_STATUS.INTERNAL_SERVER_ERROR : false,\n              source: 'api-client',\n              dismissed: false,\n              context: {\n                method,\n                url,\n                requestId,\n                field: detail.field as string | undefined,\n                valueGiven: detail.valueGiven,\n                allowedValues: detail.allowedValues,\n                constraints: detail.constraints,\n              },\n            })\n          );\n\n          // Emit array of errors to Core\n          CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, { errors: serializedErrors });\n        }\n      } catch (e) {\n        // If event emission fails, log but don't break the error flow\n        console.error('[ApiClientService] Failed to emit error event:', e);\n      }\n\n      // Also emit API-specific error event for logging, monitoring, etc.\n      ApiClientService.emitApiError(error, {\n        method,\n        url,\n        requestId,\n        status: error.status,\n        duration: 0,\n      });\n    };\n  }\n\n  /**\n   * Initialize the API client with environment config and API options\n   *\n   * @param envConfig - Environment metadata (env, apiKey)\n   * @param apiConfig - API configuration (baseURL, encryption, timeout, event handlers, etc.)\n   * @returns Promise that resolves to the initialized client\n   */\n  static async init(\n    envConfig: CoreApiEnvironmentConfig,\n    apiConfig?: Partial<ApiClientOptions>\n  ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n    // If already initialized, return existing instance\n    if (this.instance) {\n      globalThis.console.warn(\n        '[ApiClientService] Client already initialized. Returning existing instance.'\n      );\n      return this.instance;\n    }\n\n    // If currently initializing, wait for that to complete\n    if (this.isInitializing && this.initPromise) {\n      await this.initPromise;\n      return this.instance!;\n    }\n\n    // Start initialization\n    this.isInitializing = true;\n    this.initPromise = this.createClient(envConfig, apiConfig);\n\n    try {\n      await this.initPromise;\n      return this.instance!;\n    } finally {\n      this.isInitializing = false;\n      this.initPromise = null;\n    }\n  }\n\n  /**\n   * Internal initialization logic\n   * Merges environment-specific defaults with API configuration\n   *\n   * Merge Priority (lowest to highest):\n   * 1. Environment defaults (PRODUCTION_CONFIG / STAGING_CONFIG / DEVELOPMENT_CONFIG)\n   * 2. Environment metadata (envConfig - apiKey)\n   * 3. API configuration (apiConfig - baseURL, encryption, timeout, etc.)\n   */\n  // eslint-disable-next-line complexity\n  private static async createClient(\n    envConfig: CoreApiEnvironmentConfig,\n    apiConfig?: Partial<ApiClientOptions>\n  ): Promise<void> {\n    try {\n      // Step 1: Get environment-specific defaults based on env\n      const envDefaults = getConfigForEnvironment(envConfig.env);\n\n      // Step 2: Build config from envConfig (environment metadata only)\n      const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n      // Step 3: Get the core error handler (handles single + array errors, emits to Core)\n      const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n      // Step 4: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n      const userOnError = apiConfig?.onError;\n      const combinedOnError = userOnError\n        ? Array.isArray(userOnError)\n          ? [...userOnError, coreErrorHandler]\n          : [userOnError, coreErrorHandler]\n        : coreErrorHandler;\n\n      const mergedOptions = mergeConfigs(\n        envDefaults, // Environment defaults (lowest priority)\n        envMetadataMapped, // Environment metadata (medium priority)\n        { ...(apiConfig ?? {}), onError: combinedOnError } // API configuration + core error handler\n      ) as ApiClientOptions;\n\n      // Step 5: Validate the merged configuration\n      validateEnvironmentConfig(envConfig, mergedOptions);\n\n      // Step 6: Create the client instance with merged configuration\n      this.instance = await createApiClient(mergedOptions);\n\n      // Step 6: Set as default client for @plyaz/api services and hooks (if enabled)\n      applyDefaultClientSetting(this.instance, envConfig);\n    } catch (error) {\n      throw new ApiPackageError(\n        'service.initialization.failed',\n        PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n        API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: {\n            operation: OPERATIONS.INITIALIZATION,\n            originalError: error instanceof Error ? error.message : String(error),\n            i18n: {\n              error: error instanceof Error ? error.message : String(error),\n            },\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Get the initialized client instance\n   *\n   * @throws {ApiPackageError} If client not initialized\n   */\n  static getClient(): ApiClientWithEvents<ClientEventManager, EndpointsList> {\n    if (!this.instance) {\n      throw new ApiPackageError(\n        'service.not_initialized',\n        PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n        API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n        {\n          context: {\n            operation: OPERATIONS.INITIALIZATION,\n            i18n: {\n              hint: 'Call ApiClientService.init(envConfig, apiConfig) before accessing the client',\n            },\n          },\n        }\n      );\n    }\n    return this.instance;\n  }\n\n  /**\n   * Check if client is initialized\n   */\n  static isInitialized(): boolean {\n    return this.instance !== null;\n  }\n\n  /**\n   * Reinitialize with new config and options\n   */\n  static async reinitialize(\n    envConfig: CoreApiEnvironmentConfig,\n    apiConfig?: Partial<ApiClientOptions>\n  ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n    this.dispose();\n    return this.init(envConfig, apiConfig);\n  }\n\n  /**\n   * Dispose of the client instance\n   */\n  static dispose(): void {\n    if (this.instance && 'dispose' in this.instance) {\n      this.instance.dispose?.();\n    }\n    this.instance = null;\n    this.isInitializing = false;\n    this.initPromise = null;\n  }\n\n  /**\n   * Emits an API error event via CoreEventManager.\n   * Called when API operations fail to integrate with global error handling.\n   *\n   * **CRITICAL**: This event emission triggers automatic error state updates.\n   * The global error store MUST subscribe to CORE_EVENTS.API.REQUEST_ERROR to:\n   * 1. Capture all API errors automatically\n   * 2. Update global error state for UI display\n   * 3. Ensure individual domain stores remain error-free (only domain data)\n   *\n   * This is the unified error hook that:\n   * - On frontend: Emits event that global error store subscribes to\n   * - On backend: Emits event for logging/monitoring (can be configured to rethrow)\n   *\n   * @param error - The error that occurred\n   * @param options - Additional context for the error\n   * @param options.method - HTTP method (GET, POST, etc.)\n   * @param options.url - Request URL\n   * @param options.requestId - Unique request identifier\n   * @param options.status - HTTP status code (if available)\n   * @param options.duration - Request duration in ms\n   * @param options.rethrow - Whether to rethrow the error after emitting (default: false)\n   *\n   * @example\n   * ```typescript\n   * // Global error store setup (in @plyaz/store)\n   * CoreEventManager.on(CORE_EVENTS.API.REQUEST_ERROR, (payload) => {\n   *   errorStore.setError({\n   *     message: payload.error.message,\n   *     status: payload.status,\n   *     url: payload.url,\n   *     requestId: payload.requestId,\n   *   });\n   * });\n   *\n   * // Frontend usage - emit to store\n   * ApiClientService.emitApiError(error, {\n   *   method: 'GET',\n   *   url: '/api/users',\n   *   requestId: '123',\n   *   duration: 500,\n   * });\n   *\n   * // Backend usage - emit and rethrow\n   * ApiClientService.emitApiError(error, {\n   *   method: 'POST',\n   *   url: '/api/orders',\n   *   requestId: '456',\n   *   duration: 1200,\n   *   rethrow: true,\n   * });\n   * ```\n   */\n  static emitApiError(\n    error: unknown,\n    options: {\n      method: string;\n      url: string;\n      requestId: string;\n      status?: number;\n      duration: number;\n      rethrow?: boolean;\n    }\n  ): void {\n    const payload: CoreApiRequestErrorPayload = {\n      method: options.method,\n      url: options.url,\n      requestId: options.requestId,\n      status: options.status,\n      error,\n      duration: options.duration,\n    };\n\n    CoreEventManager.emit(CORE_EVENTS.API.REQUEST_ERROR, payload);\n\n    // Optionally rethrow for backend error propagation\n    if (options.rethrow && error instanceof Error) {\n      throw error;\n    }\n  }\n\n  /**\n   * Create a dedicated API client instance (NOT the singleton)\n   *\n   * Use this when you need an isolated client with its own configuration\n   * that doesn't affect or get affected by the shared singleton instance.\n   *\n   * @param envConfig - Environment metadata (env, apiKey)\n   * @param apiConfig - API configuration (baseURL, encryption, timeout, etc.)\n   * @returns Promise that resolves to a new dedicated client instance\n   *\n   * @example\n   * ```typescript\n   * // Create a dedicated client for feature flags service\n   * const flagsClient = await ApiClientService.createInstance(\n   *   { env: 'production' },\n   *   {\n   *     baseURL: 'https://flags.example.com',\n   *     timeout: 5000,\n   *   }\n   * );\n   *\n   * // This client is independent from ApiClientService.getClient()\n   * flagsClient.updateConfig({ timeout: 3000 }); // Only affects this instance\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  static async createInstance(\n    envConfig: CoreApiEnvironmentConfig,\n    apiConfig?: Partial<ApiClientOptions>\n  ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n    try {\n      // Step 1: Get environment-specific defaults based on env\n      const envDefaults = getConfigForEnvironment(envConfig.env);\n\n      // Step 2: Build config from envConfig (environment metadata only)\n      const envMetadataMapped = mapEnvironmentMetadata(envConfig, envDefaults);\n\n      // Step 3: Get the core error handler (handles single + array errors, emits to Core)\n      const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n      // Step 4: Merge user onError with core error handler\n      const userOnError = apiConfig?.onError;\n      const combinedOnError = userOnError\n        ? Array.isArray(userOnError)\n          ? [...userOnError, coreErrorHandler]\n          : [userOnError, coreErrorHandler]\n        : coreErrorHandler;\n\n      // Step 5: Merge with priority: envDefaults → envMetadata → apiConfig → coreErrorHandler\n      const mergedOptions = mergeConfigs(envDefaults, envMetadataMapped, {\n        ...(apiConfig ?? {}),\n        onError: combinedOnError,\n      }) as ApiClientOptions;\n\n      // Step 6: Validate the merged configuration\n      validateEnvironmentConfig(envConfig, mergedOptions);\n\n      // Step 7: Create a NEW client instance (not stored as singleton)\n      const dedicatedClient = await createApiClient(mergedOptions);\n\n      // Note: Do NOT call applyDefaultClientSetting - this is a dedicated instance\n      // that should not become the default client for @plyaz/api services\n\n      return dedicatedClient;\n    } catch (error) {\n      throw new ApiPackageError(\n        'service.instance_creation.failed',\n        PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n        API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: {\n            operation: OPERATIONS.INITIALIZATION,\n            originalError: error instanceof Error ? error.message : String(error),\n            i18n: {\n              error: error instanceof Error ? error.message : String(error),\n            },\n          },\n        }\n      );\n    }\n  }\n\n  /**\n   * Create a standalone API client with Core error handling.\n   *\n   * This is a simpler alternative to `createInstance()` that doesn't require\n   * environment config. Use this when you just need the error handling without\n   * environment-specific defaults (production validation, etc.).\n   *\n   * **Use cases:**\n   * - Domain services that need their own API client\n   * - Testing with isolated API clients\n   * - Simple client creation without environment setup\n   *\n   * @param apiConfig - API configuration (baseURL, timeout, etc.)\n   * @returns Promise that resolves to a client with Core error handling\n   *\n   * @example\n   * ```typescript\n   * // In BaseDomainService or any service\n   * const client = await ApiClientService.createStandaloneClient({\n   *   baseURL: '/api/examples',\n   *   timeout: 10000,\n   * });\n   *\n   * // Errors are automatically emitted to CoreEventManager\n   * const response = await client.get('/items');\n   * ```\n   */\n  static async createStandaloneClient(\n    apiConfig: ApiClientOptions\n  ): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> {\n    try {\n      // Get the core error handler (handles single + array errors, emits to Core)\n      const coreErrorHandler = ApiClientService.buildCoreErrorHandler();\n\n      // Merge user onError with core error handler\n      const userOnError = apiConfig.onError;\n      const combinedOnError = userOnError\n        ? Array.isArray(userOnError)\n          ? [...userOnError, coreErrorHandler]\n          : [userOnError, coreErrorHandler]\n        : coreErrorHandler;\n\n      // Create client with combined error handler\n      const client = await createApiClient({\n        ...apiConfig,\n        onError: combinedOnError,\n      });\n\n      return client;\n    } catch (error) {\n      throw new ApiPackageError(\n        'service.standalone_client_creation.failed',\n        PACKAGE_STATUS_CODES.INITIALIZATION_FAILED,\n        API_ERROR_CODES.CLIENT_INITIALIZATION_FAILED,\n        {\n          cause: error instanceof Error ? error : undefined,\n          context: {\n            operation: OPERATIONS.INITIALIZATION,\n            originalError: error instanceof Error ? error.message : String(error),\n            i18n: {\n              error: error instanceof Error ? error.message : String(error),\n            },\n          },\n        }\n      );\n    }\n  }\n}\n\n// Export convenience helpers\nexport const getApiClient = (): ApiClientWithEvents<ClientEventManager, EndpointsList> =>\n  ApiClientService.getClient();\n\nexport const initApiClient = (\n  envConfig: CoreApiEnvironmentConfig,\n  apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n  ApiClientService.init(envConfig, apiConfig);\n\nexport const createApiClientInstance = (\n  envConfig: CoreApiEnvironmentConfig,\n  apiConfig?: Partial<ApiClientOptions>\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n  ApiClientService.createInstance(envConfig, apiConfig);\n\nexport const createStandaloneApiClient = (\n  apiConfig: ApiClientOptions\n): Promise<ApiClientWithEvents<ClientEventManager, EndpointsList>> =>\n  ApiClientService.createStandaloneClient(apiConfig);\n","/**\n * Base Observability Adapter\n *\n * Abstract base class for all observability adapters.\n * Provides common functionality and enforces the adapter interface.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n  ObservabilityAdapter,\n  ObservabilityAdapterConfig,\n  ObservabilityProvider,\n  Metric,\n  SpanOptions,\n  Span,\n  LogEntry,\n  ObservabilityEvent,\n  SpanContext,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for observability adapters.\n *\n * Provides common functionality:\n * - Initialization lifecycle\n * - Default tag management\n * - Error handling\n * - Logging\n *\n * Subclasses must implement provider-specific methods.\n */\nexport abstract class BaseAdapter implements ObservabilityAdapter {\n  abstract readonly provider: ObservabilityProvider;\n  abstract readonly name: string;\n\n  protected _isInitialized = false;\n  protected _config: ObservabilityAdapterConfig | null = null;\n  protected readonly logger: PackageLogger;\n\n  constructor() {\n    this.logger = new PackageLogger({\n      packageName: 'core',\n      service: 'ObservabilityAdapter',\n    });\n  }\n\n  get isInitialized(): boolean {\n    return this._isInitialized;\n  }\n\n  get config(): ObservabilityAdapterConfig | null {\n    return this._config;\n  }\n\n  // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n  async initialize(config: ObservabilityAdapterConfig): Promise<void> {\n    if (this._isInitialized) {\n      this.logger.warn(`${this.name} already initialized`);\n      return;\n    }\n\n    this._config = config;\n\n    if (config.enabled === false) {\n      this.logger.info(`${this.name} disabled by configuration`);\n      return;\n    }\n\n    await this.doInitialize(config);\n    this._isInitialized = true;\n    this.logger.info(`${this.name} initialized`, {\n      provider: this.provider,\n      serviceName: config.serviceName,\n      environment: config.environment,\n    });\n  }\n\n  async shutdown(): Promise<void> {\n    if (!this._isInitialized) {\n      return;\n    }\n\n    await this.flush();\n    await this.doShutdown();\n    this._isInitialized = false;\n    this.logger.info(`${this.name} shut down`);\n  }\n\n  async isHealthy(): Promise<boolean> {\n    if (!this._isInitialized) {\n      return false;\n    }\n    return this.doHealthCheck();\n  }\n\n  // ─── Abstract Methods (Provider-specific) ──────────────────────────────────\n\n  protected abstract doInitialize(config: ObservabilityAdapterConfig): Promise<void>;\n  protected abstract doShutdown(): Promise<void>;\n  protected abstract doHealthCheck(): Promise<boolean>;\n\n  // ─── Metrics ───────────────────────────────────────────────────────────────\n\n  async recordMetric(metric: Metric): Promise<void> {\n    if (!this._isInitialized || this._config?.enabled === false) {\n      return;\n    }\n\n    const metricWithDefaults = this.applyDefaultTags(metric);\n    await this.doRecordMetric(metricWithDefaults);\n  }\n\n  async incrementCounter(\n    name: string,\n    value: number = 1,\n    tags?: Record<string, string>\n  ): Promise<void> {\n    await this.recordMetric({\n      type: 'counter',\n      name,\n      value,\n      tags: { ...this._config?.defaultTags, ...tags },\n    });\n  }\n\n  async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n    await this.recordMetric({\n      type: 'gauge',\n      name,\n      value,\n      tags: { ...this._config?.defaultTags, ...tags },\n    });\n  }\n\n  async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n    await this.recordMetric({\n      type: 'histogram',\n      name,\n      value,\n      tags: { ...this._config?.defaultTags, ...tags },\n    });\n  }\n\n  protected abstract doRecordMetric(metric: Metric): Promise<void>;\n\n  // ─── Tracing ───────────────────────────────────────────────────────────────\n\n  startSpan(options: SpanOptions): Span {\n    if (!this._isInitialized || this._config?.enabled === false) {\n      return this.createNoopSpan(options);\n    }\n\n    // Apply sampling\n    if (this._config?.samplingRate !== undefined && this._config.samplingRate < 1) {\n      if (Math.random() > this._config.samplingRate) {\n        return this.createNoopSpan(options);\n      }\n    }\n\n    return this.doStartSpan(options);\n  }\n\n  getActiveSpan(): Span | null {\n    if (!this._isInitialized) {\n      return null;\n    }\n    return this.doGetActiveSpan();\n  }\n\n  async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n    const span = this.startSpan(options);\n    try {\n      const result = await fn(span);\n      span.setStatus('ok');\n      return result;\n    } catch (error) {\n      span.setStatus('error', error instanceof Error ? error.message : String(error));\n      if (error instanceof Error) {\n        span.recordException(error);\n      }\n      throw error;\n    } finally {\n      span.end();\n    }\n  }\n\n  protected abstract doStartSpan(options: SpanOptions): Span;\n  protected abstract doGetActiveSpan(): Span | null;\n\n  // ─── Logging ───────────────────────────────────────────────────────────────\n\n  async log(entry: LogEntry): Promise<void> {\n    if (!this._isInitialized || this._config?.enabled === false) {\n      return;\n    }\n\n    const entryWithDefaults = {\n      ...entry,\n      timestamp: entry.timestamp ?? Date.now(),\n      service: entry.service ?? this._config?.serviceName,\n    };\n\n    await this.doLog(entryWithDefaults);\n  }\n\n  protected abstract doLog(entry: LogEntry): Promise<void>;\n\n  // ─── Events ────────────────────────────────────────────────────────────────\n\n  async sendEvent(event: ObservabilityEvent): Promise<void> {\n    if (!this._isInitialized || this._config?.enabled === false) {\n      return;\n    }\n\n    const eventWithDefaults = {\n      ...event,\n      timestamp: event.timestamp ?? Date.now(),\n      tags: { ...this._config?.defaultTags, ...event.tags },\n    };\n\n    await this.doSendEvent(eventWithDefaults);\n  }\n\n  protected abstract doSendEvent(event: ObservabilityEvent): Promise<void>;\n\n  // ─── Flush ─────────────────────────────────────────────────────────────────\n\n  async flush(): Promise<void> {\n    if (!this._isInitialized) {\n      return;\n    }\n    await this.doFlush();\n  }\n\n  protected abstract doFlush(): Promise<void>;\n\n  // ─── Helpers ───────────────────────────────────────────────────────────────\n\n  /**\n   * Apply default tags to a metric\n   */\n  protected applyDefaultTags(metric: Metric): Metric {\n    if (!this._config?.defaultTags) {\n      return metric;\n    }\n\n    return {\n      ...metric,\n      tags: {\n        ...this._config.defaultTags,\n        ...metric.tags,\n      },\n    };\n  }\n\n  /**\n   * Create a no-op span (for disabled/sampled-out traces)\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected createNoopSpan(_options: SpanOptions): Span {\n    const context: SpanContext = {\n      traceId: generateTraceId(),\n      spanId: generateSpanId(),\n    };\n\n    return {\n      context,\n      setAttribute: () => {},\n      setAttributes: () => {},\n      addEvent: () => {},\n      setStatus: () => {},\n      end: () => {},\n      recordException: () => {},\n    };\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// No-Op Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * No-op adapter that does nothing.\n * Use when observability is disabled.\n */\nexport class NoopAdapter extends BaseAdapter {\n  readonly provider = 'noop' as const;\n  readonly name = 'NoopAdapter';\n\n  protected async doInitialize(): Promise<void> {}\n  protected async doShutdown(): Promise<void> {}\n  protected async doHealthCheck(): Promise<boolean> {\n    return true;\n  }\n  protected async doRecordMetric(): Promise<void> {}\n  protected doStartSpan(options: SpanOptions): Span {\n    return this.createNoopSpan(options);\n  }\n  protected doGetActiveSpan(): Span | null {\n    return null;\n  }\n  protected async doLog(): Promise<void> {}\n  protected async doSendEvent(): Promise<void> {}\n  protected async doFlush(): Promise<void> {}\n}\n","/**\n * Logger Adapter\n *\n * Uses @plyaz/logger for observability output.\n * Can be used standalone OR alongside other adapters (Datadog, Grafana)\n * to always have console/file logging regardless of external providers.\n *\n * @example Standalone usage\n * ```typescript\n * const logger = new LoggerAdapter();\n * await logger.initialize({ serviceName: 'my-service' });\n * ```\n *\n * @example As console fallback with Datadog\n * ```typescript\n * const observability = new ObservabilityService({\n *   mode: 'parallel',\n *   adapters: [datadogAdapter, loggerAdapter], // Both receive all events\n * });\n * ```\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport type {\n  ObservabilityAdapterConfig,\n  Metric,\n  SpanOptions,\n  Span,\n  LogEntry,\n  ObservabilityEvent,\n  SpanContext,\n  SpanAttributes,\n  SpanEvent,\n  SpanStatus,\n  ConsoleAdapterConfig,\n} from '@plyaz/types/observability';\nimport { generateTraceId, generateSpanId } from '@/utils/common';\nimport { BaseAdapter } from './BaseAdapter';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Logger Adapter\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Logger adapter that uses @plyaz/logger for output.\n *\n * This adapter integrates observability with the existing logging infrastructure,\n * providing structured logging for metrics, spans, and events through PackageLogger.\n *\n * Use this adapter:\n * - As standalone for development/debugging\n * - Alongside Datadog/Grafana to always have local console output\n * - As a fallback in priority mode when external providers fail\n */\nexport class LoggerAdapter extends BaseAdapter {\n  readonly provider = 'console' as const;\n  readonly name = 'LoggerAdapter';\n\n  private observabilityLogger!: PackageLogger;\n  private logMetrics = true;\n  private logSpans = true;\n  private logEvents = true;\n\n  protected async doInitialize(config: ObservabilityAdapterConfig): Promise<void> {\n    const consoleConfig = config as ConsoleAdapterConfig;\n\n    // Create dedicated logger for observability output\n    this.observabilityLogger = new PackageLogger({\n      packageName: 'observability',\n      service: config.serviceName ?? 'LoggerAdapter',\n      environment: config.environment as 'development' | 'staging' | 'production' | undefined,\n      minLevel: consoleConfig.logLevel ?? 'debug',\n    });\n\n    // All logging enabled by default\n    this.logMetrics = true;\n    this.logSpans = true;\n    this.logEvents = true;\n  }\n\n  protected async doShutdown(): Promise<void> {\n    // Logger doesn't need explicit shutdown\n  }\n\n  protected async doHealthCheck(): Promise<boolean> {\n    return true;\n  }\n\n  protected async doRecordMetric(metric: Metric): Promise<void> {\n    if (!this.logMetrics) return;\n\n    this.observabilityLogger.debug(`[METRIC] ${metric.type}:${metric.name}`, {\n      metricType: metric.type,\n      metricName: metric.name,\n      value: 'value' in metric ? metric.value : undefined,\n      unit: metric.unit,\n      tags: metric.tags,\n    });\n  }\n\n  protected doStartSpan(options: SpanOptions): Span {\n    const context: SpanContext = {\n      traceId: generateTraceId(),\n      spanId: generateSpanId(),\n      parentSpanId: options.parentContext?.spanId,\n    };\n\n    const startTime = options.startTime ?? Date.now();\n\n    if (this.logSpans) {\n      this.observabilityLogger.debug(`[SPAN START] ${options.name}`, {\n        traceId: context.traceId,\n        spanId: context.spanId,\n        parentSpanId: context.parentSpanId,\n        kind: options.kind,\n        attributes: options.attributes,\n      });\n    }\n\n    const events: SpanEvent[] = [];\n    let attributes: SpanAttributes = { ...options.attributes };\n    let status: SpanStatus = 'unset';\n    let statusMessage: string | undefined;\n\n    const logSpans = this.logSpans;\n    const logger = this.observabilityLogger;\n\n    return {\n      context,\n      setAttribute: (key, value) => {\n        attributes[key] = value;\n      },\n      setAttributes: attrs => {\n        attributes = { ...attributes, ...attrs };\n      },\n      addEvent: event => {\n        events.push(event);\n        if (logSpans) {\n          logger.debug(`[SPAN EVENT] ${options.name}: ${event.name}`, {\n            traceId: context.traceId,\n            spanId: context.spanId,\n            eventAttributes: event.attributes,\n          });\n        }\n      },\n      setStatus: (s, message) => {\n        status = s;\n        statusMessage = message;\n      },\n      end: endTime => {\n        const duration = (endTime ?? Date.now()) - startTime;\n        if (logSpans) {\n          const logMethod = status === 'error' ? 'warn' : 'debug';\n          logger[logMethod](`[SPAN END] ${options.name}`, {\n            traceId: context.traceId,\n            spanId: context.spanId,\n            durationMs: duration,\n            status,\n            statusMessage,\n            attributes,\n            eventCount: events.length,\n          });\n        }\n      },\n      recordException: error => {\n        if (logSpans) {\n          logger.error(`[SPAN ERROR] ${options.name}`, {\n            traceId: context.traceId,\n            spanId: context.spanId,\n            error: error.message,\n            stack: error.stack,\n          });\n        }\n      },\n    };\n  }\n\n  protected doGetActiveSpan(): Span | null {\n    return null; // Logger adapter doesn't track active spans\n  }\n\n  protected async doLog(entry: LogEntry): Promise<void> {\n    const meta = {\n      service: entry.service,\n      traceId: entry.traceId,\n      spanId: entry.spanId,\n      ...entry.context,\n    };\n\n    // Map observability log levels to logger methods\n    switch (entry.level) {\n      case 'debug':\n        this.observabilityLogger.debug(entry.message, meta);\n        break;\n      case 'info':\n        this.observabilityLogger.info(entry.message, meta);\n        break;\n      case 'warn':\n        this.observabilityLogger.warn(entry.message, meta);\n        break;\n      case 'error':\n        this.observabilityLogger.error(entry.message, meta);\n        break;\n      case 'fatal':\n        this.observabilityLogger.fatal(entry.message, meta);\n        break;\n    }\n  }\n\n  protected async doSendEvent(event: ObservabilityEvent): Promise<void> {\n    if (!this.logEvents) return;\n\n    this.observabilityLogger.info(`[EVENT] ${event.name}`, {\n      eventName: event.name,\n      properties: event.properties,\n      tags: event.tags,\n    });\n  }\n\n  protected async doFlush(): Promise<void> {\n    // Logger handles its own buffering/flushing\n  }\n}\n","/**\n * Observability Service\n *\n * Injectable service for observability (metrics, tracing, logging).\n * Works like CacheManager, DatabaseService, and ApiClient - can be injected into domain services.\n *\n * Adapters are initialized separately with their own configs.\n * This service only orchestrates - it doesn't know about adapter-specific configs.\n *\n * @module base/observability\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n  ObservabilityAdapter,\n  ObservabilityAdapterConfig,\n  Metric,\n  SpanOptions,\n  Span,\n  LogEntry,\n  ObservabilityEvent,\n  OperationContext,\n  MonitoringOperationResult,\n  AdapterWithPriority,\n  AdapterEntry,\n  ObservabilityServiceConfig,\n  ObservabilityServiceInterface,\n} from '@plyaz/types/observability';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { NoopAdapter } from './BaseAdapter';\nimport { LoggerAdapter } from './LoggerAdapter';\n\n// Default timeout for adapter operations (5 seconds)\nconst DEFAULT_ADAPTER_TIMEOUT_MS = 5000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Observability Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * ObservabilityService - Main observability service that implements ObservabilityAdapter.\n *\n * This service orchestrates multiple adapters and can be injected into domain services.\n * Logger adapter is always included by default for console output.\n *\n * ```typescript\n * // 1. Initialize adapters separately\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // 2. Create service - logger is auto-added by default\n * const observability = new ObservabilityService();\n * await observability.initialize({\n *   mode: 'parallel',\n *   adapters: [datadogAdapter], // Logger added automatically\n *   serviceName: 'my-service',\n * });\n *\n * // 3. Use in domain services (implements ObservabilityAdapter)\n * await observability.incrementCounter('api.requests', 1);\n * ```\n */\nexport class ObservabilityService implements ObservabilityAdapter, ObservabilityServiceInterface {\n  readonly provider = 'custom' as const;\n  readonly name = 'ObservabilityService';\n\n  private _isInitialized = false;\n  private _config: ObservabilityServiceConfig | null = null;\n  private readonly logger: PackageLogger;\n  private readonly adapterEntries: AdapterEntry[] = [];\n  private mode: 'single' | 'parallel' | 'priority' = 'parallel';\n  private readonly noopAdapter = new NoopAdapter();\n  private loggerAdapter: LoggerAdapter | null = null;\n\n  constructor() {\n    this.logger = new PackageLogger({\n      packageName: 'core',\n      service: 'ObservabilityService',\n    });\n  }\n\n  get isInitialized(): boolean {\n    return this._isInitialized;\n  }\n\n  /**\n   * Check if service has at least one working adapter\n   */\n  get isReady(): boolean {\n    return this.adapterEntries.some(e => e.adapter.isInitialized);\n  }\n\n  /**\n   * Get all adapters (for compatibility)\n   */\n  private get adapters(): ObservabilityAdapter[] {\n    return this.adapterEntries.map(e => e.adapter);\n  }\n\n  /**\n   * Get initialized adapter entries\n   */\n  private get initializedEntries(): AdapterEntry[] {\n    return this.adapterEntries.filter(e => e.adapter.isInitialized);\n  }\n\n  /**\n   * Get primary (non-failover) initialized adapters\n   */\n  private get primaryEntries(): AdapterEntry[] {\n    return this.initializedEntries.filter(e => !e.failover);\n  }\n\n  /**\n   * Get failover initialized adapters\n   */\n  private get failoverEntries(): AdapterEntry[] {\n    return this.initializedEntries.filter(e => e.failover);\n  }\n\n  // ─── Lifecycle ─────────────────────────────────────────────────────────────\n\n  /**\n   * Check if input is an adapter with priority config\n   */\n  private isAdapterWithPriority(\n    input: ObservabilityAdapter | AdapterWithPriority\n  ): input is AdapterWithPriority {\n    return (\n      'adapter' in input &&\n      typeof (input as AdapterWithPriority).adapter?.isInitialized === 'boolean'\n    );\n  }\n\n  /**\n   * Normalize adapter input to adapter with priority and failover config\n   */\n  private normalizeAdapter(\n    input: ObservabilityAdapter | AdapterWithPriority,\n    defaultPriority: number\n  ): { adapter: ObservabilityAdapter; priority: number; failover: boolean } {\n    if (this.isAdapterWithPriority(input)) {\n      return {\n        adapter: input.adapter,\n        priority: input.priority ?? defaultPriority,\n        failover: input.failover ?? false,\n      };\n    }\n    return { adapter: input, priority: defaultPriority, failover: false };\n  }\n\n  /**\n   * Initialize the observability service.\n   * Logger adapter is always added by default unless explicitly disabled.\n   * Adapters are sorted by priority (higher = first), with failover adapters after primary.\n   */\n  async initialize(config: ObservabilityAdapterConfig & ObservabilityServiceConfig): Promise<void> {\n    if (this._isInitialized) {\n      this.logger.warn('ObservabilityService already initialized');\n      return;\n    }\n\n    this._config = config;\n    this.mode = config.mode ?? 'parallel';\n\n    // Collect adapters with priorities\n    const entries: AdapterEntry[] = [];\n\n    // Add provided adapters\n    if (config.adapter) {\n      entries.push(this.normalizeAdapter(config.adapter, 0));\n    }\n    if (config.adapters) {\n      config.adapters.forEach((a, index) => {\n        // Default priority decreases with array position for stable sorting\n        entries.push(this.normalizeAdapter(a, -index));\n      });\n    }\n\n    // Always add logger adapter by default (for console output)\n    // Unless there's already a console/logger adapter\n    const hasLoggerAdapter = entries.some(\n      e => e.adapter.provider === 'console' || e.adapter.name === 'LoggerAdapter'\n    );\n    if (!hasLoggerAdapter) {\n      this.loggerAdapter = new LoggerAdapter();\n      await this.loggerAdapter.initialize({\n        enabled: config.enabled !== false,\n        serviceName: config.serviceName,\n        environment: config.environment,\n        defaultTags: config.defaultTags,\n      });\n      // Logger is a failover by default with lowest priority\n      entries.push({ adapter: this.loggerAdapter, priority: -1000, failover: true });\n    }\n\n    // Sort: primary adapters first (by priority desc), then failover adapters (by priority desc)\n    entries.sort((a, b) => {\n      // Primary adapters come before failover\n      if (a.failover !== b.failover) {\n        return a.failover ? 1 : -1;\n      }\n      // Within same category, sort by priority (higher first)\n      return b.priority - a.priority;\n    });\n\n    // Store sorted entries\n    this.adapterEntries.push(...entries);\n\n    this._isInitialized = true;\n\n    this.logger.debug('ObservabilityService initialized', {\n      mode: this.mode,\n      adapterCount: this.adapterEntries.length,\n      primaryCount: this.primaryEntries.length,\n      failoverCount: this.failoverEntries.length,\n      adapters: this.adapterEntries.map(e => ({\n        name: e.adapter.name,\n        provider: e.adapter.provider,\n        priority: e.priority,\n        failover: e.failover,\n        initialized: e.adapter.isInitialized,\n      })),\n    });\n  }\n\n  async shutdown(): Promise<void> {\n    await Promise.all(this.adapters.map(adapter => adapter.shutdown()));\n    this._isInitialized = false;\n    this.logger.info('ObservabilityService shut down');\n  }\n\n  async isHealthy(): Promise<boolean> {\n    if (this.adapters.length === 0) {\n      return false;\n    }\n\n    const results = await Promise.all(\n      this.adapters.map(adapter => adapter.isHealthy().catch(() => false))\n    );\n\n    // For parallel mode, all must be healthy; for priority/single, at least one\n    return this.mode === 'parallel' ? results.every(Boolean) : results.some(Boolean);\n  }\n\n  async flush(): Promise<void> {\n    await this.executeOnAdapters('flush', adapter => adapter.flush());\n  }\n\n  // ─── Execute on Adapters ───────────────────────────────────────────────────\n\n  private get config(): ObservabilityServiceConfig {\n    return this._config ?? {};\n  }\n\n  private async executeOnAdapters<T>(\n    operation: string,\n    fn: (adapter: ObservabilityAdapter) => Promise<T>\n  ): Promise<void> {\n    const entries = this.initializedEntries;\n    if (entries.length === 0) {\n      return;\n    }\n\n    const timeout = this.config.adapterTimeout ?? DEFAULT_ADAPTER_TIMEOUT_MS;\n\n    switch (this.mode) {\n      case 'parallel':\n        await this.executeParallelWithFailover(operation, fn, timeout);\n        break;\n      case 'priority':\n        await this.executePriorityWithFailover(operation, fn, timeout);\n        break;\n      case 'single':\n      default:\n        await this.executeSingle(operation, entries[0].adapter, fn, timeout);\n        break;\n    }\n  }\n\n  private async executeSingle<T>(\n    operation: string,\n    adapter: ObservabilityAdapter,\n    fn: (adapter: ObservabilityAdapter) => Promise<T>,\n    timeout: number\n  ): Promise<void> {\n    try {\n      await this.withTimeout(fn(adapter), timeout);\n    } catch (error) {\n      this.logger.error(`${operation} failed on ${adapter.name}`, {\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  /**\n   * Execute on primary adapters in parallel.\n   * If all primary adapters fail, execute on failover adapters.\n   */\n  // eslint-disable-next-line complexity\n  private async executeParallelWithFailover<T>(\n    operation: string,\n    fn: (adapter: ObservabilityAdapter) => Promise<T>,\n    timeout: number\n  ): Promise<void> {\n    const primary = this.primaryEntries;\n    const failover = this.failoverEntries;\n\n    // Execute on primary adapters\n    if (primary.length > 0) {\n      const results = await Promise.allSettled(\n        primary.map(e => this.withTimeout(fn(e.adapter), timeout))\n      );\n\n      const errors = results\n        .map((r, i) =>\n          r.status === 'rejected' ? { adapter: primary[i].adapter.name, error: r.reason } : null\n        )\n        .filter(Boolean);\n\n      const allFailed = errors.length === primary.length;\n\n      if (errors.length > 0 && !allFailed) {\n        this.logger.warn(`${operation} failed on some primary adapters`, { errors });\n      }\n\n      // If all primary adapters failed, use failover\n      if (allFailed && failover.length > 0) {\n        this.logger.warn(`${operation} failed on all primary adapters, using failover`, { errors });\n        await this.executeParallel(\n          operation,\n          failover.map(e => e.adapter),\n          fn,\n          timeout\n        );\n        return;\n      }\n\n      if (this.config.failOnAnyError && errors.length > 0) {\n        throw new CorePackageError(\n          `${operation} failed on adapters: ${errors.map(e => e?.adapter).join(', ')}`,\n          ERROR_CODES.CORE_OPERATION_FAILED\n        );\n      }\n    } else if (failover.length > 0) {\n      // No primary adapters, use failover directly\n      await this.executeParallel(\n        operation,\n        failover.map(e => e.adapter),\n        fn,\n        timeout\n      );\n    }\n  }\n\n  private async executeParallel<T>(\n    operation: string,\n    adapters: ObservabilityAdapter[],\n    fn: (adapter: ObservabilityAdapter) => Promise<T>,\n    timeout: number\n  ): Promise<void> {\n    const results = await Promise.allSettled(\n      adapters.map(adapter => this.withTimeout(fn(adapter), timeout))\n    );\n\n    const errors = results\n      .map((r, i) =>\n        r.status === 'rejected' ? { adapter: adapters[i].name, error: r.reason } : null\n      )\n      .filter(Boolean);\n\n    if (errors.length > 0) {\n      this.logger.warn(`${operation} failed on some adapters`, { errors });\n    }\n  }\n\n  /**\n   * Execute on primary adapters in priority order.\n   * If all primary adapters fail, try failover adapters.\n   */\n  // eslint-disable-next-line complexity\n  private async executePriorityWithFailover<T>(\n    operation: string,\n    fn: (adapter: ObservabilityAdapter) => Promise<T>,\n    timeout: number\n  ): Promise<void> {\n    const primary = this.primaryEntries;\n    const failover = this.failoverEntries;\n\n    // Try primary adapters first\n    for (const entry of primary) {\n      try {\n        await this.withTimeout(fn(entry.adapter), timeout);\n        return; // Success - stop trying\n      } catch (error) {\n        const errorName = error instanceof Error ? error.name : 'Error';\n        const shouldFallback =\n          !this.config.fallbackOnErrors || this.config.fallbackOnErrors.includes(errorName);\n\n        if (shouldFallback) {\n          this.logger.warn(`${operation} failed on ${entry.adapter.name}, trying next`, {\n            error: error instanceof Error ? error.message : String(error),\n          });\n          continue;\n        }\n        throw error;\n      }\n    }\n\n    // All primary failed, try failover adapters\n    for (const entry of failover) {\n      try {\n        await this.withTimeout(fn(entry.adapter), timeout);\n        return; // Success\n      } catch (error) {\n        this.logger.warn(`${operation} failed on failover ${entry.adapter.name}`, {\n          error: error instanceof Error ? error.message : String(error),\n        });\n        // Continue to next failover adapter\n      }\n    }\n\n    this.logger.error(`${operation} failed on all adapters (primary and failover)`);\n  }\n\n  private async withTimeout<T>(promise: Promise<T>, timeoutMs: number): Promise<T> {\n    return Promise.race([\n      promise,\n      new Promise<T>((_, reject) =>\n        setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms`)), timeoutMs)\n      ),\n    ]);\n  }\n\n  // ─── Metrics ───────────────────────────────────────────────────────────────\n\n  async recordMetric(metric: Metric): Promise<void> {\n    await this.executeOnAdapters('recordMetric', adapter => adapter.recordMetric(metric));\n  }\n\n  async incrementCounter(\n    name: string,\n    value: number = 1,\n    tags?: Record<string, string>\n  ): Promise<void> {\n    await this.executeOnAdapters('incrementCounter', adapter =>\n      adapter.incrementCounter(name, value, tags)\n    );\n  }\n\n  async setGauge(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n    await this.executeOnAdapters('setGauge', adapter => adapter.setGauge(name, value, tags));\n  }\n\n  async recordHistogram(name: string, value: number, tags?: Record<string, string>): Promise<void> {\n    await this.executeOnAdapters('recordHistogram', adapter =>\n      adapter.recordHistogram(name, value, tags)\n    );\n  }\n\n  // ─── Tracing ───────────────────────────────────────────────────────────────\n\n  startSpan(options: SpanOptions): Span {\n    // For tracing, use first initialized adapter\n    const entry = this.initializedEntries[0];\n    return entry?.adapter.startSpan(options) ?? this.noopAdapter.startSpan(options);\n  }\n\n  async withSpan<T>(options: SpanOptions, fn: (span: Span) => Promise<T>): Promise<T> {\n    const entry = this.initializedEntries[0];\n    if (!entry) {\n      return fn(this.noopAdapter.startSpan(options));\n    }\n    return entry.adapter.withSpan(options, fn);\n  }\n\n  getActiveSpan(): Span | null {\n    const entry = this.initializedEntries[0];\n    return entry?.adapter.getActiveSpan() ?? null;\n  }\n\n  // ─── Logging ───────────────────────────────────────────────────────────────\n\n  async log(entry: LogEntry): Promise<void> {\n    await this.executeOnAdapters('log', adapter => adapter.log(entry));\n  }\n\n  // ─── Events ────────────────────────────────────────────────────────────────\n\n  async sendEvent(event: ObservabilityEvent): Promise<void> {\n    await this.executeOnAdapters('sendEvent', adapter => adapter.sendEvent(event));\n  }\n\n  // ─── Service Operation Tracking ────────────────────────────────────────────\n\n  /**\n   * Track a service operation with automatic metrics and tracing.\n   *\n   * @example\n   * ```typescript\n   * const { result, metrics } = await observability.trackOperation(\n   *   {\n   *     serviceName: 'UserService',\n   *     operation: 'create',\n   *     entityType: 'user',\n   *     startTime: Date.now(),\n   *   },\n   *   async () => {\n   *     return await this.repository.create(userData);\n   *   }\n   * );\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async trackOperation<T>(\n    context: OperationContext,\n    operation: () => Promise<T>\n  ): Promise<{ result: T; metrics: MonitoringOperationResult }> {\n    const startTime = context.startTime ?? Date.now();\n\n    // Start span\n    const span = this.startSpan({\n      name: `${context.serviceName}.${context.operation}`,\n      attributes: {\n        'service.name': context.serviceName,\n        'operation.name': context.operation,\n        ...(context.entityType && { 'entity.type': context.entityType }),\n        ...(context.entityId && { 'entity.id': context.entityId }),\n        ...context.attributes,\n      },\n      parentContext: context.parentContext,\n    });\n\n    // Increment operation counter\n    await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT, 1, {\n      service: context.serviceName,\n      operation: context.operation,\n      ...(context.entityType && { entity_type: context.entityType }),\n    });\n\n    try {\n      const result = await operation();\n      const duration = Date.now() - startTime;\n\n      span.setStatus('ok');\n\n      await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n        service: context.serviceName,\n        operation: context.operation,\n        status: 'success',\n      });\n\n      return {\n        result,\n        metrics: { success: true, duration, data: result },\n      };\n    } catch (error) {\n      const duration = Date.now() - startTime;\n\n      span.setStatus('error', error instanceof Error ? error.message : String(error));\n      if (error instanceof Error) {\n        span.recordException(error);\n      }\n\n      await this.incrementCounter(OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR, 1, {\n        service: context.serviceName,\n        operation: context.operation,\n        error_type: error instanceof Error ? error.name : 'UnknownError',\n      });\n\n      await this.recordHistogram(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, {\n        service: context.serviceName,\n        operation: context.operation,\n        status: 'error',\n      });\n\n      throw error;\n    } finally {\n      span.end();\n    }\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create an ObservabilityService with pre-initialized adapters.\n *\n * @example\n * ```typescript\n * // Initialize adapters first\n * const datadogAdapter = new DatadogAdapter();\n * await datadogAdapter.initialize({ apiKey: '...', serviceName: 'my-service' });\n *\n * // Create and initialize service (logger auto-added)\n * const observability = await createObservabilityService({\n *   mode: 'parallel',\n *   adapters: [datadogAdapter],\n *   serviceName: 'my-service',\n * });\n *\n * // Priority mode (fallback chain)\n * const observability = await createObservabilityService({\n *   mode: 'priority',\n *   adapters: [datadogAdapter, grafanaAdapter],\n *   serviceName: 'my-service',\n * });\n * ```\n */\nexport async function createObservabilityService(\n  config: ObservabilityServiceConfig & { serviceName?: string; environment?: string } = {}\n): Promise<ObservabilityService> {\n  const service = new ObservabilityService();\n  await service.initialize(config);\n  return service;\n}\n","/**\n * Observability Module\n *\n * Adapter-based observability system supporting multiple providers\n * (Datadog, Grafana, OpenTelemetry, etc.) with parallel and priority modes.\n *\n * @module base/observability\n */\n\n// Adapters\nexport { BaseAdapter, NoopAdapter } from './BaseAdapter';\nexport { LoggerAdapter } from './LoggerAdapter';\nexport { CompositeAdapter } from './CompositeAdapter';\nexport { DatadogAdapter } from './DatadogAdapter';\nexport type { DatadogAdapterConfigExtended } from './DatadogAdapter';\n\n// Re-export Datadog API types from @plyaz/types for convenience\nexport type {\n  DatadogApiClient,\n  DatadogMetricPayload,\n  DatadogLogPayload,\n  DatadogEventPayload,\n} from '@plyaz/types/observability';\n\n// Service\nexport { ObservabilityService, createObservabilityService } from './ObservabilityService';\n\n// Re-export types for convenience\nexport type {\n  ObservabilityAdapter,\n  ObservabilityAdapterConfig,\n  ObservabilityProvider,\n  Metric,\n  SpanOptions,\n  Span,\n  LogEntry,\n  ObservabilityEvent,\n  SpanContext,\n  SpanAttributes,\n  SpanEvent,\n  SpanStatus,\n  DatadogAdapterConfig,\n  OpenTelemetryAdapterConfig,\n  GrafanaAdapterConfig,\n  ConsoleAdapterConfig,\n  CompositeMode,\n  CompositeAdapterConfig,\n  OperationContext,\n  MonitoringOperationResult,\n  AdapterWithPriority,\n  AdapterEntry,\n  ObservabilityServiceConfig,\n  ObservabilityServiceInterface,\n} from '@plyaz/types/observability';\n\nexport { OBSERVABILITY_METRICS, OBSERVABILITY_SPANS } from '@plyaz/types/observability';\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * Service Registry - Frontend Service Auto-Initialization\n *\n * Provides a generic, scalable pattern for initializing domain services.\n * Services implement the InitializableDomainService interface and are\n * initialized automatically without hardcoded switch statements.\n *\n * @example\n * ```typescript\n * import { ServiceRegistry } from '@plyaz/core';\n * import { FeatureFlagDomainService } from '@plyaz/core/frontend';\n * import { ExampleDomainService } from '@plyaz/core/domain';\n *\n * // Initialize services\n * await ServiceRegistry.initialize({\n *   apiClient: { baseURL: '/api' },\n *   services: [\n *     { service: FeatureFlagDomainService, config: { enabled: true } },\n *     { service: ExampleDomainService, config: { enabled: true, useRealApi: false } },\n *   ],\n * });\n *\n * // Access services by key\n * const flags = ServiceRegistry.get('featureFlags');\n * const isEnabled = await flags.isEnabled('my-flag');\n *\n * // Or get with type safety\n * const example = ServiceRegistry.get<ExampleDomainService>('example');\n * ```\n */\n\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES, UNIVERSAL_RUNTIMES } from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport type { RootStoreSlice } from '@plyaz/types/store';\nimport type {\n  CoreDomainServiceInstance,\n  CoreServiceCreateOptions,\n  CoreServiceEntry,\n  CoreServiceInitConfig,\n  CoreServiceRegistryConfig,\n  CoreCacheConfig,\n  CoreObservabilityConfig,\n  CoreRuntimeEnvironment,\n  CoreDbServiceConfig,\n  CoreStorageConfig,\n  CoreNotificationConfig,\n  // Service instance types (from @plyaz/types, not backend modules)\n  CoreDbServiceInstance,\n  CoreCacheManagerInstance,\n  CoreStorageServiceInstance,\n  CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { createObservabilityService } from '../base/observability';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { getCoreDependency } from '../config/dependencies';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal Types\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PendingService {\n  entry: CoreServiceEntry;\n  initWhen: CoreServiceInitConfig['initWhen'];\n}\n\ninterface ServiceMetadata {\n  entry: CoreServiceEntry;\n  isSingleton: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Global Singleton Pattern for Static Class State\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Global Singleton Pattern using globalThis for static class state\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple\n * instances of static class state. Using globalThis + Symbol.for() ensures ONE\n * shared state per process, preventing issues like services being registered in\n * one module context but not accessible from another (e.g., API routes).\n */\n\ninterface ServiceRegistryState {\n  services: Map<string, CoreDomainServiceInstance>;\n  pending: Map<string, PendingService>;\n  metadata: Map<string, ServiceMetadata>;\n  environment: 'production' | 'staging' | 'development' | 'test';\n  runtime: CoreRuntimeEnvironment;\n  apiClientOptions: ApiClientOptions | null;\n  dbConfig: Partial<CoreDbServiceConfig> | null;\n  cacheConfig: CoreCacheConfig | null;\n  observabilityConfig: CoreObservabilityConfig | null;\n  observabilityInstance: ObservabilityAdapter | null;\n  storageConfig: CoreStorageConfig | null;\n  notificationsConfig: CoreNotificationConfig | null;\n  storeRegistry: {\n    getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n  } | null;\n  initPromises: Map<string, Promise<CoreDomainServiceInstance>>;\n}\n\nconst SERVICE_REGISTRY_KEY = Symbol.for('plyaz.ServiceRegistry');\n\nfunction getServiceRegistryState(): ServiceRegistryState {\n  const globalAny = globalThis as unknown as { [key: symbol]: ServiceRegistryState };\n  if (!globalAny[SERVICE_REGISTRY_KEY]) {\n    globalAny[SERVICE_REGISTRY_KEY] = {\n      services: new Map(),\n      pending: new Map(),\n      metadata: new Map(),\n      environment: 'development',\n      runtime: 'node',\n      apiClientOptions: null,\n      dbConfig: null,\n      cacheConfig: null,\n      observabilityConfig: null,\n      observabilityInstance: null,\n      storageConfig: null,\n      notificationsConfig: null,\n      storeRegistry: null,\n      initPromises: new Map(),\n    };\n  }\n  return globalAny[SERVICE_REGISTRY_KEY];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Registry\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Service Registry\n *\n * Manages frontend domain service instances with auto-initialization.\n * Supports immediate, lazy, and conditional initialization.\n *\n * Key features:\n * - Generic: No switch statements, services implement common interface\n * - Scalable: Add new services without modifying registry code\n * - Flexible: Immediate, lazy, or conditional initialization\n * - Type-safe: Get services with proper typing\n */\nexport class ServiceRegistry {\n  private static readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'ServiceRegistry',\n  });\n\n  // State accessors using globalThis\n  private static get _services(): Map<string, CoreDomainServiceInstance> {\n    return getServiceRegistryState().services;\n  }\n  private static get _pending(): Map<string, PendingService> {\n    return getServiceRegistryState().pending;\n  }\n  private static get _metadata(): Map<string, ServiceMetadata> {\n    return getServiceRegistryState().metadata;\n  }\n  private static get _environment(): 'production' | 'staging' | 'development' | 'test' {\n    return getServiceRegistryState().environment;\n  }\n  private static set _environment(value: 'production' | 'staging' | 'development' | 'test') {\n    getServiceRegistryState().environment = value;\n  }\n  private static get _runtime(): CoreRuntimeEnvironment {\n    return getServiceRegistryState().runtime;\n  }\n  private static set _runtime(value: CoreRuntimeEnvironment) {\n    getServiceRegistryState().runtime = value;\n  }\n  private static get _apiClientOptions(): ApiClientOptions | null {\n    return getServiceRegistryState().apiClientOptions;\n  }\n  private static set _apiClientOptions(value: ApiClientOptions | null) {\n    getServiceRegistryState().apiClientOptions = value;\n  }\n  private static get _dbConfig(): Partial<CoreDbServiceConfig> | null {\n    return getServiceRegistryState().dbConfig;\n  }\n  private static set _dbConfig(value: Partial<CoreDbServiceConfig> | null) {\n    getServiceRegistryState().dbConfig = value;\n  }\n  private static get _cacheConfig(): CoreCacheConfig | null {\n    return getServiceRegistryState().cacheConfig;\n  }\n  private static set _cacheConfig(value: CoreCacheConfig | null) {\n    getServiceRegistryState().cacheConfig = value;\n  }\n  private static get _observabilityConfig(): CoreObservabilityConfig | null {\n    return getServiceRegistryState().observabilityConfig;\n  }\n  private static set _observabilityConfig(value: CoreObservabilityConfig | null) {\n    getServiceRegistryState().observabilityConfig = value;\n  }\n  private static get _observabilityInstance(): ObservabilityAdapter | null {\n    return getServiceRegistryState().observabilityInstance;\n  }\n  private static set _observabilityInstance(value: ObservabilityAdapter | null) {\n    getServiceRegistryState().observabilityInstance = value;\n  }\n  private static get _storageConfig(): CoreStorageConfig | null {\n    return getServiceRegistryState().storageConfig;\n  }\n  private static set _storageConfig(value: CoreStorageConfig | null) {\n    getServiceRegistryState().storageConfig = value;\n  }\n  private static get _notificationsConfig(): CoreNotificationConfig | null {\n    return getServiceRegistryState().notificationsConfig;\n  }\n  private static set _notificationsConfig(value: CoreNotificationConfig | null) {\n    getServiceRegistryState().notificationsConfig = value;\n  }\n  private static get _storeRegistry(): {\n    getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n  } | null {\n    return getServiceRegistryState().storeRegistry;\n  }\n  private static set _storeRegistry(\n    value: {\n      getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n    } | null\n  ) {\n    getServiceRegistryState().storeRegistry = value;\n  }\n  private static get _initPromises(): Map<string, Promise<CoreDomainServiceInstance>> {\n    return getServiceRegistryState().initPromises;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Initialization\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Initialize the service registry with the provided configuration.\n   *\n   * @param config - Registry configuration with services to initialize\n   *\n   * @example\n   * ```typescript\n   * await ServiceRegistry.initialize({\n   *   apiClient: { baseURL: '/api' },\n   *   services: [\n   *     { service: FeatureFlagDomainService, config: { enabled: true } },\n   *     { service: ExampleDomainService, config: { enabled: true, initWhen: 'lazy' } },\n   *   ],\n   * });\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  static async initialize(config: CoreServiceRegistryConfig): Promise<void> {\n    ServiceRegistry._environment = config.environment ?? 'development';\n    ServiceRegistry._runtime = config.runtime ?? 'node';\n    ServiceRegistry._apiClientOptions = config.apiClient ?? null;\n    ServiceRegistry._dbConfig = config.db ?? null;\n    ServiceRegistry._cacheConfig = config.cache ?? null;\n    ServiceRegistry._observabilityConfig = config.observability ?? null;\n    ServiceRegistry._storageConfig = config.storage ?? null;\n    ServiceRegistry._notificationsConfig = config.notifications ?? null;\n    ServiceRegistry._storeRegistry = config.stores ?? null;\n\n    const immediatePromises: Promise<void>[] = [];\n\n    for (const entry of config.services) {\n      const serviceKey = entry.service.serviceKey;\n      const initWhen = entry.config.initWhen ?? 'immediate';\n      const enabled = entry.config.enabled !== false;\n      const isSingleton = entry.config.singleton !== false; // Default: true\n\n      // Store metadata for all services (even disabled)\n      ServiceRegistry._metadata.set(serviceKey, { entry, isSingleton });\n\n      // Skip disabled services\n      if (!enabled) {\n        ServiceRegistry.logger.debug(`Service ${serviceKey} is disabled, skipping`);\n        continue;\n      }\n\n      // Handle initialization timing\n      if (initWhen === 'immediate' && isSingleton) {\n        // Only auto-initialize singletons\n        immediatePromises.push(\n          ServiceRegistry.initializeService(entry).then(() => {\n            ServiceRegistry.logger.debug(`Service ${serviceKey} initialized (singleton)`);\n          })\n        );\n      } else if (isSingleton) {\n        // Store for lazy/conditional initialization\n        ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n        ServiceRegistry.logger.debug(\n          `Service ${serviceKey} registered for ${initWhen} initialization`\n        );\n      } else {\n        // Non-singleton: just store metadata, create on demand via create()\n        ServiceRegistry.logger.debug(\n          `Service ${serviceKey} registered (non-singleton, use create())`\n        );\n      }\n    }\n\n    // Wait for all immediate initializations\n    await Promise.all(immediatePromises);\n\n    const initializedKeys = [...ServiceRegistry._services.keys()];\n    const pendingKeys = [...ServiceRegistry._pending.keys()];\n    const nonSingletonKeys = [...ServiceRegistry._metadata.entries()]\n      .filter(([, meta]) => !meta.isSingleton)\n      .map(([key]) => key);\n\n    ServiceRegistry.logger.info('Service registry initialized', {\n      initialized: initializedKeys,\n      pending: pendingKeys,\n      nonSingleton: nonSingletonKeys,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Service Access\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get a singleton service instance by key (synchronous).\n   * Throws if the service is not initialized or is non-singleton.\n   *\n   * @param key - Service key (e.g., 'featureFlags', 'example')\n   * @returns The service instance\n   * @throws CorePackageError if service not found, not initialized, or non-singleton\n   *\n   * @example\n   * ```typescript\n   * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n   * const isEnabled = await flags.isEnabled('my-flag');\n   * ```\n   */\n  static get<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(key: string): T {\n    const service = ServiceRegistry._services.get(key);\n    if (service) {\n      return service as T;\n    }\n\n    // Check if non-singleton (must use create())\n    const metadata = ServiceRegistry._metadata.get(key);\n    if (metadata && !metadata.isSingleton) {\n      throw new CorePackageError(\n        `Service '${key}' is configured as non-singleton. ` +\n          `Use await ServiceRegistry.create('${key}') to create a new instance.`,\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n\n    // Check if pending lazy initialization\n    const pending = ServiceRegistry._pending.get(key);\n    if (pending) {\n      throw new CorePackageError(\n        `Service '${key}' is configured for lazy initialization. ` +\n          `Use await ServiceRegistry.getAsync('${key}') instead.`,\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n\n    throw new CorePackageError(\n      `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n      ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n    );\n  }\n\n  /**\n   * Create a new instance of a service.\n   * Use this for non-singleton services or when you need a fresh instance.\n   *\n   * Note: The caller is responsible for disposing the returned instance.\n   *\n   * @param key - Service key\n   * @param configOverrides - Optional config overrides for this instance\n   * @returns Promise resolving to a new service instance\n   *\n   * @example\n   * ```typescript\n   * // Non-singleton service - always creates new instance\n   * const instance1 = await ServiceRegistry.create<WorkerService>('worker');\n   * const instance2 = await ServiceRegistry.create<WorkerService>('worker');\n   * instance1 !== instance2; // true\n   *\n   * // With config overrides\n   * const customWorker = await ServiceRegistry.create<WorkerService>('worker', {\n   *   apiClient: { baseURL: 'https://custom-api.com' },\n   * });\n   *\n   * // Don't forget to dispose when done!\n   * instance1.dispose();\n   * instance2.dispose();\n   * ```\n   */\n  static async create<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n    key: string,\n    configOverrides?: Partial<CoreServiceInitConfig>\n  ): Promise<T> {\n    const metadata = ServiceRegistry._metadata.get(key);\n    if (!metadata) {\n      throw new CorePackageError(\n        `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n\n    // Merge config with overrides\n    const mergedEntry: CoreServiceEntry = {\n      service: metadata.entry.service,\n      config: { ...metadata.entry.config, ...configOverrides },\n    };\n\n    // Create new instance (don't store in registry)\n    return ServiceRegistry.initializeService(mergedEntry, false) as Promise<T>;\n  }\n\n  /**\n   * Get a service instance by key with async initialization if needed.\n   * Use this for lazy-initialized services.\n   *\n   * @param key - Service key\n   * @returns Promise resolving to the service instance\n   *\n   * @example\n   * ```typescript\n   * const example = await ServiceRegistry.getAsync<ExampleDomainService>('example');\n   * const entities = await example.getAll();\n   * ```\n   */\n  static async getAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n    key: string\n  ): Promise<T> {\n    // Return immediately if already initialized\n    const existing = ServiceRegistry._services.get(key);\n    if (existing) {\n      return existing as T;\n    }\n\n    // Check for in-progress initialization\n    const inProgress = ServiceRegistry._initPromises.get(key);\n    if (inProgress) {\n      return (await inProgress) as T;\n    }\n\n    // Check if pending lazy initialization\n    const pending = ServiceRegistry._pending.get(key);\n    if (pending) {\n      // Handle conditional initialization\n      if (typeof pending.initWhen === 'function') {\n        const shouldInit = await pending.initWhen();\n        if (!shouldInit) {\n          throw new CorePackageError(\n            `Service '${key}' initialization condition returned false`,\n            ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n          );\n        }\n      }\n\n      // Initialize and return\n      const service = await ServiceRegistry.initializeService(pending.entry);\n      ServiceRegistry._pending.delete(key);\n      return service as T;\n    }\n\n    throw new CorePackageError(\n      `Service '${key}' not found. Register it in ServiceRegistry.initialize()`,\n      ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n    );\n  }\n\n  /**\n   * Check if a service is registered (either initialized or pending).\n   *\n   * @param key - Service key\n   */\n  static has(key: string): boolean {\n    return ServiceRegistry._services.has(key) || ServiceRegistry._pending.has(key);\n  }\n\n  /**\n   * Check if a service is initialized and ready.\n   *\n   * @param key - Service key\n   */\n  static isInitialized(key: string): boolean {\n    return ServiceRegistry._services.has(key);\n  }\n\n  /**\n   * Get all initialized service keys.\n   */\n  static getInitializedKeys(): string[] {\n    return [...ServiceRegistry._services.keys()];\n  }\n\n  /**\n   * Get all pending (lazy) service keys.\n   */\n  static getPendingKeys(): string[] {\n    return [...ServiceRegistry._pending.keys()];\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Internal: Service Initialization\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Build API client options and instance for service */\n  // eslint-disable-next-line complexity\n  private static async buildApiClientOptions(\n    config: CoreServiceInitConfig,\n    entry: CoreServiceEntry\n  ): Promise<{ dedicated: boolean; options?: ApiClientOptions; instance?: unknown } | undefined> {\n    const dedicatedApiClient = config.dedicatedApiClient;\n    const isDedicated = dedicatedApiClient === true || typeof dedicatedApiClient === 'object';\n    const serviceKey = entry.service.serviceKey;\n\n    const options: ApiClientOptions | undefined = isDedicated\n      ? typeof dedicatedApiClient === 'object'\n        ? { ...ServiceRegistry._apiClientOptions, ...dedicatedApiClient }\n        : (ServiceRegistry._apiClientOptions ?? undefined)\n      : (ServiceRegistry._apiClientOptions ?? undefined);\n\n    if (!options) {\n      return undefined;\n    }\n\n    // Get or create API client instance\n    let apiInstance: unknown;\n    if (isDedicated && options) {\n      // Create dedicated API client instance for this service\n      try {\n        // Use the global environment from initialization\n        const envConfig = {\n          env: ServiceRegistry._environment,\n          setAsDefault: false, // Dedicated instances should not become default\n        };\n        apiInstance = await ApiClientService.createInstance(envConfig, options);\n        ServiceRegistry.logger.debug(\n          `Created dedicated API client instance for service '${serviceKey}'`,\n          {\n            environment: ServiceRegistry._environment,\n          }\n        );\n      } catch (error) {\n        ServiceRegistry.logger.warn(\n          `Failed to create dedicated API client for service '${serviceKey}'`,\n          {\n            error: error instanceof Error ? error.message : String(error),\n          }\n        );\n      }\n    } else {\n      // Use global shared API client\n      try {\n        apiInstance = ApiClientService.getClient();\n      } catch {\n        ServiceRegistry.logger.debug(\n          `Global API client not initialized, service '${serviceKey}' will not have API`\n        );\n      }\n    }\n\n    return {\n      dedicated: isDedicated,\n      options,\n      instance: apiInstance,\n    };\n  }\n\n  /** Build DB config and instance for service with runtime validation */\n  // eslint-disable-next-line complexity\n  private static async buildDbConfig(\n    config: CoreServiceInitConfig,\n    entry: CoreServiceEntry\n  ): Promise<\n    | {\n        dedicated: boolean;\n        config?: Partial<CoreDbServiceConfig>;\n        instance?: CoreDbServiceInstance;\n      }\n    | undefined\n  > {\n    const dedicatedDb = config.dedicatedDb;\n    const isDedicated = dedicatedDb === true || typeof dedicatedDb === 'object';\n    const serviceKey = entry.service.serviceKey;\n\n    // Runtime validation: DB should only be injected for backend services (including universal runtimes in backend context)\n    const isBackendRuntime =\n      BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n      UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n    if ((isDedicated || ServiceRegistry._dbConfig) && !isBackendRuntime) {\n      ServiceRegistry.logger.warn(\n        `Service '${serviceKey}' is requesting database injection in '${ServiceRegistry._runtime}' runtime. ` +\n          `Database is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n          `This service will not have database access.`\n      );\n      return undefined; // Skip DB injection for non-backend runtimes\n    }\n\n    const dbConfig: Partial<CoreDbServiceConfig> | undefined = isDedicated\n      ? typeof dedicatedDb === 'object'\n        ? { ...ServiceRegistry._dbConfig, ...dedicatedDb }\n        : (ServiceRegistry._dbConfig ?? undefined)\n      : (ServiceRegistry._dbConfig ?? undefined);\n\n    if (!dbConfig) {\n      return undefined;\n    }\n\n    const DbService = getCoreDependency('DbService');\n    if (!DbService) {\n      ServiceRegistry.logger.debug(\n        `DbService not registered, service '${serviceKey}' will not have DB`\n      );\n      return undefined;\n    }\n\n    // Get or create DB instance\n    let dbInstance: CoreDbServiceInstance | undefined;\n    if (isDedicated && dbConfig) {\n      // Create dedicated database instance for this service\n      try {\n        dbInstance = await DbService.createInstance?.(dbConfig as CoreDbServiceConfig);\n        ServiceRegistry.logger.debug(\n          `Created dedicated database instance for service '${serviceKey}'`\n        );\n      } catch (error) {\n        ServiceRegistry.logger.warn(\n          `Failed to create dedicated database instance for service '${serviceKey}'`,\n          {\n            error: error instanceof Error ? error.message : String(error),\n          }\n        );\n      }\n    } else {\n      // Use global shared database\n      try {\n        dbInstance = DbService.getInstance();\n      } catch {\n        ServiceRegistry.logger.debug(\n          `Global DB not initialized, service '${serviceKey}' will not have DB`\n        );\n      }\n    }\n\n    return {\n      dedicated: isDedicated,\n      config: dbConfig,\n      instance: dbInstance,\n    };\n  }\n\n  /** Build cache config and instance for service with runtime validation */\n  // eslint-disable-next-line complexity\n  private static async buildCacheConfig(\n    config: CoreServiceInitConfig,\n    entry: CoreServiceEntry\n  ): Promise<\n    | { dedicated: boolean; config?: CoreCacheConfig; instance?: CoreCacheManagerInstance }\n    | undefined\n  > {\n    const dedicatedCache = config.dedicatedCache;\n    const isDedicated = dedicatedCache === true || typeof dedicatedCache === 'object';\n    const serviceKey = entry.service.serviceKey;\n\n    const cacheConfig: CoreCacheConfig | undefined = isDedicated\n      ? typeof dedicatedCache === 'object'\n        ? ({ ...ServiceRegistry._cacheConfig, ...dedicatedCache } as CoreCacheConfig)\n        : (ServiceRegistry._cacheConfig ?? undefined)\n      : (ServiceRegistry._cacheConfig ?? undefined);\n\n    if (!cacheConfig) {\n      return undefined;\n    }\n\n    // Runtime validation: Cache on frontend is not supported (CacheManager uses ioredis which requires Node.js)\n    const isFrontendRuntime = FRONTEND_RUNTIMES.includes(ServiceRegistry._runtime);\n\n    if (isFrontendRuntime) {\n      ServiceRegistry.logger.debug(\n        `Service '${serviceKey}' skipping cache (frontend runtime - use Zustand store + react-query instead)`\n      );\n      return undefined;\n    }\n\n    const CacheService = getCoreDependency('CacheService');\n    if (!CacheService) {\n      ServiceRegistry.logger.debug(\n        `CacheService not registered, service '${serviceKey}' will not have cache`\n      );\n      return undefined;\n    }\n\n    // Backend-only: Get cache manager instance from CacheService\n    let cacheInstance: CoreCacheManagerInstance | undefined;\n    try {\n      cacheInstance = CacheService.getInstance().getCacheManager();\n      if (isDedicated) {\n        ServiceRegistry.logger.debug(\n          `Using shared cache for service '${serviceKey}' (dedicated cache not implemented via DI)`,\n          { strategy: cacheConfig.strategy }\n        );\n      }\n    } catch {\n      ServiceRegistry.logger.debug(\n        `Global cache not initialized, service '${serviceKey}' will not have cache`\n      );\n    }\n\n    return {\n      dedicated: isDedicated,\n      config: cacheConfig,\n      instance: cacheInstance,\n    };\n  }\n\n  /** Build observability config and instance for service */\n  // eslint-disable-next-line complexity\n  private static buildObservabilityConfig(\n    config: CoreServiceInitConfig,\n    // eslint-disable-next-line no-unused-vars\n    _entry: CoreServiceEntry\n  ):\n    | { dedicated: boolean; config?: CoreObservabilityConfig; instance?: ObservabilityAdapter }\n    | undefined {\n    const dedicatedObservability = config.dedicatedObservability;\n    const isDedicated =\n      dedicatedObservability === true || typeof dedicatedObservability === 'object';\n\n    const observabilityConfig: CoreObservabilityConfig | undefined = isDedicated\n      ? typeof dedicatedObservability === 'object'\n        ? ({\n            ...ServiceRegistry._observabilityConfig,\n            ...dedicatedObservability,\n          } as CoreObservabilityConfig)\n        : (ServiceRegistry._observabilityConfig ?? undefined)\n      : (ServiceRegistry._observabilityConfig ?? undefined);\n\n    if (!observabilityConfig) {\n      return undefined;\n    }\n\n    // Instance will be set async if dedicated\n    return {\n      dedicated: isDedicated,\n      config: observabilityConfig,\n      instance: isDedicated ? undefined : (ServiceRegistry._observabilityInstance ?? undefined),\n    };\n  }\n\n  /** Build storage config and instance for service with runtime validation (backend-only) */\n  // eslint-disable-next-line complexity\n  private static async buildStorageConfig(\n    config: CoreServiceInitConfig,\n    entry: CoreServiceEntry\n  ): Promise<\n    | { dedicated: boolean; config?: CoreStorageConfig; instance?: CoreStorageServiceInstance }\n    | undefined\n  > {\n    const dedicatedStorage = config.dedicatedStorage;\n    const isDedicated = dedicatedStorage === true || typeof dedicatedStorage === 'object';\n    const serviceKey = entry.service.serviceKey;\n\n    // Runtime validation: Storage is backend-only (including universal runtimes in backend context)\n    const isBackendRuntime =\n      BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n      UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n    if ((isDedicated || ServiceRegistry._storageConfig) && !isBackendRuntime) {\n      ServiceRegistry.logger.warn(\n        `Service '${serviceKey}' is requesting storage injection in '${ServiceRegistry._runtime}' runtime. ` +\n          `Storage is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n          `This service will not have storage access.`\n      );\n      return undefined;\n    }\n\n    const storageConfig: CoreStorageConfig | undefined = isDedicated\n      ? typeof dedicatedStorage === 'object'\n        ? { ...ServiceRegistry._storageConfig, ...dedicatedStorage }\n        : (ServiceRegistry._storageConfig ?? undefined)\n      : (ServiceRegistry._storageConfig ?? undefined);\n\n    if (!storageConfig) {\n      return undefined;\n    }\n\n    const StorageService = getCoreDependency('StorageService');\n    if (!StorageService) {\n      ServiceRegistry.logger.debug(\n        `StorageService not registered, service '${serviceKey}' will not have storage`\n      );\n      return undefined;\n    }\n\n    // Get or create storage instance\n    let storageInstance: CoreStorageServiceInstance | undefined;\n    if (isDedicated && storageConfig) {\n      try {\n        storageInstance = await StorageService.createInstance?.(storageConfig);\n        ServiceRegistry.logger.debug(\n          `Created dedicated storage instance for service '${serviceKey}'`\n        );\n      } catch (error) {\n        ServiceRegistry.logger.warn(\n          `Failed to create dedicated storage instance for service '${serviceKey}'`,\n          { error: error instanceof Error ? error.message : String(error) }\n        );\n      }\n    } else {\n      try {\n        storageInstance = StorageService.getInstance();\n      } catch {\n        ServiceRegistry.logger.debug(\n          `Global storage not initialized, service '${serviceKey}' will not have storage`\n        );\n      }\n    }\n\n    return {\n      dedicated: isDedicated,\n      config: storageConfig,\n      instance: storageInstance,\n    };\n  }\n\n  /** Build notifications config and instance for service with runtime validation (backend-only) */\n  // eslint-disable-next-line complexity\n  private static async buildNotificationsConfig(\n    config: CoreServiceInitConfig,\n    entry: CoreServiceEntry\n  ): Promise<\n    | {\n        dedicated: boolean;\n        config?: CoreNotificationConfig;\n        instance?: CoreNotificationServiceInstance;\n      }\n    | undefined\n  > {\n    const dedicatedNotifications = config.dedicatedNotifications;\n    const isDedicated =\n      dedicatedNotifications === true || typeof dedicatedNotifications === 'object';\n    const serviceKey = entry.service.serviceKey;\n\n    // Runtime validation: Notifications is backend-only (including universal runtimes in backend context)\n    const isBackendRuntime =\n      BACKEND_RUNTIMES.includes(ServiceRegistry._runtime) ||\n      UNIVERSAL_RUNTIMES.includes(ServiceRegistry._runtime);\n\n    if ((isDedicated || ServiceRegistry._notificationsConfig) && !isBackendRuntime) {\n      ServiceRegistry.logger.warn(\n        `Service '${serviceKey}' is requesting notifications injection in '${ServiceRegistry._runtime}' runtime. ` +\n          `Notifications is only available in backend runtimes (${BACKEND_RUNTIMES.join(', ')}) or universal runtimes (${UNIVERSAL_RUNTIMES.join(', ')}). ` +\n          `This service will not have notifications access.`\n      );\n      return undefined;\n    }\n\n    const notificationsConfig: CoreNotificationConfig | undefined = isDedicated\n      ? typeof dedicatedNotifications === 'object'\n        ? { ...ServiceRegistry._notificationsConfig, ...dedicatedNotifications }\n        : (ServiceRegistry._notificationsConfig ?? undefined)\n      : (ServiceRegistry._notificationsConfig ?? undefined);\n\n    if (!notificationsConfig) {\n      return undefined;\n    }\n\n    const NotificationService = getCoreDependency('NotificationService');\n    if (!NotificationService) {\n      ServiceRegistry.logger.debug(\n        `NotificationService not registered, service '${serviceKey}' will not have notifications`\n      );\n      return undefined;\n    }\n\n    // Get or create notifications instance\n    let notificationsInstance: CoreNotificationServiceInstance | undefined;\n    if (isDedicated && notificationsConfig) {\n      try {\n        notificationsInstance = await NotificationService.createInstance?.(notificationsConfig);\n        ServiceRegistry.logger.debug(\n          `Created dedicated notifications instance for service '${serviceKey}'`\n        );\n      } catch (error) {\n        ServiceRegistry.logger.warn(\n          `Failed to create dedicated notifications instance for service '${serviceKey}'`,\n          { error: error instanceof Error ? error.message : String(error) }\n        );\n      }\n    } else {\n      try {\n        notificationsInstance = NotificationService.getInstance();\n      } catch {\n        ServiceRegistry.logger.debug(\n          `Global notifications not initialized, service '${serviceKey}' will not have notifications`\n        );\n      }\n    }\n\n    return {\n      dedicated: isDedicated,\n      config: notificationsConfig,\n      instance: notificationsInstance,\n    };\n  }\n\n  /**\n   * Create a dedicated ObservabilityService instance for a service.\n   * Uses the same adapter pattern as global observability but with service-specific config.\n   */\n  private static async createDedicatedObservability(\n    serviceKey: string,\n    config: CoreObservabilityConfig\n  ): Promise<ObservabilityAdapter | undefined> {\n    // Skip if explicitly disabled\n    if (config.enabled === false) {\n      return undefined;\n    }\n\n    try {\n      // createObservabilityService auto-adds LoggerAdapter as failover\n      const dedicatedService = await createObservabilityService({\n        mode: config.mode ?? 'parallel',\n        serviceName: `${config.serviceName ?? 'service'}-${serviceKey}`,\n        environment: config.environment,\n        adapters: config.adapters,\n      });\n\n      ServiceRegistry.logger.debug(\n        `Created dedicated ObservabilityService for service '${serviceKey}'`\n      );\n\n      return dedicatedService;\n    } catch (err) {\n      ServiceRegistry.logger.warn(\n        `Failed to create dedicated observability for '${serviceKey}', falling back to global`,\n        { error: err instanceof Error ? err.message : String(err) }\n      );\n      return ServiceRegistry._observabilityInstance ?? undefined;\n    }\n  }\n\n  /**\n   * Set the global observability adapter instance.\n   * Called by Core.initialize() after creating the adapter.\n   */\n  static setObservabilityInstance(instance: ObservabilityAdapter): void {\n    ServiceRegistry._observabilityInstance = instance;\n    ServiceRegistry.logger.debug('Global observability instance set');\n  }\n\n  /**\n   * Get the global observability adapter instance.\n   */\n  static getObservabilityInstance(): ObservabilityAdapter | null {\n    return ServiceRegistry._observabilityInstance;\n  }\n\n  /**\n   * Initialize a single service from an entry.\n   * Uses the service class's static create() method.\n   * Merges per-service config with global config.\n   */\n  private static async initializeService(\n    entry: CoreServiceEntry,\n    storeSingleton = true\n  ): Promise<CoreDomainServiceInstance> {\n    const { service: ServiceClass, config } = entry;\n    const serviceKey = ServiceClass.serviceKey;\n    const isSingleton = config.singleton !== false;\n\n    // For singletons, check for concurrent initialization\n    if (storeSingleton && isSingleton) {\n      const existingPromise = ServiceRegistry._initPromises.get(serviceKey);\n      if (existingPromise) return existingPromise;\n    }\n\n    const initPromise = ServiceRegistry.doInitializeService(entry, { isSingleton, storeSingleton });\n\n    if (storeSingleton && isSingleton) {\n      ServiceRegistry._initPromises.set(serviceKey, initPromise);\n    }\n\n    return initPromise;\n  }\n\n  /** Build stores for service injection */\n  // eslint-disable-next-line complexity\n  private static buildStoresForService(\n    config: CoreServiceInitConfig,\n    entry: CoreServiceEntry\n  ): Partial<RootStoreSlice> | undefined {\n    const allKeys = new Set<keyof RootStoreSlice>();\n\n    // Add primary store - check config first, then service's static primaryStoreKey\n    if (config.store) {\n      allKeys.add(config.store);\n    } else if (\n      'primaryStoreKey' in entry.service &&\n      typeof entry.service.primaryStoreKey === 'string'\n    ) {\n      // Auto-resolve from service class's static primaryStoreKey property\n      allKeys.add(entry.service.primaryStoreKey as keyof RootStoreSlice);\n      ServiceRegistry.logger.debug(\n        `Auto-resolved store key '${entry.service.primaryStoreKey}' from service class`\n      );\n    }\n\n    // Add read stores\n    if (config.readStores) {\n      config.readStores.forEach(key => allKeys.add(key));\n    }\n\n    if (allKeys.size === 0) {\n      return undefined;\n    }\n\n    if (!ServiceRegistry._storeRegistry) {\n      ServiceRegistry.logger.warn('Store registry not initialized, cannot inject stores');\n      return undefined;\n    }\n\n    const stores: Partial<RootStoreSlice> = {};\n    for (const key of allKeys) {\n      const store = ServiceRegistry._storeRegistry.getStore(key);\n      if (store) {\n        (stores as Record<keyof RootStoreSlice, unknown>)[key] = store;\n        ServiceRegistry.logger.debug(`Injected store '${key}' into service`);\n      } else {\n        ServiceRegistry.logger.warn(`Store '${key}' requested but not found in registry`);\n      }\n    }\n\n    return Object.keys(stores).length > 0 ? stores : undefined;\n  }\n\n  /** Perform the actual service initialization */\n  // eslint-disable-next-line complexity\n  private static async doInitializeService(\n    entry: CoreServiceEntry,\n    options: { isSingleton: boolean; storeSingleton: boolean }\n  ): Promise<CoreDomainServiceInstance> {\n    const { service: serviceClass, config } = entry;\n    const serviceKey = serviceClass.serviceKey;\n    const { isSingleton, storeSingleton } = options;\n\n    try {\n      ServiceRegistry.logger.debug(`Initializing service: ${serviceKey}`);\n\n      // Build dependencies (async operations) with runtime validation\n      const apiClient = await ServiceRegistry.buildApiClientOptions(config, entry);\n      const db = await ServiceRegistry.buildDbConfig(config, entry);\n      const cache = await ServiceRegistry.buildCacheConfig(config, entry);\n      const observability = ServiceRegistry.buildObservabilityConfig(config, entry);\n      const storage = await ServiceRegistry.buildStorageConfig(config, entry);\n      const notifications = await ServiceRegistry.buildNotificationsConfig(config, entry);\n      const stores = ServiceRegistry.buildStoresForService(config, entry);\n\n      // Create dedicated observability instance if requested\n      let observabilityInstance = observability?.instance;\n      if (observability?.dedicated && observability.config) {\n        observabilityInstance = await ServiceRegistry.createDedicatedObservability(\n          serviceKey,\n          observability.config\n        );\n      }\n\n      const createOptions: CoreServiceCreateOptions = {\n        apiClient,\n        db,\n        cache,\n        observability: observability\n          ? { ...observability, instance: observabilityInstance }\n          : undefined,\n        storage,\n        notifications,\n        injected: {\n          ...(stores ? { stores } : {}),\n          cache: cache?.instance,\n          db: db?.instance,\n          api: apiClient?.instance,\n          observability: observabilityInstance,\n          storage: storage?.instance,\n          notifications: notifications?.instance,\n        },\n        isSingleton,\n      };\n\n      ServiceRegistry.logger.debug(`Service ${serviceKey} config:`, {\n        apiClientDedicated: createOptions.apiClient?.dedicated,\n        dbDedicated: createOptions.db?.dedicated,\n        observabilityDedicated: createOptions.observability?.dedicated,\n        storageDedicated: createOptions.storage?.dedicated,\n        notificationsDedicated: createOptions.notifications?.dedicated,\n        injected: {\n          hasCache: !!createOptions.injected?.cache,\n          hasDb: !!createOptions.injected?.db,\n          hasApi: !!createOptions.injected?.api,\n          hasObservability: !!createOptions.injected?.observability,\n          hasStorage: !!createOptions.injected?.storage,\n          hasNotifications: !!createOptions.injected?.notifications,\n          hasStores: !!createOptions.injected?.stores,\n        },\n      });\n\n      const instance = await serviceClass.create(config, createOptions);\n\n      if (storeSingleton && isSingleton) {\n        ServiceRegistry._services.set(serviceKey, instance);\n        ServiceRegistry.logger.info(`Service initialized: ${serviceKey} (singleton)`);\n      } else {\n        ServiceRegistry.logger.info(`Service created: ${serviceKey} (instance)`);\n      }\n\n      return instance;\n    } catch (error) {\n      ServiceRegistry.logger.error(`Failed to initialize service: ${serviceKey}`, {\n        error: error instanceof Error ? error.message : String(error),\n      });\n      throw error;\n    } finally {\n      if (storeSingleton && isSingleton) {\n        ServiceRegistry._initPromises.delete(serviceKey);\n      }\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Disposal\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Dispose a specific service by key.\n   *\n   * @param key - Service key to dispose\n   */\n  static dispose(key: string): void {\n    const service = ServiceRegistry._services.get(key);\n    if (service) {\n      service.dispose();\n      ServiceRegistry._services.delete(key);\n      ServiceRegistry.logger.info(`Service disposed: ${key}`);\n    }\n    ServiceRegistry._pending.delete(key);\n  }\n\n  /**\n   * Dispose all services and clear the registry.\n   */\n  static disposeAll(): void {\n    // Dispose all initialized services\n    for (const [key, service] of ServiceRegistry._services) {\n      try {\n        service.dispose();\n        ServiceRegistry.logger.debug(`Disposed service: ${key}`);\n      } catch (error) {\n        ServiceRegistry.logger.error(`Error disposing service: ${key}`, {\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    // Clear all state\n    ServiceRegistry._services.clear();\n    ServiceRegistry._pending.clear();\n    ServiceRegistry._metadata.clear();\n    ServiceRegistry._initPromises.clear();\n    ServiceRegistry._apiClientOptions = null;\n    ServiceRegistry._dbConfig = null;\n    ServiceRegistry._cacheConfig = null;\n    ServiceRegistry._observabilityConfig = null;\n    ServiceRegistry._observabilityInstance = null;\n    ServiceRegistry._storageConfig = null;\n    ServiceRegistry._notificationsConfig = null;\n\n    ServiceRegistry.logger.info('Service registry disposed');\n  }\n\n  /**\n   * Check if a service is configured as singleton.\n   *\n   * @param key - Service key\n   * @returns true if singleton (default), false if non-singleton\n   */\n  static isSingleton(key: string): boolean {\n    const metadata = ServiceRegistry._metadata.get(key);\n    return metadata?.isSingleton ?? true;\n  }\n\n  /**\n   * Get all non-singleton service keys.\n   * These services must be created via `create()` method.\n   */\n  static getNonSingletonKeys(): string[] {\n    return [...ServiceRegistry._metadata.entries()]\n      .filter(([, meta]) => !meta.isSingleton)\n      .map(([key]) => key);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Dynamic Registration\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Register a new service dynamically after initialization.\n   *\n   * @param entry - Service entry to register\n   * @param initNow - Whether to initialize immediately (default: true)\n   *\n   * @example\n   * ```typescript\n   * // Register and initialize immediately\n   * await ServiceRegistry.register({\n   *   service: NewDomainService,\n   *   config: { enabled: true },\n   * });\n   *\n   * // Register for lazy initialization\n   * ServiceRegistry.register({\n   *   service: LazyService,\n   *   config: { enabled: true, initWhen: 'lazy' },\n   * }, false);\n   * ```\n   */\n  static async register(entry: CoreServiceEntry, initNow = true): Promise<void> {\n    const serviceKey = entry.service.serviceKey;\n\n    // Check if already registered\n    if (ServiceRegistry._services.has(serviceKey) || ServiceRegistry._pending.has(serviceKey)) {\n      ServiceRegistry.logger.warn(`Service '${serviceKey}' is already registered`);\n      return;\n    }\n\n    const initWhen = entry.config.initWhen ?? 'immediate';\n\n    if (initNow && initWhen === 'immediate') {\n      await ServiceRegistry.initializeService(entry);\n    } else {\n      ServiceRegistry._pending.set(serviceKey, { entry, initWhen });\n      ServiceRegistry.logger.debug(\n        `Service ${serviceKey} registered for ${initWhen} initialization`\n      );\n    }\n  }\n\n  /**\n   * Unregister a service (dispose if initialized).\n   *\n   * @param key - Service key to unregister\n   */\n  static unregister(key: string): void {\n    ServiceRegistry.dispose(key);\n  }\n}\n","/**\n * Stream Connection Manager\n *\n * Manages active streaming connections and channel subscriptions.\n * Provides connection lifecycle and subscription management.\n */\n\nimport type {\n  StreamChannel,\n  StreamConnection,\n  StreamConnectionInfo,\n  StreamManagerStats,\n  StreamTransportType,\n} from '@plyaz/types/core';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Default configuration\n */\nconst DEFAULT_STALE_MINUTES = 5;\nconst DEFAULT_MAX_STALE_AGE = DEFAULT_STALE_MINUTES * TIME_CONSTANTS.MINUTE; // 5 minutes\n\n/**\n * StreamConnectionManager - Manages streaming connections\n *\n * Features:\n * - Connection lifecycle management\n * - Channel-based subscriptions\n * - Activity tracking for stale connection cleanup\n * - Statistics and debugging info\n *\n * @example\n * ```ts\n * const manager = new StreamConnectionManager();\n *\n * // Add connection\n * manager.addConnection({\n *   id: 'conn-1',\n *   transport: 'sse',\n *   channels: new Set(),\n *   createdAt: new Date(),\n *   lastActivity: new Date(),\n * });\n *\n * // Subscribe to channel\n * manager.subscribe('conn-1', 'upload:abc123');\n *\n * // Get connections for broadcasting\n * const connections = manager.getConnectionsByChannel('upload:abc123');\n * ```\n */\nexport class StreamConnectionManager {\n  /** Active connections by ID */\n  private connections = new Map<string, StreamConnection>();\n\n  /** Channel → connection IDs mapping for efficient broadcasting */\n  private channelSubscriptions = new Map<string, Set<string>>();\n\n  /**\n   * Add a new connection\n   *\n   * @param connection - Connection to add\n   */\n  addConnection(connection: StreamConnection): void {\n    this.connections.set(connection.id, connection);\n  }\n\n  /**\n   * Remove a connection and its subscriptions\n   *\n   * @param connectionId - Connection to remove\n   */\n  removeConnection(connectionId: string): void {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    // Remove from all channel subscriptions\n    for (const channel of connection.channels) {\n      this.channelSubscriptions.get(channel)?.delete(connectionId);\n\n      // Clean up empty channel sets\n      if (this.channelSubscriptions.get(channel)?.size === 0) {\n        this.channelSubscriptions.delete(channel);\n      }\n    }\n\n    // Remove connection\n    this.connections.delete(connectionId);\n  }\n\n  /**\n   * Get a connection by ID\n   *\n   * @param connectionId - Connection ID\n   */\n  getConnection(connectionId: string): StreamConnection | undefined {\n    return this.connections.get(connectionId);\n  }\n\n  /**\n   * Check if connection exists\n   *\n   * @param connectionId - Connection ID\n   */\n  hasConnection(connectionId: string): boolean {\n    return this.connections.has(connectionId);\n  }\n\n  /**\n   * Subscribe connection to a channel\n   *\n   * @param connectionId - Connection to subscribe\n   * @param channel - Channel to subscribe to\n   */\n  subscribe(connectionId: string, channel: StreamChannel): void {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    // Add to connection's channels\n    connection.channels.add(channel);\n\n    // Add to channel subscriptions index\n    if (!this.channelSubscriptions.has(channel)) {\n      this.channelSubscriptions.set(channel, new Set());\n    }\n    this.channelSubscriptions.get(channel)!.add(connectionId);\n\n    // Update activity\n    connection.lastActivity = new Date();\n  }\n\n  /**\n   * Unsubscribe connection from a channel\n   *\n   * @param connectionId - Connection to unsubscribe\n   * @param channel - Channel to unsubscribe from\n   */\n  unsubscribe(connectionId: string, channel: StreamChannel): void {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    // Remove from connection's channels\n    connection.channels.delete(channel);\n\n    // Remove from channel subscriptions index\n    this.channelSubscriptions.get(channel)?.delete(connectionId);\n\n    // Clean up empty channel sets\n    if (this.channelSubscriptions.get(channel)?.size === 0) {\n      this.channelSubscriptions.delete(channel);\n    }\n\n    // Update activity\n    connection.lastActivity = new Date();\n  }\n\n  /**\n   * Get all connections subscribed to a channel\n   *\n   * @param channel - Channel to query\n   */\n  getConnectionsByChannel(channel: StreamChannel): StreamConnection[] {\n    const connectionIds = this.channelSubscriptions.get(channel);\n    if (!connectionIds) return [];\n\n    return Array.from(connectionIds)\n      .map(id => this.connections.get(id))\n      .filter((conn): conn is StreamConnection => conn !== undefined);\n  }\n\n  /**\n   * Get all channels a connection is subscribed to\n   *\n   * @param connectionId - Connection ID\n   */\n  getChannelsByConnection(connectionId: string): StreamChannel[] {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return [];\n\n    return Array.from(connection.channels) as StreamChannel[];\n  }\n\n  /**\n   * Update connection's last activity timestamp\n   *\n   * @param connectionId - Connection ID\n   */\n  updateActivity(connectionId: string): void {\n    const connection = this.connections.get(connectionId);\n    if (connection) {\n      connection.lastActivity = new Date();\n    }\n  }\n\n  /**\n   * Clean up stale connections\n   *\n   * @param maxAge - Maximum age in milliseconds (default: 5 minutes)\n   * @returns Removed connection IDs\n   */\n  cleanupStale(maxAge: number = DEFAULT_MAX_STALE_AGE): string[] {\n    const now = Date.now();\n    const removed: string[] = [];\n\n    for (const [id, connection] of this.connections) {\n      const age = now - connection.lastActivity.getTime();\n      if (age > maxAge) {\n        this.removeConnection(id);\n        removed.push(id);\n      }\n    }\n\n    return removed;\n  }\n\n  /**\n   * Get all connection IDs\n   */\n  getConnectionIds(): string[] {\n    return Array.from(this.connections.keys());\n  }\n\n  /**\n   * Get all connections\n   */\n  getAllConnections(): StreamConnection[] {\n    return Array.from(this.connections.values());\n  }\n\n  /**\n   * Get all active channels\n   */\n  getActiveChannels(): StreamChannel[] {\n    return Array.from(this.channelSubscriptions.keys()) as StreamChannel[];\n  }\n\n  /**\n   * Get connection info (serializable)\n   *\n   * @param connectionId - Connection ID\n   */\n  getConnectionInfo(connectionId: string): StreamConnectionInfo | undefined {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return undefined;\n\n    return {\n      id: connection.id,\n      userId: connection.userId,\n      transport: connection.transport,\n      channels: Array.from(connection.channels),\n      createdAt: connection.createdAt.toISOString(),\n      lastActivity: connection.lastActivity.toISOString(),\n      metadata: connection.metadata,\n    };\n  }\n\n  /**\n   * Get manager statistics\n   */\n  getStats(): StreamManagerStats {\n    const connectionsByTransport: Record<StreamTransportType, number> = {\n      sse: 0,\n      websocket: 0,\n    };\n\n    for (const connection of this.connections.values()) {\n      connectionsByTransport[connection.transport]++;\n    }\n\n    return {\n      totalConnections: this.connections.size,\n      connectionsByTransport,\n      totalSubscriptions: Array.from(this.channelSubscriptions.values()).reduce(\n        (sum, set) => sum + set.size,\n        0\n      ),\n      activeChannels: this.channelSubscriptions.size,\n    };\n  }\n\n  /**\n   * Clear all connections (for shutdown)\n   */\n  clear(): void {\n    this.connections.clear();\n    this.channelSubscriptions.clear();\n  }\n}\n","/**\n * Stream Broadcaster\n *\n * Core infrastructure for streaming to clients.\n * Orchestrates auth, transport, and connection management.\n *\n * Note: Event subscriptions are handled by ChannelControllers,\n * not directly by StreamBroadcaster.\n */\nimport type { BaseAuthAdapter } from './auth/BaseAuthAdapter';\nimport type { BaseTransportAdapter } from './transports/BaseTransportAdapter';\nimport { StreamConnectionManager } from './StreamConnectionManager';\nimport type {\n  StreamAuthResult,\n  StreamBroadcasterConfig,\n  StreamChannel,\n  StreamConnection,\n  StreamManagerStats,\n  StreamMessage,\n  StreamTransportType,\n} from '@plyaz/types/core';\nimport { STREAM_ERROR_CODES } from '@plyaz/types';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { StreamPackageError } from '@plyaz/errors';\n\n/**\n * Default configuration\n */\nconst DEFAULT_CLEANUP_INTERVAL = TIME_CONSTANTS.MINUTE; // 1 minute\nconst DEFAULT_STALE_MINUTES = 5;\nconst DEFAULT_MAX_STALE_AGE = DEFAULT_STALE_MINUTES * TIME_CONSTANTS.MINUTE; // 5 minutes\n\n/**\n * StreamBroadcaster - Core streaming infrastructure\n *\n * Features:\n * - Manages connections via StreamConnectionManager\n * - Routes messages through transport adapters (SSE, WebSocket)\n * - Handles auth via adapter\n * - Automatic stale connection cleanup\n * - Channel-based message broadcasting\n *\n * Note: Event subscriptions are handled by endpoint controllers\n * registered via StreamRegistry (e.g., FilesChannelController).\n *\n * @example\n * ```ts\n * const broadcaster = new StreamBroadcaster(\n *   new AnonymousAuthAdapter(),\n *   [new SSETransportAdapter()]\n * );\n *\n * broadcaster.initialize();\n *\n * // Register with StreamRegistry\n * await StreamRegistry.initialize({\n *   broadcaster,\n *   endpoints: [\n *     { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n *   ],\n * });\n *\n * // In API route\n * const authResult = await broadcaster.authenticate(request);\n * const response = await broadcaster.createConnection('conn-1', 'sse', request);\n * broadcaster.subscribe('conn-1', 'upload:abc123', authResult);\n * return response;\n * ```\n */\nexport class StreamBroadcaster {\n  private readonly connectionManager: StreamConnectionManager;\n  private readonly authAdapter: BaseAuthAdapter;\n  private readonly transports: Map<StreamTransportType, BaseTransportAdapter>;\n  private readonly maxStaleAge: number;\n\n  private unsubscribers: (() => void)[] = [];\n  private cleanupTimer?: ReturnType<typeof setInterval>;\n  private initialized = false;\n\n  constructor(\n    authAdapter: BaseAuthAdapter,\n    transports: BaseTransportAdapter[],\n    config?: StreamBroadcasterConfig\n  ) {\n    this.connectionManager = new StreamConnectionManager();\n    this.authAdapter = authAdapter;\n    this.transports = new Map(transports.map(t => [t.type, t]));\n    this.maxStaleAge = config?.maxStaleAge ?? DEFAULT_MAX_STALE_AGE;\n  }\n\n  /**\n   * Initialize cleanup timer\n   * Call once on startup\n   *\n   * Note: Event subscriptions are now handled by endpoint controllers\n   * registered via StreamRegistry (e.g., FilesChannelController, SystemChannelController).\n   */\n  initialize(): void {\n    if (this.initialized) return;\n\n    // Start cleanup timer for stale connections\n    this.cleanupTimer = setInterval(() => {\n      this.cleanupStaleConnections();\n    }, DEFAULT_CLEANUP_INTERVAL);\n\n    this.initialized = true;\n  }\n\n  /**\n   * Authenticate a connection request\n   *\n   * @param request - HTTP request\n   * @returns Authentication result\n   */\n  async authenticate(request: Request): Promise<StreamAuthResult> {\n    return this.authAdapter.authenticate(request);\n  }\n\n  /**\n   * Check if user can subscribe to a channel\n   *\n   * @param authResult - Authentication result\n   * @param channel - Channel to subscribe\n   */\n  canSubscribe(authResult: StreamAuthResult, channel: StreamChannel): boolean {\n    return this.authAdapter.canSubscribe(authResult.userId, channel, authResult.scopes);\n  }\n\n  /**\n   * Create a new streaming connection\n   *\n   * @param connectionId - Unique connection ID\n   * @param transportType - Transport to use (sse or websocket)\n   * @param request - HTTP request\n   * @param authResult - Optional auth result (if already authenticated)\n   * @returns Response (for SSE) or void (for WebSocket)\n   */\n  async createConnection(\n    connectionId: string,\n    transportType: StreamTransportType,\n    request: Request,\n    authResult?: StreamAuthResult\n  ): Promise<Response | void> {\n    const transport = this.transports.get(transportType);\n    if (!transport) {\n      throw new StreamPackageError(\n        `Transport not available: ${transportType}`,\n        STREAM_ERROR_CODES.TRANSPORT_NOT_SUPPORTED,\n        { context: { transport: transportType } }\n      );\n    }\n\n    // Create connection in transport\n    const response = await transport.createConnection(connectionId, request);\n\n    // Track connection\n    const connection: StreamConnection = {\n      id: connectionId,\n      userId: authResult?.userId,\n      transport: transportType,\n      channels: new Set(),\n      createdAt: new Date(),\n      lastActivity: new Date(),\n      metadata: authResult?.metadata,\n    };\n    this.connectionManager.addConnection(connection);\n\n    return response;\n  }\n\n  /**\n   * Subscribe connection to a channel\n   *\n   * @param connectionId - Connection ID\n   * @param channel - Channel to subscribe\n   * @param authResult - Auth result for permission check\n   * @returns Whether subscription succeeded\n   */\n  subscribe(connectionId: string, channel: StreamChannel, authResult?: StreamAuthResult): boolean {\n    // Check permission if auth result provided\n    if (authResult && !this.canSubscribe(authResult, channel)) {\n      return false;\n    }\n\n    this.connectionManager.subscribe(connectionId, channel);\n    return true;\n  }\n\n  /**\n   * Unsubscribe connection from a channel\n   *\n   * @param connectionId - Connection ID\n   * @param channel - Channel to unsubscribe\n   */\n  unsubscribe(connectionId: string, channel: StreamChannel): void {\n    this.connectionManager.unsubscribe(connectionId, channel);\n  }\n\n  /**\n   * Close a connection\n   *\n   * @param connectionId - Connection to close\n   */\n  async closeConnection(connectionId: string): Promise<void> {\n    const connection = this.connectionManager.getConnection(connectionId);\n    if (!connection) return;\n\n    // Close in transport\n    const transport = this.transports.get(connection.transport);\n    if (transport) {\n      await transport.close(connectionId);\n    }\n\n    // Remove from manager\n    this.connectionManager.removeConnection(connectionId);\n  }\n\n  /**\n   * Broadcast message to all connections on a channel\n   *\n   * @param channel - Channel to broadcast to\n   * @param message - Message to send\n   */\n  broadcastToChannel(channel: StreamChannel, message: StreamMessage): void {\n    const connections = this.connectionManager.getConnectionsByChannel(channel);\n\n    for (const conn of connections) {\n      const transport = this.transports.get(conn.transport);\n      if (transport) {\n        transport.send(conn.id, { ...message, channel }).catch(() => {\n          // Connection likely dead, will be cleaned up\n        });\n      }\n    }\n  }\n\n  /**\n   * Send message to a specific connection\n   *\n   * @param connectionId - Connection ID\n   * @param message - Message to send\n   */\n  async sendToConnection(connectionId: string, message: StreamMessage): Promise<void> {\n    const connection = this.connectionManager.getConnection(connectionId);\n    if (!connection) return;\n\n    const transport = this.transports.get(connection.transport);\n    if (transport) {\n      await transport.send(connectionId, message);\n    }\n  }\n\n  /**\n   * Broadcast to all connections (system-wide)\n   *\n   * @param message - Message to send\n   */\n  broadcastToAll(message: StreamMessage): void {\n    for (const connection of this.connectionManager.getAllConnections()) {\n      const transport = this.transports.get(connection.transport);\n      if (transport) {\n        transport.send(connection.id, message).catch(() => {\n          // Connection likely dead\n        });\n      }\n    }\n  }\n\n  /**\n   * Get manager statistics\n   */\n  getStats(): StreamManagerStats {\n    return this.connectionManager.getStats();\n  }\n\n  /**\n   * Dispose broadcaster (for shutdown)\n   */\n  dispose(): void {\n    // Stop event subscriptions\n    this.unsubscribers.forEach(unsub => unsub());\n    this.unsubscribers = [];\n\n    // Stop cleanup timer\n    if (this.cleanupTimer) {\n      clearInterval(this.cleanupTimer);\n      this.cleanupTimer = undefined;\n    }\n\n    // Close all connections\n    for (const [, transport] of this.transports) {\n      if ('closeAll' in transport && typeof transport.closeAll === 'function') {\n        void (transport as { closeAll: () => Promise<void> }).closeAll();\n      }\n    }\n\n    // Clear connection manager\n    this.connectionManager.clear();\n\n    this.initialized = false;\n  }\n\n  /**\n   * Clean up stale connections\n   */\n  private cleanupStaleConnections(): void {\n    const removed = this.connectionManager.cleanupStale(this.maxStaleAge);\n\n    // Also close in transports\n    for (const connectionId of removed) {\n      for (const [, transport] of this.transports) {\n        if (transport.isAlive(connectionId)) {\n          transport.close(connectionId).catch(() => {\n            // Already closed\n          });\n        }\n      }\n    }\n  }\n}\n","/**\n * Base Auth Adapter\n *\n * Abstract base class for stream authentication adapters.\n * Follows the adapter pattern used in @plyaz/storage.\n */\n\nimport type { StreamAuthAdapterConfig, StreamAuthResult, StreamChannel } from '@plyaz/types/core';\n\n/**\n * BaseAuthAdapter - Abstract base class for all stream auth adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for authentication and authorization\n *\n * Subclasses must implement:\n * - authenticate() - Validate connection request\n * - canSubscribe() - Check channel subscription permissions\n *\n * @example\n * ```ts\n * class MyAuthAdapter extends BaseAuthAdapter {\n *   async authenticate(request: Request): Promise<StreamAuthResult> {\n *     // Custom authentication logic\n *   }\n *\n *   canSubscribe(userId, channel, scopes): boolean {\n *     // Custom authorization logic\n *   }\n * }\n * ```\n */\nexport abstract class BaseAuthAdapter {\n  /** Adapter name for logging/debugging */\n  readonly name: string;\n\n  /** Whether this adapter is enabled */\n  readonly enabled: boolean;\n\n  constructor(config: StreamAuthAdapterConfig) {\n    this.name = config.name;\n    this.enabled = config.enabled ?? true;\n  }\n\n  /**\n   * Authenticate a connection request\n   *\n   * @param request - HTTP request or WebSocket upgrade request\n   * @returns Authentication result with user info if authenticated\n   */\n  abstract authenticate(request: Request): Promise<StreamAuthResult>;\n\n  /**\n   * Check if user can subscribe to a channel\n   *\n   * @param userId - User ID (undefined for anonymous connections)\n   * @param channel - Channel to subscribe to\n   * @param scopes - User's allowed scopes from authentication\n   * @returns Whether subscription is allowed\n   */\n  abstract canSubscribe(\n    userId: string | undefined,\n    channel: StreamChannel,\n    scopes?: string[]\n  ): boolean;\n\n  /**\n   * Get adapter info for debugging\n   */\n  getAdapterInfo(): { name: string; enabled: boolean } {\n    return {\n      name: this.name,\n      enabled: this.enabled,\n    };\n  }\n}\n","/**\n * Anonymous Auth Adapter\n *\n * No-op authentication adapter for local/development use.\n * Allows all connections and channel subscriptions.\n */\n\nimport type { StreamAuthResult, StreamChannel } from '@plyaz/types/core';\nimport { BaseAuthAdapter } from '../BaseAuthAdapter';\n\n/**\n * AnonymousAuthAdapter - Allows all connections without authentication\n *\n * Use cases:\n * - Local development\n * - Internal services without auth requirements\n * - Testing environments\n *\n * @example\n * ```ts\n * const authAdapter = new AnonymousAuthAdapter();\n *\n * // Always returns authenticated: true\n * const result = await authAdapter.authenticate(request);\n * console.log(result.authenticated); // true\n *\n * // Always allows subscription\n * const canSub = authAdapter.canSubscribe(undefined, 'uploads');\n * console.log(canSub); // true\n * ```\n */\nexport class AnonymousAuthAdapter extends BaseAuthAdapter {\n  constructor() {\n    super({ name: 'anonymous' });\n  }\n\n  /**\n   * Authenticate request (always succeeds)\n   *\n   * @returns Always returns { authenticated: true }\n   */\n  async authenticate(): Promise<StreamAuthResult> {\n    return { authenticated: true };\n  }\n\n  /**\n   * Check subscription permission (always allowed)\n   *\n   * @returns Always returns true\n   */\n  // eslint-disable-next-line  no-unused-vars\n  canSubscribe(_userId: string | undefined, _channel: StreamChannel, _scopes?: string[]): boolean {\n    return true;\n  }\n}\n","/**\n * Base Transport Adapter\n *\n * Abstract base class for stream transport adapters.\n * Follows the adapter pattern used in @plyaz/storage.\n */\n\nimport type {\n  StreamMessage,\n  StreamTransportAdapterConfig,\n  StreamTransportType,\n} from '@plyaz/types/core';\nimport { STREAMING_DEFAULTS } from '@plyaz/config/streaming';\n\n/**\n * BaseTransportAdapter - Abstract base class for all transport adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for connection management\n * - Message sending abstraction\n *\n * Subclasses must implement:\n * - createConnection() - Create new connection\n * - send() - Send message to connection\n * - close() - Close connection\n * - isAlive() - Check connection status\n *\n * @example\n * ```ts\n * class MyTransportAdapter extends BaseTransportAdapter {\n *   async createConnection(connectionId: string, request: Request): Promise<Response> {\n *     // Implementation\n *   }\n *   // ... other methods\n * }\n * ```\n */\nexport abstract class BaseTransportAdapter {\n  /** Adapter name for logging/debugging */\n  readonly name: string;\n\n  /** Transport type identifier */\n  readonly type: StreamTransportType;\n\n  /** Heartbeat interval in milliseconds */\n  protected readonly heartbeatInterval: number;\n\n  /** Maximum concurrent connections */\n  protected readonly maxConnections: number;\n\n  constructor(config: StreamTransportAdapterConfig & { type: StreamTransportType }) {\n    this.name = config.name;\n    this.type = config.type;\n    this.heartbeatInterval = config.heartbeatInterval ?? STREAMING_DEFAULTS.HEARTBEAT_INTERVAL_MS;\n    this.maxConnections = config.maxConnections ?? STREAMING_DEFAULTS.MAX_CONNECTIONS;\n  }\n\n  /**\n   * Create a new streaming connection\n   *\n   * For SSE: Returns a Response with streaming body\n   * For WebSocket: Modifies socket directly, returns void\n   *\n   * @param connectionId - Unique connection identifier\n   * @param request - HTTP request or WebSocket upgrade request\n   * @returns Response for SSE, void for WebSocket\n   */\n  abstract createConnection(connectionId: string, request: Request): Promise<Response | void>;\n\n  /**\n   * Send a message to a specific connection\n   *\n   * @param connectionId - Connection to send to\n   * @param message - Message to send\n   */\n  abstract send(connectionId: string, message: StreamMessage): Promise<void>;\n\n  /**\n   * Close a connection\n   *\n   * @param connectionId - Connection to close\n   */\n  abstract close(connectionId: string): Promise<void>;\n\n  /**\n   * Check if a connection is still alive\n   *\n   * @param connectionId - Connection to check\n   * @returns Whether connection is alive\n   */\n  abstract isAlive(connectionId: string): boolean;\n\n  /**\n   * Get current connection count\n   *\n   * @returns Number of active connections\n   */\n  abstract getConnectionCount(): number;\n\n  /**\n   * Get adapter info for debugging\n   */\n  getAdapterInfo(): {\n    name: string;\n    type: StreamTransportType;\n    heartbeatInterval: number;\n    maxConnections: number;\n    connectionCount: number;\n  } {\n    return {\n      name: this.name,\n      type: this.type,\n      heartbeatInterval: this.heartbeatInterval,\n      maxConnections: this.maxConnections,\n      connectionCount: this.getConnectionCount(),\n    };\n  }\n\n  /**\n   * Check if adapter can accept more connections\n   */\n  canAcceptConnection(): boolean {\n    return this.getConnectionCount() < this.maxConnections;\n  }\n}\n","/**\n * SSE Transport Adapter\n *\n * Server-Sent Events transport for real-time streaming.\n * Uses Web Streams API for compatibility with Next.js/Edge runtime.\n */\n\n/* eslint-disable n/no-unsupported-features/node-builtins */\n// ReadableStream and ReadableStreamDefaultController are stable Web APIs,\n// supported in all modern browsers and Edge runtime\n\nimport type { StreamMessage, StreamTransportAdapterConfig } from '@plyaz/types/core';\nimport { BaseTransportAdapter } from '../BaseTransportAdapter';\n\n/**\n * Internal connection state\n */\ninterface SSEConnection {\n  controller: ReadableStreamDefaultController;\n  heartbeatTimer?: ReturnType<typeof setInterval>;\n  createdAt: Date;\n}\n\n/**\n * SSETransportAdapter - Server-Sent Events transport\n *\n * Features:\n * - Web Streams API for Edge runtime compatibility\n * - Automatic heartbeat to keep connections alive\n * - Proper SSE formatting with event, id, retry, data fields\n * - Connection cleanup on disconnect\n *\n * @example\n * ```ts\n * const sseAdapter = new SSETransportAdapter({ heartbeatInterval: 15000 });\n *\n * // In API route\n * const response = await sseAdapter.createConnection(connectionId, request);\n * return response; // Returns SSE stream\n *\n * // Send message\n * await sseAdapter.send(connectionId, {\n *   event: 'progress',\n *   data: { percentage: 50 },\n * });\n * ```\n */\nexport class SSETransportAdapter extends BaseTransportAdapter {\n  private connections = new Map<string, SSEConnection>();\n\n  constructor(config?: Partial<StreamTransportAdapterConfig>) {\n    super({\n      name: config?.name ?? 'sse',\n      type: 'sse',\n      heartbeatInterval: config?.heartbeatInterval,\n      maxConnections: config?.maxConnections,\n    });\n  }\n\n  /**\n   * Create a new SSE connection\n   *\n   * @param connectionId - Unique connection identifier\n   * @returns Response with SSE stream\n   */\n  async createConnection(connectionId: string): Promise<Response> {\n    // Check if we can accept more connections\n    if (!this.canAcceptConnection()) {\n      return new Response('Too many connections', { status: 503 });\n    }\n\n    // Create the SSE stream\n    const stream = new ReadableStream({\n      start: controller => {\n        // Store connection\n        const connection: SSEConnection = {\n          controller,\n          createdAt: new Date(),\n        };\n        this.connections.set(connectionId, connection);\n\n        // Send initial connection message\n        this.sendImmediate(controller, {\n          event: 'connected',\n          data: { connectionId, timestamp: Date.now() },\n        });\n\n        // Start heartbeat\n        connection.heartbeatTimer = setInterval(() => {\n          if (!this.isAlive(connectionId)) {\n            this.cleanup(connectionId);\n            return;\n          }\n          this.sendImmediate(controller, {\n            event: 'heartbeat',\n            data: { timestamp: Date.now() },\n          });\n        }, this.heartbeatInterval);\n      },\n      cancel: () => {\n        this.cleanup(connectionId);\n      },\n    });\n\n    return new Response(stream, {\n      headers: {\n        'Content-Type': 'text/event-stream',\n        'Cache-Control': 'no-cache, no-transform',\n        Connection: 'keep-alive',\n        'X-Accel-Buffering': 'no', // Disable nginx buffering\n      },\n    });\n  }\n\n  /**\n   * Send a message to a connection\n   *\n   * @param connectionId - Connection to send to\n   * @param message - Message to send\n   */\n  async send(connectionId: string, message: StreamMessage): Promise<void> {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    try {\n      this.sendImmediate(connection.controller, message);\n    } catch {\n      // Connection likely closed, cleanup\n      this.cleanup(connectionId);\n    }\n  }\n\n  /**\n   * Close a connection\n   *\n   * @param connectionId - Connection to close\n   */\n  async close(connectionId: string): Promise<void> {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    try {\n      // Send close event before closing\n      this.sendImmediate(connection.controller, {\n        event: 'close',\n        data: { reason: 'server_close' },\n      });\n      connection.controller.close();\n    } catch {\n      // Already closed\n    }\n\n    this.cleanup(connectionId);\n  }\n\n  /**\n   * Check if a connection is alive\n   *\n   * @param connectionId - Connection to check\n   */\n  isAlive(connectionId: string): boolean {\n    return this.connections.has(connectionId);\n  }\n\n  /**\n   * Get current connection count\n   */\n  getConnectionCount(): number {\n    return this.connections.size;\n  }\n\n  /**\n   * Get all connection IDs\n   */\n  getConnectionIds(): string[] {\n    return Array.from(this.connections.keys());\n  }\n\n  /**\n   * Send message immediately to controller\n   */\n  private sendImmediate(controller: ReadableStreamDefaultController, message: StreamMessage): void {\n    const formatted = this.formatSSE(message);\n    controller.enqueue(new TextEncoder().encode(formatted));\n  }\n\n  /**\n   * Format message as SSE\n   *\n   * SSE format:\n   * ```\n   * id: messageId\n   * retry: retryMs\n   * data: {\"event\":\"eventName\",\"channel\":\"channelName\",\"data\":{...}}\n   *\n   * ```\n   *\n   * Note: We intentionally DON'T use SSE named events (event: line) because:\n   * 1. EventSource silently drops events without registered listeners\n   * 2. Hardcoding all possible event names is not scalable\n   * 3. Including event in JSON payload is more flexible\n   *\n   * The client extracts event/channel from the JSON payload in onmessage.\n   */\n  private formatSSE(message: StreamMessage): string {\n    let output = '';\n\n    if (message.id) {\n      output += `id: ${message.id}\\n`;\n    }\n\n    if (message.retry !== undefined) {\n      output += `retry: ${message.retry}\\n`;\n    }\n\n    // Include event and channel in the data payload for the client to extract\n    const payload = {\n      event: message.event,\n      channel: message.channel,\n      data: message.data,\n      timestamp: message.timestamp ?? Date.now(),\n    };\n\n    output += `data: ${JSON.stringify(payload)}\\n`;\n\n    // Double newline to end message\n    output += '\\n';\n\n    return output;\n  }\n\n  /**\n   * Cleanup connection resources\n   */\n  private cleanup(connectionId: string): void {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    // Clear heartbeat timer\n    if (connection.heartbeatTimer) {\n      clearInterval(connection.heartbeatTimer);\n    }\n\n    // Remove from map\n    this.connections.delete(connectionId);\n  }\n\n  /**\n   * Close all connections (for shutdown)\n   */\n  async closeAll(): Promise<void> {\n    const connectionIds = this.getConnectionIds();\n    await Promise.all(connectionIds.map(id => this.close(id)));\n  }\n}\n","/**\n * Base Framework Adapter\n *\n * Abstract base class for framework-specific streaming adapters.\n * Converts framework-specific request/response to Web Request/Response.\n *\n * Follows the adapter pattern used in BaseTransportAdapter and BaseAuthAdapter.\n *\n * @example\n * ```typescript\n * class MyFrameworkAdapter extends BaseFrameworkAdapter {\n *   readonly framework = 'myframework' as const;\n *\n *   createHandler(handleRequest, options) {\n *     return (req, res) => {\n *       const webRequest = this.convertRequest(req);\n *       const response = await handleRequest(webRequest, options?.transport);\n *       await this.handleResponse(response, req, res);\n *     };\n *   }\n *   // ... other methods\n * }\n * ```\n */\n\nimport type {\n  FrameworkType,\n  FrameworkAdapterConfig,\n  FrameworkHandlerOptions,\n  CoreRequestHandler,\n} from '@plyaz/types/core';\n\n/**\n * BaseFrameworkAdapter - Abstract base class for framework adapters\n *\n * Provides:\n * - Common configuration handling\n * - Interface for request/response conversion\n * - Handler creation abstraction\n *\n * Subclasses must implement:\n * - framework - Framework identifier\n * - createHandler() - Create framework-specific handler\n * - convertRequest() - Convert framework request to Web Request\n * - handleResponse() - Handle Web Response for framework\n */\nexport abstract class BaseFrameworkAdapter {\n  /** Adapter name for logging/debugging */\n  readonly name: string;\n\n  /** Framework type identifier */\n  abstract readonly framework: FrameworkType;\n\n  /** Whether adapter is enabled */\n  readonly enabled: boolean;\n\n  constructor(config: FrameworkAdapterConfig = {} as FrameworkAdapterConfig) {\n    this.name = config.name ?? this.constructor.name;\n    this.enabled = config.enabled ?? true;\n  }\n\n  /**\n   * Create a handler function for the framework.\n   *\n   * The returned handler type varies by framework:\n   * - Next.js: `(request: Request) => Promise<Response>`\n   * - Express: `(req: Request, res: Response) => Promise<void>`\n   * - NestJS: `(req: Request, res: Response) => Promise<void>`\n   *\n   * @param handleRequest - Core request handler from StreamServer\n   * @param options - Handler options (transport type, etc.)\n   * @returns Framework-specific handler function\n   *\n   * @example\n   * ```typescript\n   * // Next.js\n   * export const GET = adapter.createHandler(streamServer.handleRequest);\n   *\n   * // Express\n   * app.get('/stream', adapter.createHandler(streamServer.handleRequest));\n   * ```\n   */\n  abstract createHandler(\n    handleRequest: CoreRequestHandler,\n    options?: FrameworkHandlerOptions\n  ): unknown;\n\n  /**\n   * Convert framework-specific request to Web Request.\n   *\n   * @param frameworkRequest - Framework-specific request object\n   * @returns Web Request object\n   */\n  abstract convertRequest(frameworkRequest: unknown): Request;\n\n  /**\n   * Handle Web Response and send to framework response.\n   *\n   * For Next.js/Edge: Returns Response directly\n   * For Express/NestJS: Streams to res object\n   *\n   * @param response - Web Response from core handler\n   * @param frameworkRequest - Original framework request\n   * @param frameworkResponse - Framework response object (for Express-like frameworks)\n   * @returns Response for return-based frameworks, void for stream-based\n   */\n  abstract handleResponse(\n    response: Response,\n    frameworkRequest: unknown,\n    frameworkResponse?: unknown\n  ): Promise<Response | void>;\n\n  /**\n   * Get adapter info for debugging\n   */\n  getAdapterInfo(): {\n    name: string;\n    framework: FrameworkType;\n    enabled: boolean;\n  } {\n    return {\n      name: this.name,\n      framework: this.framework,\n      enabled: this.enabled,\n    };\n  }\n}\n","/**\n * Next.js Framework Adapter\n *\n * Framework adapter for Next.js App Router (Route Handlers).\n * Next.js uses Web Request/Response natively, so this is mostly a passthrough.\n *\n * @example\n * ```typescript\n * // app/api/events/stream/route.ts\n * import { streamServer } from '@/lib/stream';\n *\n * export const GET = streamServer.getHandler('nextjs');\n * ```\n */\n\nimport type {\n  FrameworkAdapterConfig,\n  FrameworkHandlerOptions,\n  CoreRequestHandler,\n  NextJSHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * NextJSFrameworkAdapter - Next.js App Router adapter\n *\n * Features:\n * - Native Web Request/Response support (zero conversion overhead)\n * - Works with Next.js App Router route handlers\n * - Edge Runtime compatible\n *\n * @example\n * ```typescript\n * const adapter = new NextJSFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n * export const GET = handler;\n * ```\n */\nexport class NextJSFrameworkAdapter extends BaseFrameworkAdapter {\n  readonly framework = 'nextjs' as const;\n\n  constructor(config?: FrameworkAdapterConfig) {\n    super({\n      name: config?.name ?? 'nextjs',\n      enabled: config?.enabled,\n    });\n  }\n\n  /**\n   * Create Next.js route handler.\n   *\n   * @param handleRequest - Core request handler from StreamServer\n   * @param options - Handler options\n   * @returns Next.js route handler function\n   */\n  createHandler(\n    handleRequest: CoreRequestHandler,\n    options?: FrameworkHandlerOptions\n  ): NextJSHandler {\n    const transport = options?.transport ?? 'sse';\n\n    return (request: Request): Promise<Response> => {\n      return handleRequest(request, transport);\n    };\n  }\n\n  /**\n   * Convert Next.js request to Web Request.\n   * Next.js already uses Web Request, so this is a passthrough.\n   *\n   * @param request - Next.js Request (which is a Web Request)\n   * @returns The same Request object\n   */\n  convertRequest(request: Request): Request {\n    return request;\n  }\n\n  /**\n   * Handle Web Response for Next.js.\n   * Next.js returns Response directly, so this is a passthrough.\n   *\n   * @param response - Web Response from core handler\n   * @returns The same Response object\n   */\n  async handleResponse(response: Response): Promise<Response> {\n    return response;\n  }\n}\n","/**\n * Express Framework Adapter\n *\n * Framework adapter for Express.js and compatible frameworks (Fastify, Koa, etc.).\n * Converts Express req/res to Web Request/Response and handles SSE streaming.\n *\n * @example\n * ```typescript\n * import express from 'express';\n * import { streamServer } from './stream';\n *\n * const app = express();\n * app.get('/events/stream', streamServer.getHandler('express'));\n * ```\n */\n\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n  FrameworkAdapterConfig,\n  FrameworkHandlerOptions,\n  CoreRequestHandler,\n  ExpressRequest,\n  ExpressResponse,\n  ExpressHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * ExpressFrameworkAdapter - Express/Fastify adapter\n *\n * Features:\n * - Converts Express req/res to Web Request/Response\n * - Handles SSE streaming to Express response\n * - Manages connection cleanup on client disconnect\n * - Compatible with Express, Fastify, Koa (with adapters)\n *\n * @example\n * ```typescript\n * const adapter = new ExpressFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n * app.get('/stream', handler);\n * ```\n */\nexport class ExpressFrameworkAdapter extends BaseFrameworkAdapter {\n  readonly framework = 'express' as const;\n\n  constructor(config?: FrameworkAdapterConfig) {\n    super({\n      name: config?.name ?? 'express',\n      enabled: config?.enabled,\n    });\n  }\n\n  /**\n   * Create Express route handler.\n   *\n   * @param handleRequest - Core request handler from StreamServer\n   * @param options - Handler options\n   * @returns Express route handler function\n   */\n  createHandler(\n    handleRequest: CoreRequestHandler,\n    options?: FrameworkHandlerOptions\n  ): ExpressHandler {\n    const transport = options?.transport ?? 'sse';\n\n    return async (req: ExpressRequest, res: ExpressResponse): Promise<void> => {\n      const webRequest = this.convertRequest(req);\n      const response = await handleRequest(webRequest, transport);\n      await this.handleResponse(response, req, res);\n    };\n  }\n\n  /**\n   * Convert Express request to Web Request.\n   *\n   * @param req - Express request object\n   * @returns Web Request object\n   */\n  convertRequest(req: ExpressRequest): Request {\n    const url = new URL(req.url, 'http://localhost');\n\n    // Convert headers, handling array values\n    const headers = new Headers();\n    for (const [key, value] of Object.entries(req.headers)) {\n      if (value !== undefined && value !== null) {\n        if (Array.isArray(value)) {\n          value.forEach(v => headers.append(key, v));\n        } else {\n          headers.set(key, value as string);\n        }\n      }\n    }\n\n    return new Request(url, {\n      headers,\n      method: req.method ?? 'GET',\n    });\n  }\n\n  /**\n   * Handle Web Response and stream to Express response.\n   *\n   * @param response - Web Response from core handler\n   * @param _req - Original Express request (unused)\n   * @param res - Express response object\n   */\n  async handleResponse(response: Response, _req: unknown, res: unknown): Promise<void> {\n    const expressRes = res as ExpressResponse;\n\n    // Write SSE headers\n    expressRes.writeHead(HTTP_STATUS.OK, {\n      'Content-Type': 'text/event-stream',\n      'Cache-Control': 'no-cache',\n      Connection: 'keep-alive',\n    });\n\n    // Stream response body\n    const reader = response.body?.getReader();\n    if (reader) {\n      const pump = async (): Promise<void> => {\n        const { done, value } = await reader.read();\n        if (done) return;\n        expressRes.write(new TextDecoder().decode(value));\n        return pump();\n      };\n      void pump();\n\n      // Handle client disconnect\n      expressRes.on('close', () => {\n        void reader.cancel();\n      });\n    }\n  }\n}\n","/**\n * NestJS Framework Adapter\n *\n * Framework adapter for NestJS controllers.\n * NestJS typically uses Express under the hood, so this adapter handles\n * the Express-style req/res pattern used in NestJS controllers.\n *\n * @example\n * ```typescript\n * // In a NestJS controller\n * @Controller('events')\n * export class StreamingController {\n *   constructor(@Inject(STREAM_SERVER) private streamServer: StreamServer) {}\n *\n *   @Get('stream')\n *   async stream(@Req() req: Request, @Res() res: Response) {\n *     const handler = this.streamServer.getHandler('nestjs');\n *     await handler(req, res);\n *   }\n * }\n * ```\n */\n\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n  FrameworkAdapterConfig,\n  FrameworkHandlerOptions,\n  CoreRequestHandler,\n  NestJSRequest,\n  NestJSResponse,\n  NestJSHandler,\n} from '@plyaz/types/core';\nimport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n/**\n * NestJSFrameworkAdapter - NestJS adapter\n *\n * Features:\n * - Works with NestJS Express-based controllers\n * - Handles @Req() and @Res() decorated parameters\n * - Supports both writeHead and setHeader patterns\n * - Manages SSE streaming to response\n *\n * @example\n * ```typescript\n * const adapter = new NestJSFrameworkAdapter();\n * const handler = adapter.createHandler(streamServer.handleRequest);\n *\n * // In controller method:\n * await handler(req, res);\n * ```\n */\nexport class NestJSFrameworkAdapter extends BaseFrameworkAdapter {\n  readonly framework = 'nestjs' as const;\n\n  constructor(config?: FrameworkAdapterConfig) {\n    super({\n      name: config?.name ?? 'nestjs',\n      enabled: config?.enabled,\n    });\n  }\n\n  /**\n   * Create NestJS controller handler.\n   *\n   * @param handleRequest - Core request handler from StreamServer\n   * @param options - Handler options\n   * @returns NestJS controller handler function\n   */\n  createHandler(\n    handleRequest: CoreRequestHandler,\n    options?: FrameworkHandlerOptions\n  ): NestJSHandler {\n    const transport = options?.transport ?? 'sse';\n\n    return async (req: NestJSRequest, res: NestJSResponse): Promise<void> => {\n      const webRequest = this.convertRequest(req);\n      const response = await handleRequest(webRequest, transport);\n      await this.handleResponse(response, req, res);\n    };\n  }\n\n  /**\n   * Convert NestJS request to Web Request.\n   *\n   * @param req - NestJS request object\n   * @returns Web Request object\n   */\n  convertRequest(req: NestJSRequest): Request {\n    const url = new URL(req.url, 'http://localhost');\n\n    // Convert headers, handling array values\n    const headers = new Headers();\n    for (const [key, value] of Object.entries(req.headers)) {\n      if (value !== undefined && value !== null) {\n        if (Array.isArray(value)) {\n          value.forEach(v => headers.append(key, v));\n        } else {\n          headers.set(key, value as string);\n        }\n      }\n    }\n\n    return new Request(url, {\n      headers,\n      method: req.method ?? 'GET',\n    });\n  }\n\n  /**\n   * Handle Web Response and stream to NestJS response.\n   *\n   * @param response - Web Response from core handler\n   * @param _req - Original NestJS request (unused)\n   * @param res - NestJS response object\n   */\n  async handleResponse(response: Response, _req: unknown, res: unknown): Promise<void> {\n    const nestRes = res as NestJSResponse;\n\n    // Set SSE headers using available method\n    if (nestRes.writeHead) {\n      nestRes.writeHead(HTTP_STATUS.OK, {\n        'Content-Type': 'text/event-stream',\n        'Cache-Control': 'no-cache',\n        Connection: 'keep-alive',\n      });\n    } else {\n      // Fallback to setHeader for NestJS\n      nestRes.status(HTTP_STATUS.OK);\n      nestRes.setHeader('Content-Type', 'text/event-stream');\n      nestRes.setHeader('Cache-Control', 'no-cache');\n      nestRes.setHeader('Connection', 'keep-alive');\n      // Flush headers to start streaming\n      if (nestRes.flushHeaders) {\n        nestRes.flushHeaders();\n      }\n    }\n\n    // Stream response body\n    const reader = response.body?.getReader();\n    if (reader) {\n      const pump = async (): Promise<void> => {\n        const { done, value } = await reader.read();\n        if (done) return;\n        nestRes.write(new TextDecoder().decode(value));\n        return pump();\n      };\n      void pump();\n\n      // Handle client disconnect\n      nestRes.on('close', () => {\n        void reader.cancel();\n      });\n    }\n  }\n}\n","/**\n * Framework Adapters\n *\n * Adapters for integrating StreamServer with various JavaScript frameworks.\n * Each adapter converts framework-specific request/response to Web Request/Response.\n *\n * @example\n * ```typescript\n * import {\n *   NextJSFrameworkAdapter,\n *   ExpressFrameworkAdapter,\n *   NestJSFrameworkAdapter,\n * } from '@plyaz/core/events/streaming/frameworks';\n *\n * // Register custom adapter\n * streamServer.registerFrameworkAdapter(new NextJSFrameworkAdapter());\n *\n * // Get handler for framework\n * const handler = streamServer.getHandler('nextjs');\n * ```\n */\n\n// Base adapter\nexport { BaseFrameworkAdapter } from './BaseFrameworkAdapter';\n\n// Framework adapters\nexport { NextJSFrameworkAdapter } from './NextJSFrameworkAdapter';\nexport { ExpressFrameworkAdapter } from './ExpressFrameworkAdapter';\nexport { NestJSFrameworkAdapter } from './NestJSFrameworkAdapter';\n\n// Types from @plyaz/types\nexport type {\n  FrameworkType,\n  FrameworkAdapterConfig,\n  FrameworkHandlerOptions,\n  CoreRequestHandler,\n  NextJSHandler,\n  ExpressRequest,\n  ExpressResponse,\n  ExpressHandler,\n  NestJSRequest,\n  NestJSResponse,\n  NestJSHandler,\n} from '@plyaz/types/core';\n","/**\n * Stream Server\n *\n * Framework-agnostic streaming server factory.\n * Provides easy configuration and integration with Next.js, NestJS, Express, etc.\n *\n * Uses framework adapters for handling different runtimes:\n * - NextJSFrameworkAdapter - Next.js App Router (Web Request/Response)\n * - ExpressFrameworkAdapter - Express/Fastify (req/res pattern)\n * - NestJSFrameworkAdapter - NestJS controllers\n *\n * @example\n * ```ts\n * // Create server with builder pattern\n * const streamServer = StreamServer.create()\n *   .withAuth(new AnonymousAuthAdapter())\n *   .withSSE({ heartbeatInterval: 15000 })\n *   .build();\n *\n * // Use in Next.js\n * export const GET = streamServer.getHandler('nextjs');\n *\n * // Use in Express\n * app.get('/stream', streamServer.getHandler('express'));\n *\n * // Use in NestJS\n * const handler = streamServer.getHandler('nestjs');\n * await handler(req, res);\n * ```\n */\n\nimport { StreamBroadcaster } from './StreamBroadcaster';\nimport type { BaseAuthAdapter } from './auth/BaseAuthAdapter';\nimport { AnonymousAuthAdapter } from './auth/adapters/AnonymousAuthAdapter';\nimport type { BaseTransportAdapter } from './transports/BaseTransportAdapter';\nimport { SSETransportAdapter } from './transports/adapters/SSETransportAdapter';\nimport type { BaseFrameworkAdapter } from './frameworks';\nimport {\n  NextJSFrameworkAdapter,\n  ExpressFrameworkAdapter,\n  NestJSFrameworkAdapter,\n  type FrameworkType,\n  type FrameworkHandlerOptions,\n} from './frameworks';\nimport type {\n  StreamAuthResult,\n  StreamBroadcasterConfig,\n  StreamChannel,\n  StreamManagerStats,\n  StreamTransportType,\n  SSEConfig,\n  WebSocketConfig,\n} from '@plyaz/types/core';\nimport { STREAM_ERROR_CODES } from '@plyaz/types';\nimport { StreamPackageError } from '@plyaz/errors';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Configuration Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Stream server configuration\n */\nexport interface StreamServerConfig {\n  /** Auth adapter to use */\n  auth?: BaseAuthAdapter;\n  /** Transport adapters to use */\n  transports?: BaseTransportAdapter[];\n  /** Broadcaster configuration */\n  broadcaster?: StreamBroadcasterConfig;\n  /** Default channels for new connections */\n  defaultChannels?: StreamChannel[];\n  /** Parse channels from request (default: query param 'channels') */\n  parseChannels?: (request: Request) => StreamChannel[];\n  /** Custom framework adapters (NextJS, Express, NestJS registered by default) */\n  frameworkAdapters?: BaseFrameworkAdapter[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stream Server Builder\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Builder for StreamServer\n */\nexport class StreamServerBuilder {\n  private authAdapter?: BaseAuthAdapter;\n  private transports: BaseTransportAdapter[] = [];\n  private broadcasterConfig?: StreamBroadcasterConfig;\n  private defaultChannels: StreamChannel[] = ['uploads'];\n  private channelParser?: (request: Request) => StreamChannel[];\n\n  /**\n   * Configure authentication\n   */\n  withAuth(adapter: BaseAuthAdapter): this {\n    this.authAdapter = adapter;\n    return this;\n  }\n\n  /**\n   * Enable SSE transport\n   */\n  withSSE(config?: SSEConfig): this {\n    if (config?.enabled === false) return this;\n    this.transports.push(new SSETransportAdapter(config));\n    return this;\n  }\n\n  /**\n   * Enable WebSocket transport (future)\n   */\n  // eslint-disable-next-line no-unused-vars\n  withWebSocket(_config?: WebSocketConfig): this {\n    // Future: this.transports.push(new WebSocketTransportAdapter(config));\n    console.warn('WebSocket transport not yet implemented');\n    return this;\n  }\n\n  /**\n   * Add custom transport\n   */\n  withTransport(adapter: BaseTransportAdapter): this {\n    this.transports.push(adapter);\n    return this;\n  }\n\n  /**\n   * Configure broadcaster\n   */\n  withBroadcaster(config: StreamBroadcasterConfig): this {\n    this.broadcasterConfig = config;\n    return this;\n  }\n\n  /**\n   * Set default channels for new connections\n   */\n  withDefaultChannels(channels: StreamChannel[]): this {\n    this.defaultChannels = channels;\n    return this;\n  }\n\n  /**\n   * Custom channel parser\n   */\n  withChannelParser(parser: (request: Request) => StreamChannel[]): this {\n    this.channelParser = parser;\n    return this;\n  }\n\n  /**\n   * Build the stream server\n   */\n  build(): StreamServer {\n    // Default to anonymous auth if not specified\n    const auth = this.authAdapter ?? new AnonymousAuthAdapter();\n\n    // Default to SSE if no transports specified\n    const transports = this.transports.length > 0 ? this.transports : [new SSETransportAdapter()];\n\n    return new StreamServer({\n      auth,\n      transports,\n      broadcaster: this.broadcasterConfig,\n      defaultChannels: this.defaultChannels,\n      parseChannels: this.channelParser,\n    });\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Stream Server\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * StreamServer - Framework-agnostic streaming server\n *\n * Features:\n * - Builder pattern for easy configuration\n * - Framework adapter pattern for easy integration\n * - Automatic connection lifecycle management\n * - Channel-based subscriptions\n *\n * @example\n * ```ts\n * const server = StreamServer.create()\n *   .withAuth(new TokenAuthAdapter({ verifyToken: myVerifier }))\n *   .withSSE({ heartbeatInterval: 30000 })\n *   .build();\n *\n * // Initialize on startup\n * server.initialize();\n *\n * // Get handler for your framework\n * export const GET = server.getHandler('nextjs');\n * // or\n * app.get('/stream', server.getHandler('express'));\n *\n * // Register endpoints via StreamRegistry\n * await StreamRegistry.initialize({\n *   broadcaster: server.getBroadcaster(),\n *   endpoints: [\n *     { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n *     { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n *   ],\n * });\n * ```\n */\nexport class StreamServer {\n  private readonly broadcaster: StreamBroadcaster;\n  private readonly config: StreamServerConfig;\n  private readonly frameworkAdapters = new Map<FrameworkType, BaseFrameworkAdapter>();\n  private initialized = false;\n\n  constructor(config: StreamServerConfig) {\n    this.config = config;\n\n    // Create broadcaster\n    this.broadcaster = new StreamBroadcaster(\n      config.auth ?? new AnonymousAuthAdapter(),\n      config.transports ?? [new SSETransportAdapter()],\n      config.broadcaster\n    );\n\n    // Register default framework adapters\n    this.registerFrameworkAdapter(new NextJSFrameworkAdapter());\n    this.registerFrameworkAdapter(new ExpressFrameworkAdapter());\n    this.registerFrameworkAdapter(new NestJSFrameworkAdapter());\n\n    // Register custom framework adapters if provided\n    if (config.frameworkAdapters) {\n      for (const adapter of config.frameworkAdapters) {\n        this.registerFrameworkAdapter(adapter);\n      }\n    }\n  }\n\n  /**\n   * Create a new builder\n   */\n  static create(): StreamServerBuilder {\n    return new StreamServerBuilder();\n  }\n\n  /**\n   * Initialize the stream server\n   * Call once on application startup\n   */\n  initialize(): void {\n    if (this.initialized) return;\n    this.broadcaster.initialize();\n    this.initialized = true;\n  }\n\n  /**\n   * Dispose the stream server\n   * Call on application shutdown\n   */\n  dispose(): void {\n    this.broadcaster.dispose();\n    this.initialized = false;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Request Handling\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Handle a streaming request (framework-agnostic)\n   *\n   * @param request - HTTP request\n   * @param transportType - Transport to use (default: 'sse')\n   */\n  async handleRequest(\n    request: Request,\n    transportType: StreamTransportType = 'sse'\n  ): Promise<Response> {\n    // Ensure initialized\n    if (!this.initialized) {\n      this.initialize();\n    }\n\n    // Parse channels from request\n    const channels = this.parseChannels(request);\n\n    // Authenticate\n    const authResult = await this.broadcaster.authenticate(request);\n\n    // Generate connection ID\n    const connectionId = crypto.randomUUID();\n\n    // Create connection\n    const response = await this.broadcaster.createConnection(\n      connectionId,\n      transportType,\n      request,\n      authResult\n    );\n\n    if (!response) {\n      return new Response('Failed to create connection', { status: 500 });\n    }\n\n    // Subscribe to channels\n    for (const channel of channels) {\n      if (this.broadcaster.canSubscribe(authResult, channel)) {\n        this.broadcaster.subscribe(connectionId, channel, authResult);\n      }\n    }\n\n    return response;\n  }\n\n  /**\n   * Parse channels from request\n   */\n  private parseChannels(request: Request): StreamChannel[] {\n    // Use custom parser if provided\n    if (this.config.parseChannels) {\n      return this.config.parseChannels(request);\n    }\n\n    // Default: parse from query param\n    const { searchParams } = new URL(request.url);\n    const channelsParam = searchParams.get('channels');\n\n    if (!channelsParam) {\n      return this.config.defaultChannels ?? ['uploads'];\n    }\n\n    return channelsParam.split(',').filter(Boolean) as StreamChannel[];\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Framework Adapters\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Register a framework adapter.\n   *\n   * Default adapters (NextJS, Express, NestJS) are registered automatically.\n   * Use this to add custom adapters or override existing ones.\n   *\n   * @param adapter - Framework adapter to register\n   *\n   * @example\n   * ```ts\n   * // Register custom adapter\n   * streamServer.registerFrameworkAdapter(new MyCustomAdapter());\n   *\n   * // Override default adapter\n   * streamServer.registerFrameworkAdapter(new NextJSFrameworkAdapter({ name: 'custom-nextjs' }));\n   * ```\n   */\n  registerFrameworkAdapter(adapter: BaseFrameworkAdapter): void {\n    this.frameworkAdapters.set(adapter.framework, adapter);\n  }\n\n  /**\n   * Get a framework adapter by type.\n   *\n   * @param framework - Framework type to get\n   * @returns Framework adapter or undefined if not registered\n   */\n  getFrameworkAdapter<T extends BaseFrameworkAdapter>(framework: FrameworkType): T | undefined {\n    return this.frameworkAdapters.get(framework) as T | undefined;\n  }\n\n  /**\n   * Get handler for a specific framework.\n   *\n   * This is the primary API for integrating with frameworks.\n   *\n   * @param framework - Framework type ('nextjs', 'express', 'nestjs')\n   * @param options - Handler options (transport type, etc.)\n   * @returns Framework-specific handler function\n   *\n   * @example\n   * ```ts\n   * // Next.js App Router\n   * export const GET = streamServer.getHandler('nextjs');\n   *\n   * // Express\n   * app.get('/stream', streamServer.getHandler('express'));\n   *\n   * // NestJS controller\n   * const handler = streamServer.getHandler('nestjs');\n   * await handler(req, res);\n   *\n   * // With options\n   * export const GET = streamServer.getHandler('nextjs', { transport: 'sse' });\n   * ```\n   */\n  getHandler<T = unknown>(framework: FrameworkType, options?: FrameworkHandlerOptions): T {\n    const adapter = this.frameworkAdapters.get(framework);\n\n    if (!adapter) {\n      throw new StreamPackageError(\n        `Framework adapter '${framework}' not registered. Available adapters: ${Array.from(this.frameworkAdapters.keys()).join(', ')}`,\n        STREAM_ERROR_CODES.ENDPOINT_NOT_FOUND,\n        { context: { framework, availableAdapters: Array.from(this.frameworkAdapters.keys()) } }\n      );\n    }\n\n    if (!adapter.enabled) {\n      throw new StreamPackageError(\n        `Framework adapter '${framework}' is disabled`,\n        STREAM_ERROR_CODES.ENDPOINT_DISABLED,\n        { context: { framework } }\n      );\n    }\n\n    return adapter.createHandler(\n      (request, transport) => this.handleRequest(request, transport),\n      options\n    ) as T;\n  }\n\n  /**\n   * Get list of registered framework adapters.\n   */\n  getRegisteredFrameworks(): FrameworkType[] {\n    return Array.from(this.frameworkAdapters.keys());\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Direct Access\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get the underlying broadcaster for advanced usage\n   */\n  getBroadcaster(): StreamBroadcaster {\n    return this.broadcaster;\n  }\n\n  /**\n   * Authenticate a request\n   */\n  async authenticate(request: Request): Promise<StreamAuthResult> {\n    return this.broadcaster.authenticate(request);\n  }\n\n  /**\n   * Check if user can subscribe to a channel\n   */\n  canSubscribe(authResult: StreamAuthResult, channel: StreamChannel): boolean {\n    return this.broadcaster.canSubscribe(authResult, channel);\n  }\n\n  /**\n   * Get server statistics\n   */\n  getStats(): StreamManagerStats {\n    return this.broadcaster.getStats();\n  }\n\n  /**\n   * Check if server is initialized\n   */\n  isInitialized(): boolean {\n    return this.initialized;\n  }\n}\n","/**\n * Token Auth Adapter\n *\n * JWT/Bearer token authentication adapter.\n * Validates tokens via a configurable verifier function,\n * allowing integration with any auth provider.\n */\n\nimport type { StreamAuthResult, StreamChannel, TokenAuthAdapterConfig } from '@plyaz/types/core';\nimport { BaseAuthAdapter } from '../BaseAuthAdapter';\n\n/**\n * TokenAuthAdapter - Bearer token authentication\n *\n * Features:\n * - Configurable token verification function\n * - Scope-based channel authorization\n * - Support for custom header names\n *\n * @example\n * ```ts\n * const authAdapter = new TokenAuthAdapter({\n *   name: 'jwt',\n *   verifyToken: async (token) => {\n *     const decoded = await verifyJWT(token);\n *     return {\n *       valid: !!decoded,\n *       userId: decoded?.sub,\n *       scopes: decoded?.scopes,\n *     };\n *   },\n * });\n *\n * // Authenticate request\n * const result = await authAdapter.authenticate(request);\n * if (result.authenticated) {\n *   console.log('User:', result.userId);\n * }\n * ```\n */\nexport class TokenAuthAdapter extends BaseAuthAdapter {\n  private readonly verifyToken: TokenAuthAdapterConfig['verifyToken'];\n  private readonly headerName: string;\n\n  constructor(config: TokenAuthAdapterConfig) {\n    super(config);\n    this.verifyToken = config.verifyToken;\n    this.headerName = config.headerName ?? 'Authorization';\n  }\n\n  /**\n   * Authenticate request using bearer token\n   *\n   * @param request - HTTP request with Authorization header\n   * @returns Authentication result with user info if valid\n   */\n  async authenticate(request: Request): Promise<StreamAuthResult> {\n    const header = request.headers.get(this.headerName);\n\n    if (!header) {\n      return { authenticated: false };\n    }\n\n    // Extract token from \"Bearer <token>\" format\n    const BEARER_PREFIX_LENGTH = 7;\n    const token = header.startsWith('Bearer ') ? header.slice(BEARER_PREFIX_LENGTH) : header;\n\n    try {\n      const result = await this.verifyToken(token);\n\n      return {\n        authenticated: result.valid,\n        userId: result.userId,\n        scopes: result.scopes,\n      };\n    } catch {\n      // Token verification failed\n      return { authenticated: false };\n    }\n  }\n\n  /**\n   * Check if user can subscribe to a channel\n   *\n   * Rules:\n   * - 'system' channel requires authentication\n   * - If scopes provided, channel must match a scope prefix\n   * - Otherwise, allow subscription\n   *\n   * @param userId - User ID (undefined for anonymous)\n   * @param channel - Channel to subscribe\n   * @param scopes - User's allowed scopes\n   */\n  canSubscribe(userId: string | undefined, channel: StreamChannel, scopes?: string[]): boolean {\n    // System channel requires authentication\n    if (channel === 'system' && !userId) {\n      return false;\n    }\n\n    // If no scopes defined, allow all (for backwards compatibility)\n    if (!scopes || scopes.length === 0) {\n      return true;\n    }\n\n    // Check if channel matches any scope prefix\n    // e.g., scope 'upload:' allows 'upload:abc123'\n    return scopes.some(scope => channel.startsWith(scope) || channel === scope);\n  }\n}\n","/**\n * Auth Adapters\n *\n * Concrete implementations of BaseAuthAdapter for various auth strategies.\n */\n\nexport { AnonymousAuthAdapter } from './AnonymousAuthAdapter';\nexport { TokenAuthAdapter } from './TokenAuthAdapter';\n","/**\n * Auth Module\n *\n * Stream authentication adapters for SSE/WebSocket connections.\n */\n\n// Base class\nexport { BaseAuthAdapter } from './BaseAuthAdapter';\n\n// Adapter implementations\nexport { AnonymousAuthAdapter, TokenAuthAdapter } from './adapters';\n","/**\n * WebSocket Transport Adapter\n *\n * WebSocket transport for real-time bidirectional streaming.\n * Provides an alternative to SSE with support for client-to-server messages.\n *\n * NOTE: This is a placeholder implementation. Full WebSocket support requires\n * runtime-specific handling (Node.js 'ws' package, Bun/Deno native WebSocket, etc.)\n *\n * For production use:\n * - Node.js: Use 'ws' package with HTTP upgrade\n * - Bun: Use Bun.serve with websocket option\n * - Deno: Use Deno.upgradeWebSocket\n * - Next.js: WebSocket requires custom server, not supported in serverless\n */\n\nimport type { StreamMessage, StreamTransportAdapterConfig } from '@plyaz/types/core';\nimport type { ErrorResponse } from '@plyaz/types/errors';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport { BaseTransportAdapter } from '../BaseTransportAdapter';\n\n/**\n * WebSocket close codes\n */\nconst WS_CLOSE_NORMAL = 1000;\nconst WS_CLOSE_TRY_AGAIN = 1013;\n\n/**\n * Internal WebSocket connection state\n */\ninterface WebSocketConnection {\n  socket: WebSocket;\n  heartbeatTimer?: ReturnType<typeof setInterval>;\n  createdAt: Date;\n}\n\n/**\n * WebSocketTransportAdapter - WebSocket transport\n *\n * Features:\n * - Bidirectional communication\n * - Automatic heartbeat (ping/pong)\n * - JSON message formatting\n * - Connection cleanup on disconnect\n *\n * @example\n * ```ts\n * // With Bun\n * const wsAdapter = new WebSocketTransportAdapter();\n *\n * Bun.serve({\n *   fetch(req, server) {\n *     const success = server.upgrade(req, { data: { connectionId } });\n *     if (success) return undefined;\n *     return new Response('WebSocket upgrade failed', { status: 400 });\n *   },\n *   websocket: {\n *     open(ws) { wsAdapter.registerConnection(connectionId, ws); },\n *     message(ws, message) { wsAdapter.handleMessage(connectionId, message); },\n *     close(ws) { wsAdapter.close(connectionId); },\n *   },\n * });\n * ```\n */\nexport class WebSocketTransportAdapter extends BaseTransportAdapter {\n  private connections = new Map<string, WebSocketConnection>();\n\n  constructor(config?: Partial<StreamTransportAdapterConfig>) {\n    super({\n      name: config?.name ?? 'websocket',\n      type: 'websocket',\n      heartbeatInterval: config?.heartbeatInterval,\n      maxConnections: config?.maxConnections,\n    });\n  }\n\n  /**\n   * Create a new WebSocket connection.\n   *\n   * NOTE: In most runtimes, WebSocket connections are created via HTTP upgrade,\n   * not through this method directly. Use registerConnection() instead.\n   *\n   * @param _connectionId - Unique connection identifier\n   * @returns Response indicating WebSocket upgrade is needed\n   */\n  // eslint-disable-next-line no-unused-vars\n  async createConnection(_connectionId: string): Promise<Response> {\n    // WebSocket connections are established through HTTP upgrade, not here\n    // This returns an error response; use runtime-specific upgrade instead\n    const errorResponse: ErrorResponse = [\n      {\n        errorCode: STREAM_ERROR_CODES.TRANSPORT_NOT_SUPPORTED,\n        message:\n          'WebSocket connections require HTTP upgrade. Use runtime-specific WebSocket upgrade mechanism.',\n      },\n    ];\n\n    return new Response(JSON.stringify(errorResponse), {\n      status: HTTP_STATUS.UPGRADE_REQUIRED,\n      headers: {\n        'Content-Type': 'application/json',\n        Upgrade: 'websocket',\n      },\n    });\n  }\n\n  /**\n   * Register an already-upgraded WebSocket connection.\n   * Call this from your runtime's WebSocket open handler.\n   *\n   * @param connectionId - Unique connection identifier\n   * @param socket - The WebSocket instance\n   */\n  registerConnection(connectionId: string, socket: WebSocket): void {\n    if (!this.canAcceptConnection()) {\n      socket.close(WS_CLOSE_TRY_AGAIN, 'Too many connections');\n      return;\n    }\n\n    const connection: WebSocketConnection = {\n      socket,\n      createdAt: new Date(),\n    };\n\n    this.connections.set(connectionId, connection);\n\n    // Send initial connection message\n    this.sendImmediate(socket, {\n      event: 'connected',\n      data: { connectionId, timestamp: Date.now() },\n    });\n\n    // Start heartbeat (using WebSocket ping/pong)\n    connection.heartbeatTimer = setInterval(() => {\n      if (!this.isAlive(connectionId)) {\n        this.cleanup(connectionId);\n        return;\n      }\n      // Send ping - most WebSocket implementations handle pong automatically\n      this.sendImmediate(socket, {\n        event: 'heartbeat',\n        data: { timestamp: Date.now() },\n      });\n    }, this.heartbeatInterval);\n  }\n\n  /**\n   * Handle incoming message from WebSocket.\n   * Call this from your runtime's WebSocket message handler.\n   *\n   * @param _connectionId - Connection that sent the message\n   * @param message - Raw message data\n   * @returns Parsed message or null if invalid\n   */\n  handleMessage(_connectionId: string, message: string | ArrayBuffer): StreamMessage | null {\n    try {\n      const data = typeof message === 'string' ? message : new TextDecoder().decode(message);\n      return JSON.parse(data) as StreamMessage;\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Send a message to a connection.\n   *\n   * @param connectionId - Connection to send to\n   * @param message - Message to send\n   */\n  async send(connectionId: string, message: StreamMessage): Promise<void> {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    try {\n      this.sendImmediate(connection.socket, message);\n    } catch {\n      // Connection likely closed, cleanup\n      this.cleanup(connectionId);\n    }\n  }\n\n  /**\n   * Close a connection.\n   *\n   * @param connectionId - Connection to close\n   */\n  async close(connectionId: string): Promise<void> {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    try {\n      // Send close event before closing\n      this.sendImmediate(connection.socket, {\n        event: 'close',\n        data: { reason: 'server_close' },\n      });\n      connection.socket.close(WS_CLOSE_NORMAL, 'Server closing');\n    } catch {\n      // Already closed\n    }\n\n    this.cleanup(connectionId);\n  }\n\n  /**\n   * Check if a connection is alive.\n   *\n   * @param connectionId - Connection to check\n   */\n  isAlive(connectionId: string): boolean {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return false;\n    return connection.socket.readyState === WebSocket.OPEN;\n  }\n\n  /**\n   * Get current connection count.\n   */\n  getConnectionCount(): number {\n    return this.connections.size;\n  }\n\n  /**\n   * Get all connection IDs.\n   */\n  getConnectionIds(): string[] {\n    return Array.from(this.connections.keys());\n  }\n\n  /**\n   * Send message immediately to socket.\n   */\n  private sendImmediate(socket: WebSocket, message: StreamMessage): void {\n    if (socket.readyState !== WebSocket.OPEN) return;\n    socket.send(JSON.stringify(message));\n  }\n\n  /**\n   * Cleanup connection resources.\n   */\n  private cleanup(connectionId: string): void {\n    const connection = this.connections.get(connectionId);\n    if (!connection) return;\n\n    // Clear heartbeat timer\n    if (connection.heartbeatTimer) {\n      clearInterval(connection.heartbeatTimer);\n    }\n\n    // Remove from map\n    this.connections.delete(connectionId);\n  }\n\n  /**\n   * Close all connections (for shutdown).\n   */\n  async closeAll(): Promise<void> {\n    const connectionIds = this.getConnectionIds();\n    await Promise.all(connectionIds.map(id => this.close(id)));\n  }\n}\n","/**\n * Transport Adapters\n *\n * Concrete implementations of BaseTransportAdapter for various transports.\n */\n\nexport { SSETransportAdapter } from './SSETransportAdapter';\nexport { WebSocketTransportAdapter } from './WebSocketTransportAdapter';\n","/**\n * Transport Module\n *\n * Stream transport adapters for SSE/WebSocket connections.\n */\n\n// Base class\nexport { BaseTransportAdapter } from './BaseTransportAdapter';\n\n// Adapter implementations\nexport { SSETransportAdapter, WebSocketTransportAdapter } from './adapters';\n","/**\n * Stream Registry\n *\n * Auto-discovery and initialization for stream endpoints.\n * Similar to ServiceRegistry but for real-time streaming.\n *\n * @example\n * ```typescript\n * import { StreamServer, StreamRegistry } from '@plyaz/core/events/streaming';\n * import { FilesStreamEndpoint } from '@plyaz/core/domain/files/streaming';\n * import { SystemStreamEndpoint } from '@plyaz/core/events/streaming/endpoints';\n *\n * // Create stream server\n * const streamServer = StreamServer.create()\n *   .withAuth(new TokenAuthAdapter({ verifyToken: myVerifier }))\n *   .withSSE({ heartbeatInterval: 15000 })\n *   .build();\n *\n * // Initialize stream registry (like ServiceRegistry)\n * await StreamRegistry.initialize({\n *   broadcaster: streamServer.getBroadcaster(),\n *   endpoints: [\n *     { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n *     { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n *   ],\n * });\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport { StreamPackageError } from '@plyaz/errors';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n  StreamEndpointConfig,\n  StreamRegistryConfig,\n  StreamBroadcasterInterface,\n} from '@plyaz/types/core';\nimport type { BaseStreamEndpoint } from './base/BaseStreamEndpoint';\nimport type { BaseChannelController } from './channels/BaseChannelController';\n\n/**\n * Global Singleton Pattern using globalThis for static class state\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple\n * instances of static class state. Using globalThis + Symbol.for() ensures ONE\n * shared state per process, preventing issues like stream endpoints being registered\n * in one module context but not accessible from another (e.g., API routes).\n */\ninterface StreamRegistryState {\n  endpoints: Map<string, BaseStreamEndpoint>;\n  controllers: Map<string, BaseChannelController>;\n  broadcaster: StreamBroadcasterInterface | null;\n  initialized: boolean;\n}\n\nconst STREAM_REGISTRY_KEY = Symbol.for('plyaz.StreamRegistry');\n\nfunction getStreamRegistryState(): StreamRegistryState {\n  const globalAny = globalThis as unknown as { [key: symbol]: StreamRegistryState };\n  if (!globalAny[STREAM_REGISTRY_KEY]) {\n    globalAny[STREAM_REGISTRY_KEY] = {\n      endpoints: new Map(),\n      controllers: new Map(),\n      broadcaster: null,\n      initialized: false,\n    };\n  }\n  return globalAny[STREAM_REGISTRY_KEY];\n}\n\n/**\n * StreamRegistry - Auto-discovery and initialization for stream endpoints\n *\n * Features:\n * - Auto-initialization of stream endpoints\n * - get() and getAsync() access patterns (like ServiceRegistry)\n * - Lifecycle management\n * - Controller registration with broadcaster\n */\nexport class StreamRegistry {\n  private static readonly logger = new CoreLogger({\n    service: 'StreamRegistry',\n  });\n\n  // State accessors using globalThis\n  private static get _endpoints(): Map<string, BaseStreamEndpoint> {\n    return getStreamRegistryState().endpoints;\n  }\n  private static get _controllers(): Map<string, BaseChannelController> {\n    return getStreamRegistryState().controllers;\n  }\n  private static get _broadcaster(): StreamBroadcasterInterface | null {\n    return getStreamRegistryState().broadcaster;\n  }\n  private static set _broadcaster(value: StreamBroadcasterInterface | null) {\n    getStreamRegistryState().broadcaster = value;\n  }\n  private static get _initialized(): boolean {\n    return getStreamRegistryState().initialized;\n  }\n  private static set _initialized(value: boolean) {\n    getStreamRegistryState().initialized = value;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Initialization\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Initialize the stream registry with endpoints.\n   *\n   * @param config - Registry configuration\n   * @throws StreamPackageError if already initialized or endpoint fails\n   *\n   * @example\n   * ```typescript\n   * await StreamRegistry.initialize({\n   *   broadcaster: streamServer.getBroadcaster(),\n   *   endpoints: [\n   *     { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n   *     { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n   *   ],\n   * });\n   * ```\n   */\n  static async initialize(config: StreamRegistryConfig): Promise<void> {\n    if (StreamRegistry._initialized) {\n      StreamRegistry.logger.warn('StreamRegistry already initialized');\n      return;\n    }\n\n    StreamRegistry._broadcaster = config.broadcaster;\n\n    for (const entry of config.endpoints) {\n      const endpointKey = entry.endpoint.endpointKey;\n      const enabled = entry.config.enabled !== false;\n\n      if (!enabled) {\n        StreamRegistry.logger.debug(`Endpoint ${endpointKey} is disabled, skipping`);\n        continue;\n      }\n\n      try {\n        // Create endpoint configuration\n        const endpointConfig: StreamEndpointConfig = {\n          endpointKey,\n          name: entry.config.name ?? endpointKey,\n          channels: entry.config.channels ?? [],\n          enabled: entry.config.enabled,\n          supportedRuntimes: entry.config.supportedRuntimes,\n        };\n\n        // Create endpoint instance via static create()\n        const instance = (await entry.endpoint.create(endpointConfig, {\n          broadcaster: config.broadcaster,\n        })) as BaseStreamEndpoint;\n\n        // Initialize the endpoint\n        instance.initialize();\n\n        // Get the channel controller\n        const controller = instance.getChannelController();\n\n        // Register controller with broadcaster (if it supports this)\n        if ('registerController' in config.broadcaster) {\n          (\n            config.broadcaster as { registerController: (c: BaseChannelController) => void }\n          ).registerController(controller);\n        }\n\n        // Store endpoint and controller\n        StreamRegistry._endpoints.set(endpointKey, instance);\n        StreamRegistry._controllers.set(controller.scope, controller);\n\n        StreamRegistry.logger.info(`Endpoint initialized: ${endpointKey}`, {\n          scope: controller.scope,\n          patterns: controller.getPatterns(),\n        });\n      } catch (error) {\n        StreamRegistry.logger.error(`Failed to initialize endpoint: ${endpointKey}`, { error });\n        throw error;\n      }\n    }\n\n    StreamRegistry._initialized = true;\n    StreamRegistry.logger.info('StreamRegistry initialized', {\n      endpoints: [...StreamRegistry._endpoints.keys()],\n      controllers: [...StreamRegistry._controllers.keys()],\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Endpoint Access\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get an endpoint by key (synchronous).\n   *\n   * @param key - Endpoint key\n   * @returns Endpoint instance\n   * @throws StreamPackageError if endpoint not found\n   *\n   * @example\n   * ```typescript\n   * const filesEndpoint = StreamRegistry.get<FilesStreamEndpoint>('files');\n   * ```\n   */\n  static get<T extends BaseStreamEndpoint>(key: string): T {\n    const endpoint = StreamRegistry._endpoints.get(key);\n    if (!endpoint) {\n      throw new StreamPackageError(\n        `Stream endpoint '${key}' not found. Register it in StreamRegistry.initialize()`,\n        STREAM_ERROR_CODES.ENDPOINT_NOT_FOUND\n      );\n    }\n    return endpoint as T;\n  }\n\n  /**\n   * Get an endpoint by key (async for lazy initialization if needed).\n   *\n   * @param key - Endpoint key\n   * @returns Promise resolving to endpoint instance\n   */\n  static async getAsync<T extends BaseStreamEndpoint>(key: string): Promise<T> {\n    return StreamRegistry.get<T>(key);\n  }\n\n  /**\n   * Check if an endpoint is registered.\n   *\n   * @param key - Endpoint key\n   * @returns true if endpoint is registered\n   */\n  static has(key: string): boolean {\n    return StreamRegistry._endpoints.has(key);\n  }\n\n  /**\n   * Get all registered endpoint keys.\n   *\n   * @returns Array of endpoint keys\n   */\n  static getRegisteredKeys(): string[] {\n    return [...StreamRegistry._endpoints.keys()];\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Controller Access\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get a controller by scope.\n   *\n   * @param scope - Controller scope\n   * @returns Controller instance or undefined\n   */\n  static getController(scope: string): BaseChannelController | undefined {\n    return StreamRegistry._controllers.get(scope);\n  }\n\n  /**\n   * Get controller for a channel.\n   *\n   * @param channel - Channel name\n   * @returns Controller that handles the channel, or undefined\n   */\n  static getControllerForChannel(channel: string): BaseChannelController | undefined {\n    for (const controller of StreamRegistry._controllers.values()) {\n      if (controller.handlesChannel(channel)) {\n        return controller;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Get all registered controller scopes.\n   *\n   * @returns Array of controller scopes\n   */\n  static getRegisteredScopes(): string[] {\n    return [...StreamRegistry._controllers.keys()];\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Broadcaster Access\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get the broadcaster instance.\n   *\n   * @returns Broadcaster instance\n   * @throws StreamPackageError if not initialized\n   */\n  static getBroadcaster(): StreamBroadcasterInterface {\n    if (!StreamRegistry._broadcaster) {\n      throw new StreamPackageError(\n        'StreamRegistry not initialized. Call StreamRegistry.initialize() first.',\n        STREAM_ERROR_CODES.INITIALIZATION_FAILED\n      );\n    }\n    return StreamRegistry._broadcaster;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Status\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if registry is initialized.\n   *\n   * @returns true if initialized\n   */\n  static isInitialized(): boolean {\n    return StreamRegistry._initialized;\n  }\n\n  /**\n   * Get registry statistics.\n   *\n   * @returns Statistics object\n   */\n  static getStats(): {\n    initialized: boolean;\n    endpointCount: number;\n    controllerCount: number;\n    endpoints: string[];\n    controllers: string[];\n  } {\n    return {\n      initialized: StreamRegistry._initialized,\n      endpointCount: StreamRegistry._endpoints.size,\n      controllerCount: StreamRegistry._controllers.size,\n      endpoints: StreamRegistry.getRegisteredKeys(),\n      controllers: StreamRegistry.getRegisteredScopes(),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Lifecycle\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Dispose all endpoints and reset registry.\n   */\n  static dispose(): void {\n    StreamRegistry.logger.info('Disposing StreamRegistry');\n\n    // Dispose all endpoints\n    StreamRegistry._endpoints.forEach((endpoint, key) => {\n      try {\n        endpoint.dispose();\n        StreamRegistry.logger.debug(`Disposed endpoint: ${key}`);\n      } catch (error) {\n        StreamRegistry.logger.error(`Error disposing endpoint: ${key}`, { error });\n      }\n    });\n\n    // Clear all maps\n    StreamRegistry._endpoints.clear();\n    StreamRegistry._controllers.clear();\n    StreamRegistry._broadcaster = null;\n    StreamRegistry._initialized = false;\n\n    StreamRegistry.logger.info('StreamRegistry disposed');\n  }\n\n  /**\n   * Reset registry (for testing).\n   */\n  static reset(): void {\n    StreamRegistry.dispose();\n  }\n}\n","/**\n * Base Stream Endpoint\n *\n * Abstract base class for stream endpoints, following patterns from BaseBackendDomainService.\n * Each endpoint manages a set of channels and their event handlers.\n *\n * @example\n * ```typescript\n * class FilesStreamEndpoint extends BaseStreamEndpoint {\n *   static readonly endpointKey = 'files';\n *\n *   protected createChannelController(): BaseChannelController {\n *     return new FilesChannelController();\n *   }\n *\n *   initialize(): void {\n *     this.channelController.initialize(this.broadcaster);\n *     this.logger.info('FilesStreamEndpoint initialized');\n *   }\n *\n *   static async create(\n *     config: StreamEndpointConfig,\n *     options: StreamEndpointCreateOptions\n *   ): Promise<FilesStreamEndpoint> {\n *     return new FilesStreamEndpoint(config, options);\n *   }\n * }\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport type {\n  StreamEndpointConfig,\n  StreamEndpointCreateOptions,\n  StreamBroadcasterInterface,\n  StreamResponse,\n  StreamErrorEvent,\n  StreamChannel,\n  StreamConnection,\n  StreamAuthResult,\n} from '@plyaz/types/core';\nimport type { ErrorResponse } from '@plyaz/types/errors';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport { StreamPackageError } from '@plyaz/errors';\nimport type { BaseChannelController } from '../channels/BaseChannelController';\n\n/**\n * BaseStreamEndpoint - Abstract base for stream endpoints\n *\n * Similar to BaseBackendDomainService but for real-time streaming.\n * Provides:\n * - Static create() for initialization (like domain services)\n * - Lifecycle hooks (beforeSubscribe, afterSubscribe, etc.)\n * - Channel controller management\n * - Error handling with standard ErrorResponse format\n * - Response formatting consistent with API patterns\n */\nexport abstract class BaseStreamEndpoint {\n  /**\n   * Static endpoint key (like serviceKey in domain services).\n   * Override in subclass.\n   */\n  static readonly endpointKey: string;\n\n  /** Logger instance */\n  protected readonly logger: CoreLogger;\n\n  /** Endpoint configuration */\n  protected readonly config: StreamEndpointConfig;\n\n  /** Broadcaster interface */\n  protected readonly broadcaster: StreamBroadcasterInterface;\n\n  /** Channel controller for this endpoint */\n  protected readonly channelController: BaseChannelController;\n\n  /** Unsubscribe functions for cleanup */\n  protected readonly unsubscribers: Array<() => void> = [];\n\n  constructor(config: StreamEndpointConfig, options: StreamEndpointCreateOptions) {\n    this.config = config;\n    this.broadcaster = options.broadcaster;\n\n    this.logger = new CoreLogger({\n      service: `StreamEndpoint:${config.endpointKey}`,\n    });\n\n    // Create channel controller for this endpoint\n    this.channelController = this.createChannelController();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Abstract Methods (must implement)\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create the channel controller for this endpoint.\n   * Called during construction.\n   */\n  protected abstract createChannelController(): BaseChannelController;\n\n  /**\n   * Initialize event subscriptions.\n   * Called by StreamRegistry during initialization.\n   */\n  abstract initialize(): void;\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Static Factory (like domain services)\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create endpoint instance.\n   * Override in subclass with proper typing.\n   *\n   * @param config - Endpoint configuration\n   * @param options - Create options (broadcaster, auth, etc.)\n   * @returns Promise resolving to endpoint instance\n   */\n\n  static async create(\n    // eslint-disable-next-line no-unused-vars\n    _config: StreamEndpointConfig,\n    // eslint-disable-next-line no-unused-vars\n    _options: StreamEndpointCreateOptions\n  ): Promise<BaseStreamEndpoint> {\n    throw new StreamPackageError(\n      'Subclass must implement static create()',\n      STREAM_ERROR_CODES.TRANSPORT_NOT_SUPPORTED,\n      { context: { endpoint: this.endpointKey ?? 'unknown' } }\n    );\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Lifecycle Hooks (optional - override in subclass)\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Called before a connection subscribes to a channel.\n   * Return false to prevent subscription.\n   *\n   * @param channel - Channel being subscribed to\n   * @param connection - Connection subscribing\n   * @param authResult - Authentication result for the connection\n   * @returns true to allow subscription, false to deny\n   */\n  protected async beforeSubscribe?(\n    channel: StreamChannel,\n    connection: StreamConnection,\n    authResult: StreamAuthResult\n  ): Promise<boolean>;\n\n  /**\n   * Called after a connection subscribes to a channel.\n   *\n   * @param channel - Channel subscribed to\n   * @param connection - Connection that subscribed\n   */\n  protected async afterSubscribe?(\n    channel: StreamChannel,\n    connection: StreamConnection\n  ): Promise<void>;\n\n  /**\n   * Called before a connection unsubscribes from a channel.\n   *\n   * @param channel - Channel being unsubscribed from\n   * @param connectionId - Connection ID unsubscribing\n   */\n  protected async beforeUnsubscribe?(channel: StreamChannel, connectionId: string): Promise<void>;\n\n  /**\n   * Called when a new connection is established.\n   *\n   * @param connection - The new connection\n   */\n  protected async onConnect?(connection: StreamConnection): Promise<void>;\n\n  /**\n   * Called when a connection is closed.\n   *\n   * @param connectionId - ID of the closed connection\n   */\n  protected async onDisconnect?(connectionId: string): Promise<void>;\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Response Helpers (consistent with API patterns)\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create a success response.\n   *\n   * @param data - Response data payload\n   * @param channel - Channel this response is for\n   * @param message - Human-readable message (default: 'Success')\n   * @returns Formatted StreamResponse\n   */\n  protected createResponse<T>(data: T, channel: string, message = 'Success'): StreamResponse<T> {\n    return {\n      success: true,\n      message,\n      data,\n      channel,\n      timestamp: Date.now(),\n      correlationId: crypto.randomUUID(),\n    };\n  }\n\n  /**\n   * Create an error response using standard ErrorResponse format.\n   *\n   * @param errors - Array of error details\n   * @param channel - Channel this error occurred on\n   * @returns Formatted StreamErrorEvent\n   */\n  protected createErrorResponse(\n    errors: Array<{ errorCode: string; message: string; field?: string }>,\n    channel: string\n  ): StreamErrorEvent {\n    // Convert to standard ErrorResponse format\n    const errorResponse: ErrorResponse = errors.map(e => ({\n      errorCode: e.errorCode,\n      message: e.message,\n      field: e.field,\n    }));\n\n    return {\n      success: false,\n      errors: errorResponse,\n      channel,\n      timestamp: Date.now(),\n      correlationId: crypto.randomUUID(),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Public API\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get endpoint configuration.\n   */\n  getConfig(): StreamEndpointConfig {\n    return this.config;\n  }\n\n  /**\n   * Get the endpoint key.\n   */\n  getEndpointKey(): string {\n    return this.config.endpointKey;\n  }\n\n  /**\n   * Get channel controller.\n   */\n  getChannelController(): BaseChannelController {\n    return this.channelController;\n  }\n\n  /**\n   * Check if endpoint handles a channel.\n   *\n   * @param channel - Channel to check\n   * @returns true if this endpoint handles the channel\n   */\n  handlesChannel(channel: StreamChannel): boolean {\n    return this.channelController.handlesChannel(channel);\n  }\n\n  /**\n   * Check if endpoint is enabled.\n   */\n  isEnabled(): boolean {\n    return this.config.enabled !== false;\n  }\n\n  /**\n   * Check if endpoint supports the current runtime.\n   *\n   * @param runtime - Runtime to check\n   * @returns true if supported\n   */\n  supportsRuntime(runtime: 'node' | 'bun' | 'deno' | 'edge'): boolean {\n    if (!this.config.supportedRuntimes) return true;\n    return this.config.supportedRuntimes.includes(runtime);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Lifecycle\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Dispose endpoint and cleanup.\n   */\n  dispose(): void {\n    this.logger.debug('Disposing endpoint', { key: this.config.endpointKey });\n\n    // Call all unsubscribe functions\n    this.unsubscribers.forEach(unsub => {\n      try {\n        unsub();\n      } catch (error) {\n        this.logger.error('Error during unsubscribe', { error });\n      }\n    });\n\n    // Clear unsubscribers\n    this.unsubscribers.length = 0;\n\n    // Dispose channel controller\n    this.channelController.dispose();\n\n    this.logger.debug('Endpoint disposed', { key: this.config.endpointKey });\n  }\n\n  /**\n   * Add an unsubscribe function to be called on dispose.\n   *\n   * @param unsub - Unsubscribe function\n   */\n  protected addUnsubscriber(unsub: () => void): void {\n    this.unsubscribers.push(unsub);\n  }\n}\n","/**\n * Base Channel Controller\n *\n * Abstract base class for channel event handlers.\n * Each controller manages a specific scope of channels (e.g., 'upload:', 'generate:', 'system').\n *\n * @example\n * ```typescript\n * class FilesChannelController extends BaseChannelController {\n *   constructor() {\n *     super({\n *       scope: 'files',\n *       patterns: ['upload:', 'uploads', 'generate:'],\n *     });\n *   }\n *\n *   initialize(broadcaster: StreamBroadcasterInterface): void {\n *     this.unsubscribers.push(\n *       CoreEventManager.on('files:upload:progress', event => {\n *         broadcaster.broadcastToChannel(`upload:${event.data.fileId}`, {\n *           event: 'progress',\n *           data: this.createResponse(event.data, `upload:${event.data.fileId}`),\n *         });\n *       })\n *     );\n *   }\n * }\n * ```\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport type {\n  ChannelControllerConfig,\n  StreamBroadcasterInterface,\n  StreamResponse,\n  StreamErrorEvent,\n} from '@plyaz/types/core';\nimport type { ErrorResponse } from '@plyaz/types/errors';\n\n/**\n * BaseChannelController - Abstract base for channel event handlers\n *\n * Features:\n * - Pattern matching for channels\n * - Response formatting helpers (consistent with API patterns)\n * - Subscription management with automatic cleanup\n * - Error response using standard ErrorResponse format\n */\nexport abstract class BaseChannelController {\n  /** Channel scope (e.g., 'upload', 'generate', 'system') */\n  readonly scope: string;\n\n  /** Channel patterns this controller handles */\n  readonly patterns: string[];\n\n  /** Whether controller is enabled */\n  readonly enabled: boolean;\n\n  /** Logger instance */\n  protected readonly logger: CoreLogger;\n\n  /** Unsubscribe functions for cleanup */\n  protected unsubscribers: Array<() => void> = [];\n\n  constructor(config: ChannelControllerConfig) {\n    this.scope = config.scope;\n    this.patterns = config.patterns;\n    this.enabled = config.enabled ?? true;\n\n    this.logger = new CoreLogger({\n      service: `ChannelController:${config.scope}`,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Abstract Methods\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Initialize event subscriptions.\n   * Called when the controller is registered with the broadcaster.\n   *\n   * @param broadcaster - The broadcaster to send messages through\n   */\n  abstract initialize(broadcaster: StreamBroadcasterInterface): void;\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Channel Matching\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if this controller handles a given channel.\n   *\n   * @param channel - Channel name to check\n   * @returns true if this controller handles the channel\n   */\n  handlesChannel(channel: string): boolean {\n    // Check exact match or scope prefix\n    return this.patterns.some(\n      pattern => channel === pattern || channel.startsWith(`${this.scope}:`)\n    );\n  }\n\n  /**\n   * Get all patterns this controller handles.\n   */\n  getPatterns(): string[] {\n    return [...this.patterns];\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Response Helpers (consistent with API ReturnResponseType)\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create a success response.\n   *\n   * @param data - Response data payload\n   * @param channel - Channel this response is for\n   * @param message - Human-readable message (default: 'Success')\n   * @returns Formatted StreamResponse\n   */\n  protected createResponse<T>(data: T, channel: string, message = 'Success'): StreamResponse<T> {\n    return {\n      success: true,\n      message,\n      data,\n      channel,\n      timestamp: Date.now(),\n      correlationId: crypto.randomUUID(),\n    };\n  }\n\n  /**\n   * Create an error response using standard ErrorResponse format.\n   *\n   * @param errors - Array of error details\n   * @param channel - Channel this error occurred on\n   * @returns Formatted StreamErrorEvent\n   */\n  protected createErrorResponse(\n    errors: Array<{ errorCode: string; message: string; field?: string }>,\n    channel: string\n  ): StreamErrorEvent {\n    // Convert to standard ErrorResponse format\n    const errorResponse: ErrorResponse = errors.map(e => ({\n      errorCode: e.errorCode,\n      message: e.message,\n      field: e.field,\n    }));\n\n    return {\n      success: false,\n      errors: errorResponse,\n      channel,\n      timestamp: Date.now(),\n      correlationId: crypto.randomUUID(),\n    };\n  }\n\n  /**\n   * Create a single error response.\n   *\n   * @param errorCode - Error code\n   * @param message - Error message\n   * @param channel - Channel this error occurred on\n   * @param field - Optional field that caused the error\n   * @returns Formatted StreamErrorEvent\n   */\n  protected createSingleError(\n    errorCode: string,\n    message: string,\n    channel: string,\n    field?: string\n  ): StreamErrorEvent {\n    return this.createErrorResponse([{ errorCode, message, field }], channel);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Lifecycle\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Dispose controller and cleanup subscriptions.\n   */\n  dispose(): void {\n    this.logger.debug('Disposing controller', { scope: this.scope });\n\n    // Call all unsubscribe functions\n    this.unsubscribers.forEach(unsub => {\n      try {\n        unsub();\n      } catch (error) {\n        this.logger.error('Error during unsubscribe', { error });\n      }\n    });\n\n    this.unsubscribers = [];\n    this.logger.debug('Controller disposed', { scope: this.scope });\n  }\n\n  /**\n   * Add an unsubscribe function to be called on dispose.\n   *\n   * @param unsub - Unsubscribe function\n   */\n  protected addUnsubscriber(unsub: () => void): void {\n    this.unsubscribers.push(unsub);\n  }\n}\n","/**\n * Files Channel Controller\n *\n * Handles file-related streaming channels: upload, download, generate.\n * Listens to CoreEventManager events and broadcasts to connected clients.\n */\n\nimport { CoreEventManager } from '../../../events/CoreEventManager';\nimport { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type {\n  StreamBroadcasterInterface,\n  FilesUploadStreamProgress,\n  FilesDownloadStreamProgress,\n  FilesGenerateStreamProgress,\n  CoreEvent,\n} from '@plyaz/types/core';\nimport { FILES_STREAM_CHANNEL_PREFIX, FILES_STREAM_BROADCAST_CHANNEL } from '@plyaz/types/core';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * FilesChannelController - Handles file streaming channels\n *\n * Channels:\n * - `upload:{fileId}` - Per-file upload progress\n * - `uploads` - Broadcast channel for all uploads\n * - `download:{fileId}` - Per-file download progress\n * - `downloads` - Broadcast channel for all downloads\n * - `generate:{templateId}` - Per-template generation progress\n * - `generations` - Broadcast channel for all generations\n */\nexport class FilesChannelController extends BaseChannelController {\n  constructor() {\n    super({\n      scope: 'files',\n      patterns: [\n        // Upload channels\n        FILES_STREAM_CHANNEL_PREFIX.UPLOAD,\n        FILES_STREAM_BROADCAST_CHANNEL.UPLOADS,\n        // Download channels\n        FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD,\n        FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS,\n        // Generate channels\n        FILES_STREAM_CHANNEL_PREFIX.GENERATE,\n        FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS,\n      ],\n    });\n  }\n\n  /**\n   * Initialize event subscriptions.\n   * Listens to CoreEventManager events and broadcasts to appropriate channels.\n   */\n  // eslint-disable-next-line max-lines-per-function\n  initialize(broadcaster: StreamBroadcasterInterface): void {\n    this.logger.debug('[FilesChannelController] initialize() called');\n\n    // Listen for upload progress events\n    this.addUnsubscriber(\n      CoreEventManager.on<FilesUploadStreamProgress>(\n        'upload:progress',\n        (event: CoreEvent<FilesUploadStreamProgress>) => {\n          const progress = event.data;\n          const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n          this.logger.debug('[FilesChannelController] Received upload:progress event', {\n            fileId: progress.fileId,\n            percentage: progress.percentage,\n            channel,\n            broadcastChannel: FILES_STREAM_BROADCAST_CHANNEL.UPLOADS,\n          });\n\n          // Broadcast to file-specific channel with prefixed event name\n          broadcaster.broadcastToChannel(channel, {\n            event: 'upload:progress',\n            data: this.createResponse(progress, channel, 'Upload progress'),\n          });\n\n          // Also broadcast to general uploads channel\n          broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n            event: 'upload:progress',\n            data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.UPLOADS),\n          });\n        }\n      )\n    );\n\n    // Listen for upload completed events\n    this.addUnsubscriber(\n      CoreEventManager.on<FilesUploadStreamProgress>(\n        'upload:completed',\n        (event: CoreEvent<FilesUploadStreamProgress>) => {\n          const progress = event.data;\n          const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n          broadcaster.broadcastToChannel(channel, {\n            event: 'upload:completed',\n            data: this.createResponse(progress, channel, 'Upload completed'),\n          });\n\n          broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n            event: 'upload:completed',\n            data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.UPLOADS),\n          });\n        }\n      )\n    );\n\n    // Listen for upload error events\n    this.addUnsubscriber(\n      CoreEventManager.on<FilesUploadStreamProgress>(\n        'upload:error',\n        (event: CoreEvent<FilesUploadStreamProgress>) => {\n          const progress = event.data;\n          const channel = `${FILES_STREAM_CHANNEL_PREFIX.UPLOAD}${progress.fileId}`;\n\n          broadcaster.broadcastToChannel(channel, {\n            event: 'upload:failed',\n            data: this.createSingleError(\n              STORAGE_ERROR_CODES.FILE_UPLOAD_FAILED,\n              progress.error ?? 'Upload failed',\n              channel\n            ),\n          });\n\n          broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.UPLOADS, {\n            event: 'upload:failed',\n            data: this.createSingleError(\n              STORAGE_ERROR_CODES.FILE_UPLOAD_FAILED,\n              progress.error ?? 'Upload failed',\n              FILES_STREAM_BROADCAST_CHANNEL.UPLOADS\n            ),\n          });\n        }\n      )\n    );\n\n    // Listen for download progress events\n    this.addUnsubscriber(\n      CoreEventManager.on<FilesDownloadStreamProgress>(\n        'download:progress',\n        (event: CoreEvent<FilesDownloadStreamProgress>) => {\n          const progress = event.data;\n          const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n          this.logger.debug('[FilesChannelController] Received download:progress event', {\n            fileId: progress.fileId,\n            percentage: progress.percentage,\n            channel,\n            broadcastChannel: FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS,\n          });\n\n          // Broadcast to file-specific channel with prefixed event name\n          broadcaster.broadcastToChannel(channel, {\n            event: 'download:progress',\n            data: this.createResponse(progress, channel, 'Download progress'),\n          });\n\n          // Also broadcast to general downloads channel\n          broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n            event: 'download:progress',\n            data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS),\n          });\n        }\n      )\n    );\n\n    // Listen for download completed events\n    this.addUnsubscriber(\n      CoreEventManager.on<FilesDownloadStreamProgress>(\n        'download:completed',\n        (event: CoreEvent<FilesDownloadStreamProgress>) => {\n          const progress = event.data;\n          const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n          broadcaster.broadcastToChannel(channel, {\n            event: 'download:completed',\n            data: this.createResponse(progress, channel, 'Download completed'),\n          });\n\n          broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n            event: 'download:completed',\n            data: this.createResponse(progress, FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS),\n          });\n        }\n      )\n    );\n\n    // Listen for download error events\n    this.addUnsubscriber(\n      CoreEventManager.on<FilesDownloadStreamProgress>(\n        'download:error',\n        (event: CoreEvent<FilesDownloadStreamProgress>) => {\n          const progress = event.data;\n          const channel = `${FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD}${progress.fileId}`;\n\n          broadcaster.broadcastToChannel(channel, {\n            event: 'download:failed',\n            data: this.createSingleError(\n              STORAGE_ERROR_CODES.FILE_DOWNLOAD_FAILED,\n              progress.error ?? 'Download failed',\n              channel\n            ),\n          });\n\n          broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS, {\n            event: 'download:failed',\n            data: this.createSingleError(\n              STORAGE_ERROR_CODES.FILE_DOWNLOAD_FAILED,\n              progress.error ?? 'Download failed',\n              FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS\n            ),\n          });\n        }\n      )\n    );\n\n    // Listen for generate progress events\n    this.addUnsubscriber(\n      CoreEventManager.on<FilesGenerateStreamProgress>(\n        'generate:progress',\n        (event: CoreEvent<FilesGenerateStreamProgress>) => {\n          const data = event.data;\n          const channel = `${FILES_STREAM_CHANNEL_PREFIX.GENERATE}${data.templateId}`;\n\n          broadcaster.broadcastToChannel(channel, {\n            event: 'generate:progress',\n            data: this.createResponse(data, channel, 'Generation progress'),\n          });\n\n          broadcaster.broadcastToChannel(FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS, {\n            event: 'generate:progress',\n            data: this.createResponse(data, FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS),\n          });\n        }\n      )\n    );\n\n    this.logger.info('FilesChannelController initialized');\n  }\n\n  /**\n   * Override handlesChannel to match file patterns.\n   */\n  override handlesChannel(channel: string): boolean {\n    // Check if channel starts with any of the prefixes\n    return (\n      channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.UPLOAD) ||\n      channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.DOWNLOAD) ||\n      channel.startsWith(FILES_STREAM_CHANNEL_PREFIX.GENERATE) ||\n      channel === FILES_STREAM_BROADCAST_CHANNEL.UPLOADS ||\n      channel === FILES_STREAM_BROADCAST_CHANNEL.DOWNLOADS ||\n      channel === FILES_STREAM_BROADCAST_CHANNEL.GENERATIONS\n    );\n  }\n}\n","/**\n * Files Stream Endpoint\n *\n * Stream endpoint for file-related real-time events.\n * Handles upload, download, and document generation progress.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n *   broadcaster: streamServer.getBroadcaster(),\n *   endpoints: [\n *     { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n *   ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../../events/streaming/base/BaseStreamEndpoint';\nimport { FilesChannelController } from './FilesChannelController';\nimport type { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamEndpointConfig, StreamEndpointCreateOptions } from '@plyaz/types/core';\n\n/**\n * FilesStreamEndpoint - Handles file streaming events\n *\n * Channels managed:\n * - `upload:{fileId}` - Per-file upload progress\n * - `uploads` - All uploads broadcast\n * - `download:{fileId}` - Per-file download progress\n * - `downloads` - All downloads broadcast\n * - `generate:{templateId}` - Per-template generation progress\n * - `generations` - All generations broadcast\n */\nexport class FilesStreamEndpoint extends BaseStreamEndpoint {\n  /** Static endpoint key for registry lookup */\n  static readonly endpointKey = 'files';\n\n  /**\n   * Create channel controller for this endpoint.\n   */\n  protected createChannelController(): BaseChannelController {\n    return new FilesChannelController();\n  }\n\n  /**\n   * Initialize event subscriptions.\n   * Called by StreamRegistry during initialization.\n   */\n  initialize(): void {\n    this.logger.debug('[FilesStreamEndpoint] initialize() called');\n\n    // Initialize the channel controller with broadcaster\n    this.channelController.initialize(this.broadcaster);\n\n    this.logger.debug('[FilesStreamEndpoint] initialized', {\n      patterns: this.channelController.getPatterns(),\n    });\n  }\n\n  /**\n   * Static factory method for creating endpoint instances.\n   *\n   * @param config - Endpoint configuration\n   * @param options - Create options (broadcaster, auth, etc.)\n   * @returns Promise resolving to endpoint instance\n   */\n  static async create(\n    config: StreamEndpointConfig,\n    options: StreamEndpointCreateOptions\n  ): Promise<FilesStreamEndpoint> {\n    return new FilesStreamEndpoint(config, options);\n  }\n}\n","/**\n * Files Streaming Exports\n *\n * Stream endpoint and channel controller for file-related events.\n */\n\nexport { FilesStreamEndpoint } from './FilesStreamEndpoint';\nexport { FilesChannelController } from './FilesChannelController';\n","/**\n * Notifications Channel Controller\n *\n * Handles IN_APP notification streaming - broadcasts new notifications to users.\n * Only supports notification:created event - when a new notification is created,\n * it's broadcasted to the user's channel based on userId.\n *\n * NOTE: This controller handles IN_APP notifications only.\n * Email, SMS, and Push are handled by @plyaz/notifications package.\n *\n * Flow:\n * 1. Backend creates notification with user_id\n * 2. Backend emits notification:created via CoreEventManager\n * 3. This controller broadcasts to user:notifications:{userId}\n * 4. User's connected clients receive and display the notification\n */\n\nimport { CoreEventManager } from '../../../events/CoreEventManager';\nimport { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamBroadcasterInterface, CoreEvent } from '@plyaz/types/core';\nimport {\n  NOTIFICATIONS_STREAM_CHANNEL_PREFIX,\n  NOTIFICATIONS_STREAM_BROADCAST_CHANNEL,\n} from '@plyaz/types/core';\nimport type { NotificationCreatedStreamData } from '@plyaz/types/core';\n\n/**\n * NotificationsChannelController - Broadcasts new notifications to users\n *\n * Channel:\n * - `user:notifications:{userId}` - User subscribes to receive their notifications\n */\nexport class NotificationsChannelController extends BaseChannelController {\n  constructor() {\n    super({\n      scope: 'notifications',\n      patterns: [\n        NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER,\n        NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS,\n      ],\n    });\n  }\n\n  /**\n   * Initialize event subscriptions.\n   * Listens to notification:created and broadcasts to user's channel.\n   */\n  initialize(broadcaster: StreamBroadcasterInterface): void {\n    this.logger.debug('[NotificationsChannelController] initialize() called');\n\n    // Listen for notification:created events\n    this.addUnsubscriber(\n      CoreEventManager.on<NotificationCreatedStreamData>(\n        'notification:created',\n        (event: CoreEvent<NotificationCreatedStreamData>) => {\n          const data = event.data;\n\n          // userId is REQUIRED for routing\n          if (!data.userId) {\n            this.logger.warn(\n              '[NotificationsChannelController] notification:created missing userId',\n              {\n                notificationId: data.notificationId,\n              }\n            );\n            return;\n          }\n\n          const userChannel = `${NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER}${data.userId}`;\n\n          this.logger.debug('[NotificationsChannelController] notification:created', {\n            notificationId: data.notificationId,\n            userId: data.userId,\n            userChannel,\n          });\n\n          // Broadcast to user's notifications channel\n          broadcaster.broadcastToChannel(userChannel, {\n            event: 'notification:created',\n            data: this.createResponse(data, userChannel, 'New notification'),\n          });\n\n          // Also broadcast to general channel (for admin/debug)\n          broadcaster.broadcastToChannel(NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS, {\n            event: 'notification:created',\n            data: this.createResponse(\n              data,\n              NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS\n            ),\n          });\n        }\n      )\n    );\n\n    this.logger.info('NotificationsChannelController initialized (notification:created only)');\n  }\n\n  /**\n   * Override handlesChannel to match notification patterns.\n   */\n  override handlesChannel(channel: string): boolean {\n    return (\n      channel.startsWith(NOTIFICATIONS_STREAM_CHANNEL_PREFIX.USER) ||\n      channel === NOTIFICATIONS_STREAM_BROADCAST_CHANNEL.ALL_NOTIFICATIONS\n    );\n  }\n}\n","/**\n * Notifications Stream Endpoint\n *\n * Stream endpoint for IN_APP notification real-time events.\n * Handles notification lifecycle events (created, read, unread, deleted).\n *\n * NOTE: This endpoint handles IN_APP notifications only (bell icon notifications).\n * Email, SMS, and Push notification delivery is handled by @plyaz/notifications package.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n *   broadcaster: streamServer.getBroadcaster(),\n *   endpoints: [\n *     { endpoint: NotificationsStreamEndpoint, config: { enabled: true } },\n *   ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../../events/streaming/base/BaseStreamEndpoint';\nimport { NotificationsChannelController } from './NotificationsChannelController';\nimport type { BaseChannelController } from '../../../events/streaming/channels/BaseChannelController';\nimport type { StreamEndpointConfig, StreamEndpointCreateOptions } from '@plyaz/types/core';\n\n/**\n * NotificationsStreamEndpoint - Handles IN_APP notification streaming events\n *\n * Channels managed:\n * - `notification:{notificationId}` - Per-notification updates\n * - `user:notifications:{userId}` - All notifications for a specific user\n * - `notifications` - Broadcast channel for all notifications (current user)\n * - `notifications:unread` - Broadcast channel for unread notifications\n *\n * Events:\n * - `notification:created` - New in-app notification created\n * - `notification:read` - Notification marked as read\n * - `notification:unread` - Notification marked as unread\n * - `notification:deleted` - Notification deleted\n * - `notifications:batch` - Batch operations (e.g., mark all as read)\n */\nexport class NotificationsStreamEndpoint extends BaseStreamEndpoint {\n  /** Static endpoint key for registry lookup */\n  static readonly endpointKey = 'notifications';\n\n  /**\n   * Create channel controller for this endpoint.\n   */\n  protected createChannelController(): BaseChannelController {\n    return new NotificationsChannelController();\n  }\n\n  /**\n   * Initialize event subscriptions.\n   * Called by StreamRegistry during initialization.\n   */\n  initialize(): void {\n    this.logger.debug('[NotificationsStreamEndpoint] initialize() called');\n\n    // Initialize the channel controller with broadcaster\n    this.channelController.initialize(this.broadcaster);\n\n    this.logger.debug('[NotificationsStreamEndpoint] initialized (IN_APP notifications)', {\n      patterns: this.channelController.getPatterns(),\n    });\n  }\n\n  /**\n   * Static factory method for creating endpoint instances.\n   *\n   * @param config - Endpoint configuration\n   * @param options - Create options (broadcaster, auth, etc.)\n   * @returns Promise resolving to endpoint instance\n   */\n  static async create(\n    config: StreamEndpointConfig,\n    options: StreamEndpointCreateOptions\n  ): Promise<NotificationsStreamEndpoint> {\n    return new NotificationsStreamEndpoint(config, options);\n  }\n}\n","/**\n * Notifications Streaming\n *\n * Stream endpoint and channel controller for notification events.\n */\n\nexport { NotificationsChannelController } from './NotificationsChannelController';\nexport { NotificationsStreamEndpoint } from './NotificationsStreamEndpoint';\n","/**\n * System Channel Controller\n *\n * Handles system-level streaming channels: heartbeat, connection lifecycle.\n */\n\nimport { BaseChannelController } from '../../channels/BaseChannelController';\nimport type { StreamBroadcasterInterface } from '@plyaz/types/core';\nimport { SYSTEM_STREAM_CHANNEL } from '@plyaz/types/core';\n\n/**\n * SystemChannelController - Handles system streaming channels\n *\n * Channels:\n * - `system` - System-level events (heartbeat, connected, disconnected)\n */\nexport class SystemChannelController extends BaseChannelController {\n  /** Heartbeat interval timer */\n  private heartbeatTimer?: ReturnType<typeof setInterval>;\n\n  /** Heartbeat interval in milliseconds */\n  private readonly heartbeatInterval: number;\n\n  constructor(heartbeatInterval = 30000) {\n    super({\n      scope: 'system',\n      patterns: [SYSTEM_STREAM_CHANNEL.SYSTEM],\n    });\n    this.heartbeatInterval = heartbeatInterval;\n  }\n\n  /**\n   * Initialize event subscriptions.\n   * Sets up heartbeat broadcasting.\n   */\n  initialize(broadcaster: StreamBroadcasterInterface): void {\n    this.logger.debug('Initializing SystemChannelController');\n\n    // Start heartbeat timer\n    this.heartbeatTimer = setInterval(() => {\n      broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n        event: 'heartbeat',\n        data: this.createResponse(\n          { timestamp: Date.now() },\n          SYSTEM_STREAM_CHANNEL.SYSTEM,\n          'Heartbeat'\n        ),\n      });\n    }, this.heartbeatInterval);\n\n    this.logger.info('SystemChannelController initialized', {\n      heartbeatInterval: this.heartbeatInterval,\n    });\n  }\n\n  /**\n   * Override handlesChannel to match system patterns.\n   */\n  override handlesChannel(channel: string): boolean {\n    return channel === SYSTEM_STREAM_CHANNEL.SYSTEM || channel.startsWith('system:');\n  }\n\n  /**\n   * Override dispose to clean up heartbeat timer.\n   */\n  override dispose(): void {\n    if (this.heartbeatTimer) {\n      clearInterval(this.heartbeatTimer);\n      this.heartbeatTimer = undefined;\n    }\n    super.dispose();\n  }\n\n  /**\n   * Broadcast a connection established event.\n   */\n  broadcastConnected(broadcaster: StreamBroadcasterInterface, connectionId: string): void {\n    broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n      event: 'connected',\n      data: this.createResponse(\n        { connectionId, timestamp: Date.now() },\n        SYSTEM_STREAM_CHANNEL.SYSTEM,\n        'Connected'\n      ),\n    });\n  }\n\n  /**\n   * Broadcast a connection closed event.\n   */\n  broadcastDisconnected(broadcaster: StreamBroadcasterInterface, connectionId: string): void {\n    broadcaster.broadcastToChannel(SYSTEM_STREAM_CHANNEL.SYSTEM, {\n      event: 'disconnected',\n      data: this.createResponse(\n        { connectionId, timestamp: Date.now() },\n        SYSTEM_STREAM_CHANNEL.SYSTEM,\n        'Disconnected'\n      ),\n    });\n  }\n}\n","/**\n * System Stream Endpoint\n *\n * Stream endpoint for system-level events like heartbeat and connection lifecycle.\n *\n * @example\n * ```typescript\n * // Register in StreamRegistry\n * await StreamRegistry.initialize({\n *   broadcaster: streamServer.getBroadcaster(),\n *   endpoints: [\n *     { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n *   ],\n * });\n * ```\n */\n\nimport { BaseStreamEndpoint } from '../../base/BaseStreamEndpoint';\nimport { SystemChannelController } from './SystemChannelController';\nimport type { BaseChannelController } from '../../channels/BaseChannelController';\nimport type {\n  StreamEndpointConfig,\n  StreamEndpointCreateOptions,\n  StreamConnection,\n} from '@plyaz/types/core';\n\n/**\n * SystemStreamEndpoint - Handles system-level streaming events\n *\n * Channels managed:\n * - `system` - System events (heartbeat, connected, disconnected)\n */\nexport class SystemStreamEndpoint extends BaseStreamEndpoint {\n  /** Static endpoint key for registry lookup */\n  static readonly endpointKey = 'system';\n\n  /** Heartbeat interval in milliseconds */\n  private readonly heartbeatInterval: number;\n\n  constructor(config: StreamEndpointConfig, options: StreamEndpointCreateOptions) {\n    super(config, options);\n    // Allow configuring heartbeat interval via config\n    const DEFAULT_HEARTBEAT_MS = 30000;\n    this.heartbeatInterval =\n      (config as { heartbeatInterval?: number }).heartbeatInterval ?? DEFAULT_HEARTBEAT_MS;\n  }\n\n  /**\n   * Create channel controller for this endpoint.\n   */\n  protected createChannelController(): BaseChannelController {\n    return new SystemChannelController(this.heartbeatInterval);\n  }\n\n  /**\n   * Initialize event subscriptions.\n   * Called by StreamRegistry during initialization.\n   */\n  initialize(): void {\n    this.logger.debug('Initializing SystemStreamEndpoint');\n\n    // Initialize the channel controller with broadcaster\n    this.channelController.initialize(this.broadcaster);\n\n    this.logger.info('SystemStreamEndpoint initialized', {\n      heartbeatInterval: this.heartbeatInterval,\n    });\n  }\n\n  /**\n   * Called when a new connection is established.\n   * Broadcasts a connected event.\n   */\n  protected override async onConnect(connection: StreamConnection): Promise<void> {\n    const controller = this.channelController as SystemChannelController;\n    controller.broadcastConnected(this.broadcaster, connection.id);\n  }\n\n  /**\n   * Called when a connection is closed.\n   * Broadcasts a disconnected event.\n   */\n  protected override async onDisconnect(connectionId: string): Promise<void> {\n    const controller = this.channelController as SystemChannelController;\n    controller.broadcastDisconnected(this.broadcaster, connectionId);\n  }\n\n  /**\n   * Static factory method for creating endpoint instances.\n   *\n   * @param config - Endpoint configuration\n   * @param options - Create options (broadcaster, auth, etc.)\n   * @returns Promise resolving to endpoint instance\n   */\n  static async create(\n    config: StreamEndpointConfig,\n    options: StreamEndpointCreateOptions\n  ): Promise<SystemStreamEndpoint> {\n    return new SystemStreamEndpoint(config, options);\n  }\n}\n","/**\n * System Stream Endpoint Exports\n */\n\nexport { SystemStreamEndpoint } from './SystemStreamEndpoint';\nexport { SystemChannelController } from './SystemChannelController';\n","/**\n * Stream Endpoints\n *\n * Domain-specific stream endpoints for real-time event broadcasting.\n *\n * Usage:\n * ```typescript\n * import { StreamRegistry, FilesStreamEndpoint, SystemStreamEndpoint } from '@plyaz/core/events/streaming';\n *\n * await StreamRegistry.initialize({\n *   broadcaster: streamServer.getBroadcaster(),\n *   endpoints: [\n *     { endpoint: FilesStreamEndpoint, config: { enabled: true } },\n *     { endpoint: SystemStreamEndpoint, config: { enabled: true } },\n *   ],\n * });\n * ```\n */\n\n// Files domain endpoints (re-exported from domain/files for convenience)\nexport { FilesStreamEndpoint, FilesChannelController } from '../../../domain/files/streaming';\n\n// Notifications domain endpoints (re-exported from domain/notifications for convenience)\nexport {\n  NotificationsStreamEndpoint,\n  NotificationsChannelController,\n} from '../../../domain/notifications/streaming';\n\n// System endpoints\nexport { SystemStreamEndpoint, SystemChannelController } from './system';\n","/**\n * Middleware Chain\n *\n * Runs a chain of middleware functions for stream connections.\n */\n\nimport { CoreLogger } from '@plyaz/logger';\nimport { StreamPackageError } from '@plyaz/errors';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport type {\n  StreamMiddleware,\n  StreamMiddlewareContext,\n  StreamMiddlewareResult,\n} from '@plyaz/types/core';\n\n/**\n * MiddlewareChain - Runs middleware in sequence\n *\n * Each middleware can:\n * - Continue to next middleware (return { continue: true })\n * - Stop the chain (return { continue: false, error: ... })\n * - Modify context (return { continue: true, context: { ... } })\n *\n * @example\n * ```typescript\n * const chain = new MiddlewareChain();\n * chain.use(rateLimitMiddleware);\n * chain.use(authMiddleware);\n *\n * const result = await chain.run(context);\n * if (!result.continue) {\n *   return new Response(result.error?.message, { status: 429 });\n * }\n * ```\n */\nexport class MiddlewareChain {\n  private readonly logger: CoreLogger;\n  private readonly middlewares: StreamMiddleware[] = [];\n\n  constructor() {\n    this.logger = new CoreLogger({ service: 'MiddlewareChain' });\n  }\n\n  /**\n   * Add a middleware to the chain.\n   *\n   * @param middleware - Middleware function to add\n   * @returns this for chaining\n   */\n  use(middleware: StreamMiddleware): this {\n    this.middlewares.push(middleware);\n    return this;\n  }\n\n  /**\n   * Run all middleware in sequence.\n   *\n   * @param initialContext - Initial context to pass to first middleware\n   * @returns Final result after all middleware have run\n   */\n  async run(initialContext: StreamMiddlewareContext): Promise<StreamMiddlewareResult> {\n    let context = { ...initialContext };\n\n    for (const middleware of this.middlewares) {\n      try {\n        const result = await middleware(context);\n\n        if (!result.continue) {\n          // Middleware stopped the chain\n          this.logger.debug('Middleware stopped chain', {\n            error: result.error?.message,\n          });\n          return result;\n        }\n\n        // Merge context updates\n        if (result.context) {\n          context = { ...context, ...result.context };\n        }\n      } catch (error) {\n        // Middleware threw an error\n        this.logger.error('Middleware error', { error });\n        return {\n          continue: false,\n          error:\n            error instanceof StreamPackageError\n              ? error\n              : new StreamPackageError(\n                  error instanceof Error ? error.message : String(error),\n                  STREAM_ERROR_CODES.UNKNOWN_ERROR\n                ),\n        };\n      }\n    }\n\n    // All middleware passed\n    return {\n      continue: true,\n      context,\n    };\n  }\n\n  /**\n   * Get the number of middleware in the chain.\n   */\n  get length(): number {\n    return this.middlewares.length;\n  }\n\n  /**\n   * Clear all middleware from the chain.\n   */\n  clear(): void {\n    this.middlewares.length = 0;\n  }\n}\n","/**\n * Rate Limit Middleware\n *\n * Limits connections and message rate per IP/user.\n */\n\nimport { StreamPackageError } from '@plyaz/errors';\nimport type {\n  StreamMiddleware,\n  StreamMiddlewareContext,\n  StreamMiddlewareResult,\n  RateLimitConfig,\n} from '@plyaz/types/core';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\n\n/**\n * Time constants\n */\nconst MS_PER_SECOND = 1000;\n\n/**\n * Default rate limit configuration\n */\nconst DEFAULT_CONFIG: Required<RateLimitConfig> = {\n  maxConnectionsPerIp: 10,\n  maxMessagesPerSecond: 100,\n  windowMs: 60000, // 1 minute\n};\n\n/** Connection count by IP */\nconst connectionsByIp = new Map<string, Set<string>>();\n\n/** Message count by connection ID */\nconst messageCountByConnection = new Map<string, { count: number; resetAt: number }>();\n\n/**\n * Create a rate limit middleware.\n *\n * @param config - Rate limit configuration\n * @returns Middleware function\n *\n * @example\n * ```typescript\n * const middleware = createRateLimitMiddleware({\n *   maxConnectionsPerIp: 5,\n *   maxMessagesPerSecond: 50,\n * });\n *\n * chain.use(middleware);\n * ```\n */\nexport function createRateLimitMiddleware(config: RateLimitConfig = {}): StreamMiddleware {\n  const mergedConfig = { ...DEFAULT_CONFIG, ...config };\n\n  // eslint-disable-next-line complexity\n  return async (context: StreamMiddlewareContext): Promise<StreamMiddlewareResult> => {\n    const { connection } = context;\n\n    // Extract IP from connection metadata or use connection ID\n    const ip = (connection.metadata?.ip as string) ?? connection.id;\n\n    // Check connection limit per IP\n    if (!connectionsByIp.has(ip)) {\n      connectionsByIp.set(ip, new Set());\n    }\n\n    const connections = connectionsByIp.get(ip)!;\n\n    // Only check limit for new connections\n    if (!connections.has(connection.id)) {\n      if (connections.size >= mergedConfig.maxConnectionsPerIp) {\n        return {\n          continue: false,\n          error: new StreamPackageError(\n            `Rate limit exceeded: max ${mergedConfig.maxConnectionsPerIp} connections per IP`,\n            STREAM_ERROR_CODES.RATE_LIMITED\n          ),\n        };\n      }\n      connections.add(connection.id);\n    }\n\n    // Check message rate (if there's a message being processed)\n    if (context.message) {\n      const now = Date.now();\n      const rateInfo = messageCountByConnection.get(connection.id);\n\n      if (!rateInfo || now >= rateInfo.resetAt) {\n        // Reset window\n        messageCountByConnection.set(connection.id, {\n          count: 1,\n          resetAt: now + MS_PER_SECOND, // 1 second window for messages per second\n        });\n      } else {\n        if (rateInfo.count >= mergedConfig.maxMessagesPerSecond) {\n          return {\n            continue: false,\n            error: new StreamPackageError(\n              `Rate limit exceeded: max ${mergedConfig.maxMessagesPerSecond} messages per second`,\n              STREAM_ERROR_CODES.RATE_LIMITED\n            ),\n          };\n        }\n        rateInfo.count++;\n      }\n    }\n\n    return { continue: true };\n  };\n}\n\n/**\n * Remove a connection from IP tracking and clean up empty IP entries.\n */\nfunction removeConnectionFromIp(ipKey: string, connectionId: string): void {\n  const connections = connectionsByIp.get(ipKey);\n  if (!connections) return;\n\n  connections.delete(connectionId);\n  if (connections.size === 0) {\n    connectionsByIp.delete(ipKey);\n  }\n}\n\n/**\n * Find and remove a connection from all IP tracking entries.\n */\nfunction removeConnectionFromAllIps(connectionId: string): void {\n  for (const [ipKey, connections] of connectionsByIp) {\n    if (connections.has(connectionId)) {\n      removeConnectionFromIp(ipKey, connectionId);\n      break;\n    }\n  }\n}\n\n/**\n * Clean up rate limit tracking for a connection.\n * Call when a connection is closed.\n *\n * @param connectionId - Connection ID to clean up\n * @param ip - IP address of the connection\n */\nexport function cleanupRateLimitTracking(connectionId: string, ip?: string): void {\n  // Remove message tracking\n  messageCountByConnection.delete(connectionId);\n\n  // Remove from IP connection tracking\n  if (ip) {\n    removeConnectionFromIp(ip, connectionId);\n  } else {\n    removeConnectionFromAllIps(connectionId);\n  }\n}\n\n/**\n * Get current rate limit stats.\n */\nexport function getRateLimitStats(): {\n  connectionsByIp: Map<string, number>;\n  totalConnections: number;\n} {\n  const stats = new Map<string, number>();\n  let total = 0;\n\n  for (const [ip, connections] of connectionsByIp) {\n    stats.set(ip, connections.size);\n    total += connections.size;\n  }\n\n  return {\n    connectionsByIp: stats,\n    totalConnections: total,\n  };\n}\n","/**\n * Stream Middleware\n *\n * Middleware for stream connections including rate limiting.\n *\n * @example\n * ```typescript\n * import { MiddlewareChain, createRateLimitMiddleware } from '@plyaz/core/events/streaming';\n *\n * const chain = new MiddlewareChain();\n * chain.use(createRateLimitMiddleware({ maxConnectionsPerIp: 5 }));\n *\n * const result = await chain.run(context);\n * ```\n */\n\nexport { MiddlewareChain } from './MiddlewareChain';\nexport {\n  createRateLimitMiddleware,\n  cleanupRateLimitTracking,\n  getRateLimitStats,\n} from './RateLimitMiddleware';\n","/**\n * Streaming Module\n *\n * Real-time event streaming via SSE/WebSocket.\n * Structured for future extraction to @plyaz/events package.\n *\n * @example\n * ```ts\n * import { StreamServer } from '@plyaz/core/events/streaming';\n *\n * // Create stream server with builder pattern\n * const streamServer = StreamServer.create()\n *   .withAuth(new AnonymousAuthAdapter())\n *   .withSSE({ heartbeatInterval: 15000 })\n *   .build();\n *\n * // Next.js App Router\n * export const GET = streamServer.getHandler('nextjs');\n *\n * // Express\n * app.get('/stream', streamServer.getHandler('express'));\n *\n * // Client-side: Connect to stream\n * const { connected } = useStreamConnection({\n *   channels: ['uploads'],\n *   onMessage: (msg) => console.log(msg),\n * });\n * ```\n */\n\n// Re-export types from @plyaz/types (convenience for consumers)\nexport type {\n  // Connection types\n  StreamConnection,\n  StreamConnectionInfo,\n  StreamTransportType,\n  // Message types\n  StreamMessage,\n  StreamProgressData,\n  // Channel types\n  StreamChannel,\n  ChannelSubscription,\n  // Auth types\n  StreamAuthResult,\n  StreamAuthAdapterConfig,\n  TokenAuthAdapterConfig,\n  // Transport types\n  StreamTransportAdapterConfig,\n  // Manager types\n  StreamBroadcasterConfig,\n  StreamManagerStats,\n  // Progress types (from files domain)\n  FilesUploadStreamProgress,\n  FilesDownloadStreamProgress,\n  FilesGenerateStreamProgress,\n  FilesStreamProgressData,\n  // Hook types\n  UseStreamConnectionOptions,\n  UseStreamConnectionResult,\n} from '@plyaz/types/core';\n\n// StreamServer (main entry point)\nexport { StreamServer, StreamServerBuilder } from './StreamServer';\nexport type { StreamServerConfig } from './StreamServer';\n\n// Auth adapters\nexport { BaseAuthAdapter } from './auth';\nexport { AnonymousAuthAdapter, TokenAuthAdapter } from './auth';\n\n// Transport adapters\nexport { BaseTransportAdapter } from './transports';\nexport { SSETransportAdapter, WebSocketTransportAdapter } from './transports';\n\n// Framework adapters (classes only, types from @plyaz/types above)\nexport {\n  BaseFrameworkAdapter,\n  NextJSFrameworkAdapter,\n  ExpressFrameworkAdapter,\n  NestJSFrameworkAdapter,\n} from './frameworks';\n\n// Managers (for advanced usage)\nexport { StreamConnectionManager } from './StreamConnectionManager';\nexport { StreamBroadcaster } from './StreamBroadcaster';\n\n// Registry (for endpoint management)\nexport { StreamRegistry } from './StreamRegistry';\n\n// Base classes (for extending)\nexport { BaseStreamEndpoint } from './base/BaseStreamEndpoint';\nexport { BaseChannelController } from './channels/BaseChannelController';\n\n// Stream endpoints\nexport {\n  FilesStreamEndpoint,\n  FilesChannelController,\n  NotificationsStreamEndpoint,\n  NotificationsChannelController,\n  SystemStreamEndpoint,\n  SystemChannelController,\n} from './endpoints';\n\n// Middleware\nexport {\n  MiddlewareChain,\n  createRateLimitMiddleware,\n  cleanupRateLimitTracking,\n  getRateLimitStats,\n} from './middleware';\n\n// Constants (from @plyaz/config/streaming)\nexport {\n  STREAMING_DEFAULTS,\n  STREAMING_SERVER_CONFIG,\n  STREAMING_CLIENT_CONFIG,\n  STREAMING_BUFFER_CONFIG,\n  STREAMING_PACKAGE_CONFIG,\n  type StreamingDefaults,\n} from '@plyaz/config/streaming';\n","/**\n * Runtime Detection Utilities\n *\n * Utilities for detecting the current JavaScript runtime environment.\n */\n\nimport type { CoreRuntimeEnvironment } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\n// Type-safe access to alternative runtime globals\nconst getGlobalProperty = (key: string): unknown => {\n  return (globalThis as Record<string, unknown>)[key];\n};\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'Runtime' });\n\n/**\n * Check if a module is available via require.resolve\n */\nfunction isModuleAvailable(moduleName: string): boolean {\n  const nodeRequire = globalThis.require;\n  if (!nodeRequire) return false;\n\n  const resolveModule = nodeRequire.resolve;\n  if (!resolveModule) return false;\n\n  try {\n    resolveModule(moduleName);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/** Check for alternative runtimes (Deno, Bun) */\nfunction detectAltRuntime(): CoreRuntimeEnvironment | null {\n  if (typeof getGlobalProperty('Deno') !== 'undefined') return 'deno';\n  if (typeof getGlobalProperty('Bun') !== 'undefined') return 'bun';\n  return null;\n}\n\n/** Check for edge runtime */\nfunction detectEdgeRuntime(): CoreRuntimeEnvironment | null {\n  if (typeof getGlobalProperty('EdgeRuntime') !== 'undefined') return 'edge';\n  const isEdgeLike =\n    typeof globalThis.caches !== 'undefined' &&\n    typeof globalThis.Request !== 'undefined' &&\n    typeof process === 'undefined';\n  return isEdgeLike ? 'edge' : null;\n}\n\n/** Check for browser environment */\nfunction detectBrowser(): CoreRuntimeEnvironment | null {\n  if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n    return 'browser';\n  }\n  return null;\n}\n\n/** Check for Node.js framework */\nfunction detectNodeFramework(): CoreRuntimeEnvironment {\n  // Check for Nuxt (SSR)\n  if (process.env.__NUXT__ || process.env.NUXT_APP) return 'nuxt';\n  // Check for Next.js (SSR)\n  if (process.env.__NEXT_PRIVATE_ORIGIN || process.env.NEXT_RUNTIME) return 'nextjs';\n  // Check for NestJS via module detection\n  if (isModuleAvailable('@nestjs/core')) return 'nestjs';\n  // Check for Express via module detection\n  if (isModuleAvailable('express')) return 'express';\n  return 'node';\n}\n\n/**\n * Detect the current runtime environment\n */\nexport function detectRuntime(): CoreRuntimeEnvironment {\n  // Check alternative runtimes first\n  const altRuntime = detectAltRuntime();\n  if (altRuntime) return altRuntime;\n\n  // Check for edge runtime\n  const edgeRuntime = detectEdgeRuntime();\n  if (edgeRuntime) return edgeRuntime;\n\n  // Check for browser\n  const browser = detectBrowser();\n  if (browser) return browser;\n\n  // Server-side detection (Node.js based)\n  if (typeof process !== 'undefined' && process.versions?.node) {\n    return detectNodeFramework();\n  }\n\n  return 'unknown';\n}\n\n/**\n * Load environment variables from a .env file\n */\nexport async function loadEnvFile(envPath: string, verbose?: boolean): Promise<void> {\n  try {\n    const dotenv = await import('dotenv');\n    const result = dotenv.config({ path: envPath });\n\n    if (result.error) {\n      logger.warn(`Failed to load env file: ${result.error.message}`);\n    } else if (verbose) {\n      logger.info(`Loaded env from: ${envPath}`);\n    }\n  } catch {\n    logger.warn('dotenv not available, skipping .env file loading');\n  }\n}\n","// This eslint disable is an edge-case as we need to ensure that we're able to load CoreInitializer regardless if FE, BE or specific frameworks\n/**\n * CoreInitializer - Unified initialization for @plyaz/core\n *\n * Provides a single entry point to initialize all core services with\n * environment-aware configuration. Works across all JavaScript runtimes.\n *\n * @example Backend with full config\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n *   envPath: '.env',\n *   db: { adapter: 'drizzle' },\n *   api: {\n *     env: 'production',\n *     baseURL: 'https://api.example.com',\n *   },\n * });\n *\n * // Access services\n * const db = Core.db;\n * const api = Core.api;\n * ```\n *\n * @example Frontend (Nuxt/Next.js)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n *   skipDb: true,\n *   api: { baseURL: 'https://api.example.com' },\n * });\n *\n * const api = Core.api;\n * ```\n *\n * @example NestJS with DI\n * ```typescript\n * // app.module.ts\n * import { CoreModule } from '@plyaz/core/adapters';\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n *   imports: [\n *     CoreModule.forRoot({ envPath: '.env', db: { adapter: 'drizzle' } }),\n *     FeatureFlagModule.forRoot({ provider: 'database' }),\n *   ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { ApiClientService } from '../services/ApiClientService';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { ServiceRegistry } from './ServiceRegistry';\nimport { StreamRegistry, StreamServer } from '../events/streaming';\nimport { STREAMING_DEFAULTS } from '@plyaz/config/streaming';\nimport type {\n  CoreRuntimeEnvironment,\n  CoreRuntimeContext,\n  CoreEnvVars,\n  CoreAppEnvironment,\n  CoreAppContext,\n  CoreApiInitOptions,\n  CoreServiceRuntime,\n  CoreInitOptionsBase as BaseCoreInitOptions,\n  CoreServicesResultBase,\n  CoreServiceEntry,\n  CoreDomainServiceInstance,\n  CoreSystemErrorPayload,\n  CoreFeatureFlagInitConfig,\n  CoreErrorHandlerInitConfig,\n  CoreCacheConfig,\n  CoreObservabilityConfig,\n  CoreDbServiceConfig,\n  CoreStorageConfig,\n  CoreNotificationConfig,\n  StreamEndpointEntry,\n  CoreDbServiceInstance,\n  CoreCacheServiceInstance,\n  CoreStorageServiceInstance,\n  CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport type { ObservabilityAdapter } from '@plyaz/types/observability';\nimport { ObservabilityService } from '../base/observability/ObservabilityService';\nimport { LoggerAdapter } from '../base/observability/LoggerAdapter';\nimport type { FeatureFlagValue, FeatureFlagStoreSlice } from '@plyaz/types/features';\nimport { ERROR_CODES, BACKEND_RUNTIMES, FRONTEND_RUNTIMES } from '@plyaz/types';\nimport { BaseError, CorePackageError, initializeErrorSystem } from '@plyaz/errors';\n// Core error handling (frontend-safe)\nimport {\n  initializeGlobalErrorHandler,\n  setEventEmitter,\n  clearEventEmitter,\n} from '@plyaz/errors/middleware';\n// ServerErrorMiddleware is backend-only, import dynamically where needed\nimport type {\n  ErrorStoreActions,\n  GlobalErrorHandler,\n  SerializedError,\n  PackageErrorLike,\n} from '@plyaz/types/errors';\nimport { ERROR_CATEGORY } from '@plyaz/types/errors';\nimport { detectRuntime, loadEnvFile } from '../utils/runtime';\nimport { generateId } from '../utils/common';\nimport { createStandaloneFeatureFlagStore, STORE_KEYS, type StoreKey } from '@plyaz/store';\nimport { CORE_EVENTS, type CoreEvent } from '@plyaz/types/core';\nimport type { RootStoreSlice, RootStoreHook } from '@plyaz/types/store';\nimport type { StoreApi } from 'zustand/vanilla';\nimport { getCoreDependency } from '../config/dependencies';\n\n// Constants\nconst DEFAULT_MAX_ERRORS = 100;\n\n/**\n * Core initialization options with specific types for this package\n */\nexport interface CoreInitOptions\n  extends Omit<\n    BaseCoreInitOptions<\n      Partial<CoreDbServiceConfig>,\n      CoreApiInitOptions,\n      CoreStorageConfig,\n      CoreNotificationConfig\n    >,\n    'observability' | 'skipObservability'\n  > {\n  /** Observability configuration */\n  observability?: CoreObservabilityConfig;\n  /** Skip observability initialization */\n  skipObservability?: boolean;\n  /**\n   * Global error handler configuration.\n   * Auto-initializes by default to catch all uncaught errors.\n   * Set `enabled: false` to disable if you want to use your own error handling.\n   *\n   * @example\n   * ```typescript\n   * await Core.initialize({\n   *   errorHandler: {\n   *     enabled: true,\n   *     logToConsole: true,\n   *     maxErrors: 200,\n   *     filter: (error) => error instanceof MyError,\n   *   },\n   * });\n   * ```\n   */\n  errorHandler?: CoreErrorHandlerInitConfig;\n\n  /** Feature flags configuration */\n  featureFlags?: CoreFeatureFlagInitConfig;\n\n  /**\n   * Domain services to auto-initialize (frontend pattern).\n   * Uses ServiceRegistry for automatic initialization.\n   *\n   * @example\n   * ```typescript\n   * await Core.initialize({\n   *   services: [\n   *     { service: FeatureFlagDomainService, config: { enabled: true } },\n   *     { service: ExampleDomainService, config: { enabled: true, useRealApi: true } },\n   *   ],\n   * });\n   *\n   * // Access via ServiceRegistry\n   * const flags = ServiceRegistry.get<FeatureFlagDomainService>('featureFlags');\n   * ```\n   */\n  services?: CoreServiceEntry[];\n}\n\n/**\n * Core initialization result with specific types for this package\n */\nexport type CoreServicesResult = CoreServicesResultBase<\n  CoreDbServiceInstance,\n  typeof ApiClientService,\n  CoreCacheServiceInstance,\n  ObservabilityAdapter,\n  CoreStorageServiceInstance,\n  CoreNotificationServiceInstance\n>;\n\n// Domain store keys are automatically derived from STORE_KEYS\n// Excluding global stores (error, featureFlags) which are read-only by default\n\n/**\n * Function type for getting core domain services.\n * Used by entry points to inject runtime-appropriate services.\n *\n * @internal This is injected by entry points, not used directly.\n */\nexport type GetCoreDomainServicesFn = (isFrontend: boolean) => Promise<CoreServiceEntry[]>;\n\n/**\n * Injected function to get core domain services.\n * Set by entry points (entry-backend.ts) before Core.initialize().\n * Frontend entries don't set this - they just don't load default services.\n */\nlet _getCoreDomainServices: GetCoreDomainServicesFn | null = null;\n\n/**\n * Set the function to get core domain services.\n * Called by entry-backend.ts to inject the backend-aware service loader.\n *\n * @internal Used by entry points only.\n */\nexport function setGetCoreDomainServices(fn: GetCoreDomainServicesFn): void {\n  _getCoreDomainServices = fn;\n}\n\n/**\n * Function type for getting core stream endpoints.\n * Used by entry points to inject backend stream endpoints.\n *\n * @internal This is injected by entry points, not used directly.\n */\nexport type GetCoreStreamEndpointsFn = () => Promise<StreamEndpointEntry[]>;\n\n/**\n * Injected function to get core stream endpoints.\n * Set by entry points (entry-backend.ts) before Core.initialize().\n * Frontend entries don't set this - streaming is backend-only.\n */\nlet _getCoreStreamEndpoints: GetCoreStreamEndpointsFn | null = null;\n\n/**\n * Set the function to get core stream endpoints.\n * Called by entry-backend.ts to inject the backend stream endpoint loader.\n *\n * @internal Used by entry points only.\n */\nexport function setGetCoreStreamEndpoints(fn: GetCoreStreamEndpointsFn): void {\n  _getCoreStreamEndpoints = fn;\n}\n\n/**\n * Global singleton state to handle module duplication with local linking.\n * When packages are linked locally, multiple copies of this module may be loaded.\n * Using globalThis ensures all copies share the same state.\n */\nconst CORE_GLOBAL_KEY = '__PLYAZ_CORE_SINGLETON__';\n\ninterface CoreGlobalState {\n  initialized: boolean;\n  initPromise: Promise<CoreServicesResult> | null;\n  coreServices: CoreServicesResult;\n  initOptions: CoreInitOptions;\n  logger: PackageLogger | null;\n  loggerTransport: 'pino' | 'console';\n}\n\n/** Get or create the global Core state */\nconst state = (): CoreGlobalState => {\n  const g = globalThis as unknown as Record<string, CoreGlobalState>;\n  g[CORE_GLOBAL_KEY] ??= {\n    initialized: false,\n    initPromise: null,\n    coreServices: {\n      db: null,\n      api: null,\n      cache: null,\n      observability: null,\n      storage: null,\n      notifications: null,\n      env: {},\n      runtime: 'unknown',\n      appContext: 'webapp',\n    },\n    initOptions: {},\n    logger: null,\n    loggerTransport: 'pino',\n  };\n  return g[CORE_GLOBAL_KEY];\n};\n\nexport class Core {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Global state accessors (delegates to globalThis for module deduplication)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  private static get initialized(): boolean {\n    return state().initialized;\n  }\n  private static set initialized(value: boolean) {\n    state().initialized = value;\n  }\n\n  private static get _initPromise(): Promise<CoreServicesResult> | null {\n    return state().initPromise;\n  }\n  private static set _initPromise(value: Promise<CoreServicesResult> | null) {\n    state().initPromise = value;\n  }\n\n  private static get _coreServices(): CoreServicesResult {\n    return state().coreServices;\n  }\n  private static set _coreServices(value: CoreServicesResult) {\n    state().coreServices = value;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Logger (also uses global state)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Get or create the Core logger */\n  private static get logger(): PackageLogger {\n    const s = state();\n    s.logger ??= new PackageLogger({\n      packageName: 'core',\n      service: 'Core',\n      transport: s.loggerTransport,\n    });\n    return s.logger;\n  }\n\n  /** Configure logger transport (call before first log) */\n  private static configureLogger(transport?: 'pino' | 'console'): void {\n    const s = state();\n    if (transport && transport !== s.loggerTransport) {\n      s.loggerTransport = transport;\n      s.logger = null; // Reset so it gets recreated with new transport\n    }\n  }\n\n  /** Get the configured logger transport */\n  static get loggerTransport(): 'pino' | 'console' {\n    return state().loggerTransport;\n  }\n\n  /**\n   * Log a message during initialization.\n   * Uses PackageLogger, respects verbose flag.\n   */\n  private static log(message: string, verbose?: boolean, data?: Record<string, unknown>): void {\n    if (!verbose) return;\n    if (data) {\n      Core.logger.info(message, data);\n    } else {\n      Core.logger.info(message);\n    }\n  }\n\n  /**\n   * Log a debug message during initialization.\n   */\n  private static logDebug(\n    message: string,\n    verbose?: boolean,\n    data?: Record<string, unknown>\n  ): void {\n    if (!verbose) return;\n    if (data) {\n      Core.logger.debug(message, data);\n    } else {\n      Core.logger.debug(message);\n    }\n  }\n\n  /**\n   * Observability configuration\n   */\n  private static _observabilityConfig: CoreObservabilityConfig = {};\n\n  /**\n   * Global error handler instance\n   */\n  private static _errorHandler: GlobalErrorHandler | null = null;\n\n  /**\n   * Error handler configuration\n   */\n  private static _errorConfig: CoreErrorHandlerInitConfig = {};\n\n  /**\n   * HTTP error handler/middleware based on runtime.\n   * Auto-created during initialization.\n   */\n  private static _httpErrorHandler: unknown = null;\n\n  /**\n   * Event listener cleanup functions\n   */\n  private static _eventCleanupFns: (() => void)[] = [];\n\n  /**\n   * Feature flag configuration\n   */\n  private static _flagConfig: CoreFeatureFlagInitConfig = {};\n\n  /** Full init options (from global state for configureNestApp and other runtime config) */\n  private static get _initOptions(): CoreInitOptions {\n    return state().initOptions;\n  }\n  private static set _initOptions(value: CoreInitOptions) {\n    state().initOptions = value;\n  }\n\n  /**\n   * Root store instance (contains errors, feature flags, and all other slices)\n   * Initialized during Core.initialize() - frontend uses React hook store, backend uses vanilla store\n   * All store access should go through Core.rootStore - no separate stores needed\n   */\n  private static _rootStore: StoreApi<RootStoreSlice> | null = null;\n\n  /**\n   * Injected store hook for frontend (set via setRootStoreHook before initialize).\n   * This is used instead of directly importing from @plyaz/store to prevent\n   * duplicate store instances when bundlers create multiple module copies.\n   */\n  private static _injectedStoreHook: RootStoreHook | null = null;\n\n  /**\n   * Set the root store hook for frontend use.\n   * Must be called before Core.initialize() when running in browser.\n   * PlyazProvider calls this automatically with the store prop.\n   *\n   * @param store - The useRootStore hook from @plyaz/store\n   */\n  public static setRootStoreHook(store: RootStoreHook): void {\n    Core._injectedStoreHook = store;\n  }\n\n  /**\n   * Setup environment and context\n   */\n  private static async setupEnvironment(options: CoreInitOptions): Promise<CoreAppEnvironment> {\n    const { envPath, environment, appContext, env, verbose } = options;\n\n    Core._coreServices.appContext = appContext ?? 'webapp';\n    Core.log(`App context: ${Core._coreServices.appContext}`, verbose);\n\n    const globalEnvironment: CoreAppEnvironment =\n      environment ?? (process.env.NODE_ENV as CoreAppEnvironment) ?? 'development';\n    Core.log(`Global environment: ${globalEnvironment}`, verbose);\n\n    Core._coreServices.runtime = detectRuntime();\n    Core.log(`Detected runtime: ${Core._coreServices.runtime}`, verbose);\n\n    if (envPath) await loadEnvFile(envPath, verbose);\n    Core._coreServices.env = { ...process.env, ...env };\n\n    return globalEnvironment;\n  }\n\n  /**\n   * Initialize a service with error handling\n   */\n  private static async initService<T>(\n    name: string,\n    init: () => Promise<T>,\n    verbose?: boolean\n  ): Promise<T | undefined> {\n    try {\n      Core.log(`Initializing ${name}...`, verbose);\n      const result = await init();\n      Core.log(`${name} initialized`, verbose);\n      return result;\n    } catch (error) {\n      Core.logger.error(`Failed to initialize ${name}`, {\n        error: (error as Error).message,\n      });\n      return undefined;\n    }\n  }\n\n  /** Initialize error handler if enabled */\n  private static async initErrorHandlerIfEnabled(options: CoreInitOptions): Promise<void> {\n    const { errorHandler: config, verbose } = options;\n    if (config?.enabled === false) {\n      Core.log('Global error handler disabled by configuration', verbose);\n      return;\n    }\n    await Core.initService(\n      'error handler',\n      async () => {\n        await Core.initializeErrorHandler(config, verbose);\n        Core.subscribeToErrorEvents(verbose);\n      },\n      verbose\n    );\n  }\n\n  /** Initialize API client if not skipped */\n  private static async initApiIfEnabled(\n    options: CoreInitOptions,\n    env: CoreAppEnvironment\n  ): Promise<void> {\n    const { api: apiConfig, skipApi, verbose } = options;\n    if (skipApi) return;\n\n    await Core.initService(\n      'API client',\n      async () => {\n        await Core.initializeApi(apiConfig, env, verbose);\n        Core._coreServices.api = ApiClientService;\n        Core.log('API client service initialized', verbose);\n      },\n      verbose\n    );\n    Core._coreServices.api = ApiClientService;\n  }\n\n  /** Initialize cache service if not skipped (backend-only due to ioredis dependency) */\n  private static async initCacheIfEnabled(options: CoreInitOptions): Promise<void> {\n    const { cache: cacheConfig, skipCache, verbose } = options;\n    if (skipCache) {\n      Core.log('Cache service skipped (skipCache: true)', verbose);\n      return;\n    }\n\n    // Skip cache initialization if no config provided\n    if (!cacheConfig) {\n      Core.log('Cache service skipped (no config provided)', verbose);\n      return;\n    }\n\n    // Skip on frontend runtimes (CacheService pulls in ioredis which requires Node.js)\n    if (Core.isFrontend) {\n      Core.log('Cache service skipped (frontend runtime detected)', verbose);\n      return;\n    }\n\n    await Core.initService(\n      'cache',\n      async () => {\n        await Core.initializeCache(cacheConfig as CoreCacheConfig, verbose);\n        const CacheService = getCoreDependency('CacheService');\n        if (CacheService) {\n          Core._coreServices.cache = CacheService.getInstance();\n          Core.log('Cache service initialized', verbose);\n        }\n      },\n      verbose\n    );\n  }\n\n  /** Initialize observability if not skipped */\n  private static async initObservabilityIfEnabled(\n    options: CoreInitOptions,\n    globalEnvironment: CoreAppEnvironment\n  ): Promise<void> {\n    const { observability: observabilityConfig, skipObservability, verbose } = options;\n    if (skipObservability) {\n      Core.log('Observability service skipped (skipObservability: true)', verbose);\n      return;\n    }\n\n    // Always use ObservabilityService - it adds LoggerAdapter by default\n    const config = observabilityConfig ?? { enabled: true };\n\n    await Core.initService(\n      'observability',\n      async () => {\n        await Core.initializeObservability(config, verbose, globalEnvironment);\n        Core.log('Observability service initialized', verbose);\n      },\n      verbose\n    );\n  }\n\n  /** Initialize storage service if not skipped (backend-only) */\n  private static async initStorageIfEnabled(options: CoreInitOptions): Promise<void> {\n    const { storage: storageConfig, skipStorage, verbose } = options;\n\n    // Skip if explicitly disabled\n    if (skipStorage) {\n      Core.log('Storage service skipped (skipStorage: true)', verbose);\n      return;\n    }\n\n    // Skip if no config provided\n    if (!storageConfig) {\n      Core.log('Storage service skipped (no config provided)', verbose);\n      return;\n    }\n\n    // Skip on frontend runtimes (storage is backend-only)\n    if (Core.isFrontend) {\n      Core.log('Storage service skipped (frontend runtime detected)', verbose);\n      return;\n    }\n\n    await Core.initService(\n      'storage',\n      async () => {\n        const StorageService = getCoreDependency('StorageService');\n        if (!StorageService) {\n          Core.log('Storage service skipped (dependency not registered)', verbose);\n          return;\n        }\n        await StorageService.initialize(storageConfig);\n        Core._coreServices.storage = StorageService.getInstance();\n        Core.log('Storage service initialized', verbose);\n      },\n      verbose\n    );\n  }\n\n  /** Initialize notifications service if not skipped (backend-only) */\n  private static async initNotificationsIfEnabled(options: CoreInitOptions): Promise<void> {\n    const { notifications: notificationsConfig, skipNotifications, verbose } = options;\n\n    // Skip if explicitly disabled\n    if (skipNotifications) {\n      Core.log('Notifications service skipped (skipNotifications: true)', verbose);\n      return;\n    }\n\n    // Skip if no config provided\n    if (!notificationsConfig) {\n      Core.log('Notifications service skipped (no config provided)', verbose);\n      return;\n    }\n\n    // Skip on frontend runtimes (notifications is backend-only)\n    if (Core.isFrontend) {\n      Core.log('Notifications service skipped (frontend runtime detected)', verbose);\n      return;\n    }\n\n    await Core.initService(\n      'notifications',\n      async () => {\n        const NotificationService = getCoreDependency('NotificationService');\n        if (!NotificationService) {\n          Core.log('Notifications service skipped (dependency not registered)', verbose);\n          return;\n        }\n        await NotificationService.initialize(notificationsConfig);\n        Core._coreServices.notifications = NotificationService.getInstance();\n        Core.log('Notifications service initialized', verbose);\n      },\n      verbose\n    );\n  }\n\n  /**\n   * StreamServer instance (created during streaming initialization)\n   */\n  private static _streamServer: InstanceType<typeof StreamServer> | null = null;\n\n  /**\n   * Get the stream server instance (if initialized)\n   */\n  static get streamServer(): InstanceType<typeof StreamServer> | null {\n    return Core._streamServer;\n  }\n\n  /**\n   * Initialize streaming service (SSE/WebSocket real-time events)\n   *\n   * Sets up StreamServer and StreamRegistry with domain endpoints.\n   * Streaming is backend-only for server-sent events.\n   *\n   * @param options - Core init options with streaming config\n   */\n  private static async initStreamingIfConfigured(options: CoreInitOptions): Promise<void> {\n    const { streaming: streamConfig, skipStreaming, verbose } = options;\n\n    // Skip if explicitly disabled\n    if (skipStreaming) {\n      Core.log('Streaming service skipped (skipStreaming: true)', verbose);\n      return;\n    }\n\n    // Skip if no config or disabled\n    if (!streamConfig || streamConfig.enabled === false) {\n      Core.log('Streaming service skipped (not configured or disabled)', verbose);\n      return;\n    }\n\n    // Skip on frontend (streaming is server-side only)\n    if (Core.isFrontend) {\n      Core.log('Streaming service skipped (frontend runtime)', verbose);\n      return;\n    }\n\n    await Core.initService(\n      'streaming',\n      // eslint-disable-next-line complexity\n      async () => {\n        // Create stream server with config\n        const serverConfig = streamConfig.server ?? {};\n        Core._streamServer = StreamServer.create()\n          .withSSE({\n            heartbeatInterval:\n              serverConfig.heartbeatInterval ?? STREAMING_DEFAULTS.HEARTBEAT_INTERVAL_MS,\n            maxConnections: serverConfig.maxConnections ?? STREAMING_DEFAULTS.MAX_CONNECTIONS,\n          })\n          .withDefaultChannels(\n            (serverConfig.defaultChannels ?? STREAMING_DEFAULTS.DEFAULT_CHANNELS) as never\n          )\n          .build();\n\n        // Initialize server\n        Core._streamServer.initialize();\n\n        // Get endpoints from config or use injected defaults\n        let endpoints = streamConfig.endpoints;\n        if (!endpoints && _getCoreStreamEndpoints) {\n          endpoints = await _getCoreStreamEndpoints();\n        }\n\n        // Skip if no endpoints available\n        if (!endpoints || endpoints.length === 0) {\n          Core.log('Streaming: No endpoints configured, skipping StreamRegistry', verbose);\n          return;\n        }\n\n        // Debug: Log endpoints being registered\n        Core.log('Streaming endpoints to register', verbose, {\n          count: endpoints.length,\n          endpoints: endpoints.map(e => ({\n            key: e.endpoint?.endpointKey,\n            enabled: e.config?.enabled,\n            name: e.config?.name,\n            channels: e.config?.channels,\n          })),\n        });\n\n        // Initialize StreamRegistry with endpoints\n        await StreamRegistry.initialize({\n          broadcaster: Core._streamServer.getBroadcaster(),\n          endpoints,\n        });\n\n        Core.log('Streaming service initialized', verbose, {\n          endpoints: StreamRegistry.getRegisteredKeys(),\n          channels: serverConfig.defaultChannels ?? ['uploads', 'system'],\n        });\n      },\n      verbose\n    );\n  }\n\n  /**\n   * Initialize domain services\n   *\n   * Loads core domain services using the injected loader (if available),\n   * then merges with any user-provided services.\n   * User-provided service configs override core defaults.\n   *\n   * Note: Frontend entries don't inject a loader, so they only use user-provided services.\n   */\n  private static async initDomainServicesIfConfigured(\n    options: CoreInitOptions,\n    globalEnvironment: CoreAppEnvironment\n  ): Promise<void> {\n    const { api: apiConfig, services: userServices, verbose } = options;\n    const runtime = Core._coreServices.runtime;\n\n    // Load core services using injected loader (backend sets this, frontend doesn't)\n    const coreDomainServices = _getCoreDomainServices\n      ? await _getCoreDomainServices(Core.isFrontend)\n      : [];\n\n    // Merge core services with user-provided services\n    // User services can override core service configs by using the same service class\n    const coreServiceKeys = new Set(coreDomainServices.map(s => s.service.serviceKey));\n    const userOverrides = (userServices ?? []).filter(s =>\n      coreServiceKeys.has(s.service.serviceKey)\n    );\n    const additionalUserServices = (userServices ?? []).filter(\n      s => !coreServiceKeys.has(s.service.serviceKey)\n    );\n\n    // Build merged services: core (with overrides applied) + additional user services\n    const mergedServices: CoreServiceEntry[] = coreDomainServices\n      .map(coreService => {\n        const override = userOverrides.find(\n          u => u.service.serviceKey === coreService.service.serviceKey\n        );\n        return override\n          ? { ...coreService, config: { ...coreService.config, ...override.config } }\n          : coreService;\n      })\n      .concat(additionalUserServices);\n\n    // Skip if somehow no services\n    if (mergedServices.length === 0) return;\n\n    await Core.initService(\n      'domain services',\n      async () => {\n        Core.log('Initializing domain services via ServiceRegistry...', verbose);\n        Core.logDebug('Core services', verbose, {\n          services: coreDomainServices.map(s => s.service.serviceKey),\n        });\n        if (userServices?.length) {\n          Core.logDebug('User services', verbose, {\n            services: userServices.map(s => s.service.serviceKey),\n          });\n        }\n        await ServiceRegistry.initialize({\n          environment: globalEnvironment,\n          runtime,\n          apiClient: apiConfig ? { baseURL: apiConfig.baseURL, ...apiConfig } : undefined,\n          db: options.db,\n          cache: options.cache,\n          storage: options.storage,\n          notifications: options.notifications,\n          observability: options.observability,\n          services: mergedServices,\n          stores: {\n            // Returns specific slice from namespaced root store (type-safe)\n            getStore: <K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined =>\n              Core.getDomainStore(key),\n          },\n        });\n        Core.log('Domain services initialized', verbose, {\n          keys: ServiceRegistry.getInitializedKeys(),\n        });\n      },\n      verbose\n    );\n  }\n\n  /**\n   * Initialize all core services\n   */\n\n  static async initialize(options: CoreInitOptions = {}): Promise<CoreServicesResult> {\n    // Store options for runtime access (e.g., configureNestApp)\n    Core._initOptions = options;\n\n    // Configure logger transport first (before any logs)\n    Core.configureLogger(options.logger?.transport);\n\n    // Already initialized - return immediately\n    if (Core.initialized) {\n      Core.log('Already initialized, returning existing services', options.verbose);\n      return Core._coreServices;\n    }\n\n    // Initialization in progress - return existing promise to avoid race conditions\n    if (Core._initPromise) {\n      Core.log('Initialization in progress, waiting...', options.verbose);\n      return Core._initPromise;\n    }\n\n    // Start initialization and store the promise\n    Core._initPromise = Core.performInitialization(options);\n    return Core._initPromise;\n  }\n\n  /**\n   * Internal initialization logic - called only once\n   */\n  private static async performInitialization(\n    options: CoreInitOptions\n  ): Promise<CoreServicesResult> {\n    const { db: dbConfig, featureFlags: featureFlagsConfig, skipDb, verbose } = options;\n    const globalEnvironment = await Core.setupEnvironment(options);\n\n    await Core.initErrorHandlerIfEnabled(options);\n\n    if (!Core.shouldSkipDbService(skipDb, verbose)) {\n      const db = await Core.initService(\n        'database',\n        () => Core.initializeDb(dbConfig, verbose),\n        verbose\n      );\n      Core._coreServices.db = db ?? null;\n    }\n\n    await Core.initApiIfEnabled(options, globalEnvironment);\n\n    await Core.initCacheIfEnabled(options);\n\n    await Core.initObservabilityIfEnabled(options, globalEnvironment);\n\n    await Core.initStorageIfEnabled(options);\n\n    await Core.initNotificationsIfEnabled(options);\n\n    await Core.initStreamingIfConfigured(options);\n\n    if (featureFlagsConfig?.enabled !== false) {\n      await Core.initService(\n        'feature flags',\n        () => Core.initializeFeatureFlags(featureFlagsConfig, verbose),\n        verbose\n      );\n    }\n\n    await Core.initDomainServicesIfConfigured(options, globalEnvironment);\n\n    Core.initialized = true;\n    Core.log('Initialization complete', verbose);\n    return Core._coreServices;\n  }\n\n  /**\n   * Get initialized domain service keys\n   * Use Core.getService(key) or ServiceRegistry.get(key) to access individual services.\n   *\n   * @example\n   * ```typescript\n   * const keys = Core.serviceKeys;\n   * const exampleService = Core.getService('example');\n   * ```\n   */\n  static get serviceKeys(): string[] {\n    return ServiceRegistry.getInitializedKeys();\n  }\n\n  /**\n   * All stores - unified access to ALL slices from single root store\n   * All stores (global + domain) are slices of ONE Zustand store instance.\n   *\n   * **Auto-generated from STORE_KEYS** - No manual registration needed!\n   *\n   * **Benefits:**\n   * - ✅ Access without hooks (store.getState())\n   * - ✅ Cross-slice subscriptions work automatically\n   * - ✅ Single source of truth\n   * - ✅ Automatically scales with new stores\n   *\n   * @example\n   * const errorStore = Core.stores.error;        // Global slice\n   * const flagsStore = Core.stores.featureFlags; // Global slice\n   * const exampleStore = Core.stores.example;    // Domain slice\n   */\n  static get stores(): Record<StoreKey, RootStoreSlice | undefined> {\n    const rootState = Core._rootStore?.getState();\n\n    // Dynamically generate store accessors from STORE_KEYS\n    return Object.values(STORE_KEYS).reduce(\n      (acc, key) => {\n        Object.defineProperty(acc, key, {\n          get: () => rootState,\n          enumerable: true,\n        });\n        return acc;\n      },\n      {} as Record<StoreKey, RootStoreSlice | undefined>\n    );\n  }\n\n  /**\n   * Get a specific store slice by key (for ServiceRegistry injection).\n   * Returns the actual slice from the namespaced root store.\n   *\n   * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n   * @returns Specific store slice or undefined\n   *\n   * @example\n   * ```typescript\n   * const exampleSlice = Core.getDomainStore('example');  // ✅ Returns ExampleFrontendStoreSlice\n   * const errorSlice = Core.getDomainStore('errors');     // ✅ Returns ErrorStoreSlice\n   * const invalid = Core.getDomainStore('invalid');       // ❌ TypeScript error!\n   * ```\n   */\n  static getDomainStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n  static getDomainStore<T = RootStoreSlice>(): T | undefined;\n  static getDomainStore<K extends keyof RootStoreSlice>(\n    key?: K\n  ): RootStoreSlice[K] | RootStoreSlice | undefined {\n    const rootState = Core._rootStore?.getState();\n    if (!rootState) return undefined;\n\n    // If no key provided, return entire root store\n    if (!key) return rootState;\n\n    // Return specific slice from namespaced store (type-safe)\n    return rootState[key];\n  }\n\n  /**\n   * Event manager for subscribing to domain events\n   * @example Core.events.on('example:created', handler)\n   */\n  static get events(): typeof CoreEventManager {\n    return CoreEventManager;\n  }\n\n  /**\n   * Get database service instance\n   * @throws Error if not initialized\n   */\n  static get db(): CoreDbServiceInstance {\n    if (!Core._coreServices.db) {\n      throw new CorePackageError(\n        'Database service not initialized. Call Core.initialize() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._coreServices.db;\n  }\n\n  /**\n   * Get API client service\n   */\n  static get api(): typeof ApiClientService {\n    if (!Core._coreServices.api) {\n      throw new CorePackageError(\n        'API client service not initialized. Call Core.initialize() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._coreServices.api;\n  }\n\n  /**\n   * Get cache service instance (backend-only)\n   * @throws Error if not initialized\n   */\n  static get cache(): CoreCacheServiceInstance {\n    if (!Core._coreServices.cache) {\n      throw new CorePackageError(\n        'Cache service not initialized. Call Core.initialize() with cache config first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._coreServices.cache;\n  }\n\n  /**\n   * Get observability adapter instance\n   * @throws Error if not initialized\n   *\n   * @example\n   * ```typescript\n   * // Record a metric\n   * await Core.observability.recordMetric({\n   *   type: 'counter',\n   *   name: 'api.requests',\n   *   value: 1,\n   *   tags: { endpoint: '/users' },\n   * });\n   *\n   * // Start a span\n   * const span = Core.observability.startSpan({ name: 'processOrder' });\n   * try {\n   *   // ... do work\n   *   span.setStatus('ok');\n   * } catch (e) {\n   *   span.recordException(e);\n   *   span.setStatus('error');\n   * } finally {\n   *   span.end();\n   * }\n   * ```\n   */\n  static get observability(): ObservabilityAdapter {\n    if (!Core._coreServices.observability) {\n      throw new CorePackageError(\n        'Observability service not initialized. Call Core.initialize() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._coreServices.observability;\n  }\n\n  /**\n   * Check if observability is initialized\n   */\n  static get isObservabilityInitialized(): boolean {\n    return Core._coreServices.observability !== null;\n  }\n\n  /**\n   * Get observability configuration\n   */\n  static get observabilityConfig(): CoreObservabilityConfig {\n    return Core._observabilityConfig;\n  }\n\n  /**\n   * Get storage service instance (backend-only)\n   * @throws Error if not initialized\n   *\n   * @example\n   * ```typescript\n   * const storage = Core.storage.getStorage();\n   * await storage.uploadFile({ file, filename: 'doc.pdf' });\n   * ```\n   */\n  static get storage(): CoreStorageServiceInstance {\n    if (!Core._coreServices.storage) {\n      throw new CorePackageError(\n        'Storage service not initialized. Call Core.initialize() with storage config first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._coreServices.storage;\n  }\n\n  /**\n   * Check if storage is initialized\n   */\n  static get isStorageInitialized(): boolean {\n    return Core._coreServices.storage !== null;\n  }\n\n  /**\n   * Get notifications service instance (backend-only)\n   * @throws Error if not initialized\n   *\n   * @example\n   * ```typescript\n   * const notifications = Core.notifications.getNotifications();\n   * await notifications.sendEmail({ to: 'user@example.com', templateId: 'welcome' });\n   * ```\n   */\n  static get notifications(): CoreNotificationServiceInstance {\n    if (!Core._coreServices.notifications) {\n      throw new CorePackageError(\n        'Notifications service not initialized. Call Core.initialize() with notifications config first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._coreServices.notifications;\n  }\n\n  /**\n   * Check if notifications is initialized\n   */\n  static get isNotificationsInitialized(): boolean {\n    return Core._coreServices.notifications !== null;\n  }\n\n  /**\n   * Get root store (contains all slices: errors, feature flags, etc.)\n   * Use this to access the full store state and all slice actions globally.\n   *\n   * @example\n   * ```typescript\n   * // Access error actions\n   * const state = Core.rootStore.getState();\n   * state.addError({ ... });\n   *\n   * // Access flags\n   * console.log(state.flags);\n   *\n   * // Subscribe to store changes\n   * Core.rootStore.subscribe((state) => {\n   *   console.log('Errors:', state.errors);\n   *   console.log('Flags:', state.flags);\n   * });\n   * ```\n   */\n  static get rootStore(): StoreApi<RootStoreSlice> {\n    if (!Core._rootStore) {\n      throw new CorePackageError(\n        'Root store not initialized. Call Core.initialize() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._rootStore;\n  }\n\n  /**\n   * Get global error store actions.\n   * Provides access to the error store for querying and managing errors.\n   *\n   * @example\n   * ```typescript\n   * // Get all errors\n   * const allErrors = useErrorStore.getState().errors;\n   *\n   * // Clear all errors\n   * Core.errors.clearErrors();\n   *\n   * // Dismiss an error\n   * Core.errors.dismissError(errorId);\n   * ```\n   */\n  static get errors(): ErrorStoreActions {\n    if (!Core._errorHandler) {\n      throw new CorePackageError(\n        'Error handler not initialized. Call Core.initialize() first or set errorHandler.enabled: true.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._errorHandler.getStore();\n  }\n\n  /**\n   * Get feature flags store\n   * Provides synchronous access to feature flag values from the store.\n   *\n   * @example\n   * ```typescript\n   * // Check if a flag is enabled\n   * const isEnabled = Core.flags.isEnabled('NEW_FEATURE');\n   *\n   * // Get a flag value\n   * const provider = Core.flags.getValue<string>('PAYMENT_PROVIDER');\n   *\n   * // Refresh flags from source\n   * await Core.flags.refresh();\n   * ```\n   */\n  static get flags(): FeatureFlagStoreSlice {\n    if (!Core._rootStore) {\n      throw new CorePackageError(\n        'Root store not initialized. Call Core.initialize() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    // Return the feature flag slice from root store\n    // Root store state includes all flag methods (isEnabled, getValue, refresh, etc.)\n    return Core._rootStore.getState() as unknown as FeatureFlagStoreSlice;\n  }\n\n  /**\n   * Check if error handler is initialized\n   */\n  static get isErrorHandlerInitialized(): boolean {\n    return Core._errorHandler !== null;\n  }\n\n  /**\n   * Get the HTTP error handler/middleware based on runtime.\n   * Returns different types based on detected runtime:\n   *\n   * - **Express**: Error handler middleware function\n   *   ```typescript\n   *   app.use(Core.httpErrorHandler);\n   *   ```\n   *\n   * - **NestJS**: Exception filter class\n   *   ```typescript\n   *   app.useGlobalFilters(new (Core.httpErrorHandler)());\n   *   ```\n   *\n   * - **Next.js**: Object with App Router and Pages Router handlers\n   *   ```typescript\n   *   // App Router\n   *   export const GET = Core.httpErrorHandler.withErrorHandler(handler);\n   *   // Pages Router\n   *   export default Core.httpErrorHandler.createNextApiErrorHandler()(handler);\n   *   ```\n   *\n   * - **Node.js/Bun/Deno**: Object with handleError and createMiddleware\n   *   ```typescript\n   *   Core.httpErrorHandler.handleError(error, req, res);\n   *   ```\n   *\n   * - **Browser**: null (no HTTP handler needed)\n   *\n   * @returns The HTTP error handler for the current runtime\n   */\n  static get httpErrorHandler(): unknown {\n    return Core._httpErrorHandler;\n  }\n\n  /**\n   * Check if feature flags are initialized\n   */\n  static get isFlagsInitialized(): boolean {\n    return Core._rootStore?.getState()?.featureFlags?.isInitialized ?? false;\n  }\n\n  /**\n   * Get error handler configuration\n   */\n  static get errorConfig(): CoreErrorHandlerInitConfig {\n    return Core._errorConfig;\n  }\n\n  /**\n   * Get feature flag configuration\n   */\n  static get flagConfig(): CoreFeatureFlagInitConfig {\n    return Core._flagConfig;\n  }\n\n  /**\n   * Get loaded environment variables\n   */\n  static get env(): CoreEnvVars {\n    return Core._coreServices.env;\n  }\n\n  /**\n   * Get detected runtime environment\n   */\n  static get runtime(): CoreRuntimeEnvironment {\n    return Core._coreServices.runtime;\n  }\n\n  /**\n   * Get current app context\n   */\n  static get appContext(): CoreAppContext {\n    return Core._coreServices.appContext;\n  }\n\n  /**\n   * Check if Core is initialized\n   */\n  static get isInitialized(): boolean {\n    return Core.initialized;\n  }\n\n  /**\n   * Check if running on a backend runtime\n   */\n  static get isBackend(): boolean {\n    return BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n  }\n\n  /**\n   * Check if running on a frontend runtime\n   */\n  static get isFrontend(): boolean {\n    return FRONTEND_RUNTIMES.includes(Core._coreServices.runtime);\n  }\n\n  /**\n   * Get runtime context (backend, frontend, or universal)\n   * Universal means the runtime can be either (SSR frameworks like Next.js, Nuxt, Edge)\n   */\n  static getRuntimeContext(): CoreRuntimeContext {\n    if (BACKEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n      return 'backend';\n    }\n    if (FRONTEND_RUNTIMES.includes(Core._coreServices.runtime)) {\n      return 'frontend';\n    }\n    return 'universal';\n  }\n\n  /**\n   * Assert that the current runtime matches the expected runtime(s)\n   * Throws an error if the runtime doesn't match\n   *\n   * @param expected - Expected runtime(s) to check against\n   * @param serviceName - Name of the service for error message\n   * @throws CorePackageError if runtime doesn't match\n   *\n   * @example\n   * ```typescript\n   * // Assert backend-only\n   * Core.assertRuntime('backend', 'DatabaseService');\n   *\n   * // Assert multiple runtimes\n   * Core.assertRuntime(['backend', 'universal'], 'CacheService');\n   * ```\n   */\n  static assertRuntime(\n    expected: CoreServiceRuntime | readonly CoreServiceRuntime[],\n    serviceName: string\n  ): void {\n    const runtimes = Array.isArray(expected) ? expected : [expected];\n    const currentContext = Core.getRuntimeContext();\n\n    // Check if current context matches any of the expected runtimes\n    const isAllowed = runtimes.some(runtime => {\n      if (runtime === 'universal') return true;\n      if (runtime === currentContext) return true;\n      // Universal context (SSR) can run both frontend and backend code\n      if (currentContext === 'universal') return true;\n      return false;\n    });\n\n    if (!isAllowed) {\n      throw new CorePackageError(\n        `${serviceName} cannot run in ${currentContext} runtime. ` +\n          `Allowed runtimes: ${runtimes.join(', ')}. ` +\n          `Current runtime: ${Core._coreServices.runtime}`,\n        ERROR_CODES.FEATURE_NOT_SUPPORTED\n      );\n    }\n  }\n\n  /**\n   * Check if a service runtime is compatible with current runtime\n   * Returns true/false instead of throwing\n   *\n   * @param expected - Expected runtime(s) to check against\n   */\n  static isRuntimeCompatible(\n    expected: CoreServiceRuntime | readonly CoreServiceRuntime[]\n  ): boolean {\n    const runtimes = Array.isArray(expected) ? expected : [expected];\n    const currentContext = Core.getRuntimeContext();\n\n    return runtimes.some(runtime => {\n      if (runtime === 'universal') return true;\n      if (runtime === currentContext) return true;\n      if (currentContext === 'universal') return true;\n      return false;\n    });\n  }\n\n  /**\n   * Get initialization options (for internal use by framework adapters)\n   * @internal\n   */\n  static get initOptions(): CoreInitOptions {\n    return Core._initOptions;\n  }\n\n  /**\n   * Get a registered domain service by key.\n   * Convenience method that wraps ServiceRegistry.get().\n   *\n   * @param key - Service key (e.g., 'featureFlags', 'example')\n   * @returns The service instance\n   *\n   * @example\n   * ```typescript\n   * const flags = Core.getService<FeatureFlagDomainService>('featureFlags');\n   * const isEnabled = await flags.isEnabled('my-flag');\n   * ```\n   */\n  static getService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n    key: string\n  ): T {\n    return ServiceRegistry.get<T>(key);\n  }\n\n  /**\n   * Get a registered domain service by key with async initialization if needed.\n   * Convenience method that wraps ServiceRegistry.getAsync().\n   *\n   * @param key - Service key\n   * @returns Promise resolving to the service instance\n   */\n  static async getServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n    key: string\n  ): Promise<T> {\n    return ServiceRegistry.getAsync<T>(key);\n  }\n\n  /**\n   * Check if a domain service is registered.\n   */\n  static hasService(key: string): boolean {\n    return ServiceRegistry.has(key);\n  }\n\n  /**\n   * Reset Core (useful for testing)\n   */\n  // eslint-disable-next-line complexity\n  static async reset(): Promise<void> {\n    // Close database\n    if (Core._coreServices.db) {\n      await Core._coreServices.db.getDatabase()?.close?.();\n    }\n\n    // Dispose cache\n    if (Core._coreServices.cache) {\n      const CacheService = getCoreDependency('CacheService');\n      CacheService?.reset?.();\n    }\n\n    // Dispose observability\n    if (Core._coreServices.observability) {\n      await Core._coreServices.observability.shutdown();\n    }\n    Core._observabilityConfig = {};\n\n    // Dispose storage\n    if (Core._coreServices.storage) {\n      await Core._coreServices.storage.close();\n      const StorageService = getCoreDependency('StorageService');\n      await StorageService?.reset?.();\n    }\n\n    // Dispose notifications\n    if (Core._coreServices.notifications) {\n      await Core._coreServices.notifications.close();\n      const NotificationService = getCoreDependency('NotificationService');\n      await NotificationService?.reset?.();\n    }\n\n    // Dispose streaming\n    if (Core._streamServer) {\n      Core._streamServer.dispose();\n      Core._streamServer = null;\n    }\n    StreamRegistry.dispose();\n\n    // Dispose error handler\n    if (Core._errorHandler) {\n      Core._errorHandler.destroy();\n      Core._errorHandler = null;\n      clearEventEmitter(); // Clean up global error handler's CoreEventManager integration\n      BaseError.clearEventEmitter(); // Clean up BaseError auto-emit integration\n    }\n    Core._errorConfig = {};\n    Core._httpErrorHandler = null;\n\n    // Cleanup event listeners\n    for (const cleanup of Core._eventCleanupFns) {\n      cleanup();\n    }\n    Core._eventCleanupFns = [];\n\n    // Dispose feature flags slice and reset files store from root store\n    if (Core._rootStore) {\n      const state = Core._rootStore.getState();\n      if (state.featureFlags?.dispose) {\n        state.featureFlags.dispose();\n      }\n      // Reset files store slice\n      if (state.files?.reset) {\n        state.files.reset();\n      }\n      // Reset notifications store slice\n      if (state.notifications?.reset) {\n        state.notifications.reset();\n      }\n      Core._rootStore = null;\n    }\n    Core._flagConfig = {};\n\n    // Dispose all registered services via ServiceRegistry\n    ServiceRegistry.disposeAll();\n\n    // Dispose event manager\n    CoreEventManager.dispose();\n\n    Core._coreServices = {\n      db: null,\n      api: null,\n      cache: null,\n      observability: null,\n      storage: null,\n      notifications: null,\n      env: {},\n      runtime: 'unknown',\n      appContext: 'webapp',\n    };\n    Core.initialized = false;\n    Core._initPromise = null;\n  }\n\n  /**\n   * Determines whether to skip DbService initialization.\n   *\n   * DbService is backend-only and should never be initialized on frontend runtimes.\n   * This method:\n   * - Returns true (skip) if skipDb was explicitly set to true\n   * - Returns true (skip) if running on frontend, with a warning\n   * - Warns if someone explicitly tried to init DbService on frontend (skipDb: false)\n   *\n   * @param skipDb - User-provided skipDb option\n   * @param verbose - Enable verbose logging\n   * @returns true if DbService should be skipped\n   */\n  private static shouldSkipDbService(skipDb: boolean | undefined, verbose?: boolean): boolean {\n    // User explicitly requested to skip\n    if (skipDb === true) {\n      Core.log('Database service skipped (skipDb: true)', verbose);\n      return true;\n    }\n\n    // Check if running on frontend\n    const isFrontend = Core.isFrontend;\n\n    if (isFrontend) {\n      // User explicitly tried to init DbService on frontend (skipDb: false)\n      if (skipDb === false) {\n        Core.logger.warn(\n          'DbService cannot be initialized on frontend runtime. ' +\n            'DbService is backend-only and requires Node.js. ' +\n            'Use API calls from frontend instead. Skipping database initialization.'\n        );\n      } else if (verbose) {\n        // skipDb was undefined (default) - just log that we're skipping\n        Core.log(\n          'Database service skipped (frontend runtime detected). ' +\n            'DbService is only available on backend.',\n          verbose\n        );\n      }\n      return true;\n    }\n\n    // Backend or universal runtime - don't skip\n    return false;\n  }\n\n  /**\n   * Initialize database service\n   * Config validation is handled by DbService\n   */\n  private static async initializeDb(\n    config?: Partial<CoreDbServiceConfig>,\n    verbose?: boolean\n  ): Promise<CoreDbServiceInstance> {\n    Core.log(`Initializing database with adapter: ${config?.adapter ?? 'drizzle'}`, verbose);\n\n    const DbService = getCoreDependency('DbService');\n    if (!DbService) {\n      throw new CorePackageError(\n        'DbService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return DbService.initialize({\n      adapter: 'drizzle',\n      ...config,\n    } as CoreDbServiceConfig);\n  }\n\n  /**\n   * Initialize API client service\n   * Config validation is handled by ApiClientService\n   */\n  private static async initializeApi(\n    config?: CoreApiInitOptions,\n    globalEnvironment?: CoreAppEnvironment,\n    verbose?: boolean\n  ): Promise<void> {\n    const { env: apiEnv, setAsDefault, ...apiClientOptions } = config ?? {};\n    const resolvedEnv = apiEnv ?? globalEnvironment ?? 'development';\n\n    Core.log(`Initializing API client for environment: ${resolvedEnv}`, verbose);\n\n    await ApiClientService.init(\n      {\n        env: resolvedEnv,\n        setAsDefault: setAsDefault ?? true,\n      },\n      apiClientOptions\n    );\n  }\n\n  /**\n   * Initialize cache service (backend-only)\n   * Config validation is handled by CacheService\n   */\n  private static async initializeCache(config: CoreCacheConfig, verbose?: boolean): Promise<void> {\n    Core.log(`Initializing cache with strategy: ${config.strategy}`, verbose);\n\n    const CacheService = getCoreDependency('CacheService');\n    if (!CacheService) {\n      throw new CorePackageError(\n        'CacheService not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    await CacheService.initialize(config);\n  }\n\n  /**\n   * Initialize observability service based on config.\n   * Always includes LoggerAdapter as failover for console output.\n   */\n  private static async initializeObservability(\n    config: CoreObservabilityConfig,\n    verbose?: boolean,\n    environment?: CoreAppEnvironment\n  ): Promise<void> {\n    Core.log(`Initializing observability with provider: ${config.provider ?? 'auto'}`, verbose);\n\n    // Use environment from config or passed parameter\n    const env = config.environment ?? environment ?? 'development';\n    Core._observabilityConfig = { ...config, environment: env };\n\n    // Collect adapters with priorities\n    const adapters: { adapter: ObservabilityAdapter; priority: number; failover?: boolean }[] = [];\n\n    // Always add LoggerAdapter as failover for console output\n    const loggerAdapter = new LoggerAdapter();\n    await loggerAdapter.initialize({\n      enabled: config.enabled !== false,\n      serviceName: config.serviceName,\n      environment: env,\n      defaultTags: config.defaultTags,\n    });\n    adapters.push({ adapter: loggerAdapter, priority: -100, failover: true });\n\n    // TODO: Add DatadogAdapter when configured (high priority, primary)\n    // if (config.provider === 'datadog' || config.datadog) {\n    //   const datadogAdapter = new DatadogAdapter();\n    //   await datadogAdapter.initialize({\n    //     ...config,\n    //     ...config.datadog,\n    //     environment: env,\n    //   });\n    //   adapters.push({ adapter: datadogAdapter, priority: 100, failover: false });\n    // }\n\n    // Create ObservabilityService with all adapters\n    const observability = new ObservabilityService();\n    await observability.initialize({\n      mode: config.mode ?? 'parallel',\n      adapters,\n      enabled: config.enabled,\n      serviceName: config.serviceName,\n      environment: env,\n      defaultTags: config.defaultTags,\n      samplingRate: config.samplingRate,\n      flushInterval: config.flushInterval,\n      adapterTimeout: config.flushInterval,\n    });\n\n    Core.log(\n      `ObservabilityService initialized with ${adapters.length} adapters (env: ${env})`,\n      verbose\n    );\n\n    Core._coreServices.observability = observability;\n    // Set on ServiceRegistry for injection\n    ServiceRegistry.setObservabilityInstance(observability);\n  }\n\n  /**\n   * Initialize global error handler\n   */\n  /** Create and initialize root store (includes error store + all other slices) */\n  private static async initializeRootStore(\n    config?: CoreErrorHandlerInitConfig,\n    verbose?: boolean\n  ): Promise<void> {\n    const isFrontend = typeof window !== 'undefined';\n\n    if (isFrontend) {\n      if (!Core._injectedStoreHook) {\n        throw new CorePackageError(\n          'Root store hook not set. Call Core.setRootStoreHook(useRootStore) before Core.initialize(), ' +\n            'or use PlyazProvider with the store prop: <PlyazProvider store={useRootStore} ...>',\n          ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n        );\n      }\n      Core.log('Using frontend root store (Zustand) - injected via setRootStoreHook', verbose);\n      // Frontend: use the injected store hook's vanilla store API\n      Core._rootStore = Core._injectedStoreHook as unknown as StoreApi<RootStoreSlice>;\n    } else {\n      Core.log('Creating backend composite store (in-memory)', verbose);\n      const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n      if (!ServerErrorMiddleware) {\n        throw new CorePackageError(\n          'ServerErrorMiddleware not available. Ensure setCoreDependencies() was called in entry-backend.ts',\n          ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n        );\n      }\n\n      // Backend: create in-memory error store + feature flag store (NOT Zustand)\n      const backendErrorStore = ServerErrorMiddleware.createErrorStore({\n        maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n        onErrorAdded: config?.onError as ((error: unknown) => void) | undefined,\n      });\n\n      // Create standalone feature flag store for backend\n      const backendFlagStore = createStandaloneFeatureFlagStore();\n\n      // Combine error + feature flag stores to match RootStoreSlice interface\n      // IMPORTANT: Must use namespaced keys (errors, featureFlags) to match frontend structure\n      const compositeStore = {\n        errors: backendErrorStore,\n        featureFlags: backendFlagStore,\n      };\n\n      // Wrap backend composite store to match root store interface (getState() pattern)\n      Core._rootStore = {\n        getState: () => compositeStore,\n        subscribe: () => () => {}, // No-op for backend\n        destroy: () => {\n          backendErrorStore.reset();\n          backendFlagStore.dispose?.();\n        },\n      } as unknown as StoreApi<RootStoreSlice>;\n    }\n  }\n\n  /**\n   * Serialize a PackageErrorLike to SerializedError format.\n   * Used by BaseError.setEventEmitter() to convert errors for the store.\n   */\n  private static serializePackageError(error: PackageErrorLike): SerializedError {\n    const serviceName = typeof error.context?.service === 'string' ? error.context.service : 'core';\n\n    return {\n      id: generateId(),\n      code: (error.errorCode as SerializedError['code']) ?? ERROR_CODES.UNKNOWN_ERROR,\n      message: error.message,\n      status: error.statusCode,\n      category: error.category ?? ERROR_CATEGORY.Server,\n      timestamp: error.timestamp ?? new Date().toISOString(),\n      isRetryable: error.retryable ?? false,\n      source: serviceName,\n      dismissed: false,\n      context: {\n        correlationId: error.correlationId,\n        ...error.context,\n      },\n    };\n  }\n\n  /** Get error store actions from root store */\n  private static getErrorStoreActions(): ErrorStoreActions {\n    if (!Core._rootStore) {\n      throw new CorePackageError(\n        'Root store not initialized. Call Core.initialize() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return Core._rootStore.getState().errors;\n  }\n\n  /** Build global error handler config */\n\n  private static buildErrorHandlerConfig(\n    config?: CoreErrorHandlerInitConfig\n  ): Parameters<typeof initializeGlobalErrorHandler>[1] {\n    // Compose filter: skip BaseError instances (they auto-emit via setEventEmitter)\n    // then apply user's custom filter if provided\n    const baseErrorFilter = (error: unknown): boolean => {\n      // Skip BaseError instances - they already emit SYSTEM.ERROR via BaseError.setEventEmitter()\n      // This prevents duplicate entries in the error store for uncaught BaseErrors\n      if (error instanceof BaseError) {\n        return false;\n      }\n      // Apply user's custom filter if provided\n      return config?.filter ? config.filter(error) : true;\n    };\n\n    return {\n      source: config?.source ?? 'global',\n      maxErrors: config?.maxErrors ?? DEFAULT_MAX_ERRORS,\n      filter: baseErrorFilter,\n      onError: config?.onError,\n      logToConsole: config?.logToConsole ?? false,\n    };\n  }\n\n  // eslint-disable-next-line complexity\n  private static async initializeErrorHandler(\n    config?: CoreErrorHandlerInitConfig,\n    verbose?: boolean\n  ): Promise<void> {\n    if (config?.enabled === false) {\n      Core.log('Error handler disabled by configuration', verbose);\n      return;\n    }\n\n    Core._errorConfig = config ?? {};\n    Core.log('Initializing global error handler...', verbose);\n\n    // Initialize error system (translations, catalogs)\n    // This is safe to call multiple times - it checks if already initialized\n    initializeErrorSystem({\n      defaultLocale: Core._errorConfig.localization?.defaultLocale,\n      fallbackLocale: Core._errorConfig.localization?.fallbackLocale,\n      additionalCatalogs: Core._errorConfig.localization?.additionalCatalogs,\n      replaceBuiltIn: Core._errorConfig.localization?.replaceBuiltIn,\n    });\n\n    // Initialize root store (contains error store + all slices)\n    await Core.initializeRootStore(Core._errorConfig, verbose);\n\n    // Wire up CoreEventManager for automatic error event emission\n    // This allows errors captured by the global handler to emit events\n    setEventEmitter(CoreEventManager.emit.bind(CoreEventManager));\n\n    // Wire up BaseError to auto-emit CORE_EVENTS.SYSTEM.ERROR when ANY error is created\n    // This covers ALL BaseError subclasses: CorePackageError, DatabasePackageError,\n    // ValidationError, ApiPackageError, StoragePackageError, NotificationPackageError, etc.\n    BaseError.setEventEmitter(error => {\n      const serializedError = Core.serializePackageError(error);\n      const serviceName = serializedError.source ?? 'core';\n\n      CoreEventManager.emit(CORE_EVENTS.SYSTEM.ERROR, {\n        errors: [serializedError],\n        context: serviceName,\n        recoverable: error.retryable ?? false,\n      } satisfies CoreSystemErrorPayload);\n    });\n\n    const errorStore = Core.getErrorStoreActions();\n    Core._errorHandler = initializeGlobalErrorHandler(\n      errorStore,\n      Core.buildErrorHandlerConfig(Core._errorConfig)\n    );\n\n    // Subscribe to SYSTEM.ERROR events and setup store subscriptions\n    Core.setupErrorEventSubscription(verbose);\n    Core.setupErrorStoreSubscription(verbose);\n\n    Core.log('Global error handler initialized with CoreEventManager integration', verbose);\n\n    // Auto-create HTTP error handler based on runtime (unless disabled)\n    if (Core._errorConfig.httpHandler !== false) {\n      await Core.createHttpErrorHandler(Core._errorConfig, verbose);\n    }\n  }\n\n  /**\n   * Log serialized errors with full details.\n   */\n  private static logErrors(errors: SerializedError[], prefix = 'ErrorStore'): void {\n    for (const err of errors) {\n      Core.logger.error(`[${prefix}] ${err.code}: ${err.message}`, {\n        id: err.id,\n        code: err.code,\n        message: err.message,\n        category: err.category,\n        source: err.source,\n        status: err.status,\n        isRetryable: err.isRetryable,\n        context: err.context,\n        timestamp: err.timestamp,\n      });\n    }\n  }\n\n  /**\n   * Setup SYSTEM.ERROR event subscription for error store updates.\n   * Backend: Also logs errors with full details.\n   * Frontend: Only updates store (logging handled by store subscription).\n   */\n  private static setupErrorEventSubscription(verbose?: boolean): void {\n    const isBackend = BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n\n    const errorEventCleanup = CoreEventManager.on(\n      CORE_EVENTS.SYSTEM.ERROR,\n      (event: CoreEvent<CoreSystemErrorPayload>) => {\n        if (!Core._rootStore) return;\n\n        try {\n          const { errors } = event.data;\n          if (!errors || errors.length === 0) return;\n\n          Core._rootStore.getState().errors.addErrors(errors);\n          if (isBackend) Core.logErrors(errors);\n          Core.log(`Added ${errors.length} error(s) to store`, verbose);\n        } catch (e) {\n          Core.logger.error('Failed to handle error event', { error: e });\n        }\n      }\n    );\n\n    Core._eventCleanupFns.push(errorEventCleanup);\n  }\n\n  /**\n   * Setup error store subscription for frontend logging.\n   * Logs new errors when they're added to the store.\n   * Only active for non-backend runtimes (browser, nextjs, nuxt, edge).\n   */\n  private static setupErrorStoreSubscription(verbose?: boolean): void {\n    const isFrontend = !BACKEND_RUNTIMES.includes(Core._coreServices.runtime);\n    if (!isFrontend || !Core._rootStore) return;\n\n    let prevErrorCount = 0;\n    const storeUnsubscribe = Core._rootStore.subscribe(state => {\n      const currentCount = state.errors.errorCount;\n      if (currentCount <= prevErrorCount) {\n        prevErrorCount = currentCount;\n        return;\n      }\n      const newErrors = state.errors.errors.slice(0, currentCount - prevErrorCount);\n      Core.logErrors(newErrors, 'ErrorStore:FE');\n      prevErrorCount = currentCount;\n    });\n\n    Core._eventCleanupFns.push(storeUnsubscribe);\n    Core.log('Error store subscription initialized for frontend', verbose);\n  }\n\n  /**\n   * Create HTTP error handler based on detected runtime.\n   * Stores the handler in Core._httpErrorHandler for access via Core.httpErrorHandler\n   */\n  // eslint-disable-next-line complexity\n  private static async createHttpErrorHandler(\n    config?: CoreErrorHandlerInitConfig,\n    verbose?: boolean\n  ): Promise<void> {\n    const runtime = Core._coreServices.runtime;\n    const isProduction = Core._coreServices.env.NODE_ENV === 'production';\n\n    // Skip for browser runtime (no HTTP error handler needed)\n    if (runtime === 'browser') {\n      Core._httpErrorHandler = null;\n      Core.log('Skipping HTTP handler for browser runtime', verbose);\n      return;\n    }\n\n    const ServerErrorMiddleware = getCoreDependency('ServerErrorMiddleware');\n    if (!ServerErrorMiddleware) {\n      Core.log('Skipping HTTP handler (ServerErrorMiddleware not registered)', verbose);\n      return;\n    }\n\n    // Build common config for all HTTP handlers\n    const httpConfig = {\n      source: runtime,\n      includeStack: config?.includeStack ?? !isProduction,\n      logErrors: config?.logger ?? config?.logToConsole ?? true,\n      errorHandler: Core._errorHandler ?? undefined,\n    };\n\n    switch (runtime) {\n      case 'express':\n        Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n        Core.log('Created Express error handler middleware', verbose);\n        break;\n\n      case 'nestjs':\n        Core._httpErrorHandler = ServerErrorMiddleware.createNestJsExceptionFilter(httpConfig);\n        Core.log('Created NestJS exception filter', verbose);\n        break;\n\n      case 'nextjs':\n        // For Next.js, provide both App Router and Pages Router handlers\n        Core._httpErrorHandler = {\n          /** For App Router: export const GET = withErrorHandler(handler) */\n          withErrorHandler: <T>(handler: T, overrideConfig = {}) =>\n            ServerErrorMiddleware.withErrorHandler(\n              handler as Parameters<typeof ServerErrorMiddleware.withErrorHandler>[0],\n              { ...httpConfig, ...overrideConfig }\n            ),\n          /** For Pages Router: export default createNextApiErrorHandler()(handler) */\n          createNextApiErrorHandler: (overrideConfig = {}) =>\n            ServerErrorMiddleware.createNextApiErrorHandler({ ...httpConfig, ...overrideConfig }),\n        };\n        Core.log('Created Next.js error handlers', verbose);\n        break;\n\n      case 'node':\n      case 'bun':\n      case 'deno':\n        // Generic Node.js handler\n        Core._httpErrorHandler = {\n          /** Handle error: handleNodeError(error, req, res) */\n          handleError: (error: unknown, req: unknown, res: unknown) =>\n            ServerErrorMiddleware.handleNodeError(\n              error,\n              req as Parameters<typeof ServerErrorMiddleware.handleNodeError>[1],\n              // eslint-disable-next-line no-magic-numbers -- Type parameter index for handleNodeError\n              res as Parameters<typeof ServerErrorMiddleware.handleNodeError>[2],\n              httpConfig\n            ),\n          /** Create middleware for use with native http */\n          createMiddleware: () => ServerErrorMiddleware.createHttpErrorHandler(httpConfig),\n        };\n        Core.log(`Created ${runtime} error handler`, verbose);\n        break;\n\n      default:\n        // For unknown runtimes, provide generic handler\n        Core._httpErrorHandler = ServerErrorMiddleware.createHttpErrorHandler(httpConfig);\n        Core.log(`Created generic HTTP error handler for ${runtime}`, verbose);\n    }\n  }\n\n  /**\n   * Subscribe to CoreEventManager error events\n   * Forwards entity, API, validation, database, and auth errors to the global error handler.\n   *\n   * NOTE: SYSTEM.ERROR is NOT subscribed here - it's handled in initializeErrorHandler()\n   * via the BaseError.setEventEmitter() + addErrors() pattern to avoid duplicate subscriptions.\n   *\n   * For non-BaseError errors, domain-specific events (ENTITY.ERROR, API.REQUEST_ERROR, etc.)\n   * are captured here. BaseError instances are skipped (they already auto-emit via SYSTEM.ERROR).\n   *\n   * Database errors (DATABASE.ERROR) are only subscribed on backend runtimes since\n   * DbService is backend-only (skipDb: true on frontend).\n   */\n  private static subscribeToErrorEvents(verbose?: boolean): void {\n    if (!Core._errorHandler) {\n      return;\n    }\n\n    Core.log('Subscribing to error events...', verbose);\n\n    // NOTE: SYSTEM.ERROR subscription is in initializeErrorHandler() to avoid duplicates.\n    // All BaseError instances auto-emit to SYSTEM.ERROR via BaseError.setEventEmitter(),\n    // and that handler adds errors directly via addErrors().\n\n    // Helper: subscribe to error event, skip BaseError (already auto-emits via SYSTEM.ERROR)\n    const subscribeError = (event: string, source: string): (() => void) => {\n      return CoreEventManager.on(event, (e: CoreEvent<{ error?: unknown }>) => {\n        if (Core._errorHandler && e.data?.error && !(e.data.error instanceof BaseError)) {\n          Core._errorHandler.captureError(e.data.error, source);\n        }\n      });\n    };\n\n    // Universal error subscriptions (frontend + backend)\n    Core._eventCleanupFns.push(\n      subscribeError(CORE_EVENTS.ENTITY.ERROR, 'entity'),\n      subscribeError(CORE_EVENTS.API.REQUEST_ERROR, 'api'),\n      subscribeError(CORE_EVENTS.VALIDATION.FAILED, 'validation'),\n      subscribeError(CORE_EVENTS.AUTH.UNAUTHORIZED, 'auth'),\n      subscribeError(CORE_EVENTS.AUTH.SESSION_EXPIRED, 'auth')\n    );\n\n    // Backend-only error subscriptions\n    if (Core.isRuntimeCompatible('backend')) {\n      Core._eventCleanupFns.push(\n        subscribeError(CORE_EVENTS.DATABASE.ERROR, 'database'),\n        subscribeError(CORE_EVENTS.STORAGE.ERROR, 'storage'),\n        subscribeError(CORE_EVENTS.NOTIFICATION.ERROR, 'notification'),\n        subscribeError(CORE_EVENTS.CACHE.ERROR, 'cache')\n      );\n      Core.log(\n        'Subscribed to backend error events (database, storage, notification, cache)',\n        verbose\n      );\n    }\n\n    const eventTypes = ['entity', 'api', 'validation', 'auth'];\n    if (Core.isRuntimeCompatible('backend'))\n      eventTypes.push('database', 'storage', 'notification', 'cache');\n    Core.log(`Subscribed to domain error events: ${eventTypes.join(', ')}`, verbose);\n  }\n\n  /** Handle fetch flags error and return empty flags */\n  private static handleFetchFlagsError(\n    error: unknown,\n    config?: CoreFeatureFlagInitConfig,\n    verbose?: boolean\n  ): Record<string, FeatureFlagValue> {\n    if (verbose) Core.logger.error('Failed to fetch feature flags', { error });\n\n    // If already a package error, use as-is; otherwise wrap it\n    const packageError =\n      error instanceof BaseError\n        ? (error as CorePackageError)\n        : new CorePackageError(\n            error instanceof Error ? error.message : String(error),\n            ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR,\n            { cause: error instanceof Error ? error : undefined }\n          );\n    config?.onError?.(packageError);\n    return {};\n  }\n\n  /** Create fetch flags function */\n  private static createFetchFlagsFn(\n    config?: CoreFeatureFlagInitConfig,\n    verbose?: boolean\n  ): () => Promise<Record<string, FeatureFlagValue>> {\n    // eslint-disable-next-line complexity\n    return async () => {\n      // Only fetch from API when provider is explicitly 'api'\n      // All other providers (memory, undefined) use local defaults\n      if (config?.provider !== 'api') {\n        Core.log(\n          `Feature flags using ${config?.provider ?? 'default'} provider (no API fetch)`,\n          verbose\n        );\n        return config?.defaults ?? {};\n      }\n\n      try {\n        const client = ApiClientService.getClient();\n        const endpoint = config?.apiEndpoint ?? '/feature-flags';\n        const response = await client.get<{ flags: Record<string, FeatureFlagValue> }>(endpoint);\n\n        if (!response.isSuccess) {\n          throw new CorePackageError(\n            response.error?.message ?? 'Failed to fetch feature flags',\n            ERROR_CODES.CORE_FEATURE_FLAG_PROVIDER_ERROR\n          );\n        }\n\n        return response.data?.flags ?? {};\n      } catch (error) {\n        return Core.handleFetchFlagsError(error, config, verbose);\n      }\n    };\n  }\n\n  /**\n   * Initialize feature flags slice within root store\n   */\n\n  // eslint-disable-next-line complexity\n  private static async initializeFeatureFlags(\n    config?: CoreFeatureFlagInitConfig,\n    verbose?: boolean\n  ): Promise<void> {\n    if (config?.enabled === false) {\n      Core.log('Feature flags disabled by configuration', verbose);\n      return;\n    }\n\n    if (!Core._rootStore) {\n      throw new CorePackageError(\n        'Root store not initialized. Call Core.initializeErrorHandler() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n\n    Core._flagConfig = config ?? {};\n    const isApiProvider = config?.provider === 'api';\n    Core.log(\n      `Initializing feature flags from root store (provider: ${config?.provider ?? 'default'})...`,\n      verbose\n    );\n\n    // Initialize the feature flag slice within the root store\n    const state = Core._rootStore.getState();\n    await state.featureFlags.initialize({\n      defaults: Core._flagConfig.defaults,\n      // Only enable polling for API provider\n      polling: isApiProvider ? Core._flagConfig.polling : undefined,\n      fetchFn: Core.createFetchFlagsFn(Core._flagConfig, verbose),\n      onFlagChange: Core._flagConfig.onFlagChange,\n      onError: Core._flagConfig.onError,\n    });\n\n    Core.log('Feature flags initialized', verbose);\n  }\n}\n\n// Export for convenience (excluding server-only services - use backend entry for those)\n// Note: CacheService and DEFAULT_ENCRYPTION_FIELDS are only exported from entry-backend.ts\nexport { ApiClientService };\n","/**\n * Base Domain Service\n *\n * Abstract base class for all domain services in @plyaz/core.\n * Follows the same pattern as BaseAdapter in @plyaz/notifications.\n *\n * Provides:\n * - API client initialization via constructor config\n * - Automatic mapper/validator instantiation\n * - Service enabled/disabled state management\n * - Default values handling\n * - Runtime context detection\n * - Lazy logger initialization\n *\n * Subclasses must implement:\n * - isAvailable() - Check if service is configured and ready\n * - dispose() - Cleanup resources\n *\n * @example\n * ```typescript\n * interface MyServiceConfig extends BaseDomainServiceConfig {\n *   apiBasePath?: string;\n * }\n *\n * class MyDomainService extends BaseDomainService<\n *   MyServiceConfig,\n *   MyMapper,\n *   MyValidator\n * > {\n *   constructor(config: MyServiceConfig) {\n *     super({\n *       serviceName: 'MyDomainService',\n *       supportedRuntimes: ['universal'],\n *       serviceConfig: config,\n *       apiClientConfig: {\n *         baseURL: config.apiBasePath || '/api', // Use || to treat empty strings as falsy\n *       },\n *       MapperClass: MyMapperClass,\n *       ValidatorClass: MyValidatorClass,\n *     });\n *   }\n *\n *   isAvailable(): boolean {\n *     return this.config.enabled !== false;\n *   }\n *\n *   dispose(): void {\n *     // Cleanup\n *   }\n *\n *   async create(data: unknown): Promise<MyEntity> {\n *     this.assertReady();\n *     const validated = this.validator.validateCreateOrThrow(data);\n *     const dto = this.mapper.toCreateDTO(validated);\n *     const response = await this.apiClient.post('/entities', dto);\n *     return this.mapper.toDomain(response.data);\n *   }\n * }\n *\n * // Usage\n * const service = new MyDomainService({ enabled: true, apiBasePath: '/api/v1' });\n * await service.ensureApiClientInitialized();\n * const entity = await service.create({ name: 'Test' });\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport { Core } from '../../init/CoreInitializer';\nimport type {\n  CoreBaseMapperInstance,\n  CoreBaseValidatorInstance,\n  CoreServiceRuntime,\n} from '@plyaz/types/core';\nimport type { FeatureFlagValue } from '@plyaz/types/features';\nimport type { ApiClientOptions } from '@plyaz/types/api';\nimport { setDefaultApiClient } from '@plyaz/api/frontend';\nimport { ApiClientService } from '../../services/ApiClientService';\n// Import types we need locally\nimport type {\n  CoreBaseDomainServiceConfig,\n  CoreMapperClass,\n  CoreValidatorClass,\n  CoreBaseServiceConfig,\n  CoreCacheManagerInstance,\n} from '@plyaz/types/core';\nimport type { DatabaseServiceInterface } from '@plyaz/types/db';\nimport type { ObservabilityAdapter, Span } from '@plyaz/types/observability';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * API client type (from @plyaz/core ApiClientService)\n */\nexport type ApiClient = Awaited<ReturnType<typeof ApiClientService.createStandaloneClient>>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for domain services\n *\n * Uses generics for strong typing:\n * - TConfig: Service configuration type\n * - TMapper: Mapper instance type\n * - TValidator: Validator instance type\n *\n * Subclasses use the super({...}) pattern:\n * ```typescript\n * class MyService extends BaseDomainService<MyConfig, MyMapper, MyValidator> {\n *   constructor(config: MyConfig) {\n *     super({\n *       serviceName: 'MyService',\n *       supportedRuntimes: ['universal'],\n *       serviceConfig: config,\n *       apiClientConfig: { baseURL: '/api' },\n *       MapperClass: MyMapperClass,\n *       ValidatorClass: MyValidatorClass,\n *     });\n *   }\n * }\n * ```\n */\nexport abstract class BaseDomainService<\n  TConfig extends CoreBaseDomainServiceConfig = CoreBaseDomainServiceConfig,\n  TMapper extends CoreBaseMapperInstance<unknown, unknown> = CoreBaseMapperInstance<\n    unknown,\n    unknown\n  >,\n  TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance,\n> {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Instance Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Service name for logging and error messages */\n  readonly serviceName: string;\n\n  /** Supported runtimes for this service */\n  readonly supportedRuntimes: readonly CoreServiceRuntime[];\n\n  /** Service configuration */\n  protected readonly config: TConfig;\n\n  /** Logger instance */\n  protected readonly logger: PackageLogger;\n\n  /** Initialization state */\n  protected _initialized: boolean = false;\n\n  // API Client (optional)\n  private _apiClient: ApiClient | null = null;\n  private _clientInitPromise: Promise<void> | null = null;\n  private readonly _apiClientConfig?: ApiClientOptions;\n  private readonly _setAsDefaultClient: boolean;\n\n  // Injected Services (cache, db, api, observability)\n  protected readonly cacheManager?: CoreCacheManagerInstance;\n  protected readonly dbService?: DatabaseServiceInterface;\n  protected readonly apiService?: ApiClient; // Injected ApiClient (different from _apiClient)\n  protected readonly observabilityService?: ObservabilityAdapter;\n\n  /**\n   * Cache prefix for namespacing cache keys (e.g., 'example', 'user', 'product').\n   * Subclasses can override by defining as a property.\n   * If not overridden, defaults to serviceName.toLowerCase().\n   *\n   * @example\n   * ```typescript\n   * protected cachePrefix = 'my-service'; // Override default\n   * ```\n   */\n  protected cachePrefix: string = '';\n\n  // Mapper and Validator instances (lazy)\n  private _mapperInstance: TMapper | null = null;\n  private _validatorInstance: TValidator | null = null;\n  private readonly _MapperClass?: CoreMapperClass<TMapper>;\n  private readonly _ValidatorClass?: CoreValidatorClass<TValidator>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Constructor\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create a new domain service instance\n   *\n   * @param config - Base service configuration (passed via super({...}))\n   */\n  // eslint-disable-next-line complexity\n  constructor(config: CoreBaseServiceConfig<TConfig, TMapper, TValidator>) {\n    this.serviceName = config.serviceName;\n    this.supportedRuntimes = config.supportedRuntimes;\n    this.config = config.serviceConfig;\n    this._setAsDefaultClient = config.setAsDefaultClient ?? false;\n\n    // Initialize logger with Core's configured transport\n    this.logger = new PackageLogger({\n      packageName: 'core',\n      service: this.serviceName,\n      transport: Core.loggerTransport,\n    });\n\n    // Store API client config for lazy initialization\n    this._apiClientConfig = config.apiClientConfig;\n\n    // Store injected services (cache, db, api, observability)\n    // Cast from unknown (types package uses unknown to avoid circular deps)\n    this.cacheManager = config.injected?.cache as CoreCacheManagerInstance | undefined;\n    this.dbService = config.injected?.db as DatabaseServiceInterface | undefined;\n    this.apiService = config.injected?.api as ApiClient | undefined;\n    // observabilityOverride takes precedence over injected observability\n    this.observabilityService = (config.serviceConfig.observabilityOverride ??\n      config.injected?.observability) as ObservabilityAdapter | undefined;\n\n    // Initialize cache prefix to serviceName if not set by subclass\n    // Subclasses can override by setting in their constructor after super()\n    if (!this.cachePrefix) {\n      this.cachePrefix = this.serviceName.toLowerCase();\n    }\n\n    // Store mapper/validator classes for lazy initialization\n    this._MapperClass = config.mapperClass;\n    this._ValidatorClass = config.validatorClass;\n\n    // Initialize API client if config provided\n    if (this._apiClientConfig) {\n      this.initializeApiClient();\n    }\n\n    this.logger.debug(`${this.serviceName} created`, {\n      supportedRuntimes: this.supportedRuntimes,\n      hasApiClient: !!this._apiClientConfig,\n      injected: {\n        cache: !!this.cacheManager,\n        db: !!this.dbService,\n        api: !!this.apiService,\n        observability: !!this.observabilityService,\n      },\n      cachePrefix: this.cachePrefix,\n      hasMapper: !!this._MapperClass,\n      hasValidator: !!this._ValidatorClass,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Getters\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if the service is enabled\n   * Service is enabled by default unless explicitly disabled\n   */\n  get isServiceEnabled(): boolean {\n    return this.config?.enabled !== false;\n  }\n\n  /**\n   * Check if the service is initialized (API client ready)\n   */\n  get isInitialized(): boolean {\n    return this._initialized;\n  }\n\n  /**\n   * Check if mapper is available\n   */\n  get hasMapper(): boolean {\n    return !!this._MapperClass;\n  }\n\n  /**\n   * Check if validator is available\n   */\n  get hasValidator(): boolean {\n    return !!this._ValidatorClass;\n  }\n\n  /**\n   * Get the mapper instance (lazy initialization)\n   * @throws CorePackageError if MapperClass was not provided\n   */\n  get mapper(): TMapper {\n    if (!this._mapperInstance && this._MapperClass) {\n      this._mapperInstance = new this._MapperClass();\n    }\n    if (!this._mapperInstance) {\n      throw new CorePackageError(\n        `${this.serviceName} does not have a Mapper configured`,\n        ERROR_CODES.FEATURE_NOT_SUPPORTED\n      );\n    }\n    return this._mapperInstance;\n  }\n\n  /**\n   * Set the mapper instance\n   * Allows subclasses to override mapper initialization\n   */\n  set mapper(value: TMapper) {\n    this._mapperInstance = value;\n  }\n\n  /**\n   * Get the validator instance (lazy initialization)\n   * @throws CorePackageError if ValidatorClass was not provided\n   */\n  get validator(): TValidator {\n    if (!this._validatorInstance && this._ValidatorClass) {\n      this._validatorInstance = new this._ValidatorClass();\n    }\n    if (!this._validatorInstance) {\n      throw new CorePackageError(\n        `${this.serviceName} does not have a Validator configured`,\n        ERROR_CODES.FEATURE_NOT_SUPPORTED\n      );\n    }\n    return this._validatorInstance;\n  }\n\n  /**\n   * Set the validator instance\n   * Allows subclasses to override validator initialization\n   */\n  set validator(value: TValidator) {\n    this._validatorInstance = value;\n  }\n\n  /**\n   * Get the API client (after initialization)\n   * @throws CorePackageError if API client was not configured or not initialized\n   */\n  get apiClient(): ApiClient {\n    if (!this._apiClient) {\n      throw new CorePackageError(\n        `${this.serviceName} API client not initialized. Call ensureApiClientInitialized() first.`,\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return this._apiClient;\n  }\n\n  /**\n   * Get the observability adapter (if injected)\n   * Returns undefined if observability is not enabled\n   */\n  get observability(): ObservabilityAdapter | undefined {\n    return this.observabilityService;\n  }\n\n  /**\n   * Check if observability is available\n   */\n  get hasObservability(): boolean {\n    return !!this.observabilityService;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // API Client Initialization\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Initialize API client asynchronously\n   * Called from constructor if apiClientConfig is provided\n   *\n   * Uses ApiClientService.createStandaloneClient() which includes:\n   * - Automatic error handling (single errors and arrays)\n   * - Event emission to CORE_EVENTS.SYSTEM.ERROR and CORE_EVENTS.API.REQUEST_ERROR\n   * - Serialization to unified SerializedError format\n   */\n  private initializeApiClient(): void {\n    if (this._clientInitPromise || !this._apiClientConfig) {\n      return;\n    }\n\n    this._clientInitPromise = (async () => {\n      try {\n        // Use ApiClientService.createStandaloneClient() which includes Core error handling\n        // This handles: single errors, error arrays, event emission, serialization\n        this._apiClient = await ApiClientService.createStandaloneClient(this._apiClientConfig!);\n\n        // Set as default client for all fetchers if configured\n        if (this._setAsDefaultClient) {\n          setDefaultApiClient(this._apiClient);\n        }\n\n        this._initialized = true;\n\n        this.logger.debug('API client initialized', {\n          service: this.serviceName,\n          baseURL: this._apiClientConfig!.baseURL,\n        });\n      } catch (error) {\n        this.logger.error('Failed to initialize API client', {\n          service: this.serviceName,\n          error: error instanceof Error ? error.message : String(error),\n        });\n        throw error;\n      }\n    })();\n  }\n\n  /**\n   * Ensure API client is initialized before use.\n   * Call this from methods that need the API client.\n   * Also called by ServiceRegistry.create() for services with async initialization.\n   */\n  async ensureApiClientInitialized(): Promise<void> {\n    if (this._clientInitPromise) {\n      await this._clientInitPromise;\n    }\n    if (this._apiClientConfig && !this._apiClient) {\n      throw new CorePackageError(\n        `${this.serviceName} API client not initialized`,\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Configuration Management\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get current configuration (immutable copy)\n   */\n  getConfig(): Readonly<TConfig> {\n    return { ...this.config };\n  }\n\n  /**\n   * Get a default value\n   * @param key - The key to get the default for\n   */\n  getDefault<T = FeatureFlagValue>(key: string): T | undefined {\n    return this.config?.defaults?.[key] as T | undefined;\n  }\n\n  /**\n   * Set a default value (mutates config.defaults)\n   * @param key - The key to set the default for\n   * @param value - The default value\n   */\n  setDefault(key: string, value: FeatureFlagValue): void {\n    if (!this.config.defaults) {\n      (this.config as CoreBaseDomainServiceConfig).defaults = {};\n    }\n    this.config.defaults![key] = value;\n  }\n\n  /**\n   * Set multiple default values\n   * @param defaults - Record of default values\n   */\n  setDefaults(defaults: Record<string, FeatureFlagValue>): void {\n    if (!this.config.defaults) {\n      (this.config as CoreBaseDomainServiceConfig).defaults = {};\n    }\n    Object.assign(this.config.defaults!, defaults);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Assertions\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Assert that the service is available (configured and ready)\n   * @throws CorePackageError if not available\n   */\n  protected assertAvailable(): void {\n    if (!this.isAvailable()) {\n      throw new CorePackageError(\n        `${this.serviceName} is not available. Check configuration.`,\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n  }\n\n  /**\n   * Assert that the service is enabled\n   * @throws CorePackageError if disabled\n   */\n  protected assertEnabled(): void {\n    if (!this.isServiceEnabled) {\n      throw new CorePackageError(\n        `${this.serviceName} is disabled. Set enabled: true in configuration.`,\n        ERROR_CODES.FEATURE_NOT_SUPPORTED\n      );\n    }\n  }\n\n  /**\n   * Assert that the service is ready (enabled AND available)\n   * @throws CorePackageError if not ready\n   */\n  protected assertReady(): void {\n    this.assertEnabled();\n    this.assertAvailable();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Abstract Methods - Must be implemented by subclasses\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if service is available (configured and ready)\n   * Subclasses must implement this to check credentials, config, etc.\n   *\n   * @returns true if available\n   */\n  abstract isAvailable(): boolean;\n\n  /**\n   * Dispose/cleanup the service\n   * Subclasses must implement to release resources\n   */\n  abstract dispose(): void;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Helper Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Log debug message with service context\n   */\n  protected logDebug(message: string, data?: Record<string, unknown>): void {\n    this.logger.debug(message, {\n      service: this.serviceName,\n      ...data,\n    });\n  }\n\n  /**\n   * Log info message with service context\n   */\n  protected logInfo(message: string, data?: Record<string, unknown>): void {\n    this.logger.info(message, {\n      service: this.serviceName,\n      ...data,\n    });\n  }\n\n  /**\n   * Log warning message with service context\n   */\n  protected logWarn(message: string, data?: Record<string, unknown>): void {\n    this.logger.warn(message, {\n      service: this.serviceName,\n      ...data,\n    });\n  }\n\n  /**\n   * Log error message with service context\n   */\n  protected logError(message: string, data?: Record<string, unknown>): void {\n    this.logger.error(message, {\n      service: this.serviceName,\n      ...data,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Observability Helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Record a metric (no-op if observability not available)\n   */\n  protected async recordMetric(\n    name: string,\n    value: number,\n    tags?: Record<string, string>\n  ): Promise<void> {\n    if (!this.observabilityService) return;\n    await this.observabilityService.recordHistogram(name, value, {\n      service: this.serviceName,\n      ...tags,\n    });\n  }\n\n  /**\n   * Increment a counter (no-op if observability not available)\n   */\n  protected async incrementCounter(\n    name: string,\n    value = 1,\n    tags?: Record<string, string>\n  ): Promise<void> {\n    if (!this.observabilityService) return;\n    await this.observabilityService.incrementCounter(name, value, {\n      service: this.serviceName,\n      ...tags,\n    });\n  }\n\n  /**\n   * Start a span for tracing (returns noop span if observability not available)\n   */\n  protected startSpan(name: string, attributes?: Record<string, string | number | boolean>): Span {\n    if (!this.observabilityService) {\n      // Return a noop span\n      return {\n        context: { traceId: '', spanId: '' },\n        setAttribute: () => {},\n        setAttributes: () => {},\n        addEvent: () => {},\n        setStatus: () => {},\n        end: () => {},\n        recordException: () => {},\n      };\n    }\n    return this.observabilityService.startSpan({\n      name,\n      attributes: {\n        'service.name': this.serviceName,\n        ...attributes,\n      },\n    });\n  }\n\n  /**\n   * Execute a function within a traced span\n   */\n  protected async withSpan<T>(\n    name: string,\n    fn: (span: Span) => Promise<T>,\n    attributes?: Record<string, string | number | boolean>\n  ): Promise<T> {\n    if (!this.observabilityService) {\n      // Execute without tracing\n      const noopSpan = this.startSpan(name);\n      return fn(noopSpan);\n    }\n    return this.observabilityService.withSpan(\n      {\n        name,\n        attributes: {\n          'service.name': this.serviceName,\n          ...attributes,\n        },\n      },\n      fn\n    );\n  }\n}\n","/**\n * Base Frontend Domain Service\n *\n * Extends BaseDomainService with common frontend patterns:\n * - **Primary/Read Store Pattern**: Services have ONE primary store (mutate) + multiple read stores (read-only)\n * - **Automatic Store Injection**: Stores injected by ServiceRegistry from root store\n * - **Automatic Loading State**: Managed via setStoresLoading() on primary store\n * - **Generic CRUD Operations**: With fetchers from @plyaz/api\n * - **Event Emission**: Typed event payloads via CoreEventManager\n * - **Automatic DTO Mapping**: Via mapper classes\n *\n * ## Store Architecture (NEW)\n *\n * ### Primary Store (Mutate)\n * - Service has ONE primary store defined by `store: 'campaigns'` config\n * - Can call: setData(), updateData(), setLoading()\n * - syncToStores() syncs ONLY to primary store\n * - Access via: this.primaryStore\n *\n * ### Read Stores (Read-Only)\n * - Service can read from multiple stores: `readStores: ['users', 'error', 'featureFlags']`\n * - Can read state but should NOT call mutation methods\n * - Used for cross-domain data access (e.g., campaign service reading user data)\n * - Access via: this.getReadStore('users')\n *\n * ### All Stores from Root Store\n * - All stores (domain + global) are slices of ONE root Zustand store\n * - Automatically reactive - changes propagate to subscribers (React components)\n * - Error/featureFlags are built-in, domain stores added dynamically\n *\n * Frontend domain services should extend this class instead of BaseDomainService\n * to get automatic store integration and CRUD capabilities.\n *\n * All generic type parameters for full type safety:\n * - TConfig: Service configuration type\n * - TStore: Store interface type\n * - TData: Data type for store sync\n * - TEntity: Domain entity type\n * - TResponseDTO: API response DTO type (snake_case)\n * - TCreateDTO: Create request DTO type\n * - TPatchDTO: Patch request DTO type (partial update)\n * - TQueryDTO: Query/filter DTO type for fetchAll\n * - TStoreState: Serializable store state type\n * - TMapper: Mapper instance type\n * - TValidator: Optional validator type\n *\n * @example\n * ```typescript\n * class MyFrontendService extends BaseFrontendDomainService<\n *   MyConfig,\n *   MyStore,\n *   MyStoreData,\n *   MyEntity,\n *   MyResponseDTO,\n *   CreateMyDTO,\n *   PatchMyDTO,\n *   QueryMyDTO,\n *   MyStoreState,\n *   MyMapper\n * > {\n *   protected eventPrefix = 'myDomain';\n *   protected mapper: MyMapper;\n *\n *   constructor(config: MyConfig) {\n *     super({ ... mapperClass: MyMapperClass });\n *     this.mapper = new MyMapperClass();\n *   }\n *\n *   // All CRUD methods inherited!\n *   // - fetchAll(query?)\n *   // - fetchById(id)\n *   // - create(data)\n *   // - update(id, data)\n *   // - delete(id)\n * }\n * ```\n */\n\nimport { BaseDomainService } from './BaseDomainService';\nimport { STORE_KEYS } from '@plyaz/store';\nimport { PackageLogger } from '@plyaz/logger';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { BaseError, CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'BaseFrontendDomainService' });\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\nimport { Core } from '../../init/CoreInitializer';\nimport type {\n  RootStoreSlice,\n  StreamStoreSlice,\n  StreamMessageHandler,\n  StreamMessageFilter,\n} from '@plyaz/types/store';\nimport type {\n  StreamChannel,\n  CoreStreamStoreGetter,\n  CoreStreamHandlerIds,\n  CoreStreamHandlerDeclaration,\n  CoreEntityCreatingPayload,\n  CoreEntityCreatedPayload,\n  CoreEntityPatchingPayload,\n  CoreEntityPatchedPayload,\n  CoreEntityDeletingPayload,\n  CoreEntityDeletedPayload,\n  CoreEntityErrorPayload,\n  CoreEntityCompletePayload,\n} from '@plyaz/types/core';\n\n// Import types for local use\nimport type {\n  CoreBaseFrontendStore,\n  CoreBaseFrontendServiceConfig,\n  CoreBaseFrontendServiceConstructorConfig,\n  CoreBaseMapperInstance,\n  CoreBaseValidatorInstance,\n  CoreStoreHandlers,\n  CoreOptimisticUpdateConfig,\n} from '@plyaz/types/core';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n  UploadFileRequest,\n  UploadFileResponse,\n  UploadFilesRequest,\n  UploadFilesResponse,\n  GenerateDocumentRequest,\n  GenerateDocumentResponse,\n  ServiceOptions,\n} from '@plyaz/types/api';\nimport {\n  uploadFile as uploadFileFetcher,\n  uploadFiles as uploadFilesFetcher,\n  generateDocument as generateDocumentFetcher,\n} from '@plyaz/api';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default polling interval in milliseconds (30 seconds) */\nconst DEFAULT_POLLING_INTERVAL_MS = 30000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Base Event Payload Type\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Base type for frontend event payloads\n * All frontend event payloads should extend this\n */\ntype BaseFrontendEventPayload =\n  | CoreEntityCreatingPayload<unknown>\n  | CoreEntityCreatedPayload<unknown, unknown>\n  | CoreEntityPatchingPayload<unknown>\n  | CoreEntityPatchedPayload<unknown, unknown>\n  | CoreEntityDeletingPayload\n  | CoreEntityDeletedPayload\n  | CoreEntityErrorPayload\n  | CoreEntityCompletePayload\n  | Record<string, unknown>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for frontend domain services with store integration and CRUD operations.\n *\n * Extends BaseDomainService with:\n * - Multi-store connection management\n * - Automatic sync to connected stores\n * - Loading/error state propagation\n * - Generic CRUD operations (fetchAll, fetchById, create, update, delete)\n * - Event emission with typed payloads\n * - Automatic DTO mapping via mapper\n *\n * @typeParam TConfig - Service configuration type\n * @typeParam TStore - Store interface type\n * @typeParam TData - Data type for store sync\n * @typeParam TEntity - Domain entity type\n * @typeParam TResponseDTO - API response DTO type\n * @typeParam TCreateDTO - Create request DTO type\n * @typeParam TPatchDTO - Patch request DTO type\n * @typeParam TQueryDTO - Query/filter DTO type for fetchAll (default: unknown)\n * @typeParam TStoreState - Serializable store state type\n * @typeParam TMapper - Mapper instance type\n * @typeParam TValidator - Optional validator type\n * @typeParam TDeleteResult - Delete operation result type (default: void for backwards compatibility)\n */\nexport abstract class BaseFrontendDomainService<\n  TConfig extends CoreBaseFrontendServiceConfig<TData, TStore>,\n  TStore extends CoreBaseFrontendStore<TData>,\n  TData = Record<string, unknown>,\n  TEntity = unknown,\n  TResponseDTO = unknown,\n  TCreateDTO = unknown,\n  TPatchDTO extends Partial<unknown> = Partial<TCreateDTO>,\n  TQueryDTO = unknown,\n  TStoreState = TEntity,\n  TMapper extends CoreBaseMapperInstance<\n    TEntity,\n    TResponseDTO,\n    TCreateDTO,\n    TCreateDTO,\n    TPatchDTO,\n    unknown,\n    TStoreState\n  > = CoreBaseMapperInstance<\n    TEntity,\n    TResponseDTO,\n    TCreateDTO,\n    TCreateDTO,\n    TPatchDTO,\n    unknown,\n    TStoreState\n  >,\n  TValidator extends CoreBaseValidatorInstance = CoreBaseValidatorInstance,\n  TDeleteResult = void,\n> extends BaseDomainService<TConfig, TMapper, TValidator> {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Required Properties (Subclasses must provide)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Event prefix for all events emitted by this service\n   * E.g., 'example' → emits 'example:creating', 'example:created', etc.\n   *\n   * Required by subclasses\n   */\n  protected abstract eventPrefix: string;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Store Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Primary store - the main store this service can mutate */\n  private _primaryStore: TStore | null = null;\n\n  /**\n   * Primary store key - resolved from (in order of precedence):\n   * 1. serviceConfig.store (explicit config)\n   * 2. Static defaultStoreKey on class\n   * 3. undefined (no store integration)\n   *\n   * Override in subclass or set via config.\n   * @example protected primaryStoreKey = STORE_KEYS.EXAMPLE;\n   */\n  protected primaryStoreKey?: string;\n\n  /** Read-only stores - can read but not mutate */\n  private readonly _readStores = new Map<string, unknown>();\n\n  /**\n   * Read-only store keys - always includes error and featureFlags by default\n   * Override in subclass to add additional read stores\n   * @example protected readStoreKeys = [...super.readStoreKeys, STORE_KEYS.CAMPAIGNS];\n   */\n  protected readStoreKeys: string[] = [STORE_KEYS.ERROR, STORE_KEYS.FEATURE_FLAGS];\n\n  /** Store handlers for custom store synchronization */\n  protected readonly storeHandlers?: CoreStoreHandlers<TData, TStore>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Optimistic Update Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Optimistic update configuration */\n  protected readonly optimisticConfig?: CoreOptimisticUpdateConfig;\n\n  /** Stack of previous states for rollback (LIFO) */\n  private readonly _rollbackStack: Array<{\n    operation: string;\n    previousState: TData | null;\n    timestamp: number;\n  }> = [];\n\n  /** Maximum rollback stack size */\n  private readonly _maxRollbackStackSize = 10;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Polling Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Polling timer reference */\n  private _pollingTimer: ReturnType<typeof setInterval> | null = null;\n\n  /**\n   * Registered stream handler IDs for auto-cleanup on dispose.\n   * IDs are added by registerStreamHandler() and removed on dispose().\n   */\n  private readonly _registeredStreamHandlerIds = new Set<string>();\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Stream Handler Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Flag to track if static stream handlers are registered.\n   * Subclasses should set this in their registerStreamHandlers() method.\n   */\n  protected static _streamHandlersRegistered = false;\n\n  /**\n   * Stream handler IDs for auto-cleanup.\n   * Subclasses should define their handler IDs as a readonly object.\n   *\n   * @example\n   * ```typescript\n   * protected static readonly STREAM_HANDLER_IDS: CoreStreamHandlerIds<\n   *   'UPLOAD_PROGRESS' | 'DOWNLOAD_PROGRESS'\n   * > = {\n   *   UPLOAD_PROGRESS: 'files:upload-progress',\n   *   DOWNLOAD_PROGRESS: 'files:download-progress',\n   * } as const;\n   * ```\n   */\n  protected static readonly STREAM_HANDLER_IDS: CoreStreamHandlerIds<string> = {};\n\n  /**\n   * Declarative stream handlers configuration.\n   * Define handlers as an array - they will be auto-registered by registerStreamHandlersFromConfig().\n   *\n   * Each handler config includes:\n   * - id: Unique handler ID (should match a key in STREAM_HANDLER_IDS)\n   * - channels: Channels to listen to\n   * - events: Event types to listen to\n   * - priority: Handler priority (higher = called first)\n   * - handler: Handler function receiving typed message and store getter\n   *\n   * @example\n   * ```typescript\n   * protected static readonly STREAM_HANDLERS: CoreStreamHandlerDeclaration[] = [\n   *   {\n   *     id: 'files:upload-progress',\n   *     channels: ['uploads', 'upload:'],\n   *     events: ['progress', 'upload:progress'],\n   *     priority: 100,\n   *     handler: (message, getStore) => {\n   *       const filesStore = getStore()?.files;\n   *       filesStore?.setUploadProgress(message.data.fileId, { ... });\n   *     },\n   *   },\n   * ];\n   * ```\n   */\n  protected static readonly STREAM_HANDLERS: CoreStreamHandlerDeclaration[] = [];\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Constructor\n  // ─────────────────────────────────────────────────────────────────────────\n\n  // eslint-disable-next-line complexity\n  constructor(\n    config: CoreBaseFrontendServiceConstructorConfig<TConfig, TStore, TData, TMapper, TValidator>\n  ) {\n    // Auto-construct apiClientConfig from serviceConfig.apiBasePath if not provided\n    // This reduces boilerplate in child services - they only need to set apiBasePath\n    const resolvedConfig = BaseFrontendDomainService.resolveApiClientConfig(config);\n\n    super(resolvedConfig);\n\n    this.storeHandlers = config.serviceConfig.storeHandlers;\n    this.optimisticConfig = config.serviceConfig.optimisticUpdates;\n\n    // Initialize mapper if class provided\n    if (config.mapperClass) {\n      this.mapper = new config.mapperClass() as TMapper;\n    }\n\n    const serviceConfig = config.serviceConfig;\n\n    // Resolve primary store key with precedence:\n    // 1. Explicit config (serviceConfig.store) - allows override\n    // 2. Static primaryStoreKey on child class\n    if (serviceConfig.store !== undefined) {\n      this.primaryStoreKey = serviceConfig.store;\n    } else {\n      // Use static primaryStoreKey from child class\n      const staticKey = (this.constructor as { primaryStoreKey?: string }).primaryStoreKey;\n      if (staticKey) {\n        this.primaryStoreKey = staticKey;\n      }\n    }\n\n    // Merge readStores from config with base defaults\n    if (serviceConfig.readStores !== undefined) {\n      // Merge config readStores with base defaults (error, featureFlags)\n      // Use Set to avoid duplicates\n      this.readStoreKeys = Array.from(\n        new Set([\n          ...this.readStoreKeys, // Base defaults: error, featureFlags\n          ...serviceConfig.readStores, // Additional from config\n        ])\n      );\n    }\n\n    // Get injected stores from ServiceRegistry\n    const injectedStores = config.injected?.stores;\n\n    // Connect primary store (can mutate)\n    if (this.primaryStoreKey) {\n      const primaryStore = injectedStores?.[this.primaryStoreKey] as TStore;\n      if (primaryStore) {\n        this._primaryStore = primaryStore;\n        this.logDebug(`Connected primary store: '${this.primaryStoreKey}'`);\n      } else {\n        // Only warn on client - on server (SSR), stores are expected to be unavailable\n        // This is normal during SSR since Zustand stores only exist on the client\n        const isServer = typeof globalThis.window === 'undefined';\n        if (!isServer) {\n          // Warn instead of throw - store integration is optional for services\n          // Services can still work without stores, they just can't use store mutations\n          this.logWarn(\n            `Primary store '${this.primaryStoreKey}' not found. ` +\n              `Store mutations (setData/updateData/setLoading) will be disabled. ` +\n              `Configure stores in PlyazProvider to enable store integration.`\n          );\n        }\n      }\n    }\n\n    // Connect read-only stores (can only read)\n    for (const key of this.readStoreKeys) {\n      const readStore = injectedStores?.[key];\n      if (readStore) {\n        this._readStores.set(key, readStore);\n        this.logDebug(`Connected read-only store: '${key}'`);\n      } else {\n        this.logDebug(`Read-only store '${key}' not found in injected stores`);\n      }\n    }\n\n    // Log warning if no primary store configured\n    if (!this.primaryStoreKey) {\n      this.logWarn(\n        `No primary store configured. ` +\n          `Set 'store' in config to enable store mutations (setData/updateData/setLoading).`\n      );\n    }\n\n    this.logDebug('Frontend service initialized', {\n      primaryStore: this.primaryStoreKey,\n      readStores: this.readStoreKeys,\n    });\n  }\n\n  /**\n   * Auto-resolve apiClientConfig from serviceConfig.apiBasePath if not explicitly provided.\n   * This reduces boilerplate in child services - they only need to set apiBasePath in config.\n   *\n   * Priority:\n   * 1. Explicit apiClientConfig.baseURL (full control)\n   * 2. serviceConfig.apiBasePath (auto-constructed, merged with injected options)\n   * 3. undefined (no API client)\n   *\n   * When auto-constructing, merges injected API options (headers, timeout, etc.)\n   * with the service's apiBasePath as baseURL.\n   */\n  protected static resolveApiClientConfig<\n    T extends {\n      serviceConfig: { apiBasePath?: string };\n      apiClientConfig?: { baseURL?: string };\n      injected?: { api?: unknown };\n    },\n  >(config: T): T {\n    // If apiClientConfig with baseURL is already provided, use it as-is\n    if (config.apiClientConfig?.baseURL) {\n      return config;\n    }\n\n    // If apiBasePath is defined in serviceConfig, auto-construct apiClientConfig\n    const apiBasePath = config.serviceConfig.apiBasePath;\n    if (apiBasePath) {\n      // Merge injected API options (headers, timeout, etc.) with service's baseURL\n      const injectedOptions = config.injected?.api\n        ? {} // If using injected API client, don't merge its options here\n        : (config.apiClientConfig ?? {});\n\n      return {\n        ...config,\n        apiClientConfig: {\n          ...injectedOptions,\n          baseURL: apiBasePath, // Service's apiBasePath always takes precedence\n        },\n      };\n    }\n\n    // No apiClientConfig needed\n    return config;\n  }\n\n  /**\n   * Initialize service and wait for API client to be ready.\n   * Call this in child service's static create() method after constructing the instance.\n   *\n   * @param service - The service instance to initialize\n   * @returns The initialized service (same instance, for chaining)\n   *\n   * @example\n   * ```typescript\n   * static async create(config, options): Promise<MyService> {\n   *   const service = new MyService(config, options);\n   *   return this.initializeService(service);\n   * }\n   * ```\n   */\n  protected static async initializeService<\n    T extends { ensureApiClientInitialized(): Promise<void> },\n  >(service: T): Promise<T> {\n    await service.ensureApiClientInitialized();\n    return service;\n  }\n\n  /**\n   * Ensure service is ready for operations.\n   * Checks enabled/available status AND waits for API client initialization.\n   * Call this at the start of all CRUD methods.\n   *\n   * @throws CorePackageError if service is not enabled or available\n   */\n  protected async ensureReady(): Promise<void> {\n    this.assertReady();\n    await this.ensureApiClientInitialized();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Store Management (Public API)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get the number of connected stores (primary + read stores).\n   */\n  get connectedStoreCount(): number {\n    return (this._primaryStore ? 1 : 0) + this._readStores.size;\n  }\n\n  /**\n   * Check if any stores are connected (primary or read).\n   */\n  get hasConnectedStores(): boolean {\n    return !!this._primaryStore || this._readStores.size > 0;\n  }\n\n  /**\n   * Get primary store (protected).\n   * This is the store the service can mutate.\n   */\n  protected get primaryStore(): TStore | null {\n    return this._primaryStore;\n  }\n\n  /**\n   * Get a read-only store by key (protected).\n   * Can read state but should not call mutation methods.\n   *\n   * @param key - Store key (type-safe)\n   * @returns Store slice or undefined (auto-typed based on key)\n   */\n  protected getReadStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n    return this._readStores.get(key) as RootStoreSlice[K] | undefined;\n  }\n\n  /**\n   * Get a specific store slice by key (protected).\n   *\n   * **Namespaced Root Store Architecture:**\n   * - All stores are slices merged into ONE Zustand root store\n   * - Each slice is namespaced (e.g., store.example, store.errors)\n   * - This returns the SPECIFIC slice for the given key\n   * - Type-safe: only valid store keys allowed\n   *\n   * **Usage Guidelines:**\n   * - Can mutate stores that are NOT in readStoreKeys\n   * - Should NOT mutate stores in readStoreKeys (errors, featureFlags by default)\n   * - Useful for cross-domain updates (e.g., campaign service updating user stats)\n   *\n   * @param key - Store key (type-safe: 'example' | 'errors' | 'featureFlags')\n   * @returns Specific store slice (fully typed based on key)\n   *\n   * @example\n   * ```typescript\n   * // In CampaignService\n   * protected async afterCreate(id: string, campaign: Campaign) {\n   *   // Update primary store (campaigns)\n   *   this.primaryStore.addItem(campaign);\n   *\n   *   // Check feature flag (read-only) - auto-typed as FeatureFlagStoreSlice\n   *   const flagsSlice = this.getStore('featureFlags');  // ✅ Type-safe!\n   *   if (flagsSlice?.flags?.['update-user-stats']) {\n   *     // Update user store (cross-domain mutation - OK since not read-only)\n   *     const userSlice = this.getStore('users');  // ✅ Auto-typed!\n   *     userSlice?.incrementCampaignCount(campaign.userId);\n   *   }\n   * }\n   * ```\n   */\n  protected getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n    // Returns specific slice from namespaced root store (type-safe)\n    return Core.getDomainStore(key);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Store Sync (Protected - for subclasses)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Sync data to primary store only (read stores are NOT updated).\n   * Uses setData (replace) or updateData (merge) based on `replace` parameter.\n   * If custom store handlers are configured, uses those instead of default behavior.\n   *\n   * @param data - Data to sync to primary store\n   * @param replace - If true, calls setData; if false, calls updateData\n   */\n  // eslint-disable-next-line complexity\n  protected syncToStores(data: TData, replace = false): void {\n    if (!this._primaryStore) {\n      this.logDebug('No primary store to sync to');\n      return;\n    }\n\n    // Check if store sync is disabled\n    if (this.storeHandlers?.disabled) {\n      this.logDebug('Store sync disabled via storeHandlers.disabled');\n      return;\n    }\n\n    try {\n      // Priority 1: Use custom handlers if configured\n      if (replace && this.storeHandlers?.setData) {\n        this.storeHandlers.setData(this._primaryStore, data);\n      } else if (!replace && this.storeHandlers?.updateData) {\n        this.storeHandlers.updateData(this._primaryStore, data as Partial<TData>);\n      }\n      // Priority 2: Use standard store methods\n      else if (replace && this._primaryStore.setData) {\n        this._primaryStore.setData(data);\n      } else if (!replace && this._primaryStore.updateData) {\n        this._primaryStore.updateData(data as Partial<TData>);\n      } else if (this._primaryStore.setData) {\n        // Fallback to setData if updateData not available\n        this._primaryStore.setData(data);\n      }\n\n      this.logDebug('Synced to primary store', {\n        primaryStore: this.primaryStoreKey,\n        replace,\n      });\n    } catch (error) {\n      this.logError('Failed to sync to primary store', { error });\n    }\n  }\n\n  /**\n   * Set loading state on primary store only.\n   * Read stores are NOT affected.\n   *\n   * Automatically called by CRUD methods before and after API calls.\n   *\n   * @param isLoading - Loading state\n   */\n  protected setStoresLoading(isLoading: boolean): void {\n    if (!this._primaryStore) return;\n\n    // Check if store sync is disabled\n    if (this.storeHandlers?.disabled) {\n      return;\n    }\n\n    // Use custom handler if configured\n    if (this.storeHandlers?.setLoading) {\n      this.storeHandlers.setLoading(this._primaryStore, isLoading);\n    }\n    // Fallback to default behavior\n    else if (this._primaryStore.setLoading) {\n      this._primaryStore.setLoading(isLoading);\n    }\n  }\n\n  /**\n   * Add entity to store (for create operations).\n   * Priority: storeHandlers.addData > store.addData\n   *\n   * @param entity - Entity to add\n   * @returns The converted store state (for reuse in event payloads)\n   */\n  protected addEntityToStore(entity: TEntity): TStoreState {\n    const storeState = this.mapper.toStoreState(entity);\n\n    if (this._primaryStore && !this.storeHandlers?.disabled) {\n      try {\n        if (this.storeHandlers?.addData) {\n          this.storeHandlers.addData(this._primaryStore, storeState);\n        } else if (this._primaryStore.addData) {\n          this._primaryStore.addData(storeState);\n        } else {\n          this.logDebug('Store does not support addData - skipping create sync');\n        }\n      } catch (error) {\n        this.logError('Failed to add entity to store', { error });\n      }\n    }\n\n    return storeState;\n  }\n\n  /**\n   * Update entity in store (for update operations).\n   * Priority: storeHandlers.updateDataById > store.updateDataById\n   *\n   * @param id - Entity ID\n   * @param entity - Updated entity\n   * @returns The converted store state (for reuse in event payloads)\n   */\n  protected updateEntityInStore(id: string, entity: TEntity): TStoreState {\n    const storeState = this.mapper.toStoreState(entity);\n\n    if (this._primaryStore && !this.storeHandlers?.disabled) {\n      try {\n        if (this.storeHandlers?.updateDataById) {\n          this.storeHandlers.updateDataById(this._primaryStore, id, storeState);\n        } else if (this._primaryStore.updateDataById) {\n          this._primaryStore.updateDataById(id, storeState);\n        } else {\n          this.logDebug('Store does not support updateDataById - skipping update sync');\n        }\n      } catch (error) {\n        this.logError('Failed to update entity in store', { error });\n      }\n    }\n\n    return storeState;\n  }\n\n  /**\n   * Sync multiple entities to store.\n   * Uses storeDataKey config to wrap entities in the correct structure.\n   *\n   * @param entities - Entities to sync\n   * @returns Array of converted store states\n   */\n  protected syncEntitiesToStore(entities: TEntity[]): TStoreState[] {\n    const storeStates = entities.map(entity => this.mapper.toStoreState(entity));\n\n    if (this._primaryStore && !this.storeHandlers?.disabled) {\n      // Build store data using configured key (default: 'items')\n      const storeDataKey = this.config.storeDataKey ?? 'items';\n      const storeData = this.buildNestedObject(storeDataKey, entities);\n      this.syncToStores(storeData as TData, true); // Replace with full list\n    }\n\n    return storeStates;\n  }\n\n  /**\n   * Build a nested object from a dot-notation key path.\n   * @example buildNestedObject('items', data) => { items: data }\n   * @example buildNestedObject('nested.items', data) => { nested: { items: data } }\n   */\n  private buildNestedObject(keyPath: string, value: unknown): Record<string, unknown> {\n    const keys = keyPath.split('.');\n    const result: Record<string, unknown> = {};\n\n    let current = result;\n    for (let i = 0; i < keys.length - 1; i++) {\n      current[keys[i]] = {};\n      current = current[keys[i]] as Record<string, unknown>;\n    }\n    current[keys[keys.length - 1]] = value;\n\n    return result;\n  }\n\n  /**\n   * Remove entity from store by ID.\n   * Priority: storeHandlers.removeData > store.removeData\n   *\n   * @param id - Entity ID to remove\n   */\n  protected removeEntityFromStore(id: string): void {\n    if (!this._primaryStore || this.storeHandlers?.disabled) return;\n\n    try {\n      // Priority 1: Custom handler for removeData\n      if (this.storeHandlers?.removeData) {\n        this.storeHandlers.removeData(this._primaryStore, id);\n      }\n      // Priority 2: Store's removeData method\n      else if (this._primaryStore.removeData) {\n        this._primaryStore.removeData(id);\n      } else {\n        this.logDebug('Store does not support removeData - skipping delete sync');\n        return;\n      }\n\n      this.logDebug('Removed entity from store', { entityId: id });\n    } catch (error) {\n      this.logError('Failed to remove entity from store', { error, entityId: id });\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Optimistic Update Helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if optimistic updates are enabled for an operation.\n   */\n  protected isOptimisticEnabled(operation: 'create' | 'update' | 'delete'): boolean {\n    if (!this.optimisticConfig?.enabled) return false;\n    const ops = this.optimisticConfig.operations ?? ['create', 'update', 'delete'];\n    return ops.includes(operation);\n  }\n\n  /**\n   * Save current store state for potential rollback.\n   * Call this BEFORE making optimistic changes.\n   */\n  protected saveStateForRollback(operation: string): void {\n    if (!this._primaryStore?.getData) return;\n\n    const previousState = this._primaryStore.getData();\n    this._rollbackStack.push({\n      operation,\n      previousState: previousState ? { ...previousState } : null,\n      timestamp: Date.now(),\n    });\n\n    // Limit stack size\n    if (this._rollbackStack.length > this._maxRollbackStackSize) {\n      this._rollbackStack.shift();\n    }\n\n    this.logDebug('Saved state for rollback', { operation, stackSize: this._rollbackStack.length });\n  }\n\n  /**\n   * Rollback to previous state on error.\n   * Call this when an optimistic update fails.\n   */\n  protected rollbackState(operation: string, error: Error): void {\n    const entry = this._rollbackStack.pop();\n    if (!entry || !this._primaryStore) {\n      this.logWarn('No state to rollback', { operation });\n      return;\n    }\n\n    try {\n      if (entry.previousState && this._primaryStore.setData) {\n        this._primaryStore.setData(entry.previousState);\n        this.logInfo('Rolled back optimistic update', { operation });\n      }\n\n      // Call onRollback callback if configured\n      if (this.optimisticConfig?.onRollback) {\n        this.optimisticConfig.onRollback(operation, error, entry.previousState);\n      }\n\n      // Emit rollback event\n      this.emitEvent('optimistic:rollback', {\n        operation,\n        error: error.message,\n        previousState: entry.previousState,\n      } as Record<string, unknown>);\n    } catch (rollbackError) {\n      this.logError('Failed to rollback state', { error: rollbackError, operation });\n    }\n  }\n\n  /**\n   * Clear rollback state after successful operation.\n   * Call this when API succeeds.\n   */\n  protected clearRollbackState(operation: string): void {\n    // Remove the most recent entry for this operation\n    const index = this._rollbackStack.findIndex(e => e.operation === operation);\n    if (index >= 0) {\n      this._rollbackStack.splice(index, 1);\n    }\n  }\n\n  /**\n   * Resolve conflict between optimistic and server state.\n   */\n  // eslint-disable-next-line complexity\n  protected resolveConflict<T>(optimistic: T, server: T): T {\n    const resolution = this.optimisticConfig?.conflictResolution ?? 'server-wins';\n\n    switch (resolution) {\n      case 'server-wins':\n        return server;\n      case 'client-wins':\n        return optimistic;\n      case 'merge':\n        // Deep merge (simple implementation)\n        if (typeof optimistic === 'object' && typeof server === 'object') {\n          return { ...optimistic, ...server } as T;\n        }\n        return server;\n      case 'manual':\n        if (this.optimisticConfig?.onConflict) {\n          return this.optimisticConfig.onConflict(optimistic, server);\n        }\n        return server;\n      default:\n        return server;\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Response Unwrapping\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Unwrap response data if responseDataKey is configured.\n   *\n   * Handles wrapped API responses (e.g., SuccessResponseStandard) by extracting\n   * the actual data from a nested property. Supports nested keys with dot notation.\n   *\n   * @param data - Raw response data from fetcher\n   * @returns Unwrapped data or original data if no key configured\n   *\n   * @example\n   * ```typescript\n   * // Simple key: responseDataKey: 'data'\n   * // Input: { success: true, message: '...', data: [...], codeStatus: 200 }\n   * // Output: [...]\n   *\n   * // Nested key: responseDataKey: 'data.items'\n   * // Input: { data: { items: [...], total: 100 } }\n   * // Output: [...]\n   * ```\n   */\n  protected unwrapResponseData<T>(data: unknown): T {\n    const key = this.config.responseDataKey;\n    if (!key) return data as T;\n\n    // Support nested keys with dot notation (e.g., 'data.items')\n    const keys = key.split('.');\n    let result: unknown = data;\n\n    for (const k of keys) {\n      if (result && typeof result === 'object' && k in result) {\n        result = (result as Record<string, unknown>)[k];\n      } else {\n        // Key not found, return original data\n        return data as T;\n      }\n    }\n\n    return result as T;\n  }\n\n  /**\n   * Check if a response indicates success.\n   *\n   * Uses `responseSuccessKey` config if set, otherwise auto-detects from:\n   * - `isSuccess` (internal format)\n   * - `success` (alternative internal format)\n   * - `ok` (fetchff/fetch standard)\n   * - HTTP status code 200-299\n   *\n   * Supports nested keys via dot notation (e.g., `'meta.success'`).\n   *\n   * @param response - Response object from fetcher\n   * @returns true if response indicates success\n   */\n  // eslint-disable-next-line complexity\n  protected isResponseSuccess(response: unknown): boolean {\n    if (!response || typeof response !== 'object') {\n      return false;\n    }\n\n    const resp = response as Record<string, unknown>;\n    const successKey = this.config.responseSuccessKey;\n\n    // If successKey is configured, use it (supports nested keys)\n    if (successKey) {\n      const keys = successKey.split('.');\n      let result: unknown = resp;\n\n      for (const k of keys) {\n        if (result && typeof result === 'object' && k in result) {\n          result = (result as Record<string, unknown>)[k];\n        } else {\n          // Key not found, fall back to auto-detect\n          break;\n        }\n      }\n\n      // If we found a boolean value, use it\n      if (typeof result === 'boolean') {\n        return result;\n      }\n    }\n\n    // Auto-detect: check common success properties in order\n    if ('isSuccess' in resp && typeof resp.isSuccess === 'boolean') {\n      return resp.isSuccess;\n    }\n\n    if ('success' in resp && typeof resp.success === 'boolean') {\n      return resp.success;\n    }\n\n    if ('ok' in resp && typeof resp.ok === 'boolean') {\n      return resp.ok;\n    }\n\n    // Check HTTP status code\n    if ('status' in resp && typeof resp.status === 'number') {\n      return resp.status >= HTTP_STATUS.OK && resp.status < HTTP_STATUS.MULTIPLE_CHOICES;\n    }\n\n    // Default: assume success if we have data and no explicit error\n    return 'data' in resp && !('error' in resp && resp.error);\n  }\n\n  /**\n   * Extract error from API response.\n   *\n   * Uses `responseErrorKey` config if set, otherwise auto-detects from:\n   * - `error` (common format)\n   * - `errors` (array format, e.g., GraphQL)\n   *\n   * Supports nested keys via dot notation (e.g., `'meta.error'`).\n   *\n   * @param response - Response object from fetcher\n   * @returns Extracted error or undefined if not found\n   */\n  // eslint-disable-next-line complexity\n  protected extractResponseError(response: unknown): unknown {\n    if (!response || typeof response !== 'object') {\n      return undefined;\n    }\n\n    const resp = response as Record<string, unknown>;\n    const errorKey = this.config.responseErrorKey;\n\n    // If errorKey is configured, use it (supports nested keys)\n    if (errorKey) {\n      const keys = errorKey.split('.');\n      let result: unknown = resp;\n\n      for (const k of keys) {\n        if (result && typeof result === 'object' && k in result) {\n          result = (result as Record<string, unknown>)[k];\n        } else {\n          // Key not found\n          return undefined;\n        }\n      }\n\n      return result;\n    }\n\n    // Auto-detect: check common error properties\n    if ('error' in resp && resp.error) {\n      return resp.error;\n    }\n\n    if ('errors' in resp && resp.errors) {\n      return resp.errors;\n    }\n\n    return undefined;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Generic CRUD Operations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Fetch all entities from API\n   *\n   * Flow:\n   * 1. Assert service is ready\n   * 2. Check fetcher is available\n   * 3. Set stores loading\n   * 4. Emit 'fetching' event\n   * 5. Lifecycle hook: beforeFetchAll\n   * 6. Call fetcher (from @plyaz/api)\n   * 7. Map response DTOs to domain entities\n   * 8. Lifecycle hook: afterFetchAll\n   * 9. Emit 'fetched' event\n   * 10. Return entities\n   *\n   * Error Handling:\n   * - On API error: wrap and emit error event\n   * - Set error on all stores\n   * - Re-throw wrapped error\n   *\n   * @param query - Optional query/filter parameters (e.g., { status: 'active' })\n   * @param options - Optional service options for fetcher\n   * @returns Promise resolving to array of entities\n   * @throws CorePackageError if fetcher not configured or API call fails\n   *\n   * @example\n   * ```typescript\n   * // Fetch all entities\n   * const allItems = await service.fetchAll();\n   *\n   * // Fetch with filters\n   * const activeItems = await service.fetchAll({ status: 'active' });\n   *\n   * // Fetch with pagination\n   * const pagedItems = await service.fetchAll({ page: 2, limit: 10 });\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async fetchAll(query?: Partial<TQueryDTO>, options?: unknown): Promise<TEntity[]> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    if (!this.config.fetchers?.fetchAll) {\n      throw new CorePackageError(\n        'fetchAll fetcher not configured. Pass fetchers.fetchAll in service config.',\n        ERROR_CODES.CORE_OPERATION_FAILED\n      );\n    }\n\n    this.setStoresLoading(true);\n    this.emitEvent('fetching', { query } as Record<string, unknown>);\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeFetchAll?.(query);\n\n      // 2. Call fetcher with query\n      const response = await this.config.fetchers.fetchAll(query, options);\n\n      // Check for success - support multiple response formats\n      if (!this.isResponseSuccess(response)) {\n        const extractedError = this.extractResponseError(response);\n        throw new CorePackageError(\n          'Failed to fetch entities',\n          ERROR_CODES.CONTEXT_OPERATION_FAILED,\n          {\n            context: { operation: 'fetchAll', query },\n            cause: extractedError instanceof Error ? extractedError : undefined,\n            details: extractedError,\n          }\n        );\n      }\n\n      // 3. Unwrap response data if needed (e.g., SuccessResponseStandard format)\n      const rawData = this.unwrapResponseData<TResponseDTO[]>(response.data);\n\n      // Debug: Log config and response to diagnose issues\n      this.logDebug('fetchAll: checking config keys', {\n        responseSuccessKey: this.config.responseSuccessKey,\n        responseErrorKey: this.config.responseErrorKey,\n        responseDataKey: this.config.responseDataKey,\n        configKeys: Object.keys(this.config),\n      });\n\n      this.logDebug('fetchAll: response structure', {\n        responseType: typeof response,\n        responseKeys: response ? Object.keys(response as object) : [],\n        responseDataType: typeof (response as Record<string, unknown>).data,\n        hasOk: 'ok' in (response as object),\n        hasData: 'data' in (response as object),\n      });\n\n      this.logDebug('fetchAll: after unwrap', {\n        rawDataType: typeof rawData,\n        isArray: Array.isArray(rawData),\n        rawDataKeys: rawData && typeof rawData === 'object' ? Object.keys(rawData as object) : [],\n      });\n\n      // 4. Validate rawData is an array before mapping\n      if (!Array.isArray(rawData)) {\n        this.logWarn('fetchAll: unwrapped data is not an array, check responseDataKey config', {\n          responseDataKey: this.config.responseDataKey,\n          actualType: typeof rawData,\n          // Help debug by showing what we got\n          receivedData: rawData,\n        });\n        // Return empty array to prevent crash - the warning will help debug\n        return [];\n      }\n\n      // 5. Map DTOs to domain entities\n      const entities = rawData.map(dto => this.mapper.toDomain(dto as TResponseDTO));\n\n      // 6. Sync to store and get converted store states (no duplicate toStoreState)\n      this.syncEntitiesToStore(entities);\n\n      // 6. Lifecycle hook\n      await this.afterFetchAll?.(entities, query);\n\n      // 7. Emit success event\n      this.emitEvent('fetched', {\n        count: entities.length,\n        query,\n      } as Record<string, unknown>);\n\n      // Record success metrics\n      await this.recordOperationMetrics('fetchAll', Date.now() - startTime, true);\n\n      this.logInfo('Fetched entities', { count: entities.length, query });\n      return entities;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('fetchAll', Date.now() - startTime, false);\n\n      const pkgError = this.wrapError(error, 'fetchAll', { query });\n      // Note: Errors are thrown and caught by global error handler\n      // Individual stores should NOT have error state - only global error store\n      this.emitEvent('fetch:error', {\n        error: pkgError,\n        data: { query },\n      } satisfies CoreEntityErrorPayload);\n      throw pkgError;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  /**\n   * Fetch single entity by ID from API\n   *\n   * @param id - Entity ID\n   * @param options - Optional service options for fetcher\n   * @returns Entity or null if not found\n   * @throws CorePackageError if fetcher not configured or API call fails\n   */\n  // eslint-disable-next-line complexity\n  async fetchById<TInput = string, TOptions = unknown>(\n    id: TInput,\n    options?: TOptions\n  ): Promise<TEntity | null> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    if (!this.config.fetchers?.fetchById) {\n      throw new CorePackageError(\n        'fetchById fetcher not configured. Pass fetchers.fetchById in service config.',\n        ERROR_CODES.CORE_OPERATION_FAILED\n      );\n    }\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeFetchById?.(id);\n\n      // 2. Call fetcher\n      const response = await this.config.fetchers.fetchById(String(id), options);\n\n      if (!this.isResponseSuccess(response)) {\n        const extractedError = this.extractResponseError(response);\n        const errorMessage =\n          extractedError instanceof Error ? extractedError.message : String(extractedError ?? '');\n        // Return null for 404 (not found)\n        if (\n          errorMessage.includes('404') ||\n          (response as Record<string, unknown>).status === HTTP_STATUS.NOT_FOUND\n        ) {\n          return null;\n        }\n        throw new CorePackageError('Failed to fetch entity', ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n          context: { operation: 'fetchById', entityId: String(id) },\n          cause: extractedError instanceof Error ? extractedError : undefined,\n          details: extractedError,\n        });\n      }\n\n      // 3. Unwrap and map DTO to domain entity\n      const rawData = this.unwrapResponseData<TResponseDTO>(response.data);\n      const entity = rawData ? this.mapper.toDomain(rawData) : null;\n\n      // 4. Lifecycle hook\n      if (entity) {\n        await this.afterFetchById?.(entity);\n      }\n\n      // Record success metrics\n      await this.recordOperationMetrics('fetchById', Date.now() - startTime, true);\n\n      return entity;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('fetchById', Date.now() - startTime, false);\n\n      const pkgError = this.wrapError(error, 'fetchById', { entityId: String(id) });\n      throw pkgError;\n    }\n  }\n\n  /**\n   * Create new entity\n   *\n   * Flow:\n   * 1. Assert service is ready\n   * 2. Check fetcher is available\n   * 3. Set stores loading\n   * 4. Emit 'creating' event\n   * 5. Lifecycle hook: beforeCreate\n   * 6. Map input data to create DTO (if mapper available)\n   * 7. [Optimistic] Save state and add to store BEFORE API call\n   * 8. Call create fetcher (from @plyaz/api)\n   * 9. Map response DTO to domain entity\n   * 10. [Optimistic] Resolve conflicts if needed\n   * 11. Lifecycle hook: afterCreate\n   * 12. Emit 'created' event\n   * 13. Return entity\n   *\n   * @param data - Create data (can be partial domain entity or DTO)\n   * @param options - Optional service options for fetcher\n   * @returns Created entity\n   * @throws CorePackageError if fetcher not configured or creation fails\n   */\n  // eslint-disable-next-line complexity, max-lines-per-function\n  async create<TInput = unknown, TOptions = unknown>(\n    data: TInput,\n    options?: TOptions\n  ): Promise<TEntity> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    if (!this.config.fetchers?.create) {\n      throw new CorePackageError(\n        'create fetcher not configured. Pass fetchers.create in service config.',\n        ERROR_CODES.CORE_OPERATION_FAILED\n      );\n    }\n\n    const isOptimistic = this.isOptimisticEnabled('create');\n\n    this.setStoresLoading(true);\n    this.emitEvent('creating', {\n      request: data,\n    } satisfies CoreEntityCreatingPayload<TInput>);\n\n    // Save state for rollback if optimistic\n    if (isOptimistic) {\n      this.saveStateForRollback('create');\n    }\n\n    // Create optimistic entity for immediate UI update\n    let optimisticEntity: TEntity | null = null;\n    let optimisticStoreState: TStoreState | null = null;\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeCreate?.(data);\n\n      // 2. Map to DTO if mapper available (optional - data might already be DTO)\n      const createDTO = this.mapper?.toCreateDTO\n        ? this.mapper.toCreateDTO(data as Partial<TEntity>)\n        : (data as unknown as TCreateDTO);\n\n      // 3. [Optimistic] Add to store BEFORE API call\n      if (isOptimistic) {\n        // Create a temporary entity for optimistic display\n        optimisticEntity = {\n          ...(data as object),\n          id: `temp-${Date.now()}`, // Temporary ID\n          _optimistic: true,\n        } as TEntity;\n        optimisticStoreState = this.addEntityToStore(optimisticEntity);\n\n        this.emitEvent('optimistic:create', {\n          entity: optimisticEntity,\n          storeState: optimisticStoreState,\n        } as Record<string, unknown>);\n      }\n\n      // 4. Call create fetcher\n      const response = await this.config.fetchers.create(createDTO, options);\n\n      if (!this.isResponseSuccess(response)) {\n        const extractedError = this.extractResponseError(response);\n        const errorMessage =\n          extractedError instanceof Error\n            ? extractedError.message\n            : typeof extractedError === 'string'\n              ? extractedError\n              : 'Failed to create entity';\n        throw new CorePackageError(errorMessage, ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n          context: { operation: 'create' },\n          cause: extractedError instanceof Error ? extractedError : undefined,\n          details: extractedError,\n        });\n      }\n\n      // 5. Unwrap and map response to domain entity\n      const rawData = this.unwrapResponseData<TResponseDTO>(response.data);\n      const entity = this.mapper.toDomain(rawData);\n\n      // 6. Update store with real entity (replaces optimistic if used)\n      let storeState: TStoreState;\n      if (isOptimistic && optimisticEntity) {\n        // Remove optimistic entity and add real one\n        const tempId = (optimisticEntity as { id?: string }).id;\n        if (tempId) {\n          this.removeEntityFromStore(tempId);\n        }\n        storeState = this.addEntityToStore(entity);\n        this.clearRollbackState('create');\n      } else {\n        storeState = this.addEntityToStore(entity);\n      }\n\n      // 7. Lifecycle hook\n      await this.afterCreate?.(entity);\n\n      // 8. Emit created event (reuse storeState from sync)\n      this.emitEvent('created', {\n        entity,\n        storeState,\n      } satisfies CoreEntityCreatedPayload<TEntity, TStoreState>);\n\n      this.emitEvent('complete', {\n        success: true,\n      } satisfies CoreEntityCompletePayload);\n\n      // Record success metrics\n      await this.recordOperationMetrics('create', Date.now() - startTime, true);\n\n      this.logInfo('Entity created', { entityId: (entity as { id?: string }).id });\n      return entity;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('create', Date.now() - startTime, false);\n\n      // Rollback on error if optimistic\n      if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n        this.rollbackState('create', error instanceof Error ? error : new Error(String(error)));\n      }\n\n      const pkgError = this.wrapError(error, 'create');\n      // Errors thrown to global error handler - not set on individual stores\n      this.emitEvent('create:error', {\n        error: pkgError,\n      } satisfies CoreEntityErrorPayload);\n      throw pkgError;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  /**\n   * Update entity (partial update - PATCH)\n   *\n   * @param id - Entity ID\n   * @param data - Partial update data\n   * @param options - Optional service options for fetcher\n   * @returns Updated entity\n   * @throws CorePackageError if fetcher not configured or update fails\n   */\n  // eslint-disable-next-line complexity, max-lines-per-function\n  async update<TInput = unknown, TOptions = unknown>(\n    id: string,\n    data: TInput,\n    options?: TOptions\n  ): Promise<TEntity> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    if (!this.config.fetchers?.update) {\n      throw new CorePackageError(\n        'update fetcher not configured. Pass fetchers.update in service config.',\n        ERROR_CODES.CORE_OPERATION_FAILED\n      );\n    }\n\n    const isOptimistic = this.isOptimisticEnabled('update');\n\n    this.setStoresLoading(true);\n    this.emitEvent('patching', {\n      id,\n      request: data,\n    } satisfies CoreEntityPatchingPayload<TInput>);\n\n    // Save state for rollback if optimistic\n    if (isOptimistic) {\n      this.saveStateForRollback('update');\n    }\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeUpdate?.(id, data);\n\n      // 2. Map to DTO if mapper available\n      const patchDTO = this.mapper?.toPatchDTO\n        ? this.mapper.toPatchDTO(data as Partial<TEntity>)\n        : (data as unknown as TPatchDTO);\n\n      // 3. [Optimistic] Update store BEFORE API call\n      let optimisticStoreState: TStoreState | null = null;\n      if (isOptimistic) {\n        // Create optimistic entity with merged data\n        const optimisticEntity = {\n          id,\n          ...(data as object),\n          _optimistic: true,\n        } as TEntity;\n        optimisticStoreState = this.updateEntityInStore(id, optimisticEntity);\n\n        this.emitEvent('optimistic:update', {\n          id,\n          entity: optimisticEntity,\n          storeState: optimisticStoreState,\n        } as Record<string, unknown>);\n      }\n\n      // 4. Call update fetcher\n      const response = await this.config.fetchers.update({ id, data: patchDTO }, options);\n\n      if (!this.isResponseSuccess(response)) {\n        const extractedError = this.extractResponseError(response);\n        const errorMessage =\n          extractedError instanceof Error\n            ? extractedError.message\n            : typeof extractedError === 'string'\n              ? extractedError\n              : 'Failed to update entity';\n        throw new CorePackageError(errorMessage, ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n          context: { operation: 'update', entityId: id },\n          cause: extractedError instanceof Error ? extractedError : undefined,\n          details: extractedError,\n        });\n      }\n\n      // 5. Unwrap and map response to domain entity\n      const rawData = this.unwrapResponseData<TResponseDTO>(response.data);\n      const serverEntity = this.mapper.toDomain(rawData);\n\n      // 6. Resolve conflicts and update store with final entity\n      let finalEntity = serverEntity;\n      if (isOptimistic && optimisticStoreState) {\n        // Resolve any conflicts between optimistic and server response\n        finalEntity = this.resolveConflict({ id, ...(data as object) } as TEntity, serverEntity);\n        this.clearRollbackState('update');\n      }\n\n      // 7. Update in store with final entity\n      const storeState = this.updateEntityInStore(id, finalEntity);\n\n      // 8. Lifecycle hook\n      await this.afterUpdate?.(id, finalEntity);\n\n      // 9. Emit updated event (reuse storeState from sync)\n      this.emitEvent('patched', {\n        entity: finalEntity,\n        storeState,\n      } satisfies CoreEntityPatchedPayload<TEntity, TStoreState>);\n\n      this.emitEvent('complete', {\n        success: true,\n        entityId: id,\n      } satisfies CoreEntityCompletePayload);\n\n      // Record success metrics\n      await this.recordOperationMetrics('patch', Date.now() - startTime, true);\n\n      this.logInfo('Entity updated', { entityId: id });\n      return finalEntity;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('patch', Date.now() - startTime, false);\n\n      // Rollback on error if optimistic\n      if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n        this.rollbackState('update', error instanceof Error ? error : new Error(String(error)));\n      }\n\n      const pkgError = this.wrapError(error, 'update', { entityId: id });\n      // Errors thrown to global error handler - not set on individual stores\n      this.emitEvent('update:error', {\n        error: pkgError,\n        entityId: id,\n      } satisfies CoreEntityErrorPayload);\n      throw pkgError;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  /**\n   * Delete entity\n   *\n   * @param id - Entity ID\n   * @param options - Optional service options for fetcher\n   * @returns Delete operation result (type specified by TDeleteResult generic)\n   * @throws CorePackageError if fetcher not configured or deletion fails\n   */\n  // eslint-disable-next-line complexity\n  async delete<TInput = string, TOptions = unknown>(\n    id: TInput,\n    options?: TOptions\n  ): Promise<TDeleteResult> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    if (!this.config.fetchers?.delete) {\n      throw new CorePackageError(\n        'delete fetcher not configured. Pass fetchers.delete in service config.',\n        ERROR_CODES.CORE_OPERATION_FAILED\n      );\n    }\n\n    const isOptimistic = this.isOptimisticEnabled('delete');\n\n    this.setStoresLoading(true);\n    this.emitEvent('deleting', {\n      id: String(id),\n    } satisfies CoreEntityDeletingPayload);\n\n    // Save state for rollback if optimistic\n    if (isOptimistic) {\n      this.saveStateForRollback('delete');\n    }\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeDelete?.(id);\n\n      // 2. [Optimistic] Remove from store BEFORE API call\n      if (isOptimistic) {\n        this.removeEntityFromStore(String(id));\n\n        this.emitEvent('optimistic:delete', {\n          id: String(id),\n        } as Record<string, unknown>);\n      }\n\n      // 3. Call delete fetcher\n      const response = await this.config.fetchers.delete(String(id), options);\n\n      if (!this.isResponseSuccess(response)) {\n        const extractedError = this.extractResponseError(response);\n        const errorMessage =\n          extractedError instanceof Error\n            ? extractedError.message\n            : typeof extractedError === 'string'\n              ? extractedError\n              : 'Failed to delete entity';\n        throw new CorePackageError(errorMessage, ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n          context: { operation: 'delete', entityId: String(id) },\n          cause: extractedError instanceof Error ? extractedError : undefined,\n          details: extractedError,\n        });\n      }\n\n      // 4. Remove from store (if not already done optimistically)\n      if (!isOptimistic) {\n        this.removeEntityFromStore(String(id));\n      } else {\n        this.clearRollbackState('delete');\n      }\n\n      // 5. Lifecycle hook\n      await this.afterDelete?.(id);\n\n      // 6. Emit deleted event\n      this.emitEvent('deleted', {\n        id: String(id),\n        soft: false,\n      } satisfies CoreEntityDeletedPayload);\n\n      this.emitEvent('complete', {\n        success: true,\n        entityId: String(id),\n      } satisfies CoreEntityCompletePayload);\n\n      // Record success metrics\n      await this.recordOperationMetrics('delete', Date.now() - startTime, true);\n\n      this.logInfo('Entity deleted', { entityId: String(id) });\n\n      // 7. Return delete result\n      return response.data as TDeleteResult;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('delete', Date.now() - startTime, false);\n\n      // Rollback on error if optimistic\n      if (isOptimistic && this.optimisticConfig?.rollbackOnError !== false) {\n        this.rollbackState('delete', error instanceof Error ? error : new Error(String(error)));\n      }\n\n      const pkgError = this.wrapError(error, 'delete', { entityId: String(id) });\n      // Errors thrown to global error handler - not set on individual stores\n      this.emitEvent('delete:error', {\n        error: pkgError,\n        entityId: String(id),\n      } satisfies CoreEntityErrorPayload);\n      throw pkgError;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Event Emission (Protected - for subclasses)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Emit event with automatic prefix\n   * Uses CoreEventManager under the hood\n   *\n   * @param event - Event name (without prefix)\n   * @param payload - Event payload\n   *\n   * @example\n   * ```typescript\n   * // If eventPrefix is 'example', this emits 'example:created'\n   * this.emitEvent('created', { entity, storeState });\n   * ```\n   */\n  protected emitEvent<TPayload extends BaseFrontendEventPayload>(\n    event: string,\n    payload: TPayload\n  ): void {\n    const eventName = `${this.eventPrefix}:${event}`;\n    CoreEventManager.emit(eventName, payload);\n    this.logDebug(`Event emitted: ${eventName}`, payload as unknown as Record<string, unknown>);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Lifecycle Hooks (Optional - Override in subclasses)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Called before fetchAll API call\n   * Override to add custom logic (e.g., cache check, validate query)\n   *\n   * @param query - Optional query/filter parameters\n   */\n  protected beforeFetchAll?(query?: Partial<TQueryDTO>): Promise<void>;\n\n  /**\n   * Called after fetchAll success\n   * Override to add custom logic (e.g., cache set, transform entities)\n   *\n   * @param entities - Fetched entities\n   * @param query - Optional query/filter parameters that were used\n   */\n  protected afterFetchAll?(entities: TEntity[], query?: Partial<TQueryDTO>): Promise<void>;\n\n  /**\n   * Called before fetchById API call\n   */\n  protected beforeFetchById?<TInput>(id: TInput): Promise<void>;\n\n  /**\n   * Called after fetchById success\n   */\n  protected afterFetchById?(entity: TEntity): Promise<void>;\n\n  /**\n   * Called before create API call\n   * Use this to modify data or validate before sending to API\n   */\n  protected beforeCreate?<TInput>(data: TInput): Promise<void>;\n\n  /**\n   * Called after create success\n   * Use this to update stores, show notifications, etc.\n   */\n  protected afterCreate?(entity: TEntity): Promise<void>;\n\n  /**\n   * Called before update API call\n   */\n  protected beforeUpdate?<TInput>(id: string, data: TInput): Promise<void>;\n\n  /**\n   * Called after update success\n   */\n  protected afterUpdate?(id: string, entity: TEntity): Promise<void>;\n\n  /**\n   * Called before delete API call\n   */\n  protected beforeDelete?<TInput>(id: TInput): Promise<void>;\n\n  /**\n   * Called after delete success\n   */\n  protected afterDelete?<TInput>(id: TInput): Promise<void>;\n\n  /**\n   * Called before OPTIONS request\n   *\n   * Use for custom logic before checking allowed methods/CORS headers.\n   *\n   * @param resource - Optional resource identifier or URL\n   */\n  protected beforeOptions?<TInput>(resource?: TInput): Promise<void>;\n\n  /**\n   * Called after OPTIONS request success\n   *\n   * Use for processing allowed methods/headers or logging.\n   *\n   * @param resource - Optional resource identifier or URL\n   * @param result - The OPTIONS response (allowed methods, CORS headers, etc.)\n   */\n  protected afterOptions?<TInput>(resource: TInput | undefined, result: unknown): Promise<void>;\n\n  /**\n   * Called before HEAD request\n   *\n   * Use for custom logic before checking resource existence/headers.\n   *\n   * @param resource - Optional resource identifier or URL\n   */\n  protected beforeHead?<TInput>(resource?: TInput): Promise<void>;\n\n  /**\n   * Called after HEAD request success\n   *\n   * Use for processing response headers or logging.\n   * Note: HEAD requests return no body, only headers.\n   *\n   * @param resource - Optional resource identifier or URL\n   * @param headers - Response headers (if available)\n   */\n  protected afterHead?<TInput>(resource: TInput | undefined, headers?: unknown): Promise<void>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Polling (Generic Feature)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if polling is currently active.\n   */\n  get isPolling(): boolean {\n    return this._pollingTimer !== null;\n  }\n\n  /**\n   * Start polling for updates.\n   * Uses provided interval, falls back to `config.pollingInterval`, then DEFAULT_POLLING_INTERVAL_MS (30s).\n   * Polling calls fetchAll() at the configured interval.\n   *\n   * Override in subclass for custom polling behavior.\n   *\n   * @param intervalMs - Optional polling interval in milliseconds. Overrides config.pollingInterval.\n   *\n   * @example\n   * ```typescript\n   * // Start polling with default/config interval\n   * service.startPolling();\n   *\n   * // Start polling with custom interval (5 seconds)\n   * service.startPolling(5000);\n   *\n   * // Or override in subclass for custom behavior\n   * startPolling(intervalMs?: number): void {\n   *   super.startPolling(intervalMs);\n   *   // Custom polling logic\n   * }\n   * ```\n   */\n  startPolling(intervalMs?: number): void {\n    if (this._pollingTimer) return;\n\n    // Priority: provided interval > config.pollingInterval > default (30s)\n    // Use || instead of ?? because pollingInterval may be 0 (meaning \"use default\")\n    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n    const interval = intervalMs || this.config.pollingInterval || DEFAULT_POLLING_INTERVAL_MS;\n    this._pollingTimer = setInterval(() => {\n      this.fetchAll().catch(error => {\n        this.logError('Polling fetch failed', { error });\n      });\n    }, interval);\n\n    this.logDebug('Polling started', { interval });\n  }\n\n  /**\n   * Stop polling.\n   * Safe to call even if polling is not active.\n   */\n  stopPolling(): void {\n    if (this._pollingTimer) {\n      clearInterval(this._pollingTimer);\n      this._pollingTimer = null;\n      this.logDebug('Polling stopped');\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Lifecycle Management\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Dispose service and cleanup resources.\n   * Stops polling and performs base cleanup.\n   *\n   * Subclasses should override and call super.dispose() to ensure cleanup.\n   *\n   * @example\n   * ```typescript\n   * dispose(): void {\n   *   // Custom cleanup\n   *   this.customCleanup();\n   *   // Always call super\n   *   super.dispose();\n   * }\n   * ```\n   */\n  dispose(): void {\n    this.stopPolling();\n    this.unregisterAllStreamHandlers();\n    this.logInfo('Service disposed');\n  }\n\n  /**\n   * Check if service is available.\n   * Override in subclass for custom availability checks.\n   *\n   * @returns true if service is enabled and in a browser environment\n   */\n  isAvailable(): boolean {\n    return this.isServiceEnabled && typeof window !== 'undefined';\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Error Handling Helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Wrap error in CorePackageError with context\n   *\n   * @param error - Original error\n   * @param operation - Operation that failed\n   * @param context - Additional context\n   * @returns Wrapped error\n   */\n  protected wrapError(\n    error: unknown,\n    operation: string,\n    context?: Record<string, unknown>\n  ): CorePackageError {\n    // If already a package error (BaseError subclass), return as-is\n    if (error instanceof BaseError) {\n      return error as CorePackageError;\n    }\n\n    // Wrap other errors in CorePackageError\n    return new CorePackageError(\n      error instanceof Error ? error.message : 'An unexpected error occurred',\n      ERROR_CODES.CONTEXT_OPERATION_FAILED,\n      {\n        context: { operation, ...context },\n        cause: error instanceof Error ? error : undefined,\n      }\n    );\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Observability Helper Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Track a frontend operation with observability (span + metrics).\n   * Wraps an operation with automatic span creation, duration recording, and error tracking.\n   *\n   * @param operation - Operation name (fetchAll, fetchById, create, delete)\n   * @param entityId - Optional entity ID for context\n   * @param fn - The operation function to execute\n   * @returns Result of the operation\n   *\n   * @example\n   * ```typescript\n   * const entity = await this.trackOperation('create', undefined, async () => {\n   *   return await this.config.fetchers.create(data);\n   * });\n   * ```\n   */\n  protected async trackOperation<T>(\n    operation: 'fetchAll' | 'fetchById' | 'create' | 'patch' | 'delete',\n    entityId: string | undefined,\n    fn: () => Promise<T>\n  ): Promise<T> {\n    const startTime = Date.now();\n    const spanName = `${this.eventPrefix}.${operation}`;\n\n    return this.withSpan(spanName, async span => {\n      if (entityId) {\n        span.setAttribute('entity.id', entityId);\n      }\n      span.setAttribute('service.name', this.serviceName);\n      span.setAttribute('operation.name', operation);\n\n      try {\n        const result = await fn();\n\n        // Record success metrics\n        const duration = Date.now() - startTime;\n        await this.recordOperationMetrics(operation, duration, true);\n\n        span.setStatus('ok');\n        return result;\n      } catch (error) {\n        // Record error metrics\n        const duration = Date.now() - startTime;\n        await this.recordOperationMetrics(operation, duration, false);\n\n        span.recordException(error as Error);\n        span.setStatus('error', (error as Error).message);\n        throw error;\n      }\n    });\n  }\n\n  /**\n   * Record operation metrics (duration and count).\n   * Protected to allow subclasses to record metrics for custom operations.\n   */\n  protected async recordOperationMetrics(\n    operation: string,\n    duration: number,\n    success: boolean\n  ): Promise<void> {\n    if (!this.hasObservability) return;\n\n    const tags = {\n      service: this.serviceName,\n      operation,\n      entity: this.eventPrefix,\n      runtime: 'frontend',\n    };\n\n    // Record duration\n    await this.recordMetric(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, tags);\n\n    // Record count\n    await this.incrementCounter(\n      success\n        ? OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT\n        : OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR,\n      1,\n      tags\n    );\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // File Upload (via backend API → @plyaz/storage)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Upload a file via backend API.\n   *\n   * Uses the uploadFile fetcher from @plyaz/api which calls POST /upload endpoint.\n   * On the backend, this uses @plyaz/storage for actual file operations.\n   *\n   * Supports multiple upload modes:\n   * - **Direct upload**: Provide `base64` content with `mimeType`\n   * - **Template generation**: Provide `templateId` with `templateData`\n   *\n   * @param data - Upload parameters (base64/templateId, category, entityType, entityId)\n   * @param options - Optional service options (apiConfig, etc.)\n   * @returns Promise resolving to upload result with file metadata and URL\n   */\n  async uploadFile(data: UploadFileRequest, options?: ServiceOptions): Promise<UploadFileResponse> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    this.setStoresLoading(true);\n    this.emitEvent('upload:uploading', { request: data });\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeUploadFile?.(data);\n\n      // 2. Call upload fetcher from @plyaz/api\n      // Uses default API client which has file endpoints registered\n      const response = await uploadFileFetcher(data, options);\n\n      // 3. Check response success\n      if (!this.isResponseSuccess(response)) {\n        const error = this.extractResponseError(response);\n        throw new CorePackageError('Failed to upload file', ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n          context: { operation: 'uploadFile' },\n          details: error,\n        });\n      }\n\n      // 4. Unwrap response\n      const result = this.unwrapResponseData<UploadFileResponse>(response.data);\n\n      // 5. Lifecycle hook\n      await this.afterUploadFile?.(result);\n\n      // 6. Emit success event\n      this.emitEvent('upload:uploaded', { result });\n\n      await this.recordOperationMetrics('uploadFile', Date.now() - startTime, true);\n      return result;\n    } catch (error) {\n      await this.recordOperationMetrics('uploadFile', Date.now() - startTime, false);\n      const pkgError = this.wrapError(error, 'uploadFile');\n      this.emitEvent('upload:error', { error: pkgError });\n      throw pkgError;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before file upload.\n   * Override in subclass for custom pre-upload logic.\n   */\n  protected beforeUploadFile?(data: UploadFileRequest): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after file upload.\n   * Override in subclass for custom post-upload logic.\n   */\n  protected afterUploadFile?(result: UploadFileResponse): Promise<void>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Bulk File Upload (via backend API → @plyaz/storage)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Upload multiple files via backend API.\n   *\n   * Uses the uploadFiles fetcher from @plyaz/api which calls POST /upload/bulk endpoint.\n   * On the backend, this uses @plyaz/storage for actual file operations.\n   *\n   * @param data - Upload parameters (files array with base64 content)\n   * @param options - Optional service options (apiConfig, etc.)\n   * @returns Promise resolving to bulk upload result with individual file results\n   */\n  async uploadFiles(\n    data: UploadFilesRequest,\n    options?: ServiceOptions\n  ): Promise<UploadFilesResponse> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    this.setStoresLoading(true);\n    this.emitEvent('upload:uploading', { request: data, bulk: true });\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeUploadFiles?.(data);\n\n      // 2. Call uploadFiles fetcher from @plyaz/api\n      const response = await uploadFilesFetcher(data, options);\n\n      // 3. Check response success\n      if (!this.isResponseSuccess(response)) {\n        const error = this.extractResponseError(response);\n        throw new CorePackageError('Failed to upload files', ERROR_CODES.CONTEXT_OPERATION_FAILED, {\n          context: { operation: 'uploadFiles' },\n          details: error,\n        });\n      }\n\n      // 4. Unwrap response\n      const result = this.unwrapResponseData<UploadFilesResponse>(response.data);\n\n      // 5. Lifecycle hook\n      await this.afterUploadFiles?.(result);\n\n      // 6. Emit success event\n      this.emitEvent('upload:uploaded', { result, bulk: true });\n\n      await this.recordOperationMetrics('uploadFiles', Date.now() - startTime, true);\n      return result;\n    } catch (error) {\n      await this.recordOperationMetrics('uploadFiles', Date.now() - startTime, false);\n      const pkgError = this.wrapError(error, 'uploadFiles');\n      this.emitEvent('upload:error', { error: pkgError, bulk: true });\n      throw pkgError;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before bulk file upload.\n   * Override in subclass for custom pre-upload logic.\n   */\n  protected beforeUploadFiles?(data: UploadFilesRequest): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after bulk file upload.\n   * Override in subclass for custom post-upload logic.\n   */\n  protected afterUploadFiles?(result: UploadFilesResponse): Promise<void>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Document Generation (via backend API → @plyaz/storage)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Generate a document via backend API (NO upload - returns buffer).\n   *\n   * Uses the generateDocument fetcher from @plyaz/api which calls POST /generate-document.\n   * On the backend, this uses @plyaz/storage template engine.\n   * Returns the document as base64 buffer. Use uploadFile() for generation + upload.\n   *\n   * @param data - Generation parameters (templateId, templateData, outputFormat, etc.)\n   * @param options - Optional service options (apiConfig, etc.)\n   * @returns Promise resolving to generation result { buffer, size }\n   */\n  async generateFile(\n    data: GenerateDocumentRequest,\n    options?: ServiceOptions\n  ): Promise<GenerateDocumentResponse> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    this.setStoresLoading(true);\n    this.emitEvent('document:generating', { request: data });\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeGenerateFile?.(data);\n\n      // 2. Call generateDocument fetcher from @plyaz/api\n      // Uses default API client which has file endpoints registered\n      const response = await generateDocumentFetcher(data, options);\n\n      // 3. Check response success\n      if (!this.isResponseSuccess(response)) {\n        const error = this.extractResponseError(response);\n        throw new CorePackageError(\n          'Failed to generate document',\n          ERROR_CODES.CONTEXT_OPERATION_FAILED,\n          { context: { operation: 'generateFile' }, details: error }\n        );\n      }\n\n      // 4. Unwrap response\n      const result = this.unwrapResponseData<GenerateDocumentResponse>(response.data);\n\n      // 5. Lifecycle hook\n      await this.afterGenerateFile?.(result);\n\n      // 6. Emit success event (include request for store to build GeneratedFileItem)\n      this.emitEvent('document:generated', { result, request: data });\n\n      await this.recordOperationMetrics('generateFile', Date.now() - startTime, true);\n      return result;\n    } catch (error) {\n      await this.recordOperationMetrics('generateFile', Date.now() - startTime, false);\n      const pkgError = this.wrapError(error, 'generateFile');\n      this.emitEvent('document:error', { error: pkgError });\n      throw pkgError;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before document generation.\n   * Override in subclass for custom pre-generation logic.\n   */\n  protected beforeGenerateFile?(data: GenerateDocumentRequest): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after document generation.\n   * Override in subclass for custom post-generation logic.\n   */\n  protected afterGenerateFile?(result: GenerateDocumentResponse): Promise<void>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Real-Time Streaming (via Stream Store)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get the stream store slice for real-time streaming.\n   * Used for subscribing to channels, registering handlers, and accessing stream state.\n   *\n   * @returns Stream store slice or undefined if not available\n   */\n  protected get streamStore(): StreamStoreSlice | undefined {\n    // Access stream slice directly from root store (it's a global slice like errors)\n    return this.getStore('stream' as keyof RootStoreSlice) as StreamStoreSlice | undefined;\n  }\n\n  /**\n   * Check if stream store is available.\n   */\n  protected get hasStreamStore(): boolean {\n    return !!this.streamStore;\n  }\n\n  /**\n   * Subscribe to a stream channel for real-time updates.\n   * Typically used for entity-specific progress (e.g., upload progress for a file).\n   *\n   * @param channel - Channel to subscribe to (e.g., 'upload:abc123')\n   *\n   * @example\n   * ```typescript\n   * // Subscribe to upload progress for a specific file\n   * this.subscribeToChannel(`upload:${fileId}`);\n   *\n   * // Subscribe to all uploads broadcast channel\n   * this.subscribeToChannel('uploads');\n   * ```\n   */\n  protected subscribeToChannel(channel: StreamChannel): void {\n    if (!this.streamStore) {\n      this.logWarn('Stream store not available, cannot subscribe to channel', { channel });\n      return;\n    }\n    this.streamStore.subscribeToChannel(channel);\n    this.logDebug('Subscribed to stream channel', { channel });\n  }\n\n  /**\n   * Subscribe to multiple stream channels at once.\n   *\n   * @param channels - Array of channels to subscribe to\n   */\n  protected subscribeToChannels(channels: StreamChannel[]): void {\n    if (!this.streamStore) {\n      this.logWarn('Stream store not available, cannot subscribe to channels', { channels });\n      return;\n    }\n    this.streamStore.subscribeToChannels(channels);\n    this.logDebug('Subscribed to stream channels', { channels });\n  }\n\n  /**\n   * Unsubscribe from a stream channel.\n   *\n   * @param channel - Channel to unsubscribe from\n   */\n  protected unsubscribeFromChannel(channel: StreamChannel): void {\n    if (!this.streamStore) return;\n    this.streamStore.unsubscribeFromChannel(channel);\n    this.logDebug('Unsubscribed from stream channel', { channel });\n  }\n\n  /**\n   * Subscribe to entity-specific progress channel.\n   * Convenience method that constructs the channel name from prefix and entity ID.\n   *\n   * @param prefix - Channel prefix (e.g., 'upload', 'download', 'generate')\n   * @param entityId - Entity ID (e.g., file ID)\n   *\n   * @example\n   * ```typescript\n   * // Subscribe to upload progress for file 'abc123'\n   * this.subscribeToEntityProgress('upload', 'abc123');\n   * // Subscribes to channel: 'upload:abc123'\n   * ```\n   */\n  protected subscribeToEntityProgress(prefix: string, entityId: string): void {\n    this.subscribeToChannel(`${prefix}:${entityId}` as StreamChannel);\n  }\n\n  /**\n   * Register a message handler for this domain.\n   * The handler will receive stream messages matching the specified filters.\n   *\n   * @param handler - Handler function to process stream messages\n   * @param options - Handler options (channels, events, priority)\n   * @returns Handler ID (use for unregistering)\n   *\n   * @example\n   * ```typescript\n   * // Register handler for upload progress\n   * const handlerId = this.registerStreamHandler(\n   *   (message) => {\n   *     if (message.event === 'upload:progress') {\n   *       this.updateUploadProgress(message.data);\n   *     }\n   *   },\n   *   {\n   *     channels: ['upload:'],\n   *     events: ['upload:progress', 'upload:completed', 'upload:failed'],\n   *   }\n   * );\n   * ```\n   */\n  protected registerStreamHandler<T = unknown>(\n    handler: StreamMessageHandler<T>,\n    options?: {\n      channels?: string[];\n      events?: string[];\n      priority?: number;\n    }\n  ): string {\n    if (!this.streamStore) {\n      this.logWarn('Stream store not available, cannot register handler');\n      return '';\n    }\n\n    // Generate unique handler ID based on service name\n    const handlerId = `${this.serviceName}-${Date.now()}`;\n    this.streamStore.registerHandler(handlerId, handler, options);\n\n    // Track for auto-cleanup on dispose\n    this._registeredStreamHandlerIds.add(handlerId);\n\n    this.logDebug('Registered stream handler', { handlerId, options });\n    return handlerId;\n  }\n\n  /**\n   * Unregister a stream message handler.\n   *\n   * @param handlerId - Handler ID returned by registerStreamHandler\n   */\n  protected unregisterStreamHandler(handlerId: string): void {\n    if (!this.streamStore || !handlerId) return;\n    this.streamStore.unregisterHandler(handlerId);\n\n    // Remove from tracking Set\n    this._registeredStreamHandlerIds.delete(handlerId);\n\n    this.logDebug('Unregistered stream handler', { handlerId });\n  }\n\n  /**\n   * Unregister all stream handlers registered by this service.\n   * Called automatically by dispose(), but can be called manually if needed.\n   */\n  protected unregisterAllStreamHandlers(): void {\n    if (!this.streamStore || this._registeredStreamHandlerIds.size === 0) return;\n\n    this._registeredStreamHandlerIds.forEach(handlerId => {\n      this.streamStore?.unregisterHandler(handlerId);\n    });\n\n    const count = this._registeredStreamHandlerIds.size;\n    this._registeredStreamHandlerIds.clear();\n\n    this.logDebug('Unregistered all stream handlers', { count });\n  }\n\n  /**\n   * Get stream messages filtered by domain scope.\n   * Convenience method that filters messages for this service's event prefix.\n   *\n   * @param filter - Additional filter criteria\n   * @returns Filtered stream messages\n   *\n   * @example\n   * ```typescript\n   * // Get recent upload progress messages for this domain\n   * const messages = this.getDomainStreamMessages({\n   *   subtype: 'upload',\n   *   limit: 10,\n   * });\n   * ```\n   */\n  protected getDomainStreamMessages(filter?: StreamMessageFilter): unknown[] {\n    if (!this.streamStore) return [];\n    // Filter by domain scope (uses eventPrefix as scope)\n    return this.streamStore.getMessages({\n      ...filter,\n      scope: this.eventPrefix as StreamMessageFilter['scope'],\n    });\n  }\n\n  /**\n   * Check if connected to stream server.\n   */\n  protected get isStreamConnected(): boolean {\n    return this.streamStore?.connected ?? false;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Stream Handler Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get the stream store from Core.rootStore.\n   * Used by static methods that don't have access to instance.\n   */\n  protected static getStreamStore(): StreamStoreSlice | undefined {\n    try {\n      return Core.rootStore?.getState().stream;\n    } catch {\n      return undefined;\n    }\n  }\n\n  /**\n   * Cleanup all stream handlers using STREAM_HANDLER_IDS.\n   * Called by the cleanup function returned from registerStreamHandlers().\n   *\n   * @param handlerIds - Object with handler IDs to unregister\n   * @param onComplete - Optional callback after cleanup\n   */\n  protected static cleanupStreamHandlers(\n    handlerIds: Record<string, string>,\n    onComplete?: () => void\n  ): void {\n    const store = this.getStreamStore();\n    if (store) {\n      Object.values(handlerIds).forEach(handlerId => {\n        store.unregisterHandler(handlerId);\n      });\n    }\n    this._streamHandlersRegistered = false;\n    onComplete?.();\n  }\n\n  /**\n   * Register stream handlers from STREAM_HANDLERS declarative config.\n   *\n   * Call this from your registerStreamHandlers() override to auto-register\n   * all handlers defined in STREAM_HANDLERS.\n   *\n   * @param handlers - Array of handler declarations (defaults to this.STREAM_HANDLERS)\n   * @param verbose - Enable verbose logging\n   *\n   * @example\n   * ```typescript\n   * static override registerStreamHandlers(verbose?: boolean): () => void {\n   *   if (this._streamHandlersRegistered) return () => {};\n   *\n   *   // Auto-register from declarative config\n   *   this.registerStreamHandlersFromConfig(this.STREAM_HANDLERS, verbose);\n   *\n   *   // Optional: Add any custom logic here\n   *\n   *   this._streamHandlersRegistered = true;\n   *   return () => this.cleanupStreamHandlers(this.STREAM_HANDLER_IDS);\n   * }\n   * ```\n   */\n  protected static registerStreamHandlersFromConfig(\n    handlers: CoreStreamHandlerDeclaration[],\n    verbose?: boolean\n  ): void {\n    const streamStore = this.getStreamStore();\n    if (!streamStore) return;\n\n    // Store getter for handlers\n    const getStore: CoreStreamStoreGetter = () => {\n      try {\n        return Core.rootStore?.getState();\n      } catch {\n        return undefined;\n      }\n    };\n\n    const DEFAULT_HANDLER_PRIORITY = 100;\n    handlers.forEach(config => {\n      streamStore.registerHandler(config.id, message => config.handler(message, getStore), {\n        channels: config.channels,\n        events: config.events,\n        priority: config.priority ?? DEFAULT_HANDLER_PRIORITY,\n      });\n\n      if (verbose) {\n        logger.debug(`[StreamHandler] Registered: ${config.id}`, {\n          channels: config.channels,\n          events: config.events,\n        });\n      }\n    });\n  }\n\n  /**\n   * Register stream handlers for this domain service.\n   *\n   * Subclasses should override this static method to register their stream handlers.\n   * Use STREAM_HANDLER_IDS to define handler IDs and cleanupStreamHandlers() for cleanup.\n   *\n   * @param _verbose - Enable verbose logging\n   * @returns Cleanup function to unregister all handlers\n   *\n   * @example\n   * ```typescript\n   * class MyDomainService extends BaseFrontendDomainService<...> {\n   *   protected static readonly STREAM_HANDLER_IDS = {\n   *     MY_EVENT: 'my-domain:my-event',\n   *   } as const;\n   *\n   *   static override registerStreamHandlers(verbose?: boolean): () => void {\n   *     if (this._streamHandlersRegistered) return () => {};\n   *\n   *     const streamStore = this.getStreamStore();\n   *     if (!streamStore) return () => {};\n   *\n   *     streamStore.registerHandler<MyEventType>(\n   *       this.STREAM_HANDLER_IDS.MY_EVENT,\n   *       (message) => { // Handle message.data (typed!)  },\n   *       { channels: ['my-channel'], events: ['my-event'] }\n   *     );\n   *\n   *     this._streamHandlersRegistered = true;\n   *     return () => this.cleanupStreamHandlers(this.STREAM_HANDLER_IDS);\n   *   }\n   * }\n   * ```\n   */\n  static registerStreamHandlers(verbose?: boolean): () => void {\n    // Skip if already registered\n    if (this._streamHandlersRegistered) {\n      if (verbose) {\n        logger.debug(`[${this.name}] Stream handlers already registered`);\n      }\n      return () => {};\n    }\n\n    // Skip if no handlers defined\n    if (!this.STREAM_HANDLERS || this.STREAM_HANDLERS.length === 0) {\n      return () => {};\n    }\n\n    // Get stream store\n    const streamStore = this.getStreamStore();\n    if (!streamStore) {\n      if (verbose) {\n        logger.warn(`[${this.name}] Stream store not available, skipping stream handlers`);\n      }\n      return () => {};\n    }\n\n    // Auto-register from declarative config\n    this.registerStreamHandlersFromConfig(this.STREAM_HANDLERS, verbose);\n\n    this._streamHandlersRegistered = true;\n\n    if (verbose) {\n      logger.info(`[${this.name}] Stream handlers registered`, {\n        handlers: Object.values(this.STREAM_HANDLER_IDS),\n      });\n    }\n\n    // Return cleanup function\n    return () => {\n      this.cleanupStreamHandlers(this.STREAM_HANDLER_IDS, () => {\n        if (verbose) {\n          logger.debug(`[${this.name}] Stream handlers unregistered`);\n        }\n      });\n    };\n  }\n}\n","/**\n * Backend Event Persistence Handler\n *\n * Scalable pattern for handling event-to-DB persistence.\n * Registers event handlers that persist data to the database when events fire.\n *\n * Features:\n * - Dynamic repository and mapper loading (avoids circular deps)\n * - Deduplication via unique constraints\n * - Bulk event support\n * - Configurable per-domain\n *\n * @example\n * ```typescript\n * // Register file upload persistence\n * BackendEventPersistenceHandler.register({\n *   domain: 'files',\n *   events: {\n *     'files:upload:uploaded': {\n *       extractPayload: (p) => p.result,\n *       isBulk: false,\n *     },\n *     'files:upload:bulk:uploaded': {\n *       extractPayload: (p) => p.result?.results ?? [],\n *       isBulk: true,\n *     },\n *   },\n *   loadDependencies: async () => ({\n *     repository: FilesRepository.create(),\n *     mapper: FilesMapper,\n *   }),\n *   mapToDbRow: (mapper, item) => mapper.toDbRow(item),\n * });\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CoreEventManager } from './CoreEventManager';\nimport type { DomainPersistenceConfig, PersistOperationConfig } from '@plyaz/types/core';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'EventPersistence' });\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Handler Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Backend Event Persistence Handler\n *\n * Manages event subscriptions for persisting data to the database.\n * Provides a scalable, reusable pattern for all domains.\n */\nexport class BackendEventPersistenceHandler {\n  private static registeredDomains = new Map<string, () => void>();\n  private static cleanupFns: Array<() => void> = [];\n\n  /**\n   * Register event persistence for a domain\n   */\n  static register<TRepository, TMapper, TItem, TDbRow>(\n    config: DomainPersistenceConfig<TRepository, TMapper, TItem, TDbRow>\n  ): void {\n    const { domain, events, loadDependencies, mapToDbRow, createRecord, getUniqueKey, verbose } =\n      config;\n\n    // Prevent duplicate registration\n    if (this.registeredDomains.has(domain)) {\n      logger.warn(`Domain '${domain}' already registered for event persistence`);\n      return;\n    }\n\n    logger.info(`Registering event persistence for domain: ${domain}`);\n\n    // Register handlers for each event\n    for (const [eventName, eventConfig] of Object.entries(events)) {\n      const cleanup = CoreEventManager.on(eventName, async (payload: unknown) => {\n        try {\n          const { repository, mapper } = await loadDependencies();\n          const extracted = eventConfig.extractPayload(payload);\n\n          if (!extracted) {\n            if (verbose) {\n              logger.debug(`Event ${eventName}: No payload extracted, skipping`);\n            }\n            return;\n          }\n\n          const persistConfig: PersistOperationConfig<TRepository, TMapper, TItem, TDbRow> = {\n            repository,\n            mapper,\n            mapToDbRow,\n            createRecord,\n            validate: eventConfig.validate as ((item: TItem) => boolean) | undefined,\n            getUniqueKey,\n            eventName,\n            verbose,\n          };\n\n          if (eventConfig.isBulk) {\n            // Handle bulk items\n            const items = Array.isArray(extracted) ? extracted : [extracted];\n            await this.persistBulk(items as TItem[], persistConfig);\n          } else {\n            // Handle single item\n            await this.persistSingle(extracted as TItem, persistConfig);\n          }\n        } catch (error) {\n          logger.error(`Event ${eventName}: Persistence failed`, { error, payload });\n        }\n      });\n\n      this.cleanupFns.push(cleanup);\n    }\n\n    // Store cleanup function for this domain\n    this.registeredDomains.set(domain, () => {\n      logger.info(`Unregistering event persistence for domain: ${domain}`);\n    });\n  }\n\n  /**\n   * Persist a single item to the database\n   */\n  // eslint-disable-next-line complexity\n  private static async persistSingle<TRepository, TMapper, TItem, TDbRow>(\n    item: TItem,\n    config: PersistOperationConfig<TRepository, TMapper, TItem, TDbRow>\n  ): Promise<void> {\n    const {\n      repository,\n      mapper,\n      mapToDbRow,\n      createRecord,\n      validate,\n      getUniqueKey,\n      eventName,\n      verbose,\n    } = config;\n\n    // Validate if validator provided\n    if (validate && !validate(item)) {\n      if (verbose) {\n        logger.debug(`Event ${eventName}: Item failed validation, skipping`);\n      }\n      return;\n    }\n\n    const dbRow = mapToDbRow(mapper, item);\n\n    try {\n      await createRecord(repository, dbRow);\n      if (verbose) {\n        const key = getUniqueKey?.(item) ?? 'unknown';\n        logger.debug(`Event ${eventName}: Persisted item (key: ${key})`);\n      }\n    } catch (err) {\n      // Handle duplicate key errors gracefully\n      if (this.isDuplicateError(err)) {\n        const key = getUniqueKey?.(item) ?? 'unknown';\n        if (verbose) {\n          logger.debug(`Event ${eventName}: Item already exists (key: ${key}), skipping`);\n        }\n        return;\n      }\n      throw err;\n    }\n  }\n\n  /**\n   * Persist multiple items to the database\n   */\n  // eslint-disable-next-line complexity\n  private static async persistBulk<TRepository, TMapper, TItem, TDbRow>(\n    items: TItem[],\n    config: PersistOperationConfig<TRepository, TMapper, TItem, TDbRow>\n  ): Promise<void> {\n    const {\n      repository,\n      mapper,\n      mapToDbRow,\n      createRecord,\n      validate,\n      getUniqueKey,\n      eventName,\n      verbose,\n    } = config;\n    if (items.length === 0) {\n      if (verbose) {\n        logger.debug(`Event ${eventName}: No items to persist`);\n      }\n      return;\n    }\n\n    let persisted = 0;\n    let skipped = 0;\n    let failed = 0;\n\n    for (const item of items) {\n      // Validate if validator provided\n      if (validate && !validate(item)) {\n        skipped++;\n        continue;\n      }\n\n      try {\n        const dbRow = mapToDbRow(mapper, item);\n        await createRecord(repository, dbRow);\n        persisted++;\n      } catch (err) {\n        if (this.isDuplicateError(err)) {\n          skipped++;\n        } else {\n          failed++;\n          const key = getUniqueKey?.(item) ?? 'unknown';\n          logger.error(`Event ${eventName}: Failed to persist item (key: ${key})`, { error: err });\n        }\n      }\n    }\n\n    logger.info(\n      `Event ${eventName}: Bulk persist complete - persisted: ${persisted}, skipped: ${skipped}, failed: ${failed}`\n    );\n  }\n\n  /**\n   * Check if error is a duplicate key/unique constraint error\n   */\n  private static isDuplicateError(err: unknown): boolean {\n    if (!(err instanceof Error)) return false;\n    const message = err.message.toLowerCase();\n    return (\n      message.includes('duplicate') ||\n      message.includes('unique') ||\n      message.includes('already exists') ||\n      message.includes('conflict')\n    );\n  }\n\n  /**\n   * Unregister all event persistence handlers\n   */\n  static unregisterAll(): void {\n    for (const cleanup of this.cleanupFns) {\n      cleanup();\n    }\n    this.cleanupFns = [];\n    this.registeredDomains.clear();\n    logger.info('All event persistence handlers unregistered');\n  }\n\n  /**\n   * Check if a domain is registered\n   */\n  static isRegistered(domain: string): boolean {\n    return this.registeredDomains.has(domain);\n  }\n\n  /**\n   * Get list of registered domains\n   */\n  static getRegisteredDomains(): string[] {\n    return Array.from(this.registeredDomains.keys());\n  }\n}\n","/**\n * Frontend Event Persistence Handler\n *\n * Simple, scalable pattern for handling domain events to update frontend store.\n *\n * Features:\n * - Event-driven store updates (works from ANY service via CoreEventManager)\n * - Registration-based (prevents duplicate handlers)\n * - Safe for SSR (store getter called per event)\n * - Proper cleanup tracking\n *\n * @example\n * ```typescript\n * FrontendEventPersistenceHandler.register<FilesFrontendStoreSlice, FilesUploadEventPayload>({\n *   domain: 'files',\n *   events: {\n *     'files:upload:uploading': {\n *       handler: (store) => store.setUploading(true),\n *     },\n *     'files:upload:uploaded': {\n *       handler: (store, payload) => {\n *         store.setUploading(false);\n *         if (payload.result) {\n *           store.addUpload(FilesMapper.toDomain(payload.result));\n *         }\n *       },\n *     },\n *     'files:upload:error': {\n *       handler: (store) => store.setUploading(false),\n *     },\n *   },\n *   getStore: () => Core._rootStore?.getState().files,\n * });\n * ```\n */\n\nimport { PackageLogger } from '@plyaz/logger';\nimport { CoreEventManager } from './CoreEventManager';\nimport type {\n  DomainFrontendEventConfig,\n  CoreEvent,\n  FrontendEventHandlerConfig,\n} from '@plyaz/types/core';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'FrontendEventPersistence' });\n\n/**\n * Frontend Event Persistence Handler\n *\n * Manages event subscriptions for updating frontend store state.\n * Provides a scalable, reusable pattern for all domains.\n */\nexport class FrontendEventPersistenceHandler {\n  private static registeredDomains = new Map<string, () => void>();\n  private static cleanupFns: Array<() => void> = [];\n\n  /**\n   * Register event handlers for a domain\n   *\n   * @typeParam TStore - Store slice type\n   * @typeParam TPayload - Event payload type\n   * @param config - Domain event configuration\n   */\n  static register<TStore, TPayload = unknown>(\n    config: DomainFrontendEventConfig<TStore, TPayload>\n  ): void {\n    const { domain, events, getStore, verbose } = config;\n\n    // Prevent duplicate registration\n    if (this.registeredDomains.has(domain)) {\n      logger.warn(`Domain '${domain}' already registered for frontend event handling`);\n      return;\n    }\n\n    if (verbose) {\n      logger.info(`Registering frontend event handling for domain: ${domain}`);\n    }\n\n    // Register handlers for each event\n    for (const [eventName, eventConfig] of Object.entries(events)) {\n      const typedConfig = eventConfig as FrontendEventHandlerConfig<TStore, TPayload>;\n\n      const cleanup = CoreEventManager.on<TPayload>(eventName, (event: CoreEvent<TPayload>) => {\n        void (async () => {\n          try {\n            const store = getStore();\n\n            if (!store) {\n              if (verbose) {\n                logger.debug(`Event ${eventName}: Store not available, skipping`);\n              }\n              return;\n            }\n\n            await typedConfig.handler(store, event.data);\n\n            if (verbose) {\n              logger.debug(`Event ${eventName}: Handler executed`);\n            }\n          } catch (error) {\n            logger.error(`Event ${eventName}: Handler failed`, { error, event });\n          }\n        })();\n      });\n\n      this.cleanupFns.push(cleanup);\n    }\n\n    // Store cleanup function for this domain\n    this.registeredDomains.set(domain, () => {\n      if (verbose) {\n        logger.info(`Unregistering frontend event handling for domain: ${domain}`);\n      }\n    });\n  }\n\n  /**\n   * Unregister all event handlers\n   */\n  static unregisterAll(): void {\n    for (const cleanup of this.cleanupFns) {\n      cleanup();\n    }\n    this.cleanupFns = [];\n    this.registeredDomains.clear();\n    logger.info('All frontend event handlers unregistered');\n  }\n\n  /**\n   * Check if a domain is registered\n   */\n  static isRegistered(domain: string): boolean {\n    return this.registeredDomains.has(domain);\n  }\n\n  /**\n   * Get list of registered domains\n   */\n  static getRegisteredDomains(): string[] {\n    return Array.from(this.registeredDomains.keys());\n  }\n}\n","/**\n * Events Module Exports\n *\n * Type-safe event system with enums, constants, and typed payloads.\n *\n * @example\n * ```typescript\n * import { CoreEventManager, CORE_EVENTS, CoreEventScope } from '@plyaz/core/events';\n *\n * // Type-safe emission (automatic with CORE_EVENTS)\n * CoreEventManager.emit(CORE_EVENTS.AUTH.LOGIN, {\n *   userId: '123',\n *   method: 'email',\n * });\n *\n * // Type-safe subscription (automatic with CORE_EVENTS)\n * CoreEventManager.on(CORE_EVENTS.AUTH.LOGIN, (event) => {\n *   console.log(event.data.userId); // Typed!\n * });\n *\n * // Custom events with explicit type\n * CoreEventManager.emit<MyPayload>('custom:event', { custom: 'data' });\n * ```\n */\nexport { CoreEventManager } from './CoreEventManager';\nexport { BackendEventPersistenceHandler } from './BackendEventPersistenceHandler';\nexport { FrontendEventPersistenceHandler } from './FrontendEventPersistenceHandler';\n\n// Streaming module (SSE/WebSocket real-time events)\nexport * from './streaming';\n\n// Re-export all event types from @plyaz/types for convenience\nexport type {\n  // Backend event persistence types\n  EventPersistenceConfig,\n  DomainPersistenceConfig,\n\n  // Frontend event persistence types\n  FrontendEventHandlerConfig,\n  DomainFrontendEventConfig,\n  CoreEventPayloadMap,\n  CoreEventType,\n  CoreEventScopeType,\n  // Payload types\n  CoreSystemInitializedPayload,\n  CoreSystemReadyPayload,\n  CoreSystemShutdownPayload,\n  CoreSystemErrorPayload,\n  CoreSystemWarningPayload,\n  CoreApiRequestStartPayload,\n  CoreApiRequestSuccessPayload,\n  CoreApiRequestErrorPayload,\n  CoreApiRetryPayload,\n  CoreApiTimeoutPayload,\n  CoreCacheHitPayload,\n  CoreCacheMissPayload,\n  CoreCacheSetPayload,\n  CoreCacheDeletePayload,\n  CoreCacheClearPayload,\n  CoreCacheExpiredPayload,\n  CoreAuthLoginPayload,\n  CoreAuthLogoutPayload,\n  CoreAuthTokenRefreshPayload,\n  CoreAuthSessionExpiredPayload,\n  CoreAuthUnauthorizedPayload,\n  CoreFeatureFlagChangedPayload,\n  CoreFeatureFlagEvaluatedPayload,\n  CoreFeatureFlagRefreshedPayload,\n  CoreStoreUpdatedPayload,\n  CoreStoreResetPayload,\n  CoreStoreHydratedPayload,\n  CoreEntityCreatedPayload,\n  CoreEntityUpdatedPayload,\n  CoreEntityDeletedPayload,\n  CoreValidationStartedPayload,\n  CoreValidationSuccessPayload,\n  CoreValidationFailedPayload,\n} from '@plyaz/types/core';\n","/* eslint-disable no-undef */\n/**\n * Memory Cache Strategy\n *\n * In-memory cache implementation for fast local caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Memory cache strategy implementation\n * @version 1.0.0\n */\n\nimport type { CacheStrategy, CacheEntry, CacheStats, MemoryCacheConfig } from '@plyaz/types';\nimport { CACHE_MAX_SIZE_DEFAULT, CACHE_CLEANUP_INTERVAL_DEFAULT } from '@plyaz/config';\n\n/**\n * In-memory cache strategy implementation.\n * Provides fast caching for single-instance applications.\n *\n * @class MemoryCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new MemoryCacheStrategy({\n *   maxEntries: 500,\n *   cleanupInterval: 30000\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class MemoryCacheStrategy implements CacheStrategy {\n  private cache = new Map<string, CacheEntry>();\n  private accessOrder = new Map<string, number>();\n  private stats = {\n    hits: 0,\n    misses: 0,\n    sets: 0,\n    deletes: 0,\n  };\n  private cleanupTimer?: NodeJS.Timeout;\n  private readonly maxSize: number;\n  private readonly cleanupInterval: number;\n  private readonly onEvict?: (key: string, entry: CacheEntry) => void;\n\n  /**\n   * Creates a new memory cache strategy.\n   *\n   * @param config - Memory cache configuration\n   */\n  constructor(config: MemoryCacheConfig = {}) {\n    const defaultConfig = {\n      maxEntries: CACHE_MAX_SIZE_DEFAULT,\n      cleanupInterval: CACHE_CLEANUP_INTERVAL_DEFAULT,\n    };\n\n    this.maxSize = config.maxSize ?? config.maxEntries ?? defaultConfig.maxEntries;\n    this.cleanupInterval = config.cleanupInterval ?? defaultConfig.cleanupInterval;\n    this.onEvict = config.onEvict;\n\n    // Start cleanup timer\n    this.startCleanup();\n  }\n\n  /**\n   * Stores a cache entry in memory.\n   *\n   * @param key - Cache key\n   * @param entry - Cache entry to store\n   * @returns Promise that resolves when entry is stored\n   */\n  async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n    // If maxSize is 0, don't store anything\n    if (this.maxSize === 0) {\n      this.stats.sets++;\n      return;\n    }\n\n    // Check if we need to evict entries to make room\n    // Only evict if this is a new key and we're at capacity\n    if (!this.cache.has(key) && this.cache.size >= this.maxSize) {\n      this.evictOldestEntries();\n    }\n\n    this.cache.set(key, entry);\n    this.accessOrder.set(key, Date.now());\n    this.stats.sets++;\n  }\n\n  /**\n   * Retrieves a cache entry from memory.\n   *\n   * @param key - Cache key\n   * @returns Promise that resolves to cache entry or null if not found\n   */\n  async get<T>(key: string): Promise<CacheEntry<T> | null> {\n    const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n\n    if (!entry) {\n      this.stats.misses++;\n      return null;\n    }\n\n    // Update access time for LRU\n    this.accessOrder.set(key, Date.now());\n    this.stats.hits++;\n    return entry;\n  }\n\n  /**\n   * Removes a cache entry from memory.\n   *\n   * @param key - Cache key to remove\n   * @returns Promise that resolves when entry is removed\n   */\n  async delete(key: string): Promise<void> {\n    this.cache.delete(key);\n    this.accessOrder.delete(key);\n    this.stats.deletes++;\n  }\n\n  /**\n   * Clears all cache entries from memory.\n   *\n   * @returns Promise that resolves when cache is cleared\n   */\n  async clear(): Promise<void> {\n    this.cache.clear();\n    this.accessOrder.clear();\n    this.stats.hits = 0;\n    this.stats.misses = 0;\n    this.stats.sets = 0;\n    this.stats.deletes = 0;\n  }\n\n  /**\n   * Gets cache statistics.\n   *\n   * @returns Promise that resolves to cache statistics\n   */\n  async getStats(): Promise<CacheStats> {\n    const totalRequests = this.stats.hits + this.stats.misses;\n    const hitRatio = totalRequests > 0 ? this.stats.hits / totalRequests : 0;\n\n    return {\n      hits: this.stats.hits,\n      misses: this.stats.misses,\n      sets: this.stats.sets,\n      deletes: this.stats.deletes,\n      size: this.cache.size,\n      hitRatio,\n    };\n  }\n\n  /**\n   * Disposes of the memory cache and cleans up resources.\n   *\n   * @returns Promise that resolves when cleanup is complete\n   */\n  async dispose(): Promise<void> {\n    if (this.cleanupTimer) {\n      clearInterval(this.cleanupTimer);\n      this.cleanupTimer = undefined;\n    }\n\n    await this.clear();\n  }\n\n  /**\n   * Starts the periodic cleanup of expired entries.\n   *\n   * @private\n   */\n  private startCleanup(): void {\n    this.cleanupTimer = setInterval(() => {\n      this.cleanupExpiredEntries();\n    }, this.cleanupInterval);\n\n    if (this.cleanupTimer && typeof this.cleanupTimer.unref === 'function') {\n      this.cleanupTimer.unref();\n    }\n  }\n\n  /**\n   * Removes expired entries from the cache.\n   *\n   * @private\n   */\n  private cleanupExpiredEntries(): void {\n    const now = Date.now();\n    const expiredKeys: string[] = [];\n\n    for (const [key, entry] of Array.from(this.cache.entries())) {\n      if (now > entry.expiresAt) {\n        expiredKeys.push(key);\n      }\n    }\n\n    for (const key of expiredKeys) {\n      const entry = this.cache.get(key);\n      this.cache.delete(key);\n      this.accessOrder.delete(key);\n      if (entry && this.onEvict) {\n        this.onEvict(key, entry);\n      }\n    }\n  }\n\n  /**\n   * Evicts the oldest entries when cache is full.\n   * Uses LRU-like eviction by removing the oldest entries by creation time.\n   *\n   * @private\n   */\n  private evictOldestEntries(): void {\n    if (this.maxSize === 0) {\n      // If maxSize is 0, don't store anything\n      this.cache.clear();\n      this.accessOrder.clear();\n      return;\n    }\n\n    const EVICTION_PERCENTAGE = 0.1; // Evict 10% of entries\n    const entriesToEvict = Math.max(1, Math.ceil(this.maxSize * EVICTION_PERCENTAGE));\n\n    // Sort by access time (LRU)\n    const sortedEntries = Array.from(this.accessOrder.entries())\n      .sort(([, timeA], [, timeB]) => timeA - timeB)\n      .slice(0, entriesToEvict);\n\n    for (const [key] of sortedEntries) {\n      const entry = this.cache.get(key);\n      this.cache.delete(key);\n      this.accessOrder.delete(key);\n      if (entry && this.onEvict) {\n        this.onEvict(key, entry);\n      }\n    }\n  }\n}\n","/**\n * Cache Key Builder Utility\n *\n * Provides standardized methods for building cache keys with consistent patterns.\n * All keys are designed to be prefixed by the service (handled by service layer).\n *\n * Key pattern: {prefix}:{type}:{identifier}:{params}\n * Example: \"example:entity:123\" or \"user:list:page:1\"\n *\n * @fileoverview Cache key building utilities\n */\n\n/**\n * Cache key builder for standardized cache key generation.\n *\n * All methods return un-prefixed keys that should be prefixed by the service layer.\n * This allows each service to namespace their cache keys.\n *\n * @example\n * ```typescript\n * // In a service with cachePrefix = 'user'\n * const key = CacheKeyBuilder.entity('123');\n * // Returns: \"entity:123\"\n * // After service prefixing: \"user:entity:123\"\n * ```\n */\nexport class CacheKeyBuilder {\n  /**\n   * Build cache key for a single entity by ID\n   *\n   * @param id - Entity ID\n   * @returns Cache key (unprefixed)\n   *\n   * @example\n   * ```typescript\n   * CacheKeyBuilder.entity('123')\n   * // Returns: \"entity:123\"\n   * // With prefix \"user\": \"user:entity:123\"\n   * ```\n   */\n  static entity(id: string): string {\n    return `entity:${id}`;\n  }\n\n  /**\n   * Build cache key for a list/collection query\n   *\n   * @param params - Query parameters (page, limit, filters, etc.)\n   * @returns Cache key (unprefixed)\n   *\n   * @example\n   * ```typescript\n   * CacheKeyBuilder.list({ page: 1, limit: 10 })\n   * // Returns: \"list:limit:10:page:1\"\n   * // With prefix: \"user:list:limit:10:page:1\"\n   *\n   * CacheKeyBuilder.list() // No params\n   * // Returns: \"list:all\"\n   * ```\n   */\n  static list(params?: Record<string, unknown>): string {\n    if (!params || Object.keys(params).length === 0) {\n      return 'list:all';\n    }\n\n    // Sort keys for deterministic cache keys\n    const sortedKeys = Object.keys(params).sort();\n    const keyParts = sortedKeys.map(k => `${k}:${JSON.stringify(params[k])}`);\n    return `list:${keyParts.join(':')}`;\n  }\n\n  /**\n   * Build cache key for a named query/filter\n   *\n   * @param queryName - Name of the query (e.g., 'active', 'byStatus', 'search')\n   * @param params - Query parameters\n   * @returns Cache key (unprefixed)\n   *\n   * @example\n   * ```typescript\n   * CacheKeyBuilder.query('active', { status: 'published' })\n   * // Returns: \"query:active:status:\\\"published\\\"\"\n   *\n   * CacheKeyBuilder.query('search', { q: 'hello', limit: 10 })\n   * // Returns: \"query:search:limit:10:q:\\\"hello\\\"\"\n   * ```\n   */\n  static query(queryName: string, params?: Record<string, unknown>): string {\n    if (!params || Object.keys(params).length === 0) {\n      return `query:${queryName}`;\n    }\n\n    const sortedKeys = Object.keys(params).sort();\n    const keyParts = sortedKeys.map(k => `${k}:${JSON.stringify(params[k])}`);\n    return `query:${queryName}:${keyParts.join(':')}`;\n  }\n\n  /**\n   * Build cache key for aggregate/count operations\n   *\n   * @param operation - Operation name (e.g., 'count', 'sum', 'avg')\n   * @param field - Field name (optional)\n   * @param params - Additional parameters (optional)\n   * @returns Cache key (unprefixed)\n   *\n   * @example\n   * ```typescript\n   * CacheKeyBuilder.aggregate('count')\n   * // Returns: \"aggregate:count\"\n   *\n   * CacheKeyBuilder.aggregate('sum', 'amount')\n   * // Returns: \"aggregate:sum:amount\"\n   *\n   * CacheKeyBuilder.aggregate('count', 'users', { status: 'active' })\n   * // Returns: \"aggregate:count:users:status:\\\"active\\\"\"\n   * ```\n   */\n  static aggregate(operation: string, field?: string, params?: Record<string, unknown>): string {\n    const baseParts = field ? [operation, field] : [operation];\n\n    if (!params || Object.keys(params).length === 0) {\n      return `aggregate:${baseParts.join(':')}`;\n    }\n\n    const sortedKeys = Object.keys(params).sort();\n    const paramParts = sortedKeys.map(k => `${k}:${JSON.stringify(params[k])}`);\n    return `aggregate:${baseParts.join(':')}:${paramParts.join(':')}`;\n  }\n\n  /**\n   * Build a custom cache key with type and identifier\n   *\n   * @param type - Cache key type\n   * @param identifier - Unique identifier for this cache entry\n   * @param params - Additional parameters (optional)\n   * @returns Cache key (unprefixed)\n   *\n   * @example\n   * ```typescript\n   * CacheKeyBuilder.custom('session', 'abc123')\n   * // Returns: \"session:abc123\"\n   *\n   * CacheKeyBuilder.custom('report', 'monthly', { year: 2025, month: 1 })\n   * // Returns: \"report:monthly:month:1:year:2025\"\n   * ```\n   */\n  static custom(type: string, identifier: string, params?: Record<string, unknown>): string {\n    if (!params || Object.keys(params).length === 0) {\n      return `${type}:${identifier}`;\n    }\n\n    const sortedKeys = Object.keys(params).sort();\n    const paramParts = sortedKeys.map(k => `${k}:${JSON.stringify(params[k])}`);\n    return `${type}:${identifier}:${paramParts.join(':')}`;\n  }\n}\n","/**\n * Redis Cache Strategy\n *\n * Redis-based cache implementation for distributed caching.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Redis cache strategy implementation\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport type { CacheStrategy, CacheEntry, CacheStats, RedisCacheConfig } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport type { Redis as IoRedisClientType } from 'ioredis';\n\n/**\n * Redis cache strategy implementation.\n * Provides distributed caching for multi-instance applications.\n *\n * @class RedisCacheStrategy\n * @implements {CacheStrategy}\n *\n * @example\n * ```typescript\n * const cache = new RedisCacheStrategy({\n *   url: 'redis://localhost:6379',\n *   keyPrefix: 'app:cache:'\n * });\n *\n * await cache.set('key', entry);\n * const cached = await cache.get('key');\n * ```\n */\nexport class RedisCacheStrategy implements CacheStrategy {\n  private client!: IoRedisClientType;\n  private stats = {\n    hitCount: 0,\n    missCount: 0,\n    setCount: 0,\n    deleteCount: 0,\n  };\n  private isConnected = false;\n  private readonly keyPrefix: string;\n\n  /**\n   * Creates a new Redis cache strategy.\n   *\n   * @param config - Redis cache configuration\n   */\n  constructor(private config: RedisCacheConfig) {\n    if (!config.url) {\n      throw new CorePackageError('Redis URL is required', ERROR_CODES.CLIENT_INVALID_CONFIG);\n    }\n    this.keyPrefix = config.keyPrefix ?? 'cache:';\n  }\n\n  /**\n   * Stores a cache entry in Redis.\n   *\n   * @param key - Cache key\n   * @param entry - Cache entry to store\n   * @returns Promise that resolves when entry is stored\n   */\n  async set<T>(key: string, entry: CacheEntry<T>): Promise<void> {\n    await this.ensureConnected();\n\n    const redisKey = this.buildRedisKey(key);\n    const serializedEntry = JSON.stringify(entry);\n\n    // Calculate TTL in seconds\n    const ttlMs = entry.expiresAt - Date.now();\n    const ttlSeconds = Math.max(1, Math.ceil(ttlMs / TIME_CONSTANTS.MILLISECONDS_PER_SECOND));\n\n    await this.client.set(redisKey, serializedEntry, 'EX', ttlSeconds);\n    this.stats.setCount++;\n  }\n\n  /**\n   * Retrieves a cache entry from Redis.\n   *\n   * @param key - Cache key\n   * @returns Promise that resolves to cache entry or null if not found\n   */\n  async get<T>(key: string): Promise<CacheEntry<T> | null> {\n    await this.ensureConnected();\n\n    const redisKey = this.buildRedisKey(key);\n    const serializedEntry = await this.client.get(redisKey);\n\n    if (!serializedEntry || typeof serializedEntry !== 'string') {\n      this.stats.missCount++;\n      return null;\n    }\n\n    try {\n      const entry = JSON.parse(serializedEntry) as CacheEntry<T>;\n      this.stats.hitCount++;\n      return entry;\n    } catch {\n      // Invalid JSON, remove the corrupted entry\n      await this.client.del(redisKey);\n      this.stats.missCount++;\n      return null;\n    }\n  }\n\n  /**\n   * Removes a cache entry from Redis.\n   *\n   * @param key - Cache key to remove\n   * @returns Promise that resolves when entry is removed\n   */\n  async delete(key: string): Promise<void> {\n    await this.ensureConnected();\n\n    const redisKey = this.buildRedisKey(key);\n    await this.client.del(redisKey);\n    this.stats.deleteCount++;\n  }\n\n  /**\n   * Clears all cache entries from Redis.\n   * This removes all keys with the configured prefix.\n   *\n   * @returns Promise that resolves when cache is cleared\n   */\n  async clear(): Promise<void> {\n    await this.ensureConnected();\n\n    const pattern = `${this.keyPrefix}*`;\n\n    const keys = await this.client.keys(pattern);\n    if (keys.length > 0) {\n      await this.client.del(...keys);\n    }\n\n    this.stats.hitCount = 0;\n    this.stats.missCount = 0;\n  }\n\n  /**\n   * Gets cache statistics.\n   *\n   * @returns Promise that resolves to cache statistics\n   */\n  async getStats(): Promise<CacheStats> {\n    await this.ensureConnected();\n\n    // Get approximate entry count\n    const pattern = `${this.keyPrefix}*`;\n    const keys = await this.client.keys(pattern);\n    const entryCount = Array.isArray(keys) ? keys.length : 0;\n\n    const totalRequests = this.stats.hitCount + this.stats.missCount;\n    const hitRatio = totalRequests > 0 ? this.stats.hitCount / totalRequests : 0;\n\n    return {\n      hits: this.stats.hitCount,\n      misses: this.stats.missCount,\n      sets: this.stats.setCount,\n      deletes: this.stats.deleteCount,\n      size: entryCount,\n      hitRatio,\n    };\n  }\n\n  /**\n   * Disposes of the Redis cache and cleans up resources.\n   *\n   * @returns Promise that resolves when cleanup is complete\n   */\n  async dispose(): Promise<void> {\n    if (this.client && this.isConnected) {\n      await this.client.quit();\n      this.isConnected = false;\n    }\n  }\n\n  /**\n   * Ensures Redis connection is established.\n   *\n   * @private\n   * @returns Promise that resolves when connected\n   */\n  private async ensureConnected(): Promise<void> {\n    if (this.isConnected) return;\n\n    try {\n      this.client = await this.createIoRedisClient();\n      this.isConnected = true;\n    } catch (error) {\n      throw new CorePackageError(\n        `Failed to connect to Redis: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        ERROR_CODES.DB_CONNECTION_FAILED\n      );\n    }\n  }\n\n  /**\n   * Creates an ioredis client.\n   *\n   * @private\n   * @returns Promise that resolves to ioredis client\n   */\n  private async createIoRedisClient(): Promise<IoRedisClientType> {\n    const DEFAULT_TIMEOUT = 5000;\n    const defaultOptions = {\n      connectTimeout: DEFAULT_TIMEOUT,\n      commandTimeout: DEFAULT_TIMEOUT,\n      enableOfflineQueue: false,\n    } satisfies {\n      connectTimeout: number;\n      commandTimeout: number;\n      enableOfflineQueue: boolean;\n    };\n\n    const Redis = await import('ioredis');\n    const client = new Redis.default(this.config.url, {\n      connectTimeout: this.config.connectTimeout ?? defaultOptions.connectTimeout,\n      commandTimeout: this.config.commandTimeout ?? defaultOptions.commandTimeout,\n      enableOfflineQueue: defaultOptions.enableOfflineQueue,\n    });\n\n    // Wait for connection\n    await new Promise((resolve, reject) => {\n      client.on('ready', resolve);\n      client.on('error', reject);\n    });\n\n    return client;\n  }\n\n  /**\n   * Builds a Redis key with the configured prefix.\n   *\n   * @private\n   * @param key - Base cache key\n   * @returns Redis key with prefix\n   */\n  private buildRedisKey(key: string): string {\n    return `${this.keyPrefix}${key}`;\n  }\n}\n","/**\n * Cache Manager - Core Caching Layer\n *\n * Main cache orchestration service that manages different caching strategies.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core caching infrastructure\n * @version 1.0.0\n */\n\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { MemoryCacheStrategy } from './strategies/memory';\nimport type { CacheStrategy, CacheConfig, CacheEntry, CacheManagerStats } from '@plyaz/types';\n\n/**\n * Cache manager that orchestrates different caching strategies.\n * Provides a unified interface for caching across the application.\n *\n * @class CacheManager\n *\n * @example\n * ```typescript\n * const cache = new CacheManager({\n *   isEnabled: true,\n *   ttl: 300,\n *   strategy: 'redis',\n *   redisConfig: { url: 'redis://localhost:6379' }\n * });\n *\n * await cache.set('key', value);\n * const cached = await cache.get('key');\n * ```\n */\nexport class CacheManager {\n  private strategy: CacheStrategy | null = null;\n  private strategyPromise: Promise<CacheStrategy> | null = null;\n\n  /**\n   * Creates a new cache manager with the specified configuration.\n   *\n   * @param config - Cache configuration\n   */\n  constructor(private config: CacheConfig) {\n    // Strategy is created lazily on first use\n  }\n\n  /**\n   * Gets the cache strategy, initializing it if needed.\n   * Uses lazy initialization to support dynamic imports for Redis.\n   */\n  private async getStrategy(): Promise<CacheStrategy> {\n    if (this.strategy) return this.strategy;\n    if (this.strategyPromise) return this.strategyPromise;\n\n    this.strategyPromise = this.createStrategy(this.config);\n    this.strategy = await this.strategyPromise;\n    return this.strategy;\n  }\n\n  /**\n   * Stores a value in the cache.\n   *\n   * @template T - Type of the value to cache\n   * @param key - Cache key\n   * @param value - Value to cache\n   * @param ttl - Optional TTL override in seconds\n   * @returns Promise that resolves when value is cached\n   */\n  async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n    if (!this.config.isEnabled) return;\n\n    const finalTtl = ttl ?? this.config.ttl;\n    const entry: CacheEntry<T> = {\n      data: value,\n      expiresAt: Date.now() + finalTtl * TIME_CONSTANTS.MILLISECONDS_PER_SECOND,\n      createdAt: Date.now(),\n    };\n\n    const strategy = await this.getStrategy();\n    await strategy.set(key, entry);\n  }\n\n  /**\n   * Retrieves a value from the cache.\n   *\n   * @template T - Expected type of the cached value\n   * @param key - Cache key\n   * @returns Promise that resolves to cached value or null if not found/expired\n   */\n  async get<T>(key: string): Promise<T | null> {\n    if (!this.config.isEnabled) return null;\n\n    const strategy = await this.getStrategy();\n    const entry = await strategy.get<T>(key);\n    if (!entry) return null;\n\n    // Check if entry has expired\n    if (Date.now() > entry.expiresAt) {\n      await strategy.delete(key);\n      return null;\n    }\n\n    return entry.data;\n  }\n\n  /**\n   * Removes a value from the cache.\n   *\n   * @param key - Cache key to remove\n   * @returns Promise that resolves when value is removed\n   */\n  async delete(key: string): Promise<void> {\n    if (!this.config.isEnabled) return;\n    const strategy = await this.getStrategy();\n    await strategy.delete(key);\n  }\n\n  /**\n   * Clears all cached values.\n   *\n   * @returns Promise that resolves when cache is cleared\n   */\n  async clear(): Promise<void> {\n    if (!this.config.isEnabled) return;\n    const strategy = await this.getStrategy();\n    await strategy.clear();\n  }\n\n  /**\n   * Checks if a key exists in the cache.\n   *\n   * @param key - Cache key to check\n   * @returns Promise that resolves to true if key exists and is not expired\n   */\n  async has(key: string): Promise<boolean> {\n    if (!this.config.isEnabled) return false;\n\n    const strategy = await this.getStrategy();\n    const entry = await strategy.get(key);\n    if (!entry) return false;\n\n    // Check if entry has expired\n    if (Date.now() > entry.expiresAt) {\n      await strategy.delete(key);\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Gets cache statistics.\n   *\n   * @returns Promise that resolves to cache statistics\n   */\n  async getStats(): Promise<CacheManagerStats> {\n    const strategy = await this.getStrategy();\n    return strategy.getStats();\n  }\n\n  /**\n   * Creates the appropriate cache strategy based on configuration.\n   * Uses dynamic import for Redis to avoid bundling ioredis in frontend.\n   *\n   * @private\n   * @param config - Cache configuration\n   * @returns Promise that resolves to cache strategy instance\n   */\n  private async createStrategy(config: CacheConfig): Promise<CacheStrategy> {\n    switch (config.strategy) {\n      case 'redis': {\n        if (!config.redisConfig) {\n          throw new CorePackageError(\n            'Redis configuration is required for Redis cache strategy',\n            ERROR_CODES.CLIENT_INVALID_CONFIG\n          );\n        }\n        // Dynamic import to avoid bundling ioredis in frontend builds\n        const { RedisCacheStrategy } = await import('./strategies/redis');\n        return new RedisCacheStrategy(config.redisConfig);\n      }\n\n      case 'memory':\n      default:\n        return new MemoryCacheStrategy(config.memoryConfig);\n    }\n  }\n\n  /**\n   * Disposes of the cache manager and cleans up resources.\n   *\n   * @returns Promise that resolves when cleanup is complete\n   */\n  async dispose(): Promise<void> {\n    if (this.strategy) {\n      await this.strategy.dispose?.();\n    }\n  }\n}\n\nexport { CacheKeyBuilder } from './CacheKeyBuilder';\n","/**\n * Base Backend Domain Service\n *\n * Extends BaseDomainService with common backend patterns:\n * - Automatic validation → mapper → repository → mapper flow\n * - Event emission throughout CRUD lifecycle\n * - Repository-based data access\n * - Configurable error throwing behavior\n * - Template methods with lifecycle hooks\n *\n * Backend domain services should extend this class to get automatic\n * CRUD operation handling with standardized validation, mapping, and events.\n *\n * Note: This class ONLY handles repository operations. If you need HTTP API\n * calls, import and use fetchers from `@plyaz/api` directly in your service.\n *\n * @example\n * ```typescript\n * import { BaseBackendDomainService } from '@plyaz/core/domain/base';\n * import type { BaseRepository } from '@plyaz/db';\n *\n * class MyBackendService extends BaseBackendDomainService<\n *   MyBackendServiceConfig,\n *   MyEntity,\n *   MyResponseDTO,\n *   CreateMyDTO,\n *   UpdateMyDTO,\n *   PatchMyDTO,\n *   QueryMyDTO,\n *   DeleteMyOptions,\n *   MyRepository,\n *   MyDatabaseRow,\n *   MyMapper,\n *   MyValidator\n * > {\n *   protected repository: MyRepository;\n *   protected eventPrefix = 'my-entity';\n *\n *   constructor(config: MyBackendServiceConfig) {\n *     super({\n *       serviceName: 'MyBackendService',\n *       supportedRuntimes: ['backend'],\n *       serviceConfig: config,\n *       mapperClass: MyMapperClass,\n *       validatorClass: MyValidatorClass,\n *     });\n *     this.repository = MyRepository.create();\n *   }\n * }\n * ```\n */\n\nimport { CoreEventManager } from '@/events';\nimport { CorePackageError } from '@plyaz/errors';\nimport { BaseDomainService } from './BaseDomainService';\nimport { type CacheManager, CacheKeyBuilder } from '@/base/cache';\nimport type { StreamChannel } from '@plyaz/types/core';\nimport { StreamRegistry } from '@/events/streaming/StreamRegistry';\nimport type {\n  CoreBaseBackendServiceConfig,\n  CoreBaseMapperInstance,\n  CoreBaseValidatorInstance,\n  CoreServiceCreateOptions,\n  CoreBaseServiceConfig,\n  CrudOperationOptions,\n  CoreStorageServiceInstance,\n  CoreNotificationServiceInstance,\n} from '@plyaz/types/core';\nimport { FILE_CATEGORY, ENTITY_TYPE } from '@plyaz/types/storage';\nimport type { UploadParams, UploadResult, GenerateFileParams } from '@plyaz/types/storage';\nimport type {\n  SendEmailParams,\n  NotificationResult,\n  NotificationResponse,\n} from '@plyaz/types/notifications';\nimport type {\n  DatabaseResult,\n  PaginatedResult,\n  QueryOptions,\n  OperationConfig,\n  TransactionFn,\n  TransactionOptions,\n} from '@plyaz/types/db';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport type {\n  CoreValidationStartedPayload,\n  CoreValidationSuccessPayload,\n  CoreValidationFailedPayload,\n  CoreSanitizationStartedPayload,\n  CoreSanitizationSuccessPayload,\n  CoreEntityCreatingPayload,\n  CoreEntityCreatedPayload,\n  CoreEntityPatchingPayload,\n  CoreEntityPatchedPayload,\n  CoreEntityDeletingPayload,\n  CoreEntityDeletedPayload,\n  CoreEntityErrorPayload,\n  CoreEntityCompletePayload,\n  // Generic operation payloads for storage/notification events\n  CoreOperationRequestPayload,\n  CoreOperationResultPayload,\n  CoreOperationErrorPayload,\n} from '@plyaz/types/core';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport { OBSERVABILITY_METRICS } from '@plyaz/types/observability';\n\n// Re-export types\nexport type { CoreBaseBackendServiceConfig } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Event Payload Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Union type of all event payloads used in BaseBackendDomainService.\n * Includes CRUD event payloads and generic storage/notification payloads.\n */\ntype BaseBackendEventPayload =\n  | CoreValidationStartedPayload\n  | CoreValidationSuccessPayload\n  | CoreValidationFailedPayload\n  | CoreSanitizationStartedPayload\n  | CoreSanitizationSuccessPayload\n  | CoreEntityCreatingPayload<unknown>\n  | CoreEntityCreatedPayload<unknown>\n  | CoreEntityPatchingPayload<unknown>\n  | CoreEntityPatchedPayload<unknown>\n  | CoreEntityDeletingPayload\n  | CoreEntityDeletedPayload\n  | CoreEntityErrorPayload\n  | CoreEntityCompletePayload\n  // Storage/notification operations use generic payloads\n  | CoreOperationRequestPayload\n  | CoreOperationResultPayload\n  | CoreOperationErrorPayload;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Abstract Base Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Abstract base class for backend domain services with automatic CRUD handling.\n *\n * Provides:\n * - Template methods for create/patch/delete/getById\n * - Automatic validation → mapper → repository → mapper flow\n * - Event emission throughout lifecycle\n * - Repository-based data access only\n * - Configurable error throwing\n * - Lifecycle hooks for customization\n *\n * @typeParam TConfig - Service configuration type\n * @typeParam TEntity - Domain entity type\n * @typeParam TResponseDTO - API response DTO type\n * @typeParam TCreateDTO - Create DTO type (POST)\n * @typeParam TUpdateDTO - Update DTO type (PUT)\n * @typeParam TPatchDTO - Patch DTO type (PATCH)\n * @typeParam TQueryDTO - Query DTO type for listing/filtering (defaults to Record<string, unknown>)\n * @typeParam TDeleteOptions - Delete options type\n * @typeParam TRepository - Repository type (must have create/update/delete/findById/findMany methods)\n * @typeParam TDatabaseRow - Database row type\n * @typeParam TStoreState - Store state type (serializable)\n * @typeParam TMapper - Mapper type\n * @typeParam TValidator - Validator type\n */\nexport abstract class BaseBackendDomainService<\n  TConfig extends CoreBaseBackendServiceConfig,\n  TEntity,\n  TResponseDTO,\n  // TCreateDTO must be an object so it can be used in DB transactions\n  TCreateDTO extends object,\n  TUpdateDTO extends object = TCreateDTO,\n  TPatchDTO extends Partial<object> = Partial<TCreateDTO>,\n  TQueryDTO extends object = object,\n  TDeleteOptions = { soft: boolean },\n  // TDatabaseRow should be compatible with TCreateDTO (create input becomes row output)\n  TDatabaseRow extends object = TCreateDTO & { id: string },\n  TRepository extends {\n    create(data: TCreateDTO): Promise<DatabaseResult<TDatabaseRow>>;\n    update(id: string, data: TPatchDTO): Promise<DatabaseResult<TDatabaseRow>>;\n    softDelete(id: string): Promise<DatabaseResult<void>>;\n    delete(id: string): Promise<DatabaseResult<void>>;\n    findById(id: string): Promise<DatabaseResult<TDatabaseRow | null>>;\n    findMany(\n      options?: QueryOptions<TDatabaseRow>,\n      config?: OperationConfig\n    ): Promise<DatabaseResult<PaginatedResult<TDatabaseRow>>>;\n    /** Get table name for transaction operations */\n    getTableName(): string;\n  } = never,\n  TStoreState = TEntity,\n  TMapper extends CoreBaseMapperInstance<\n    TEntity,\n    TResponseDTO,\n    TCreateDTO,\n    TUpdateDTO,\n    TPatchDTO,\n    unknown,\n    TStoreState\n  > = CoreBaseMapperInstance<\n    TEntity,\n    TResponseDTO,\n    TCreateDTO,\n    TUpdateDTO,\n    TPatchDTO,\n    unknown,\n    TStoreState\n  >,\n  TValidator extends CoreBaseValidatorInstance<\n    TCreateDTO,\n    TUpdateDTO,\n    TPatchDTO,\n    TDeleteOptions\n  > = CoreBaseValidatorInstance<TCreateDTO, TUpdateDTO, TPatchDTO, TDeleteOptions>,\n> extends BaseDomainService<TConfig, TMapper, TValidator> {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Abstract Properties - Must be implemented by subclasses\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Repository instance for database operations.\n   * Subclasses must initialize this in constructor.\n   */\n  protected abstract repository: TRepository;\n\n  /**\n   * Event prefix for event emission (e.g., 'example', 'user', 'product').\n   * Used to construct event names like '{prefix}:creating', '{prefix}:created'.\n   */\n  protected abstract eventPrefix: string;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Optional Properties - Can be overridden by subclasses\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Whether to use cache by default for all CRUD operations.\n   * Set from config.cache.enabled or defaults to true.\n   * Individual operations can override this via options.cache.useCache.\n   * Only applies if cacheManager is available.\n   */\n  protected useCacheByDefault: boolean;\n\n  /**\n   * Default TTL for cache entries (in seconds).\n   * Set from config.cache.defaultTtl or defaults to 300 (5 minutes).\n   */\n  protected defaultCacheTtl: number;\n\n  /**\n   * Storage service instance for file upload and document generation.\n   * Injected by ServiceRegistry, backend-only.\n   *\n   * Provides:\n   * - uploadFile() - Upload file (with optional template-based generation)\n   * - generateFile() - Generate document from template (returns Buffer)\n   * - downloadFile(), deleteFile(), getSignedUrl()\n   */\n  protected readonly storageService?: CoreStorageServiceInstance;\n\n  /**\n   * Notification service instance for email, SMS, push.\n   * Injected by ServiceRegistry, backend-only.\n   *\n   * Provides:\n   * - sendEmail() - Send email using templates\n   * - sendSMS() - Send SMS using templates\n   * - sendPush() - Send push notifications\n   */\n  protected readonly notificationsService?: CoreNotificationServiceInstance;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Configuration Getters\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if should throw on validation errors (default: true)\n   */\n  protected get throwOnValidationError(): boolean {\n    return this.config.throwOnValidationError ?? true;\n  }\n\n  /**\n   * Check if should throw on repository errors (default: true)\n   */\n  protected get throwOnRepositoryError(): boolean {\n    return this.config.throwOnRepositoryError ?? true;\n  }\n\n  /**\n   * Check if should emit events (default: true)\n   */\n  protected get emitEvents(): boolean {\n    return this.config.emitEvents ?? true;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Constructor\n  // ─────────────────────────────────────────────────────────────────────────\n\n  // eslint-disable-next-line complexity\n  constructor(baseConfig: CoreBaseServiceConfig<TConfig, TMapper, TValidator>) {\n    super(baseConfig);\n\n    // Initialize cache settings from config\n    const config = baseConfig.serviceConfig;\n    this.useCacheByDefault = config?.cache?.enabled ?? true;\n    this.defaultCacheTtl = config?.cache?.defaultTtl ?? TIME_CONSTANTS.DEFAULT_CACHE_TTL;\n\n    // Get storage and notifications services from injected services (backend-only)\n    this.storageService = baseConfig.injected?.storage as CoreStorageServiceInstance | undefined;\n    this.notificationsService = baseConfig.injected?.notifications as\n      | CoreNotificationServiceInstance\n      | undefined;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Public CRUD Methods (Template Pattern)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create a new entity (POST)\n   *\n   * Flow:\n   * 1. Assert service is ready\n   * 2. Emit validation:started event\n   * 3. Validate data using validator\n   * 4. Emit validation:success event\n   * 5. Emit sanitization:started event (Zod transforms already applied)\n   * 6. Map to create DTO using mapper\n   * 7. Emit creating event\n   * 8. Call repository.create()\n   * 9. Map response to domain entity\n   * 10. Cache the new entity (if enabled)\n   * 11. Emit created event\n   *\n   * @param data - Raw data to validate and create\n   * @param options - Operation options (cache, etc.)\n   * @returns Created entity\n   * @throws ValidationError[] if validation fails (array of errors)\n   * @throws CorePackageError if repository call fails\n   */\n  // eslint-disable-next-line complexity\n  async create<TInput = unknown>(data: TInput, options?: CrudOperationOptions): Promise<TEntity> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Creating entity', { data });\n\n    // 1. Validation phase\n    this.emitEvent('validation:started', {\n      operation: 'create',\n      data,\n    } satisfies CoreValidationStartedPayload);\n\n    let validatedData: TCreateDTO;\n    try {\n      validatedData = this.validator.validateCreateOrThrow(data);\n      this.emitEvent('validation:success', {\n        operation: 'create',\n        validatedData,\n      } satisfies CoreValidationSuccessPayload<TCreateDTO>);\n    } catch (error) {\n      this.emitEvent('validation:failed', {\n        error,\n        operation: 'create',\n      } satisfies CoreValidationFailedPayload);\n      throw error;\n    }\n\n    // 2. Sanitization phase (Zod transforms already applied)\n    this.emitEvent('sanitization:started', {\n      operation: 'create',\n      data: validatedData,\n    } satisfies CoreSanitizationStartedPayload);\n\n    // 3. Map to DTO (BEFORE insert)\n    const requestDTO = this.mapper.toCreateDTO!(validatedData as Partial<TEntity>);\n    this.emitEvent('sanitization:complete', {\n      operation: 'create',\n      sanitizedData: requestDTO,\n    } satisfies CoreSanitizationSuccessPayload<TCreateDTO>);\n\n    // 4. Lifecycle hook\n    await this.beforeCreate(requestDTO);\n\n    // 5. Emit creating event\n    this.emitEvent('creating', {\n      request: requestDTO,\n    } satisfies CoreEntityCreatingPayload<TCreateDTO>);\n\n    try {\n      // 6. Call repository\n      const result = await this.repository.create(requestDTO);\n\n      if (!result.success || !result.value) {\n        throw (\n          result.error ??\n          new CorePackageError('Failed to create entity', ERROR_CODES.CORE_OPERATION_FAILED)\n        );\n      }\n\n      // 7. Map response to domain (BEFORE return)\n      const responseDTO = this.mapper.toResponseDTO!(result.value);\n      const entity = this.mapper.toDomain(responseDTO);\n\n      // 8. Lifecycle hook\n      await this.afterCreate(entity);\n\n      // 9. Cache the new entity (if custom key provided in options)\n      const shouldCache = options?.cache?.useCache ?? this.useCacheByDefault;\n      if (shouldCache && this.hasCacheManager && options?.cache?.customKey) {\n        try {\n          const cacheTtl = options.cache.cacheTtl ?? this.defaultCacheTtl;\n          await this.cacheSet(options.cache.customKey, entity, cacheTtl);\n          this.logDebug('Cached new entity', {\n            cacheKey: this.buildCacheKey(options.cache.customKey),\n            ttl: cacheTtl,\n          });\n        } catch (error) {\n          this.logWarn('Failed to cache new entity', {\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n\n      // 10. Emit created event\n      const storeState = this.mapper.toStoreState(entity);\n      this.emitEvent('created', {\n        entity,\n        storeState,\n      } satisfies CoreEntityCreatedPayload<TEntity, TStoreState>);\n\n      this.emitEvent('complete', {\n        success: true,\n      } satisfies CoreEntityCompletePayload);\n\n      // Record success metrics\n      await this.recordOperationMetrics('create', Date.now() - startTime, true);\n\n      return entity;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('create', Date.now() - startTime, false);\n\n      this.emitEvent('error', {\n        error,\n      } satisfies CoreEntityErrorPayload);\n      throw error;\n    }\n  }\n\n  /**\n   * Patch an entity (PATCH - partial update)\n   *\n   * Flow similar to create but for partial updates\n   *\n   * @param id - Entity ID\n   * @param data - Raw data to validate and patch\n   * @param options - Operation options (cache, etc.)\n   * @returns Updated entity\n   * @throws ValidationError[] if validation fails\n   * @throws CorePackageError if repository call fails\n   */\n  // eslint-disable-next-line complexity\n  async patch<TInput = unknown>(\n    id: string,\n    data: TInput,\n    options?: CrudOperationOptions\n  ): Promise<TEntity> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Patching entity', { id, data });\n\n    // 1. Validation phase\n    this.emitEvent('validation:started', {\n      operation: 'patch',\n      entityId: id,\n      data,\n    } satisfies CoreValidationStartedPayload);\n\n    let validatedData: TPatchDTO;\n    try {\n      validatedData = this.validator.validatePatchOrThrow(data);\n      this.emitEvent('validation:success', {\n        operation: 'patch',\n        entityId: id,\n        validatedData,\n      } satisfies CoreValidationSuccessPayload<TPatchDTO>);\n    } catch (error) {\n      this.emitEvent('validation:failed', {\n        error,\n        entityId: id,\n        operation: 'patch',\n      } satisfies CoreValidationFailedPayload);\n      throw error;\n    }\n\n    // 2. Sanitization phase\n    this.emitEvent('sanitization:started', {\n      operation: 'patch',\n      entityId: id,\n      data: validatedData,\n    } satisfies CoreSanitizationStartedPayload);\n\n    // 3. Map to DTO\n    const requestDTO = this.mapper.toPatchDTO!(validatedData as Partial<TEntity>);\n    this.emitEvent('sanitization:complete', {\n      operation: 'patch',\n      entityId: id,\n      sanitizedData: requestDTO,\n    } satisfies CoreSanitizationSuccessPayload<TPatchDTO>);\n\n    // 4. Lifecycle hook\n    await this.beforePatch(id, requestDTO);\n\n    // 5. Emit updating event\n    this.emitEvent('patching', {\n      id,\n      request: requestDTO,\n    } satisfies CoreEntityPatchingPayload<TPatchDTO>);\n\n    try {\n      // 6. Call repository\n      const result = await this.repository.update(id, requestDTO);\n\n      if (!result.success || !result.value) {\n        throw (\n          result.error ??\n          new CorePackageError('Failed to update entity', ERROR_CODES.CORE_OPERATION_FAILED)\n        );\n      }\n\n      // 7. Map response to domain\n      const responseDTO = this.mapper.toResponseDTO!(result.value);\n      const entity = this.mapper.toDomain(responseDTO);\n\n      // 8. Lifecycle hook\n      await this.afterPatch(id, entity);\n\n      // 9. Invalidate cache for this entity (unless disabled)\n      const shouldInvalidate = options?.cache?.invalidateCache ?? true;\n      if (shouldInvalidate && this.hasCacheManager) {\n        try {\n          const cacheKey = options?.cache?.customKey ?? CacheKeyBuilder.entity(id);\n          await this.cacheDelete(cacheKey);\n          this.logDebug('Invalidated cache after patch', {\n            id,\n            cacheKey: this.buildCacheKey(cacheKey),\n          });\n        } catch (error) {\n          this.logWarn('Failed to invalidate cache after patch', {\n            id,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n\n      // 10. Emit updated event\n      const storeState = this.mapper.toStoreState(entity);\n      this.emitEvent('patched', {\n        entity,\n        storeState,\n      } satisfies CoreEntityPatchedPayload<TEntity, TStoreState>);\n\n      this.emitEvent('complete', {\n        success: true,\n        entityId: id,\n      } satisfies CoreEntityCompletePayload);\n\n      // Record success metrics\n      await this.recordOperationMetrics('patch', Date.now() - startTime, true);\n\n      return entity;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('patch', Date.now() - startTime, false);\n\n      this.emitEvent('error', {\n        error,\n        entityId: id,\n      } satisfies CoreEntityErrorPayload);\n      throw error;\n    }\n  }\n\n  /**\n   * Delete an entity (DELETE)\n   *\n   * @param id - Entity ID\n   * @param deleteOptions - Delete options (e.g., soft delete)\n   * @param crudOptions - CRUD operation options (cache, etc.)\n   * @returns void\n   * @throws ValidationError[] if options validation fails\n   * @throws CorePackageError if repository call fails\n   */\n  // eslint-disable-next-line complexity\n  async delete<TInput = TDeleteOptions>(\n    id: string,\n    deleteOptions?: TInput,\n    crudOptions?: CrudOperationOptions\n  ): Promise<void> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Deleting entity', { id, deleteOptions, crudOptions });\n\n    // 1. Validate options if provided\n    const validatedOptions = deleteOptions\n      ? this.validator.validateDeleteOrThrow(deleteOptions)\n      : this.getDefaultDeleteOptions();\n\n    // 2. Lifecycle hook\n    await this.beforeDelete(id, validatedOptions);\n\n    // 3. Emit deleting event\n    const isSoftDelete = (validatedOptions as { soft?: boolean })?.soft ?? false;\n    this.emitEvent('deleting', {\n      id,\n      options: { soft: isSoftDelete },\n    } satisfies CoreEntityDeletingPayload);\n\n    try {\n      // 4. Call repository (soft or hard delete)\n      const result = isSoftDelete\n        ? await this.repository.softDelete(id)\n        : await this.repository.delete(id);\n\n      if (!result.success) {\n        throw (\n          result.error ??\n          new CorePackageError('Failed to delete entity', ERROR_CODES.CORE_OPERATION_FAILED)\n        );\n      }\n\n      // 5. Lifecycle hook\n      await this.afterDelete(id, validatedOptions);\n\n      // 6. Invalidate cache for this entity (unless disabled)\n      const shouldInvalidate = crudOptions?.cache?.invalidateCache ?? true;\n      if (shouldInvalidate && this.hasCacheManager) {\n        try {\n          const cacheKey = crudOptions?.cache?.customKey ?? CacheKeyBuilder.entity(id);\n          await this.cacheDelete(cacheKey);\n          this.logDebug('Invalidated cache after delete', {\n            id,\n            cacheKey: this.buildCacheKey(cacheKey),\n          });\n        } catch (error) {\n          this.logWarn('Failed to invalidate cache after delete', {\n            id,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n\n      // 7. Emit deleted event\n      this.emitEvent('deleted', {\n        id,\n        soft: isSoftDelete,\n      } satisfies CoreEntityDeletedPayload);\n\n      this.emitEvent('complete', {\n        success: true,\n        entityId: id,\n      } satisfies CoreEntityCompletePayload);\n\n      // Record success metrics\n      await this.recordOperationMetrics('delete', Date.now() - startTime, true);\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('delete', Date.now() - startTime, false);\n\n      this.emitEvent('error', {\n        error,\n        entityId: id,\n      } satisfies CoreEntityErrorPayload);\n      throw error;\n    }\n  }\n\n  /**\n   * Get entity by ID (GET) with cache-aside pattern\n   *\n   * Cache-aside flow:\n   * 1. Check cache first (if enabled)\n   * 2. If cache hit, return cached entity\n   * 3. If cache miss, fetch from DB\n   * 4. Cache the result (if enabled)\n   *\n   * @param id - Entity ID\n   * @param options - Operation options (cache, pagination, etc.)\n   * @returns Entity or null if not found\n   * @throws CorePackageError if repository call fails\n   *\n   * @example\n   * ```typescript\n   * // With cache\n   * const entity = await service.getById('123', {\n   *   cache: { useCache: true, cacheTtl: 300 }\n   * });\n   *\n   * // Without cache\n   * const entity = await service.getById('123', {\n   *   cache: { useCache: false }\n   * });\n   *\n   * // With custom cache key (still prefixed with cachePrefix)\n   * const entity = await service.getById('123', {\n   *   cache: { customKey: 'user:active:123' }\n   * });\n   * // Final cache key will be: 'example:user:active:123'\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async getById(id: string, options?: CrudOperationOptions): Promise<TEntity | null> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Fetching entity by ID', { id, options });\n\n    // Use cache if: (explicit option OR default setting) AND cache manager available\n    const useCacheOption = options?.cache?.useCache ?? this.useCacheByDefault;\n    const useCache = useCacheOption && this.hasCacheManager;\n    // Use custom key if provided, otherwise use default entity key\n    const cacheKey = options?.cache?.customKey ?? CacheKeyBuilder.entity(id);\n    const cacheTtl = options?.cache?.cacheTtl ?? this.defaultCacheTtl;\n\n    // 1. Try cache first (cache-aside pattern)\n    if (useCache) {\n      try {\n        const cached = await this.cacheGet<TEntity>(cacheKey);\n        if (cached) {\n          this.logDebug('Cache hit for entity', { id, cacheKey: this.buildCacheKey(cacheKey) });\n          await this.recordCacheMetric(true, 'getById');\n          await this.recordOperationMetrics('getById', Date.now() - startTime, true);\n          return cached;\n        }\n        this.logDebug('Cache miss for entity', { id, cacheKey: this.buildCacheKey(cacheKey) });\n        await this.recordCacheMetric(false, 'getById');\n      } catch (error) {\n        this.logWarn('Cache read failed, falling back to DB', {\n          id,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    // 2. Fetch from database\n    try {\n      const result = await this.repository.findById(id);\n\n      if (!result.success) {\n        throw (\n          result.error ??\n          new CorePackageError('Failed to fetch entity', ERROR_CODES.CORE_OPERATION_FAILED)\n        );\n      }\n\n      if (!result.value) {\n        return null;\n      }\n\n      // 3. Map response to domain\n      const responseDTO = this.mapper.toResponseDTO!(result.value);\n      const entity = this.mapper.toDomain(responseDTO);\n\n      // 4. Cache the result\n      if (useCache && entity) {\n        try {\n          await this.cacheSet(cacheKey, entity, cacheTtl);\n          this.logDebug('Cached entity', {\n            id,\n            cacheKey: this.buildCacheKey(cacheKey),\n            ttl: cacheTtl,\n          });\n        } catch (error) {\n          this.logWarn('Cache write failed', {\n            id,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n\n      // Record success metrics\n      await this.recordOperationMetrics('getById', Date.now() - startTime, true);\n\n      return entity;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('getById', Date.now() - startTime, false);\n\n      this.emitEvent('error', {\n        error,\n        entityId: id,\n      } satisfies CoreEntityErrorPayload);\n      throw error;\n    }\n  }\n\n  /**\n   * Get all entities (list/query)\n   *\n   * Flow:\n   * 1. Check cache (if enabled)\n   * 2. If cache miss, fetch from repository\n   * 3. Map response to domain entities\n   * 4. Cache the result\n   * 5. Return entities\n   *\n   * @param query - Query parameters for filtering/pagination\n   * @param options - Operation options (cache, etc.)\n   * @returns Array of entities\n   *\n   * @example\n   * ```typescript\n   * // Basic list\n   * const users = await service.getAll();\n   *\n   * // With filters\n   * const users = await service.getAll({ status: 'active', page: 1, limit: 10 });\n   *\n   * // With cache options\n   * const users = await service.getAll(\n   *   { status: 'active' },\n   *   { cache: { useCache: true, cacheTtl: 600 } }\n   * );\n   *\n   * // With custom cache key\n   * const users = await service.getAll(\n   *   { status: 'active' },\n   *   { cache: { customKey: CacheKeyBuilder.query('active', { status: 'active' }) } }\n   * );\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async getAll(query?: Partial<TQueryDTO>, options?: CrudOperationOptions): Promise<TEntity[]> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Fetching all entities', { query, options });\n\n    // Lifecycle hook\n    await this.beforeGetAll(query);\n\n    // Use cache if: (explicit option OR default setting) AND cache manager available\n    const useCacheOption = options?.cache?.useCache ?? this.useCacheByDefault;\n    const useCache = useCacheOption && this.hasCacheManager;\n    // Use custom key if provided, otherwise use list key with query params\n    const cacheKey =\n      options?.cache?.customKey ?? CacheKeyBuilder.list(query as Record<string, unknown>);\n    const cacheTtl = options?.cache?.cacheTtl ?? this.defaultCacheTtl;\n\n    // 1. Try cache first (cache-aside pattern)\n    if (useCache) {\n      try {\n        const cached = await this.cacheGet<TEntity[]>(cacheKey);\n        if (cached) {\n          this.logDebug('Cache hit for list', { query, cacheKey: this.buildCacheKey(cacheKey) });\n          await this.recordCacheMetric(true, 'getAll');\n          await this.recordOperationMetrics('getAll', Date.now() - startTime, true);\n          await this.afterGetAll(cached, query);\n          return cached;\n        }\n        this.logDebug('Cache miss for list', { query, cacheKey: this.buildCacheKey(cacheKey) });\n        await this.recordCacheMetric(false, 'getAll');\n      } catch (error) {\n        this.logWarn('Cache read failed, falling back to DB', {\n          query,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    // 2. Fetch from database\n    try {\n      const result = await this.repository.findMany(query);\n\n      if (!result.success) {\n        throw (\n          result.error ??\n          new CorePackageError('Failed to fetch entities', ERROR_CODES.CORE_OPERATION_FAILED)\n        );\n      }\n\n      // 3. Map response to domain entities\n      const data = result.value?.data ?? result.value ?? [];\n      const entities = (Array.isArray(data) ? data : []).map((item: unknown) => {\n        const responseDTO = this.mapper.toResponseDTO!(item);\n        return this.mapper.toDomain(responseDTO);\n      });\n\n      // 4. Cache the result\n      if (useCache) {\n        try {\n          await this.cacheSet(cacheKey, entities, cacheTtl);\n          this.logDebug('Cached entity list', {\n            query,\n            count: entities.length,\n            cacheKey: this.buildCacheKey(cacheKey),\n            ttl: cacheTtl,\n          });\n        } catch (error) {\n          this.logWarn('Cache write failed', {\n            query,\n            error: error instanceof Error ? error.message : String(error),\n          });\n        }\n      }\n\n      // Lifecycle hook\n      await this.afterGetAll(entities, query);\n\n      // Record success metrics\n      await this.recordOperationMetrics('getAll', Date.now() - startTime, true);\n\n      return entities;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('getAll', Date.now() - startTime, false);\n\n      this.emitEvent('error', {\n        error,\n        data: { query },\n      } satisfies CoreEntityErrorPayload);\n      throw error;\n    }\n  }\n\n  /**\n   * Check if an entity exists by ID\n   *\n   * More efficient than getById when you only need to check existence.\n   * Uses cache if available, falls back to repository.findById.\n   *\n   * @param id - Entity ID to check\n   * @param options - Optional CRUD operation options\n   * @returns Promise resolving to boolean (true if exists, false otherwise)\n   *\n   * @example\n   * ```typescript\n   * const exists = await service.exists('123');\n   * if (exists) {\n   *   // Entity exists\n   * }\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async exists(id: string, options?: CrudOperationOptions): Promise<boolean> {\n    this.assertReady();\n    this.logDebug('Checking entity existence', { id, options });\n\n    // Lifecycle hook\n    await this.beforeExists(id);\n\n    // Use cache if enabled\n    const useCacheOption = options?.cache?.useCache ?? this.useCacheByDefault;\n    const useCache = useCacheOption && this.hasCacheManager;\n    const cacheKey = options?.cache?.customKey ?? CacheKeyBuilder.entity(id);\n\n    // 1. Try cache first\n    if (useCache) {\n      try {\n        const cached = await this.cacheGet<TEntity>(cacheKey);\n        if (cached) {\n          this.logDebug('Cache hit for exists check', {\n            id,\n            cacheKey: this.buildCacheKey(cacheKey),\n          });\n          await this.afterExists(id, true);\n          return true;\n        }\n        this.logDebug('Cache miss for exists check', {\n          id,\n          cacheKey: this.buildCacheKey(cacheKey),\n        });\n      } catch (error) {\n        this.logWarn('Cache read failed during exists check, falling back to DB', {\n          id,\n          error: error instanceof Error ? error.message : String(error),\n        });\n      }\n    }\n\n    // 2. Check repository\n    try {\n      const result = await this.repository.findById(id);\n\n      if (!result.success) {\n        throw (\n          result.error ??\n          new CorePackageError(\n            'Failed to check entity existence',\n            ERROR_CODES.CORE_OPERATION_FAILED\n          )\n        );\n      }\n\n      const exists = result.value !== null;\n\n      // Lifecycle hook\n      await this.afterExists(id, exists);\n\n      return exists;\n    } catch (error) {\n      this.emitEvent('error', {\n        error,\n        entityId: id,\n      } satisfies CoreEntityErrorPayload);\n      throw error;\n    }\n  }\n\n  /**\n   * Create multiple entities at once (bulk operation)\n   *\n   * **Transaction Support (Default: ON)**\n   * - Uses database transaction by default for atomic operations\n   * - All entities created successfully or none (rollback on failure)\n   * - Falls back to sequential creation if transactions not supported\n   * - Disable with `options.transaction.useTransaction: false`\n   *\n   * @param dataArray - Array of data to create entities from\n   * @param options - Optional CRUD operation options (includes transaction config)\n   * @returns Promise resolving to array of created entities\n   *\n   * @example\n   * ```typescript\n   * // Default: Uses transaction (atomic)\n   * const entities = await service.bulkCreate([\n   *   { name: 'Entity 1', amount: 100 },\n   *   { name: 'Entity 2', amount: 200 },\n   * ]);\n   *\n   * // Explicit: Disable transaction (sequential, partial failures possible)\n   * const entities = await service.bulkCreate(data, {\n   *   transaction: { useTransaction: false }\n   * });\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async bulkCreate<TInput = unknown>(\n    dataArray: TInput[],\n    options?: CrudOperationOptions\n  ): Promise<TEntity[]> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Bulk creating entities', { count: dataArray.length, options });\n\n    if (!Array.isArray(dataArray)) {\n      throw new CorePackageError('Data must be an array', ERROR_CODES.VALIDATION_ERROR);\n    }\n\n    if (dataArray.length === 0) {\n      return [];\n    }\n\n    // Lifecycle hook - handle errors from hooks\n    try {\n      await this.beforeBulkCreate(dataArray);\n    } catch (error) {\n      this.logError('beforeBulkCreate hook failed', { error });\n      throw error;\n    }\n\n    // Determine if we should use transaction (default: true)\n    const useTransaction = options?.transaction?.useTransaction !== false;\n    const canUseTransaction = useTransaction && this.supportsTransactions;\n\n    let createdEntities: TEntity[];\n\n    if (canUseTransaction) {\n      // Use transaction for atomic bulk create\n      this.logDebug('Using transaction for bulk create', { count: dataArray.length });\n\n      const txResult = await this.withTransaction(async trx => {\n        const entities: TEntity[] = [];\n\n        for (const data of dataArray) {\n          // Validate\n          const validatedData = this.validator.validateCreateOrThrow(data);\n\n          // Map to DTO\n          const requestDTO = this.mapper.toCreateDTO!(validatedData as Partial<TEntity>);\n\n          // Create via transaction using repository's table name\n          // Transaction.create<T>(table, data: T) returns DatabaseResult<T>\n          const tableName = this.repository.getTableName();\n          const createResult = await trx.create(tableName, requestDTO);\n\n          if (!createResult.success || !createResult.value) {\n            throw (\n              createResult.error ??\n              new CorePackageError(\n                'Failed to create entity in transaction',\n                ERROR_CODES.CORE_OPERATION_FAILED\n              )\n            );\n          }\n\n          // Map the created row to domain entity\n          // The DB returns the created row which we map through responseDTO to domain\n          // Use unknown intermediate cast since DB result matches TDatabaseRow structure\n          const responseDTO = this.mapper.toResponseDTO!(\n            createResult.value as unknown as TDatabaseRow\n          );\n          const entity = this.mapper.toDomain(responseDTO);\n          entities.push(entity);\n        }\n\n        return entities;\n      }, options?.transaction);\n\n      if (!txResult.success || !txResult.value) {\n        throw (\n          txResult.error ??\n          new CorePackageError('Bulk create transaction failed', ERROR_CODES.CORE_OPERATION_FAILED)\n        );\n      }\n\n      createdEntities = txResult.value;\n\n      // Cache all entities after successful transaction\n      for (const entity of createdEntities) {\n        const entityId = (entity as { id?: string }).id;\n        if (entityId) {\n          const cacheKey = CacheKeyBuilder.entity(entityId);\n          await this.cacheSet(cacheKey, entity, this.defaultCacheTtl);\n        }\n      }\n    } else {\n      // Fallback: Sequential creation (no transaction support or disabled)\n      if (useTransaction && !this.supportsTransactions) {\n        this.logWarn('Transaction requested but not supported, falling back to sequential');\n      }\n\n      createdEntities = [];\n      for (const data of dataArray) {\n        const entity = await this.create(data, options);\n        createdEntities.push(entity);\n      }\n    }\n\n    // Lifecycle hook - handle errors from hooks\n    try {\n      await this.afterBulkCreate(createdEntities, dataArray);\n    } catch (error) {\n      this.logError('afterBulkCreate hook failed', { error });\n      throw error;\n    }\n\n    this.logDebug('Bulk create completed', {\n      count: createdEntities.length,\n      usedTransaction: canUseTransaction,\n    });\n\n    // Record success metrics\n    await this.recordOperationMetrics('bulkCreate', Date.now() - startTime, true);\n\n    return createdEntities;\n  }\n\n  /**\n   * Delete multiple entities at once (bulk operation)\n   *\n   * **Transaction Support (Default: ON)**\n   * - Uses database transaction by default for atomic operations\n   * - All entities deleted successfully or none (rollback on failure)\n   * - Falls back to sequential deletion if transactions not supported\n   * - Disable with `crudOptions.transaction.useTransaction: false`\n   *\n   * @param ids - Array of entity IDs to delete\n   * @param deleteOptions - Optional delete options (soft/hard delete)\n   * @param crudOptions - Optional CRUD operation options (includes transaction config)\n   * @returns Promise resolving when all deletions complete\n   *\n   * @example\n   * ```typescript\n   * // Default: Uses transaction (atomic)\n   * await service.bulkDelete(['id1', 'id2', 'id3'], { soft: true });\n   *\n   * // Explicit: Disable transaction\n   * await service.bulkDelete(ids, { soft: true }, {\n   *   transaction: { useTransaction: false }\n   * });\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  async bulkDelete<TInput = TDeleteOptions>(\n    ids: string[],\n    deleteOptions?: TInput,\n    crudOptions?: CrudOperationOptions\n  ): Promise<void> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Bulk deleting entities', { count: ids.length, deleteOptions, crudOptions });\n\n    if (!Array.isArray(ids)) {\n      throw new CorePackageError('IDs must be an array', ERROR_CODES.VALIDATION_ERROR);\n    }\n\n    if (ids.length === 0) {\n      return;\n    }\n\n    // Lifecycle hook - handle errors from hooks\n    try {\n      await this.beforeBulkDelete(ids, deleteOptions);\n    } catch (error) {\n      this.logError('beforeBulkDelete hook failed', { error });\n      throw error;\n    }\n\n    // Determine if we should use transaction (default: true)\n    const useTransaction = crudOptions?.transaction?.useTransaction !== false;\n    const canUseTransaction = useTransaction && this.supportsTransactions;\n\n    // Check if soft delete\n    const isSoftDelete = (deleteOptions as { soft?: boolean })?.soft !== false;\n\n    if (canUseTransaction) {\n      // Use transaction for atomic bulk delete\n      this.logDebug('Using transaction for bulk delete', { count: ids.length, isSoftDelete });\n\n      const txResult = await this.withTransaction(async trx => {\n        // Get table name from repository\n        const tableName = this.repository.getTableName();\n\n        for (const id of ids) {\n          // Validate delete options if validator supports it\n          if (deleteOptions && this.validator.validateDeleteOrThrow) {\n            this.validator.validateDeleteOrThrow(deleteOptions);\n          }\n\n          // Delete via transaction\n          const result = await trx.delete(tableName, id);\n\n          if (!result.success) {\n            throw (\n              result.error ??\n              new CorePackageError(\n                `Failed to delete entity ${id} in transaction`,\n                ERROR_CODES.CORE_OPERATION_FAILED\n              )\n            );\n          }\n        }\n\n        return ids;\n      }, crudOptions?.transaction);\n\n      if (!txResult.success) {\n        throw (\n          txResult.error ??\n          new CorePackageError('Bulk delete transaction failed', ERROR_CODES.CORE_OPERATION_FAILED)\n        );\n      }\n\n      // Invalidate cache for all deleted entities after successful transaction\n      for (const id of ids) {\n        const cacheKey = CacheKeyBuilder.entity(id);\n        await this.cacheDelete(cacheKey);\n      }\n    } else {\n      // Fallback: Sequential deletion (no transaction support or disabled)\n      if (useTransaction && !this.supportsTransactions) {\n        this.logWarn('Transaction requested but not supported, falling back to sequential');\n      }\n\n      for (const id of ids) {\n        await this.delete(id, deleteOptions, crudOptions);\n      }\n    }\n\n    // Lifecycle hook - handle errors from hooks\n    try {\n      await this.afterBulkDelete(ids, deleteOptions);\n    } catch (error) {\n      this.logError('afterBulkDelete hook failed', { error });\n      throw error;\n    }\n\n    this.logDebug('Bulk delete completed', {\n      count: ids.length,\n      usedTransaction: canUseTransaction,\n    });\n\n    // Record success metrics\n    await this.recordOperationMetrics('bulkDelete', Date.now() - startTime, true);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Transaction Support\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Execute operations within a database transaction\n   *\n   * Provides atomic operations with automatic rollback on failure.\n   * Uses the underlying database adapter's transaction support.\n   *\n   * @param fn - Function containing operations to execute within transaction\n   * @param options - Optional transaction configuration\n   * @returns Promise resolving to the transaction result\n   * @throws Error if transaction fails (auto-rollback occurs)\n   *\n   * @example\n   * ```typescript\n   * // Single service transaction\n   * const result = await userService.withTransaction(async (trx) => {\n   *   const user = await trx.create('users', userData);\n   *   const profile = await trx.create('profiles', { userId: user.id, ...profileData });\n   *   return { user, profile };\n   * });\n   *\n   * // Cross-service transaction (using shared db instance)\n   * const db = Core.db.getDatabase();\n   * const result = await db.transaction(async (trx) => {\n   *   await trx.create('users', userData);\n   *   await trx.create('audit_logs', { action: 'user_created', ... });\n   * });\n   * ```\n   */\n  async withTransaction<T>(\n    fn: TransactionFn<T>,\n    options?: TransactionOptions\n  ): Promise<DatabaseResult<T>> {\n    this.assertReady();\n    this.logDebug('Starting transaction', { options });\n\n    // Get the database service from injected services (typed in BaseDomainService)\n    const db = this.dbService;\n    if (!db) {\n      throw new CorePackageError(\n        'Database service not available for transactions. Ensure DbService is initialized.',\n        ERROR_CODES.CORE_OPERATION_FAILED\n      );\n    }\n\n    // Check if adapter supports transactions\n    if (typeof db.transaction !== 'function') {\n      throw new CorePackageError(\n        'Database adapter does not support transactions',\n        ERROR_CODES.CORE_OPERATION_FAILED\n      );\n    }\n\n    try {\n      // DatabaseServiceInterface.transaction returns DatabaseResult<T>\n      const result = await db.transaction(fn, options);\n\n      if (result.success) {\n        this.logDebug('Transaction completed successfully');\n      } else {\n        this.logWarn('Transaction failed', { error: result.error });\n      }\n\n      return result;\n    } catch (error) {\n      this.logError('Transaction error', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Check if transaction support is available\n   *\n   * @returns true if the database adapter supports transactions\n   */\n  get supportsTransactions(): boolean {\n    return this.dbService !== undefined && typeof this.dbService.transaction === 'function';\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Protected Lifecycle Hooks (Override for custom behavior)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Called before create operation\n   * Override to add custom logic before creating\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async beforeCreate(_data: TCreateDTO): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called after create operation\n   * Override to add custom logic after creating\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async afterCreate(_entity: TEntity): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called before bulk create operation\n   * Override to add custom logic before bulk creating\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async beforeBulkCreate<TInput = unknown>(_dataArray: TInput[]): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called after bulk create operation\n   * Override to add custom logic after bulk creating\n   */\n  protected async afterBulkCreate<TInput = unknown>(\n    // eslint-disable-next-line no-unused-vars\n    _entities: TEntity[],\n    // eslint-disable-next-line no-unused-vars\n    _dataArray: TInput[]\n  ): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called before getAll operation\n   * Override to add custom logic before fetching list\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async beforeGetAll(_query?: Partial<TQueryDTO>): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called after getAll operation\n   * Override to add custom logic after fetching list (e.g., invalidate related caches)\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async afterGetAll(_entities: TEntity[], _query?: Partial<TQueryDTO>): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called before patch operation\n   * Override to add custom logic before patching\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async beforePatch(_id: string, _data: TPatchDTO): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called after patch operation\n   * Override to add custom logic after patching\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async afterPatch(_id: string, _entity: TEntity): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called before delete operation\n   * Override to add custom logic before deleting\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async beforeDelete(_id: string, _options: TDeleteOptions): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called after delete operation\n   * Override to add custom logic after deleting\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async afterDelete(_id: string, _options: TDeleteOptions): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called before bulk delete operation\n   * Override to add custom logic before bulk deleting\n   */\n  protected async beforeBulkDelete<TInput = TDeleteOptions>(\n    // eslint-disable-next-line no-unused-vars\n    _ids: string[],\n    // eslint-disable-next-line no-unused-vars\n    _deleteOptions?: TInput\n  ): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called after bulk delete operation\n   * Override to add custom logic after bulk deleting\n   */\n  protected async afterBulkDelete<TInput = TDeleteOptions>(\n    // eslint-disable-next-line no-unused-vars\n    _ids: string[],\n    // eslint-disable-next-line no-unused-vars\n    _deleteOptions?: TInput\n  ): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called before exists check\n   * Override to add custom logic before checking existence\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async beforeExists(_id: string): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Called after exists check\n   * Override to add custom logic after checking existence\n   */\n  // eslint-disable-next-line no-unused-vars\n  protected async afterExists(_id: string, _exists: boolean): Promise<void> {\n    // Default: no-op\n  }\n\n  /**\n   * Get default delete options\n   * Override to customize default behavior\n   */\n  protected getDefaultDeleteOptions(): TDeleteOptions {\n    return { soft: true } as TDeleteOptions;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Protected Event Helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Emit event with prefix\n   * Only emits if emitEvents is true\n   */\n  protected emitEvent<TPayload extends BaseBackendEventPayload>(\n    event: string,\n    payload: TPayload\n  ): void {\n    if (this.emitEvents) {\n      CoreEventManager.emit(`${this.eventPrefix}:${event}`, payload);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Cache Helper Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Build cache key with service prefix.\n   * ALWAYS applies the cachePrefix. Override this method to customize key structure.\n   *\n   * @param key - Cache key (without prefix)\n   * @returns Prefixed cache key (e.g., 'example:entity:123')\n   *\n   * @example\n   * ```typescript\n   * // Default behavior\n   * buildCacheKey('entity:123') // Returns: 'example:entity:123'\n   *\n   * // Override for custom namespacing\n   * protected buildCacheKey(key: string): string {\n   *   const baseKey = super.buildCacheKey(key);\n   *   return `${baseKey}:tenant:${this.tenantId}`;\n   * }\n   * ```\n   */\n  protected buildCacheKey(key: string): string {\n    return `${this.cachePrefix}:${key}`;\n  }\n\n  /**\n   * Get value from cache with automatic prefix.\n   * Prefix is ALWAYS applied via buildCacheKey().\n   *\n   * @param key - Cache key (will be prefixed automatically)\n   * @returns Cached value or null\n   */\n  protected async cacheGet<T = unknown>(key: string): Promise<T | null> {\n    if (!this.cacheManager) return null;\n    const cache = this.cacheManager as CacheManager;\n    const finalKey = this.buildCacheKey(key);\n    return cache.get<T>(finalKey);\n  }\n\n  /**\n   * Set value in cache with automatic prefix.\n   * Prefix is ALWAYS applied via buildCacheKey().\n   *\n   * @param key - Cache key (will be prefixed automatically)\n   * @param value - Value to cache\n   * @param ttl - TTL in seconds (optional)\n   */\n  protected async cacheSet<T = unknown>(key: string, value: T, ttl?: number): Promise<void> {\n    if (!this.cacheManager) return;\n    const cache = this.cacheManager as CacheManager;\n    const finalKey = this.buildCacheKey(key);\n    await cache.set(finalKey, value, ttl);\n  }\n\n  /**\n   * Delete value from cache with automatic prefix.\n   * Prefix is ALWAYS applied via buildCacheKey().\n   *\n   * @param key - Cache key (will be prefixed automatically)\n   */\n  protected async cacheDelete(key: string): Promise<void> {\n    if (!this.cacheManager) return;\n    const cache = this.cacheManager as CacheManager;\n    const finalKey = this.buildCacheKey(key);\n    await cache.delete(finalKey);\n  }\n\n  /**\n   * Clear all cache for this service (by prefix pattern)\n   */\n  protected async cacheClear(): Promise<void> {\n    if (!this.cacheManager) return;\n    const cache = this.cacheManager as CacheManager;\n    await cache.clear();\n  }\n\n  /**\n   * Check if cache is available\n   */\n  protected get hasCacheManager(): boolean {\n    return !!this.cacheManager;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Helper Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get cache manager instance from create options.\n   * The cache instance is injected by ServiceRegistry, not created here.\n   *\n   * @param options - Service create options from ServiceRegistry\n   * @returns CacheManager instance or undefined if not available\n   */\n  static getCacheManager(options?: CoreServiceCreateOptions): CacheManager | undefined {\n    // Cache instance is already created/injected by ServiceRegistry\n    return options?.cache?.instance as CacheManager | undefined;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Observability Helper Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Track a CRUD operation with observability (span + metrics).\n   * Wraps an operation with automatic span creation, duration recording, and error tracking.\n   *\n   * @param operation - Operation name (create, patch, delete, getById, getAll)\n   * @param entityId - Optional entity ID for context\n   * @param fn - The operation function to execute\n   * @returns Result of the operation\n   *\n   * @example\n   * ```typescript\n   * const entity = await this.trackOperation('create', undefined, async () => {\n   *   return await this.repository.create(data);\n   * });\n   * ```\n   */\n  protected async trackOperation<T>(\n    operation:\n      | 'create'\n      | 'patch'\n      | 'delete'\n      | 'getById'\n      | 'getAll'\n      | 'bulkCreate'\n      | 'bulkDelete'\n      | 'transaction',\n    entityId: string | undefined,\n    fn: () => Promise<T>\n  ): Promise<T> {\n    const startTime = Date.now();\n    const spanName = `${this.eventPrefix}.${operation}`;\n\n    return this.withSpan(spanName, async span => {\n      if (entityId) {\n        span.setAttribute('entity.id', entityId);\n      }\n      span.setAttribute('service.name', this.serviceName);\n      span.setAttribute('operation.name', operation);\n\n      try {\n        const result = await fn();\n\n        // Record success metrics\n        const duration = Date.now() - startTime;\n        await this.recordOperationMetrics(operation, duration, true);\n\n        span.setStatus('ok');\n        return result;\n      } catch (error) {\n        // Record error metrics\n        const duration = Date.now() - startTime;\n        await this.recordOperationMetrics(operation, duration, false);\n\n        span.recordException(error as Error);\n        span.setStatus('error', (error as Error).message);\n        throw error;\n      }\n    });\n  }\n\n  /**\n   * Record operation metrics (duration and count).\n   * Called automatically by CRUD methods when observability is enabled.\n   */\n  protected async recordOperationMetrics(\n    operation: string,\n    duration: number,\n    success: boolean\n  ): Promise<void> {\n    if (!this.hasObservability) return;\n\n    const tags = {\n      service: this.serviceName,\n      operation,\n      entity: this.eventPrefix,\n    };\n\n    // Record duration\n    await this.recordMetric(OBSERVABILITY_METRICS.SERVICE_OPERATION_DURATION, duration, tags);\n\n    // Record count\n    await this.incrementCounter(\n      success\n        ? OBSERVABILITY_METRICS.SERVICE_OPERATION_COUNT\n        : OBSERVABILITY_METRICS.SERVICE_OPERATION_ERROR,\n      1,\n      tags\n    );\n  }\n\n  /**\n   * Record cache hit/miss metric.\n   */\n  protected async recordCacheMetric(hit: boolean, operation: string): Promise<void> {\n    if (!this.hasObservability) return;\n\n    const tags = {\n      service: this.serviceName,\n      operation,\n      entity: this.eventPrefix,\n    };\n\n    await this.incrementCounter(\n      hit ? OBSERVABILITY_METRICS.CACHE_HIT : OBSERVABILITY_METRICS.CACHE_MISS,\n      1,\n      tags\n    );\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // File Upload (via @plyaz/storage)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Upload a file to storage.\n   *\n   * Uses storageService.uploadFile() which supports:\n   * - Direct file upload (buffer/stream)\n   * - Template-based document generation + upload (when templateId provided)\n   *\n   * When templateId is provided:\n   * 1. Loads template from templates/{locale}/{category}/{templateId}.md\n   * 2. Renders with Handlebars + templateData\n   * 3. Converts to PDF/DOCX/XLSX\n   * 4. Uploads to storage (R2/Supabase)\n   * 5. Returns URL\n   *\n   * NOTE: In production, generated documents should be linked to entities via\n   * a media table with foreign keys (e.g., campaign_id -> media.entity_id).\n   *\n   * @param params - Upload parameters (supports all UploadParams options)\n   * @returns Promise resolving to upload result with URL\n   * @throws CorePackageError if storage service is not available\n   */\n  async uploadFile(params: Partial<UploadParams>): Promise<UploadResult> {\n    this.assertReady();\n    const startTime = Date.now();\n    const safeParams = params ?? {};\n\n    // 1. Emit uploading event\n    this.emitEvent('upload:uploading', { request: safeParams });\n\n    try {\n      // 2. Lifecycle hook\n      await this.beforeUploadFile?.(safeParams);\n\n      // 3. Check storage service availability\n      if (!this.storageService) {\n        throw new CorePackageError(\n          'Storage service not available. Ensure storage is configured in Core.initialize().',\n          ERROR_CODES.CORE_OPERATION_FAILED,\n          { context: { operation: 'uploadFile' } }\n        );\n      }\n\n      // 4. Upload via storage service\n      // Provide defaults for required fields if not specified\n      const uploadParams: UploadParams = {\n        category: safeParams.category ?? FILE_CATEGORY.DOCUMENT,\n        entityType: safeParams.entityType ?? ENTITY_TYPE.SYSTEM,\n        entityId: safeParams.entityId ?? `${this.eventPrefix}-${Date.now()}`,\n        ...safeParams,\n      } as UploadParams;\n\n      const result = await this.storageService.getStorage().uploadFile(uploadParams);\n\n      // 5. Lifecycle hook\n      await this.afterUploadFile?.(result);\n\n      // 6. Emit uploaded event\n      this.emitEvent('upload:uploaded', { result });\n      this.emitEvent('complete', { success: true, operation: 'uploadFile' });\n\n      await this.recordOperationMetrics('uploadFile', Date.now() - startTime, true);\n      return result;\n    } catch (error) {\n      await this.recordOperationMetrics('uploadFile', Date.now() - startTime, false);\n      this.emitEvent('upload:error', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before file upload.\n   * Override in subclass for custom pre-upload logic.\n   */\n  protected async beforeUploadFile?(params: Partial<UploadParams>): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after file upload.\n   * Override in subclass for custom post-upload logic.\n   */\n  protected async afterUploadFile?(result: UploadResult): Promise<void>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Bulk File Upload (via @plyaz/storage)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Upload multiple files to storage with concurrency control.\n   *\n   * Uses storageService.uploadMultipleFiles() which:\n   * 1. Processes files in parallel with configurable concurrency\n   * 2. Optionally continues on error (partial success)\n   * 3. Returns results for each file\n   *\n   * @param files - Array of upload parameters for each file\n   * @param options - Bulk upload options (concurrency, continueOnError, useQueue)\n   * @returns Promise resolving to array of upload results\n   * @throws CorePackageError if storage service is not available\n   */\n  async uploadFiles(\n    files: Partial<UploadParams>[],\n    options?: {\n      concurrency?: number;\n      continueOnError?: boolean;\n      useQueue?: boolean;\n    }\n  ): Promise<UploadResult[]> {\n    this.assertReady();\n    const startTime = Date.now();\n\n    // 1. Emit uploading event (using CoreOperationRequestPayload format)\n    this.emitEvent('upload:bulk:uploading', { request: { fileCount: files.length, options } });\n\n    try {\n      // 2. Lifecycle hook\n      await this.beforeUploadFiles?.(files, options);\n\n      // 3. Check storage service availability\n      if (!this.storageService) {\n        throw new CorePackageError(\n          'Storage service not available. Ensure storage is configured in Core.initialize().',\n          ERROR_CODES.CORE_OPERATION_FAILED,\n          { context: { operation: 'uploadFiles' } }\n        );\n      }\n\n      // 4. Prepare upload params with defaults\n      const uploadParamsArray: UploadParams[] = files.map(params => ({\n        category: params.category ?? FILE_CATEGORY.DOCUMENT,\n        entityType: params.entityType ?? ENTITY_TYPE.SYSTEM,\n        entityId: params.entityId ?? `${this.eventPrefix}-${Date.now()}`,\n        ...params,\n      })) as UploadParams[];\n\n      // 5. Upload via storage service\n      const results = await this.storageService\n        .getStorage()\n        .uploadMultipleFiles(uploadParamsArray, options);\n\n      // 6. Lifecycle hook\n      await this.afterUploadFiles?.(results);\n\n      // 7. Emit uploaded event (using CoreOperationResultPayload format)\n      this.emitEvent('upload:bulk:uploaded', {\n        result: {\n          results,\n          summary: {\n            total: files.length,\n            succeeded: results.length,\n            failed: files.length - results.length,\n          },\n        },\n      });\n      this.emitEvent('complete', { success: true, operation: 'uploadFiles' });\n\n      await this.recordOperationMetrics('uploadFiles', Date.now() - startTime, true);\n      return results;\n    } catch (error) {\n      await this.recordOperationMetrics('uploadFiles', Date.now() - startTime, false);\n      this.emitEvent('upload:bulk:error', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before bulk file upload.\n   * Override in subclass for custom pre-upload logic.\n   */\n  protected async beforeUploadFiles?(\n    files: Partial<UploadParams>[],\n    options?: { concurrency?: number; continueOnError?: boolean; useQueue?: boolean }\n  ): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after bulk file upload.\n   * Override in subclass for custom post-upload logic.\n   */\n  protected async afterUploadFiles?(results: UploadResult[]): Promise<void>;\n\n  /**\n   * Check if storage service is available.\n   */\n  protected get hasStorage(): boolean {\n    return !!this.storageService;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Document Generation (via @plyaz/storage)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Generate a document from template (NO upload - returns Buffer).\n   *\n   * Uses storageService.generateFile() which:\n   * 1. Loads template from templates/{locale}/{category}/{templateId}.md\n   * 2. Renders with Handlebars + templateData\n   * 3. Converts to PDF/DOCX/XLSX\n   * 4. Returns Buffer (caller handles the buffer)\n   *\n   * For generation WITH upload, use uploadFile() with templateId instead.\n   *\n   * @param params - Generation parameters (templateId, templateData, outputFormat, etc.)\n   * @returns Promise resolving to generated document Buffer\n   * @throws CorePackageError if storage service is not available\n   */\n  async generateFile(params: Partial<GenerateFileParams>): Promise<Buffer> {\n    this.assertReady();\n    const startTime = Date.now();\n\n    // 1. Emit generating event\n    this.emitEvent('document:generating', { request: params });\n\n    try {\n      // 2. Lifecycle hook\n      await this.beforeGenerateFile?.(params);\n\n      // 3. Check storage service availability\n      if (!this.storageService) {\n        throw new CorePackageError(\n          'Storage service not available. Ensure storage is configured in Core.initialize().',\n          ERROR_CODES.CORE_OPERATION_FAILED,\n          { context: { operation: 'generateFile' } }\n        );\n      }\n\n      // 4. Generate document via storage template engine\n      const generateParams: GenerateFileParams = {\n        templateId: params.templateId ?? '',\n        templateData: params.templateData ?? {},\n        ...params,\n      } as GenerateFileParams;\n\n      const buffer = await this.storageService.getStorage().generateFile(generateParams);\n\n      // 5. Lifecycle hook\n      await this.afterGenerateFile?.(buffer);\n\n      // 6. Emit generated event\n      this.emitEvent('document:generated', { result: { size: buffer.length } });\n      this.emitEvent('complete', { success: true, operation: 'generateFile' });\n\n      await this.recordOperationMetrics('generateFile', Date.now() - startTime, true);\n      return buffer;\n    } catch (error) {\n      await this.recordOperationMetrics('generateFile', Date.now() - startTime, false);\n      this.emitEvent('document:error', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before document generation.\n   * Override in subclass for custom pre-generation logic.\n   */\n  protected async beforeGenerateFile?(params: Partial<GenerateFileParams>): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after document generation.\n   * Override in subclass for custom post-generation logic.\n   */\n  protected async afterGenerateFile?(buffer: Buffer): Promise<void>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Email Sending (via @plyaz/notifications)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Send an email using notification templates.\n   *\n   * Uses notificationsService.sendEmail() which:\n   * 1. Loads template from templates/{locale}/email/{templateId}.md\n   * 2. Parses frontmatter (subject, layout, etc.)\n   * 3. Renders Markdown to HTML with templateData\n   * 4. Inlines CSS for email clients\n   * 5. Sends via configured provider (Infobip/SendGrid)\n   *\n   * NOTE: In production, sent emails should be tracked in a notifications\n   * table with foreign keys (e.g., campaign_id -> notifications.entity_id).\n   *\n   * @param params - Email parameters (to, templateId, templateData, etc.)\n   * @returns Promise resolving to send result\n   * @throws CorePackageError if notifications service is not available\n   */\n  // eslint-disable-next-line complexity\n  async sendEmail(\n    params: Partial<SendEmailParams>\n  ): Promise<NotificationResult<NotificationResponse>> {\n    this.assertReady();\n    const startTime = Date.now();\n\n    // 1. Emit sending event\n    this.emitEvent('email:sending', { request: params });\n\n    try {\n      // 2. Lifecycle hook\n      await this.beforeSendEmail?.(params);\n\n      // 3. Check notifications service availability\n      if (!this.notificationsService) {\n        throw new CorePackageError(\n          'Notification service not available. Ensure notifications is configured in Core.initialize().',\n          ERROR_CODES.CORE_OPERATION_FAILED,\n          { context: { operation: 'sendEmail' } }\n        );\n      }\n\n      // 4. Send email via notifications service\n      const emailParams: SendEmailParams = {\n        recipientId: params.recipientId ?? 'anonymous',\n        to: params.to ?? '',\n        templateId: params.templateId ?? '',\n        templateData: params.templateData ?? {},\n        locale: params.locale ?? 'en',\n        ...params,\n      } as SendEmailParams;\n\n      const result = await this.notificationsService.getNotifications().sendEmail(emailParams);\n\n      // 5. Lifecycle hook\n      await this.afterSendEmail?.(result);\n\n      // 6. Emit sent event\n      this.emitEvent('email:sent', { result });\n      this.emitEvent('complete', { success: true, operation: 'sendEmail' });\n\n      await this.recordOperationMetrics('sendEmail', Date.now() - startTime, true);\n      return result;\n    } catch (error) {\n      await this.recordOperationMetrics('sendEmail', Date.now() - startTime, false);\n      this.emitEvent('email:error', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before email sending.\n   * Override in subclass for custom pre-send logic.\n   */\n  protected async beforeSendEmail?(params: Partial<SendEmailParams>): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after email sending.\n   * Override in subclass for custom post-send logic.\n   */\n  protected async afterSendEmail?(result: NotificationResult<NotificationResponse>): Promise<void>;\n\n  /**\n   * Check if notifications service is available.\n   */\n  protected get hasNotifications(): boolean {\n    return !!this.notificationsService;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Real-Time Streaming (via StreamRegistry/StreamBroadcaster)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if stream server/broadcaster is available.\n   * The stream server must be initialized via StreamRegistry.initialize().\n   */\n  protected get hasStreamServer(): boolean {\n    return StreamRegistry.isInitialized();\n  }\n\n  /**\n   * Emit a custom stream event to connected clients.\n   *\n   * Use this for domain-specific events that aren't covered by the standard\n   * progress methods. The event is broadcast to the specified channel.\n   *\n   * @param channel - Channel to broadcast to (e.g., 'notifications', 'orders:123')\n   * @param event - Event name (e.g., 'order:status_changed')\n   * @param data - Event payload data\n   *\n   * @example\n   * ```typescript\n   * // Emit order status change\n   * this.emitStreamEvent(\n   *   `order:${orderId}`,\n   *   'order:status_changed',\n   *   { orderId, status: 'shipped', trackingNumber: '123ABC' }\n   * );\n   * ```\n   */\n  protected emitStreamEvent<T = unknown>(\n    channel: StreamChannel | string,\n    event: string,\n    data: T\n  ): void {\n    if (!this.hasStreamServer) {\n      this.logDebug('Stream server not available, skipping stream event emission', {\n        channel,\n        event,\n      });\n      return;\n    }\n\n    try {\n      const broadcaster = StreamRegistry.getBroadcaster();\n      broadcaster.broadcastToChannel(channel as StreamChannel, {\n        event,\n        data,\n      });\n      this.logDebug('Emitted stream event', { channel, event });\n    } catch (error) {\n      this.logWarn('Failed to emit stream event', {\n        channel,\n        event,\n        error: error instanceof Error ? error.message : String(error),\n      });\n    }\n  }\n\n  /**\n   * Emit an entity-specific stream event.\n   * Convenience method that constructs the channel from entity type and ID.\n   *\n   * @param entityType - Entity type (e.g., 'order', 'invoice', 'user')\n   * @param entityId - Entity ID\n   * @param event - Event name (e.g., 'updated', 'deleted')\n   * @param data - Event payload data\n   *\n   * @example\n   * ```typescript\n   * // Emit when an order is updated\n   * this.emitEntityStreamEvent('order', orderId, 'updated', { status: 'completed' });\n   * // Broadcasts to channel: 'order:abc123' with event: 'order:updated'\n   * ```\n   */\n  protected emitEntityStreamEvent<T = unknown>(\n    entityType: string,\n    entityId: string,\n    event: string,\n    data: T\n  ): void {\n    const channel = `${entityType}:${entityId}` as StreamChannel;\n    const fullEvent = `${entityType}:${event}`;\n    this.emitStreamEvent(channel, fullEvent, data);\n  }\n}\n","/**\n * Base Mapper\n *\n * Abstract base class for domain mappers handling data transformation.\n * Supports all HTTP operations with corresponding mapping methods.\n *\n * Mapping concerns:\n * - Request mapping (domain → API DTO for POST, PUT, PATCH, DELETE)\n * - Response mapping (API DTO → domain)\n * - Store mapping (domain ↔ Zustand state)\n * - Query mapping (filters → query params)\n *\n * Note: Validation is handled by BaseValidator, not here.\n *\n * @example\n * ```typescript\n * class ExampleMapper extends BaseMapper<\n *   ExampleEntity,      // Domain model\n *   ExampleResponseDTO, // API response\n *   CreateExampleDTO,   // POST body\n *   UpdateExampleDTO,   // PUT body\n *   PatchExampleDTO,    // PATCH body\n *   QueryExampleDTO,    // GET params\n *   ExampleStoreItem    // Store state\n * > {\n *   toDomain(dto) { ... }\n *   toCreateDTO(data) { ... }\n *   // ... implement needed methods\n * }\n * ```\n */\n// Import for local use\nimport type { CoreBaseMapperInstance } from '@plyaz/types/core';\n\n/**\n * Abstract base mapper with default implementations\n *\n * Required to implement:\n * - toDomain(dto): Convert API response to domain model\n *\n * Optional to implement (based on your needs):\n * - toCreateDTO(data): For POST requests\n * - toUpdateDTO(data): For PUT requests\n * - toPatchDTO(data): For PATCH requests\n * - toQueryDTO(filters): For GET query params\n * - toStoreState(domain): Custom store state shape\n * - fromStoreState(state): Restore domain from store\n */\nexport abstract class BaseMapper<\n  TDomain,\n  TResponseDTO,\n  TCreateDTO = unknown,\n  TUpdateDTO = TCreateDTO,\n  TPatchDTO = Partial<TCreateDTO>,\n  TQueryDTO = unknown,\n  TStoreState = TDomain,\n> implements\n    CoreBaseMapperInstance<\n      TDomain,\n      TResponseDTO,\n      TCreateDTO,\n      TUpdateDTO,\n      TPatchDTO,\n      TQueryDTO,\n      TStoreState\n    >\n{\n  // ─────────────────────────────────────────────────────────────────\n  // Abstract methods - must be implemented\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Convert API response DTO to domain model\n   * Handle snake_case → camelCase, add computed properties\n   */\n  abstract toDomain(dto: TResponseDTO): TDomain;\n\n  // ─────────────────────────────────────────────────────────────────\n  // Request Mapping - override as needed\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Convert domain data to create DTO (POST body)\n   * Handle camelCase → snake_case, pick required fields\n   */\n  toCreateDTO?(data: Partial<TDomain>): TCreateDTO;\n\n  /**\n   * Convert domain data to update DTO (PUT body - full replacement)\n   * Default: same as toCreateDTO\n   */\n  toUpdateDTO?(data: Partial<TDomain>): TUpdateDTO;\n\n  /**\n   * Convert domain data to patch DTO (PATCH body - partial)\n   * Default: picks only defined fields\n   */\n  toPatchDTO?(data: Partial<TDomain>): TPatchDTO;\n\n  /**\n   * Convert filter object to query params DTO (GET)\n   * Handle pagination, sorting, filtering\n   */\n  toQueryDTO?(filters: Partial<TQueryDTO>): TQueryDTO;\n\n  // ─────────────────────────────────────────────────────────────────\n  // Response Mapping - default implementations\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Convert database row/repository result to response DTO\n   * Override to map repository output to API response format\n   * Useful when repository returns different format than API expects\n   */\n  toResponseDTO?(row: unknown): TResponseDTO;\n\n  /**\n   * Map array of DTOs to domain models\n   */\n  toDomainList(dtos: TResponseDTO[]): TDomain[] {\n    return dtos.map(dto => this.toDomain(dto));\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Store Mapping - default implementations\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Convert domain model to store state (serializable)\n   * Default: strips functions, keeps data\n   */\n  toStoreState(domain: TDomain): TStoreState {\n    const state = {} as Record<string, unknown>;\n    for (const [key, value] of Object.entries(domain as Record<string, unknown>)) {\n      if (typeof value !== 'function') {\n        // Convert Date to ISO string for serialization\n        if (value instanceof Date) {\n          state[key] = value.toISOString();\n        } else {\n          state[key] = value;\n        }\n      }\n    }\n    return state as TStoreState;\n  }\n\n  /**\n   * Convert array of domain models to aggregated store state\n   * Override to customize how multiple items map to store\n   * Default: returns array of individual store states (as Partial since shape may differ)\n   */\n  toStoreStateList?(domains: TDomain[]): Partial<TStoreState> {\n    // Default: map each domain to store state and return as array\n    // Subclasses should override for custom aggregation (e.g., flags → Record<key, value>)\n    return domains.map(d => this.toStoreState(d)) as unknown as Partial<TStoreState>;\n  }\n\n  /**\n   * Restore domain model from store state\n   * Override to restore computed properties/methods\n   */\n  fromStoreState(state: TStoreState): TDomain {\n    return state as unknown as TDomain;\n  }\n}\n","/**\n * Base Validator\n *\n * Abstract base class for domain validators.\n * Handles validation AND sanitization using Zod schemas from @plyaz/types.\n *\n * Supports all HTTP operations:\n * - create (POST)\n * - update (PUT - full replacement)\n * - patch (PATCH - partial update)\n * - delete (DELETE with options)\n * - query (GET params)\n *\n * @example\n * ```typescript\n * import { CreateExampleSchema, PatchExampleSchema } from '@plyaz/types/examples';\n *\n * class ExampleValidator extends BaseValidator<\n *   CreateExampleDTO,   // create\n *   UpdateExampleDTO,   // update (full)\n *   PatchExampleDTO,    // patch (partial)\n *   DeleteExampleDTO,   // delete options\n *   QueryExampleDTO     // query params\n * > {\n *   constructor() {\n *     super({\n *       createSchema: CreateExampleSchema,\n *       patchSchema: PatchExampleSchema,\n *       // ... other schemas\n *     });\n *   }\n * }\n * ```\n */\n\nimport { ValidateAndFormatErrors, ValidationError } from '@plyaz/errors';\nimport type {\n  ValidationIssue,\n  BaseErrorContext,\n  InternalValidationSchema,\n} from '@plyaz/types/errors';\nimport { API_ERROR_CODES } from '@plyaz/types/errors';\nimport { HTTP_STATUS } from '@plyaz/config';\nimport type {\n  CoreValidationResult,\n  CoreValidatorConfig,\n  CoreBaseValidatorInstance,\n} from '@plyaz/types/core';\n\n/**\n * Abstract base validator with default implementations\n */\nexport abstract class BaseValidator<\n  TCreate = unknown,\n  TUpdate = TCreate,\n  TPatch = Partial<TCreate>,\n  TDelete = unknown,\n  TQuery = unknown,\n> implements CoreBaseValidatorInstance<TCreate, TUpdate, TPatch, TDelete, TQuery>\n{\n  protected readonly config: CoreValidatorConfig<TCreate, TUpdate, TPatch, TDelete, TQuery>;\n\n  constructor(config: CoreValidatorConfig<TCreate, TUpdate, TPatch, TDelete, TQuery> = {}) {\n    this.config = config;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Validation Methods (return ValidationResult)\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Validate data for create operation (POST)\n   */\n  validateCreate(data: unknown): CoreValidationResult<TCreate> {\n    if (!this.config.createSchema) {\n      return { success: true, data: data as TCreate };\n    }\n    return this.validate(data, this.config.createSchema);\n  }\n\n  /**\n   * Validate data for full update operation (PUT)\n   */\n  validateUpdate(data: unknown): CoreValidationResult<TUpdate> {\n    if (!this.config.updateSchema) {\n      return { success: true, data: data as TUpdate };\n    }\n    return this.validate(data, this.config.updateSchema);\n  }\n\n  /**\n   * Validate data for partial update operation (PATCH)\n   */\n  validatePatch(data: unknown): CoreValidationResult<TPatch> {\n    if (!this.config.patchSchema) {\n      return { success: true, data: data as TPatch };\n    }\n    return this.validate(data, this.config.patchSchema);\n  }\n\n  /**\n   * Validate data for delete operation (DELETE with options)\n   */\n  validateDelete(data: unknown): CoreValidationResult<TDelete> {\n    if (!this.config.deleteSchema) {\n      return { success: true, data: data as TDelete };\n    }\n    return this.validate(data, this.config.deleteSchema);\n  }\n\n  /**\n   * Validate query parameters (GET list)\n   */\n  validateQuery(data: unknown): CoreValidationResult<TQuery> {\n    if (!this.config.querySchema) {\n      return { success: true, data: data as TQuery };\n    }\n    return this.validate(data, this.config.querySchema);\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // OrThrow Methods (throw ValidationError on failure)\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Validate and throw if invalid (for create)\n   * @throws ValidationError[] (array) if validation fails\n   */\n  validateCreateOrThrow(data: unknown): TCreate {\n    const result = this.validateCreate(data);\n    if (!result.success && result.errors) {\n      const validationErrors = this.toValidationErrorArray(result.errors);\n      if (validationErrors.length > 0) {\n        throw validationErrors; // Throw array of errors\n      }\n    }\n    return result.data!;\n  }\n\n  /**\n   * Validate and throw if invalid (for update)\n   * @throws ValidationError[] (array) if validation fails\n   */\n  validateUpdateOrThrow(data: unknown): TUpdate {\n    const result = this.validateUpdate(data);\n    if (!result.success && result.errors) {\n      const validationErrors = this.toValidationErrorArray(result.errors);\n      if (validationErrors.length > 0) {\n        throw validationErrors; // Throw array of errors\n      }\n    }\n    return result.data!;\n  }\n\n  /**\n   * Validate and throw if invalid (for patch)\n   * @throws ValidationError[] (array) if validation fails\n   */\n  validatePatchOrThrow(data: unknown): TPatch {\n    const result = this.validatePatch(data);\n    if (!result.success && result.errors) {\n      const validationErrors = this.toValidationErrorArray(result.errors);\n      if (validationErrors.length > 0) {\n        throw validationErrors; // Throw array of errors\n      }\n    }\n    return result.data!;\n  }\n\n  /**\n   * Validate and throw if invalid (for delete)\n   * @throws ValidationError[] (array) if validation fails\n   */\n  validateDeleteOrThrow(data: unknown): TDelete {\n    const result = this.validateDelete(data);\n    if (!result.success && result.errors) {\n      const validationErrors = this.toValidationErrorArray(result.errors);\n      if (validationErrors.length > 0) {\n        throw validationErrors; // Throw array of errors\n      }\n    }\n    return result.data!;\n  }\n\n  /**\n   * Validate and throw if invalid (for query)\n   * @throws ValidationError[] (array) if validation fails\n   */\n  validateQueryOrThrow(data: unknown): TQuery {\n    const result = this.validateQuery(data);\n    if (!result.success && result.errors) {\n      const validationErrors = this.toValidationErrorArray(result.errors);\n      if (validationErrors.length > 0) {\n        throw validationErrors; // Throw array of errors\n      }\n    }\n    return result.data!;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Protected Methods\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Internal validation using ValidateAndFormatErrors from @plyaz/errors\n   * This handles both validation AND sanitization (via Zod transforms)\n   */\n  protected validate<T>(\n    data: unknown,\n    schema: InternalValidationSchema<T>\n  ): CoreValidationResult<T> {\n    const result = ValidateAndFormatErrors(schema, data);\n\n    if (!result.success) {\n      return {\n        success: false,\n        errors: result.errors,\n      };\n    }\n\n    return {\n      success: true,\n      data: result.data as T,\n    };\n  }\n\n  /**\n   * Convert ValidationIssue[] to array of ValidationError objects\n   * Each validation issue becomes a separate ValidationError\n   */\n  protected toValidationErrorArray(issues?: ValidationIssue[]): ValidationError[] {\n    if (!issues || issues.length === 0) {\n      return [];\n    }\n\n    return issues.map(issue => {\n      const field = issue.path.join('.');\n      return new ValidationError(\n        API_ERROR_CODES.VALIDATION_FAILED,\n        HTTP_STATUS.BAD_REQUEST,\n        issue.message,\n        {\n          field,\n          path: issue.path,\n          code: issue.code,\n        }\n      );\n    });\n  }\n\n  /**\n   * Convert ValidationIssue[] to BaseErrorContext (legacy)\n   * @deprecated Use toValidationErrorArray instead\n   */\n  protected toErrorContext(issues?: ValidationIssue[]): BaseErrorContext {\n    if (!issues || issues.length === 0) {\n      return {};\n    }\n    return {\n      errors: issues.map(issue => ({\n        errorCode: issue.code,\n        message: issue.message,\n        field: issue.path.join('.'),\n        context: {\n          path: issue.path,\n        },\n      })),\n    };\n  }\n}\n","/**\n * Mapper Utility Functions\n *\n * Common utilities for data transformation in mappers.\n */\n\n/**\n * Convert snake_case to camelCase\n */\nexport function snakeToCamel(str: string): string {\n  return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\n/**\n * Convert camelCase to snake_case\n */\nexport function camelToSnake(str: string): string {\n  return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Parse ISO date string to Date object\n */\nexport function parseDate(dateString: string | null | undefined): Date | null {\n  if (!dateString) return null;\n  const date = new Date(dateString);\n  return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * Format Date to ISO string for API\n */\nexport function formatDate(date: Date | null | undefined): string | null {\n  return date?.toISOString() ?? null;\n}\n\n/**\n * Trim string if defined\n */\nexport function trimString(str: string | undefined): string | undefined {\n  return str?.trim();\n}\n\n/**\n * Pick only defined values from object (for PATCH requests)\n */\nexport function pickDefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n  const result: Partial<T> = {};\n  for (const [key, value] of Object.entries(obj)) {\n    if (value !== undefined) {\n      (result as Record<string, unknown>)[key] = value;\n    }\n  }\n  return result;\n}\n\n/**\n * Convert object keys from snake_case to camelCase\n */\nexport function keysToCamel<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(obj)) {\n    result[snakeToCamel(key)] = value;\n  }\n  return result;\n}\n\n/**\n * Convert object keys from camelCase to snake_case\n */\nexport function keysToSnake<T extends Record<string, unknown>>(obj: T): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(obj)) {\n    result[camelToSnake(key)] = value;\n  }\n  return result;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Nullable/Optional Conversion Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Map nullable DB field to optional response field.\n * Converts null/undefined to undefined for API responses.\n */\nexport function toOptional<T>(value: T | null | undefined): T | undefined {\n  return value ?? undefined;\n}\n\n/**\n * Map optional entity value to nullable DB field.\n * Converts undefined to null for database storage.\n */\nexport function toNullable<T>(value: T | undefined): T | null {\n  return value ?? null;\n}\n\n/**\n * Map optional Date to nullable ISO string for DB storage.\n * Converts Date to ISO string, undefined to null.\n */\nexport function dateToNullable(value: Date | undefined): string | null {\n  return value?.toISOString() ?? null;\n}\n\n/**\n * Get field value from object supporting both snake_case and camelCase keys.\n * Useful for mappers that need to handle responses in either format.\n * Prefers camelCase if both exist.\n */\nexport function getField<T>(\n  data: Record<string, unknown>,\n  snakeKey: string,\n  camelKey: string\n): T | undefined {\n  return (data[camelKey] ?? data[snakeKey]) as T | undefined;\n}\n\n/**\n * Parse date from either string or Date, handling both formats.\n * Returns undefined for invalid dates.\n */\nexport function parseDateSafe(value: unknown): Date | undefined {\n  if (!value) return undefined;\n  if (value instanceof Date) return isNaN(value.getTime()) ? undefined : value;\n  const date = new Date(value as string);\n  return isNaN(date.getTime()) ? undefined : date;\n}\n","/**\n * Base Domain Exports\n */\n// Domain Service Base Classes\nexport { BaseDomainService } from './BaseDomainService';\nexport { BaseFrontendDomainService } from './BaseFrontendDomainService';\nexport { BaseBackendDomainService } from './BaseBackendDomainService';\n\n// Mapper (data transformation only)\nexport { BaseMapper } from './BaseMapper';\n\n// Validator (validation + sanitization)\nexport { BaseValidator } from './BaseValidator';\n\n// Re-export mapper utils\nexport * from '../../utils/mapperUtils';\n","/**\n * Example Mapper\n *\n * Demonstrates extending BaseMapper for a domain entity.\n * Uses types from @plyaz/types/examples.\n *\n * Note: Validation is handled by ExampleValidator, not here.\n */\n\nimport { PAGE_SIZES } from '@plyaz/config';\nimport { BaseMapper, trimString } from '../../base';\nimport { getField, parseDateSafe } from '../../../utils/mapperUtils';\nimport type {\n  ExampleEntity,\n  ExampleResponseDTO,\n  ExampleStoreItem,\n  CreateExampleDTO,\n  UpdateExampleDTO,\n  PatchExampleDTO,\n  QueryExampleDTO,\n} from '@plyaz/types/examples';\n\n/** Default pagination values */\nconst PAGINATION_DEFAULTS = {\n  PAGE: 1,\n  LIMIT: PAGE_SIZES.MEDIUM,\n} as const;\n\n/**\n * Example Mapper implementation\n *\n * Supports:\n * - toDomain: API response → Domain\n * - toCreateDTO: Domain → POST body\n * - toPatchDTO: Domain → PATCH body\n * - toStoreState: Domain → Zustand store\n */\nclass ExampleMapperClass extends BaseMapper<\n  ExampleEntity,\n  ExampleResponseDTO,\n  CreateExampleDTO,\n  UpdateExampleDTO,\n  PatchExampleDTO,\n  QueryExampleDTO,\n  ExampleStoreItem\n> {\n  /**\n   * API DTO → Domain Model\n   * Handles both snake_case (DTO) and camelCase (Entity) input formats\n   */\n  toDomain(dto: ExampleResponseDTO | ExampleEntity): ExampleEntity {\n    const data = dto as unknown as Record<string, unknown>;\n\n    return {\n      id: dto.id,\n      name: dto.name,\n      description: dto.description,\n      ownerId: getField<string>(data, 'owner_id', 'ownerId') ?? '',\n      status: dto.status,\n      amount: dto.amount,\n      isVisible: getField<boolean>(data, 'is_visible', 'isVisible') ?? false,\n      createdAt: parseDateSafe(getField(data, 'created_at', 'createdAt')) ?? new Date(),\n      updatedAt: parseDateSafe(getField(data, 'updated_at', 'updatedAt')) ?? new Date(),\n\n      // Computed properties\n      isActive: dto.status === 'active',\n      hasDescription: () => Boolean(dto.description),\n    };\n  }\n\n  /**\n   * Domain data → Create DTO (POST body)\n   */\n  toCreateDTO(data: Partial<ExampleEntity>): CreateExampleDTO {\n    return {\n      name: trimString(data.name) ?? '',\n      amount: data.amount ?? 0,\n      description: data.description ?? '',\n      is_visible: data.isVisible ?? true,\n    };\n  }\n\n  /**\n   * Domain data → Update DTO (PUT body - full)\n   */\n  toUpdateDTO(data: Partial<ExampleEntity>): UpdateExampleDTO {\n    return this.toCreateDTO(data);\n  }\n\n  /**\n   * Domain data → Patch DTO (PATCH body - partial)\n   */\n  toPatchDTO(data: Partial<ExampleEntity>): PatchExampleDTO {\n    const dto: PatchExampleDTO = {};\n\n    if (data.name !== undefined) {\n      dto.name = trimString(data.name);\n    }\n    if (data.amount !== undefined) {\n      dto.amount = data.amount;\n    }\n    if (data.description !== undefined) {\n      dto.description = data.description ?? undefined;\n    }\n    if (data.isVisible !== undefined) {\n      dto.is_visible = data.isVisible;\n    }\n\n    return dto;\n  }\n\n  /**\n   * Filters → Query params DTO (GET)\n   */\n  toQueryDTO(filters: Partial<QueryExampleDTO>): QueryExampleDTO {\n    return {\n      page: filters.page ?? PAGINATION_DEFAULTS.PAGE,\n      limit: filters.limit ?? PAGINATION_DEFAULTS.LIMIT,\n      sort_by: filters.sort_by ?? 'created_at',\n      sort_order: filters.sort_order ?? 'desc',\n      status: filters.status,\n      is_visible: filters.is_visible,\n      min_amount: filters.min_amount,\n      max_amount: filters.max_amount,\n      search: filters.search,\n    };\n  }\n\n  /**\n   * Domain → Store state (serializable)\n   */\n  toStoreState(domain: ExampleEntity): ExampleStoreItem {\n    return {\n      id: domain.id,\n      name: domain.name,\n      description: domain.description,\n      ownerId: domain.ownerId,\n      status: domain.status,\n      amount: domain.amount,\n      isVisible: domain.isVisible,\n      createdAt: domain.createdAt.toISOString(),\n      updatedAt: domain.updatedAt.toISOString(),\n      isActive: domain.isActive,\n      isSelected: false,\n    };\n  }\n\n  /**\n   * Store state → Domain (restore computed props)\n   */\n  fromStoreState(state: ExampleStoreItem): ExampleEntity {\n    return {\n      id: state.id,\n      name: state.name,\n      description: state.description,\n      ownerId: state.ownerId,\n      status: state.status,\n      amount: state.amount,\n      isVisible: state.isVisible,\n      createdAt: new Date(state.createdAt),\n      updatedAt: new Date(state.updatedAt),\n      isActive: state.isActive,\n      hasDescription: () => Boolean(state.description),\n    };\n  }\n\n  /**\n   * Database row → Response DTO\n   * Maps repository output to API response format\n   */\n  toResponseDTO(row: {\n    id: string;\n    name: string;\n    description: string | null;\n    amount: number;\n    owner_id: string;\n    status: string;\n    is_visible: boolean;\n    created_at: string;\n    updated_at: string;\n  }): ExampleResponseDTO {\n    return {\n      id: row.id,\n      name: row.name,\n      description: row.description,\n      amount: row.amount,\n      owner_id: row.owner_id,\n      status: row.status as 'draft' | 'active' | 'archived',\n      is_visible: row.is_visible,\n      created_at: row.created_at,\n      updated_at: row.updated_at,\n    };\n  }\n}\n\n// Export class for BaseDomainService.MapperClass\nexport { ExampleMapperClass };\n\n// Singleton instance (for direct usage)\nexport const ExampleMapper = new ExampleMapperClass();\n","/**\n * Example Frontend Service\n *\n * Demonstrates extending BaseFrontendDomainService which provides:\n * - Automatic CRUD operations (fetchAll, fetchById, create, update, delete)\n * - Store integration (Zustand-compatible)\n * - Error handling with @plyaz/errors\n * - Event emission and subscription\n * - Loading/error state management\n * - Automatic DTO validation and mapping via validator and mapper\n *\n * This service only needs to:\n * - Set eventPrefix for event emission\n * - Add any custom domain methods (e.g., polling)\n * - Override lifecycle hooks if needed\n *\n * All standard CRUD operations are inherited:\n * - fetchAll(query?) - Inherited from BaseFrontendDomainService\n * - fetchById(id) - Inherited from BaseFrontendDomainService\n * - create(data) - Inherited from BaseFrontendDomainService\n * - update(id, data) - Inherited from BaseFrontendDomainService\n * - delete(id) - Inherited from BaseFrontendDomainService\n *\n * Runtime: Frontend only (Browser/React/Next.js)\n *\n * @example\n * ```tsx\n * // Service automatically gets stores via ServiceRegistry injection\n * const service = await ServiceRegistry.getAsync<FrontendExampleDomainService>('example');\n *\n * // Or create directly (stores injected if configured)\n * const service = new FrontendExampleDomainService({\n *   enabled: true,\n *   apiBasePath: '/api/examples',\n * });\n *\n * // Use inherited CRUD methods\n * const items = await service.fetchAll();\n * const activeItems = await service.fetchAll({ status: 'active' });\n * const item = await service.create({ name: 'Test', amount: 100 });\n * const updated = await service.update(item.id, { amount: 200 });\n * await service.delete(item.id);\n * ```\n */\n\nimport { STORE_KEYS } from '@plyaz/store';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n  ExampleEntity,\n  ExampleResponseDTO,\n  CreateExampleDTO,\n  PatchExampleDTO,\n  QueryExampleDTO,\n  ExampleStoreItem,\n  ExampleSendEmailResult,\n} from '@plyaz/types/examples';\nimport { BaseFrontendDomainService } from '../base/BaseFrontendDomainService';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { ExampleMapperClass } from './mappers/ExampleMapper';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Store/Config/Event Types - Re-exported from @plyaz/types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Re-export types from @plyaz/types\nexport type {\n  ExampleFrontendStoreData,\n  ExampleFrontendStoreSlice,\n  ExampleFrontendServiceConfig,\n  ExampleFrontendEventType,\n} from '@plyaz/types/examples';\n\n// Import for local use\nimport type {\n  ExampleFrontendStoreData,\n  ExampleFrontendStoreSlice,\n  ExampleFrontendServiceConfig as _ExampleFrontendServiceConfig,\n  ExampleFrontendEventType,\n} from '@plyaz/types/examples';\nimport type { CoreServiceCreateOptions } from '@plyaz/types/core';\nimport type { CoreBaseValidatorInstance } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Example Frontend Service\n *\n * Extends BaseFrontendDomainService with all generic types:\n * - TConfig: ExampleFrontendServiceConfig\n * - TStore: ExampleFrontendStoreSlice\n * - TData: ExampleFrontendStoreData\n * - TEntity: ExampleEntity\n * - TResponseDTO: ExampleResponseDTO\n * - TCreateDTO: CreateExampleDTO\n * - TPatchDTO: PatchExampleDTO\n * - TQueryDTO: QueryExampleDTO\n * - TStoreState: ExampleStoreItem\n * - TMapper: ExampleMapper\n *\n * All CRUD methods are inherited from base class - no need to implement!\n */\nexport class FrontendExampleDomainService extends BaseFrontendDomainService<\n  _ExampleFrontendServiceConfig,\n  ExampleFrontendStoreSlice,\n  ExampleFrontendStoreData,\n  ExampleEntity,\n  ExampleResponseDTO,\n  CreateExampleDTO,\n  PatchExampleDTO,\n  QueryExampleDTO,\n  ExampleStoreItem,\n  InstanceType<typeof ExampleMapperClass>,\n  CoreBaseValidatorInstance,\n  void // TDeleteResult - delete returns void (no response body)\n> {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Required Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Event prefix for all events emitted by this service\n   * Required by BaseFrontendDomainService\n   */\n  protected eventPrefix = 'example';\n\n  /**\n   * Read-only store keys - inherits error and featureFlags from base\n   * No need to redeclare them - they're always included by default\n   */\n  // protected readStoreKeys = [...super.readStoreKeys]; // Already includes ERROR, FEATURE_FLAGS\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static: Service Registry Interface\n  // ─────────────────────────────────────────────────────────────────────────\n\n  static readonly serviceKey = SERVICE_KEYS.EXAMPLE_FRONTEND;\n\n  /**\n   * Primary store key for this service.\n   * Used by ServiceRegistry to auto-inject the store if not specified in config.\n   * Also used by base class constructor to set instance primaryStoreKey.\n   */\n  static readonly primaryStoreKey = STORE_KEYS.EXAMPLE;\n\n  /**\n   * Factory method for ServiceRegistry auto-initialization.\n   * Creates and initializes the service instance.\n   */\n  static async create(\n    config: _ExampleFrontendServiceConfig,\n    options?: CoreServiceCreateOptions\n  ): Promise<FrontendExampleDomainService> {\n    const mergedConfig: _ExampleFrontendServiceConfig = {\n      ...config,\n      // Use || instead of ?? because api.baseURL may be '' (empty string) for same-origin requests.\n      // The ?? operator only falls through on null/undefined, not empty strings.\n      // An empty string is not a valid API path, so we treat it as \"not provided\" and fall through to default.\n      // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n      apiBasePath: config.apiBasePath || options?.apiClient?.options?.baseURL || '',\n    };\n\n    const service = new FrontendExampleDomainService(mergedConfig, options);\n\n    if (mergedConfig.autoFetch) {\n      await service.fetchAll();\n    }\n\n    return service;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Constructor\n  // ─────────────────────────────────────────────────────────────────────────\n\n  constructor(config: _ExampleFrontendServiceConfig = {}, options?: CoreServiceCreateOptions) {\n    // Use || instead of ?? because apiBasePath may be '' (empty string) from config.\n    // Empty string is not a valid API path, so treat it as \"not provided\" and use default.\n    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n    const apiBasePath = config.apiBasePath || '';\n\n    super({\n      serviceName: 'ExampleFrontendService',\n      supportedRuntimes: ['frontend'],\n      serviceConfig: {\n        enabled: true,\n        apiBasePath,\n        autoFetch: false,\n        pollingInterval: 0,\n        ...config,\n        // Fetchff response format: { ok, status, data: { success, message, data, codeStatus }, error }\n        // Use 'ok' for success check (HTTP level)\n        responseSuccessKey: 'ok',\n        // Extract error from fetchff response\n        responseErrorKey: 'error',\n        // Unwrap SuccessResponseStandard: extract 'data' from response.data\n        responseDataKey: 'data',\n        // Store data key: wrap entities as { items: [...] } for store.setData()\n        storeDataKey: 'items',\n\n        // Fetchers - using apiClient directly for testing/example purposes\n        // In production, these would be imported from @plyaz/api services\n        // Note: Validation is handled by validator class, mapping by mapper class\n        // Note: Use relative paths since apiClient.baseURL is already set to apiBasePath\n        fetchers: {\n          fetchAll: async query => {\n            // Empty string = use baseURL directly (e.g., /api/examples)\n            return this.apiClient.get<ExampleResponseDTO[]>('/examples', { params: query });\n          },\n          fetchById: async id => {\n            // Relative path from baseURL (e.g., /api/examples/{id})\n            return this.apiClient.get<ExampleResponseDTO>(`/examples/${id}`);\n          },\n          create: async data => {\n            return this.apiClient.post<ExampleResponseDTO>('/examples', data);\n          },\n          update: async payload => {\n            const { id, data } = payload!;\n            return this.apiClient.patch<ExampleResponseDTO>(`/examples/${id}`, data);\n          },\n          delete: async id => {\n            return this.apiClient.delete(`/examples/${id}`);\n          },\n        },\n        // Store handlers - customize how data syncs to store\n        // Use domain-specific methods or call other stores:\n        // storeHandlers: {\n        //   setData: (store, data) => {\n        //     store.setData(data);\n        //     // Can also call domain-specific methods or other stores\n        //     // store.selectItem(data.selectedId);\n        //     // store.selectItem(data.selectedId);\n        //   },\n        //   updateData: (store, data) => store.updateData(data),\n        //   setLoading: (store, isLoading) => store.setLoading(isLoading),\n        //   addData: (store, item) => store.addData(item),\n        //   updateDataById: (store, id, item) => store.updateDataById(id, item),\n        //   removeData: (store, id) => store.removeData(id),\n        // },\n        // Or disable store sync: storeHandlers: { disabled: true }\n      },\n      mapperClass: ExampleMapperClass,\n      injected: options?.injected,\n    });\n\n    // Start polling if configured\n    if (this.config.pollingInterval && this.config.pollingInterval > 0) {\n      this.startPolling();\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Lifecycle Hooks (Optional Override Examples)\n  // ─────────────────────────────────────────────────────────────────────────\n  // Note: isAvailable(), dispose(), startPolling(), stopPolling() are inherited\n  // from BaseFrontendDomainService. Override here only if custom behavior needed.\n\n  /**\n   * After fetchAll - emit event (store sync handled automatically)\n   * Note: Base class automatically calls syncToStores() which uses storeHandlers\n   */\n  protected override async afterFetchAll(entities: ExampleEntity[]): Promise<void> {\n    // Store sync happens automatically via base class + storeHandlers\n    // Just emit domain-specific event\n    CoreEventManager.emit('example:store:synced', { items: entities });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Optional: Manual Store Updates (Alternative to storeHandlers)\n  // ─────────────────────────────────────────────────────────────────────────\n  //\n  // Uncomment these for fine-grained control over store updates:\n  //\n  // protected override async afterCreate(entity: ExampleEntity): Promise<void> {\n  //   // Manual optimistic update for immediate UI feedback\n  //   this.primaryStore.addItem?.(entity);\n  // }\n  //\n  // protected override async afterUpdate(id: string, entity: ExampleEntity): Promise<void> {\n  //   // Targeted update using domain-specific method\n  //   this.primaryStore.updateItem?.(id, entity);\n  // }\n  //\n  // protected override async afterDelete<TInput>(id: TInput): Promise<void> {\n  //   // Remove from store using domain-specific method\n  //   this.primaryStore.removeItem?.(String(id));\n  // }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Custom Domain Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Subscribe to service events\n   *\n   * @example\n   * ```tsx\n   * const unsubscribe = service.on('example:created', (data) => {\n   *   console.log('Item created:', data.entity);\n   * });\n   *\n   * // Later: cleanup\n   * unsubscribe();\n   * ```\n   */\n  on(event: ExampleFrontendEventType, handler: (data: unknown) => void): () => void {\n    return CoreEventManager.on(event, handler);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Demo Methods - fetchAll() with Query Examples\n  // ─────────────────────────────────────────────────────────────────────────\n  // Note: startPolling() and stopPolling() are inherited from BaseFrontendDomainService\n\n  /**\n   * Demo: Fetch all examples with optional filters\n   * Demonstrates the fetchAll() method with typed query parameters\n   *\n   * @param filters - Optional query filters (status, pagination, sorting)\n   * @returns Promise resolving to array of ExampleEntity\n   *\n   * @example\n   * ```typescript\n   * // Fetch all active examples\n   * const activeExamples = await service.getExamples({ status: 'active' });\n   *\n   * // Fetch archived examples with pagination\n   * const archivedExamples = await service.getExamples({\n   *   status: 'archived',\n   *   page: 2,\n   *   limit: 10\n   * });\n   *\n   * // Fetch all examples sorted by name\n   * const sortedExamples = await service.getExamples({\n   *   sort_by: 'name',\n   *   sort_order: 'asc'\n   * });\n   * ```\n   */\n  async getExamples(filters?: QueryExampleDTO): Promise<ExampleEntity[]> {\n    return this.fetchAll(filters); // Properly typed!\n  }\n\n  /**\n   * Demo: Fetch active examples only\n   * Convenience method demonstrating filtering\n   */\n  async getActiveExamples(): Promise<ExampleEntity[]> {\n    return this.fetchAll({ status: 'active' });\n  }\n\n  /**\n   * Demo: Fetch draft examples only\n   * Convenience method demonstrating filtering\n   */\n  async getDraftExamples(): Promise<ExampleEntity[]> {\n    return this.fetchAll({ status: 'draft' });\n  }\n\n  /**\n   * Demo: Fetch archived examples only\n   * Convenience method demonstrating filtering\n   */\n  async getArchivedExamples(): Promise<ExampleEntity[]> {\n    return this.fetchAll({ status: 'archived' });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // NOTE: Storage Methods Are Inherited from BaseFrontendDomainService\n  // ─────────────────────────────────────────────────────────────────────────\n  //\n  // Storage Methods (via backend API → @plyaz/storage):\n  // - uploadFile(data, endpoint?) - Upload file (with optional template-based generation)\n  // - generateFile(data, endpoint?) - Generate document from template (returns buffer)\n  //\n  // All methods include:\n  // - Event emission (upload:uploading, document:generating, etc.)\n  // - Lifecycle hooks (beforeUploadFile, afterUploadFile, etc.)\n  // - Metrics recording\n  // - Error handling\n  // ─────────────────────────────────────────────────────────────────────────\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Email Sending (TEST ONLY - via backend API → @plyaz/notifications)\n  // ─────────────────────────────────────────────────────────────────────────\n  //\n  // NOTE: Email sending is a backend-only operation. This method is included\n  // here ONLY for testing/demo purposes. In production, email triggers should\n  // happen on the backend (e.g., after order placement, user registration, etc.)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Send an email via backend API (TEST/DEMO ONLY).\n   *\n   * Calls POST /api/examples/email which uses @plyaz/notifications template engine.\n   *\n   * **NOTE:** In production, email sending should be triggered from the backend\n   * (e.g., after successful order, user signup, etc.), not from the frontend.\n   * This method is included here only for testing the notification system.\n   *\n   * @typeParam TInput - Email parameters type\n   * @typeParam TOptions - Options type (can include endpoint override)\n   *\n   * @param data - Email parameters (to, templateId, templateData, etc.)\n   * @param options - Options (endpoint, etc.)\n   * @returns Promise resolving to send result\n   */\n  async sendEmail<TInput = unknown, TOptions = unknown>(\n    data: TInput,\n    options?: TOptions\n  ): Promise<ExampleSendEmailResult> {\n    await this.ensureReady();\n    const startTime = Date.now();\n    const endpoint = (options as { endpoint?: string } | undefined)?.endpoint ?? '/email';\n\n    this.setStoresLoading(true);\n    CoreEventManager.emit(`${this.eventPrefix}:email:sending`, { request: data });\n\n    try {\n      // Call backend API\n      const response = await this.apiClient.post<ExampleSendEmailResult>(endpoint, data);\n\n      // Check response success\n      if (!this.isResponseSuccess(response)) {\n        const error = this.extractResponseError(response);\n        throw new CorePackageError(\n          `Failed to send email: ${JSON.stringify(error)}`,\n          ERROR_CODES.CORE_OPERATION_FAILED\n        );\n      }\n\n      // Unwrap response\n      const result = this.unwrapResponseData<ExampleSendEmailResult>(response.data);\n\n      // Emit success event\n      CoreEventManager.emit(`${this.eventPrefix}:email:sent`, { result });\n\n      await this.recordOperationMetrics('sendEmail', Date.now() - startTime, true);\n      return result;\n    } catch (error) {\n      await this.recordOperationMetrics('sendEmail', Date.now() - startTime, false);\n      CoreEventManager.emit(`${this.eventPrefix}:email:error`, { error });\n      throw error;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // NOTE: CRUD Methods Are Inherited from BaseFrontendDomainService\n  // ─────────────────────────────────────────────────────────────────────────\n  //\n  // The following methods are available but NOT implemented here:\n  // - fetchAll(query?: QueryExampleDTO): Promise<ExampleEntity[]>\n  // - fetchById(id: string): Promise<ExampleEntity | null>\n  // - create(data: unknown): Promise<ExampleEntity>\n  // - update(id: string, data: unknown): Promise<ExampleEntity>\n  // - delete(id: string): Promise<void>\n  //\n  // All API calls → validator → mapper → store sync → events are handled automatically!\n  // All events are emitted automatically with 'example:' prefix!\n  // ─────────────────────────────────────────────────────────────────────────\n}\n","/**\n * Files Mapper\n *\n * Maps between:\n * - API responses (UploadFileResponse/GetFileResponse) → FilesEntity\n * - FilesEntity → FilesStoreItem\n * - FilesDatabaseRow → API response (for backend)\n */\n\nimport { BaseMapper } from '../../base';\nimport { toNumber, isObject, isValidUUID } from '../../../utils/common';\nimport { toOptional, toNullable } from '../../../utils/mapperUtils';\nimport type { UploadFileResponse, GetFileResponse } from '@plyaz/types/api';\nimport { SYSTEM_USER_ID } from '@plyaz/types/core';\nimport type { FilesEntity, FilesDatabaseRow, FileType, FilesCreateInput } from '@plyaz/types/core';\nimport type { FilesStoreItem, GeneratedFileItem } from '@plyaz/types/store';\nimport type { UploadResult } from '@plyaz/types/storage';\n\n/**\n * Files Mapper implementation\n *\n * Maps between:\n * - API responses → Domain Entity (toDomain)\n * - Domain Entity → Store State (toStoreState)\n * - Database Row → API Response (toResponseDTO)\n */\nclass FilesMapperClass extends BaseMapper<\n  FilesEntity,\n  GetFileResponse,\n  FilesCreateInput,\n  FilesCreateInput,\n  Partial<FilesCreateInput>,\n  Record<string, unknown>,\n  FilesStoreItem\n> {\n  /**\n   * Type guard for UploadResult from event payloads\n   * Validates that the value has the required structure for DB mapping\n   */\n  static isUploadResult(value: unknown): value is UploadResult {\n    if (!isObject(value)) return false;\n    const obj = value as Record<string, unknown>;\n    if (!isObject(obj.metadata)) return false;\n    const metadata = obj.metadata as Record<string, unknown>;\n    return (\n      typeof metadata.fileId === 'string' &&\n      typeof metadata.filename === 'string' &&\n      typeof metadata.mimeType === 'string' &&\n      typeof metadata.size === 'number' &&\n      typeof metadata.path === 'string'\n    );\n  }\n\n  /**\n   * Infer file type from MIME type\n   * DB ENUM only supports: IMAGE, VIDEO, AUDIO, DOCUMENT\n   * Default to DOCUMENT for unknown types\n   */\n  static inferFileType(mimeType: string): FileType {\n    if (mimeType.startsWith('image/')) return 'IMAGE';\n    if (mimeType.startsWith('video/')) return 'VIDEO';\n    if (mimeType.startsWith('audio/')) return 'AUDIO';\n    // DOCUMENT is the default - covers PDFs, text, office docs, and unknown types\n    // Note: DB ENUM doesn't have 'OTHER', so we use DOCUMENT as fallback\n    return 'DOCUMENT';\n  }\n\n  /**\n   * API Response → Domain Entity\n   */\n  toDomain(dto: GetFileResponse | UploadFileResponse): FilesEntity {\n    const type = FilesMapperClass.inferFileType(dto.mimeType);\n    return {\n      id: dto.id,\n      key: dto.key,\n      filename: dto.filename,\n      mimeType: dto.mimeType,\n      size: dto.size,\n      checksum: dto.checksum,\n      url: dto.url,\n      publicUrl: dto.publicUrl,\n      signedUrl: dto.signedUrl,\n      bucket: dto.bucket,\n      entityType: dto.entityType,\n      entityId: dto.entityId,\n      category: dto.category,\n      uploadedAt: new Date(dto.uploadedAt),\n      expiresAt: dto.expiresAt ? new Date(dto.expiresAt) : undefined,\n      variants: (dto as UploadFileResponse).variants,\n      type,\n      isImage: type === 'IMAGE',\n      isVideo: type === 'VIDEO',\n      isDocument: type === 'DOCUMENT',\n      isAudio: type === 'AUDIO',\n    };\n  }\n\n  /**\n   * Domain Entity → Store State (serializable)\n   */\n  toStoreState(entity: FilesEntity): FilesStoreItem {\n    return {\n      id: entity.id,\n      key: entity.key,\n      filename: entity.filename,\n      mimeType: entity.mimeType,\n      size: entity.size,\n      url: entity.url,\n      publicUrl: entity.publicUrl,\n      bucket: entity.bucket,\n      entityType: entity.entityType,\n      entityId: entity.entityId,\n      category: entity.category,\n      uploadedAt: entity.uploadedAt.toISOString(),\n      type: entity.type,\n      isImage: entity.isImage,\n      isVideo: entity.isVideo,\n      isDocument: entity.isDocument,\n      isAudio: entity.isAudio,\n    };\n  }\n\n  /**\n   * Store State → Domain Entity\n   */\n  fromStoreState(state: FilesStoreItem): FilesEntity {\n    return {\n      id: state.id,\n      key: state.key,\n      filename: state.filename,\n      mimeType: state.mimeType,\n      size: state.size,\n      url: state.url,\n      publicUrl: state.publicUrl,\n      bucket: state.bucket,\n      entityType: state.entityType,\n      entityId: state.entityId,\n      category: state.category,\n      uploadedAt: new Date(state.uploadedAt),\n      type: state.type,\n      isImage: state.isImage,\n      isVideo: state.isVideo,\n      isDocument: state.isDocument,\n      isAudio: state.isAudio,\n    };\n  }\n\n  /**\n   * Database Row → API Response (for backend)\n   */\n  toResponseDTO(row: FilesDatabaseRow): GetFileResponse {\n    return {\n      id: row.id,\n      key: row.storage_path,\n      filename: row.filename,\n      mimeType: row.mime_type,\n      size: toNumber(row.file_size),\n      checksum: undefined,\n      url: toOptional(row.cdn_url),\n      publicUrl: toOptional(row.cdn_url),\n      signedUrl: undefined,\n      bucket: row.bucket ?? 'uploads', // Default bucket for legacy records\n      entityType: toOptional(row.entity_type),\n      entityId: toOptional(row.entity_id),\n      category: undefined,\n      uploadedAt: row.created_at,\n      expiresAt: undefined,\n    };\n  }\n\n  /**\n   * Create GeneratedFileItem from generation result\n   */\n  toGeneratedFileItem(\n    templateId: string,\n    buffer: string,\n    size: number,\n    outputFormat: string = 'pdf'\n  ): GeneratedFileItem {\n    return {\n      id: crypto.randomUUID(),\n      templateId,\n      buffer,\n      size,\n      mimeType: `application/${outputFormat}`,\n      filename: `${templateId}.${outputFormat}`,\n      generatedAt: new Date().toISOString(),\n    };\n  }\n\n  /**\n   * Convert upload result to database row format\n   * Used by event handlers to persist upload results to DB\n   *\n   * @param uploadResult - Result from storage upload\n   * @param userId - User ID who uploaded the file (from auth context)\n   * @returns Partial database row ready for repository.create()\n   */\n  toDbRow(uploadResult: UploadResult, userId?: string): Partial<FilesDatabaseRow> {\n    const { metadata, variants } = uploadResult;\n\n    // Note: We don't set 'id' here - let DB auto-generate UUID\n    // The fileId from storage (path) is stored in storage_path\n    return {\n      // Required fields\n      user_id: userId ?? SYSTEM_USER_ID,\n      type: FilesMapperClass.inferFileType(metadata.mimeType),\n      filename: metadata.filename,\n      original_filename: metadata.filename,\n      mime_type: metadata.mimeType,\n      file_size: metadata.size,\n      storage_path: metadata.path,\n      entity_type: metadata.entityType,\n      access_level: metadata.accessLevel,\n      is_virus_scanned: false,\n      // Optional nullable fields\n      cdn_url: toNullable(metadata.url),\n      width: toNullable(metadata.extractedMetadata?.width),\n      height: toNullable(metadata.extractedMetadata?.height),\n      duration: toNullable(metadata.extractedMetadata?.duration),\n      // DB column is UUID type - only set if value is a valid UUID, otherwise null\n      entity_id: isValidUUID(metadata.entityId) ? metadata.entityId : null,\n      bucket: toNullable(metadata.bucket),\n      virus_scan_result: null,\n      metadata: toNullable(metadata.customMetadata),\n      variants: toNullable(variants),\n    };\n  }\n}\n\nexport { FilesMapperClass };\nexport const FilesMapper = new FilesMapperClass();\n","/**\n * Frontend Files Domain Service\n *\n * Uses inherited methods from BaseFrontendDomainService:\n * - uploadFile() - inherited (POST /upload via @plyaz/api)\n * - uploadFiles() - inherited (POST /upload/bulk via @plyaz/api)\n * - generateFile() - inherited (POST /generate-document via @plyaz/api)\n * - fetchById() - via fetchers.fetchById (GET /files/:id)\n * - delete() - via fetchers.delete (DELETE /files/:id)\n *\n * Custom methods:\n * - download() - GET /files/:id/download\n * - getSignedUrlForFile() - GET /files/:id/signed-url\n */\n\nimport { STORE_KEYS } from '@plyaz/store';\nimport { PackageLogger } from '@plyaz/logger';\nimport { getFile, deleteFile, downloadFile, getSignedUrl } from '@plyaz/api';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type { CoreBaseValidatorInstance, CoreServiceCreateOptions } from '@plyaz/types/core';\nimport type {\n  DownloadFileRequest,\n  DownloadFileResponse,\n  GetSignedUrlRequest,\n  GetSignedUrlResponse,\n  GetFileResponse,\n  ServiceOptions,\n} from '@plyaz/types/api';\nimport type {\n  FilesEntity,\n  FilesFrontendServiceConfig,\n  FilesCreateInput,\n  FilesUploadEventPayload,\n  FileDocumentGeneratedEventPayload,\n  FilesUploadStreamProgress,\n  FilesDownloadStreamProgress,\n  FilesGenerateStreamProgress,\n} from '@plyaz/types/core';\n\n/** Union of all files event payloads for type-safe handlers */\ntype FilesEventPayload = FilesUploadEventPayload | FileDocumentGeneratedEventPayload | void;\nimport type {\n  FilesFrontendStoreSlice,\n  FilesFrontendStoreData,\n  FilesStoreItem,\n} from '@plyaz/types/store';\nimport { BaseFrontendDomainService } from '../base';\nimport type {\n  CoreStreamHandlerDeclaration,\n  CoreStreamHandlerIds,\n  CoreStreamStoreGetter,\n  StreamMessage,\n} from '@plyaz/types/core';\nimport { FilesMapperClass, FilesMapper } from './mappers/FilesMapper';\nimport { FrontendEventPersistenceHandler } from '../../events/FrontendEventPersistenceHandler';\nimport { Core } from '../../init/CoreInitializer';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'FrontendFilesDomainService' });\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Frontend Files Domain Service\n *\n * Inherited from BaseFrontendDomainService:\n * - uploadFile() - upload single file\n * - uploadFiles() - upload multiple files\n * - generateFile() - generate document\n * - fetchById() - get file metadata\n * - delete() - delete file\n *\n * Custom methods:\n * - download() - download file content\n * - getSignedUrlForFile() - get signed URL\n */\nexport class FrontendFilesDomainService extends BaseFrontendDomainService<\n  FilesFrontendServiceConfig,\n  FilesFrontendStoreSlice,\n  FilesFrontendStoreData,\n  FilesEntity,\n  GetFileResponse,\n  FilesCreateInput,\n  Partial<FilesCreateInput>,\n  Record<string, unknown>,\n  FilesStoreItem,\n  InstanceType<typeof FilesMapperClass>,\n  CoreBaseValidatorInstance,\n  void\n> {\n  static readonly serviceKey = SERVICE_KEYS.FILES_FRONTEND;\n\n  /**\n   * Primary store key for this service.\n   * Used by ServiceRegistry to auto-inject the store.\n   * Must be static for base class constructor to access.\n   */\n  static readonly primaryStoreKey = STORE_KEYS.FILES;\n\n  protected eventPrefix = 'files';\n\n  static async create(\n    config: FilesFrontendServiceConfig = {},\n    options?: CoreServiceCreateOptions\n  ): Promise<FrontendFilesDomainService> {\n    // Auto-register event handlers when service is created\n    this.registerEventHandlers();\n\n    const mergedConfig: FilesFrontendServiceConfig = {\n      ...config,\n      // Use || instead of ?? because api.baseURL may be '' (empty string) for same-origin requests.\n      // The ?? operator only falls through on null/undefined, not empty strings.\n      // An empty string is not a valid API path, so we treat it as \"not provided\" and fall through to default.\n      // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n      apiBasePath: config.apiBasePath || options?.apiClient?.options?.baseURL || '',\n    };\n\n    return new FrontendFilesDomainService(mergedConfig, options);\n  }\n\n  constructor(config: FilesFrontendServiceConfig = {}, options?: CoreServiceCreateOptions) {\n    // Use || instead of ?? because apiBasePath may be '' (empty string) from config.\n    // Empty string is not a valid API path, so treat it as \"not provided\" and use default.\n    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n    const apiBasePath = config.apiBasePath || '';\n\n    super({\n      serviceName: 'FrontendFilesDomainService',\n      supportedRuntimes: ['frontend'],\n      serviceConfig: {\n        enabled: true,\n        apiBasePath,\n        responseDataKey: 'data',\n        ...config,\n        // Configure fetchers for CRUD operations\n        // Note: ID validation handled by base class validator\n        fetchers: {\n          fetchById: async (id?: string) => {\n            return getFile({ id: id! });\n          },\n          delete: async (id?: string) => {\n            return deleteFile({ id: id! });\n          },\n        },\n        // Configure storeHandlers for domain-specific store operations\n        // These are called by base class methods (fetchById, delete, etc.)\n        storeHandlers: {\n          // Use addFile with duplicate check instead of generic addData\n          addData: (store, item) => store.addFile(item as FilesEntity),\n          // Remove from both files list and uploads list\n          removeData: (store, id) => {\n            store.removeFile(id);\n            store.removeUpload(id);\n          },\n        },\n      },\n      mapperClass: FilesMapperClass,\n      injected: options?.injected,\n    });\n  }\n\n  isAvailable(): boolean {\n    return this.isServiceEnabled && typeof window !== 'undefined';\n  }\n\n  dispose(): void {\n    // Call super to auto-cleanup stream handlers and stop polling\n    super.dispose();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Event Registration\n  // ─────────────────────────────────────────────────────────────────────────\n\n  private static _eventHandlersRegistered = false;\n\n  /** Stream handler IDs - overrides base class pattern */\n  protected static override readonly STREAM_HANDLER_IDS: CoreStreamHandlerIds<\n    'UPLOAD_PROGRESS' | 'DOWNLOAD_PROGRESS' | 'GENERATE_PROGRESS'\n  > = {\n    UPLOAD_PROGRESS: 'files:upload-progress',\n    DOWNLOAD_PROGRESS: 'files:download-progress',\n    GENERATE_PROGRESS: 'files:generate-progress',\n  };\n\n  /** Default priority for stream handlers */\n  private static readonly DEFAULT_HANDLER_PRIORITY = 100;\n\n  /**\n   * Declarative stream handlers - auto-registered by base class\n   */\n  /* eslint-disable complexity */\n  protected static override readonly STREAM_HANDLERS: CoreStreamHandlerDeclaration[] = [\n    // Upload progress handler - only handles upload-specific events\n    {\n      id: FrontendFilesDomainService.STREAM_HANDLER_IDS.UPLOAD_PROGRESS,\n      channels: ['uploads', 'upload:'],\n      events: ['upload:progress', 'upload:completed', 'upload:failed'],\n      priority: FrontendFilesDomainService.DEFAULT_HANDLER_PRIORITY,\n      handler: (message: StreamMessage<unknown>, getStore: CoreStreamStoreGetter): void => {\n        const data = message.data as FilesUploadStreamProgress;\n        if (!data?.fileId) return;\n\n        const filesStore = getStore()?.[STORE_KEYS.FILES] as FilesFrontendStoreSlice | undefined;\n        if (!filesStore?.setUploadProgress) return;\n\n        filesStore.setUploadProgress(data.fileId, {\n          fileId: data.fileId,\n          filename: data.filename ?? 'unknown',\n          percentage: data.percentage ?? 0,\n          status: data.status ?? 'uploading',\n          loaded: data.loaded ?? 0,\n          total: data.total ?? 0,\n          speed: data.speed,\n          estimatedTimeRemaining: data.estimatedTimeRemaining,\n          error: data.error,\n        });\n      },\n    },\n    // Download progress handler - only handles download-specific events\n    {\n      id: FrontendFilesDomainService.STREAM_HANDLER_IDS.DOWNLOAD_PROGRESS,\n      channels: ['downloads', 'download:'],\n      events: ['download:progress', 'download:completed', 'download:failed'],\n      priority: FrontendFilesDomainService.DEFAULT_HANDLER_PRIORITY,\n      handler: (message: StreamMessage<unknown>, getStore: CoreStreamStoreGetter): void => {\n        const data = message.data as FilesDownloadStreamProgress;\n        if (!data?.fileId) return;\n\n        const filesStore = getStore()?.[STORE_KEYS.FILES] as FilesFrontendStoreSlice | undefined;\n        if (!filesStore?.setDownloadProgress) return;\n\n        filesStore.setDownloadProgress(data.fileId, {\n          fileId: data.fileId,\n          filename: data.filename ?? 'unknown',\n          percentage: data.percentage ?? 0,\n          status: data.status ?? 'downloading',\n          loaded: data.loaded ?? 0,\n          total: data.total ?? 0,\n          speed: data.speed,\n          estimatedTimeRemaining: data.estimatedTimeRemaining,\n          error: data.error,\n        });\n      },\n    },\n    // Generate progress handler - only handles generate-specific events\n    {\n      id: FrontendFilesDomainService.STREAM_HANDLER_IDS.GENERATE_PROGRESS,\n      channels: ['generations', 'generate:'],\n      events: ['generate:progress', 'generate:completed', 'generate:failed'],\n      priority: FrontendFilesDomainService.DEFAULT_HANDLER_PRIORITY,\n      handler: (message: StreamMessage<unknown>, getStore: CoreStreamStoreGetter): void => {\n        const data = message.data as FilesGenerateStreamProgress;\n        if (!data?.templateId) return;\n\n        const filesStore = getStore()?.[STORE_KEYS.FILES] as FilesFrontendStoreSlice | undefined;\n        if (!filesStore?.setGenerateProgress) return;\n\n        filesStore.setGenerateProgress({\n          templateId: data.templateId,\n          percentage: data.percentage ?? 0,\n          status: data.status ?? 'generating',\n        });\n      },\n    },\n  ];\n  /* eslint-enable complexity */\n\n  /**\n   * Register all frontend event handlers for files domain.\n   *\n   * Handles:\n   * 1. Loading state events (setUploading, setGenerating)\n   * 2. Data persistence events (addUpload, addGenerated)\n   *\n   * Uses CoreEventManager to listen for file events from ANY service.\n   * This ensures a single source of truth via events.\n   *\n   * @param verbose - Enable verbose logging\n   * @returns Cleanup function to unregister all handlers\n   *\n   * @example\n   * ```typescript\n   * // Auto-called during Core.initialize() for frontend\n   * FrontendFilesDomainService.registerEventHandlers(verbose);\n   * ```\n   */\n  static registerEventHandlers(verbose?: boolean): () => void {\n    // Skip if already registered\n    if (this._eventHandlersRegistered) {\n      logger.debug('Files frontend event handlers already registered');\n      return () => {};\n    }\n\n    // Helper to safely get files store\n    const getFilesStore = (): FilesFrontendStoreSlice | undefined => {\n      try {\n        return Core.rootStore?.getState().files;\n      } catch {\n        return undefined;\n      }\n    };\n\n    // Register all files events in one place\n    FrontendEventPersistenceHandler.register<FilesFrontendStoreSlice, FilesEventPayload>({\n      domain: 'files',\n      events: {\n        // Upload events\n        'files:upload:uploading': {\n          handler: (store: FilesFrontendStoreSlice) => store.setUploading(true),\n        },\n        'files:upload:uploaded': {\n          handler: (store: FilesFrontendStoreSlice, payload: FilesEventPayload) => {\n            store.setUploading(false);\n            const p = payload as FilesUploadEventPayload;\n            if (!p?.result) return;\n\n            // Bulk upload: result has results array\n            if (p.bulk) {\n              const entities = p.result.results\n                .filter((r: { success?: boolean; data?: unknown }) => r.success && r.data)\n                .map((r: { data?: unknown }) =>\n                  FilesMapper.toDomain(r.data as Parameters<typeof FilesMapper.toDomain>[0])\n                );\n              store.addUpload(entities);\n            } else {\n              // Single upload\n              store.addUpload(FilesMapper.toDomain(p.result));\n            }\n          },\n        },\n        'files:upload:error': {\n          handler: (store: FilesFrontendStoreSlice) => store.setUploading(false),\n        },\n\n        // Document generation events\n        'files:document:generating': {\n          handler: (store: FilesFrontendStoreSlice) => store.setGenerating(true),\n        },\n        'files:document:generated': {\n          handler: (store: FilesFrontendStoreSlice, payload: FilesEventPayload) => {\n            store.setGenerating(false);\n            const p = payload as FileDocumentGeneratedEventPayload;\n            if (!p?.result?.buffer) return;\n\n            const item = FilesMapper.toGeneratedFileItem(\n              p.request.templateId,\n              p.result.buffer,\n              p.result.size,\n              p.request.outputFormat ?? 'pdf'\n            );\n            store.addGenerated(item);\n          },\n        },\n        'files:document:error': {\n          handler: (store: FilesFrontendStoreSlice) => store.setGenerating(false),\n        },\n      },\n      getStore: getFilesStore,\n      verbose,\n    });\n\n    this._eventHandlersRegistered = true;\n    logger.info('Files frontend event handlers registered');\n\n    // Return cleanup function\n    return () => {\n      FrontendEventPersistenceHandler.unregisterAll();\n      this._eventHandlersRegistered = false;\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // File Operations (following base class CRUD pattern)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Download file content\n   * GET /files/:id/download\n   *\n   * Follows same pattern as CRUD methods:\n   * 1. ensureReady\n   * 2. Lifecycle hook: beforeDownload\n   * 3. Call fetcher\n   * 4. Lifecycle hook: afterDownload\n   * 5. Emit events\n   * 6. Record metrics\n   */\n  async download(\n    request: DownloadFileRequest,\n    options?: ServiceOptions\n  ): Promise<DownloadFileResponse> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    this.emitEvent('download:downloading', { request });\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeDownload?.(request);\n\n      // 2. Call fetcher (pass serviceOptions for strategy/config overrides)\n      const response = await downloadFile(request, options);\n\n      // 3. Check response success\n      if (!this.isResponseSuccess(response)) {\n        const error = this.extractResponseError(response);\n        throw this.wrapError(error, 'download');\n      }\n\n      // 4. Unwrap response\n      const result = this.unwrapResponseData<DownloadFileResponse>(response.data);\n\n      // 5. Lifecycle hook\n      await this.afterDownload?.(result);\n\n      // 6. Emit success event\n      this.emitEvent('download:downloaded', { result });\n\n      await this.recordOperationMetrics('download', Date.now() - startTime, true);\n      return result;\n    } catch (error) {\n      await this.recordOperationMetrics('download', Date.now() - startTime, false);\n      this.emitEvent('download:error', { error });\n      throw this.wrapError(error, 'download');\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before download.\n   * Override in subclass for custom pre-download logic.\n   */\n  protected beforeDownload?(request: DownloadFileRequest): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after download.\n   * Override in subclass for custom post-download logic.\n   */\n  protected afterDownload?(result: DownloadFileResponse): Promise<void>;\n\n  /**\n   * Get signed URL for file\n   * GET /files/:id/signed-url\n   *\n   * Follows same pattern as CRUD methods.\n   */\n  async getSignedUrlForFile(request: GetSignedUrlRequest): Promise<GetSignedUrlResponse> {\n    await this.ensureReady();\n    const startTime = Date.now();\n\n    this.emitEvent('signedUrl:requesting', { request });\n\n    try {\n      // 1. Lifecycle hook\n      await this.beforeGetSignedUrl?.(request);\n\n      // 2. Call fetcher\n      const response = await getSignedUrl(request);\n\n      // 3. Check response success\n      if (!this.isResponseSuccess(response)) {\n        const error = this.extractResponseError(response);\n        throw this.wrapError(error, 'getSignedUrl');\n      }\n\n      // 4. Unwrap response\n      const result = this.unwrapResponseData<GetSignedUrlResponse>(response.data);\n\n      // 5. Lifecycle hook\n      await this.afterGetSignedUrl?.(result);\n\n      // 6. Emit success event\n      this.emitEvent('signedUrl:received', { result });\n\n      await this.recordOperationMetrics('getSignedUrl', Date.now() - startTime, true);\n      return result;\n    } catch (error) {\n      await this.recordOperationMetrics('getSignedUrl', Date.now() - startTime, false);\n      this.emitEvent('signedUrl:error', { error });\n      throw this.wrapError(error, 'getSignedUrl');\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before getting signed URL.\n   * Override in subclass for custom pre-signedUrl logic.\n   */\n  protected beforeGetSignedUrl?(request: GetSignedUrlRequest): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after getting signed URL.\n   * Override in subclass for custom post-signedUrl logic.\n   */\n  protected afterGetSignedUrl?(result: GetSignedUrlResponse): Promise<void>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Singleton\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _instance: FrontendFilesDomainService | null = null;\n\nexport async function getFrontendFilesDomainService(\n  config?: FilesFrontendServiceConfig,\n  options?: CoreServiceCreateOptions\n): Promise<FrontendFilesDomainService> {\n  _instance ??= await FrontendFilesDomainService.create(config, options);\n  return _instance;\n}\n\nexport function resetFilesFrontendService(): void {\n  if (_instance) {\n    _instance.dispose();\n    _instance = null;\n  }\n}\n","/**\n * Notifications Mapper\n *\n * Transforms data between API DTOs, domain models, and store state.\n * Supports IN_APP notifications only (not email/sms/push).\n *\n * Methods:\n * - toDomain: API DTO → Domain Model\n * - toQueryDTO: Filters → Query params\n * - toStoreState: Domain → Zustand store\n * - fromStoreState: Store → Domain\n * - toDbRow: Domain/Event payload → Database row\n * - toCreateDTO/toUpdateDTO/toPatchDTO: For backend operations\n */\n\nimport { PAGE_SIZES } from '@plyaz/config';\nimport { BaseMapper } from '../../base';\nimport { toOptional, getField, parseDateSafe } from '../../../utils/mapperUtils';\nimport { SYSTEM_USER_ID } from '@plyaz/types/core';\nimport type {\n  NotificationsEntity,\n  NotificationsResponseDTO,\n  NotificationStoreItem,\n  QueryNotificationsDTO,\n  CreateNotificationsDTO,\n  UpdateNotificationsDTO,\n  PatchNotificationsDTO,\n  NotificationsDatabaseRow,\n  NotificationCreatedStreamData,\n} from '@plyaz/types/core';\n\n/** Default pagination values */\nconst PAGINATION_DEFAULTS = {\n  PAGE: 1,\n  LIMIT: PAGE_SIZES.MEDIUM,\n} as const;\n\n/** Valid DB channel values */\nconst DB_CHANNELS = ['IN_APP', 'EMAIL', 'SMS', 'PUSH'] as const;\n\n/** Preference fields that can be toggled */\ntype PreferenceToggleField =\n  | 'marketing_enabled'\n  | 'promotional_enabled'\n  | 'social_enabled'\n  | 'system_enabled';\n\n/**\n * Notifications Mapper implementation\n * Supports IN_APP notifications only\n */\nclass NotificationsMapperClass extends BaseMapper<\n  NotificationsEntity,\n  NotificationsResponseDTO,\n  CreateNotificationsDTO,\n  UpdateNotificationsDTO,\n  PatchNotificationsDTO,\n  QueryNotificationsDTO,\n  NotificationStoreItem\n> {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Methods: Channel/Category Conversion\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Map DTO channel to DB channel (uppercase)\n   * DTO: email, sms, push → DB: EMAIL, SMS, PUSH\n   */\n  static mapChannelToDb(channel?: string | null): NotificationsDatabaseRow['channel'] {\n    if (!channel) return 'IN_APP'; // Default to IN_APP\n    const upper = channel.toUpperCase();\n    if (DB_CHANNELS.includes(upper as (typeof DB_CHANNELS)[number])) {\n      return upper as NotificationsDatabaseRow['channel'];\n    }\n    return 'IN_APP';\n  }\n\n  /**\n   * Map category to DB format\n   */\n  static mapCategoryToDb(category?: string | null): NotificationsDatabaseRow['category'] {\n    if (!category) return 'transactional';\n    return category as NotificationsDatabaseRow['category'];\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Instance Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * API DTO → Domain Model\n   * Handles both snake_case (DTO) and camelCase (Entity) input formats\n   */\n  toDomain(dto: NotificationsResponseDTO | NotificationsEntity): NotificationsEntity {\n    const data = dto as unknown as Record<string, unknown>;\n\n    return {\n      id: dto.id,\n      userId: getField<string>(data, 'user_id', 'userId') ?? '',\n      type: dto.type,\n      title: dto.title,\n      message: dto.message,\n      linkUrl: getField<string>(data, 'link_url', 'linkUrl'),\n      referenceId: getField<string>(data, 'reference_id', 'referenceId'),\n      referenceType: getField<string>(data, 'reference_type', 'referenceType'),\n      correlationId: getField<string>(data, 'correlation_id', 'correlationId'),\n      recipientId: getField<string>(data, 'recipient_id', 'recipientId') ?? '',\n      templateId: getField<string>(data, 'template_id', 'templateId'),\n      channel: dto.channel,\n      category: dto.category,\n      provider: dto.provider,\n      providerMessageId: getField<string>(data, 'provider_message_id', 'providerMessageId'),\n      status: dto.status,\n      sentAt: parseDateSafe(getField(data, 'sent_at', 'sentAt')),\n      deliveredAt: parseDateSafe(getField(data, 'delivered_at', 'deliveredAt')),\n      isRead: getField<boolean>(data, 'is_read', 'isRead') ?? false,\n      readAt: parseDateSafe(getField(data, 'read_at', 'readAt')),\n      errorMessage: getField<string>(data, 'error_message', 'errorMessage'),\n      retryCount: getField<number>(data, 'retry_count', 'retryCount') ?? 0,\n      createdAt: parseDateSafe(getField(data, 'created_at', 'createdAt')) ?? new Date(),\n      deletedAt: parseDateSafe(getField(data, 'deleted_at', 'deletedAt')),\n    };\n  }\n\n  /**\n   * Database Row → API Response DTO (for backend)\n   */\n  toResponseDTO(row: NotificationsDatabaseRow): NotificationsResponseDTO {\n    return {\n      // Required fields\n      id: row.id,\n      user_id: row.user_id,\n      type: row.type,\n      title: row.title,\n      message: row.message,\n      recipient_id: row.recipient_id,\n      status: row.status,\n      is_read: row.is_read,\n      retry_count: row.retry_count,\n      created_at: row.created_at,\n      // Optional fields\n      link_url: toOptional(row.link_url),\n      reference_id: toOptional(row.reference_id),\n      reference_type: toOptional(row.reference_type),\n      correlation_id: toOptional(row.correlation_id),\n      template_id: toOptional(row.template_id),\n      channel: toOptional(row.channel),\n      category: toOptional(row.category),\n      provider: toOptional(row.provider),\n      provider_message_id: toOptional(row.provider_message_id),\n      sent_at: toOptional(row.sent_at),\n      delivered_at: toOptional(row.delivered_at),\n      read_at: toOptional(row.read_at),\n      error_message: toOptional(row.error_message),\n      deleted_at: toOptional(row.deleted_at),\n    };\n  }\n\n  /**\n   * Filters → Query params DTO (GET)\n   */\n  toQueryDTO(filters: Partial<QueryNotificationsDTO>): QueryNotificationsDTO {\n    return {\n      page: filters.page ?? PAGINATION_DEFAULTS.PAGE,\n      limit: filters.limit ?? PAGINATION_DEFAULTS.LIMIT,\n      sort_by: filters.sort_by ?? 'created_at',\n      sort_order: filters.sort_order ?? 'desc',\n      user_id: filters.user_id,\n      channel: filters.channel,\n      status: filters.status,\n      category: filters.category,\n      template_id: filters.template_id,\n      recipient_id: filters.recipient_id,\n      type: filters.type,\n      is_read: filters.is_read,\n      created_after: filters.created_after,\n      created_before: filters.created_before,\n    };\n  }\n\n  /**\n   * Domain → Store state (serializable)\n   * For IN_APP notifications store\n   */\n  toStoreState(domain: NotificationsEntity): NotificationStoreItem {\n    return {\n      id: domain.id,\n      type: domain.type,\n      title: domain.title,\n      message: domain.message,\n      linkUrl: domain.linkUrl,\n      referenceId: domain.referenceId,\n      referenceType: domain.referenceType,\n      category: domain.category ?? 'transactional',\n      status: domain.status,\n      isRead: domain.isRead,\n      readAt: domain.readAt?.toISOString(),\n      createdAt: domain.createdAt.toISOString(),\n    };\n  }\n\n  /**\n   * Store state → Domain (restore)\n   */\n  fromStoreState(state: NotificationStoreItem): NotificationsEntity {\n    return {\n      id: state.id,\n      userId: '',\n      type: state.type as NotificationsEntity['type'],\n      title: state.title,\n      message: state.message,\n      linkUrl: state.linkUrl,\n      referenceId: state.referenceId,\n      referenceType: state.referenceType,\n      recipientId: '',\n      category: state.category,\n      status: state.status,\n      isRead: state.isRead,\n      readAt: state.readAt ? new Date(state.readAt) : undefined,\n      retryCount: 0,\n      createdAt: new Date(state.createdAt),\n    };\n  }\n\n  /**\n   * Domain Entity → Create DTO (for backend)\n   */\n  toCreateDTO(entity: NotificationsEntity): CreateNotificationsDTO {\n    return {\n      userId: entity.userId,\n      type: entity.type,\n      title: entity.title,\n      message: entity.message,\n      linkUrl: entity.linkUrl,\n      referenceId: entity.referenceId,\n      referenceType: entity.referenceType,\n      correlationId: entity.correlationId,\n      recipientId: entity.recipientId,\n      templateId: entity.templateId,\n      channel: entity.channel,\n      category: entity.category,\n      provider: entity.provider,\n      providerMessageId: entity.providerMessageId,\n    };\n  }\n\n  /**\n   * Domain Entity → Update DTO (for backend)\n   */\n  toUpdateDTO(entity: NotificationsEntity): UpdateNotificationsDTO {\n    return this.toCreateDTO(entity);\n  }\n\n  /**\n   * Partial Domain → Patch DTO (for backend)\n   */\n  toPatchDTO(partial: Partial<NotificationsEntity>): PatchNotificationsDTO {\n    return {\n      is_read: partial.isRead,\n      read_at: partial.readAt?.toISOString(),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Stream Data Conversion\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Domain Entity → Stream Data (for broadcasting via SSE/WebSocket)\n   * Used by backend afterCreate hook to emit notification:created event\n   */\n  toStreamData(entity: NotificationsEntity): NotificationCreatedStreamData {\n    return {\n      notificationId: entity.id,\n      userId: entity.userId,\n      type: entity.type,\n      title: entity.title,\n      message: entity.message,\n      linkUrl: entity.linkUrl,\n      referenceId: entity.referenceId,\n      referenceType: entity.referenceType,\n      category: entity.category ?? 'transactional',\n      status: entity.status,\n      createdAt: entity.createdAt.toISOString(),\n      timestamp: new Date().toISOString(),\n    };\n  }\n\n  /**\n   * Stream Data → Store Item (for frontend store)\n   * Used by frontend stream handler to add notification to store\n   */\n  fromStreamData(streamData: NotificationCreatedStreamData): NotificationStoreItem {\n    return {\n      id: streamData.notificationId,\n      type: streamData.type,\n      title: streamData.title,\n      message: streamData.message,\n      linkUrl: streamData.linkUrl,\n      referenceId: streamData.referenceId,\n      referenceType: streamData.referenceType,\n      category: streamData.category,\n      status: streamData.status,\n      isRead: false,\n      createdAt: streamData.createdAt,\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Database Row Conversion\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Convert event payload/entity to database row format\n   * Used by event handlers to persist notifications to DB\n   */\n  toDbRow(\n    payload: Partial<NotificationsEntity> | Record<string, unknown>,\n    userId?: string\n  ): Partial<NotificationsDatabaseRow> {\n    const data = payload as Partial<NotificationsEntity>;\n    return {\n      user_id: userId ?? data.userId ?? SYSTEM_USER_ID,\n      type: data.type ?? 'SYSTEM',\n      title: data.title ?? '',\n      message: data.message ?? '',\n      link_url: data.linkUrl ?? null,\n      reference_id: data.referenceId ?? null,\n      reference_type: data.referenceType ?? null,\n      correlation_id: data.correlationId ?? null,\n      recipient_id: data.recipientId ?? '',\n      template_id: data.templateId ?? null,\n      channel: NotificationsMapperClass.mapChannelToDb(data.channel),\n      category: data.category ?? null,\n      provider: data.provider ?? null,\n      provider_message_id: data.providerMessageId ?? null,\n      status: data.status ?? 'queued',\n      sent_at: data.sentAt?.toISOString() ?? null,\n      delivered_at: data.deliveredAt?.toISOString() ?? null,\n      is_read: data.isRead ?? false,\n      read_at: data.readAt?.toISOString() ?? null,\n      error_message: data.errorMessage ?? null,\n      retry_count: data.retryCount ?? 0,\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Preference Mapping\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /** Category to preference field mapping */\n  private static readonly CATEGORY_PREFERENCE_MAP: Record<string, PreferenceToggleField> = {\n    marketing: 'marketing_enabled',\n    promotional: 'promotional_enabled',\n    social: 'social_enabled',\n    system: 'system_enabled',\n  };\n\n  /**\n   * Map notification category to preference database field.\n   * Returns the field name to disable for unsubscribe.\n   */\n  static mapCategoryToPreferenceField(category: string): PreferenceToggleField | undefined {\n    return this.CATEGORY_PREFERENCE_MAP[category];\n  }\n}\n\n// Export class for BaseDomainService.MapperClass\nexport { NotificationsMapperClass };\n\n// Singleton instance (for direct usage)\nexport const NotificationsMapper = new NotificationsMapperClass();\n","/**\n * Notifications Validator\n *\n * Validates and sanitizes Notifications DTOs using Zod schemas from @plyaz/types.\n * Supports list/delete operations for frontend, full CRUD for backend.\n *\n * Operations:\n * - delete (DELETE) - validateDelete, validateDeleteOrThrow\n * - query (GET)   - validateQuery, validateQueryOrThrow\n * - create (POST) - validateCreate, validateCreateOrThrow (backend)\n */\n\nimport { z } from 'zod';\nimport { BaseValidator } from '../../base';\nimport {\n  // Schemas (single source of truth from @plyaz/types)\n  DeleteNotificationsSchema,\n  QueryNotificationsSchema,\n  CreateNotificationsSchema,\n} from '@plyaz/types/core';\nimport type {\n  DeleteNotificationsDTO,\n  QueryNotificationsDTO,\n  CreateNotificationsDTO,\n} from '@plyaz/types/core';\nimport type { NotificationCategory, NotificationChannel } from '@plyaz/types/notifications';\nimport { NotificationPackageError } from '@plyaz/errors';\nimport { NOTIFICATION_ERROR_CODES } from '@plyaz/types/errors';\nimport { isInQuietHours } from '../../../utils/common';\nimport type { NotificationPreferencesDatabaseRow } from '../../../models/notifications';\n\n/** Categories that can be unsubscribed from (excludes 'transactional') */\nconst UNSUBSCRIBABLE_CATEGORIES: NotificationCategory[] = [\n  'marketing',\n  'promotional',\n  'social',\n  'system',\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Validator Class\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Notifications Validator implementation\n * Supports list/delete for frontend, full CRUD for backend\n *\n * All schemas imported from @plyaz/types/core - single source of truth\n *\n * Available methods:\n * - validateDelete(data) → ValidationResult<DeleteNotificationsDTO>\n * - validateDeleteOrThrow(data) → DeleteNotificationsDTO\n * - validateQuery(data) → ValidationResult<QueryNotificationsDTO>\n * - validateQueryOrThrow(data) → QueryNotificationsDTO\n * - validateCreate(data) → ValidationResult<CreateNotificationsDTO>\n * - validateCreateOrThrow(data) → CreateNotificationsDTO\n */\nclass NotificationsValidatorClass extends BaseValidator<\n  CreateNotificationsDTO,\n  CreateNotificationsDTO, // Update same as create\n  Partial<CreateNotificationsDTO>, // Patch\n  DeleteNotificationsDTO,\n  QueryNotificationsDTO\n> {\n  constructor() {\n    super({\n      createSchema: CreateNotificationsSchema,\n      updateSchema: CreateNotificationsSchema,\n      patchSchema: CreateNotificationsSchema.partial(),\n      deleteSchema: DeleteNotificationsSchema,\n      querySchema: QueryNotificationsSchema,\n    });\n  }\n\n  /**\n   * Validate notification ID for delete\n   */\n  validateNotificationId(id: string): boolean {\n    const result = z.string().uuid().safeParse(id);\n    return result.success;\n  }\n\n  /**\n   * Validate query filters\n   */\n  validateFilters(filters: Partial<QueryNotificationsDTO>): boolean {\n    const result = QueryNotificationsSchema.safeParse(filters);\n    return result.success;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Unsubscribe Validation\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if category is valid for unsubscribe.\n   */\n  isValidUnsubscribeCategory(category: string): category is NotificationCategory {\n    return UNSUBSCRIBABLE_CATEGORIES.includes(category as NotificationCategory);\n  }\n\n  /**\n   * Validate unsubscribe category - throws if invalid.\n   */\n  validateUnsubscribeCategoryOrThrow(category: string, isFullUnsubscribe: boolean): void {\n    if (!this.isValidUnsubscribeCategory(category) && !isFullUnsubscribe) {\n      throw new NotificationPackageError(\n        NOTIFICATION_ERROR_CODES.VALIDATION_FAILED,\n        NOTIFICATION_ERROR_CODES.VALIDATION_FAILED,\n        { context: { category, validCategories: UNSUBSCRIBABLE_CATEGORIES } }\n      );\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Preference Validation\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if preferences allow sending a notification.\n   * Validates channel, category, and quiet hours.\n   */\n  checkPreferencesAllowSend(\n    prefs: NotificationPreferencesDatabaseRow,\n    category: NotificationCategory,\n    channel: NotificationChannel\n  ): boolean {\n    // Check channel\n    if (channel === 'email' && !prefs.email_enabled) return false;\n    if (channel === 'sms' && !prefs.sms_enabled) return false;\n    if (channel === 'push' && !prefs.push_enabled) return false;\n\n    // Check category\n    if (category === 'marketing' && !prefs.marketing_enabled) return false;\n    if (category === 'social' && !prefs.social_enabled) return false;\n    if (category === 'system' && !prefs.system_enabled) return false;\n    if (category === 'promotional' && !prefs.promotional_enabled) return false;\n\n    // Check quiet hours\n    if (prefs.quiet_hours_enabled) {\n      const inQuietHours = isInQuietHours(\n        prefs.quiet_hours_start,\n        prefs.quiet_hours_end,\n        prefs.quiet_hours_timezone || 'UTC'\n      );\n      if (inQuietHours) return false;\n    }\n\n    return true;\n  }\n}\n\n// Export class for BaseDomainService.ValidatorClass\nexport { NotificationsValidatorClass };\n\n// Singleton instance (for direct usage)\nexport const NotificationsValidator = new NotificationsValidatorClass();\n","/**\n * Frontend Notifications Domain Service\n *\n * Handles IN_APP notifications only. Email, SMS, and Push notifications\n * are backend-only operations via @plyaz/notifications package.\n *\n * Uses inherited methods from BaseFrontendDomainService:\n * - fetchAll() - inherited (GET /notifications via @plyaz/api)\n * - delete() - inherited (DELETE /notifications/:id via @plyaz/api)\n *\n * Streaming support:\n * - Real-time in-app notification updates (created, updated, deleted, read, unread)\n *\n * Runtime: Frontend (React, Next.js, etc.)\n *\n * @example\n * ```typescript\n * const service = await getFrontendNotificationsDomainService();\n *\n * // List and delete in-app notifications\n * const items = await service.fetchAll({ status: 'queued' });\n * await service.delete('notification-id');\n * ```\n */\n\nimport { STORE_KEYS } from '@plyaz/store';\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { fetchNotifications, deleteNotification } from '@plyaz/api';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n  CoreServiceCreateOptions,\n  CoreBaseValidatorInstance,\n  CoreStreamHandlerDeclaration,\n  CoreStreamHandlerIds,\n  CoreStreamStoreGetter,\n  StreamMessage,\n} from '@plyaz/types/core';\nimport type {\n  NotificationsFrontendStoreSlice,\n  NotificationsFrontendStoreData,\n  NotificationStoreItem,\n} from '@plyaz/types/store';\nimport { BaseFrontendDomainService } from '../base';\nimport { FrontendEventPersistenceHandler } from '../../events/FrontendEventPersistenceHandler';\nimport { Core } from '../../init/CoreInitializer';\nimport { NotificationsMapperClass, NotificationsMapper } from './mappers/NotificationsMapper';\nimport { NotificationsValidatorClass } from './validators/NotificationsValidator';\n\nconst logger = new PackageLogger({\n  packageName: 'core',\n  service: 'FrontendNotificationsDomainService',\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types (from @plyaz/types - single source of truth)\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type {\n  NotificationsEntity,\n  NotificationsResponseDTO,\n  CreateNotificationsDTO,\n  PatchNotificationsDTO,\n  QueryNotificationsDTO,\n  NotificationsFrontendServiceConfig,\n  NotificationCreatedStreamData,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Frontend Notifications Domain Service\n *\n * Extends BaseFrontendDomainService with all generic types.\n * All CRUD methods are inherited from base class.\n *\n * Inherited from BaseFrontendDomainService:\n * - fetchAll() - list all notifications\n * - delete() - delete a notification\n */\nexport class FrontendNotificationsDomainService extends BaseFrontendDomainService<\n  NotificationsFrontendServiceConfig,\n  NotificationsFrontendStoreSlice,\n  NotificationsFrontendStoreData,\n  NotificationsEntity,\n  NotificationsResponseDTO,\n  CreateNotificationsDTO,\n  PatchNotificationsDTO,\n  QueryNotificationsDTO,\n  NotificationStoreItem,\n  InstanceType<typeof NotificationsMapperClass>,\n  CoreBaseValidatorInstance,\n  void // TDeleteResult - delete returns void\n> {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Required Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Service key for registry */\n  static readonly serviceKey = SERVICE_KEYS.NOTIFICATIONS_FRONTEND;\n\n  /**\n   * Primary store key for this service.\n   * Used by ServiceRegistry to auto-inject the store.\n   * Must be static for base class constructor to access.\n   */\n  static readonly primaryStoreKey = STORE_KEYS.NOTIFICATIONS;\n\n  /** Event prefix for all events emitted by this service */\n  protected eventPrefix = 'notifications';\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Factory Method\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Factory method for ServiceRegistry auto-initialization.\n   * Auto-registers event handlers for store updates.\n   */\n  static async create(\n    config: NotificationsFrontendServiceConfig = {},\n    options?: CoreServiceCreateOptions\n  ): Promise<FrontendNotificationsDomainService> {\n    // Auto-register event handlers when service is created\n    this.registerEventHandlers();\n\n    const mergedConfig: NotificationsFrontendServiceConfig = {\n      ...config,\n      // Use || instead of ?? because api.baseURL may be '' (empty string) for same-origin requests.\n      // The ?? operator only falls through on null/undefined, not empty strings.\n      // An empty string is not a valid API path, so we treat it as \"not provided\" and fall through to default.\n      // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n      apiBasePath: config.apiBasePath || options?.apiClient?.options?.baseURL || '',\n    };\n\n    const service = new FrontendNotificationsDomainService(mergedConfig, options);\n\n    if (mergedConfig.autoFetch) {\n      await service.fetchAll();\n    }\n\n    return service;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static: Stream Handlers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Stream handler IDs - overrides base class pattern */\n  protected static override readonly STREAM_HANDLER_IDS: CoreStreamHandlerIds<'LISTENER'> = {\n    LISTENER: 'notifications:listener',\n  };\n\n  /** Default priority for stream handlers */\n  private static readonly DEFAULT_HANDLER_PRIORITY = 100;\n\n  /**\n   * Declarative stream handlers - auto-registered by base class\n   * Handles real-time in-app notification delivery.\n   *\n   * Only notification:created is needed - user receives new notifications.\n   * User subscribes to user:notifications:{userId} channel.\n   */\n  protected static override readonly STREAM_HANDLERS: CoreStreamHandlerDeclaration[] = [\n    {\n      id: FrontendNotificationsDomainService.STREAM_HANDLER_IDS.LISTENER,\n      channels: ['user:notifications:', 'notifications'],\n      events: ['notification:created'],\n      priority: FrontendNotificationsDomainService.DEFAULT_HANDLER_PRIORITY,\n      handler: (message: StreamMessage<unknown>, getStore: CoreStreamStoreGetter): void => {\n        // Stream data is auto-unwrapped by useStreamConnection's parseResponse\n        // So message.data is directly NotificationCreatedStreamData (not wrapped in { success, data })\n        const streamData = message.data as NotificationCreatedStreamData;\n        if (!streamData?.notificationId || !streamData?.userId) return;\n\n        const store = getStore()?.[STORE_KEYS.NOTIFICATIONS] as\n          | NotificationsFrontendStoreSlice\n          | undefined;\n        if (!store) return;\n\n        // Use mapper to convert stream data to store item format\n        const notification = NotificationsMapper.fromStreamData(streamData);\n\n        // Add new notification to store\n        store.addNotification(notification);\n      },\n    },\n  ];\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static: Event Handlers (for store updates)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  private static _eventHandlersRegistered = false;\n\n  /**\n   * Register event handlers for cross-service event reactions.\n   * Auto-called by create() method when service is initialized.\n   *\n   * IMPORTANT: When to use this vs storeHandlers in service config:\n   *\n   * **Use storeHandlers (service config)** for:\n   * - Simple, automatic store updates (addData, removeData, updateData)\n   * - Loading state management for THIS service's operations\n   * - Primary store population from API responses\n   * - Straightforward CRUD → store sync\n   *\n   * **Use FrontendEventPersistenceHandler (this method)** for:\n   * - Listening to events from OTHER services (cross-domain reactions)\n   * - Updating DIFFERENT stores based on events (not just primary store)\n   * - Complex conditional logic (e.g., block API calls when X event fires)\n   * - Side effects that storeHandlers cannot achieve\n   * - Coordinating multiple stores on a single event\n   *\n   * @example Cross-domain reaction\n   * ```typescript\n   * // When auth:logout fires, clear this domain's cached data\n   * 'auth:logout': {\n   *   handler: (store) => store.clearAll(),\n   * }\n   * ```\n   *\n   * @example Conditional logic\n   * ```typescript\n   * // Disable feature when maintenance mode event fires\n   * 'system:maintenance:started': {\n   *   handler: (store) => store.setDisabled(true),\n   * }\n   * ```\n   *\n   * @param verbose - Enable verbose logging\n   * @returns Cleanup function to unregister all handlers\n   */\n  static registerEventHandlers(verbose?: boolean): () => void {\n    // Skip if already registered\n    if (this._eventHandlersRegistered) {\n      logger.debug('Notifications frontend event handlers already registered');\n      return () => {};\n    }\n\n    // Helper to safely get store (SSR-safe)\n    // NOTE: This can access ANY store slice, not just this domain's primary store.\n    // Use this for cross-domain store updates that storeHandlers cannot achieve.\n    const getNotificationsStore = (): NotificationsFrontendStoreSlice | undefined => {\n      try {\n        return Core.rootStore?.getState().notifications;\n      } catch {\n        return undefined;\n      }\n    };\n\n    // Register cross-domain event handlers\n    // NOTE: For simple loading/CRUD operations on primary store, use storeHandlers instead.\n    // Use this for cross-domain reactions, conditional logic, or multi-store coordination.\n    FrontendEventPersistenceHandler.register<NotificationsFrontendStoreSlice, unknown>({\n      domain: 'notifications',\n      events: {\n        // ─────────────────────────────────────────────────────────────────────\n        // Cross-domain examples (react to OTHER services' events)\n        // ─────────────────────────────────────────────────────────────────────\n        // Example: Clear cache when user logs out\n        // 'auth:logout': {\n        //   handler: (store: NotificationsFrontendStoreSlice) => store.clearAll?.(),\n        // },\n        // Example: Disable operations during maintenance\n        // 'system:maintenance:started': {\n        //   handler: (store: NotificationsFrontendStoreSlice) => store.setDisabled?.(true),\n        // },\n        // 'system:maintenance:ended': {\n        //   handler: (store: NotificationsFrontendStoreSlice) => store.setDisabled?.(false),\n        // },\n        // Example: Refresh data when related domain changes\n        // 'relatedDomain:updated': {\n        //   handler: (store: NotificationsFrontendStoreSlice, payload: unknown) => {\n        //     // Trigger refetch or invalidate cache\n        //     store.setStale?.(true);\n        //   },\n        // },\n        // ─────────────────────────────────────────────────────────────────────\n        // Same-domain examples (only if storeHandlers are insufficient)\n        // ─────────────────────────────────────────────────────────────────────\n        // Example: Complex validation before allowing operation\n        // 'notifications:creating': {\n        //   handler: (store: NotificationsFrontendStoreSlice, payload: unknown) => {\n        //     // Check external conditions, emit blocking events, etc.\n        //   },\n        // },\n      },\n      getStore: getNotificationsStore,\n      verbose,\n    });\n\n    this._eventHandlersRegistered = true;\n    logger.info('Notifications frontend event handlers registered');\n\n    // Return cleanup function\n    return () => {\n      FrontendEventPersistenceHandler.unregisterAll();\n      this._eventHandlersRegistered = false;\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Constructor\n  // ─────────────────────────────────────────────────────────────────────────\n\n  constructor(config: NotificationsFrontendServiceConfig = {}, options?: CoreServiceCreateOptions) {\n    // Use || instead of ?? because apiBasePath may be '' (empty string) from config.\n    // Empty string is not a valid API path, so treat it as \"not provided\" and use default.\n    // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n    const apiBasePath = config.apiBasePath || '';\n\n    super({\n      serviceName: 'FrontendNotificationsDomainService',\n      supportedRuntimes: ['frontend'],\n      serviceConfig: {\n        enabled: true,\n        apiBasePath,\n        // Extract error from fetchff response\n        responseErrorKey: 'error',\n        // Unwrap API response: extract 'data' from response.data (ListNotificationResponse)\n        responseDataKey: 'data',\n        // Store data key: wrap entities as { notificationsList: [...] } for store.setData()\n        storeDataKey: 'notificationsList',\n        autoFetch: true,\n        pollingInterval: 30000,\n        ...config,\n        fetchers: {\n          fetchAll: async (query: QueryNotificationsDTO | undefined) => {\n            return fetchNotifications(query);\n          },\n          delete: async (id: string | undefined) => {\n            return deleteNotification(id!);\n          },\n        },\n      },\n      mapperClass: NotificationsMapperClass,\n      validatorClass: NotificationsValidatorClass,\n      injected: options?.injected,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Abstract Implementations (Required by BaseDomainService)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  isAvailable(): boolean {\n    return this.isServiceEnabled && typeof window !== 'undefined';\n  }\n\n  dispose(): void {\n    super.dispose();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Lifecycle Hooks (Optional - Override only if needed)\n  // ─────────────────────────────────────────────────────────────────────────\n  //\n  // Available hooks to override:\n  // - protected async beforeFetchAll(query?): Promise<void>\n  // - protected async afterFetchAll(entities, query?): Promise<void>\n  // - protected async beforeFetchById(id): Promise<void>\n  // - protected async afterFetchById(entity): Promise<void>\n  // - protected async beforeCreate(data): Promise<void>\n  // - protected async afterCreate(entity): Promise<void>\n  // - protected async beforeUpdate(id, data): Promise<void>\n  // - protected async afterUpdate(id, entity): Promise<void>\n  // - protected async beforeDelete(id): Promise<void>\n  // - protected async afterDelete(id): Promise<void>\n  //\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Singleton Instance\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _instance: FrontendNotificationsDomainService | null = null;\n\n/**\n * Get or create singleton instance\n */\nexport async function getFrontendNotificationsDomainService(\n  config?: NotificationsFrontendServiceConfig,\n  options?: CoreServiceCreateOptions\n): Promise<FrontendNotificationsDomainService> {\n  _instance ??= await FrontendNotificationsDomainService.create(config, options);\n  return _instance;\n}\n\n/**\n * Lazy singleton proxy - creates instance on first access\n */\nexport const frontendNotificationsDomainService = new Proxy(\n  {} as FrontendNotificationsDomainService,\n  {\n    get(_, prop) {\n      if (!_instance) {\n        throw new CorePackageError(\n          'FrontendNotificationsDomainService not initialized. Call getFrontendNotificationsDomainService() first.',\n          ERROR_CODES.CORE_PROVIDER_INITIALIZATION_FAILED\n        );\n      }\n      return Reflect.get(_instance, prop);\n    },\n  }\n);\n\n/**\n * Reset singleton (for testing)\n */\nexport function resetNotificationsFrontendService(): void {\n  if (_instance) {\n    _instance.dispose();\n    _instance = null;\n  }\n}\n","/**\n * DbService - Singleton Database Connection Manager\n *\n * @description Manages database connections for the entire application using a singleton pattern.\n * This service wraps @plyaz/db and provides a centralized way to initialize and access\n * the database across all domains (feature flags, users, campaigns, backoffice, etc.).\n *\n * **Architecture:**\n * - Uses `createDatabaseService()` from @plyaz/db which builds an adapter chain\n * - Supports Drizzle (direct PostgreSQL), Supabase (REST API), or raw SQL adapters\n * - Extension layers: Encryption → SoftDelete → Caching → Audit → ReadReplica\n *\n * **Adapter Configuration:**\n * - **Drizzle**: Requires `connectionString` (PostgreSQL URL)\n * - **Supabase**: Requires `supabaseUrl`, `supabaseServiceKey`, `supabaseAnonKey`\n * - **SQL**: Requires `connectionString`\n *\n * **Required Environment Variables (Drizzle with Supabase):**\n * - DATABASE_URL: PostgreSQL connection string (from Supabase Dashboard > Database > URI)\n *\n * **Required Environment Variables (Supabase REST API):**\n * - SUPABASE_URL: Your Supabase project URL\n * - SUPABASE_SERVICE_ROLE_KEY: Service role key for admin operations\n * - SUPABASE_ANON_PUBLIC_KEY: Anonymous key for public operations\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * // Core.initialize() handles loading env and passing to DbService\n * await Core.initialize({\n *   envPath: '.env',\n *   db: {\n *     adapter: 'sql',\n *     cache: { enabled: true, ttl: 60 },\n *   },\n * });\n *\n * // Access via Core.db\n * const db = Core.db.getDatabase();\n * const result = await db.list('users', { pagination: { limit: 10, offset: 0 } });\n * ```\n *\n * @example Direct Usage (requires explicit config)\n * ```typescript\n * // Direct usage requires explicit connectionString\n * await DbService.initialize({\n *   adapter: 'drizzle',\n *   drizzle: {\n *     connectionString: 'postgresql://user:pass@localhost:5432/db',\n *     poolSize: 20,\n *   },\n * });\n * ```\n *\n * @example With Extensions\n * ```typescript\n * await Core.initialize({\n *   envPath: '.env',\n *   db: {\n *     adapter: 'drizzle',\n *     softDelete: {\n *       enabled: true,\n *       field: 'deleted_at',\n *       excludeTables: ['audit_logs', 'feature_flag_evaluations'],\n *     },\n *     cache: {\n *       enabled: true,\n *       provider: 'memory',\n *       ttl: 300,\n *     },\n *     audit: {\n *       enabled: true,\n *       retentionDays: 90,\n *     },\n *   },\n * });\n * ```\n *\n * @example Using with BaseRepository\n * ```typescript\n * import { BaseRepository } from '@plyaz/db';\n * import { DbService } from '@plyaz/core';\n *\n * class UserRepository extends BaseRepository<User> {\n *   constructor() {\n *     super(DbService.getInstance().getDatabase(), 'users');\n *   }\n * }\n * ```\n *\n * @module services\n */\n\nimport { createDatabaseService } from '@plyaz/db';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport {\n  type DatabaseServiceInterface,\n  type DatabaseServiceConfig,\n  type DrizzleConfig,\n  type SupabaseConfig,\n  type SqlConfig,\n  type Transaction,\n  type DatabaseEvents,\n} from '@plyaz/types/db';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { CORE_EVENTS, type CoreDatabaseErrorPayload } from '@plyaz/types/core';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { PackageLogger } from '@plyaz/logger';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'DbService' });\n\n/**\n * Default fields to encrypt per table\n * Contains sensitive PII and financial data that should be encrypted at rest\n *\n * @see docs/db-schemas/dbdiagram_schema.dbml for field definitions\n */\nexport const DEFAULT_ENCRYPTION_FIELDS: Record<string, string[]> = {\n  // User PII\n  users: ['password_hash', 'phone_number', 'date_of_birth'],\n\n  // KYC sensitive data\n  'backoffice.kyc_submissions': ['tax_id', 'address_line1', 'address_line2'],\n\n  // Connected accounts OAuth tokens\n  connected_accounts: ['access_token_encrypted', 'refresh_token_encrypted', 'wallet_address'],\n\n  // Payment payout accounts\n  user_payout_accounts: ['provider_account_id', 'account_holder_name'],\n\n  // Sessions\n  sessions: ['token'],\n};\n\n// Re-export DbServiceConfig from @plyaz/types/core\nexport type { CoreDbServiceConfig } from '@plyaz/types/core';\n\n// Local alias for internal use\nimport type {\n  CoreDbServiceConfig as DbServiceConfig,\n  CoreDbServiceInstance,\n} from '@plyaz/types/core';\n\n/**\n * Default configuration for DbService\n *\n * **Adapter Selection Guide:**\n *\n * | Adapter     | Connection       | Auto-Register | RLS      | Use Case                          |\n * |-------------|------------------|---------------|----------|-----------------------------------|\n * | `'sql'`     | PostgreSQL URL   | ✓ Yes         | Bypassed | **Recommended** for backend       |\n * | `'supabase'`| Supabase API     | ✓ Yes         | Enforced | Frontend / RLS-required scenarios |\n * | `'drizzle'` | PostgreSQL URL   | ✓ Yes*        | Bypassed | Type-safe ORM (with PgTable schemas) |\n *\n * *Drizzle supports dual-mode: uses PgTable schemas if registered, falls back to raw SQL otherwise.\n *\n * **Recommended:** Use `'sql'` adapter for backend services with Supabase PostgreSQL.\n * Direct PostgreSQL connection = best performance, bypasses RLS for full backend access.\n */\n// Database configuration constants\nconst DEFAULT_AUDIT_RETENTION_DAYS = 180; // GDPR/SOX compliance (6 months minimum)\nconst DEFAULT_POOL_SIZE = 10;\n\nconst DEFAULT_CONFIG: Partial<DbServiceConfig> = {\n  adapter: 'sql',\n  cache: {\n    enabled: true,\n    provider: 'memory',\n    ttl: TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n  },\n  softDelete: {\n    enabled: true,\n    field: 'deleted_at',\n    excludeTables: [\n      'audit_logs',\n      'audit.audit_logs',\n      'audit.feature_flag_evaluations',\n      'feature_flag_evaluations',\n      'notification_events',\n      'payments_activity',\n      'campaign_analytics',\n      'admin_actions',\n      'backoffice.admin_actions',\n    ],\n  },\n  audit: {\n    enabled: true, // Enabled by default for compliance\n    retentionDays: DEFAULT_AUDIT_RETENTION_DAYS,\n    excludeFields: ['password_hash', 'api_key_hash', 'token_hash'],\n    excludeTables: ['audit_logs', 'audit.audit_logs'], // Don't audit the audit table itself\n    schema: 'audit', // Use dedicated audit schema\n    usePartitionedTables: true, // Use daily partitioned tables (audit_log_yyyy_mm_dd)\n  },\n  // NOTE: Encryption requires key from environment or DbService.initialize()\n  // Enable via: DbService.initialize({ encryption: { enabled: true, key: process.env.ENCRYPTION_KEY!, fields: DEFAULT_ENCRYPTION_FIELDS } })\n};\n\n/**\n * Complete table registry from database migrations\n * Maps logical table names to their ID columns\n *\n * @see docs/db-schemas/migrations/ for schema definitions\n * @see docs/db-schemas/dbdiagram_schema.dbml for full schema\n */\n/**\n * TABLE_REGISTRY - Custom ID Column and Schema Registry\n *\n * ONLY register tables with:\n * 1. Custom ID columns (anything other than 'id')\n * 2. Custom database schemas (anything other than 'public')\n *\n * Tables with standard 'id' column in 'public' schema do NOT need registration.\n * You can also override ID column and schema per-query using OperationConfig.\n *\n * Schema can be defined in the table key or in the config object (or both):\n * - 'schema.table': { idColumn: 'key' }              ← Schema in key only\n * - 'schema.table': { idColumn: 'key', schema: 'schema' } ← Redundant but allowed\n * - 'schema.table': {}                                ← Empty config, schema in key\n * - 'table': { idColumn: 'key', schema: 'schema' }   ← Schema in config only\n *\n * @example\n * ```typescript\n * // Using registry\n * await db.get('feature_flags', 'my-flag-key'); // Uses 'key' column from registry\n *\n * // Per-query override\n * await db.get('custom_table', 'some-key', { idColumn: 'custom_id' });\n *\n * // Schema override\n * await db.get('logs', '123', { schema: 'logging' });\n * ```\n */\nexport const TABLE_REGISTRY: Record<string, { idColumn?: string; schema?: string }> = {\n  // Migration 008: Feature Flags (custom ID column 'key')\n  feature_flags: { idColumn: 'key' },\n\n  // Test Feature Flags (custom ID column 'key')\n  test_feature_flags: { idColumn: 'key' },\n\n  // Migration 010: Universal Analytics (custom ID column 'user_id')\n  user_analytics_summary: { idColumn: 'user_id' },\n};\n\n/**\n * DbService - Singleton Database Connection Manager\n *\n * Provides centralized database connection management for all domains.\n * Uses @plyaz/db under the hood with configurable adapters and extensions.\n */\n/**\n * Global Singleton Pattern using globalThis\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple singleton\n * instances. Using globalThis + Symbol.for() ensures ONE instance per process, preventing\n * issues like multiple database connection pools or inconsistent state across API routes.\n */\nconst DB_SERVICE_KEY = Symbol.for('plyaz.DbService');\n\nfunction getDbServiceInstance(): DbService | null {\n  const globalAny = globalThis as unknown as { [key: symbol]: DbService | null };\n  return globalAny[DB_SERVICE_KEY] ?? null;\n}\n\nfunction setDbServiceInstance(instance: DbService | null): void {\n  const globalAny = globalThis as unknown as { [key: symbol]: DbService | null };\n  globalAny[DB_SERVICE_KEY] = instance;\n}\n\nexport class DbService implements CoreDbServiceInstance {\n  private databaseService: DatabaseServiceInterface | null = null;\n  private namedAdapters: Map<string, DatabaseServiceInterface> = new Map();\n  private config: DbServiceConfig | null = null;\n  private initialized = false;\n\n  private constructor() {}\n\n  /**\n   * Emits a database error event via CoreEventManager.\n   * Called when database operations fail to integrate with global error handling.\n   *\n   * @param error - The error that occurred\n   * @param operation - The operation that failed (e.g., 'transaction', 'query', 'healthCheck')\n   * @param table - Optional table name involved in the operation\n   * @param query - Optional query string that failed\n   * @param recoverable - Whether the error is recoverable (default: false)\n   */\n  private emitDatabaseError(\n    error: unknown,\n    operation: string,\n    options?: {\n      table?: string;\n      query?: string;\n      recoverable?: boolean;\n    }\n  ): void {\n    const payload: CoreDatabaseErrorPayload = {\n      error,\n      operation,\n      table: options?.table,\n      query: options?.query,\n      recoverable: options?.recoverable ?? false,\n    };\n    CoreEventManager.emit(CORE_EVENTS.DATABASE.ERROR, payload);\n  }\n\n  /**\n   * Creates merged event handlers that wrap user-provided handlers.\n   * Adds Core-level logging and forwards to user handlers.\n   *\n   * Note: Unlike StorageService/NotificationService, DB events don't emit\n   * to CoreEventManager by default (too verbose). User handlers can emit\n   * if needed.\n   *\n   * @param userHandlers - User-provided event handlers from config\n   * @returns Merged handlers with Core logging + user handlers\n   */\n  private static createMergedEventHandlers(userHandlers?: DatabaseEvents): DatabaseEvents {\n    return {\n      ...userHandlers,\n\n      onAfterWrite: async event => {\n        logger.debug('Database write completed', {\n          operation: event.operation,\n          table: event.table,\n          duration: event.duration,\n        });\n        if (userHandlers?.onAfterWrite) {\n          await userHandlers.onAfterWrite(event);\n        }\n      },\n\n      onAfterRead: async event => {\n        logger.debug('Database read completed', {\n          table: event.table,\n          duration: event.duration,\n        });\n        if (userHandlers?.onAfterRead) {\n          await userHandlers.onAfterRead(event);\n        }\n      },\n    };\n  }\n\n  /**\n   * Gets the singleton instance of DbService\n   *\n   * @returns {DbService} The singleton instance\n   */\n  static getInstance(): DbService {\n    let instance = getDbServiceInstance();\n    if (!instance) {\n      instance = new DbService();\n      setDbServiceInstance(instance);\n    }\n    return instance;\n  }\n\n  /**\n   * Checks if the database service has been initialized\n   *\n   * @returns {boolean} True if initialized\n   */\n  static isInitialized(): boolean {\n    return getDbServiceInstance()?.initialized ?? false;\n  }\n\n  /**\n   * Resets the database service by closing connections and clearing the singleton instance\n   *\n   * @description Properly closes the database connection and clears the singleton.\n   * Useful for testing or when you need to reinitialize with different configuration.\n   *\n   * @example\n   * ```typescript\n   * await DbService.reset();\n   * await DbService.initialize({ adapter: 'sql', ... });\n   * ```\n   */\n  static async reset(): Promise<void> {\n    const instance = getDbServiceInstance();\n    if (instance) {\n      try {\n        await instance.databaseService?.close?.();\n      } catch {\n        // Ignore close errors (pool might already be closed)\n      }\n      setDbServiceInstance(null);\n    }\n  }\n\n  /**\n   * Initializes the database connection\n   *\n   * @description Sets up the database connection using the provided configuration\n   * or environment variables. This method is idempotent - calling it multiple\n   * times won't create additional connections.\n   *\n   * **Environment Variables:**\n   * - `DATABASE_URL` - PostgreSQL connection string (for sql/drizzle adapters)\n   * - `ENCRYPTION_KEY` - 32-byte encryption key for field encryption (optional)\n   * - `SUPABASE_URL`, `SUPABASE_SERVICE_ROLE_KEY`, `SUPABASE_ANON_PUBLIC_KEY` - For supabase adapter\n   *\n   * **Encryption:** If `ENCRYPTION_KEY` env is set, encryption is auto-enabled\n   * using `DEFAULT_ENCRYPTION_FIELDS`. Override via config.encryption.\n   *\n   * @param {DbServiceConfig} [config] - Optional configuration\n   * @returns {Promise<DbService>} The initialized DbService instance\n   * @throws {DatabasePackageError} When configuration is invalid or connection fails\n   *\n   * @example\n   * ```typescript\n   * // Minimal - uses DATABASE_URL env, auto-enables encryption if ENCRYPTION_KEY set\n   * await DbService.initialize();\n   *\n   * // With explicit encryption\n   * await DbService.initialize({\n   *   adapter: 'sql',\n   *   encryption: {\n   *     enabled: true,\n   *     key: 'your-32-byte-encryption-key-here!!',\n   *     fields: DEFAULT_ENCRYPTION_FIELDS,\n   *   },\n   * });\n   *\n   * // Or via Core.initialize() with env:\n   * await Core.initialize({\n   *   env: { ENCRYPTION_KEY: '...' },\n   *   db: { adapter: 'sql' },\n   * });\n   * ```\n   */\n  /** Build encryption config from user config */\n  private static buildEncryptionConfig(config?: DbServiceConfig): DbServiceConfig['encryption'] {\n    const encryption = config?.encryption;\n    if (!encryption?.key) return undefined;\n\n    return {\n      enabled: encryption.enabled ?? true,\n      key: encryption.key,\n      fields: encryption.fields ?? DEFAULT_ENCRYPTION_FIELDS,\n      algorithm: encryption.algorithm ?? 'aes-256-gcm',\n    };\n  }\n\n  /** Merge user config with defaults */\n  private static mergeConfig(config?: DbServiceConfig): DbServiceConfig {\n    return {\n      ...DEFAULT_CONFIG,\n      ...config,\n      softDelete: { ...DEFAULT_CONFIG.softDelete, ...config?.softDelete },\n      cache: { ...DEFAULT_CONFIG.cache, ...config?.cache },\n      audit: { ...DEFAULT_CONFIG.audit, ...config?.audit },\n      encryption: DbService.buildEncryptionConfig(config),\n    } as DbServiceConfig;\n  }\n\n  /** Initialize named adapters */\n  private async initializeNamedAdapters(mergedConfig: DbServiceConfig): Promise<void> {\n    if (!mergedConfig.adapters) return;\n\n    for (const [name, adapterConfig] of Object.entries(mergedConfig.adapters)) {\n      const namedDbConfig = this.buildDatabaseConfig({\n        ...mergedConfig,\n        adapter: adapterConfig.adapter,\n        drizzle: adapterConfig.drizzle,\n        supabase: adapterConfig.supabase,\n        sql: adapterConfig.sql,\n      });\n\n      const namedService = await createDatabaseService(namedDbConfig);\n      this.namedAdapters.set(name, namedService);\n    }\n  }\n\n  static async initialize(config?: DbServiceConfig): Promise<DbService> {\n    const instance = DbService.getInstance();\n\n    if (instance.initialized) {\n      return instance;\n    }\n\n    const mergedConfig = DbService.mergeConfig(config);\n    instance.config = mergedConfig;\n\n    const dbConfig = instance.buildDatabaseConfig(mergedConfig);\n    instance.databaseService = await createDatabaseService(dbConfig);\n\n    await instance.initializeNamedAdapters(mergedConfig);\n\n    instance.initialized = true;\n    return instance;\n  }\n\n  /**\n   * Builds the DatabaseServiceConfig based on the adapter type\n   * @private\n   */\n\n  /** Builds adapter-specific config based on adapter type */\n  private buildAdapterConfig(\n    adapter: string,\n    config: DbServiceConfig\n  ): DrizzleConfig | SupabaseConfig | SqlConfig {\n    const builders: Record<string, () => DrizzleConfig | SupabaseConfig | SqlConfig> = {\n      drizzle: () => this.buildDrizzleConfig(config),\n      supabase: () => this.buildSupabaseConfig(config),\n      sql: () => this.buildSqlConfig(config),\n    };\n\n    const builder = builders[adapter];\n    if (!builder) {\n      throw new DatabasePackageError(\n        `Unsupported adapter type: ${adapter}`,\n        DATABASE_ERROR_CODES.CONFIG_REQUIRED\n      );\n    }\n    return builder();\n  }\n\n  /** Builds soft delete extension config */\n  private buildSoftDeleteExtension(\n    config: DbServiceConfig\n  ): DatabaseServiceConfig['softDelete'] | undefined {\n    if (!config.softDelete?.enabled) return undefined;\n    return {\n      enabled: true,\n      field: config.softDelete.field ?? 'deleted_at',\n      excludeTables: config.softDelete.excludeTables,\n    };\n  }\n\n  /** Builds cache extension config */\n  private buildCacheExtension(config: DbServiceConfig): DatabaseServiceConfig['cache'] | undefined {\n    if (!config.cache?.enabled) return undefined;\n    return {\n      enabled: true,\n      ttl: config.cache.ttl ?? TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n      provider: config.cache.provider ?? 'memory',\n      invalidation: config.cache.invalidation ?? 'write',\n    };\n  }\n\n  /** Builds audit extension config */\n  private buildAuditExtension(config: DbServiceConfig): DatabaseServiceConfig['audit'] | undefined {\n    if (!config.audit?.enabled) return undefined;\n    return {\n      enabled: true,\n      retentionDays: config.audit.retentionDays ?? DEFAULT_AUDIT_RETENTION_DAYS,\n      excludeFields: config.audit.excludeFields,\n      excludeTables: config.audit.excludeTables,\n      schema: config.audit.schema ?? 'audit',\n      usePartitionedTables: config.audit.usePartitionedTables ?? true,\n    };\n  }\n\n  /** Builds encryption extension config */\n  private buildEncryptionExtension(\n    config: DbServiceConfig\n  ): DatabaseServiceConfig['encryption'] | undefined {\n    if (!config.encryption?.enabled || !config.encryption.key) return undefined;\n    return {\n      enabled: true,\n      key: config.encryption.key,\n      fields: config.encryption.fields ?? {},\n      algorithm: config.encryption.algorithm,\n    };\n  }\n\n  private buildDatabaseConfig(config: DbServiceConfig): DatabaseServiceConfig {\n    const adapter = config.adapter ?? 'drizzle';\n\n    const dbConfig: DatabaseServiceConfig = {\n      adapter: adapter as DatabaseServiceConfig['adapter'],\n      config: this.buildAdapterConfig(adapter, config),\n    };\n\n    // Apply extensions\n    const softDelete = this.buildSoftDeleteExtension(config);\n    const cache = this.buildCacheExtension(config);\n    const audit = this.buildAuditExtension(config);\n    const encryption = this.buildEncryptionExtension(config);\n\n    if (softDelete) dbConfig.softDelete = softDelete;\n    if (cache) dbConfig.cache = cache;\n    if (audit) dbConfig.audit = audit;\n    if (encryption) dbConfig.encryption = encryption;\n\n    // Apply merged event handlers\n    const events = DbService.createMergedEventHandlers(config.events);\n    if (events) dbConfig.events = events;\n\n    return dbConfig;\n  }\n\n  /**\n   * Builds Drizzle adapter configuration\n   * @private\n   */\n  private buildDrizzleConfig(config: DbServiceConfig): DrizzleConfig {\n    // Get connection string from config (Core.initialize() passes env values)\n    const connectionString = config.drizzle?.connectionString;\n\n    if (!connectionString) {\n      throw new DatabasePackageError(\n        'Drizzle adapter requires a PostgreSQL connection string. ' +\n          'Provide `drizzle.connectionString` in config or use Core.initialize() with DATABASE_URL in env. ' +\n          'For Supabase, find this in Dashboard > Database > Connection string (URI).',\n        DATABASE_ERROR_CODES.CONFIG_REQUIRED\n      );\n    }\n\n    // Build table ID column mappings from TABLE_REGISTRY\n    const tableIdColumns = this.buildTableIdColumns();\n\n    return {\n      connectionString,\n      poolSize: config.drizzle?.poolSize ?? DEFAULT_POOL_SIZE,\n      ssl: config.drizzle?.ssl,\n      schema: config.drizzle?.schema, // Pass through schema configuration\n      tableIdColumns,\n    };\n  }\n\n  /**\n   * Builds Supabase adapter configuration\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private buildSupabaseConfig(config: DbServiceConfig): SupabaseConfig {\n    // Get Supabase config (Core.initialize() passes env values)\n    const supabaseUrl = config.supabase?.supabaseUrl;\n    const supabaseServiceKey = config.supabase?.supabaseServiceKey;\n    const supabaseAnonKey = config.supabase?.supabaseAnonKey;\n\n    if (!supabaseUrl || !supabaseServiceKey) {\n      throw new DatabasePackageError(\n        'Supabase adapter requires supabaseUrl and supabaseServiceKey. ' +\n          'Provide in config or use Core.initialize() with SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY in env.',\n        DATABASE_ERROR_CODES.CONFIG_REQUIRED\n      );\n    }\n\n    if (!supabaseAnonKey) {\n      throw new DatabasePackageError(\n        'Supabase adapter requires supabaseAnonKey. ' +\n          'Provide in config or use Core.initialize() with SUPABASE_ANON_PUBLIC_KEY in env.',\n        DATABASE_ERROR_CODES.CONFIG_REQUIRED\n      );\n    }\n\n    // Build table ID column mappings from TABLE_REGISTRY\n    const tableIdColumns = this.buildTableIdColumns();\n\n    return {\n      supabaseUrl,\n      supabaseServiceKey,\n      supabaseAnonKey,\n      schema: config.supabase?.schema ?? 'public',\n      tableIdColumns,\n    };\n  }\n\n  /**\n   * Builds SQL adapter configuration\n   * @private\n   */\n  private buildSqlConfig(config: DbServiceConfig): SqlConfig {\n    // Get connection string from config (Core.initialize() passes env values)\n    const connectionString = config.sql?.connectionString;\n\n    if (!connectionString) {\n      throw new DatabasePackageError(\n        'SQL adapter requires a connection string. ' +\n          'Provide `sql.connectionString` in config or use Core.initialize() with DATABASE_URL in env.',\n        DATABASE_ERROR_CODES.CONFIG_REQUIRED\n      );\n    }\n\n    // Build table ID column mappings from TABLE_REGISTRY\n    const tableIdColumns = this.buildTableIdColumns();\n\n    return {\n      connectionString,\n      dialect: config.sql?.dialect ?? 'postgresql',\n      schema: config.sql?.schema, // Pass through schema configuration\n      tableIdColumns,\n    };\n  }\n\n  /**\n   * Builds table ID column mappings from TABLE_REGISTRY\n   * @private\n   * @returns Record of table names to ID column names\n   */\n  // eslint-disable-next-line complexity\n  private buildTableIdColumns(): Record<string, string> {\n    const tableIdColumns: Record<string, string> = {};\n    const baseNameConflicts = new Set<string>();\n    const baseNameMappings = new Map<string, string>();\n\n    // First pass: identify base name conflicts\n    // e.g., if we have both 'public.users' and 'backoffice.users',\n    // we can't map 'users' → one ID column\n    for (const tableName of Object.keys(TABLE_REGISTRY)) {\n      if (tableName.includes('.')) {\n        const baseName = tableName.split('.').pop()!;\n        if (baseNameMappings.has(baseName) || TABLE_REGISTRY[baseName]) {\n          baseNameConflicts.add(baseName);\n        } else {\n          baseNameMappings.set(baseName, tableName);\n        }\n      }\n    }\n\n    // Second pass: build ID column mappings\n    for (const [tableName, config] of Object.entries(TABLE_REGISTRY)) {\n      const idColumn = config.idColumn ?? 'id';\n\n      // Only include non-standard ID columns (not 'id')\n      if (idColumn === 'id') continue;\n\n      // Always map the full table name (with or without schema)\n      tableIdColumns[tableName] = idColumn;\n\n      // If the table name includes a schema (e.g., 'backoffice.flagged_content'),\n      // also map the base name (e.g., 'flagged_content') for convenience\n      // unless there's a conflict with another schema's table\n      if (!tableName.includes('.')) continue;\n\n      const baseName = tableName.split('.').pop()!;\n      if (!baseNameConflicts.has(baseName)) {\n        tableIdColumns[baseName] = idColumn;\n      }\n    }\n\n    return tableIdColumns;\n  }\n\n  /**\n   * Gets the initialized database service instance\n   *\n   * @param {string} [adapterName] - Optional named adapter to use instead of default\n   * @returns {DatabaseServiceInterface} The database service instance\n   * @throws {DatabasePackageError} When database is not initialized or named adapter not found\n   */\n  getDatabase(adapterName?: string): DatabaseServiceInterface {\n    if (adapterName) {\n      const namedAdapter = this.namedAdapters.get(adapterName);\n      if (!namedAdapter) {\n        throw new DatabasePackageError(\n          `Named adapter '${adapterName}' not found. Available adapters: ${Array.from(this.namedAdapters.keys()).join(', ')}`,\n          DATABASE_ERROR_CODES.INIT_FAILED\n        );\n      }\n      return namedAdapter;\n    }\n\n    if (!this.databaseService) {\n      throw new DatabasePackageError(\n        'Database not initialized. Call DbService.initialize() first.',\n        DATABASE_ERROR_CODES.INIT_FAILED\n      );\n    }\n    return this.databaseService;\n  }\n\n  /**\n   * Gets a named adapter by name\n   *\n   * @param {string} name - The name of the adapter\n   * @returns {DatabaseServiceInterface} The named adapter instance\n   * @throws {DatabasePackageError} When adapter not found\n   */\n  getAdapter(name: string): DatabaseServiceInterface {\n    return this.getDatabase(name);\n  }\n\n  /**\n   * Lists all available named adapters\n   *\n   * @returns {string[]} Array of adapter names\n   */\n  getAvailableAdapters(): string[] {\n    return ['default', ...Array.from(this.namedAdapters.keys())];\n  }\n\n  /**\n   * Executes a database transaction with automatic rollback on failure\n   *\n   * @template T The return type of the transaction callback\n   * @param {Function} callback - Function that receives transaction object\n   * @returns {Promise<T>} The result of the transaction callback\n   * @throws {DatabasePackageError} When transaction fails\n   */\n  async transaction<T>(callback: (tx: Transaction) => Promise<T>): Promise<T> {\n    const db = this.getDatabase();\n    const result = await db.transaction(callback);\n\n    if (!result.success) {\n      const errorMessage = result.error?.message ?? 'Transaction failed';\n      const error = new DatabasePackageError(errorMessage, DATABASE_ERROR_CODES.TRANSACTION_FAILED);\n      // Emit database error event for global error handling\n      this.emitDatabaseError(error, 'transaction', { recoverable: true });\n      throw error;\n    }\n\n    if (result.value === undefined || result.value === null) {\n      const error = new DatabasePackageError(\n        'Transaction returned no value',\n        DATABASE_ERROR_CODES.INVALID_RESULT\n      );\n      this.emitDatabaseError(error, 'transaction', { recoverable: false });\n      throw error;\n    }\n\n    return result.value;\n  }\n\n  /**\n   * Sets audit context for subsequent operations\n   *\n   * @param context - Audit context (userId, requestId, etc.)\n   */\n  async setAuditContext(context: {\n    userId?: string;\n    requestId?: string;\n    ipAddress?: string;\n    userAgent?: string;\n  }): Promise<void> {\n    const db = this.getDatabase();\n    await db.setAuditContext(context);\n  }\n\n  /**\n   * Performs a health check on the database connection\n   *\n   * @returns Health check result\n   */\n  async healthCheck(): Promise<{ isHealthy: boolean; responseTime?: number; error?: string }> {\n    try {\n      const db = this.getDatabase();\n      const result = await db.healthCheck();\n\n      if (result.success && result.value) {\n        return {\n          isHealthy: result.value.isHealthy,\n          responseTime: result.value.responseTime,\n        };\n      }\n\n      // Health check failed - emit error event\n      const errorMessage = result.error?.message ?? 'Health check failed';\n      this.emitDatabaseError(\n        new DatabasePackageError(errorMessage, DATABASE_ERROR_CODES.CONNECTION_ERROR),\n        'healthCheck',\n        { recoverable: true }\n      );\n\n      return {\n        isHealthy: false,\n        error: errorMessage,\n      };\n    } catch (error) {\n      // Exception during health check - emit error event\n      this.emitDatabaseError(error, 'healthCheck', { recoverable: true });\n\n      return {\n        isHealthy: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  /**\n   * Gets the table registry with all known tables and their ID columns\n   *\n   * @returns The complete table registry\n   */\n  static getTableRegistry(): typeof TABLE_REGISTRY {\n    return TABLE_REGISTRY;\n  }\n\n  /**\n   * Gets ID column for a specific table\n   *\n   * @param tableName - Name of the table\n   * @returns ID column name or 'id' as default\n   */\n  static getTableIdColumn(tableName: string): string {\n    return TABLE_REGISTRY[tableName]?.idColumn ?? 'id';\n  }\n\n  /**\n   * Reinitializes the database connection with new config\n   *\n   * @param {DbServiceConfig} [config] - New configuration\n   * @returns {Promise<DbService>} The reinitialized DbService instance\n   */\n  static async reinitialize(config?: DbServiceConfig): Promise<DbService> {\n    const instance = DbService.getInstance();\n    await instance.close();\n    instance.initialized = false;\n    return DbService.initialize(config);\n  }\n\n  /**\n   * Closes the database connection and cleans up resources\n   */\n  async close(): Promise<void> {\n    this.databaseService = null;\n    this.initialized = false;\n    this.config = null;\n  }\n\n  /**\n   * Gets the current configuration\n   *\n   * @returns {DbServiceConfig | null} Current config or null if not initialized\n   */\n  getConfig(): DbServiceConfig | null {\n    return this.config;\n  }\n\n  /**\n   * Gets the current adapter type\n   *\n   * @returns The adapter type or null if not initialized\n   */\n  getAdapterType(): 'drizzle' | 'supabase' | 'sql' | null {\n    return this.config?.adapter ?? null;\n  }\n\n  /**\n   * Creates a dedicated database service instance (NOT the singleton)\n   *\n   * Use this when you need an isolated database connection with its own configuration\n   * that doesn't affect or get affected by the shared singleton instance.\n   *\n   * @param config - Database service configuration\n   * @returns Promise that resolves to a new dedicated DbService instance\n   *\n   * @example\n   * ```typescript\n   * // Create a dedicated instance for analytics database\n   * const analyticsDb = await DbService.createInstance({\n   *   adapter: 'sql',\n   *   sql: { connectionString: process.env.ANALYTICS_DB_URL },\n   *   cache: { enabled: false }, // No caching for analytics\n   * });\n   *\n   * // This instance is independent from DbService.getInstance()\n   * const data = await analyticsDb.getDatabase().list('events');\n   *\n   * // Clean up when done\n   * await analyticsDb.close();\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  static async createInstance(config: DbServiceConfig): Promise<DbService> {\n    // Create a new instance (not the singleton)\n    const dedicatedInstance = new DbService();\n\n    // Build encryption config if key provided\n    const encryptionKey = config.encryption?.key;\n    const encryptionConfig = encryptionKey\n      ? {\n          enabled: config.encryption?.enabled ?? true,\n          key: encryptionKey,\n          fields: config.encryption?.fields ?? DEFAULT_ENCRYPTION_FIELDS,\n          algorithm: config.encryption?.algorithm ?? ('aes-256-gcm' as const),\n        }\n      : undefined;\n\n    const mergedConfig = {\n      ...DEFAULT_CONFIG,\n      ...config,\n      // Deep merge extensions\n      softDelete: { ...DEFAULT_CONFIG.softDelete, ...config.softDelete },\n      cache: { ...DEFAULT_CONFIG.cache, ...config.cache },\n      audit: { ...DEFAULT_CONFIG.audit, ...config.audit },\n      // Encryption only if key is available\n      encryption: encryptionConfig,\n    } as DbServiceConfig;\n\n    dedicatedInstance.config = mergedConfig;\n\n    // Build adapter configuration based on adapter type\n    const dbConfig = dedicatedInstance.buildDatabaseConfig(mergedConfig);\n\n    dedicatedInstance.databaseService = await createDatabaseService(dbConfig);\n\n    // Initialize named adapters if configured\n    if (mergedConfig.adapters) {\n      for (const [name, adapterConfig] of Object.entries(mergedConfig.adapters)) {\n        const namedDbConfig = dedicatedInstance.buildDatabaseConfig({\n          ...mergedConfig,\n          adapter: adapterConfig.adapter,\n          drizzle: adapterConfig.drizzle,\n          supabase: adapterConfig.supabase,\n          sql: adapterConfig.sql,\n        });\n\n        const namedService = await createDatabaseService(namedDbConfig);\n        dedicatedInstance.namedAdapters.set(name, namedService);\n      }\n    }\n\n    dedicatedInstance.initialized = true;\n\n    return dedicatedInstance;\n  }\n}\n\n/** Type alias for DbService instance (use for type-only imports to avoid bundling) */\nexport type DbServiceInstance = DbService;\n","/**\n * Example Repository\n *\n * Data access layer for Example entities.\n * Extends BaseRepository from @plyaz/db for consistent CRUD operations.\n * Falls back to in-memory dummy data when DbService is not initialized.\n *\n * @example\n * ```typescript\n * // With DbService initialized\n * const db = DbService.getInstance().getDatabase();\n * const repository = new ExampleRepository(db);\n *\n * // Get all entities\n * const result = await repository.findMany();\n * if (result.success) {\n *   console.log('Entities:', result.value.data);\n * }\n *\n * // Get by ID\n * const entity = await repository.findById('123');\n * ```\n */\n\nimport { BaseRepository } from '@plyaz/db';\nimport { DbService } from '../../services/DbService';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport { generateId } from '../../utils/common';\nimport { SYSTEM_USER_ID } from '@plyaz/types/core';\nimport type {\n  DatabaseResult,\n  PaginatedResult,\n  QueryOptions,\n  DatabaseServiceInterface,\n  OperationConfig,\n} from '@plyaz/types/db';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Database row type for Example entity (snake_case for DB)\n */\nexport interface ExampleDatabaseRow {\n  id: string;\n  name: string;\n  description: string | null;\n  amount: number;\n  owner_id: string;\n  status: string;\n  is_visible: boolean;\n  created_at: string;\n  updated_at: string;\n  deleted_at?: string | null;\n  [key: string]: unknown;\n}\n\n/**\n * Create input for Example entity\n */\nexport type ExampleCreateInput = Omit<\n  ExampleDatabaseRow,\n  'id' | 'created_at' | 'updated_at' | 'deleted_at'\n>;\n\n/**\n * Update input for Example entity\n */\nexport type ExampleUpdateInput = Partial<Omit<ExampleDatabaseRow, 'id' | 'created_at'>>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default table name for examples */\nconst EXAMPLE_TABLE = 'examples';\n\n/** Default pagination limit for list queries */\nconst DEFAULT_PAGINATION_LIMIT = 100;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Dummy Data (fallback when DbService not available)\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DUMMY_DATA: ExampleDatabaseRow[] = [\n  {\n    id: 'example-001',\n    name: 'Premium Subscription',\n    description: 'Monthly premium subscription plan',\n    amount: 9999,\n    owner_id: 'user-001',\n    status: 'active',\n    is_visible: true,\n    created_at: '2024-01-15T10:00:00Z',\n    updated_at: '2024-01-15T10:00:00Z',\n  },\n  {\n    id: 'example-002',\n    name: 'Basic Plan',\n    description: 'Free tier with limited features',\n    amount: 0,\n    owner_id: 'user-001',\n    status: 'active',\n    is_visible: true,\n    created_at: '2024-01-10T08:30:00Z',\n    updated_at: '2024-01-12T14:20:00Z',\n  },\n  {\n    id: 'example-003',\n    name: 'Enterprise License',\n    description: 'Custom enterprise solution',\n    amount: 99999,\n    owner_id: 'user-002',\n    status: 'draft',\n    is_visible: false,\n    created_at: '2024-02-01T09:00:00Z',\n    updated_at: '2024-02-01T09:00:00Z',\n  },\n];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Repository\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Example Repository\n *\n * Extends BaseRepository for consistent data access patterns.\n * When DbService is not initialized, falls back to in-memory dummy data.\n *\n * @example\n * ```typescript\n * // Create repository (auto-detects DbService availability)\n * const repo = ExampleRepository.create();\n *\n * // Or with explicit database service\n * const db = DbService.getInstance().getDatabase();\n * const repo = new ExampleRepository(db);\n *\n * // Use CRUD operations\n * const result = await repo.findById('example-001');\n * ```\n */\nexport class ExampleRepository extends BaseRepository<ExampleDatabaseRow> {\n  private readonly useDummyData: boolean;\n  private dummyStore: ExampleDatabaseRow[];\n\n  constructor(db: DatabaseServiceInterface, useDummyData = false) {\n    super(db, EXAMPLE_TABLE);\n    this.useDummyData = useDummyData;\n    this.dummyStore = [...DUMMY_DATA];\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Factory\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create repository instance.\n   * Uses DbService if initialized, otherwise creates a dummy-data repository.\n   */\n  static create(): ExampleRepository {\n    if (DbService.isInitialized()) {\n      const db = DbService.getInstance().getDatabase();\n      return new ExampleRepository(db, false);\n    }\n\n    // Create with dummy mode - db won't be used\n    // We pass a mock db that won't be called when useDummyData is true\n    const mockDb = {} as DatabaseServiceInterface;\n    return new ExampleRepository(mockDb, true);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Override Base Methods to Support Dummy Data Fallback\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Find entity by ID\n   */\n  override async findById(\n    id: string,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<ExampleDatabaseRow | null>> {\n    if (this.useDummyData) {\n      const row = this.dummyStore.find(r => r.id === id && !r.deleted_at);\n      return { success: true, value: row ?? null };\n    }\n    return super.findById(id, config);\n  }\n\n  /**\n   * Find multiple entities\n   */\n  // eslint-disable-next-line complexity\n  override async findMany(\n    options?: QueryOptions<ExampleDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<PaginatedResult<ExampleDatabaseRow>>> {\n    if (this.useDummyData) {\n      let data = this.dummyStore.filter(r => !r.deleted_at);\n\n      // Apply basic filtering if provided\n      if (options?.filter && 'field' in options.filter) {\n        const { field, value } = options.filter;\n        data = data.filter(r => r[field as keyof ExampleDatabaseRow] === value);\n      }\n\n      // Apply pagination\n      const offset = options?.pagination?.offset ?? 0;\n      const limit = options?.pagination?.limit ?? DEFAULT_PAGINATION_LIMIT;\n      const paginatedData = data.slice(offset, offset + limit);\n\n      return {\n        success: true,\n        value: {\n          data: paginatedData,\n          total: data.length,\n          pagination: {\n            page: Math.floor(offset / limit) + 1,\n            limit,\n          },\n        },\n      };\n    }\n    return super.findMany(options, config);\n  }\n\n  /**\n   * Create new entity\n   *\n   * Note: `id` is auto-generated by DB (uuid_generate_v4) if not provided.\n   * `owner_id` is required by FK constraint - must be a valid user UUID (or null if DB allows).\n   */\n  // eslint-disable-next-line complexity\n  override async create(\n    data: Partial<ExampleDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<ExampleDatabaseRow>> {\n    const now = new Date().toISOString();\n\n    // For dummy data mode, we need an ID since there's no DB to generate one\n    if (this.useDummyData) {\n      const row: ExampleDatabaseRow = {\n        id: data.id ?? generateId(),\n        name: data.name ?? '',\n        description: data.description ?? null,\n        amount: data.amount ?? 0,\n        owner_id: data.owner_id ?? SYSTEM_USER_ID,\n        status: data.status ?? 'draft',\n        is_visible: data.is_visible ?? true,\n        created_at: now,\n        updated_at: now,\n      };\n      this.dummyStore.push(row);\n      return { success: true, value: row };\n    }\n\n    // For real DB: let DB generate id via uuid_generate_v4() if not provided\n    const row: Omit<ExampleDatabaseRow, 'id'> & { id?: string } = {\n      ...(data.id && { id: data.id }),\n      name: data.name ?? '',\n      description: data.description ?? null,\n      amount: data.amount ?? 0,\n      owner_id: data.owner_id ?? SYSTEM_USER_ID,\n      status: data.status ?? 'draft',\n      is_visible: data.is_visible ?? true,\n      created_at: now,\n      updated_at: now,\n    };\n\n    return super.create(row, config);\n  }\n\n  /**\n   * Update entity\n   */\n  override async update(\n    id: string,\n    data: Partial<ExampleDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<ExampleDatabaseRow>> {\n    const updateData = {\n      ...data,\n      updated_at: new Date().toISOString(),\n    };\n\n    if (this.useDummyData) {\n      const index = this.dummyStore.findIndex(r => r.id === id && !r.deleted_at);\n      if (index === -1) {\n        return {\n          success: false,\n          value: null as unknown as ExampleDatabaseRow,\n          error: new DatabasePackageError(\n            `Example not found: ${id}`,\n            DATABASE_ERROR_CODES.ENTITY_NOT_FOUND\n          ),\n        };\n      }\n      this.dummyStore[index] = { ...this.dummyStore[index], ...updateData };\n      return { success: true, value: this.dummyStore[index] };\n    }\n\n    return super.update(id, updateData, config);\n  }\n\n  /**\n   * Soft delete entity\n   */\n  override async softDelete(id: string, config?: OperationConfig): Promise<DatabaseResult<void>> {\n    if (this.useDummyData) {\n      const index = this.dummyStore.findIndex(r => r.id === id && !r.deleted_at);\n      if (index !== -1) {\n        this.dummyStore[index].deleted_at = new Date().toISOString();\n      }\n      return { success: true, value: undefined };\n    }\n    return super.softDelete(id, config);\n  }\n\n  /**\n   * Hard delete entity\n   */\n  override async delete(id: string, config?: OperationConfig): Promise<DatabaseResult<void>> {\n    if (this.useDummyData) {\n      const index = this.dummyStore.findIndex(r => r.id === id);\n      if (index !== -1) {\n        this.dummyStore.splice(index, 1);\n      }\n      return { success: true, value: undefined };\n    }\n    return super.delete(id, config);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Domain-Specific Query Methods (using QueryBuilder fluent API)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Find entities by status using fluent QueryBuilder\n   *\n   * @example\n   * ```typescript\n   * const result = await repo.findByStatus('active');\n   * ```\n   */\n  async findByStatus(status: string): Promise<DatabaseResult<PaginatedResult<ExampleDatabaseRow>>> {\n    if (this.useDummyData) {\n      return this.findMany({\n        filter: { field: 'status', operator: 'eq', value: status },\n      });\n    }\n    return this.query().where('status', 'eq', status).execute();\n  }\n\n  /**\n   * Find entities by owner using fluent QueryBuilder\n   *\n   * @example\n   * ```typescript\n   * const result = await repo.findByOwner('user-001');\n   * ```\n   */\n  async findByOwner(ownerId: string): Promise<DatabaseResult<PaginatedResult<ExampleDatabaseRow>>> {\n    if (this.useDummyData) {\n      return this.findMany({\n        filter: { field: 'owner_id', operator: 'eq', value: ownerId },\n      });\n    }\n    return this.query().where('owner_id', 'eq', ownerId).execute();\n  }\n\n  /**\n   * Find visible entities only using fluent QueryBuilder\n   *\n   * @example\n   * ```typescript\n   * const result = await repo.findVisible();\n   * ```\n   */\n  async findVisible(): Promise<DatabaseResult<PaginatedResult<ExampleDatabaseRow>>> {\n    if (this.useDummyData) {\n      return this.findMany({\n        filter: { field: 'is_visible', operator: 'eq', value: true },\n      });\n    }\n    return this.query().where('is_visible', 'eq', true).execute();\n  }\n\n  /**\n   * Find active and visible entities using complex QueryBuilder\n   *\n   * @example\n   * ```typescript\n   * const items = await repo.findActiveAndVisible();\n   * ```\n   */\n  async findActiveAndVisible(): Promise<ExampleDatabaseRow[]> {\n    if (this.useDummyData) {\n      return this.dummyStore.filter(r => r.status === 'active' && r.is_visible && !r.deleted_at);\n    }\n    return this.query()\n      .where('status', 'eq', 'active')\n      .andWhere('is_visible', 'eq', true)\n      .whereNull('deleted_at')\n      .orderByDesc('created_at')\n      .getMany();\n  }\n\n  /**\n   * Find entities by owner with status filter using QueryBuilder\n   *\n   * @example\n   * ```typescript\n   * const items = await repo.findByOwnerWithStatus('user-001', 'active');\n   * ```\n   */\n  async findByOwnerWithStatus(ownerId: string, status: string): Promise<ExampleDatabaseRow[]> {\n    if (this.useDummyData) {\n      return this.dummyStore.filter(\n        r => r.owner_id === ownerId && r.status === status && !r.deleted_at\n      );\n    }\n    return this.query()\n      .where('owner_id', 'eq', ownerId)\n      .andWhere('status', 'eq', status)\n      .orderByDesc('updated_at')\n      .getMany();\n  }\n\n  /**\n   * Count entities by status using QueryBuilder\n   *\n   * @example\n   * ```typescript\n   * const count = await repo.countByStatus('active');\n   * ```\n   */\n  async countByStatus(status: string): Promise<number> {\n    if (this.useDummyData) {\n      return this.dummyStore.filter(r => r.status === status && !r.deleted_at).length;\n    }\n    return this.query().where('status', 'eq', status).count();\n  }\n\n  /**\n   * Check if entity exists by ID\n   */\n  override async exists(id: string, config?: OperationConfig): Promise<DatabaseResult<boolean>> {\n    if (this.useDummyData) {\n      const exists = this.dummyStore.some(r => r.id === id && !r.deleted_at);\n      return { success: true, value: exists };\n    }\n    return super.exists(id, config);\n  }\n\n  /**\n   * Get the table name for this repository\n   * Used for transaction operations\n   */\n  override getTableName(): string {\n    return EXAMPLE_TABLE;\n  }\n}\n","/**\n * Example Models/Repositories\n *\n * Data access layer for Example entities.\n */\nexport {\n  ExampleRepository,\n  type ExampleDatabaseRow,\n  type ExampleCreateInput,\n  type ExampleUpdateInput,\n} from './ExampleRepository';\n","/**\n * Example Validator\n *\n * Demonstrates extending BaseValidator for a domain entity.\n * Uses schemas and types from @plyaz/types/examples.\n */\n\nimport { BaseValidator } from '../../base';\nimport {\n  CreateExampleSchema,\n  UpdateExampleSchema,\n  PatchExampleSchema,\n  DeleteExampleSchema,\n  QueryExampleSchema,\n} from '@plyaz/types/examples';\nimport type {\n  CreateExampleDTO,\n  UpdateExampleDTO,\n  PatchExampleDTO,\n  DeleteExampleDTO,\n  QueryExampleDTO,\n} from '@plyaz/types/examples';\n\n/**\n * Example Validator implementation\n *\n * Supports all HTTP operations:\n * - create (POST)\n * - update (PUT)\n * - patch (PATCH)\n * - delete (DELETE)\n * - query (GET)\n */\nclass ExampleValidatorClass extends BaseValidator<\n  CreateExampleDTO,\n  UpdateExampleDTO,\n  PatchExampleDTO,\n  DeleteExampleDTO,\n  QueryExampleDTO\n> {\n  constructor() {\n    super({\n      createSchema: CreateExampleSchema,\n      updateSchema: UpdateExampleSchema,\n      patchSchema: PatchExampleSchema,\n      deleteSchema: DeleteExampleSchema,\n      querySchema: QueryExampleSchema,\n    });\n  }\n\n  /**\n   * Custom validation: check if name is not reserved\n   * Use for business logic validation beyond schema validation\n   */\n  validateNameNotReserved(name: string): boolean {\n    const reserved = ['admin', 'system', 'root', 'test'];\n    return !reserved.includes(name.toLowerCase());\n  }\n\n  /**\n   * Custom validation: check if amount is within budget\n   */\n  validateAmountWithinBudget(amount: number, budget: number): boolean {\n    return amount <= budget;\n  }\n}\n\n// Export class for BaseDomainService.ValidatorClass\nexport { ExampleValidatorClass };\n\n// Singleton instance (for direct usage)\nexport const ExampleValidator = new ExampleValidatorClass();\n","/**\n * Backend Example Domain Service\n *\n * Demonstrates extending BaseBackendDomainService which provides:\n * - Automatic validation → mapper → repository/API → mapper flow\n * - Event emission throughout CRUD lifecycle\n * - Dual mode: Repository (DbService/dummy) OR HTTP API\n * - Configurable error throwing behavior\n *\n * This service only needs to:\n * - Initialize repository in constructor\n * - Set eventPrefix for event emission\n * - Implement isAvailable() and dispose()\n * - Add any custom domain methods\n *\n * All standard CRUD operations are inherited with cache support:\n * - create(data, options?) - Create with optional caching\n * - patch(id, data, options?) - Update with automatic cache invalidation\n * - delete(id, deleteOptions?, crudOptions?) - Delete with automatic cache invalidation\n * - getById(id, options?) - Read with cache-aside pattern\n *\n * Runtime: Backend (NestJS, Express, Node.js)\n * - Uses repository (DbService or dummy data fallback)\n * - Auto-initialized by Core.initialize() as part of DomainServices\n * - For HTTP API calls, use fetchers from @plyaz/api directly\n *\n * @example\n * ```tsx\n * // Create service\n * const service = await BackendExampleDomainService.create({\n *   throwOnValidationError: true, // Throw on validation errors (default)\n *   throwOnRepositoryError: true, // Throw on repository errors (default)\n * });\n *\n * // Use inherited CRUD methods\n * const entity = await service.create({ name: 'Test', amount: 100 });\n * const updated = await service.patch(entity.id, { amount: 200 });\n * await service.delete(entity.id, { soft: true });\n * ```\n */\n\nimport { BaseBackendDomainService } from '../base';\nimport type {\n  ExampleEntity,\n  ExampleResponseDTO,\n  CreateExampleDTO,\n  PatchExampleDTO,\n  QueryExampleDTO,\n  DeleteExampleDTO,\n  ExampleStoreItem,\n  ExampleDomainServiceConfig as _ExampleDomainServiceConfig,\n} from '@plyaz/types/examples';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type { CoreServiceCreateOptions, CoreInjectedServices } from '@plyaz/types/core';\nimport { ExampleRepository, type ExampleDatabaseRow } from '../../models/example';\nimport { ExampleMapperClass } from './mappers/ExampleMapper';\nimport { ExampleValidatorClass } from './validators/ExampleValidator';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Mapper type for this service\n */\ntype ExampleMapper = InstanceType<typeof ExampleMapperClass>;\n\n/**\n * Validator type for this service\n */\ntype ExampleValidator = InstanceType<typeof ExampleValidatorClass>;\n\n/**\n * Example event types (for subscription)\n */\nexport type ExampleEventType =\n  // Lifecycle events\n  | 'example:creating'\n  | 'example:created'\n  | 'example:updating'\n  | 'example:updated'\n  | 'example:deleting'\n  | 'example:deleted'\n  | 'example:complete'\n  | 'example:error'\n  // Validation events\n  | 'example:validation:started'\n  | 'example:validation:success'\n  | 'example:validation:failed'\n  // Sanitization events\n  | 'example:sanitization:started'\n  | 'example:sanitization:complete'\n  // Document generation events (via @plyaz/storage - generateFile)\n  | 'example:document:generating'\n  | 'example:document:generated'\n  | 'example:document:error'\n  // File upload events (via @plyaz/storage - uploadFile with template)\n  | 'example:upload:uploading'\n  | 'example:upload:uploaded'\n  | 'example:upload:error'\n  // Email sending events (via @plyaz/notifications)\n  | 'example:email:sending'\n  | 'example:email:sent'\n  | 'example:email:error';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Backend Example Domain Service\n *\n * Extends BaseBackendDomainService with all generic types:\n * - TConfig: ExampleDomainServiceConfig\n * - TEntity: ExampleEntity\n * - TResponseDTO: ExampleResponseDTO\n * - TCreateDTO: CreateExampleDTO\n * - TUpdateDTO: CreateExampleDTO (same as create)\n * - TPatchDTO: PatchExampleDTO\n * - TQueryDTO: QueryExampleDTO\n * - TDeleteOptions: DeleteExampleDTO\n * - TRepository: ExampleRepository\n * - TDatabaseRow: ExampleDatabaseRow\n * - TStoreState: ExampleStoreItem\n * - TMapper: ExampleMapper\n * - TValidator: ExampleValidator\n *\n * All CRUD methods are inherited from base class - no need to implement!\n */\nexport class BackendExampleDomainService extends BaseBackendDomainService<\n  _ExampleDomainServiceConfig,\n  ExampleEntity,\n  ExampleResponseDTO,\n  CreateExampleDTO,\n  CreateExampleDTO, // Update same as create\n  PatchExampleDTO,\n  QueryExampleDTO, // Query/filter type for getAll()\n  DeleteExampleDTO,\n  ExampleDatabaseRow,\n  ExampleRepository,\n  ExampleStoreItem,\n  ExampleMapper,\n  ExampleValidator\n> {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Required Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Repository instance for data access\n   * Required by BaseBackendDomainService\n   */\n  protected repository: ExampleRepository;\n\n  /**\n   * Event prefix for all events emitted by this service\n   * Required by BaseBackendDomainService\n   */\n  protected eventPrefix = 'example';\n\n  /**\n   * Cache prefix for namespacing cache keys\n   * Optional: defaults to serviceName.toLowerCase() if not set\n   */\n  protected cachePrefix = 'example';\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Injected Services\n  // NOTE: storageService and notificationsService are inherited from BaseBackendDomainService\n  // - storageService: uploadFile(), generateFile(), downloadFile(), deleteFile(), getSignedUrl()\n  // - notificationsService: sendEmail(), sendSMS(), sendPush()\n  // ─────────────────────────────────────────────────────────────────────────\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static: Service Registry Interface\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Unique key for this service (used by ServiceRegistry)\n   */\n  static readonly serviceKey = SERVICE_KEYS.EXAMPLE;\n\n  /**\n   * Factory method for ServiceRegistry auto-initialization.\n   * Creates and initializes the service instance.\n   *\n   * @param config - Service configuration\n   * @param options - Global options from the registry (includes cache, db, api instances)\n   * @returns Promise resolving to the initialized service instance\n   */\n  // eslint-disable-next-line complexity\n  static async create(\n    config: _ExampleDomainServiceConfig,\n    options?: CoreServiceCreateOptions\n  ): Promise<BackendExampleDomainService> {\n    // Build injected services from options (all injected by ServiceRegistry)\n    const injected: CoreInjectedServices = {\n      cache: options?.cache?.instance,\n      db: options?.db?.instance,\n      api: options?.apiClient?.instance,\n      storage: options?.storage?.instance,\n      notifications: options?.notifications?.instance,\n    };\n\n    const service = new BackendExampleDomainService(config, injected);\n    return service;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Constructor\n  // ─────────────────────────────────────────────────────────────────────────\n\n  constructor(config: _ExampleDomainServiceConfig = {}, injected?: CoreInjectedServices) {\n    const serviceConfig: _ExampleDomainServiceConfig = {\n      enabled: true,\n      throwOnValidationError: true,\n      throwOnRepositoryError: true,\n      emitEvents: true,\n      cache: {\n        enabled: true, // Enable cache by default\n        defaultTtl: 300, // 5 minutes default TTL\n      },\n      ...config,\n    };\n\n    super({\n      serviceName: 'BackendExampleDomainService',\n      supportedRuntimes: ['backend'] as const,\n      serviceConfig,\n      mapperClass: ExampleMapperClass,\n      validatorClass: ExampleValidatorClass,\n      injected, // Pass all injected services (cache, db, api, storage, notifications)\n    });\n\n    // Initialize repository (uses DbService if available, else dummy data)\n    this.repository = ExampleRepository.create();\n\n    // NOTE: storageService and notificationsService are handled by BaseBackendDomainService\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Abstract Implementations (Required by BaseDomainService)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if service is available\n   * Service is available if enabled (repository is always available)\n   */\n  isAvailable(): boolean {\n    return this.isServiceEnabled;\n  }\n\n  /**\n   * Dispose/cleanup the service\n   */\n  dispose(): void {\n    this.logInfo('Service disposed');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Custom Domain Methods (Optional)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Configure the service (mutates config)\n   * Use this to update configuration at runtime\n   */\n  configure(updates: Partial<_ExampleDomainServiceConfig>): void {\n    Object.assign(this.config, updates);\n    this.logDebug('Service configured', { config: this.config });\n  }\n\n  /**\n   * Subscribe to service events\n   * Uses CoreEventManager under the hood\n   *\n   * @param event - Event type to listen for\n   * @param handler - Event handler function\n   * @returns Unsubscribe function\n   */\n  // eslint-disable-next-line no-unused-vars\n  on(event: ExampleEventType, handler: (data: unknown) => void): () => void {\n    // Note: Events are emitted with prefix by BaseBackendDomainService\n    // E.g., 'creating' becomes 'example:creating'\n    return this.emitEvent as never; // Placeholder - actual implementation would use CoreEventManager\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Demo Methods - Error Handling Examples\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Demo: Single validation error\n   * Validates data with ONE field invalid to trigger single validation error in array\n   *\n   * @throws ValidationError[] (array with 1 error)\n   */\n  demoSingleValidationError(): void {\n    // Pass data with only ONE invalid field - validator throws [ValidationError]\n    this.validator.validateCreateOrThrow({\n      name: '', // Empty - required field (SINGLE ERROR)\n      amount: 100, // Valid\n      description: 'Valid description',\n      is_visible: true,\n    });\n  }\n\n  /**\n   * Demo: Multiple validation errors\n   * Validates data with MULTIPLE fields invalid to trigger array of validation errors\n   *\n   * @throws ValidationError[] (array with multiple errors)\n   */\n  demoMultipleValidationErrors(): void {\n    // Pass data with MULTIPLE invalid fields - validator throws [ValidationError, ValidationError, ...]\n    this.validator.validateCreateOrThrow({\n      name: '', // Empty - required field (ERROR 1)\n      amount: -100, // Negative - must be non-negative (ERROR 2)\n      description: '', // Empty - if required (ERROR 3)\n      is_visible: undefined, // Missing/invalid (ERROR 4)\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Demo Methods - getAll() Examples\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Demo: Get all examples with optional filters\n   * Demonstrates the getAll() method with typed query parameters\n   *\n   * @param filters - Optional query filters (status, pagination, sorting)\n   * @returns Promise resolving to array of ExampleEntity\n   *\n   * @example\n   * ```typescript\n   * // Get all active examples\n   * const activeExamples = await service.getExamples({ status: 'active' });\n   *\n   * // Get archived examples with pagination\n   * const archivedExamples = await service.getExamples({\n   *   status: 'archived',\n   *   page: 2,\n   *   limit: 10\n   * });\n   *\n   * // Get all examples sorted by name\n   * const sortedExamples = await service.getExamples({\n   *   sort_by: 'name',\n   *   sort_order: 'asc'\n   * });\n   * ```\n   */\n  async getExamples(filters?: QueryExampleDTO): Promise<ExampleEntity[]> {\n    return this.getAll(filters); // Properly typed!\n  }\n\n  /**\n   * Demo: Get active examples only\n   * Convenience method demonstrating filtering\n   */\n  async getActiveExamples(): Promise<ExampleEntity[]> {\n    return this.getAll({ status: 'active' });\n  }\n\n  /**\n   * Demo: Get draft examples only\n   * Convenience method demonstrating filtering\n   */\n  async getDraftExamples(): Promise<ExampleEntity[]> {\n    return this.getAll({ status: 'draft' });\n  }\n\n  /**\n   * Demo: Get archived examples only\n   * Convenience method demonstrating filtering\n   */\n  async getArchivedExamples(): Promise<ExampleEntity[]> {\n    return this.getAll({ status: 'archived' });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Demo Methods - Bulk Operations & Existence Checks\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Demo: Check if an example exists\n   * More efficient than fetching the full entity when you only need existence\n   *\n   * @param id - Example ID to check\n   * @returns Promise resolving to boolean\n   *\n   * @example\n   * ```typescript\n   * const exists = await service.checkExampleExists('123');\n   * if (exists) {\n   *   console.log('Example exists!');\n   * }\n   * ```\n   */\n  async checkExampleExists(id: string): Promise<boolean> {\n    return this.exists(id);\n  }\n\n  /**\n   * Demo: Create multiple examples at once\n   * More efficient than calling create() multiple times\n   *\n   * @param dataArray - Array of example data to create\n   * @returns Promise resolving to array of created entities\n   *\n   * @example\n   * ```typescript\n   * const examples = await service.createMultipleExamples([\n   *   { name: 'Example 1', amount: 100 },\n   *   { name: 'Example 2', amount: 200 },\n   *   { name: 'Example 3', amount: 300 },\n   * ]);\n   * console.log(`Created ${examples.length} examples`);\n   * ```\n   */\n  async createMultipleExamples(dataArray: CreateExampleDTO[]): Promise<ExampleEntity[]> {\n    return this.bulkCreate(dataArray);\n  }\n\n  /**\n   * Demo: Delete multiple examples at once\n   * More efficient than calling delete() multiple times\n   *\n   * @param ids - Array of example IDs to delete\n   * @param soft - Whether to soft delete (default: true)\n   * @returns Promise resolving when all deletions complete\n   *\n   * @example\n   * ```typescript\n   * // Soft delete multiple examples\n   * await service.deleteMultipleExamples(['id1', 'id2', 'id3'], true);\n   *\n   * // Hard delete multiple examples\n   * await service.deleteMultipleExamples(['id1', 'id2', 'id3'], false);\n   * ```\n   */\n  async deleteMultipleExamples(ids: string[], soft = true): Promise<void> {\n    return this.bulkDelete(ids, { soft });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // NOTE: Storage & Notification Methods Are Inherited from BaseBackendDomainService\n  // ─────────────────────────────────────────────────────────────────────────\n  //\n  // Storage Methods (via @plyaz/storage):\n  // - uploadFile(params) - Upload file (with optional template-based generation)\n  // - generateFile(params) - Generate document from template (returns Buffer)\n  //\n  // Notification Methods (via @plyaz/notifications):\n  // - sendEmail(params) - Send email using templates\n  //\n  // All methods include:\n  // - Event emission (upload:uploading, document:generating, email:sending, etc.)\n  // - Lifecycle hooks (beforeUploadFile, afterUploadFile, etc.)\n  // - Metrics recording\n  // - Error handling\n  //\n  // ─────────────────────────────────────────────────────────────────────────\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // NOTE: CRUD Methods Are Inherited from BaseBackendDomainService\n  // ─────────────────────────────────────────────────────────────────────────\n  //\n  // The following methods are available but NOT implemented here:\n  //\n  // Basic CRUD:\n  // - create(data: unknown): Promise<ExampleEntity>\n  // - getById(id: string, options?): Promise<ExampleEntity | null>\n  // - getAll(query?: QueryExampleDTO, options?): Promise<ExampleEntity[]>\n  // - patch(id: string, data: unknown, options?): Promise<ExampleEntity>\n  // - delete(id: string, deleteOptions?, crudOptions?): Promise<void>\n  //\n  // Utility Methods:\n  // - exists(id: string, options?): Promise<boolean>\n  //\n  // Bulk Operations:\n  // - bulkCreate(dataArray: unknown[], options?): Promise<ExampleEntity[]>\n  // - bulkDelete(ids: string[], deleteOptions?, crudOptions?): Promise<void>\n  //\n  // All validation → mapper → repository → mapper flow is handled automatically!\n  // All events are emitted automatically with 'example:' prefix!\n  // All cache operations are handled automatically (cache-aside, invalidation)!\n  // Bulk operations process sequentially (first error stops execution)!\n  // ─────────────────────────────────────────────────────────────────────────\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Lazy Singleton Instance\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _instance: BackendExampleDomainService | null = null;\n\n/**\n * Get the singleton instance of BackendExampleDomainService\n * Instance is only created when first called, not at module load time.\n *\n * @example\n * ```tsx\n * import { getBackendExampleDomainService } from '@plyaz/core';\n *\n * const service = await getBackendExampleDomainService();\n * const entity = await service.create({ name: 'Test', amount: 100 });\n * ```\n */\nexport async function getBackendExampleDomainService(): Promise<BackendExampleDomainService> {\n  _instance ??= new BackendExampleDomainService();\n  return _instance;\n}\n\n/**\n * Reset singleton instance (for testing)\n */\nexport function resetExampleDomainService(): void {\n  _instance = null;\n}\n","/**\n * Files Repository\n *\n * Data access layer for Files/Media entities.\n * Extends BaseRepository from @plyaz/db for consistent CRUD operations.\n */\n\nimport { BaseRepository } from '@plyaz/db';\nimport { DbService } from '../../services/DbService';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport type {\n  DatabaseResult,\n  PaginatedResult,\n  QueryOptions,\n  DatabaseServiceInterface,\n  OperationConfig,\n} from '@plyaz/types/db';\nimport { SYSTEM_USER_ID } from '@plyaz/types/core';\nimport type { FilesDatabaseRow } from '@plyaz/types/core';\nimport type { ENTITY_TYPE } from '@plyaz/types/storage';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Table name for media (files) */\nconst TABLE_NAME = 'media';\n\n/** Default pagination limit */\nconst DEFAULT_LIMIT = 100;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Repository\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Files Repository\n *\n * Data access layer for Files/Media entities.\n * Extends BaseRepository from @plyaz/db for consistent CRUD operations.\n *\n * Inherited from BaseRepository (used directly, no override needed):\n * - findById(id) - Get file by ID\n * - delete(id) - Hard delete file\n * - softDelete(id) - Soft delete file\n * - exists(id) - Check if file exists\n * - query() - Fluent QueryBuilder for complex queries\n * - count(filter) - Count files matching filter\n * - findOne(filter) - Find first matching file\n *\n * Overridden with domain logic:\n * - findMany(options) - Default sorting by created_at DESC\n * - create(data) - Auto-generate ID and timestamps\n *\n * Domain-specific methods:\n * - findByUserId(userId) - Get all files for a user\n * - findByEntityId(entityType, entityId) - Get files for an entity\n * - findByStoragePath(path) - Find file by storage path (for deduplication)\n * - countByUserId(userId) - Count files for a user\n */\nexport class FilesRepository extends BaseRepository<FilesDatabaseRow> {\n  constructor(db: DatabaseServiceInterface) {\n    super(db, TABLE_NAME);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Factory\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create repository instance.\n   * Uses DbService if initialized.\n   */\n  static create(): FilesRepository {\n    if (!DbService.isInitialized()) {\n      throw new DatabasePackageError(\n        'DbService not initialized. Call DbService.initialize() first.',\n        DATABASE_ERROR_CODES.CONNECTION_FAILED\n      );\n    }\n    const db = DbService.getInstance().getDatabase();\n    return new FilesRepository(db);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Overridden Methods (with domain-specific logic)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Find multiple entities with default sorting\n   */\n  // eslint-disable-next-line complexity\n  override async findMany(\n    options?: QueryOptions<FilesDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<PaginatedResult<FilesDatabaseRow>>> {\n    const mergedOptions: QueryOptions<FilesDatabaseRow> = {\n      sort: options?.sort ?? [{ field: 'created_at', direction: 'desc' }],\n      pagination: {\n        limit: options?.pagination?.limit ?? DEFAULT_LIMIT,\n        offset: options?.pagination?.offset ?? 0,\n      },\n      filter: options?.filter,\n    };\n\n    return super.findMany(mergedOptions, config);\n  }\n\n  /**\n   * Create new file record with timestamps (ID auto-generated by DB)\n   */\n  // eslint-disable-next-line complexity\n  override async create(\n    data: Partial<FilesDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<FilesDatabaseRow>> {\n    const now = new Date().toISOString();\n\n    // Build row - let DB generate id via uuid_generate_v4() if not provided\n    const row: Omit<FilesDatabaseRow, 'id'> & { id?: string } = {\n      ...(data.id && { id: data.id }),\n      user_id: data.user_id ?? SYSTEM_USER_ID,\n      type: data.type ?? 'DOCUMENT',\n      filename: data.filename ?? '',\n      original_filename: data.original_filename ?? data.filename ?? '',\n      mime_type: data.mime_type ?? 'application/octet-stream',\n      file_size: data.file_size ?? 0,\n      storage_path: data.storage_path ?? '',\n      cdn_url: data.cdn_url ?? null,\n      width: data.width ?? null,\n      height: data.height ?? null,\n      duration: data.duration ?? null,\n      is_virus_scanned: data.is_virus_scanned ?? false,\n      virus_scan_result: data.virus_scan_result ?? null,\n      metadata: data.metadata ?? null,\n      variants: data.variants ?? null,\n      entity_type: data.entity_type ?? null,\n      entity_id: data.entity_id ?? null,\n      access_level: data.access_level ?? null,\n      bucket: data.bucket ?? null,\n      created_at: now,\n      updated_at: now,\n      deleted_at: null,\n    };\n\n    return super.create(row, config);\n  }\n\n  /**\n   * Get the table name for this repository\n   */\n  override getTableName(): string {\n    return TABLE_NAME;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Domain-Specific Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Find all files for a user\n   */\n  async findByUserId(\n    userId: string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<FilesDatabaseRow>>> {\n    return this.findMany({\n      filter: { field: 'user_id', operator: 'eq', value: userId },\n      pagination: {\n        limit: options?.limit ?? DEFAULT_LIMIT,\n        offset: options?.offset ?? 0,\n      },\n    });\n  }\n\n  /**\n   * Find files for a specific entity (polymorphic association)\n   */\n  async findByEntityId(\n    entityType: ENTITY_TYPE,\n    entityId: string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<FilesDatabaseRow>>> {\n    return this.query()\n      .where('entity_type', 'eq', entityType)\n      .andWhere('entity_id', 'eq', entityId)\n      .whereNull('deleted_at')\n      .orderByDesc('created_at')\n      .paginate(\n        Math.floor((options?.offset ?? 0) / (options?.limit ?? DEFAULT_LIMIT)) + 1,\n        options?.limit ?? DEFAULT_LIMIT\n      )\n      .execute();\n  }\n\n  /**\n   * Find file by storage path (for deduplication checks)\n   */\n  async findByStoragePath(storagePath: string): Promise<DatabaseResult<FilesDatabaseRow | null>> {\n    return this.findOne({ field: 'storage_path', operator: 'eq', value: storagePath });\n  }\n\n  /**\n   * Count files for a user\n   */\n  async countByUserId(userId: string): Promise<DatabaseResult<number>> {\n    return this.count({ field: 'user_id', operator: 'eq', value: userId });\n  }\n\n  /**\n   * Find files by MIME type\n   */\n  async findByMimeType(\n    mimeType: string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<FilesDatabaseRow>>> {\n    return this.findMany({\n      filter: { field: 'mime_type', operator: 'eq', value: mimeType },\n      pagination: {\n        limit: options?.limit ?? DEFAULT_LIMIT,\n        offset: options?.offset ?? 0,\n      },\n    });\n  }\n\n  /**\n   * Find files by type (IMAGE, VIDEO, DOCUMENT, AUDIO)\n   */\n  async findByType(\n    type: string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<FilesDatabaseRow>>> {\n    return this.findMany({\n      filter: { field: 'type', operator: 'eq', value: type },\n      pagination: {\n        limit: options?.limit ?? DEFAULT_LIMIT,\n        offset: options?.offset ?? 0,\n      },\n    });\n  }\n}\n","/**\n * Media Variants Repository\n *\n * Data access layer for media_variants table.\n * Provides normalized storage for file variants (thumbnail, mobile, desktop, 4k).\n *\n * Use this repository when you need to:\n * - Query variants by name (e.g., \"find all thumbnails\")\n * - Query variants by dimensions\n * - Aggregate variant storage usage\n * - Clean up orphaned variants\n *\n * For simple variant access, use FilesDatabaseRow.variants JSONB column instead.\n */\n\nimport { BaseRepository } from '@plyaz/db';\nimport { DbService } from '../../services/DbService';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport type {\n  DatabaseResult,\n  PaginatedResult,\n  QueryOptions,\n  DatabaseServiceInterface,\n  OperationConfig,\n} from '@plyaz/types/db';\nimport type { MediaVariantsDatabaseRow } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Table name for media variants */\nconst TABLE_NAME = 'media_variants';\n\n/** Default pagination limit */\nconst DEFAULT_LIMIT = 100;\n\n/** Standard variant names */\nexport const VARIANT_NAMES = {\n  THUMBNAIL: 'thumbnail',\n  MOBILE: 'mobile',\n  DESKTOP: 'desktop',\n  HD_4K: '4k',\n} as const;\n\nexport type VariantName = (typeof VARIANT_NAMES)[keyof typeof VARIANT_NAMES];\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Repository\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Media Variants Repository\n *\n * Extends BaseRepository for normalized variant storage and querying.\n *\n * Inherited from BaseRepository (used directly):\n * - findById(id) - Get variant by ID\n * - delete(id) - Delete variant\n * - exists(id) - Check if variant exists\n * - query() - Fluent QueryBuilder\n * - count(filter) - Count variants\n * - findOne(filter) - Find single variant\n *\n * Domain-specific methods:\n * - findByMediaId(mediaId) - Get all variants for a media file\n * - findByVariantName(name) - Get all variants of a specific type\n * - findByMediaIdAndName(mediaId, name) - Get specific variant for a media file\n * - deleteByMediaId(mediaId) - Delete all variants for a media file\n * - getTotalSizeByMediaId(mediaId) - Get total storage size for a file's variants\n */\nexport class MediaVariantsRepository extends BaseRepository<MediaVariantsDatabaseRow> {\n  constructor(db: DatabaseServiceInterface) {\n    super(db, TABLE_NAME);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Factory\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create repository instance.\n   * Uses DbService if initialized.\n   */\n  static create(): MediaVariantsRepository {\n    if (!DbService.isInitialized()) {\n      throw new DatabasePackageError(\n        'DbService not initialized. Call DbService.initialize() first.',\n        DATABASE_ERROR_CODES.CONNECTION_FAILED\n      );\n    }\n    const db = DbService.getInstance().getDatabase();\n    return new MediaVariantsRepository(db);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Overridden Methods (with domain-specific logic)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Find multiple variants with default sorting\n   */\n  // eslint-disable-next-line complexity\n  override async findMany(\n    options?: QueryOptions<MediaVariantsDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<PaginatedResult<MediaVariantsDatabaseRow>>> {\n    const mergedOptions: QueryOptions<MediaVariantsDatabaseRow> = {\n      sort: options?.sort ?? [{ field: 'created_at', direction: 'desc' }],\n      pagination: {\n        limit: options?.pagination?.limit ?? DEFAULT_LIMIT,\n        offset: options?.pagination?.offset ?? 0,\n      },\n      filter: options?.filter,\n    };\n\n    return super.findMany(mergedOptions, config);\n  }\n\n  /**\n   * Create new variant record with auto-generated ID\n   */\n  // eslint-disable-next-line complexity\n  override async create(\n    data: Partial<MediaVariantsDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<MediaVariantsDatabaseRow>> {\n    const now = new Date().toISOString();\n\n    // Build row - let DB generate id via uuid_generate_v4() if not provided\n    const row: Omit<MediaVariantsDatabaseRow, 'id'> & { id?: string } = {\n      ...(data.id && { id: data.id }),\n      media_id: data.media_id ?? '',\n      variant_name: data.variant_name ?? '',\n      file_path: data.file_path ?? '',\n      cdn_url: data.cdn_url ?? null,\n      width: data.width ?? null,\n      height: data.height ?? null,\n      file_size: data.file_size ?? null,\n      created_at: now,\n    };\n\n    return super.create(row, config);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Domain-Specific Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Find all variants for a media file\n   */\n  async findByMediaId(\n    mediaId: string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<MediaVariantsDatabaseRow>>> {\n    return this.findMany({\n      filter: { field: 'media_id', operator: 'eq', value: mediaId },\n      pagination: {\n        limit: options?.limit ?? DEFAULT_LIMIT,\n        offset: options?.offset ?? 0,\n      },\n    });\n  }\n\n  /**\n   * Find all variants of a specific type (e.g., all thumbnails)\n   */\n  async findByVariantName(\n    variantName: VariantName | string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<MediaVariantsDatabaseRow>>> {\n    return this.findMany({\n      filter: { field: 'variant_name', operator: 'eq', value: variantName },\n      pagination: {\n        limit: options?.limit ?? DEFAULT_LIMIT,\n        offset: options?.offset ?? 0,\n      },\n    });\n  }\n\n  /**\n   * Find a specific variant for a media file\n   */\n  async findByMediaIdAndName(\n    mediaId: string,\n    variantName: VariantName | string\n  ): Promise<DatabaseResult<MediaVariantsDatabaseRow | null>> {\n    const record = await this.query()\n      .where('media_id', 'eq', mediaId)\n      .andWhere('variant_name', 'eq', variantName)\n      .getOne();\n    return { success: true, value: record };\n  }\n\n  /**\n   * Delete all variants for a media file\n   */\n  async deleteByMediaId(mediaId: string): Promise<DatabaseResult<number>> {\n    const result = await this.findByMediaId(mediaId);\n    if (!result.success || !result.value) {\n      return { success: true, value: 0 };\n    }\n\n    let deleted = 0;\n    for (const variant of result.value.data) {\n      const deleteResult = await this.delete(variant.id);\n      if (deleteResult.success) {\n        deleted++;\n      }\n    }\n\n    return { success: true, value: deleted };\n  }\n\n  /**\n   * Count variants for a media file\n   */\n  async countByMediaId(mediaId: string): Promise<DatabaseResult<number>> {\n    return this.count({ field: 'media_id', operator: 'eq', value: mediaId });\n  }\n\n  /**\n   * Count all variants of a specific type\n   */\n  async countByVariantName(variantName: VariantName | string): Promise<DatabaseResult<number>> {\n    return this.count({ field: 'variant_name', operator: 'eq', value: variantName });\n  }\n\n  /**\n   * Find variants by dimensions (useful for responsive queries)\n   */\n  async findByMinWidth(\n    minWidth: number,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<MediaVariantsDatabaseRow>>> {\n    return this.query()\n      .where('width', 'gte', minWidth)\n      .orderByDesc('width')\n      .paginate(\n        Math.floor((options?.offset ?? 0) / (options?.limit ?? DEFAULT_LIMIT)) + 1,\n        options?.limit ?? DEFAULT_LIMIT\n      )\n      .execute();\n  }\n\n  /**\n   * Upsert variant - create or update if exists\n   */\n  async upsert(\n    mediaId: string,\n    variantName: VariantName | string,\n    data: Partial<MediaVariantsDatabaseRow>\n  ): Promise<DatabaseResult<MediaVariantsDatabaseRow>> {\n    const existing = await this.findByMediaIdAndName(mediaId, variantName);\n\n    if (existing.success && existing.value) {\n      // Update existing\n      return this.update(existing.value.id, {\n        ...data,\n        media_id: mediaId,\n        variant_name: variantName,\n      });\n    }\n\n    // Create new\n    return this.create({\n      ...data,\n      media_id: mediaId,\n      variant_name: variantName,\n    });\n  }\n}\n","/**\n * Files Models Exports\n *\n * Types (FilesDatabaseRow, FilesCreateInput, MediaVariantsDatabaseRow) are in @plyaz/types/core\n */\n\nexport { FilesRepository } from './FilesRepository';\nexport {\n  MediaVariantsRepository,\n  VARIANT_NAMES,\n  type VariantName,\n} from './MediaVariantsRepository';\n","/**\n * Files Validator\n *\n * Domain-level validation for files.\n * File content validation is handled by @plyaz/storage (FileValidator, FilePathGenerator).\n * This validator provides domain-specific business rules and DB row validation.\n *\n * Note: Most file operations (upload, download, delete) are validated by:\n * - @plyaz/storage FileValidator for content/MIME validation\n * - @plyaz/storage FilePathGenerator.sanitizeFilename for filename sanitization\n * - @plyaz/api schemas for request validation\n * - This validator for DB row validation before insert\n */\n\nimport { BaseValidator } from '../../base';\nimport { CreateFilesSchema, PatchFilesSchema } from '@plyaz/types/core';\nimport type { FilesCreateInput, FilesPatchInput, CoreDeleteOptions } from '@plyaz/types/core';\n\n/**\n * Files Validator\n *\n * Validates file/media records before DB operations.\n * - createSchema: Validates data before repository.create()\n * - patchSchema: Validates partial updates\n * Provides domain-specific access control.\n */\nclass FilesValidatorClass extends BaseValidator<\n  FilesCreateInput,\n  FilesCreateInput,\n  FilesPatchInput,\n  CoreDeleteOptions,\n  Record<string, unknown>\n> {\n  constructor() {\n    super({\n      createSchema: CreateFilesSchema,\n      patchSchema: PatchFilesSchema,\n    });\n  }\n\n  /**\n   * Check if user has permission to access file\n   */\n  validateUserAccess(\n    userId: string,\n    fileOwnerId: string,\n    accessLevel: string | null,\n    isAdmin = false\n  ): boolean {\n    if (isAdmin) return true;\n    if (userId === fileOwnerId) return true;\n    if (accessLevel === 'public') return true;\n    if (accessLevel === 'protected' && userId) return true;\n    return false;\n  }\n}\n\nexport { FilesValidatorClass };\nexport const FilesValidator = new FilesValidatorClass();\n","/**\n * Backend Files Domain Service\n *\n * Extends BaseBackendDomainService for CRUD operations on the `media` table.\n * Similar to ExampleDomainService - uses base class methods with domain-specific config.\n *\n * Note: File upload/download is handled by @plyaz/storage service.\n * This service manages file metadata in the database.\n */\n\nimport { BaseBackendDomainService } from '../base';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { DOWNLOAD_CONFIG, TIME_CONSTANTS } from '@plyaz/config';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES, SERVICE_KEYS } from '@plyaz/types';\nimport type {\n  CoreServiceCreateOptions,\n  CoreInjectedServices,\n  CoreDeleteOptions,\n  FilesDownloadStreamProgress,\n} from '@plyaz/types/core';\nimport { FilesRepository } from '../../models/files';\nimport { FilesMapperClass } from './mappers/FilesMapper';\nimport { FilesValidatorClass } from './validators/FilesValidator';\nimport type {\n  FilesEntity,\n  FilesDatabaseRow,\n  FilesDomainServiceConfig,\n  FilesCreateInput,\n} from '@plyaz/types/core';\nimport type { FilesStoreItem } from '@plyaz/types/store';\nimport type { GetFileResponse } from '@plyaz/types/api';\nimport type { FileMetadata, StorageResolvedVariant } from '@plyaz/types/storage';\nimport { FilesMapper } from './mappers/FilesMapper';\n\ntype FilesMapperType = InstanceType<typeof FilesMapperClass>;\ntype FilesValidatorType = InstanceType<typeof FilesValidatorClass>;\n\n/**\n * Backend Files Domain Service\n *\n * CRUD methods inherited from BaseBackendDomainService:\n * - getById(id): Promise<FilesEntity | null>\n * - getAll(query?): Promise<FilesEntity[]>\n * - patch(id, data): Promise<FilesEntity>\n * - delete(id): Promise<void>\n * - exists(id): Promise<boolean>\n */\nexport class BackendFilesDomainService extends BaseBackendDomainService<\n  FilesDomainServiceConfig,\n  FilesEntity,\n  GetFileResponse,\n  FilesCreateInput,\n  FilesCreateInput,\n  Partial<FilesCreateInput>,\n  Record<string, unknown>,\n  CoreDeleteOptions,\n  FilesDatabaseRow,\n  FilesRepository,\n  FilesStoreItem,\n  FilesMapperType,\n  FilesValidatorType\n> {\n  private _repository?: FilesRepository;\n  protected eventPrefix = 'files';\n  protected cachePrefix = 'files';\n\n  static readonly serviceKey = SERVICE_KEYS.FILES;\n\n  /**\n   * Lazy repository getter - creates repository on first access.\n   * Throws if DbService is not initialized.\n   */\n  protected get repository(): FilesRepository {\n    this._repository ??= FilesRepository.create();\n    return this._repository;\n  }\n\n  /**\n   * Create service instance\n   */\n  // eslint-disable-next-line complexity\n  static async create(\n    config: FilesDomainServiceConfig = {},\n    options?: CoreServiceCreateOptions\n  ): Promise<BackendFilesDomainService> {\n    const injected: CoreInjectedServices = {\n      cache: options?.cache?.instance,\n      db: options?.db?.instance,\n      api: options?.apiClient?.instance,\n      storage: options?.storage?.instance,\n      notifications: options?.notifications?.instance,\n    };\n    return new BackendFilesDomainService(config, injected);\n  }\n\n  constructor(config: FilesDomainServiceConfig = {}, injected?: CoreInjectedServices) {\n    super({\n      serviceName: 'BackendFilesDomainService',\n      supportedRuntimes: ['backend'] as const,\n      serviceConfig: {\n        enabled: true,\n        throwOnValidationError: true,\n        throwOnRepositoryError: true,\n        emitEvents: true,\n        ...config,\n      },\n      mapperClass: FilesMapperClass,\n      validatorClass: FilesValidatorClass,\n      injected,\n    });\n    // Repository is created lazily via getter when first accessed\n  }\n\n  isAvailable(): boolean {\n    return this.isServiceEnabled;\n  }\n\n  dispose(): void {\n    this.logInfo('Service disposed');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Storage operations (via @plyaz/storage)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Download file content\n   * GET /files/:id/download\n   *\n   * Follows same pattern as base class CRUD methods:\n   * 1. assertReady\n   * 2. Record start time\n   * 3. Log debug info\n   * 4. Emit starting event\n   * 5. Execute operation\n   * 6. Emit success event\n   * 7. Record metrics\n   *\n   * @param params - Download parameters (fileId required)\n   * @returns Download result with buffer, filename, mimeType\n   */\n  // eslint-disable-next-line complexity\n  async downloadFile(params: { fileId: string }): Promise<{\n    buffer: string;\n    filename: string;\n    mimeType: string;\n  }> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Downloading file', { fileId: params.fileId });\n\n    // 1. Emit starting progress event (0%) via CoreEventManager for streaming\n    const startProgressData: FilesDownloadStreamProgress = {\n      fileId: params.fileId,\n      filename: 'unknown',\n      loaded: 0,\n      total: 0,\n      percentage: 0,\n      status: 'downloading',\n    };\n    CoreEventManager.emit('download:progress', startProgressData);\n\n    try {\n      // 2. Lifecycle hook (if defined)\n      await this.beforeDownloadFile?.(params);\n\n      // 3. Check storage service availability\n      if (!this.storageService) {\n        throw new CorePackageError(\n          'Storage service not available. Ensure storage is configured in Core.initialize().',\n          ERROR_CODES.CORE_PROVIDER_INITIALIZATION_FAILED\n        );\n      }\n\n      // 4. Look up file metadata from DB by UUID to get storage_path and bucket\n      // Client passes DB UUID as fileId, we look it up to get the actual storage path\n      const fileRecord = await this.getById(params.fileId);\n      if (!fileRecord) {\n        throw new CorePackageError(\n          `File not found in database: ${params.fileId}`,\n          ERROR_CODES.CORE_OPERATION_FAILED,\n          { context: { fileId: params.fileId, reason: 'file_not_found' } }\n        );\n      }\n\n      // 5. Download via storage service using storage_path (key) and bucket from DB\n      const storage = this.storageService.getStorage();\n      const result = await storage.downloadFile({\n        fileId: fileRecord.key, // storage_path from DB\n        bucket: fileRecord.bucket,\n      });\n\n      // 5. Prepare response\n      // DownloadResult has: file (Buffer), metadata (FileMetadata with filename, mimeType)\n      const fileSize = result?.file?.length ?? 0;\n      const filename = result?.metadata?.filename ?? 'download';\n      const response = {\n        buffer: result?.file?.toString('base64') ?? '',\n        filename,\n        mimeType: result?.metadata?.mimeType ?? 'application/octet-stream',\n      };\n\n      // 6. Lifecycle hook (if defined)\n      await this.afterDownloadFile?.(response);\n\n      // 7. Emit completed event (100%) via CoreEventManager for streaming\n      const completedProgressData: FilesDownloadStreamProgress = {\n        fileId: params.fileId,\n        filename,\n        loaded: fileSize,\n        total: fileSize,\n        percentage: 100,\n        status: 'completed',\n      };\n      CoreEventManager.emit('download:completed', completedProgressData);\n      this.emitEvent('complete', { success: true, operation: 'downloadFile' });\n\n      // 8. Record success metrics\n      await this.recordOperationMetrics('downloadFile', Date.now() - startTime, true);\n\n      return response;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('downloadFile', Date.now() - startTime, false);\n      // Emit download error event via CoreEventManager for streaming\n      const errorMessage =\n        error && typeof error === 'object' && 'message' in error\n          ? String((error as { message: unknown }).message)\n          : 'Download failed';\n      const errorProgressData: FilesDownloadStreamProgress = {\n        fileId: params.fileId,\n        filename: 'unknown',\n        loaded: 0,\n        total: 0,\n        percentage: 0,\n        status: 'failed',\n        error: errorMessage,\n      };\n      CoreEventManager.emit('download:error', errorProgressData);\n      throw error;\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before file download.\n   * Override in subclass for custom pre-download logic.\n   */\n  protected beforeDownloadFile?(params: { fileId: string }): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after file download.\n   * Override in subclass for custom post-download logic.\n   */\n  protected afterDownloadFile?(result: {\n    buffer: string;\n    filename: string;\n    mimeType: string;\n  }): Promise<void>;\n\n  /**\n   * Get signed URL for file\n   * GET /files/:id/signed-url\n   *\n   * Follows same pattern as base class CRUD methods.\n   *\n   * @param params - Signed URL parameters (fileId required)\n   * @returns Signed URL result with url and expiresAt\n   */\n  // eslint-disable-next-line complexity\n  async getSignedUrl(params: { fileId: string; expiresIn?: number }): Promise<{\n    url: string;\n    expiresAt: string;\n  }> {\n    this.assertReady();\n    const startTime = Date.now();\n    this.logDebug('Getting signed URL', { fileId: params.fileId, expiresIn: params.expiresIn });\n\n    // 1. Emit starting event\n    this.emitEvent('signedUrl:requesting', { request: params });\n\n    try {\n      // 2. Lifecycle hook (if defined)\n      await this.beforeGetSignedUrl?.(params);\n\n      // 3. Check storage service availability\n      if (!this.storageService) {\n        throw new CorePackageError(\n          'Storage service not available. Ensure storage is configured in Core.initialize().',\n          ERROR_CODES.CORE_PROVIDER_INITIALIZATION_FAILED\n        );\n      }\n\n      // 4. Look up file metadata from DB by UUID to get storage_path and bucket\n      // Client passes DB UUID as fileId, we look it up to get the actual storage path\n      const fileRecord = await this.getById(params.fileId);\n      if (!fileRecord) {\n        throw new CorePackageError(\n          `File not found in database: ${params.fileId}`,\n          ERROR_CODES.CORE_OPERATION_FAILED,\n          { context: { fileId: params.fileId, reason: 'file_not_found' } }\n        );\n      }\n\n      // 5. Get signed URL via storage service using storage_path (key) and bucket from DB\n      const storage = this.storageService.getStorage();\n      const result = await storage.getSignedUrl({\n        fileId: fileRecord.key, // storage_path from DB\n        bucket: fileRecord.bucket,\n        expiresIn: params.expiresIn ?? DOWNLOAD_CONFIG.DEFAULT_SIGNED_URL_EXPIRY_SECONDS,\n        operation: 'get',\n      });\n\n      // 5. Prepare response\n      const response = {\n        url: result?.url ?? '',\n        expiresAt:\n          result?.expiresAt?.toISOString() ??\n          new Date(Date.now() + TIME_CONSTANTS.HOUR).toISOString(),\n      };\n\n      // 6. Lifecycle hook (if defined)\n      await this.afterGetSignedUrl?.(response);\n\n      // 7. Emit success event\n      this.emitEvent('signedUrl:received', { result: response });\n      this.emitEvent('complete', { success: true, operation: 'getSignedUrl' });\n\n      // 8. Record success metrics\n      await this.recordOperationMetrics('getSignedUrl', Date.now() - startTime, true);\n\n      return response;\n    } catch (error) {\n      // Record error metrics\n      await this.recordOperationMetrics('getSignedUrl', Date.now() - startTime, false);\n      this.emitEvent('signedUrl:error', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Lifecycle hook: called before getting signed URL.\n   * Override in subclass for custom pre-signedUrl logic.\n   */\n  protected beforeGetSignedUrl?(params: { fileId: string; expiresIn?: number }): Promise<void>;\n\n  /**\n   * Lifecycle hook: called after getting signed URL.\n   * Override in subclass for custom post-signedUrl logic.\n   */\n  protected afterGetSignedUrl?(result: { url: string; expiresAt: string }): Promise<void>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // DB Persistence (called by StorageService on upload complete)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Persist uploaded file metadata to the media table.\n   * Called by StorageService.onFileUploaded event handler.\n   *\n   * Uses upsert logic: updates existing record if storage_path exists,\n   * otherwise creates new record.\n   *\n   * @param metadata - File metadata from storage upload\n   * @param variants - Optional file variants (thumbnails, etc.)\n   * @param userId - Optional user ID who uploaded the file\n   * @returns The created/updated DB record with UUID\n   */\n  // eslint-disable-next-line complexity\n  async persistUploadedFile(\n    metadata: FileMetadata,\n    variants?: Record<string, StorageResolvedVariant>,\n    userId?: string\n  ): Promise<FilesDatabaseRow | undefined> {\n    const startTime = Date.now();\n    this.logDebug('Persisting uploaded file to DB', {\n      fileId: metadata.fileId,\n      filename: metadata.filename,\n      storagePath: metadata.path,\n    });\n\n    try {\n      // 1. Check if record already exists by storage_path (unique constraint)\n      const existing = await this.getByStoragePath(metadata.path);\n\n      // 2. Map storage metadata to DB row format\n      const dbRow = FilesMapper.toDbRow({ metadata, variants }, userId);\n\n      let result;\n\n      if (existing) {\n        // 3a. Update existing record\n        this.logDebug('File already exists in DB, updating', {\n          existingId: existing.id,\n          storagePath: metadata.path,\n        });\n\n        const validatedRow = this.validator.validateUpdateOrThrow(dbRow);\n        result = await this.repository.update(existing.id, validatedRow);\n\n        if (!result.success) {\n          throw (\n            result.error ??\n            new CorePackageError(\n              `Failed to update file in media table: ${metadata.fileId}`,\n              ERROR_CODES.CORE_OPERATION_FAILED,\n              { context: { fileId: metadata.fileId, filename: metadata.filename } }\n            )\n          );\n        }\n\n        this.logDebug('File updated in media table', {\n          fileId: metadata.fileId,\n          filename: metadata.filename,\n          dbId: existing.id,\n        });\n      } else {\n        // 3b. Create new record\n        const validatedRow = this.validator.validateCreateOrThrow(dbRow);\n        result = await this.repository.create(validatedRow);\n\n        if (!result.success) {\n          throw (\n            result.error ??\n            new CorePackageError(\n              `Failed to persist file to media table: ${metadata.fileId}`,\n              ERROR_CODES.CORE_OPERATION_FAILED,\n              { context: { fileId: metadata.fileId, filename: metadata.filename } }\n            )\n          );\n        }\n\n        this.logDebug('File persisted to media table', {\n          fileId: metadata.fileId,\n          filename: metadata.filename,\n          dbId: result.value?.id,\n        });\n      }\n\n      await this.recordOperationMetrics('persistUploadedFile', Date.now() - startTime, true);\n\n      // Return the DB record with UUID\n      return result.value ?? existing ?? undefined;\n    } catch (error) {\n      this.logError('Failed to persist file to media table', {\n        fileId: metadata.fileId,\n        filename: metadata.filename,\n        error: error instanceof Error ? error.message : String(error),\n      });\n      await this.recordOperationMetrics('persistUploadedFile', Date.now() - startTime, false);\n      throw error;\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // NOTE: CRUD and Storage Methods Are Inherited from BaseBackendDomainService\n  // ─────────────────────────────────────────────────────────────────────────\n  //\n  // CRUD methods:\n  // - getById(id) - for GET /files/:id\n  // - getAll(query) - for listing files\n  // - delete(id) - for DELETE /files/:id\n  // - exists(id) - check if file exists\n  //\n  // Storage methods (inherited):\n  // - uploadFile(params) - for POST /files/upload\n  // - generateFile(params) - for POST /files/generate-document\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get file record by storage path\n   * Used to retrieve the DB record after upload (since event handler persists it)\n   */\n  async getByStoragePath(storagePath: string): Promise<FilesDatabaseRow | undefined> {\n    const result = await this.repository.findMany({\n      filter: { field: 'storage_path', operator: 'eq', value: storagePath },\n    });\n    const data = result.value?.data ?? [];\n    if (result.success && data.length > 0) {\n      return data[0];\n    }\n    return undefined;\n  }\n}\n\n// Singleton (for direct usage - prefer ServiceRegistry.get('files') for proper injection)\nlet _instance: BackendFilesDomainService | null = null;\n\nexport async function getBackendFilesDomainService(\n  config?: FilesDomainServiceConfig,\n  options?: CoreServiceCreateOptions\n): Promise<BackendFilesDomainService> {\n  _instance ??= await BackendFilesDomainService.create(config, options);\n  return _instance;\n}\n\nexport function resetFilesDomainService(): void {\n  if (_instance) {\n    _instance.dispose();\n    _instance = null;\n  }\n}\n","/**\n * Notifications Repository\n *\n * Data access layer for Notifications entities.\n * Extends BaseRepository from @plyaz/db for consistent CRUD operations.\n *\n * @example\n * ```typescript\n * const repo = NotificationsRepository.create();\n *\n * // Create operations\n * const entity = await repo.create({ user_id: '...', title: '...', message: '...' });\n *\n * // List operations (inherited from BaseRepository)\n * const all = await repo.findMany();\n * const entity = await repo.findById('123');\n *\n * // Delete operations\n * await repo.delete('123');\n * await repo.softDelete('123');\n * ```\n */\n\nimport { BaseRepository } from '@plyaz/db';\nimport { DbService } from '../../services/DbService';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport type {\n  DatabaseResult,\n  PaginatedResult,\n  QueryOptions,\n  DatabaseServiceInterface,\n  OperationConfig,\n} from '@plyaz/types/db';\nimport type { NotificationsDatabaseRow, CreateNotificationsDTO } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Table name for notifications */\nconst TABLE_NAME = 'notifications';\n\n/** Default pagination limit */\nconst DEFAULT_LIMIT = 100;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Repository\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Notifications Repository\n *\n * Data access layer for Notifications entities.\n *\n * Inherited from BaseRepository (used directly):\n * - findById(id) - Get entity by ID\n * - delete(id) - Hard delete entity\n * - softDelete(id) - Soft delete entity\n * - exists(id) - Check if entity exists\n * - query() - Fluent QueryBuilder for complex queries\n * - count(filter) - Count entities matching filter\n * - findOne(filter) - Find first matching entity\n * - update(id, data) - Update entity\n *\n * Overridden with domain logic:\n * - findMany(options) - Default sorting by created_at DESC\n * - create(data) - Create with defaults for required fields\n */\nexport class NotificationsRepository extends BaseRepository<NotificationsDatabaseRow> {\n  constructor(db: DatabaseServiceInterface) {\n    super(db, TABLE_NAME);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Factory\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create repository instance.\n   * Uses DbService singleton.\n   */\n  static create(): NotificationsRepository {\n    if (!DbService.isInitialized()) {\n      throw new DatabasePackageError(\n        'DbService not initialized. Call DbService.initialize() first.',\n        DATABASE_ERROR_CODES.CONNECTION_FAILED\n      );\n    }\n    const db = DbService.getInstance().getDatabase();\n    return new NotificationsRepository(db);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Overridden Methods (with domain-specific logic)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Find multiple entities with default sorting\n   */\n  override async findMany(\n    options?: QueryOptions<NotificationsDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<PaginatedResult<NotificationsDatabaseRow>>> {\n    const mergedOptions: QueryOptions<NotificationsDatabaseRow> = {\n      sort: options?.sort ?? [{ field: 'created_at', direction: 'desc' }],\n      pagination: {\n        limit: options?.pagination?.limit ?? DEFAULT_LIMIT,\n        offset: options?.pagination?.offset ?? 0,\n      },\n      filter: options?.filter,\n    };\n    return super.findMany(mergedOptions, config);\n  }\n\n  /**\n   * Create new notification record with defaults\n   * Domain service handles DTO → DbRow conversion via mapper before calling this\n   */\n  override async create(\n    data: Partial<NotificationsDatabaseRow> &\n      Partial<\n        Pick<\n          CreateNotificationsDTO,\n          | 'userId'\n          | 'recipientId'\n          | 'linkUrl'\n          | 'referenceId'\n          | 'referenceType'\n          | 'correlationId'\n          | 'templateId'\n          | 'providerMessageId'\n        >\n      >,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<NotificationsDatabaseRow>> {\n    const now = new Date().toISOString();\n\n    // Build row with defaults - accept both camelCase (DTO) and snake_case (DB) fields\n    const row: Omit<NotificationsDatabaseRow, 'id'> & { id?: string } = {\n      ...(data.id && { id: data.id }),\n      created_at: data.created_at ?? now,\n      user_id: data.user_id ?? data.userId ?? '',\n      type: data.type ?? 'SYSTEM',\n      title: data.title ?? '',\n      message: data.message ?? '',\n      recipient_id: data.recipient_id ?? data.recipientId ?? '',\n      link_url: data.link_url ?? data.linkUrl ?? null,\n      reference_id: data.reference_id ?? data.referenceId ?? null,\n      reference_type: data.reference_type ?? data.referenceType ?? null,\n      correlation_id: data.correlation_id ?? data.correlationId ?? null,\n      template_id: data.template_id ?? data.templateId ?? null,\n      channel: data.channel ?? 'IN_APP',\n      category: data.category ?? 'transactional',\n      provider: data.provider ?? null,\n      provider_message_id: data.provider_message_id ?? data.providerMessageId ?? null,\n      status: data.status ?? 'queued',\n      sent_at: data.sent_at ?? null,\n      delivered_at: data.delivered_at ?? null,\n      is_read: data.is_read ?? false,\n      read_at: data.read_at ?? null,\n      error_message: data.error_message ?? null,\n      retry_count: data.retry_count ?? 0,\n      deleted_at: data.deleted_at ?? null,\n    };\n\n    return super.create(row, config);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Domain-Specific Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Find notifications by user ID\n   */\n  async findByUserId(\n    userId: string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<NotificationsDatabaseRow>>> {\n    return this.findMany({\n      filter: { field: 'user_id', operator: 'eq', value: userId },\n      pagination: {\n        limit: options?.limit ?? DEFAULT_LIMIT,\n        offset: options?.offset ?? 0,\n      },\n    });\n  }\n\n  /**\n   * Find notifications by channel\n   */\n  async findByChannel(\n    channel: string,\n    options?: { limit?: number; offset?: number }\n  ): Promise<DatabaseResult<PaginatedResult<NotificationsDatabaseRow>>> {\n    return this.findMany({\n      filter: { field: 'channel', operator: 'eq', value: channel },\n      pagination: {\n        limit: options?.limit ?? DEFAULT_LIMIT,\n        offset: options?.offset ?? 0,\n      },\n    });\n  }\n\n  /**\n   * Get table name (for BaseBackendDomainService compatibility)\n   */\n  getTableName(): string {\n    return TABLE_NAME;\n  }\n}\n","/**\n * Notification Preferences Repository\n *\n * Data access layer for user notification preferences.\n * Used by DatabasePreferenceChecker to implement PreferenceChecker interface.\n */\n\nimport { BaseRepository } from '@plyaz/db';\nimport { DbService } from '../../services/DbService';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport type { DatabaseResult, DatabaseServiceInterface, OperationConfig } from '@plyaz/types/db';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst TABLE_NAME = 'notification_preferences';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface NotificationPreferencesDatabaseRow extends Record<string, unknown> {\n  id: string;\n  user_id: string;\n  // Channel preferences\n  email_enabled: boolean;\n  sms_enabled: boolean;\n  push_enabled: boolean;\n  // Category preferences\n  transactional_enabled: boolean;\n  marketing_enabled: boolean;\n  social_enabled: boolean;\n  system_enabled: boolean;\n  promotional_enabled: boolean;\n  // Quiet hours\n  quiet_hours_enabled: boolean;\n  quiet_hours_start: string | null;\n  quiet_hours_end: string | null;\n  quiet_hours_timezone: string;\n  // Timestamps\n  created_at: string;\n  updated_at: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Repository\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class NotificationPreferencesRepository extends BaseRepository<NotificationPreferencesDatabaseRow> {\n  constructor(db: DatabaseServiceInterface) {\n    super(db, TABLE_NAME);\n  }\n\n  static create(): NotificationPreferencesRepository {\n    if (!DbService.isInitialized()) {\n      throw new DatabasePackageError(\n        'DbService not initialized. Call DbService.initialize() first.',\n        DATABASE_ERROR_CODES.CONNECTION_FAILED\n      );\n    }\n    return new NotificationPreferencesRepository(DbService.getInstance().getDatabase());\n  }\n\n  /**\n   * Find preferences by user ID\n   */\n  async findByUserId(\n    userId: string\n  ): Promise<DatabaseResult<NotificationPreferencesDatabaseRow | null>> {\n    return this.findOne({ field: 'user_id', operator: 'eq', value: userId });\n  }\n\n  /**\n   * Create default preferences for a user\n   */\n  async createDefault(\n    userId: string,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<NotificationPreferencesDatabaseRow>> {\n    const now = new Date().toISOString();\n    return this.create(\n      {\n        user_id: userId,\n        email_enabled: true,\n        sms_enabled: true,\n        push_enabled: true,\n        transactional_enabled: true,\n        marketing_enabled: true,\n        social_enabled: true,\n        system_enabled: true,\n        promotional_enabled: true,\n        quiet_hours_enabled: false,\n        quiet_hours_start: null,\n        quiet_hours_end: null,\n        quiet_hours_timezone: 'UTC',\n        created_at: now,\n        updated_at: now,\n      },\n      config\n    );\n  }\n\n  /**\n   * Get or create preferences for a user\n   */\n  async getOrCreate(userId: string): Promise<NotificationPreferencesDatabaseRow> {\n    const result = await this.findByUserId(userId);\n    if (result.success && result.value) {\n      return result.value;\n    }\n    const created = await this.createDefault(userId);\n    if (!created.success || !created.value) {\n      // Return default in-memory if creation fails\n      return {\n        id: '',\n        user_id: userId,\n        email_enabled: true,\n        sms_enabled: true,\n        push_enabled: true,\n        transactional_enabled: true,\n        marketing_enabled: true,\n        social_enabled: true,\n        system_enabled: true,\n        promotional_enabled: true,\n        quiet_hours_enabled: false,\n        quiet_hours_start: null,\n        quiet_hours_end: null,\n        quiet_hours_timezone: 'UTC',\n        created_at: new Date().toISOString(),\n        updated_at: new Date().toISOString(),\n      };\n    }\n    return created.value;\n  }\n\n  /**\n   * Update preferences for a user\n   */\n  async updateByUserId(\n    userId: string,\n    data: Partial<NotificationPreferencesDatabaseRow>\n  ): Promise<DatabaseResult<NotificationPreferencesDatabaseRow>> {\n    const existing = await this.findByUserId(userId);\n    if (!existing.success || !existing.value) {\n      // Create if doesn't exist\n      return this.createDefault(userId);\n    }\n    return this.update(existing.value.id, {\n      ...data,\n      updated_at: new Date().toISOString(),\n    });\n  }\n}\n","/**\n * Notifications Models Exports\n */\n\nexport { NotificationsRepository } from './NotificationsRepository';\nexport {\n  NotificationPreferencesRepository,\n  type NotificationPreferencesDatabaseRow,\n} from './NotificationPreferencesRepository';\n","/**\n * Short URL Repository\n *\n * Data access layer for URL shortening.\n * Extends BaseRepository from @plyaz/db for consistent CRUD operations.\n *\n * @example\n * ```typescript\n * // Use with StorageBackedUrlShortener\n * const shortener = new StorageBackedUrlShortener({\n *   baseUrl: 'https://s.example.com',\n *   storage: ShortUrlRepository.createStorage(),\n * });\n *\n * // Or use repository directly for queries\n * const repo = ShortUrlRepository.create();\n * const topUrls = await repo.findTopClicked(10);\n * ```\n */\n\nimport { BaseRepository } from '@plyaz/db';\nimport { DbService } from '../../services/DbService';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport type {\n  DatabaseResult,\n  PaginatedResult,\n  QueryOptions,\n  DatabaseServiceInterface,\n  OperationConfig,\n} from '@plyaz/types/db';\nimport type { UrlShortenerStorage, UrlAnalytics } from '@plyaz/types/notifications';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst TABLE_NAME = 'short_urls';\nconst DEFAULT_LIMIT = 100;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface ShortUrlDatabaseRow extends Record<string, unknown> {\n  short_code: string;\n  original_url: string;\n  created_at: string;\n  expires_at: string | null;\n  click_count: number;\n  last_clicked_at: string | null;\n  metadata: Record<string, unknown> | null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Repository\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport class ShortUrlRepository extends BaseRepository<ShortUrlDatabaseRow> {\n  constructor(db: DatabaseServiceInterface) {\n    super(db, TABLE_NAME);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static Factory\n  // ─────────────────────────────────────────────────────────────────────────\n\n  static create(): ShortUrlRepository {\n    if (!DbService.isInitialized()) {\n      throw new DatabasePackageError(\n        'DbService not initialized. Call DbService.initialize() first.',\n        DATABASE_ERROR_CODES.CONNECTION_FAILED\n      );\n    }\n    return new ShortUrlRepository(DbService.getInstance().getDatabase());\n  }\n\n  /**\n   * Create UrlShortenerStorage-compatible interface for StorageBackedUrlShortener\n   */\n  static createStorage(): UrlShortenerStorage {\n    const repo = ShortUrlRepository.create();\n    return {\n      store: (shortCode, originalUrl, options) => repo.store(shortCode, originalUrl, options),\n      retrieve: shortCode => repo.retrieve(shortCode),\n      exists: async shortCode => {\n        const result = await repo.findById(shortCode);\n        return result.success && result.value !== null;\n      },\n      incrementClicks: shortCode => repo.incrementClicks(shortCode),\n      getAnalytics: shortCode => repo.getAnalytics(shortCode),\n      cleanup: () => repo.cleanup(),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Overridden Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  override async findMany(\n    options?: QueryOptions<ShortUrlDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<PaginatedResult<ShortUrlDatabaseRow>>> {\n    return super.findMany(\n      {\n        sort: options?.sort ?? [{ field: 'created_at', direction: 'desc' }],\n        pagination: {\n          limit: options?.pagination?.limit ?? DEFAULT_LIMIT,\n          offset: options?.pagination?.offset ?? 0,\n        },\n        filter: options?.filter,\n      },\n      config\n    );\n  }\n\n  override async create(\n    data: Partial<ShortUrlDatabaseRow>,\n    config?: OperationConfig\n  ): Promise<DatabaseResult<ShortUrlDatabaseRow>> {\n    const now = new Date().toISOString();\n    return super.create(\n      {\n        short_code: data.short_code ?? '',\n        original_url: data.original_url ?? '',\n        created_at: data.created_at ?? now,\n        expires_at: data.expires_at ?? null,\n        click_count: data.click_count ?? 0,\n        last_clicked_at: data.last_clicked_at ?? null,\n        metadata: data.metadata ?? null,\n      },\n      config\n    );\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // UrlShortenerStorage Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  async store(\n    shortCode: string,\n    originalUrl: string,\n    options?: { expiresAt?: number; metadata?: Record<string, unknown> }\n  ): Promise<void> {\n    await this.create({\n      short_code: shortCode,\n      original_url: originalUrl,\n      expires_at: options?.expiresAt ? new Date(options.expiresAt).toISOString() : null,\n      metadata: options?.metadata ?? null,\n    });\n  }\n\n  async retrieve(shortCode: string): Promise<string | null> {\n    const result = await this.findById(shortCode);\n    if (!result.success || !result.value) return null;\n    if (result.value.expires_at && new Date(result.value.expires_at) < new Date()) return null;\n    return result.value.original_url;\n  }\n\n  async incrementClicks(shortCode: string): Promise<void> {\n    const result = await this.findById(shortCode);\n    if (!result.success || !result.value) return;\n    await this.update(shortCode, {\n      click_count: result.value.click_count + 1,\n      last_clicked_at: new Date().toISOString(),\n    });\n  }\n\n  async getAnalytics(shortCode: string): Promise<UrlAnalytics | null> {\n    const result = await this.findById(shortCode);\n    if (!result.success || !result.value) return null;\n    const row = result.value;\n    return {\n      shortUrl: shortCode,\n      originalUrl: row.original_url,\n      clicks: row.click_count,\n      createdAt: new Date(row.created_at).getTime(),\n      lastClickedAt: row.last_clicked_at ? new Date(row.last_clicked_at).getTime() : undefined,\n      expiresAt: row.expires_at ? new Date(row.expires_at).getTime() : undefined,\n      metadata: row.metadata ?? undefined,\n    };\n  }\n\n  async cleanup(): Promise<void> {\n    const now = new Date().toISOString();\n    const result = await this.query()\n      .where('expires_at', 'lt', now)\n      .whereNotNull('expires_at')\n      .execute();\n\n    if (!result.success || !result.value?.data) return;\n    for (const row of result.value.data) {\n      await this.delete(row.short_code);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Domain-Specific Methods\n  // ─────────────────────────────────────────────────────────────────────────\n\n  async findByOriginalUrl(\n    originalUrl: string\n  ): Promise<DatabaseResult<ShortUrlDatabaseRow | null>> {\n    return this.findOne({ field: 'original_url', operator: 'eq', value: originalUrl });\n  }\n\n  async findTopClicked(\n    limit: number = 10\n  ): Promise<DatabaseResult<PaginatedResult<ShortUrlDatabaseRow>>> {\n    return this.query().orderByDesc('click_count').paginate(1, limit).execute();\n  }\n}\n","/**\n * Short URLs Models Exports\n *\n * Repository for URL shortening with analytics support.\n * Implements UrlShortenerStorage for use with StorageBackedUrlShortener.\n */\n\nexport { ShortUrlRepository, type ShortUrlDatabaseRow } from './ShortUrlRepository';\n","/**\n * Backend Notifications Domain Service\n *\n * Manages IN_APP notifications only. This service handles the creation, retrieval,\n * and deletion of in-app notifications (bell icon notifications, system alerts, etc.).\n *\n * NOTE: Email, SMS, and Push notifications are handled by @plyaz/notifications package,\n * NOT by this domain service. This service is strictly for IN_APP notifications that\n * appear in the user's notification center.\n *\n * Extends BaseBackendDomainService which provides:\n * - Automatic validation → mapper → repository → mapper flow\n * - Event emission throughout CRUD lifecycle\n * - Repository-based data access\n * - Configurable error throwing behavior\n * - Cache support for read operations\n *\n * Runtime: Backend (NestJS, Express, Node.js)\n *\n * @example\n * ```typescript\n * const service = await BackendNotificationsDomainService.create({\n *   throwOnValidationError: true,\n *   throwOnRepositoryError: true,\n * });\n *\n * // CRUD operations (inherited from base)\n * const entity = await service.create({\n *   userId: 'user-123',\n *   type: 'SYSTEM',\n *   title: 'Welcome!',\n *   message: 'Thanks for signing up.',\n *   category: 'transactional',\n * });\n * const fetched = await service.getById(entity.id);\n * await service.delete(entity.id, { soft: true });\n * const list = await service.getAll({ user_id: 'user-123' });\n * ```\n */\n\nimport { BaseBackendDomainService } from '../base';\nimport { BackendEventPersistenceHandler } from '../../events';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type { CoreServiceCreateOptions, CoreInjectedServices } from '@plyaz/types/core';\nimport {\n  NotificationsRepository,\n  NotificationPreferencesRepository,\n  type NotificationPreferencesDatabaseRow,\n} from '../../models/notifications';\nimport { ShortUrlRepository } from '../../models/shortUrls';\nimport type {\n  PreferenceChecker,\n  NotificationCategory,\n  NotificationChannel,\n  UrlAnalytics,\n  TokenPayload,\n  TokenStrategy,\n  TokenVerificationResult,\n} from '@plyaz/types/notifications';\nimport { verifyToken } from '@plyaz/notifications';\nimport { NotificationPackageError } from '@plyaz/errors';\nimport { NOTIFICATION_ERROR_CODES } from '@plyaz/types/errors';\nimport { NotificationsMapperClass } from './mappers/NotificationsMapper';\nimport { NotificationsValidatorClass } from './validators/NotificationsValidator';\nimport { TIME_CONSTANTS } from '@plyaz/config/time';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types (from @plyaz/types - single source of truth)\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type {\n  NotificationsEntity,\n  NotificationsResponseDTO,\n  CreateNotificationsDTO,\n  UpdateNotificationsDTO,\n  PatchNotificationsDTO,\n  QueryNotificationsDTO,\n  DeleteNotificationsDTO,\n  NotificationStoreItem,\n  NotificationsDomainServiceConfig,\n  NotificationsDatabaseRow,\n} from '@plyaz/types/core';\n\n/**\n * Mapper type for this service\n */\ntype NotificationsMapper = InstanceType<typeof NotificationsMapperClass>;\n\n/**\n * Validator type for this service\n */\ntype NotificationsValidator = InstanceType<typeof NotificationsValidatorClass>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Backend Notifications Domain Service\n *\n * All CRUD methods are inherited from BaseBackendDomainService:\n * - create(data): Promise<NotificationsEntity>\n * - getById(id): Promise<NotificationsEntity | null>\n * - getAll(query?): Promise<NotificationsEntity[]>\n * - patch(id, data): Promise<NotificationsEntity>\n * - delete(id, options?): Promise<void>\n * - exists(id): Promise<boolean>\n * - bulkCreate(dataArray): Promise<NotificationsEntity[]>\n * - bulkDelete(ids, options?): Promise<void>\n */\nexport class BackendNotificationsDomainService extends BaseBackendDomainService<\n  NotificationsDomainServiceConfig,\n  NotificationsEntity,\n  NotificationsResponseDTO,\n  CreateNotificationsDTO,\n  UpdateNotificationsDTO,\n  PatchNotificationsDTO,\n  QueryNotificationsDTO,\n  DeleteNotificationsDTO,\n  NotificationsDatabaseRow,\n  NotificationsRepository,\n  NotificationStoreItem,\n  NotificationsMapper,\n  NotificationsValidator\n> {\n  // ─────────────────────────────────────────────────────────────────────────\n  // Required Properties\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Lazy-loaded repository instance for data access */\n  private _repository?: NotificationsRepository;\n\n  /** Lazy-loaded short URL repository for URL shortening */\n  private _shortUrlRepository?: ShortUrlRepository;\n\n  /** Lazy-loaded preferences repository for opt-out checking */\n  private _preferencesRepository?: NotificationPreferencesRepository;\n\n  /** Preference cache for performance */\n  private _preferenceCache: Map<\n    string,\n    { prefs: NotificationPreferencesDatabaseRow; expiry: number }\n  > = new Map();\n\n  /** Event prefix for all events emitted by this service */\n  protected eventPrefix = 'notifications';\n\n  /** Cache prefix for namespacing cache keys */\n  protected cachePrefix = 'notifications';\n\n  /**\n   * Lazy repository getter - creates repository on first access.\n   * Defers DbService requirement until repository is actually used.\n   */\n  protected get repository(): NotificationsRepository {\n    this._repository ??= NotificationsRepository.create();\n    return this._repository;\n  }\n\n  /**\n   * Lazy short URL repository getter.\n   * Used for URL shortening in notifications (email tracking links, etc.)\n   */\n  protected get shortUrlRepository(): ShortUrlRepository {\n    this._shortUrlRepository ??= ShortUrlRepository.create();\n    return this._shortUrlRepository;\n  }\n\n  /**\n   * Lazy preferences repository getter.\n   * Used for checking user notification preferences (opt-out).\n   */\n  protected get preferencesRepository(): NotificationPreferencesRepository {\n    this._preferencesRepository ??= NotificationPreferencesRepository.create();\n    return this._preferencesRepository;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static: Service Registry Interface\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /** Unique key for this service (used by ServiceRegistry) */\n  static readonly serviceKey = SERVICE_KEYS.NOTIFICATIONS;\n\n  /**\n   * Factory method for ServiceRegistry auto-initialization.\n   * Auto-registers event handlers for DB persistence.\n   */\n  static async create(\n    config: NotificationsDomainServiceConfig = {},\n    options?: CoreServiceCreateOptions\n  ): Promise<BackendNotificationsDomainService> {\n    // Auto-register event handlers when service is created\n    this.registerEventHandlers();\n\n    const injected: CoreInjectedServices = {\n      cache: options?.cache?.instance,\n      db: options?.db?.instance,\n      api: options?.apiClient?.instance,\n      storage: options?.storage?.instance,\n      notifications: options?.notifications?.instance,\n    };\n\n    return new BackendNotificationsDomainService(config, injected);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static: Event Handlers (for event-to-DB persistence)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Register event handlers for DB persistence.\n   * Auto-called by create() method when service is initialized.\n   *\n   * Customize this method to persist data to DB when domain events fire.\n   * Uses BackendEventPersistenceHandler for a scalable, reusable pattern.\n   *\n   * @param verbose - Enable verbose logging\n   */\n  static registerEventHandlers(verbose?: boolean): void {\n    // Skip if already registered\n    if (BackendEventPersistenceHandler.isRegistered('notifications')) {\n      return;\n    }\n\n    BackendEventPersistenceHandler.register<\n      NotificationsRepository,\n      InstanceType<typeof NotificationsMapperClass>,\n      Record<string, unknown>, // TPayload - customize per event\n      Partial<NotificationsDatabaseRow>\n    >({\n      domain: 'notifications',\n      events: {\n        // ─────────────────────────────────────────────────────────────────────\n        // Campaign Events → Create IN_APP Notifications\n        // Listen to campaign domain events and create notifications for users\n        //\n        // NOTE: This creates IN_APP notifications only (bell icon notifications).\n        // For email/SMS/push, use @plyaz/notifications package separately.\n        //\n        // extractPayload returns a NotificationsEntity-like object that\n        // gets passed to mapToDbRow (which uses mapper.toDbRow).\n        // The validate function uses validator methods for consistency.\n        // ─────────────────────────────────────────────────────────────────────\n        // Example: When a campaign is created, notify the creator (IN_APP)\n        // 'campaign:created': {\n        //   extractPayload: (payload: unknown, mapper: NotificationsMapperClass) => {\n        //     if (!payload || typeof payload !== 'object') return undefined;\n        //     const p = payload as { result?: { id: string; creator_id: string; title: string } };\n        //     if (!p.result) return undefined;\n        //     // Return entity-like object - mapper.toDbRow handles conversion\n        //     return {\n        //       userId: p.result.creator_id,\n        //       type: 'SYSTEM' as const,\n        //       title: 'Campaign Created',\n        //       message: `Your campaign \"${p.result.title}\" has been created successfully.`,\n        //       referenceId: p.result.id,\n        //       referenceType: 'campaign',\n        //       category: 'transactional',\n        //     };\n        //   },\n        //   isBulk: false,\n        //   validate: (item, validator: NotificationsValidatorClass) => {\n        //     // Use validator for consistent validation\n        //     return validator.validateCreate({ ...item }).success;\n        //   },\n        // },\n        // Example: When a campaign is funded/backed, notify the creator (IN_APP)\n        // 'campaign:funded': {\n        //   extractPayload: (payload: unknown, mapper: NotificationsMapperClass) => {\n        //     if (!payload || typeof payload !== 'object') return undefined;\n        //     const p = payload as {\n        //       campaign: { id: string; creator_id: string; title: string };\n        //       backer: { id: string; name: string };\n        //       amount: number;\n        //     };\n        //     if (!p.campaign || !p.backer) return undefined;\n        //     return {\n        //       userId: p.campaign.creator_id,\n        //       type: 'CAMPAIGN_BACKED' as const,\n        //       title: 'New Backer!',\n        //       message: `${p.backer.name} backed your campaign \"${p.campaign.title}\" with $${p.amount}.`,\n        //       referenceId: p.campaign.id,\n        //       referenceType: 'campaign',\n        //       category: 'transactional',\n        //     };\n        //   },\n        //   isBulk: false,\n        //   validate: (item, validator: NotificationsValidatorClass) => {\n        //     return validator.validateCreate({ ...item }).success;\n        //   },\n        // },\n        // Example: When campaign reaches funding goal, notify creator (IN_APP)\n        // 'campaign:goal:reached': {\n        //   extractPayload: (payload: unknown) => {\n        //     if (!payload || typeof payload !== 'object') return undefined;\n        //     const p = payload as { campaign: { id: string; creator_id: string; title: string; goal: number } };\n        //     if (!p.campaign) return undefined;\n        //     return {\n        //       userId: p.campaign.creator_id,\n        //       type: 'SYSTEM' as const,\n        //       title: 'Funding Goal Reached!',\n        //       message: `Congratulations! Your campaign \"${p.campaign.title}\" has reached its funding goal of $${p.campaign.goal}.`,\n        //       referenceId: p.campaign.id,\n        //       referenceType: 'campaign',\n        //       category: 'transactional',\n        //     };\n        //   },\n        //   isBulk: false,\n        //   validate: (item, validator: NotificationsValidatorClass) => {\n        //     return validator.validateCreate({ ...item }).success;\n        //   },\n        // },\n        // ─────────────────────────────────────────────────────────────────────\n        // Add your event handlers here\n        // Uncomment and customize the examples above, or add new handlers\n        // NOTE: This is for IN_APP notifications only. Use @plyaz/notifications\n        // for email, SMS, and push notification delivery.\n        // ─────────────────────────────────────────────────────────────────────\n      },\n      loadDependencies: async () => ({\n        repository: NotificationsRepository.create(),\n        mapper: new NotificationsMapperClass(),\n      }),\n      mapToDbRow: (mapper, item) => mapper.toDbRow(item),\n      createRecord: async (repository, dbRow) => repository.create(dbRow),\n      getUniqueKey: item => String(item?.id ?? 'unknown'),\n      verbose,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Constructor\n  // ─────────────────────────────────────────────────────────────────────────\n\n  constructor(config: NotificationsDomainServiceConfig = {}, injected?: CoreInjectedServices) {\n    const serviceConfig: NotificationsDomainServiceConfig = {\n      enabled: true,\n      throwOnValidationError: true,\n      throwOnRepositoryError: true,\n      emitEvents: true,\n      cache: {\n        enabled: true,\n        defaultTtl: 300,\n      },\n      ...config,\n    };\n\n    super({\n      serviceName: 'BackendNotificationsDomainService',\n      supportedRuntimes: ['backend'] as const,\n      serviceConfig,\n      mapperClass: NotificationsMapperClass,\n      validatorClass: NotificationsValidatorClass,\n      injected,\n    });\n    // Repository is created lazily via getter when first accessed\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Abstract Implementations (Required by BaseDomainService)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if service is available\n   */\n  isAvailable(): boolean {\n    return this.isServiceEnabled;\n  }\n\n  /**\n   * Dispose/cleanup the service\n   */\n  dispose(): void {\n    this.logInfo('Service disposed');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Custom Domain Methods (IN_APP notification operations)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get all notifications for a user\n   */\n  async getByUserId(userId: string): Promise<NotificationsEntity[]> {\n    return this.getAll({ user_id: userId });\n  }\n\n  /**\n   * Soft delete with reason\n   */\n  async softDeleteWithReason(id: string, reason: string): Promise<void> {\n    await this.delete(id, { soft: true, reason });\n  }\n\n  // NOTE: Read/unread state management can be added later via REST APIs if needed.\n  // For now, keep it simple with just list, create, delete operations.\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Short URL Methods (for email tracking links, etc.)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Resolve a short URL and increment click count.\n   * Used by redirect endpoint to look up original URL.\n   *\n   * @param shortCode - The short code to resolve\n   * @returns Original URL or null if not found/expired\n   */\n  async resolveShortUrl(shortCode: string): Promise<string | null> {\n    const originalUrl = await this.shortUrlRepository.retrieve(shortCode);\n    if (originalUrl) {\n      // Increment click count in background (don't await)\n      this.shortUrlRepository.incrementClicks(shortCode).catch(() => {\n        // Silently ignore click tracking errors\n      });\n    }\n    return originalUrl;\n  }\n\n  /**\n   * Get analytics for a short URL.\n   *\n   * @param shortCode - The short code to get analytics for\n   * @returns Analytics data or null if not found\n   */\n  async getShortUrlAnalytics(shortCode: string): Promise<UrlAnalytics | null> {\n    return this.shortUrlRepository.getAnalytics(shortCode);\n  }\n\n  /**\n   * Clean up expired short URLs.\n   * Should be called periodically (e.g., via cron job).\n   */\n  async cleanupExpiredShortUrls(): Promise<void> {\n    await this.shortUrlRepository.cleanup();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Preference Checking Methods (for @plyaz/notifications PreferenceChecker)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if a notification should be sent to a recipient.\n   * Implements PreferenceChecker.shouldSend() interface.\n   */\n  async shouldSendNotification(\n    recipientId: string,\n    category: NotificationCategory,\n    channel: NotificationChannel\n  ): Promise<boolean> {\n    // Transactional notifications always allowed (compliance)\n    if (category === 'transactional') return true;\n\n    const prefs = await this.getUserPreferences(recipientId);\n    return this.validator.checkPreferencesAllowSend(prefs, category, channel);\n  }\n\n  /**\n   * Bulk preference check for batch operations.\n   * Implements PreferenceChecker.shouldSendBulk() interface.\n   */\n  async shouldSendNotificationBulk(\n    recipients: Array<{\n      recipientId: string;\n      category: NotificationCategory;\n      channel: NotificationChannel;\n    }>\n  ): Promise<boolean[]> {\n    const uniqueIds = [...new Set(recipients.map(r => r.recipientId))];\n    const prefsMap = new Map<string, NotificationPreferencesDatabaseRow>();\n\n    await Promise.all(\n      uniqueIds.map(async id => {\n        const prefs = await this.getUserPreferences(id);\n        prefsMap.set(id, prefs);\n      })\n    );\n\n    return recipients.map(({ recipientId, category, channel }) => {\n      if (category === 'transactional') return true;\n      const prefs = prefsMap.get(recipientId);\n      if (!prefs) return true;\n      return this.validator.checkPreferencesAllowSend(prefs, category, channel);\n    });\n  }\n\n  /**\n   * Get user notification preferences.\n   */\n  async getUserPreferences(userId: string): Promise<NotificationPreferencesDatabaseRow> {\n    // Check cache\n    const cached = this._preferenceCache.get(userId);\n    if (cached && cached.expiry > Date.now()) {\n      return cached.prefs;\n    }\n\n    const prefs = await this.preferencesRepository.getOrCreate(userId);\n\n    // Cache preferences for 1 minute\n    this._preferenceCache.set(userId, {\n      prefs,\n      expiry: Date.now() + TIME_CONSTANTS.MINUTE,\n    });\n\n    return prefs;\n  }\n\n  /**\n   * Update user notification preferences.\n   */\n  async updateUserPreferences(\n    userId: string,\n    data: Partial<NotificationPreferencesDatabaseRow>\n  ): Promise<NotificationPreferencesDatabaseRow | null> {\n    const result = await this.preferencesRepository.updateByUserId(userId, data);\n    // Invalidate cache\n    this._preferenceCache.delete(userId);\n    return result.success ? (result.value ?? null) : null;\n  }\n\n  /**\n   * Handle unsubscribe request from email link.\n   * Verifies the token and updates user preferences to disable the category.\n   *\n   * @param token - Encrypted token from unsubscribe URL\n   * @param secret - Encryption key for token verification\n   * @param strategy - Token strategy (default: 'aes-256-gcm')\n   * @returns Result with payload on success\n   * @throws NotificationPackageError on token verification or update failure\n   */\n  async unsubscribe(\n    token: string,\n    secret: string,\n    strategy: TokenStrategy = 'aes-256-gcm'\n  ): Promise<{ success: boolean; message: string; payload: TokenPayload }> {\n    // Verify token\n    const result: TokenVerificationResult = verifyToken(token, secret, strategy);\n\n    if (!result.valid || !result.payload) {\n      throw new NotificationPackageError(\n        NOTIFICATION_ERROR_CODES.VALIDATION_FAILED,\n        NOTIFICATION_ERROR_CODES.VALIDATION_FAILED,\n        { context: { tokenError: result.error } }\n      );\n    }\n\n    const { recipientId, category, type } = result.payload;\n\n    // Determine what to disable based on token type\n    const isFullUnsubscribe = type === 'unsubscribe_url' || type === 'unsubscribe_webhook';\n    const preferenceField = NotificationsMapperClass.mapCategoryToPreferenceField(category);\n\n    // Validate category - throws if invalid and not a full unsubscribe\n    this.validator.validateUnsubscribeCategoryOrThrow(\n      category,\n      isFullUnsubscribe || !!preferenceField\n    );\n\n    // Update preferences\n    const updateData: Partial<NotificationPreferencesDatabaseRow> = {};\n\n    if (isFullUnsubscribe && preferenceField) {\n      // Disable just this category\n      updateData[preferenceField] = false;\n    } else if (isFullUnsubscribe) {\n      // If no specific category, disable marketing by default\n      updateData.marketing_enabled = false;\n    }\n\n    const updated = await this.updateUserPreferences(recipientId, updateData);\n\n    if (!updated) {\n      throw new NotificationPackageError(\n        NOTIFICATION_ERROR_CODES.UNKNOWN_ERROR,\n        NOTIFICATION_ERROR_CODES.UNKNOWN_ERROR,\n        { context: { recipientId, category } }\n      );\n    }\n\n    // Emit event for tracking\n    CoreEventManager.emit('notification:unsubscribed', {\n      userId: recipientId,\n      category,\n      type,\n      timestamp: new Date().toISOString(),\n    });\n\n    return {\n      success: true,\n      message: `Successfully unsubscribed from ${category || 'marketing'} notifications.`,\n      payload: result.payload,\n    };\n  }\n\n  /**\n   * Create a PreferenceChecker object for use with @plyaz/notifications.\n   * Pass this to NotificationService config.preferenceChecker.\n   */\n  createPreferenceChecker(): PreferenceChecker {\n    return {\n      shouldSend: (recipientId, category, channel) =>\n        this.shouldSendNotification(recipientId, category, channel),\n      shouldSendBulk: recipients => this.shouldSendNotificationBulk(recipients),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Lifecycle Hooks\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * After creating a notification, emit streaming event for real-time delivery.\n   * Broadcasts to user:notifications:{userId} channel.\n   */\n  protected override async afterCreate(entity: NotificationsEntity): Promise<void> {\n    // Use mapper to convert entity to stream data format\n    const streamData = this.mapper.toStreamData(entity);\n    CoreEventManager.emit('notification:created', streamData);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // NOTE: CRUD Methods Are Inherited - No Need to Implement!\n  // ─────────────────────────────────────────────────────────────────────────\n  // - create(data): Promise<NotificationsEntity>\n  // - getById(id): Promise<NotificationsEntity | null>\n  // - getAll(query?): Promise<NotificationsEntity[]>\n  // - patch(id, data): Promise<NotificationsEntity>\n  // - delete(id, options?): Promise<void>\n  // - exists(id): Promise<boolean>\n  // - bulkCreate(dataArray): Promise<NotificationsEntity[]>\n  // - bulkDelete(ids, options?): Promise<void>\n  // ─────────────────────────────────────────────────────────────────────────\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Singleton Instance & Getters\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _instance: BackendNotificationsDomainService | null = null;\n\n/**\n * Get or create singleton instance\n */\nexport async function getBackendNotificationsDomainService(\n  config?: NotificationsDomainServiceConfig,\n  options?: CoreServiceCreateOptions\n): Promise<BackendNotificationsDomainService> {\n  _instance ??= await BackendNotificationsDomainService.create(config, options);\n  return _instance;\n}\n\n/**\n * Reset singleton instance (for testing)\n */\nexport function resetNotificationsDomainService(): void {\n  if (_instance) {\n    _instance.dispose();\n    _instance = null;\n  }\n}\n","/**\n * Backend Entry Point\n *\n * Exports all core functionality including database access and backend services.\n * Use this entry point for Node.js, NestJS, Express, and other server-side environments.\n *\n * @example\n * ```typescript\n * import { Core, DbService, FeatureFlagModule } from '@plyaz/core/backend';\n *\n * await Core.initialize({\n *   appContext: 'backoffice',\n *   db: { adapter: 'drizzle' },\n *   api: { baseURL: 'https://api.example.com' },\n * });\n *\n * const db = Core.db;\n * ```\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Backend Dependencies Registration\n// ─────────────────────────────────────────────────────────────────────────────\n// Register backend-only services so CoreInitializer can use them without\n// static imports that would bundle backend dependencies in frontend builds.\n\nimport { setCoreDependencies } from './config/dependencies';\nimport { setGetCoreDomainServices, setGetCoreStreamEndpoints } from './init/CoreInitializer';\nimport { getCoreDomainServices } from './init/getCoreDomainServices';\nimport { getCoreStreamEndpoints } from './init/getCoreStreamEndpoints';\nimport { DbService } from './services/DbService';\nimport { CacheService } from './services/CacheService';\nimport { StorageService } from './services/StorageService';\nimport { NotificationService } from './services/NotificationService';\nimport * as ServerErrorMiddleware from '@plyaz/errors/middleware/backend';\n\n// Register all backend dependencies at import time\nsetCoreDependencies({\n  DbService,\n  CacheService,\n  StorageService,\n  NotificationService,\n  ServerErrorMiddleware,\n});\n\n// Inject the domain services loader for Core.initialize()\nsetGetCoreDomainServices(getCoreDomainServices);\n\n// Inject the stream endpoints loader for Core.initialize()\nsetGetCoreStreamEndpoints(getCoreStreamEndpoints);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Exports\n// ─────────────────────────────────────────────────────────────────────────────\n\n// NOTE: Do NOT re-export from './index' - it includes React-based frontend code\n// Only export backend-safe modules\n\n// Global type declarations\nimport '@plyaz/types/globals';\n\n// Core initializer and services (no React)\nexport * from './init';\n\n// Domain base classes (backend-safe only)\nexport { BaseDomainService } from './domain/base/BaseDomainService';\nexport { BaseBackendDomainService } from './domain/base/BaseBackendDomainService';\nexport { BaseMapper } from './domain/base/BaseMapper';\nexport { BaseValidator } from './domain/base/BaseValidator';\nexport * from './utils/mapperUtils';\n\n// Backend domain services\nexport * from './domain/example/BackendExampleDomainService';\nexport * from './domain/files/BackendFilesDomainService';\nexport * from './domain/notifications/BackendNotificationsDomainService';\n\n// Models/Repositories (backend-safe)\nexport * from './models';\n\n// Other backend-safe modules\nexport * from './engine';\nexport * from './base';\nexport * from './utils';\nexport * from './services';\nexport * from './version';\nexport * from './config';\nexport * from './events';\n\n// Explicit backend-specific exports for clarity\nexport { DbService, DEFAULT_ENCRYPTION_FIELDS, type DbServiceInstance } from './services/DbService';\n\n// Cache service (backend-only due to ioredis)\nexport { CacheService, getCacheService } from './services/CacheService';\n\n// Server-only services (have puppeteer/playwright dependencies)\nexport { StorageService, type StorageServiceInstance } from './services/StorageService';\nexport {\n  NotificationService,\n  type NotificationServiceInstance,\n} from './services/NotificationService';\n\n// Backend modules (NestJS)\nexport * from './backend';\n\n// NestJS utilities\nexport { configureNestApp } from './init/nestjs';\n\n// Adapters\nexport * from './adapters';\n","/**\n * Backend-only: Get default domain services based on runtime.\n *\n * IMPORTANT: This file must only be imported from entry-backend.ts.\n * Do NOT import from frontend entries or CoreInitializer directly.\n */\n\nimport type { CoreServiceEntry } from '@plyaz/types/core';\n\n/**\n * Get default domain services based on runtime.\n * Dynamically imports services to avoid bundling backend code in frontend.\n *\n * @internal Only used by backend entry point\n */\nexport async function getCoreDomainServices(isFrontend: boolean): Promise<CoreServiceEntry[]> {\n  const services: CoreServiceEntry[] = [];\n\n  if (isFrontend) {\n    // Frontend: Only load frontend-safe services\n    const [\n      { FrontendExampleDomainService },\n      { FrontendFilesDomainService },\n      { FrontendNotificationsDomainService },\n    ] = await Promise.all([\n      import('../domain/example/FrontendExampleDomainService'),\n      import('../domain/files/FrontendFilesDomainService'),\n\n      import('../domain/notifications/FrontendNotificationsDomainService'),\n    ]);\n    services.push(\n      { service: FrontendExampleDomainService, config: { enabled: true } },\n      { service: FrontendFilesDomainService, config: { enabled: true } },\n      { service: FrontendNotificationsDomainService, config: { enabled: true } }\n    );\n  } else {\n    // Backend: Load both backend and frontend services\n    const [\n      { BackendExampleDomainService },\n      { FrontendExampleDomainService },\n      { BackendFilesDomainService },\n      { FrontendFilesDomainService },\n      { BackendNotificationsDomainService },\n      { FrontendNotificationsDomainService },\n    ] = await Promise.all([\n      import('../domain/example/BackendExampleDomainService'),\n      import('../domain/example/FrontendExampleDomainService'),\n      import('../domain/files/BackendFilesDomainService'),\n      import('../domain/files/FrontendFilesDomainService'),\n      import('../domain/notifications/BackendNotificationsDomainService'),\n      import('../domain/notifications/FrontendNotificationsDomainService'),\n    ]);\n    services.push(\n      { service: BackendExampleDomainService, config: { enabled: true } },\n      { service: FrontendExampleDomainService, config: { enabled: true } },\n      { service: BackendFilesDomainService, config: { enabled: true } },\n      { service: FrontendFilesDomainService, config: { enabled: true } },\n      { service: BackendNotificationsDomainService, config: { enabled: true } },\n      { service: FrontendNotificationsDomainService, config: { enabled: true } }\n    );\n  }\n\n  return services;\n}\n","/**\n * Backend-only: Get default stream endpoints.\n *\n * IMPORTANT: This file must only be imported from entry-backend.ts.\n * Do NOT import from frontend entries or CoreInitializer directly.\n *\n * Stream endpoints are backend-only (SSE/WebSocket servers).\n */\n\nimport type { StreamEndpointEntry } from '@plyaz/types/core';\n\n/**\n * Get default stream endpoints for the streaming system.\n * Dynamically imports endpoints to avoid bundling in frontend.\n *\n * @internal Only used by backend entry point\n */\nexport async function getCoreStreamEndpoints(): Promise<StreamEndpointEntry[]> {\n  const [{ FilesStreamEndpoint }, { NotificationsStreamEndpoint }, { SystemStreamEndpoint }] =\n    await Promise.all([\n      import('../domain/files/streaming/FilesStreamEndpoint'),\n      import('../domain/notifications/streaming/NotificationsStreamEndpoint'),\n      import('../events/streaming/endpoints/system/SystemStreamEndpoint'),\n    ]);\n\n  return [\n    {\n      endpoint: FilesStreamEndpoint,\n      config: {\n        enabled: true,\n        name: 'files',\n        channels: ['uploads', 'downloads', 'generations'],\n      },\n    },\n    {\n      endpoint: NotificationsStreamEndpoint,\n      config: {\n        enabled: true,\n        name: 'notifications',\n        channels: ['notifications', 'user:notifications:'],\n      },\n    },\n    {\n      endpoint: SystemStreamEndpoint,\n      config: {\n        enabled: true,\n        name: 'system',\n        channels: ['system'],\n      },\n    },\n  ];\n}\n","/**\n * CacheService - Singleton Cache Manager\n *\n * @description Manages cache instance for the entire application using a singleton pattern.\n * This service wraps the CacheManager from @plyaz/core/base/cache and provides a centralized\n * way to initialize and access caching across all backend services.\n *\n * **Architecture:**\n * - Supports multiple strategies: Memory (in-process), Redis (distributed)\n * - Configurable TTL, key prefixing, and strategy-specific options\n * - Singleton pattern ensures single cache instance across application\n *\n * **Strategy Configuration:**\n * - **Memory**: In-process LRU cache, no external dependencies\n * - **Redis**: Distributed cache using ioredis, requires Redis server\n *\n * **Required Environment Variables (Redis):**\n * - REDIS_URL: Redis connection string (e.g., redis://localhost:6379)\n * - Or REDIS_HOST, REDIS_PORT, REDIS_PASSWORD for individual config\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n *   envPath: '.env',\n *   cache: {\n *     strategy: 'memory',\n *     isEnabled: true,\n *     ttl: 300, // 5 minutes default\n *   },\n * });\n *\n * // Access via Core.cache\n * const cache = Core.cache.getCacheManager();\n * await cache.set('user:123', userData, 600); // 10 minutes TTL\n * const cached = await cache.get('user:123');\n * ```\n *\n * @example With Redis Strategy\n * ```typescript\n * await Core.initialize({\n *   envPath: '.env',\n *   cache: {\n *     strategy: 'redis',\n *     isEnabled: true,\n *     ttl: 300,\n *     prefix: 'myapp',\n *     redis: {\n *       url: process.env.REDIS_URL,\n *       // Or individual options:\n *       // host: process.env.REDIS_HOST,\n *       // port: parseInt(process.env.REDIS_PORT),\n *       // password: process.env.REDIS_PASSWORD,\n *     },\n *   },\n * });\n * ```\n *\n * @example Direct Usage\n * ```typescript\n * import { CacheService } from '@plyaz/core/services';\n *\n * await CacheService.initialize({\n *   strategy: 'memory',\n *   isEnabled: true,\n *   ttl: 300,\n * });\n *\n * const cache = CacheService.getInstance().getCacheManager();\n * await cache.set('key', value);\n * ```\n *\n * @example Skip Cache (Disable Caching)\n * ```typescript\n * await Core.initialize({\n *   skipCache: true, // Cache will not be initialized\n * });\n * ```\n *\n * @fileoverview Cache service singleton\n * @module services/CacheService\n */\n\nimport { CacheManager } from '../base/cache';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types/errors';\nimport type { CoreCacheConfig, CoreCacheServiceInstance } from '@plyaz/types/core';\nimport { CORE_EVENTS, type CoreCacheErrorPayload } from '@plyaz/types/core';\nimport type { CacheConfig } from '@plyaz/types';\nimport { CACHE_STRATEGIES } from '@plyaz/types/features';\nimport { CoreLogger } from '@plyaz/logger';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { CoreEventManager } from '../events/CoreEventManager';\n\n/**\n * Global Singleton Pattern using globalThis\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple singleton\n * instances. Using globalThis + Symbol.for() ensures ONE instance per process, preventing\n * issues like multiple cache instances with inconsistent data across API routes.\n */\nconst CACHE_SERVICE_KEY = Symbol.for('plyaz.CacheService');\n\nfunction getCacheServiceInstance(): CacheService | null {\n  const globalAny = globalThis as unknown as { [key: symbol]: CacheService | null };\n  return globalAny[CACHE_SERVICE_KEY] ?? null;\n}\n\nfunction setCacheServiceInstance(instance: CacheService | null): void {\n  const globalAny = globalThis as unknown as { [key: symbol]: CacheService | null };\n  globalAny[CACHE_SERVICE_KEY] = instance;\n}\n\n/**\n * Singleton service for managing application-wide cache\n *\n * Provides centralized access to cache functionality across all backend services.\n * Automatically integrates with BaseBackendDomainService when initialized.\n */\nexport class CacheService implements CoreCacheServiceInstance {\n  /** Cache manager instance */\n  private cacheManager: CacheManager | null = null;\n\n  /** Configuration used to initialize cache */\n  private config: CoreCacheConfig | null = null;\n\n  /** Logger instance */\n  private logger = new CoreLogger({ service: 'CacheService' });\n\n  /** Private constructor to enforce singleton */\n  private constructor() {}\n\n  // ─────────────────────────────────────────────────────────────────\n  // Error Handling\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Emits a cache error event via CoreEventManager.\n   * Called when cache operations fail to integrate with global error handling.\n   */\n  private emitCacheError(\n    error: unknown,\n    operation: string,\n    options?: { key?: string; recoverable?: boolean }\n  ): void {\n    const payload: CoreCacheErrorPayload = {\n      error,\n      operation,\n      key: options?.key,\n      recoverable: options?.recoverable ?? true,\n    };\n    CoreEventManager.emit(CORE_EVENTS.CACHE.ERROR, payload);\n  }\n\n  /**\n   * Initialize the cache service with configuration\n   *\n   * @param config - Cache configuration\n   * @throws {CorePackageError} If already initialized or config is invalid\n   *\n   * @example\n   * ```typescript\n   * await CacheService.initialize({\n   *   strategy: 'redis',\n   *   isEnabled: true,\n   *   ttl: 300,\n   *   prefix: 'app',\n   *   redis: { url: process.env.REDIS_URL },\n   * });\n   * ```\n   */\n  static async initialize(config: CoreCacheConfig): Promise<void> {\n    const existingInstance = getCacheServiceInstance();\n    if (existingInstance?.cacheManager) {\n      throw new CorePackageError(\n        'CacheService is already initialized. Call reset() first if you need to reinitialize.',\n        ERROR_CODES.VALIDATION_ERROR\n      );\n    }\n\n    const service = existingInstance ?? new CacheService();\n    setCacheServiceInstance(service);\n\n    try {\n      service.logger.info('[CacheService] Initializing cache...', {\n        strategy: config.strategy,\n        isEnabled: config.isEnabled,\n        ttl: config.ttl,\n      });\n\n      // Validate configuration\n      service.validateConfig(config);\n\n      // Create cache manager with validated config (ensure required fields)\n      const cacheConfig: CacheConfig = {\n        ...config,\n        ttl: config.ttl ?? TIME_CONSTANTS.DEFAULT_CACHE_TTL,\n      };\n      service.cacheManager = new CacheManager(cacheConfig);\n      service.config = config;\n\n      service.logger.info('[CacheService] Cache initialized successfully', {\n        strategy: config.strategy,\n      });\n    } catch (error) {\n      service.logger.error('[CacheService] Failed to initialize cache', { error });\n      // Emit cache error event for global error handling\n      service.emitCacheError(error, 'initialize', { recoverable: false });\n      throw new CorePackageError(\n        `Failed to initialize cache: ${error instanceof Error ? error.message : String(error)}`,\n        ERROR_CODES.VALIDATION_ERROR,\n        { cause: error instanceof Error ? error : undefined }\n      );\n    }\n  }\n\n  /**\n   * Get the singleton instance\n   *\n   * @throws {CorePackageError} If not initialized\n   * @returns CacheService singleton instance\n   *\n   * @example\n   * ```typescript\n   * const cacheService = CacheService.getInstance();\n   * const cache = cacheService.getCacheManager();\n   * ```\n   */\n  static getInstance(): CacheService {\n    const instance = getCacheServiceInstance();\n    if (!instance) {\n      throw new CorePackageError(\n        'CacheService not initialized. Call CacheService.initialize() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return instance;\n  }\n\n  /**\n   * Get the cache manager instance\n   *\n   * @throws {CorePackageError} If cache not initialized\n   * @returns CacheManager instance\n   *\n   * @example\n   * ```typescript\n   * const cache = CacheService.getInstance().getCacheManager();\n   * await cache.set('user:123', userData);\n   * const user = await cache.get('user:123');\n   * ```\n   */\n  getCacheManager(): CacheManager {\n    if (!this.cacheManager) {\n      throw new CorePackageError(\n        'Cache manager not initialized. Call CacheService.initialize() first.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    return this.cacheManager;\n  }\n\n  /**\n   * Get current cache configuration\n   *\n   * @returns Current cache configuration or null if not initialized\n   */\n  getConfig(): CoreCacheConfig | null {\n    return this.config;\n  }\n\n  /**\n   * Check if cache is initialized and enabled\n   *\n   * @returns True if cache is ready to use\n   */\n  isInitialized(): boolean {\n    return this.cacheManager !== null && (this.config?.isEnabled ?? false);\n  }\n\n  /**\n   * Reset the cache service (useful for testing)\n   *\n   * @internal\n   */\n  static reset(): void {\n    const instance = getCacheServiceInstance();\n    if (instance?.cacheManager) {\n      instance.logger.info('[CacheService] Resetting cache service');\n      // Clear cache manager\n      instance.cacheManager.clear().catch(error => {\n        instance?.logger.error('[CacheService] Error clearing cache during reset', { error });\n      });\n    }\n    setCacheServiceInstance(null);\n  }\n\n  /**\n   * Validate cache configuration\n   *\n   * @param config - Configuration to validate\n   * @throws {CorePackageError} If configuration is invalid\n   * @private\n   */\n  // eslint-disable-next-line complexity\n  private validateConfig(config: CoreCacheConfig): void {\n    // Validate strategy\n    if (!CACHE_STRATEGIES.includes(config.strategy as (typeof CACHE_STRATEGIES)[number])) {\n      throw new CorePackageError(\n        `Invalid cache strategy: ${config.strategy}. Must be one of: ${CACHE_STRATEGIES.join(', ')}`,\n        ERROR_CODES.VALIDATION_ERROR\n      );\n    }\n\n    // Validate TTL\n    if (config.ttl !== undefined && (config.ttl < 0 || !Number.isFinite(config.ttl))) {\n      throw new CorePackageError(\n        `Invalid TTL value: ${config.ttl}. Must be a positive number.`,\n        ERROR_CODES.VALIDATION_ERROR\n      );\n    }\n\n    // Validate Redis config when strategy is redis\n    if (config.strategy === 'redis') {\n      if (!config.redis?.url && !config.redis?.host) {\n        throw new CorePackageError(\n          'Redis strategy requires either redis.url or redis.host configuration',\n          ERROR_CODES.VALIDATION_ERROR\n        );\n      }\n    }\n\n    this.logger.debug('[CacheService] Configuration validated successfully');\n  }\n}\n\n// Export singleton instance getter for convenience\nexport const getCacheService = (): CacheService => CacheService.getInstance();\n","/**\n * StorageService - Singleton File Storage Manager\n *\n * @description Manages file storage operations for the entire application using a singleton pattern.\n * This service wraps @plyaz/storage and provides a centralized way to initialize and access\n * file storage across all domains (media uploads, compliance documents, user avatars, etc.).\n *\n * **Architecture:**\n * - Uses `StorageService` from @plyaz/storage which supports multi-provider setup\n * - Supports Cloudflare R2 (compliance documents) and Supabase Storage (assets/media)\n * - Automatic failover between providers based on health status\n * - Event-driven architecture with 40+ event types\n * - **Proxy-based method forwarding**: All methods from the underlying service are\n *   automatically available with error handling - no manual wrapping needed\n *\n * **Provider Configuration:**\n * - **Cloudflare R2**: For compliance documents (tax, invoices, KYC) with zero egress fees\n * - **Supabase Storage**: For assets like images, user avatars, media files\n *\n * **Required Environment Variables (Cloudflare R2):**\n * - CLOUDFLARE_ACCOUNT_ID: Your Cloudflare account ID\n * - R2_ACCESS_KEY_ID: R2 access key\n * - R2_SECRET_ACCESS_KEY: R2 secret key\n * - R2_BUCKET_NAME: Default bucket name\n *\n * **Required Environment Variables (Supabase Storage):**\n * - SUPABASE_URL: Your Supabase project URL\n * - SUPABASE_SERVICE_ROLE_KEY: Service role key for storage operations\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n *   storage: {\n *     adapters: [r2Adapter, supabaseAdapter],\n *     plugins: [virusScanPlugin, sharpImagePlugin],\n *   },\n * });\n *\n * // Access via Core.storage - all methods automatically available\n * const result = await Core.storage.uploadFile({\n *   file: buffer,\n *   filename: 'document.pdf',\n *   category: FILE_CATEGORY.COMPLIANCE_DOCUMENT,\n * });\n * ```\n *\n * @module services\n */\n\nimport type { BaseStorageAdapter } from '@plyaz/storage';\nimport { StorageService as StorageServiceImpl } from '@plyaz/storage';\nimport { StoragePackageError } from '@plyaz/errors';\nimport type { CoreStorageConfig, CoreStorageServiceInstance } from '@plyaz/types/core';\nimport type {\n  StorageServiceConfig,\n  StorageEventPayload,\n  StorageEventHandlers,\n  UploadProgressEvent,\n} from '@plyaz/types/storage';\nimport { CORE_EVENTS, type CoreStorageErrorPayload } from '@plyaz/types/core';\nimport type { FilesUploadStreamProgress } from '@plyaz/types/core';\nimport { STORAGE_ERROR_CODES } from '@plyaz/types/errors';\nimport { CoreEventManager } from '../events/CoreEventManager';\nimport { PackageLogger } from '@plyaz/logger';\nimport { getBackendFilesDomainService } from '../domain/files/BackendFilesDomainService';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'StorageService' });\n\n// Re-export types for convenience\nexport type { CoreStorageConfig } from '@plyaz/types/core';\n\n/** Internal type for properly typed storage config */\ntype TypedStorageConfig = StorageServiceConfig<BaseStorageAdapter>;\n\n/** Error context options for storage operations */\ninterface StorageErrorOptions {\n  fileId?: string;\n  filename?: string;\n  recoverable?: boolean;\n}\n\n/**\n * Global Singleton Pattern using globalThis\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple singleton\n * instances. Using globalThis + Symbol.for() ensures ONE instance per process, preventing\n * issues like multiple storage service instances with inconsistent adapter configurations.\n */\nconst STORAGE_SERVICE_KEY = Symbol.for('plyaz.StorageService');\n\nfunction getStorageServiceInstance(): StorageService | null {\n  const globalAny = globalThis as unknown as { [key: symbol]: StorageService | null };\n  return globalAny[STORAGE_SERVICE_KEY] ?? null;\n}\n\nfunction setStorageServiceInstance(instance: StorageService | null): void {\n  const globalAny = globalThis as unknown as { [key: symbol]: StorageService | null };\n  globalAny[STORAGE_SERVICE_KEY] = instance;\n}\n\n/**\n * StorageService - Singleton File Storage Manager with Proxy-based method forwarding\n *\n * Provides centralized file storage management for all domains.\n * Uses @plyaz/storage under the hood with configurable providers and plugins.\n *\n * All methods from the underlying StorageServiceImpl are automatically available\n * via Proxy - when new methods are added to @plyaz/storage, they're instantly\n * accessible here with automatic error handling.\n */\nexport class StorageService implements CoreStorageServiceInstance {\n  private storageService: StorageServiceImpl | null = null;\n  private config: CoreStorageConfig | null = null;\n  private initialized = false;\n\n  private constructor() {}\n\n  // ─────────────────────────────────────────────────────────────────\n  // Error Handling\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Emits a storage error event via CoreEventManager.\n   * Called when storage operations fail to integrate with global error handling.\n   */\n  private emitStorageError(error: unknown, operation: string, options?: StorageErrorOptions): void {\n    const payload: CoreStorageErrorPayload = {\n      error,\n      operation,\n      fileId: options?.fileId,\n      filename: options?.filename,\n      recoverable: options?.recoverable ?? false,\n    };\n    CoreEventManager.emit(CORE_EVENTS.STORAGE.ERROR, payload);\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Singleton Management\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Gets the singleton instance of StorageService\n   */\n  static getInstance(): StorageService {\n    let instance = getStorageServiceInstance();\n    if (!instance) {\n      instance = new StorageService();\n      setStorageServiceInstance(instance);\n    }\n    return instance;\n  }\n\n  /**\n   * Checks if the storage service has been initialized\n   */\n  static isInitialized(): boolean {\n    return getStorageServiceInstance()?.initialized ?? false;\n  }\n\n  /**\n   * Resets the storage service by clearing the singleton instance\n   */\n  static async reset(): Promise<void> {\n    const instance = getStorageServiceInstance();\n    if (instance) {\n      instance.storageService = null;\n      instance.config = null;\n      instance.initialized = false;\n      setStorageServiceInstance(null);\n    }\n  }\n\n  /**\n   * Creates merged event handlers that persist uploads to the media table\n   * and emit progress events for real-time streaming.\n   * Merges Core's internal handlers with user-provided handlers.\n   *\n   * @param userHandlers - User-provided event handlers from config\n   * @returns Merged handlers with DB persistence + streaming + user handlers\n   */\n  private static createMergedEventHandlers(\n    userHandlers?: StorageEventHandlers\n  ): StorageEventHandlers {\n    return {\n      ...userHandlers,\n\n      // Emit upload progress for real-time streaming, then call user handler\n      // eslint-disable-next-line complexity\n      onUploadProgress: async (payload: StorageEventPayload) => {\n        // Emit to CoreEventManager for StreamBroadcaster to pick up\n        // StreamBroadcaster listens to 'upload:progress' and broadcasts to SSE/WebSocket clients\n        // Progress data is in payload.data as UploadProgressEvent\n        const progressEvent = payload.data as UploadProgressEvent | undefined;\n        if (progressEvent) {\n          const progressData: FilesUploadStreamProgress = {\n            fileId: progressEvent.fileId ?? payload.metadata?.fileId ?? 'unknown',\n            filename: progressEvent.filename ?? payload.metadata?.filename ?? 'unknown',\n            percentage: progressEvent.percentage ?? 0,\n            status: 'uploading',\n            loaded: progressEvent.loaded ?? 0,\n            total: progressEvent.total ?? 0,\n            speed: progressEvent.speed,\n            estimatedTimeRemaining: progressEvent.estimatedTimeRemaining,\n          };\n\n          CoreEventManager.emit('upload:progress', progressData);\n        }\n\n        // Call user's handler if provided\n        if (userHandlers?.onUploadProgress) {\n          await userHandlers.onUploadProgress(payload);\n        }\n      },\n\n      // Persist uploaded files to media table, then call user handler\n      onFileUploaded: async (payload: StorageEventPayload) => {\n        // Persist to media table via BackendFilesDomainService\n        // Wrapped in try-catch to not break upload flow if DB is unavailable\n        if (payload.metadata) {\n          try {\n            const filesService = await getBackendFilesDomainService();\n            await filesService.persistUploadedFile(payload.metadata);\n          } catch (error) {\n            // Log error but don't break the upload flow\n            // DB persistence is optional - upload already succeeded to storage\n            logger.warn('[StorageService] Failed to persist file to DB (upload still succeeded)', {\n              fileId: payload.metadata.fileId,\n              filename: payload.metadata.filename,\n              error: error instanceof Error ? error.message : String(error),\n            });\n          }\n        }\n\n        // Call user's handler if provided\n        if (userHandlers?.onFileUploaded) {\n          await userHandlers.onFileUploaded(payload);\n        }\n      },\n\n      // Emit upload failure for real-time streaming error handling\n      // eslint-disable-next-line complexity\n      onFileUploadFailed: async (payload: StorageEventPayload) => {\n        // Emit error event for streaming clients\n        if (payload.metadata) {\n          // Error info might be in payload.data\n          const errorInfo = payload.data as { message?: string } | undefined;\n          const errorData: FilesUploadStreamProgress = {\n            fileId: payload.metadata.fileId ?? 'unknown',\n            filename: payload.metadata.filename ?? 'unknown',\n            percentage: 0,\n            status: 'failed',\n            loaded: 0,\n            total: payload.metadata.size ?? 0,\n            error: errorInfo?.message ?? 'Upload failed',\n          };\n\n          CoreEventManager.emit('upload:progress', errorData);\n        }\n\n        // Call user's handler if provided\n        if (userHandlers?.onFileUploadFailed) {\n          await userHandlers.onFileUploadFailed(payload);\n        }\n      },\n    };\n  }\n\n  /**\n   * Initializes the storage service\n   *\n   * @param config - Storage service configuration\n   * @returns The initialized StorageService instance\n   */\n  static async initialize(config: CoreStorageConfig): Promise<StorageService> {\n    const instance = StorageService.getInstance();\n\n    if (instance.initialized) {\n      return instance;\n    }\n\n    instance.config = config;\n\n    // Merge user event handlers with Core's internal handlers for DB persistence\n    const mergedHandlers = StorageService.createMergedEventHandlers(config.handlers);\n\n    const mergedConfig: TypedStorageConfig = {\n      ...config,\n      handlers: mergedHandlers,\n    } as TypedStorageConfig;\n\n    logger.info('[StorageService] Initializing with merged event handlers for DB persistence');\n\n    // Cast to properly typed config (CoreStorageConfig is the user-facing type,\n    // TypedStorageConfig ensures proper generic parameter for StorageServiceImpl)\n    instance.storageService = new StorageServiceImpl(mergedConfig);\n    instance.initialized = true;\n\n    return instance;\n  }\n\n  /**\n   * Gets the raw underlying storage service instance without error handling wrapper.\n   * Use this only if you need direct access to the underlying service.\n   *\n   * @returns The raw StorageService instance from @plyaz/storage\n   * @throws {StoragePackageError} When storage is not initialized\n   */\n  private getRawStorage(): StorageServiceImpl {\n    if (!this.storageService) {\n      throw new StoragePackageError(\n        'Storage not initialized. Call StorageService.initialize() first or use Core.initialize() with storage config.',\n        STORAGE_ERROR_CODES.INITIALIZATION_FAILED\n      );\n    }\n    return this.storageService;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Service Access\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Gets the storage service with automatic error handling.\n   * All method calls are wrapped with try/catch and emit error events on failure.\n   * Any method added to @plyaz/storage will be automatically available.\n   *\n   * @example\n   * ```typescript\n   * const storage = StorageService.getInstance().getStorage();\n   * await storage.uploadFile({ file, filename: 'doc.pdf' });\n   * await storage.deleteFile({ fileId: '123' });\n   * ```\n   *\n   * @returns StorageServiceImpl with automatic error handling\n   */\n  getStorage(): StorageServiceImpl {\n    const self = this;\n\n    return new Proxy({} as StorageServiceImpl, {\n      get(_, prop: string | symbol) {\n        // Skip symbol properties\n        if (typeof prop === 'symbol') {\n          return undefined;\n        }\n\n        const storage = self.getRawStorage();\n        const value = storage[prop as keyof StorageServiceImpl];\n\n        // If it's not a function, return the value directly\n        if (typeof value !== 'function') {\n          return value;\n        }\n\n        // Wrap function calls with error handling\n        return (...args: unknown[]) => {\n          try {\n            const result = (value as Function).apply(storage, args);\n\n            // Handle async methods\n            if (result instanceof Promise) {\n              return result.catch((error: unknown) => {\n                self.emitStorageError(error, prop, { recoverable: true });\n                throw error;\n              });\n            }\n\n            return result;\n          } catch (error) {\n            self.emitStorageError(error, prop, { recoverable: true });\n            throw error;\n          }\n        };\n      },\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Health Check (special handling for response transformation)\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Performs a health check on the storage service by checking all adapter health.\n   * This method has special handling to transform the response format.\n   */\n  async healthCheck(): Promise<{ isHealthy: boolean; responseTime?: number; error?: string }> {\n    const startTime = Date.now();\n    try {\n      const storage = this.getRawStorage();\n      // Use checkAllAdaptersHealth and getHealthSummary if available\n      if (typeof storage.checkAllAdaptersHealth === 'function') {\n        await storage.checkAllAdaptersHealth();\n      }\n\n      const summary =\n        typeof storage.getHealthSummary === 'function' ? storage.getHealthSummary() : null;\n      const responseTime = Date.now() - startTime;\n\n      return {\n        // Check if all adapters are healthy (healthy count equals total count)\n        isHealthy: summary ? summary.healthy === summary.total : true,\n        responseTime,\n        error: undefined,\n      };\n    } catch (error) {\n      this.emitStorageError(error, 'healthCheck', { recoverable: true });\n\n      return {\n        isHealthy: false,\n        responseTime: Date.now() - startTime,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Lifecycle\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Gets the current configuration\n   */\n  getConfig(): CoreStorageConfig | null {\n    return this.config;\n  }\n\n  /**\n   * Closes the storage service and cleans up resources\n   */\n  async close(): Promise<void> {\n    if (this.storageService) {\n      await this.storageService.destroy();\n    }\n    this.storageService = null;\n    this.initialized = false;\n    this.config = null;\n  }\n\n  /**\n   * Creates a dedicated storage service instance (NOT the singleton)\n   *\n   * Use this when you need an isolated storage connection with its own configuration.\n   *\n   * @param config - Storage service configuration\n   * @returns Promise that resolves to a new dedicated StorageService instance\n   */\n  static async createInstance(config: CoreStorageConfig): Promise<StorageService> {\n    const dedicatedInstance = new StorageService();\n    dedicatedInstance.config = config;\n    // Cast to properly typed config (CoreStorageConfig is the user-facing type,\n    // TypedStorageConfig ensures proper generic parameter for StorageServiceImpl)\n    dedicatedInstance.storageService = new StorageServiceImpl(config as TypedStorageConfig);\n    dedicatedInstance.initialized = true;\n    return dedicatedInstance;\n  }\n}\n\n/** Type alias for StorageService instance (use for type-only imports to avoid bundling) */\nexport type StorageServiceInstance = StorageService;\n","/**\n * NotificationService - Singleton Notification Manager\n *\n * @description Manages notification delivery for the entire application using a singleton pattern.\n * This service wraps @plyaz/notifications and provides a centralized way to initialize and access\n * notification capabilities across all domains (transactional, marketing, system alerts, etc.).\n *\n * **Architecture:**\n * - Uses `NotificationService` from @plyaz/notifications which supports multi-provider setup\n * - Supports email (Infobip primary, SendGrid fallback), SMS, and push notifications\n * - Automatic failover between providers based on health status\n * - Event-driven architecture for tracking delivery, opens, clicks\n * - **Proxy-based method forwarding**: All methods from the underlying service are\n *   automatically available with error handling - no manual wrapping needed\n *\n * **Provider Configuration:**\n * - **Infobip**: Primary email provider (unified omnichannel platform)\n * - **SendGrid**: Fallback email provider for transactional emails\n *\n * **Required Environment Variables (Infobip):**\n * - INFOBIP_API_KEY: Your Infobip API key\n * - INFOBIP_BASE_URL: Infobip API base URL\n * - FROM_EMAIL: Default sender email address\n *\n * **Required Environment Variables (SendGrid):**\n * - SENDGRID_API_KEY: Your SendGrid API key\n * - FROM_EMAIL: Default sender email address\n *\n * @example Using with Core.initialize() (Recommended)\n * ```typescript\n * import { Core } from '@plyaz/core';\n *\n * await Core.initialize({\n *   notifications: {\n *     providers: {\n *       email: [infobipAdapter, sendGridAdapter],\n *       sms: [],\n *       push: [],\n *     },\n *     events: {\n *       onSent: (event) => console.log('Notification sent:', event),\n *       onFailed: (event) => console.error('Notification failed:', event),\n *     },\n *   },\n * });\n *\n * // Access via Core.notifications - all methods automatically available\n * await Core.notifications.sendEmail({\n *   recipientId: 'user-123',\n *   to: 'user@example.com',\n *   templateId: 'welcome',\n *   templateData: { userName: 'John' },\n * });\n * ```\n *\n * @module services\n */\n\nimport { NotificationService as NotificationServiceImpl } from '@plyaz/notifications';\nimport { NotificationPackageError } from '@plyaz/errors';\nimport type { CoreNotificationConfig, CoreNotificationServiceInstance } from '@plyaz/types/core';\nimport { CORE_EVENTS, type CoreNotificationErrorPayload } from '@plyaz/types/core';\nimport type { NotificationEventCallbacks } from '@plyaz/types/notifications';\nimport { NOTIFICATION_ERROR_CODES } from '@plyaz/types/errors';\nimport { CoreEventManager } from '../events/CoreEventManager';\n\n// Re-export types for convenience\nexport type { CoreNotificationConfig } from '@plyaz/types/core';\n\n/** Error context options for notification operations */\ninterface NotificationErrorOptions {\n  recipientId?: string;\n  channel?: string;\n  recoverable?: boolean;\n}\n\nconst MAX_FAIL_ATTEMPTS = 3;\n\n/**\n * Global Singleton Pattern using globalThis\n *\n * @see CoreEventManager.ts for detailed explanation of why this pattern is needed.\n *\n * TL;DR: In Next.js and similar frameworks, module isolation can create multiple singleton\n * instances. Using globalThis + Symbol.for() ensures ONE instance per process, preventing\n * issues like duplicate notification delivery or inconsistent provider state across API routes.\n */\nconst NOTIFICATION_SERVICE_KEY = Symbol.for('plyaz.NotificationService');\n\nfunction getNotificationServiceInstance(): NotificationService | null {\n  const globalAny = globalThis as unknown as { [key: symbol]: NotificationService | null };\n  return globalAny[NOTIFICATION_SERVICE_KEY] ?? null;\n}\n\nfunction setNotificationServiceInstance(instance: NotificationService | null): void {\n  const globalAny = globalThis as unknown as { [key: symbol]: NotificationService | null };\n  globalAny[NOTIFICATION_SERVICE_KEY] = instance;\n}\n\n/**\n * NotificationService - Singleton Notification Manager with Proxy-based method forwarding\n *\n * Provides centralized notification management for all domains.\n * Uses @plyaz/notifications under the hood with configurable providers and templates.\n *\n * All methods from the underlying NotificationServiceImpl are automatically available\n * via Proxy - when new methods are added to @plyaz/notifications, they're instantly\n * accessible here with automatic error handling.\n */\nexport class NotificationService implements CoreNotificationServiceInstance {\n  private notificationService: NotificationServiceImpl | null = null;\n  private config: CoreNotificationConfig | null = null;\n  private initialized = false;\n\n  private constructor() {}\n\n  // ─────────────────────────────────────────────────────────────────\n  // Error Handling\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Emits a notification error event via CoreEventManager.\n   * Called when notification operations fail to integrate with global error handling.\n   */\n  private emitNotificationError(\n    error: unknown,\n    operation: string,\n    options?: NotificationErrorOptions\n  ): void {\n    const payload: CoreNotificationErrorPayload = {\n      error,\n      operation,\n      recipientId: options?.recipientId,\n      channel: options?.channel,\n      recoverable: options?.recoverable ?? false,\n    };\n    CoreEventManager.emit(CORE_EVENTS.NOTIFICATION.ERROR, payload);\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Merged Event Handlers\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Creates merged event handlers that emit to CoreEventManager.\n   * Merges Core's internal handlers with user-provided handlers.\n   *\n   * @param userHandlers - User-provided event handlers from config\n   * @returns Merged handlers with Core event emission + user handlers\n   */\n  private static createMergedEventHandlers(\n    userHandlers?: NotificationEventCallbacks\n  ): NotificationEventCallbacks {\n    return {\n      ...userHandlers,\n\n      // Emit to CoreEventManager on sent, then call user handler\n      onSent: async payload => {\n        CoreEventManager.emit(CORE_EVENTS.NOTIFICATION.SENT, {\n          notificationId: payload.notificationId,\n          recipientId: payload.recipientId,\n          channel: payload.channel,\n          provider: payload.provider,\n        });\n        if (userHandlers?.onSent) {\n          await userHandlers.onSent(payload);\n        }\n      },\n\n      // Emit to CoreEventManager on failed, then call user handler\n      onFailed: async payload => {\n        CoreEventManager.emit(CORE_EVENTS.NOTIFICATION.FAILED, {\n          notificationId: payload.notificationId,\n          recipientId: payload.recipientId,\n          channel: payload.channel,\n          error: payload.error,\n          retryable: payload.retryCount < MAX_FAIL_ATTEMPTS,\n        });\n        if (userHandlers?.onFailed) {\n          await userHandlers.onFailed(payload);\n        }\n      },\n\n      // Emit to CoreEventManager on delivered, then call user handler\n      onDelivered: async payload => {\n        CoreEventManager.emit(CORE_EVENTS.NOTIFICATION.DELIVERED, {\n          notificationId: payload.notificationId,\n          recipientId: payload.recipientId,\n          channel: payload.channel,\n          deliveredAt: payload.deliveredAt,\n        });\n        if (userHandlers?.onDelivered) {\n          await userHandlers.onDelivered(payload);\n        }\n      },\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Singleton Management\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Gets the singleton instance of NotificationService\n   */\n  static getInstance(): NotificationService {\n    let instance = getNotificationServiceInstance();\n    if (!instance) {\n      instance = new NotificationService();\n      setNotificationServiceInstance(instance);\n    }\n    return instance;\n  }\n\n  /**\n   * Checks if the notification service has been initialized\n   */\n  static isInitialized(): boolean {\n    return getNotificationServiceInstance()?.initialized ?? false;\n  }\n\n  /**\n   * Resets the notification service by clearing the singleton instance\n   */\n  static async reset(): Promise<void> {\n    const instance = getNotificationServiceInstance();\n    if (instance) {\n      instance.notificationService = null;\n      instance.config = null;\n      instance.initialized = false;\n      setNotificationServiceInstance(null);\n    }\n  }\n\n  /**\n   * Initializes the notification service\n   *\n   * @param config - Notification service configuration\n   * @returns The initialized NotificationService instance\n   */\n  static async initialize(config: CoreNotificationConfig): Promise<NotificationService> {\n    const instance = NotificationService.getInstance();\n\n    if (instance.initialized) {\n      return instance;\n    }\n\n    // Merge user event handlers with Core's internal handlers\n    const mergedEvents = NotificationService.createMergedEventHandlers(config.events);\n\n    instance.config = config;\n    instance.notificationService = new NotificationServiceImpl({\n      ...config,\n      events: mergedEvents,\n    });\n    instance.initialized = true;\n\n    return instance;\n  }\n\n  /**\n   * Gets the raw underlying notification service instance without error handling wrapper.\n   * Use this only if you need direct access to the underlying service.\n   *\n   * @returns The raw NotificationService instance from @plyaz/notifications\n   * @throws {NotificationsPackageError} When notifications is not initialized\n   */\n  private getRawNotifications(): NotificationServiceImpl {\n    if (!this.notificationService) {\n      throw new NotificationPackageError(\n        'Notifications not initialized. Call NotificationService.initialize() first or use Core.initialize() with notifications config.',\n        NOTIFICATION_ERROR_CODES.INITIALIZATION_FAILED\n      );\n    }\n    return this.notificationService;\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Service Access\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Gets the notification service with automatic error handling.\n   * All method calls are wrapped with try/catch and emit error events on failure.\n   * Any method added to @plyaz/notifications will be automatically available.\n   *\n   * @example\n   * ```typescript\n   * const notifications = NotificationService.getInstance().getNotifications();\n   * await notifications.sendEmail({ to: 'user@example.com', templateId: 'welcome' });\n   * await notifications.sendSMS({ to: '+1234567890', message: 'Hello!' });\n   * ```\n   *\n   * @returns NotificationServiceImpl with automatic error handling\n   */\n  getNotifications(): NotificationServiceImpl {\n    const self = this;\n\n    return new Proxy({} as NotificationServiceImpl, {\n      get(_, prop: string | symbol) {\n        // Skip symbol properties\n        if (typeof prop === 'symbol') {\n          return undefined;\n        }\n\n        const notifications = self.getRawNotifications();\n        const value = notifications[prop as keyof NotificationServiceImpl];\n\n        // If it's not a function, return the value directly\n        if (typeof value !== 'function') {\n          return value;\n        }\n\n        // Wrap function calls with error handling\n        return (...args: unknown[]) => {\n          try {\n            const result = (value as Function).apply(notifications, args);\n\n            // Handle async methods\n            if (result instanceof Promise) {\n              return result.catch((error: unknown) => {\n                self.emitNotificationError(error, prop, { recoverable: true });\n                throw error;\n              });\n            }\n\n            return result;\n          } catch (error) {\n            self.emitNotificationError(error, prop, { recoverable: true });\n            throw error;\n          }\n        };\n      },\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Health Check (special handling for response transformation)\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Performs a health check on the notification service.\n   * This method has special handling to transform the response format.\n   */\n  async healthCheck(): Promise<{ isHealthy: boolean; providers?: unknown[]; error?: string }> {\n    try {\n      const notifications = this.getRawNotifications();\n      const result = await notifications.healthCheck();\n\n      return {\n        isHealthy: result.healthy,\n        providers: result.providers,\n        // Use optional chaining since error may not exist on all health check results\n        error: 'error' in result ? (result as { error?: string }).error : undefined,\n      };\n    } catch (error) {\n      this.emitNotificationError(error, 'healthCheck', { recoverable: true });\n\n      return {\n        isHealthy: false,\n        error: error instanceof Error ? error.message : 'Unknown error',\n      };\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────\n  // Lifecycle\n  // ─────────────────────────────────────────────────────────────────\n\n  /**\n   * Gets the current configuration\n   */\n  getConfig(): CoreNotificationConfig | null {\n    return this.config;\n  }\n\n  /**\n   * Closes the notification service and cleans up resources\n   */\n  async close(): Promise<void> {\n    this.notificationService = null;\n    this.initialized = false;\n    this.config = null;\n  }\n\n  /**\n   * Creates a dedicated notification service instance (NOT the singleton)\n   *\n   * Use this when you need an isolated notification service with its own configuration.\n   *\n   * @param config - Notification service configuration\n   * @returns Promise that resolves to a new dedicated NotificationService instance\n   */\n  static async createInstance(config: CoreNotificationConfig): Promise<NotificationService> {\n    // Merge user event handlers with Core's internal handlers\n    const mergedEvents = NotificationService.createMergedEventHandlers(config.events);\n\n    const dedicatedInstance = new NotificationService();\n    dedicatedInstance.config = config;\n    dedicatedInstance.notificationService = new NotificationServiceImpl({\n      ...config,\n      events: mergedEvents,\n    });\n    dedicatedInstance.initialized = true;\n    return dedicatedInstance;\n  }\n}\n\n/** Type alias for NotificationService instance (use for type-only imports to avoid bundling) */\nexport type NotificationServiceInstance = NotificationService;\n","/**\n * Core initialization exports\n *\n * Import runtime types directly from '@plyaz/types/core':\n * - CoreRuntimeEnvironment, CoreRuntimeContext\n * - BACKEND_RUNTIMES, FRONTEND_RUNTIMES, UNIVERSAL_RUNTIMES\n *\n * For backend-only exports (DbService, DEFAULT_ENCRYPTION_FIELDS),\n * use '@plyaz/core/backend' entry point.\n */\nexport { Core } from './CoreInitializer';\n\nexport type { CoreInitOptions, CoreServicesResult } from './CoreInitializer';\n\n// Core types from types package\nexport type {\n  CoreEnvVars,\n  CoreFeatureFlagInitConfig,\n  CoreErrorHandlerInitConfig,\n} from '@plyaz/types/core';\n\n// Service Registry (universal - works in frontend & backend)\nexport { ServiceRegistry } from './ServiceRegistry';\n\n// Re-export universal services only\nexport { ApiClientService } from '../services/ApiClientService';\n","/**\n * Database Repository Implementation\n *\n * Database adapter integration with @plyaz/db for feature flag storage.\n * Extends BaseRepository for consistent CRUD operations and QueryBuilder support.\n *\n * @fileoverview Database repository for feature flags\n */\n\nimport { BaseRepository } from '@plyaz/db';\nimport {\n  type FeatureFlag,\n  type FeatureFlagRule,\n  type FeatureFlagValue,\n  type CreateFlagRequest,\n  type FeatureFlagContext,\n} from '@plyaz/types';\nimport { DATABASE_ERROR_CODES } from '@plyaz/types/errors';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { DbService } from '../../services/DbService';\nimport { PackageLogger } from '@plyaz/logger';\nimport {\n  SORT_DIRECTION,\n  FEATURE_FLAG_TABLE,\n  FEATURE_FLAG_FIELD,\n  FEATURE_FLAG_RULE_FIELD,\n  type CoreDatabaseFeatureFlagRow,\n  type CoreDatabaseFeatureFlagRuleRow,\n  type CoreDatabaseOverrideRow,\n  type CoreDatabaseEvaluationRow,\n  type CoreEnvironmentFilterRow,\n  type CoreFeatureFlagTableConfig,\n} from '@plyaz/types/core';\nimport {\n  DATABASE_FIELDS,\n  SYSTEM_USERS,\n  EVALUATION_REASONS,\n  FEATURE_FLAG_TYPES,\n} from '@plyaz/types/core';\nimport { DatabasePackageError } from '@plyaz/errors';\nimport type { DatabaseServiceInterface } from '@plyaz/types/db';\n\n/**\n * Extended row type with index signature for BaseRepository compatibility\n */\ntype FeatureFlagRow = CoreDatabaseFeatureFlagRow & Record<string, unknown>;\n\n/**\n * Default table configuration using standard table names.\n */\nconst DEFAULT_TABLE_CONFIG: CoreFeatureFlagTableConfig = {\n  flagsTable: FEATURE_FLAG_TABLE.FeatureFlags,\n  rulesTable: FEATURE_FLAG_TABLE.FeatureFlagRules,\n  evaluationsTable: FEATURE_FLAG_TABLE.FeatureFlagEvaluations,\n  overridesTable: FEATURE_FLAG_TABLE.FeatureFlagOverrides,\n  evaluationsSchema: 'public',\n};\n\n/** Default pagination limit */\nconst DEFAULT_LIMIT = 1000;\n\n/**\n * Database Repository for Feature Flags\n *\n * Extends BaseRepository for consistent CRUD operations and QueryBuilder support.\n * Manages feature flags, rules, evaluations, and overrides across multiple tables.\n *\n * @template TKey - Feature flag key type (extends string)\n *\n * @example\n * ```typescript\n * // Create repository\n * const repository = FeatureFlagDatabaseRepository.create();\n *\n * // Use QueryBuilder for complex queries\n * const enabledFlags = await repository.query()\n *   .where('is_enabled', 'eq', true)\n *   .orderByAsc('key')\n *   .getMany();\n *\n * // Get all flags with environment filter\n * const prodFlags = await repository.getAllFlags('production');\n * ```\n */\nexport class FeatureFlagDatabaseRepository<\n  TKey extends string = FeatureFlagKey,\n> extends BaseRepository<FeatureFlagRow> {\n  private readonly tableConfig: CoreFeatureFlagTableConfig;\n  private readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'FeatureFlagRepository',\n  });\n\n  /**\n   * Creates a new repository with optional custom table names.\n   *\n   * @param db - Database service interface\n   * @param tableConfig - Optional custom table configuration\n   */\n  constructor(db: DatabaseServiceInterface, tableConfig?: Partial<CoreFeatureFlagTableConfig>) {\n    const config = { ...DEFAULT_TABLE_CONFIG, ...tableConfig };\n    // BaseRepository uses 'id' by default, but feature flags use 'key'\n    super(db, config.flagsTable, { idColumn: 'key' });\n    this.tableConfig = config;\n  }\n\n  /**\n   * Factory method to create repository instance.\n   * Uses DbService singleton if initialized.\n   */\n  static create<TKey extends string = FeatureFlagKey>(\n    tableConfig?: Partial<CoreFeatureFlagTableConfig>\n  ): FeatureFlagDatabaseRepository<TKey> {\n    if (!DbService.isInitialized()) {\n      throw new DatabasePackageError(\n        'DbService must be initialized before creating FeatureFlagDatabaseRepository',\n        DATABASE_ERROR_CODES.CONNECTION_FAILED\n      );\n    }\n    const db = DbService.getInstance().getDatabase();\n    return new FeatureFlagDatabaseRepository<TKey>(db, tableConfig);\n  }\n\n  /**\n   * Gets the current table configuration.\n   */\n  getTableConfig(): CoreFeatureFlagTableConfig {\n    return { ...this.tableConfig };\n  }\n\n  /**\n   * Gets the full table name including schema if needed.\n   */\n  private getEvaluationsTableName(): string {\n    const { evaluationsSchema, evaluationsTable } = this.tableConfig;\n    return evaluationsSchema && evaluationsSchema !== 'public'\n      ? `${evaluationsSchema}.${evaluationsTable}`\n      : evaluationsTable;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Feature Flags (using QueryBuilder)\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Retrieves all feature flags with optional environment filtering.\n   * Uses QueryBuilder fluent API for the query.\n   *\n   * @param environment - Optional environment filter\n   * @returns Array of feature flags\n   */\n  async getAllFlags(environment?: string): Promise<FeatureFlag<TKey>[]> {\n    try {\n      const rows = await this.query()\n        .orderByAsc('key' as keyof FeatureFlagRow & string)\n        .limit(DEFAULT_LIMIT)\n        .getMany();\n\n      const filteredRows = environment\n        ? (rows as unknown as CoreEnvironmentFilterRow[]).filter(row =>\n            Boolean(row.environments?.includes(environment))\n          )\n        : rows;\n\n      return filteredRows.map(row => this.mapToFeatureFlag(row as FeatureFlagRow));\n    } catch (error) {\n      this.logger.warn('getAllFlags failed, returning empty array', { error });\n      return [];\n    }\n  }\n\n  /**\n   * Retrieves a specific feature flag by its key.\n   * Uses findById with 'key' as the ID column.\n   *\n   * @param key - The feature flag key\n   * @returns The feature flag or null\n   */\n  async getFlag(key: TKey): Promise<FeatureFlag<TKey> | null> {\n    const result = await this.findById(key);\n\n    if (!result.success) {\n      throw new DatabasePackageError(\n        `Failed to get flag: ${result.error?.message}`,\n        DATABASE_ERROR_CODES.NO_DATA\n      );\n    }\n\n    return result.value ? this.mapToFeatureFlag(result.value) : null;\n  }\n\n  /**\n   * Find flags by enabled status using QueryBuilder.\n   *\n   * @param isEnabled - Filter by enabled status\n   * @returns Array of matching flags\n   */\n  async findByEnabled(isEnabled: boolean): Promise<FeatureFlag<TKey>[]> {\n    const rows = await this.query()\n      .where('is_enabled', 'eq', isEnabled)\n      .orderByAsc('key' as keyof FeatureFlagRow & string)\n      .getMany();\n\n    return rows.map(row => this.mapToFeatureFlag(row));\n  }\n\n  /**\n   * Count flags by enabled status using QueryBuilder.\n   */\n  async countByEnabled(isEnabled: boolean): Promise<number> {\n    return this.query().where('is_enabled', 'eq', isEnabled).count();\n  }\n\n  /**\n   * Creates a new feature flag.\n   *\n   * @param data - Flag creation data\n   * @returns The created flag\n   */\n  async createFlag(data: CreateFlagRequest<TKey>): Promise<FeatureFlag<TKey>> {\n    const flagData: Record<string, unknown> = {\n      key: data.key,\n      name: data.name ?? data.key,\n      value: data.value,\n      type: this.toTypeField(data.value),\n      is_enabled: data.isEnabled ?? true,\n      environments: data.environment ? [data.environment] : undefined,\n      description: data.description,\n      updated_at: new Date().toISOString(),\n    };\n\n    const result = await this.create(flagData as Partial<FeatureFlagRow>);\n\n    if (!result.success || !result.value) {\n      throw new DatabasePackageError(\n        `Failed to create flag: ${result.error?.message}`,\n        DATABASE_ERROR_CODES.CREATE_FAILED\n      );\n    }\n\n    return this.mapToFeatureFlag(result.value);\n  }\n\n  /**\n   * Updates an existing feature flag.\n   *\n   * @param key - Flag key to update\n   * @param data - Partial update data\n   * @returns The updated flag\n   */\n  // eslint-disable-next-line complexity\n  async updateFlag(key: TKey, data: Partial<CreateFlagRequest<TKey>>): Promise<FeatureFlag<TKey>> {\n    const updateData: Record<string, unknown> = {\n      [FEATURE_FLAG_FIELD.UpdatedAt]: new Date().toISOString(),\n    };\n\n    if (data.value !== undefined) {\n      updateData[FEATURE_FLAG_FIELD.Value] = data.value;\n      updateData[FEATURE_FLAG_FIELD.Type] = this.toTypeField(data.value);\n    }\n    if (data.isEnabled !== undefined) {\n      updateData[FEATURE_FLAG_FIELD.IsEnabled] = data.isEnabled;\n    }\n    if (data.description !== undefined) {\n      updateData[FEATURE_FLAG_FIELD.Description] = data.description;\n    }\n    if (data.name !== undefined) {\n      updateData[FEATURE_FLAG_FIELD.Name] = data.name;\n    }\n    if (data.environment !== undefined) {\n      updateData[FEATURE_FLAG_FIELD.Environments] = [data.environment];\n    }\n\n    const result = await this.update(key, updateData as Partial<FeatureFlagRow>);\n\n    if (!result.success || !result.value) {\n      throw new DatabasePackageError(\n        `Failed to update flag: ${result.error?.message}`,\n        DATABASE_ERROR_CODES.UPDATE_FAILED\n      );\n    }\n\n    return this.mapToFeatureFlag(result.value);\n  }\n\n  /**\n   * Deletes a feature flag.\n   *\n   * @param key - Flag key to delete\n   */\n  async deleteFlag(key: TKey): Promise<void> {\n    const result = await this.delete(key);\n\n    if (!result.success) {\n      throw new DatabasePackageError(\n        `Failed to delete flag: ${result.error?.message}`,\n        DATABASE_ERROR_CODES.DELETE_FAILED\n      );\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Feature Flag Rules\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Retrieves rules for a specific flag using direct db query.\n   * Rules are in a separate table, so we use the underlying db service.\n   *\n   * @param key - Flag key to get rules for\n   * @returns Array of rules\n   */\n  async getFlagRules(key: TKey): Promise<FeatureFlagRule<TKey>[]> {\n    const result = await this.db.list<CoreDatabaseFeatureFlagRuleRow>(this.tableConfig.rulesTable, {\n      filter: {\n        field: FEATURE_FLAG_RULE_FIELD.FlagKey as keyof CoreDatabaseFeatureFlagRuleRow,\n        operator: 'eq',\n        value: key as string,\n      },\n      sort: [\n        {\n          field: FEATURE_FLAG_RULE_FIELD.Priority as keyof CoreDatabaseFeatureFlagRuleRow,\n          direction: SORT_DIRECTION.Desc,\n        },\n      ],\n    });\n\n    if (!result.success) {\n      this.logger.warn('getFlagRules failed', {\n        error: result.error?.message,\n      });\n      return [];\n    }\n\n    const rules = result.value?.data ?? [];\n    return rules.map(rule =>\n      this.mapToFeatureFlagRule(rule as unknown as CoreDatabaseFeatureFlagRuleRow)\n    );\n  }\n\n  /**\n   * Retrieves all enabled rules across all flags.\n   *\n   * @returns Array of all enabled rules\n   */\n  async getAllRules(): Promise<FeatureFlagRule<TKey>[]> {\n    const result = await this.db.list<CoreDatabaseFeatureFlagRuleRow>(this.tableConfig.rulesTable, {\n      filter: {\n        field: FEATURE_FLAG_RULE_FIELD.IsEnabled as keyof CoreDatabaseFeatureFlagRuleRow,\n        operator: 'eq',\n        value: true,\n      },\n      sort: [\n        {\n          field: FEATURE_FLAG_RULE_FIELD.FlagKey as keyof CoreDatabaseFeatureFlagRuleRow,\n          direction: SORT_DIRECTION.Asc,\n        },\n        {\n          field: FEATURE_FLAG_RULE_FIELD.Priority as keyof CoreDatabaseFeatureFlagRuleRow,\n          direction: SORT_DIRECTION.Desc,\n        },\n      ],\n    });\n\n    if (!result.success) {\n      this.logger.warn('getAllRules failed', { error: result.error?.message });\n      return [];\n    }\n\n    const rules = result.value?.data ?? [];\n    return rules.map(rule =>\n      this.mapToFeatureFlagRule(rule as unknown as CoreDatabaseFeatureFlagRuleRow)\n    );\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Evaluations & Overrides\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Logs a feature flag evaluation for audit purposes.\n   */\n  async logEvaluation(params: {\n    flagKey: TKey;\n    userId?: string;\n    context?: FeatureFlagContext;\n    result: FeatureFlagValue;\n  }): Promise<void> {\n    try {\n      // Don't include id - let DB generate via uuid_generate_v4()\n      const evaluationData: Omit<CoreDatabaseEvaluationRow, 'id'> = {\n        flag_key: params.flagKey as string,\n        user_id: params.userId,\n        context: params.context as Record<string, string | number | boolean> | undefined,\n        value: params.result,\n        is_enabled: typeof params.result === 'boolean' ? params.result : !!params.result,\n        reason: EVALUATION_REASONS.Default,\n        evaluated_at: new Date().toISOString(),\n      };\n\n      const result = await this.db.create(\n        this.getEvaluationsTableName(),\n        evaluationData as Record<string, unknown>\n      );\n\n      if (!result.success) {\n        this.logger.warn('logEvaluation failed', {\n          error: result.error?.message,\n        });\n      }\n    } catch (error) {\n      this.logger.warn('logEvaluation error', { error });\n    }\n  }\n\n  /**\n   * Sets a user-specific override for a feature flag.\n   */\n  async setOverride(\n    flagKey: TKey,\n    userId: string,\n    value: FeatureFlagValue,\n    expiresAt?: Date\n  ): Promise<void> {\n    // Don't include id - let DB generate via uuid_generate_v4()\n    const overrideData: Omit<CoreDatabaseOverrideRow, 'id'> = {\n      flag_key: flagKey as string,\n      user_id: userId,\n      value,\n      expires_at: expiresAt?.toISOString(),\n      created_at: new Date().toISOString(),\n    };\n\n    const result = await this.db.create(\n      this.tableConfig.overridesTable,\n      overrideData as Record<string, unknown>\n    );\n\n    if (!result.success) {\n      this.logger.warn('setOverride failed', { error: result.error?.message });\n    }\n  }\n\n  /**\n   * Retrieves a user-specific override for a feature flag.\n   */\n  async getOverride(flagKey: TKey, userId: string): Promise<FeatureFlagValue | null> {\n    const result = await this.db.list<CoreDatabaseOverrideRow>(this.tableConfig.overridesTable, {\n      filter: {\n        field: DATABASE_FIELDS.FlagKey as keyof CoreDatabaseOverrideRow,\n        operator: 'eq',\n        value: flagKey as string,\n      },\n    });\n\n    if (!result.success || !result.value?.data) {\n      return null;\n    }\n\n    const typedData = result.value.data as unknown as CoreDatabaseOverrideRow[];\n    const validOverrides = typedData.filter(override => {\n      if (override.user_id !== userId) return false;\n      if (override.expires_at && new Date(override.expires_at) < new Date()) return false;\n      return true;\n    });\n\n    return validOverrides.length > 0 ? validOverrides[0].value : null;\n  }\n\n  /**\n   * Removes user-specific overrides for a feature flag.\n   */\n  async removeOverride(flagKey: TKey, userId: string): Promise<void> {\n    const listResult = await this.db.list<CoreDatabaseOverrideRow>(\n      this.tableConfig.overridesTable,\n      {\n        filter: {\n          field: DATABASE_FIELDS.FlagKey as keyof CoreDatabaseOverrideRow,\n          operator: 'eq',\n          value: flagKey as string,\n        },\n      }\n    );\n\n    if (!listResult.success || !listResult.value?.data) {\n      return;\n    }\n\n    const typedOverrides = listResult.value.data as unknown as CoreDatabaseOverrideRow[];\n    const overridesToDelete = typedOverrides.filter(override => override.user_id === userId);\n\n    for (const override of overridesToDelete) {\n      await this.db.delete(this.tableConfig.overridesTable, override.id);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Mappers\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Infers the type of a value for the type field.\n   */\n  private toTypeField(value: unknown): string {\n    if (typeof value === 'boolean') return 'boolean';\n    if (typeof value === 'string') return 'string';\n    if (typeof value === 'number') return 'number';\n    return 'json';\n  }\n\n  /**\n   * Maps a database row to a FeatureFlag object.\n   */\n  // eslint-disable-next-line complexity\n  private mapToFeatureFlag(row: FeatureFlagRow): FeatureFlag<TKey> {\n    return {\n      key: row.key as TKey,\n      type: FEATURE_FLAG_TYPES.BOOLEAN,\n      name: row.key,\n      value: row.value,\n      isEnabled: row.isEnabled ?? row.is_enabled ?? true,\n      environment: row.environments?.[0] ?? '',\n      description: row.description ?? '',\n      createdAt: row.createdAt ?? (row.created_at ? new Date(row.created_at) : new Date()),\n      updatedAt: row.updatedAt ?? (row.updated_at ? new Date(row.updated_at) : new Date()),\n      createdBy: SYSTEM_USERS.SYSTEM,\n      updatedBy: SYSTEM_USERS.SYSTEM,\n    };\n  }\n\n  /**\n   * Maps a database row to a FeatureFlagRule object.\n   */\n  private mapToFeatureFlagRule(row: CoreDatabaseFeatureFlagRuleRow): FeatureFlagRule<TKey> {\n    return {\n      id: row.id,\n      flagKey: (row.flagKey ?? row.flag_key) as TKey,\n      name: row.name,\n      conditions: row.conditions,\n      value: row.value,\n      priority: row.priority,\n      isEnabled: row.isEnabled ?? row.is_enabled ?? true,\n    };\n  }\n}\n","/**\n * Feature Flag Evaluation Engine\n *\n * Core engine for evaluating feature flags with rules, targeting, and rollouts.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag evaluation engine\n * @version 1.0.0\n */\n\nimport type {\n  FeatureFlag,\n  FeatureFlagRule,\n  FeatureFlagCondition,\n  FeatureFlagContext,\n  FeatureFlagEvaluation,\n  FeatureFlagValue,\n} from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport { isInRollout, createRolloutIdentifier, isTruthy } from '@utils/common';\nimport { ContextUtils, evaluateConditionOperator } from '@utils/featureFlags';\n\n/**\n * Core feature flag evaluation engine.\n * Handles all the logic for evaluating feature flags including rules, targeting, and rollouts.\n *\n * @class FeatureFlagEngine\n *\n * @example\n * ```typescript\n * const engine = new FeatureFlagEngine(defaultFlags, true);\n * engine.setFlags(flagsFromDatabase);\n * engine.setRules(rulesFromDatabase);\n *\n * const evaluation = engine.evaluate('AUTH_GOOGLE', context);\n * console.log(evaluation.isEnabled); // true/false\n * ```\n */\nexport class FeatureFlagEngine<FeatureFlagKey extends string> {\n  /** Logger instance */\n  private readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'FeatureFlagEngine',\n  });\n\n  /** Storage for active feature flags */\n  private flags: Map<FeatureFlagKey, FeatureFlag<FeatureFlagKey>> = new Map();\n  /** Storage for targeting rules, organized by flag key */\n  private rules: Map<FeatureFlagKey, FeatureFlagRule<FeatureFlagKey>[]> = new Map();\n  /** Storage for manual overrides (useful for testing) */\n  private overrides: Map<FeatureFlagKey, FeatureFlagValue> = new Map();\n\n  /**\n   * Creates a new feature flag evaluation engine.\n   *\n   * @param defaults - Default flag values to fall back to\n   * @param isLoggingEnabled - Whether to enable debug logging\n   */\n  constructor(\n    private defaults: Record<FeatureFlagKey, FeatureFlagValue>,\n    private isLoggingEnabled = false\n  ) {}\n\n  /**\n   * Sets the active feature flags for evaluation.\n   * Clears existing flags and rules before setting new ones.\n   *\n   * @param flags - Array of feature flags to activate\n   */\n  setFlags(flags: FeatureFlag<FeatureFlagKey>[]): void {\n    this.flags.clear();\n    this.rules.clear();\n\n    for (const flag of flags) {\n      this.flags.set(flag.key, flag);\n    }\n\n    this.log('Loaded flags:', this.flags.size);\n  }\n\n  /**\n   * Sets the targeting rules for feature flags.\n   * Rules are automatically sorted by priority (higher numbers first).\n   *\n   * @param rules - Array of feature flag rules\n   */\n  setRules(rules: FeatureFlagRule<FeatureFlagKey>[]): void {\n    this.rules.clear();\n\n    for (const rule of rules) {\n      const existing = this.rules.get(rule.flagKey) ?? [];\n      existing.push(rule);\n      // Sort by priority (higher priority first)\n      existing.sort((a, b) => b.priority - a.priority);\n      this.rules.set(rule.flagKey, existing);\n    }\n\n    this.log('Loaded rules:', rules.length);\n  }\n\n  /**\n   * Gets all targeting rules.\n   *\n   * @returns Array of all feature flag rules\n   */\n  getRules(): FeatureFlagRule<FeatureFlagKey>[] {\n    const allRules: FeatureFlagRule<FeatureFlagKey>[] = [];\n    for (const rules of this.rules.values()) {\n      allRules.push(...rules);\n    }\n    return allRules;\n  }\n\n  /**\n   * Sets a manual override for a specific flag.\n   * Overrides take precedence over all other evaluation logic.\n   *\n   * @param key - The flag key to override\n   * @param value - The value to force for this flag\n   */\n  setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n    this.overrides.set(key, value);\n    this.log('Override set:', key, value);\n  }\n\n  /**\n   * Removes a manual override for a specific flag.\n   *\n   * @param key - The flag key to remove override for\n   */\n  removeOverride(key: FeatureFlagKey): void {\n    this.overrides.delete(key);\n    this.log('Override removed:', key);\n  }\n\n  /**\n   * Updates the default values for feature flags.\n   * This is useful when the FEATURES constant is updated at runtime.\n   *\n   * @param newDefaults - New default values\n   */\n  updateDefaults(newDefaults: Record<FeatureFlagKey, FeatureFlagValue>): void {\n    this.defaults = newDefaults;\n    this.log('Updated default feature values');\n  }\n\n  /**\n   * Clears all manual overrides.\n   */\n  clearOverrides(): void {\n    this.overrides.clear();\n    this.log('All overrides cleared');\n  }\n\n  /**\n   * Gets all current flags.\n   *\n   * @returns Array of all feature flags\n   */\n  getFlags(): FeatureFlag<FeatureFlagKey>[] {\n    return Array.from(this.flags.values());\n  }\n\n  /**\n   * Evaluates a feature flag and returns the complete evaluation result.\n   *\n   * @param key - The feature flag key to evaluate\n   * @param context - Optional context for targeting\n   * @returns Complete evaluation result with value and metadata\n   */\n  evaluate(\n    key: FeatureFlagKey,\n    context?: FeatureFlagContext\n  ): FeatureFlagEvaluation<FeatureFlagKey> {\n    const evaluatedAt = new Date();\n\n    // Check for override first\n    const overrideResult = this.checkOverride(key, evaluatedAt);\n    if (overrideResult) return overrideResult;\n\n    // Get flag from storage\n    const flag = this.flags.get(key);\n    if (!flag) {\n      return this.createDefaultEvaluation(key, evaluatedAt);\n    }\n\n    // Check if flag is disabled\n    if (!flag.isEnabled) {\n      return this.createDisabledEvaluation(key, evaluatedAt);\n    }\n\n    // Check environment\n    if (!this.isEnvironmentMatch(flag, context)) {\n      return this.createDefaultEvaluation(key, evaluatedAt);\n    }\n\n    // Evaluate rules\n    const ruleResult = this.evaluateRules(key, context, evaluatedAt);\n    if (ruleResult) return ruleResult;\n\n    // Check flag-level rollout\n    if (!this.isInFlagRollout(key, flag, context)) {\n      return this.createDefaultEvaluation(key, evaluatedAt);\n    }\n\n    // Return flag value\n    return this.createFlagEvaluation(key, flag, evaluatedAt);\n  }\n\n  /**\n   * Checks for manual override and returns evaluation if found.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @param evaluatedAt - Evaluation timestamp\n   * @returns Evaluation result or null if no override\n   */\n  private checkOverride(\n    key: FeatureFlagKey,\n    evaluatedAt: Date\n  ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n    if (!this.overrides.has(key)) return null;\n\n    const value = this.overrides.get(key)!;\n    return {\n      flagKey: key,\n      value,\n      isEnabled: isTruthy(value),\n      reason: 'override',\n      evaluatedAt,\n    } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n  }\n\n  /**\n   * Creates default evaluation result.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @param evaluatedAt - Evaluation timestamp\n   * @returns Default evaluation result\n   */\n  private createDefaultEvaluation(\n    key: FeatureFlagKey,\n    evaluatedAt: Date\n  ): FeatureFlagEvaluation<FeatureFlagKey> {\n    const defaultValue = this.defaults[key] ?? false;\n    return {\n      flagKey: key,\n      value: defaultValue,\n      isEnabled: isTruthy(defaultValue),\n      reason: 'default',\n      evaluatedAt,\n    } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n  }\n\n  /**\n   * Creates disabled evaluation result.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @param evaluatedAt - Evaluation timestamp\n   * @returns Disabled evaluation result\n   */\n  private createDisabledEvaluation(\n    key: FeatureFlagKey,\n    evaluatedAt: Date\n  ): FeatureFlagEvaluation<FeatureFlagKey> {\n    return {\n      flagKey: key,\n      value: false,\n      isEnabled: false,\n      reason: 'disabled',\n      evaluatedAt,\n    } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n  }\n\n  /**\n   * Creates flag evaluation result.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @param flag - The feature flag\n   * @param evaluatedAt - Evaluation timestamp\n   * @returns Flag evaluation result\n   */\n  private createFlagEvaluation(\n    key: FeatureFlagKey,\n    flag: FeatureFlag<FeatureFlagKey>,\n    evaluatedAt: Date\n  ): FeatureFlagEvaluation<FeatureFlagKey> {\n    return {\n      flagKey: key,\n      value: flag.value,\n      isEnabled: isTruthy(flag.value),\n      reason: 'default',\n      evaluatedAt,\n    } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n  }\n\n  /**\n   * Checks if environment matches for flag evaluation.\n   *\n   * @private\n   * @param flag - The feature flag\n   * @param context - Evaluation context\n   * @returns true if environment matches\n   */\n  private isEnvironmentMatch(\n    flag: FeatureFlag<FeatureFlagKey>,\n    context?: FeatureFlagContext\n  ): boolean {\n    return flag.environment === 'all' || context?.environment === flag.environment;\n  }\n\n  /**\n   * Checks if user is in flag-level rollout.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @param flag - The feature flag\n   * @param context - Evaluation context\n   * @returns true if user is in rollout\n   */\n  private isInFlagRollout(\n    key: FeatureFlagKey,\n    flag: FeatureFlag<FeatureFlagKey>,\n    context?: FeatureFlagContext\n  ): boolean {\n    if (flag.rolloutPercentage === undefined) return true;\n    const identifier = createRolloutIdentifier(key, context?.userId);\n    return isInRollout(identifier, flag.rolloutPercentage);\n  }\n\n  /**\n   * Evaluates all rules for a flag.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @param context - Evaluation context\n   * @param evaluatedAt - Evaluation timestamp\n   * @returns Rule evaluation result or null if no match\n   */\n  private evaluateRules(\n    key: FeatureFlagKey,\n    context?: FeatureFlagContext,\n    evaluatedAt?: Date\n  ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n    const rules = this.rules.get(key) ?? [];\n\n    for (const rule of rules) {\n      if (!rule.isEnabled) continue;\n\n      const ruleResult = this.evaluateMatchingRule(key, rule, context, evaluatedAt);\n      if (ruleResult) return ruleResult;\n    }\n\n    return null;\n  }\n\n  /**\n   * Evaluates a single matching rule and returns result if it passes.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @param rule - The rule to evaluate\n   * @param context - Evaluation context\n   * @param evaluatedAt - Evaluation timestamp\n   * @returns Rule evaluation result or null if no match\n   */\n  private evaluateMatchingRule(\n    key: FeatureFlagKey,\n    rule: FeatureFlagRule<FeatureFlagKey>,\n    context?: FeatureFlagContext,\n    evaluatedAt?: Date\n  ): FeatureFlagEvaluation<FeatureFlagKey> | null {\n    if (!this.evaluateRule(rule, context)) return null;\n\n    const isInRuleRollout =\n      rule.rolloutPercentage === undefined ||\n      isInRollout(createRolloutIdentifier(key, context?.userId), rule.rolloutPercentage);\n\n    if (!isInRuleRollout) return null;\n\n    return {\n      flagKey: key,\n      value: rule.value,\n      isEnabled: isTruthy(rule.value),\n      reason: 'rule_match',\n      matchedRuleId: rule.id,\n      evaluatedAt: evaluatedAt ?? new Date(),\n    } satisfies FeatureFlagEvaluation<FeatureFlagKey>;\n  }\n\n  /**\n   * Evaluates a single rule against the provided context.\n   * All conditions in the rule must match (AND logic).\n   *\n   * @private\n   * @param rule - The rule to evaluate\n   * @param context - Context to evaluate against\n   * @returns true if the rule matches the context\n   */\n  private evaluateRule(\n    rule: FeatureFlagRule<FeatureFlagKey>,\n    context?: FeatureFlagContext\n  ): boolean {\n    if (rule.conditions.length === 0) return true;\n\n    // All conditions must match (AND logic)\n    return rule.conditions.every(condition => this.evaluateCondition(condition, context));\n  }\n\n  /**\n   * Evaluates a single condition against the provided context.\n   *\n   * @private\n   * @param condition - The condition to evaluate\n   * @param context - Context to evaluate against\n   * @returns true if the condition matches\n   */\n  private evaluateCondition(\n    condition: FeatureFlagCondition,\n    context?: FeatureFlagContext\n  ): boolean {\n    if (!context) return false;\n\n    const contextValue = ContextUtils.getContextValue(condition.field, context);\n    if (contextValue === undefined) return false;\n\n    return evaluateConditionOperator(condition, contextValue);\n  }\n\n  /**\n   * Logs debug information if logging is enabled.\n   *\n   * @private\n   * @param args - Arguments to log\n   */\n  private log(...args: unknown[]): void {\n    if (this.isLoggingEnabled) {\n      this.logger.debug(args.map(arg => String(arg)).join(' '));\n    }\n  }\n}\n","/**\n * Feature Flag Context Utilities\n *\n * Utilities for building, validating, and manipulating feature flag contexts.\n *\n * @fileoverview Feature flag context utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagContext } from '@plyaz/types';\nimport { ISO_STANDARDS } from '@plyaz/config';\n\n/**\n * Builder class for creating feature flag evaluation contexts.\n * Provides a fluent interface for setting context properties.\n *\n * @class FeatureFlagContextBuilder\n *\n * @example\n * ```typescript\n * const context = new FeatureFlagContextBuilder()\n *   .setUserId('user123')\n *   .setUserRole('premium')\n *   .setEnvironment('production')\n *   .setPlatform('web')\n *   .setCustom({ subscription: 'premium', betaTester: true })\n *   .build();\n * ```\n */\nexport class FeatureFlagContextBuilder {\n  private context: Partial<FeatureFlagContext> = {};\n\n  /**\n   * Sets the user ID in the context.\n   *\n   * @param userId - User identifier\n   * @returns Builder instance for chaining\n   */\n  setUserId(userId: string): this {\n    this.context.userId = userId;\n    return this;\n  }\n\n  /**\n   * Sets the user email in the context.\n   *\n   * @param userEmail - User email address\n   * @returns Builder instance for chaining\n   */\n  setUserEmail(userEmail: string): this {\n    this.context.userEmail = userEmail;\n    return this;\n  }\n\n  /**\n   * Sets the user role in the context.\n   *\n   * @param userRole - User role or permission level\n   * @returns Builder instance for chaining\n   */\n  setUserRole(userRole: string): this {\n    this.context.userRole = userRole;\n    return this;\n  }\n\n  /**\n   * Sets the country in the context.\n   *\n   * @param country - Country code (ISO 3166-1 alpha-2)\n   * @returns Builder instance for chaining\n   */\n  setCountry(country: string): this {\n    this.context.country = country;\n    return this;\n  }\n\n  /**\n   * Sets the platform in the context.\n   *\n   * @param platform - Platform type\n   * @returns Builder instance for chaining\n   */\n  setPlatform(platform: 'web' | 'mobile' | 'desktop'): this {\n    this.context.platform = platform;\n    return this;\n  }\n\n  /**\n   * Sets the version in the context.\n   *\n   * @param version - Application version\n   * @returns Builder instance for chaining\n   */\n  setVersion(version: string): this {\n    this.context.version = version;\n    return this;\n  }\n\n  /**\n   * Sets the environment in the context.\n   *\n   * @param environment - Current environment\n   * @returns Builder instance for chaining\n   */\n  setEnvironment(environment: 'development' | 'staging' | 'production'): this {\n    this.context.environment = environment;\n    return this;\n  }\n\n  /**\n   * Sets custom context data.\n   *\n   * @param custom - Custom context properties\n   * @returns Builder instance for chaining\n   */\n  setCustom(custom: Record<string, unknown>): this {\n    this.context.custom = { ...this.context.custom, ...custom };\n    return this;\n  }\n\n  /**\n   * Adds a single custom property to the context.\n   *\n   * @param key - Custom property key\n   * @param value - Custom property value\n   * @returns Builder instance for chaining\n   */\n  addCustomProperty(key: string, value: unknown): this {\n    this.context.custom ??= {};\n    this.context.custom[key] = value;\n    return this;\n  }\n\n  /**\n   * Builds the final context object.\n   * Validates required fields and returns the context.\n   *\n   * @returns Complete feature flag context\n   * @throws Error if required environment is not set\n   */\n  build(): FeatureFlagContext {\n    return {\n      environment: this.context.environment ?? 'development',\n      userId: this.context.userId,\n      userEmail: this.context.userEmail,\n      userRole: this.context.userRole,\n      country: this.context.country,\n      platform: this.context.platform,\n      version: this.context.version,\n      custom: this.context.custom,\n    } satisfies FeatureFlagContext;\n  }\n\n  /**\n   * Clears all context data and resets the builder.\n   *\n   * @returns Builder instance for chaining\n   */\n  clear(): this {\n    this.context = {};\n    return this;\n  }\n\n  /**\n   * Creates a copy of the current builder state.\n   *\n   * @returns New builder instance with copied context\n   */\n  clone(): FeatureFlagContextBuilder {\n    const cloned = new FeatureFlagContextBuilder();\n    cloned.context = { ...this.context };\n    if (this.context.custom) {\n      cloned.context.custom = { ...this.context.custom };\n    }\n    return cloned;\n  }\n}\n\n/**\n * Context utilities for common scenarios.\n */\nexport const ContextUtils = {\n  /**\n   * Creates a basic context for anonymous users using the builder.\n   *\n   * @param environment - Target environment\n   * @param platform - User platform\n   * @returns Basic anonymous context\n   */\n  createAnonymousContext(\n    environment: 'development' | 'staging' | 'production',\n    platform: 'web' | 'mobile' | 'desktop' = 'web'\n  ): FeatureFlagContext {\n    return new FeatureFlagContextBuilder()\n      .setEnvironment(environment)\n      .setPlatform(platform)\n      .build();\n  },\n\n  /**\n   * Creates a context for authenticated users using the builder.\n   *\n   * @param params - User context parameters\n   * @returns User context\n   */\n  createUserContext(params: {\n    userId: string;\n    environment: 'development' | 'staging' | 'production';\n    userEmail?: string;\n    userRole?: string;\n    platform?: 'web' | 'mobile' | 'desktop';\n    country?: string;\n    version?: string;\n    custom?: Record<string, unknown>;\n  }): FeatureFlagContext {\n    const builder = new FeatureFlagContextBuilder()\n      .setUserId(params.userId)\n      .setEnvironment(params.environment);\n\n    if (params.userEmail) builder.setUserEmail(params.userEmail);\n    if (params.userRole) builder.setUserRole(params.userRole);\n    if (params.platform) builder.setPlatform(params.platform);\n    if (params.country) builder.setCountry(params.country);\n    if (params.version) builder.setVersion(params.version);\n    if (params.custom) builder.setCustom(params.custom);\n\n    return builder.build();\n  },\n\n  /**\n   * Creates a testing context with minimal required fields.\n   *\n   * @param overrides - Optional context overrides\n   * @returns Testing context\n   */\n  createTestingContext(overrides: Partial<FeatureFlagContext> = {}): FeatureFlagContext {\n    return {\n      environment: 'development',\n      platform: 'web',\n      ...overrides,\n    };\n  },\n\n  /**\n   * Validates if a context object is complete and valid.\n   *\n   * @param context - Context to validate\n   * @returns Validation result\n   */\n  validateContext(context: Partial<FeatureFlagContext>): {\n    isValid: boolean;\n    errors: string[];\n  } {\n    const errors: string[] = [];\n\n    if (!context.environment) {\n      errors.push('Environment is required');\n    } else if (!['development', 'staging', 'production'].includes(context.environment)) {\n      errors.push('Environment must be development, staging, or production');\n    }\n\n    if (context.platform && !['web', 'mobile', 'desktop'].includes(context.platform)) {\n      errors.push('Platform must be web, mobile, or desktop');\n    }\n\n    if (context.country && context.country.length !== ISO_STANDARDS.ISO_COUNTRY_CODE_LENGTH) {\n      errors.push('Country must be a 2-letter ISO country code');\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n    };\n  },\n\n  /**\n   * Merges multiple context objects, with later contexts taking precedence.\n   *\n   * @param contexts - Array of contexts to merge\n   * @returns Merged context\n   */\n  mergeContexts(...contexts: Partial<FeatureFlagContext>[]): FeatureFlagContext {\n    const merged = contexts.reduce((acc, context) => {\n      const result = {\n        ...acc,\n        ...context,\n      };\n\n      // Only merge custom if either has it\n      if (acc.custom || context.custom) {\n        result.custom = {\n          ...acc.custom,\n          ...context.custom,\n        };\n      }\n\n      return result;\n    }, {} as Partial<FeatureFlagContext>);\n\n    merged.environment ??= 'development';\n\n    return merged as FeatureFlagContext;\n  },\n\n  /**\n   * Extracts a specific field value from a context.\n   *\n   * @param field - Field name to extract\n   * @param context - Context object\n   * @returns Field value or undefined\n   */\n  getContextValue(field: string, context: FeatureFlagContext): unknown {\n    const standardFields = {\n      userId: (ctx: FeatureFlagContext) => ctx.userId,\n      userEmail: (ctx: FeatureFlagContext) => ctx.userEmail,\n      userRole: (ctx: FeatureFlagContext) => ctx.userRole,\n      country: (ctx: FeatureFlagContext) => ctx.country,\n      platform: (ctx: FeatureFlagContext) => ctx.platform,\n      version: (ctx: FeatureFlagContext) => ctx.version,\n      environment: (ctx: FeatureFlagContext) => ctx.environment,\n      custom: (ctx: FeatureFlagContext) => ctx.custom,\n    };\n\n    if (field in standardFields) {\n      return standardFields[field as keyof typeof standardFields](context);\n    }\n\n    return context.custom?.[field];\n  },\n\n  /**\n   * Creates a context fingerprint for caching and consistency.\n   *\n   * @param context - Context to fingerprint\n   * @returns String fingerprint\n   */\n  createFingerprint(context: FeatureFlagContext): string {\n    const relevant = {\n      userId: context.userId,\n      userRole: context.userRole,\n      environment: context.environment,\n      platform: context.platform,\n      country: context.country,\n      version: context.version,\n      custom: context.custom,\n    };\n\n    // Filter out undefined values and sort keys for consistency\n    const filtered = Object.entries(relevant)\n      .filter(([, value]) => value !== undefined)\n      .sort(([a], [b]) => a.localeCompare(b))\n      .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});\n\n    return JSON.stringify(filtered);\n  },\n\n  /**\n   * Sanitizes a context by removing sensitive information.\n   *\n   * @param context - Context to sanitize\n   * @param sensitiveFields - Fields to remove (default: ['userEmail'])\n   * @returns Sanitized context\n   */\n  sanitizeContext(\n    context: FeatureFlagContext,\n    sensitiveFields: string[] = ['userEmail']\n  ): FeatureFlagContext {\n    const sanitized = { ...context };\n\n    // Deep copy custom object if it exists\n    if (context.custom) {\n      sanitized.custom = { ...context.custom };\n    }\n\n    for (const field of sensitiveFields) {\n      if (field in sanitized) {\n        delete (sanitized as Record<string, unknown>)[field];\n      }\n      if (sanitized.custom && field in sanitized.custom) {\n        delete sanitized.custom[field];\n      }\n    }\n\n    return sanitized;\n  },\n} as const;\n\n/**\n * Utility for creating feature flag context for backend applications.\n *\n * @param params - Context parameters\n * @returns Backend-optimized feature flag context\n */\nexport function createBackendContext(params: {\n  userId?: string;\n  userEmail?: string;\n  environment: 'development' | 'staging' | 'production';\n  userRole?: string;\n  platform?: 'api' | 'worker' | 'cron';\n  country?: string;\n  version?: string;\n  custom?: Record<string, unknown>;\n}): {\n  environment: 'development' | 'staging' | 'production';\n  userId?: string;\n  userEmail?: string;\n  userRole?: string;\n  platform: 'api' | 'worker' | 'cron';\n  country?: string;\n  version?: string;\n  custom?: Record<string, unknown>;\n} {\n  return {\n    environment: params.environment,\n    userId: params.userId,\n    userEmail: params.userEmail,\n    userRole: params.userRole,\n    platform: params.platform ?? 'api',\n    country: params.country,\n    version: params.version,\n    custom: params.custom,\n  };\n}\n\n/**\n * Utility for creating feature flag context for frontend applications.\n *\n * @param params - Context parameters\n * @returns Frontend-optimized feature flag context\n */\nexport function createFrontendContext(params: {\n  userId?: string;\n  userEmail?: string;\n  environment: 'development' | 'staging' | 'production';\n  userRole?: string;\n  platform?: 'web' | 'mobile' | 'desktop';\n  country?: string;\n  version?: string;\n  custom?: Record<string, unknown>;\n}): {\n  environment: 'development' | 'staging' | 'production';\n  userId?: string;\n  userEmail?: string;\n  userRole?: string;\n  platform: 'web' | 'mobile' | 'desktop';\n  country?: string;\n  version?: string;\n  custom?: Record<string, unknown>;\n} {\n  return {\n    environment: params.environment,\n    userId: params.userId,\n    userEmail: params.userEmail,\n    userRole: params.userRole,\n    platform: params.platform ?? 'web',\n    country: params.country,\n    version: params.version,\n    custom: params.custom,\n  };\n}\n","/**\n * Feature Flag Condition Utilities\n *\n * Utilities for evaluating feature flag conditions and rules.\n *\n * @fileoverview Condition evaluation utilities\n * @version 1.0.0\n */\n\nimport type { FeatureFlagCondition } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\n\n/**\n * Evaluates condition operator against context value.\n *\n * @param condition - The condition to evaluate\n * @param contextValue - The context value to check against\n * @returns true if the condition matches\n */\nexport function evaluateConditionOperator(\n  condition: FeatureFlagCondition,\n  contextValue: unknown\n): boolean {\n  const { operator } = condition;\n\n  if (isEqualityOperator(operator)) {\n    return evaluateEqualityOperator(operator, contextValue, condition.value);\n  }\n\n  if (isStringOperator(operator)) {\n    return evaluateStringOperator(operator, contextValue, condition.value);\n  }\n\n  if (isArrayOperator(operator)) {\n    return evaluateArrayOperator(operator, condition.value, contextValue);\n  }\n\n  if (isNumericOperator(operator)) {\n    return evaluateNumericOperator(operator, contextValue, condition.value);\n  }\n\n  return false;\n}\n\n/**\n * Checks if operator is equality-based.\n *\n * @param operator - The operator to check\n * @returns true if equality operator\n */\nexport function isEqualityOperator(operator: string): boolean {\n  return operator === 'equals' || operator === 'not_equals';\n}\n\n/**\n * Checks if operator is string-based.\n *\n * @param operator - The operator to check\n * @returns true if string operator\n */\nexport function isStringOperator(operator: string): boolean {\n  return operator === 'contains' || operator === 'not_contains';\n}\n\n/**\n * Checks if operator is array-based.\n *\n * @param operator - The operator to check\n * @returns true if array operator\n */\nexport function isArrayOperator(operator: string): boolean {\n  return operator === 'in' || operator === 'not_in';\n}\n\n/**\n * Checks if operator is numeric-based.\n *\n * @param operator - The operator to check\n * @returns true if numeric operator\n */\nexport function isNumericOperator(operator: string): boolean {\n  return operator === 'greater_than' || operator === 'less_than';\n}\n\n/**\n * Evaluates equality operators.\n *\n * @param operator - equals or not_equals\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateEqualityOperator(\n  operator: string,\n  contextValue: unknown,\n  conditionValue: unknown\n): boolean {\n  const isEqual = contextValue === conditionValue;\n  return operator === 'equals' ? isEqual : !isEqual;\n}\n\n/**\n * Evaluates string operators.\n *\n * @param operator - contains or not_contains\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nexport function evaluateStringOperator(\n  operator: string,\n  contextValue: unknown,\n  conditionValue: unknown\n): boolean {\n  // Handle string contains\n  if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n    const contains = contextValue.includes(conditionValue);\n    return operator === 'contains' ? contains : !contains;\n  }\n\n  // Handle array contains\n  if (Array.isArray(contextValue) && typeof conditionValue === 'string') {\n    const contains = contextValue.includes(conditionValue);\n    return operator === 'contains' ? contains : !contains;\n  }\n\n  // For not_contains, if neither string nor array match, return true\n  return operator === 'not_contains';\n}\n\n/**\n * Evaluates array operators.\n *\n * @param operator - in or not_in\n * @param conditionValue - Array value from condition\n * @param contextValue - Value from context\n * @returns Evaluation result\n */\nexport function evaluateArrayOperator(\n  operator: string,\n  conditionValue: unknown,\n  contextValue: unknown\n): boolean {\n  if (!Array.isArray(conditionValue)) {\n    // For not_in operator, if condition value is not an array, return true\n    return operator === 'not_in';\n  }\n\n  const isIncluded = conditionValue.includes(contextValue);\n  return operator === 'in' ? isIncluded : !isIncluded;\n}\n\n/**\n * Evaluates numeric operators.\n *\n * @param operator - greater_than or less_than\n * @param contextValue - Value from context\n * @param conditionValue - Value from condition\n * @returns Evaluation result\n */\nfunction compareValues<T>(operator: string, left: T, right: T): boolean {\n  switch (operator) {\n    case 'greater_than':\n      return left > right;\n    case 'less_than':\n      return left < right;\n    default:\n      return false;\n  }\n}\n\nexport function evaluateNumericOperator(\n  operator: string,\n  contextValue: unknown,\n  conditionValue: unknown\n): boolean {\n  // Try numeric comparison first\n  const contextNum = Number(contextValue);\n  const conditionNum = Number(conditionValue);\n\n  if (!isNaN(contextNum) && !isNaN(conditionNum)) {\n    return compareValues(operator, contextNum, conditionNum);\n  }\n\n  // Fall back to string comparison for non-numeric values\n  if (typeof contextValue === 'string' && typeof conditionValue === 'string') {\n    return compareValues(operator, contextValue, conditionValue);\n  }\n\n  return false;\n}\n\n/**\n * Condition evaluation utilities.\n */\nexport const ConditionUtils = {\n  /**\n   * Evaluates multiple conditions with AND logic.\n   *\n   * @param conditions - Array of conditions\n   * @param contextValue - Context value getter function\n   * @returns true if all conditions match\n   */\n  evaluateConditionsAnd: (\n    conditions: FeatureFlagCondition[],\n    contextValue: (field: string) => unknown\n  ): boolean => {\n    if (conditions.length === 0) return true;\n\n    return conditions.every(condition => {\n      const value = contextValue(condition.field);\n      if (value === undefined) return false;\n      return evaluateConditionOperator(condition, value);\n    });\n  },\n\n  /**\n   * Evaluates multiple conditions with OR logic.\n   *\n   * @param conditions - Array of conditions\n   * @param contextValue - Context value getter function\n   * @returns true if any condition matches\n   */\n  evaluateConditionsOr: (\n    conditions: FeatureFlagCondition[],\n    contextValue: (field: string) => unknown\n  ): boolean => {\n    if (conditions.length === 0) return true;\n\n    return conditions.some(condition => {\n      const value = contextValue(condition.field);\n      if (value === undefined) return false;\n      return evaluateConditionOperator(condition, value);\n    });\n  },\n\n  /**\n   * Validates a condition structure.\n   *\n   * @param condition - Condition to validate\n   * @returns Validation result\n   */\n  validateCondition: (\n    condition: Partial<FeatureFlagCondition>\n  ): {\n    isValid: boolean;\n    errors: string[];\n  } => {\n    const errors: string[] = [];\n\n    if (!condition.field) {\n      errors.push('Field is required');\n    }\n\n    if (!condition.operator) {\n      errors.push('Operator is required');\n    } else {\n      const validOperators = [\n        'equals',\n        'not_equals',\n        'contains',\n        'not_contains',\n        'in',\n        'not_in',\n        'greater_than',\n        'less_than',\n      ];\n      if (!validOperators.includes(condition.operator)) {\n        errors.push(`Invalid operator: ${condition.operator}`);\n      }\n    }\n\n    if (condition.value === undefined) {\n      errors.push('Value is required');\n    }\n\n    return {\n      isValid: errors.length === 0,\n      errors,\n    };\n  },\n\n  /**\n   * Creates a condition object with validation.\n   *\n   * @param field - Context field to evaluate\n   * @param operator - Comparison operator\n   * @param value - Value to compare against\n   * @returns Valid condition object\n   */\n  createCondition: (\n    field: string,\n    operator: FeatureFlagCondition['operator'],\n    value: FeatureFlagCondition['value']\n  ): FeatureFlagCondition => {\n    const condition = { field, operator, value } as FeatureFlagCondition;\n    const validation = ConditionUtils.validateCondition(condition);\n\n    if (!validation.isValid) {\n      throw new CorePackageError(\n        `Invalid condition: ${validation.errors.join(', ')}`,\n        ERROR_CODES.VALIDATION_ERROR\n      );\n    }\n\n    return condition;\n  },\n} as const;\n","/**\n * Utilities Exports\n */\n\n// Common utilities\nexport * from './common';\n\n// Feature flag utilities\nexport * from './featureFlags';\n\n// Runtime utilities\nexport * from './runtime';\n\n// File operation utilities\nexport * from './files';\n\n// Mapper utilities\nexport * from './mapperUtils';\n\n// HMR-safe singleton helper\nexport { createHmrSafeSingleton } from './hmr-singleton';\nexport type { HmrSingletonOptions, HmrSingletonAccessor } from './hmr-singleton';\n","/**\n * ============================================================================\n * FILE OPERATION UTILITIES\n * ============================================================================\n *\n * Framework-agnostic utilities for common file operations:\n * - Base64 encoding/decoding\n * - Blob creation and download triggering\n * - File key parsing\n * - Filename generation\n *\n * These utilities work in both browser and Node.js environments.\n */\n\nimport {\n  MIME_TYPE_EXTENSIONS,\n  FILE_SIZE_UNITS,\n  FILE_SIZE_MULTIPLIERS,\n  type ParsedFileKey,\n} from '@plyaz/types/core';\n\n// File key path segment counts\nconst FILE_KEY_FULL_PATH_SEGMENTS = 4;\nconst FILE_KEY_THREE_SEGMENTS = 3;\nconst FILE_KEY_TWO_SEGMENTS = 2;\nconst MIME_TYPE_PARTS = 2;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BASE64 CONVERSION\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Convert a File to base64 string (browser only).\n *\n * @param file - The File object to convert\n * @returns Promise resolving to base64 encoded string (without data URL prefix)\n *\n * @example\n * ```typescript\n * const base64 = await fileToBase64(file);\n * // Use for API upload\n * ```\n */\nexport function fileToBase64(file: File): Promise<string> {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      const result = reader.result as string;\n      // Remove data URL prefix (e.g., \"data:application/pdf;base64,\")\n      const base64 = result.split(',')[1] || result;\n      resolve(base64);\n    };\n    reader.onerror = () => reject(reader.error);\n    reader.readAsDataURL(file);\n  });\n}\n\n/**\n * Convert a base64 string to a Blob (browser only).\n *\n * @param base64 - The base64 encoded string\n * @param mimeType - The MIME type for the blob (default: 'application/octet-stream')\n * @returns A Blob containing the decoded data\n *\n * @example\n * ```typescript\n * const blob = base64ToBlob(downloadResult.buffer, 'application/pdf');\n * downloadBlob(blob, 'document.pdf');\n * ```\n */\nexport function base64ToBlob(base64: string, mimeType = 'application/octet-stream'): Blob {\n  const binary = atob(base64);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i++) {\n    bytes[i] = binary.charCodeAt(i);\n  }\n  return new Blob([bytes], { type: mimeType });\n}\n\n/**\n * Convert a base64 string to a Buffer (Node.js only).\n *\n * @param base64 - The base64 encoded string\n * @returns A Buffer containing the decoded data\n *\n * @example\n * ```typescript\n * const buffer = base64ToBuffer(encodedData);\n * fs.writeFileSync('output.pdf', buffer);\n * ```\n */\nexport function base64ToBuffer(base64: string): Buffer {\n  return Buffer.from(base64, 'base64');\n}\n\n/**\n * Convert a Buffer or Uint8Array to a base64 string.\n *\n * @param data - The binary data to encode\n * @returns The base64 encoded string\n *\n * @example\n * ```typescript\n * const base64 = bufferToBase64(fileBuffer);\n * ```\n */\nexport function bufferToBase64(data: Buffer | Uint8Array): string {\n  if (Buffer.isBuffer(data)) {\n    return data.toString('base64');\n  }\n  return Buffer.from(data).toString('base64');\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BROWSER DOWNLOAD\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Trigger a browser download of a Blob.\n *\n * Creates a temporary anchor element to trigger the download,\n * then cleans up the object URL.\n *\n * @param blob - The Blob to download\n * @param filename - The filename to save as\n *\n * @example\n * ```typescript\n * const blob = base64ToBlob(data, 'application/pdf');\n * downloadBlob(blob, 'invoice.pdf');\n * ```\n */\nexport function downloadBlob(blob: Blob, filename: string): void {\n  // Browser-only function - check if we're in a browser environment\n  const win = globalThis as typeof globalThis & { document?: Document };\n  if (!win.document) return;\n\n  const url = URL.createObjectURL(blob);\n  const a = win.document.createElement('a');\n  a.href = url;\n  a.download = filename;\n  win.document.body.appendChild(a);\n  a.click();\n  win.document.body.removeChild(a);\n  URL.revokeObjectURL(url);\n}\n\n/**\n * Download a base64-encoded file in the browser.\n * Combines base64ToBlob and downloadBlob for convenience.\n *\n * @param base64 - The base64 encoded data\n * @param filename - The filename to save as\n * @param mimeType - The MIME type (default: 'application/octet-stream')\n *\n * @example\n * ```typescript\n * downloadBase64(response.data, 'report.pdf', 'application/pdf');\n * ```\n */\nexport function downloadBase64(\n  base64: string,\n  filename: string,\n  mimeType = 'application/octet-stream'\n): void {\n  const blob = base64ToBlob(base64, mimeType);\n  downloadBlob(blob, filename);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILE KEY PARSING\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse a storage file key into its components.\n *\n * Supports various key formats:\n * - `entityType/entityId/category/filename`\n * - `entityType/entityId/filename`\n * - `category/filename`\n * - `filename`\n *\n * @param key - The storage key to parse\n * @returns Parsed components\n *\n * @example\n * ```typescript\n * const parsed = parseFileKey('user/123/documents/invoice.pdf');\n * // { entityType: 'user', entityId: '123', category: 'documents', filename: 'invoice.pdf' }\n * ```\n */\nexport function parseFileKey(key: string): ParsedFileKey {\n  const parts = key.split('/');\n  const result: ParsedFileKey = { raw: key };\n\n  if (parts.length >= FILE_KEY_FULL_PATH_SEGMENTS) {\n    // Full path: entityType/entityId/category/filename\n    result.entityType = parts[0];\n    result.entityId = parts[1];\n    result.category = parts[2];\n    result.filename = parts.slice(FILE_KEY_THREE_SEGMENTS).join('/');\n  } else if (parts.length === FILE_KEY_THREE_SEGMENTS) {\n    // entityType/entityId/filename or category/subcategory/filename\n    result.entityType = parts[0];\n    result.entityId = parts[1];\n    result.filename = parts[FILE_KEY_TWO_SEGMENTS];\n  } else if (parts.length === FILE_KEY_TWO_SEGMENTS) {\n    // category/filename\n    result.category = parts[0];\n    result.filename = parts[1];\n  } else {\n    // Just filename\n    result.filename = parts[0];\n  }\n\n  return result;\n}\n\n/**\n * Extract just the filename from a file key or path.\n *\n * @param key - The file key or path\n * @returns The filename portion\n *\n * @example\n * ```typescript\n * getFilenameFromKey('user/123/docs/invoice.pdf'); // 'invoice.pdf'\n * ```\n */\nexport function getFilenameFromKey(key: string): string {\n  return key.split('/').pop() ?? key;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILENAME GENERATION\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generate a filename from a template ID and output format.\n *\n * @param templateId - The template ID (may include path separators)\n * @param outputFormat - The desired output format (e.g., 'pdf', 'docx')\n * @returns A generated filename\n *\n * @example\n * ```typescript\n * generateFilename('invoices/default', 'pdf');\n * // 'default.pdf'\n * ```\n */\nexport function generateFilename(templateId: string, outputFormat: string): string {\n  const baseName = templateId.split('/').pop() ?? 'document';\n  return `${baseName}.${outputFormat}`;\n}\n\n/**\n * Generate a unique filename with timestamp.\n *\n * @param prefix - Filename prefix (default: 'file')\n * @param extension - File extension (default: 'bin')\n * @returns A unique filename\n *\n * @example\n * ```typescript\n * generateUniqueFilename('download', 'pdf');\n * // 'download-1704067200000.pdf'\n * ```\n */\nexport function generateUniqueFilename(prefix = 'file', extension = 'bin'): string {\n  return `${prefix}-${Date.now()}.${extension}`;\n}\n\n/**\n * Infer file extension from MIME type.\n *\n * @param mimeType - The MIME type\n * @returns The inferred extension (without dot)\n *\n * @example\n * ```typescript\n * inferExtensionFromMimeType('application/pdf'); // 'pdf'\n * inferExtensionFromMimeType('image/png'); // 'png'\n * ```\n */\nexport function inferExtensionFromMimeType(mimeType: string): string {\n  // Check exact match first using shared constants\n  if (MIME_TYPE_EXTENSIONS[mimeType]) {\n    return MIME_TYPE_EXTENSIONS[mimeType];\n  }\n\n  // Fallback: try to extract from mime type (e.g., 'image/png' -> 'png')\n  const parts = mimeType.split('/');\n  if (parts.length === MIME_TYPE_PARTS) {\n    return parts[1].split(';')[0].trim();\n  }\n\n  return 'bin';\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FILE SIZE FORMATTING\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Format file size in human-readable format.\n *\n * @param bytes - Size in bytes\n * @param decimals - Number of decimal places (default: 2)\n * @returns Formatted size string\n *\n * @example\n * ```typescript\n * formatFileSize(1024); // '1 KB'\n * formatFileSize(1536000); // '1.46 MB'\n * ```\n */\nexport function formatFileSize(bytes: number, decimals = 2): string {\n  if (bytes === 0) return '0 Bytes';\n\n  const k = 1024;\n  const dm = decimals < 0 ? 0 : decimals;\n\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  const size = Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n\n  return `${size} ${FILE_SIZE_UNITS[i]}`;\n}\n\n/**\n * Parse a human-readable file size to bytes.\n *\n * @param sizeString - Size string (e.g., '1.5 MB', '100KB')\n * @returns Size in bytes\n *\n * @example\n * ```typescript\n * parseFileSize('1.5 MB'); // 1572864\n * parseFileSize('100KB'); // 102400\n * ```\n */\nexport function parseFileSize(sizeString: string): number {\n  const match = sizeString.trim().match(/^([\\d.]+)\\s*([A-Z]+)$/i);\n  if (!match) {\n    return Number.parseInt(sizeString, 10) || 0;\n  }\n\n  const value = Number.parseFloat(match[1]);\n  const unit = match[2].toUpperCase();\n\n  return Math.round(value * (FILE_SIZE_MULTIPLIERS[unit] ?? 1));\n}\n","/**\n * HMR-Safe Singleton Helper\n *\n * Creates singletons that persist across Next.js Hot Module Replacement (HMR).\n * Uses globalThis to store state so it survives code reloads in development.\n *\n * @example Core initialization\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import { Core, backendConfig } from '@plyaz/core/backend';\n *\n * export const getServerCore = createHmrSafeSingleton('core', async () => {\n *   await Core.initialize(backendConfig);\n *   return Core;\n * });\n *\n * // Usage in API routes\n * export async function GET() {\n *   const core = await getServerCore();\n *   // core.db, core.cache, etc.\n * }\n * ```\n *\n * @example Database connection\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import { drizzle } from 'drizzle-orm/postgres-js';\n * import postgres from 'postgres';\n *\n * export const getDb = createHmrSafeSingleton('db', async () => {\n *   const client = postgres(process.env.DATABASE_URL);\n *   return drizzle(client);\n * });\n * ```\n *\n * @example Cache client\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n * import Redis from 'ioredis';\n *\n * export const getRedis = createHmrSafeSingleton('redis', async () => {\n *   return new Redis(process.env.REDIS_URL);\n * });\n * ```\n */\n\nimport type { HmrSingletonOptions, HmrSingletonAccessor } from '@plyaz/types/core';\n\n// Re-export types for convenience\nexport type { HmrSingletonOptions, HmrSingletonAccessor } from '@plyaz/types/core';\n\n// Global storage key prefix\nconst GLOBAL_PREFIX = '__plyaz_hmr_singleton__';\n\n/**\n * Type guard to check if an object has a reset method\n */\nfunction hasResetMethod(obj: unknown): obj is { reset: () => Promise<void> } {\n  return (\n    typeof obj === 'object' &&\n    obj !== null &&\n    'reset' in obj &&\n    typeof (obj as Record<string, unknown>).reset === 'function'\n  );\n}\n\n/**\n * Create an HMR-safe singleton accessor.\n *\n * The singleton will persist across Next.js Hot Module Replacement in development,\n * preventing re-initialization on every code change.\n *\n * @param key - Unique key for this singleton (e.g., 'core', 'db', 'redis')\n * @param initializer - Async function that creates the singleton instance\n * @param options - Optional callbacks for lifecycle events\n * @returns Accessor function and utilities\n *\n * @example\n * ```typescript\n * import { createHmrSafeSingleton } from '@plyaz/core/utils';\n *\n * const getCore = createHmrSafeSingleton('core', async () => {\n *   await Core.initialize(config);\n *   return Core;\n * });\n *\n * // In your API route or server component:\n * const core = await getCore();\n *\n * // Check if initialized:\n * if (getCore.isInitialized()) {\n *   // Already initialized\n * }\n *\n * // Reset (for testing):\n * await getCore.reset();\n * ```\n */\nexport function createHmrSafeSingleton<T>(\n  key: string,\n  initializer: () => Promise<T>,\n  options: HmrSingletonOptions = {}\n): HmrSingletonAccessor<T> {\n  const { onInitialized, onError, onReset } = options;\n\n  // Create unique global keys\n  const instanceKey = `${GLOBAL_PREFIX}${key}_instance`;\n  const promiseKey = `${GLOBAL_PREFIX}${key}_promise`;\n  const initializedKey = `${GLOBAL_PREFIX}${key}_initialized`;\n\n  // Type-safe global access\n  const g = globalThis as unknown as Record<string, unknown>;\n\n  // Helper functions for state management\n  function getInstance(): T | undefined {\n    return g[instanceKey] as T | undefined;\n  }\n\n  function setInstance(instance: T): void {\n    g[instanceKey] = instance;\n  }\n\n  function clearInstance(): void {\n    delete g[instanceKey];\n  }\n\n  function getPromise(): Promise<T> | undefined {\n    return g[promiseKey] as Promise<T> | undefined;\n  }\n\n  function setPromise(promise: Promise<T> | null): void {\n    if (promise === null) {\n      delete g[promiseKey];\n    } else {\n      g[promiseKey] = promise;\n    }\n  }\n\n  function isInit(): boolean {\n    return g[initializedKey] === true;\n  }\n\n  function setInit(value: boolean): void {\n    g[initializedKey] = value;\n  }\n\n  /**\n   * Get the singleton instance, initializing if necessary\n   */\n  async function accessor(): Promise<T> {\n    // Already initialized - return cached instance\n    if (isInit()) {\n      const instance = getInstance();\n      if (instance !== undefined) {\n        return instance;\n      }\n    }\n\n    // Initialization in progress - wait for it\n    const existingPromise = getPromise();\n    if (existingPromise) {\n      return existingPromise;\n    }\n\n    // Start initialization\n    const initPromise = (async () => {\n      try {\n        const instance = await initializer();\n        setInstance(instance);\n        setInit(true);\n        onInitialized?.();\n        return instance;\n      } catch (err) {\n        // Reset on failure so next call can retry\n        setPromise(null);\n        const error = err instanceof Error ? err : new Error(String(err));\n        onError?.(error);\n        throw error;\n      }\n    })();\n\n    setPromise(initPromise);\n    return initPromise;\n  }\n\n  /**\n   * Check if the singleton is initialized\n   */\n  accessor.isInitialized = (): boolean => isInit();\n\n  /**\n   * Reset the singleton (for testing or cleanup)\n   */\n  accessor.reset = async (): Promise<void> => {\n    if (isInit()) {\n      // Call cleanup if the instance has a reset method\n      const instance = getInstance();\n      if (hasResetMethod(instance)) {\n        await instance.reset();\n      }\n\n      clearInstance();\n      setInit(false);\n      setPromise(null);\n      onReset?.();\n    }\n  };\n\n  return accessor;\n}\n","/**\n * Package version - single source of truth\n *\n * Reads version from package.json to ensure consistency across:\n * - Health check endpoints\n * - API headers (X-Version)\n * - Observability tags\n * - Logging metadata\n */\n\nimport { createRequire } from 'node:module';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\nimport { readFileSync } from 'node:fs';\n\nlet cachedVersion: string = '';\n\n/**\n * Get the package version from package.json\n * Caches the result for subsequent calls\n */\nexport function getPackageVersion(): string {\n  if (cachedVersion) return cachedVersion;\n\n  try {\n    // Try ESM approach first\n    const require = createRequire(import.meta.url);\n    const pkg = require('../package.json');\n    cachedVersion = pkg.version ?? '0.0.0';\n  } catch {\n    try {\n      // Fallback: read file directly\n      const currentFile = fileURLToPath(import.meta.url);\n      const currentDir = dirname(currentFile);\n      const pkgPath = join(currentDir, '..', 'package.json');\n      const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n      cachedVersion = pkg.version ?? '0.0.0';\n    } catch {\n      // Last resort fallback\n      cachedVersion = '0.0.0';\n    }\n  }\n\n  return cachedVersion;\n}\n\n/**\n * Package version constant\n * Use this for static contexts where async/dynamic loading isn't needed\n */\nexport const VERSION = getPackageVersion();\n\n/**\n * Package name\n */\nexport const PACKAGE_NAME = '@plyaz/core';\n","/**\n * Configuration exports\n *\n * @module config\n */\n\n// Dependencies injection (for custom backend setups)\nexport {\n  setCoreDependencies,\n  getCoreDependencies,\n  hasCoreDependency,\n  getCoreDependency,\n  clearCoreDependencies,\n  type CoreDependencies,\n} from './dependencies';\n","/**\n * Example Controller\n *\n * Simple NestJS controller demonstrating Core + BackendExampleDomainService integration.\n * Use as reference for building your own backend modules.\n *\n * Demonstrates:\n * - Standard CRUD operations with error handling\n * - Single error throwing (standard pattern)\n * - Array error throwing (multiple validation errors)\n * - Standard API response format using SuccessResponseStandard\n * - How errors are automatically captured and returned as ErrorResponse\n */\n\nimport {\n  Controller,\n  Get,\n  Post,\n  Patch,\n  Delete,\n  Body,\n  Param,\n  HttpCode,\n  HttpStatus,\n  Inject,\n} from '@nestjs/common';\nimport { ApiTags, ApiOperation, ApiBody, ApiParam, ApiResponse } from '@nestjs/swagger';\nimport { BackendExampleDomainService } from '../../domain/example';\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport type { ExampleEntity, CreateExampleDTO, PatchExampleDTO } from '@plyaz/types/examples';\nimport type { ReturnResponseType } from '@plyaz/types/errors';\nimport type {\n  SendEmailParams,\n  NotificationResult,\n  NotificationResponse,\n} from '@plyaz/types/notifications';\nimport { HTTP_STATUS } from '@plyaz/types';\n\n// Injection token for BackendExampleDomainService\nexport const BACKEND_EXAMPLE_DOMAIN_SERVICE = 'BACKEND_EXAMPLE_DOMAIN_SERVICE';\n\n/**\n * Example Controller\n *\n * Routes:\n * - GET  /example/health                  - Health check\n * - GET  /example/entities/:id            - Get entity by ID\n * - POST /example/entities                - Create entity\n * - PATCH /example/entities/:id           - Update entity\n * - DELETE /example/entities/:id          - Delete entity\n * - POST /example/entities/validated      - Create with full validation (array errors example)\n * - GET  /example/errors/single           - Demo: Single error response\n * - GET  /example/errors/array            - Demo: Array of errors response\n * - POST /example/email                   - Send email using templates\n *\n * NOTE: Upload and generate-document endpoints are now in files.controller.ts\n */\n@ApiTags('example')\n@Controller('example')\nexport class ExampleController {\n  constructor(\n    @Inject(BACKEND_EXAMPLE_DOMAIN_SERVICE)\n    private readonly exampleService: BackendExampleDomainService\n  ) {}\n\n  /**\n   * Health check endpoint\n   * GET /example/health\n   */\n  @Get('health')\n  @ApiOperation({ summary: 'Health check for example service' })\n  @ApiResponse({ status: 200, description: 'Service is healthy' })\n  health(): ReturnResponseType<{ service: boolean; timestamp: string }> {\n    return SuccessResponseStandard('Service is healthy', {\n      service: this.exampleService.isAvailable(),\n      timestamp: new Date().toISOString(),\n    });\n  }\n\n  /**\n   * Get entity by ID\n   * GET /example/entities/:id\n   */\n  @Get('entities/:id')\n  @ApiOperation({ summary: 'Get entity by ID' })\n  @ApiParam({ name: 'id', description: 'Entity UUID' })\n  @ApiResponse({ status: 200, description: 'Entity retrieved successfully' })\n  @ApiResponse({ status: 404, description: 'Entity not found' })\n  async getEntity(@Param('id') id: string): Promise<ReturnResponseType<ExampleEntity | null>> {\n    const entity = await this.exampleService.getById(id);\n    return SuccessResponseStandard('Entity retrieved successfully', entity);\n  }\n\n  /**\n   * Create a new entity\n   * POST /example/entities\n   */\n  @Post('entities')\n  @HttpCode(HttpStatus.CREATED)\n  @ApiOperation({ summary: 'Create a new entity' })\n  @ApiBody({\n    description: 'Entity creation data',\n    schema: {\n      type: 'object',\n      required: ['name'],\n      properties: {\n        name: { type: 'string', description: 'Entity name' },\n        description: { type: 'string', description: 'Entity description' },\n        amount: { type: 'number', description: 'Amount value' },\n        metadata: { type: 'object', description: 'Additional metadata' },\n      },\n    },\n  })\n  @ApiResponse({ status: 201, description: 'Entity created successfully' })\n  @ApiResponse({ status: 400, description: 'Validation error' })\n  async createEntity(@Body() dto: CreateExampleDTO): Promise<ReturnResponseType<ExampleEntity>> {\n    const entity = await this.exampleService.create(dto);\n    return SuccessResponseStandard('Entity created successfully', entity, HTTP_STATUS.CREATED);\n  }\n\n  /**\n   * Update an entity (partial)\n   * PATCH /example/entities/:id\n   */\n  @Patch('entities/:id')\n  @ApiOperation({ summary: 'Update an entity (partial)' })\n  @ApiParam({ name: 'id', description: 'Entity UUID' })\n  @ApiBody({\n    description: 'Partial entity update data',\n    schema: {\n      type: 'object',\n      properties: {\n        name: { type: 'string', description: 'Entity name' },\n        description: { type: 'string', description: 'Entity description' },\n        amount: { type: 'number', description: 'Amount value' },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'Entity updated successfully' })\n  @ApiResponse({ status: 404, description: 'Entity not found' })\n  async updateEntity(\n    @Param('id') id: string,\n    @Body() dto: PatchExampleDTO\n  ): Promise<ReturnResponseType<ExampleEntity>> {\n    const entity = await this.exampleService.patch(id, dto);\n    return SuccessResponseStandard('Entity updated successfully', entity);\n  }\n\n  /**\n   * Delete an entity\n   * DELETE /example/entities/:id\n   */\n  @Delete('entities/:id')\n  @HttpCode(HttpStatus.OK)\n  @ApiOperation({ summary: 'Delete an entity' })\n  @ApiParam({ name: 'id', description: 'Entity UUID' })\n  @ApiResponse({ status: 200, description: 'Entity deleted successfully' })\n  @ApiResponse({ status: 404, description: 'Entity not found' })\n  async deleteEntity(@Param('id') id: string): Promise<ReturnResponseType<null>> {\n    await this.exampleService.delete(id);\n    return SuccessResponseStandard('Entity deleted successfully', null);\n  }\n\n  /**\n   * Create entity with full validation (array errors pattern)\n   * POST /example/entities/validated\n   */\n  @Post('entities/validated')\n  @HttpCode(HttpStatus.CREATED)\n  @ApiOperation({ summary: 'Create entity with full validation (demo)' })\n  @ApiBody({\n    description: 'Entity data for validation demo',\n    schema: {\n      type: 'object',\n      properties: {\n        name: { type: 'string' },\n        description: { type: 'string' },\n        amount: { type: 'number' },\n      },\n    },\n  })\n  @ApiResponse({ status: 201, description: 'Entity created successfully' })\n  @ApiResponse({ status: 400, description: 'Validation errors (array)' })\n  async createEntityWithValidation(\n    @Body() dto: unknown\n  ): Promise<ReturnResponseType<ExampleEntity>> {\n    const entity = await this.exampleService.create(dto);\n    return SuccessResponseStandard('Entity created successfully', entity, HTTP_STATUS.CREATED);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Error Demonstration Endpoints\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Demo: Single validation error response\n   * GET /example/errors/single\n   */\n  @Get('errors/single')\n  @ApiOperation({ summary: 'Demo: Single validation error response' })\n  @ApiResponse({ status: 400, description: 'Single validation error' })\n  async demoSingleError(): Promise<void> {\n    return await this.exampleService.demoSingleValidationError();\n  }\n\n  /**\n   * Demo: Multiple validation errors response\n   * GET /example/errors/array\n   */\n  @Get('errors/array')\n  @ApiOperation({ summary: 'Demo: Multiple validation errors response' })\n  @ApiResponse({ status: 400, description: 'Array of validation errors' })\n  async demoArrayErrors(): Promise<void> {\n    return await this.exampleService.demoMultipleValidationErrors();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Email Endpoints (via @plyaz/notifications)\n  // ─────────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Send an email using notification templates\n   * POST /example/email\n   */\n  @Post('email')\n  @HttpCode(HttpStatus.OK)\n  @ApiOperation({ summary: 'Send an email using notification templates' })\n  @ApiBody({\n    description: 'Email parameters',\n    schema: {\n      type: 'object',\n      required: ['to', 'templateId'],\n      properties: {\n        to: { type: 'string', format: 'email', description: 'Recipient email address' },\n        templateId: { type: 'string', description: 'Template ID (e.g., welcome, reset-password)' },\n        templateData: { type: 'object', description: 'Template variables' },\n        locale: { type: 'string', default: 'en', description: 'Locale for template' },\n        subject: { type: 'string', description: 'Custom email subject' },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'Email sent successfully' })\n  @ApiResponse({ status: 400, description: 'Invalid email parameters' })\n  async sendEmail(\n    @Body() dto: Partial<SendEmailParams>\n  ): Promise<ReturnResponseType<NotificationResult<NotificationResponse>>> {\n    const result = await this.exampleService.sendEmail(dto ?? {});\n    return SuccessResponseStandard('Email sent successfully', result);\n  }\n}\n","/**\n * Example Module\n *\n * NestJS module demonstrating the proper pattern using domain service directly:\n * Module → Controller → BackendExampleService\n *\n * The BackendExampleService is auto-initialized by Core.initialize() and\n * can be injected via ServiceRegistry or provided directly to controllers.\n *\n * @example Usage in app.module.ts\n * ```typescript\n * import { CoreModule } from '@plyaz/core/nestjs';\n * import { ExampleModule } from '@plyaz/core';\n *\n * @Module({\n *   imports: [\n *     CoreModule.forRoot({ envPath: '.env' }),\n *     ExampleModule,\n *   ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { Module } from '@nestjs/common';\nimport { ExampleController, BACKEND_EXAMPLE_DOMAIN_SERVICE } from './example.controller';\nimport { BackendExampleDomainService } from '../../domain/example';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\n\n@Module({\n  controllers: [ExampleController],\n  providers: [\n    // Provide BackendExampleDomainService via ServiceRegistry\n    // Services are registered during Core.initialize() with proper injection (db, cache, etc.)\n    {\n      provide: BACKEND_EXAMPLE_DOMAIN_SERVICE,\n      useFactory: async () => ServiceRegistry.getAsync<BackendExampleDomainService>('example'),\n    },\n  ],\n  exports: [BACKEND_EXAMPLE_DOMAIN_SERVICE],\n})\nexport class ExampleModule {}\n\n// Re-export for convenience\nexport { BackendExampleDomainService, BACKEND_EXAMPLE_DOMAIN_SERVICE };\n","/**\n * Storage Enum Type Guards\n *\n * Runtime type guards for storage enums. Useful for validating\n * string inputs from API requests, form data, etc.\n *\n * @module @plyaz/core/domain/files\n *\n * @example\n * ```typescript\n * import { coreIsFileCategory, coreParseFileCategory } from '@plyaz/core/domain/files';\n * import { FILE_CATEGORY } from '@plyaz/types/storage';\n *\n * // Type guard usage\n * if (coreIsFileCategory(value)) {\n *   // value is now typed as FILE_CATEGORY\n * }\n *\n * // Parser usage (returns undefined if invalid)\n * const category = coreParseFileCategory(req.body.category);\n * ```\n */\n\nimport {\n  FILE_CATEGORY,\n  ENTITY_TYPE,\n  FILE_ACCESS_LEVEL,\n  UPLOAD_STATUS,\n  STORAGE_ADAPTER_TYPE,\n} from '@plyaz/types/storage';\n\n/** Cached enum values for FILE_CATEGORY */\nconst FILE_CATEGORY_VALUES: readonly string[] = Object.values(FILE_CATEGORY);\n\n/** Cached enum values for ENTITY_TYPE */\nconst ENTITY_TYPE_VALUES: readonly string[] = Object.values(ENTITY_TYPE);\n\n/** Cached enum values for FILE_ACCESS_LEVEL */\nconst FILE_ACCESS_LEVEL_VALUES: readonly string[] = Object.values(FILE_ACCESS_LEVEL);\n\n/** Cached enum values for UPLOAD_STATUS */\nconst UPLOAD_STATUS_VALUES: readonly string[] = Object.values(UPLOAD_STATUS);\n\n/** Cached enum values for STORAGE_ADAPTER_TYPE */\nconst STORAGE_ADAPTER_TYPE_VALUES: readonly string[] = Object.values(STORAGE_ADAPTER_TYPE);\n\n/**\n * Check if value is a valid FILE_CATEGORY enum value\n */\nexport function coreIsFileCategory(value: unknown): value is FILE_CATEGORY {\n  return typeof value === 'string' && FILE_CATEGORY_VALUES.includes(value);\n}\n\n/**\n * Safely parse a string to FILE_CATEGORY enum\n * @returns FILE_CATEGORY if valid, undefined otherwise\n */\nexport function coreParseFileCategory(value: string | undefined | null): FILE_CATEGORY | undefined {\n  return value && coreIsFileCategory(value) ? value : undefined;\n}\n\n/**\n * Check if value is a valid ENTITY_TYPE enum value\n */\nexport function coreIsEntityType(value: unknown): value is ENTITY_TYPE {\n  return typeof value === 'string' && ENTITY_TYPE_VALUES.includes(value);\n}\n\n/**\n * Safely parse a string to ENTITY_TYPE enum\n * @returns ENTITY_TYPE if valid, undefined otherwise\n */\nexport function coreParseEntityType(value: string | undefined | null): ENTITY_TYPE | undefined {\n  return value && coreIsEntityType(value) ? value : undefined;\n}\n\n/**\n * Check if value is a valid FILE_ACCESS_LEVEL enum value\n */\nexport function coreIsFileAccessLevel(value: unknown): value is FILE_ACCESS_LEVEL {\n  return typeof value === 'string' && FILE_ACCESS_LEVEL_VALUES.includes(value);\n}\n\n/**\n * Safely parse a string to FILE_ACCESS_LEVEL enum\n * @returns FILE_ACCESS_LEVEL if valid, undefined otherwise\n */\nexport function coreParseFileAccessLevel(\n  value: string | undefined | null\n): FILE_ACCESS_LEVEL | undefined {\n  return value && coreIsFileAccessLevel(value) ? value : undefined;\n}\n\n/**\n * Check if value is a valid UPLOAD_STATUS enum value\n */\nexport function coreIsUploadStatus(value: unknown): value is UPLOAD_STATUS {\n  return typeof value === 'string' && UPLOAD_STATUS_VALUES.includes(value);\n}\n\n/**\n * Safely parse a string to UPLOAD_STATUS enum\n * @returns UPLOAD_STATUS if valid, undefined otherwise\n */\nexport function coreParseUploadStatus(value: string | undefined | null): UPLOAD_STATUS | undefined {\n  return value && coreIsUploadStatus(value) ? value : undefined;\n}\n\n/**\n * Check if value is a valid STORAGE_ADAPTER_TYPE enum value\n */\nexport function coreIsStorageAdapterType(value: unknown): value is STORAGE_ADAPTER_TYPE {\n  return typeof value === 'string' && STORAGE_ADAPTER_TYPE_VALUES.includes(value);\n}\n\n/**\n * Safely parse a string to STORAGE_ADAPTER_TYPE enum\n * @returns STORAGE_ADAPTER_TYPE if valid, undefined otherwise\n */\nexport function coreParseStorageAdapterType(\n  value: string | undefined | null\n): STORAGE_ADAPTER_TYPE | undefined {\n  return value && coreIsStorageAdapterType(value) ? value : undefined;\n}\n","/**\n * Schema Validation Pipe\n *\n * NestJS pipe that validates request data using schema definitions.\n * Throws ValidationError[] which is caught by the global exception filter.\n *\n * @example\n * ```typescript\n * import { SchemaValidationPipe } from '@plyaz/core/backend';\n * import { UploadFileRequestSchema } from '@plyaz/types/api';\n *\n * @Post('upload')\n * async uploadFile(\n *   @Body(new SchemaValidationPipe(UploadFileRequestSchema)) dto: UploadFileRequest\n * ) {\n *   // dto is validated and typed\n * }\n * ```\n *\n * @example Global pipe\n * ```typescript\n * // main.ts\n * import { SchemaValidationPipe } from '@plyaz/core/backend';\n * import { MyGlobalSchema } from '@plyaz/types';\n *\n * app.useGlobalPipes(new SchemaValidationPipe(MyGlobalSchema));\n * ```\n */\n\nimport type { PipeTransform } from '@nestjs/common';\nimport type { ZodError } from 'zod';\nimport type { ValidatableSchema } from '@plyaz/types/core';\nimport { zodErrorToValidationErrors } from '@plyaz/errors';\n\n/**\n * Schema Validation Pipe\n *\n * Validates incoming data against a schema definition.\n * On validation failure, throws an array of ValidationError\n * which is handled by the global NestJS exception filter.\n */\nexport class SchemaValidationPipe<T = unknown> implements PipeTransform<unknown, T> {\n  constructor(private readonly schema: ValidatableSchema<T>) {}\n\n  /**\n   * Transform and validate the incoming value\n   *\n   * @param value - The value to validate\n   * @returns The validated and transformed value\n   * @throws ValidationError[] if validation fails\n   */\n  transform(value: unknown): T {\n    const result = this.schema.safeParse(value);\n\n    if (!result.success) {\n      // Throw array of ValidationErrors - caught by global exception filter\n      // Cast to ZodError since ValidatableSchema uses simplified interface\n      throw zodErrorToValidationErrors(result.error as ZodError);\n    }\n\n    return result.data;\n  }\n}\n\n/**\n * Create a validation pipe for a specific schema\n *\n * @param schema - Schema to validate against\n * @returns SchemaValidationPipe instance\n *\n * @example\n * ```typescript\n * import { createValidationPipe } from '@plyaz/core/backend';\n * import { UserSchema } from '@plyaz/types';\n *\n * @Post()\n * create(@Body(createValidationPipe(UserSchema)) dto: User) { ... }\n * ```\n */\nexport function createValidationPipe<T>(schema: ValidatableSchema<T>): SchemaValidationPipe<T> {\n  return new SchemaValidationPipe(schema);\n}\n","/* eslint-disable complexity */\n/**\n * Files Controller\n *\n * REST API endpoints for Files/Media operations.\n * Aligned with @plyaz/api endpoints in files.ts:\n *\n * - POST /files/upload - Upload single file\n * - POST /files/upload/bulk - Upload multiple files\n * - POST /files/generate-document - Generate document from template\n * - GET /files/:id - Get file metadata\n * - GET /files/:id/download - Download file content\n * - GET /files/:id/signed-url - Get signed URL for file\n * - DELETE /files/:id - Delete file\n * - GET /files/health - Health check\n */\n\nimport {\n  Controller,\n  Get,\n  Post,\n  Delete,\n  Body,\n  Param,\n  Inject,\n  HttpCode,\n  HttpStatus,\n  UseInterceptors,\n  UploadedFile,\n  UploadedFiles,\n} from '@nestjs/common';\nimport { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express';\nimport {\n  ApiTags,\n  ApiOperation,\n  ApiBody,\n  ApiParam,\n  ApiResponse,\n  ApiConsumes,\n} from '@nestjs/swagger';\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport type { ReturnResponseType } from '@plyaz/types/errors';\nimport type { BackendFilesDomainService } from '../../domain/files';\nimport type { FilesEntity } from '@plyaz/types/core';\nimport { FILE_CATEGORY, ENTITY_TYPE, type UploadParams } from '@plyaz/types/storage';\nimport { UPLOAD_CONFIG } from '@plyaz/config';\nimport { coreParseFileCategory, coreParseEntityType } from '../../domain/files';\nimport { GenerateDocumentRequestSchema, type GenerateDocumentRequest } from '@plyaz/types/api';\nimport { SchemaValidationPipe } from '../pipes';\n\n/** Multer file type for uploaded files */\ninterface MulterFile {\n  fieldname: string;\n  originalname: string;\n  encoding: string;\n  mimetype: string;\n  buffer: Buffer;\n  size: number;\n}\n\n/** DTO for bulk file upload with proper enum types */\ninterface BulkUploadDto {\n  files?: Array<Partial<UploadParams> & { base64?: string }>;\n  category?: FILE_CATEGORY;\n  entityType?: ENTITY_TYPE;\n  entityId?: string;\n}\n\nexport const BACKEND_FILES_DOMAIN_SERVICE = 'BACKEND_FILES_DOMAIN_SERVICE';\n\n/**\n * Files Controller\n *\n * Routes:\n * - GET /files/health - Health check\n * - POST /files/upload - Upload single file\n * - POST /files/upload/bulk - Upload multiple files\n * - POST /files/generate-document - Generate document from template\n * - GET /files/:id - Get file metadata\n * - GET /files/:id/download - Download file content\n * - GET /files/:id/signed-url - Get signed URL\n * - DELETE /files/:id - Delete file\n */\n@ApiTags('files')\n@Controller('files')\nexport class FilesController {\n  constructor(\n    @Inject(BACKEND_FILES_DOMAIN_SERVICE)\n    private readonly filesService: BackendFilesDomainService\n  ) {}\n\n  @Get('health')\n  @ApiOperation({ summary: 'Health check for files service' })\n  health(): ReturnResponseType<{ service: boolean; timestamp: string }> {\n    return SuccessResponseStandard('Files service is healthy', {\n      service: this.filesService.isAvailable(),\n      timestamp: new Date().toISOString(),\n    });\n  }\n\n  /**\n   * Upload a single file (multipart/form-data)\n   * POST /files/upload\n   *\n   * Supports both:\n   * - multipart/form-data with 'file' field\n   * - application/json with base64 encoded content\n   */\n  // eslint-disable-next-line max-lines-per-function\n  @Post('upload')\n  @HttpCode(HttpStatus.OK)\n  @UseInterceptors(FileInterceptor('file'))\n  @ApiOperation({ summary: 'Upload a single file' })\n  @ApiConsumes('multipart/form-data', 'application/json')\n  @ApiBody({\n    description: 'File upload - use multipart/form-data for file upload or JSON with base64',\n    schema: {\n      type: 'object',\n      properties: {\n        file: { type: 'string', format: 'binary', description: 'File to upload (multipart)' },\n        base64: {\n          type: 'string',\n          description: 'Base64 encoded file content (JSON)',\n          example: 'SGVsbG8gV29ybGQh',\n        },\n        filename: { type: 'string', description: 'Original filename', example: 'document.pdf' },\n        mimeType: {\n          type: 'string',\n          description: 'MIME type',\n          example: 'application/pdf',\n          enum: [\n            'application/pdf',\n            'image/png',\n            'image/jpeg',\n            'image/webp',\n            'video/mp4',\n            'audio/mpeg',\n            'application/zip',\n          ],\n        },\n        category: {\n          type: 'string',\n          description: 'File category',\n          enum: ['document', 'image', 'video', 'audio', 'archive', 'other'],\n          example: 'document',\n        },\n        entityType: {\n          type: 'string',\n          description: 'Entity type that owns this file',\n          enum: ['user', 'post', 'comment', 'message', 'product', 'order', 'system'],\n          example: 'user',\n        },\n        entityId: {\n          type: 'string',\n          format: 'uuid',\n          description: 'Entity UUID',\n          example: '550e8400-e29b-41d4-a716-446655440000',\n        },\n        bucket: {\n          type: 'string',\n          description: 'Storage bucket name',\n          example: 'uploads',\n        },\n        path: {\n          type: 'string',\n          description: 'Custom storage path',\n          example: 'users/avatars',\n        },\n        metadata: {\n          type: 'object',\n          description: 'Additional metadata',\n          example: { tags: ['profile', 'avatar'] },\n        },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'File uploaded successfully' })\n  async uploadFile(\n    @UploadedFile() file: MulterFile | undefined,\n    @Body() dto: Partial<UploadParams> & { base64?: string }\n  ): Promise<\n    ReturnResponseType<{\n      id: string;\n      key: string;\n      filename: string;\n      mimeType: string;\n      size: number;\n      url?: string;\n      publicUrl?: string;\n      bucket?: string;\n      adapter?: string;\n      entityType?: string;\n      entityId?: string;\n      category?: string;\n      uploadedAt?: Date;\n      variants?: Record<string, unknown>;\n    }>\n  > {\n    const safeDto = dto ?? {};\n\n    // Build upload params - prefer multipart file over base64\n    const uploadParams: Partial<UploadParams> = {\n      ...safeDto,\n      file: file?.buffer ?? (safeDto.base64 ? Buffer.from(safeDto.base64, 'base64') : undefined),\n      filename: safeDto.filename ?? file?.originalname,\n      mimeType: safeDto.mimeType ?? file?.mimetype,\n    };\n\n    const result = await this.filesService.uploadFile(uploadParams);\n\n    // Get DB record for UUID (same as editor app)\n    const dbRecord = await this.filesService.getByStoragePath(result.metadata.path);\n\n    return SuccessResponseStandard('File uploaded successfully', {\n      id: dbRecord?.id ?? result.metadata.fileId,\n      key: result.metadata.path,\n      filename: result.metadata.filename,\n      mimeType: result.metadata.mimeType,\n      size: result.metadata.size,\n      url: result.metadata.url,\n      publicUrl: result.metadata.url,\n      bucket: result.metadata.bucket,\n      adapter: result.metadata.adapter,\n      entityType: result.metadata.entityType,\n      entityId: result.metadata.entityId,\n      category: result.metadata.category,\n      uploadedAt: result.metadata.uploadedAt,\n      variants: result.variants,\n    });\n  }\n\n  /**\n   * Upload multiple files (multipart/form-data)\n   * POST /files/upload/bulk\n   *\n   * Supports both:\n   * - multipart/form-data with 'files' field (multiple files)\n   * - application/json with array of base64 encoded files\n   */\n  @Post('upload/bulk')\n  @HttpCode(HttpStatus.OK)\n  @UseInterceptors(FilesInterceptor('files', UPLOAD_CONFIG.MAX_CONCURRENT))\n  @ApiOperation({ summary: 'Upload multiple files' })\n  @ApiConsumes('multipart/form-data', 'application/json')\n  @ApiBody({\n    description: 'Multiple file upload - use multipart/form-data or JSON with base64 array',\n    schema: {\n      type: 'object',\n      properties: {\n        files: {\n          type: 'array',\n          items: { type: 'string', format: 'binary' },\n          description: 'Files to upload (multipart)',\n        },\n        category: {\n          type: 'string',\n          description: 'Category for all files',\n          enum: ['document', 'image', 'video', 'audio', 'archive', 'other'],\n          example: 'image',\n        },\n        entityType: {\n          type: 'string',\n          description: 'Entity type for all files',\n          enum: ['user', 'post', 'comment', 'message', 'product', 'order', 'system'],\n          example: 'post',\n        },\n        entityId: {\n          type: 'string',\n          format: 'uuid',\n          description: 'Entity UUID for all files',\n          example: '550e8400-e29b-41d4-a716-446655440000',\n        },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'Files uploaded successfully' })\n  async uploadFiles(\n    @UploadedFiles() files: MulterFile[] | undefined,\n    @Body() dto: BulkUploadDto & { category?: string; entityType?: string }\n  ): Promise<\n    ReturnResponseType<\n      Array<{\n        id: string;\n        key: string;\n        filename: string;\n        mimeType: string;\n        size: number;\n        url?: string;\n        publicUrl?: string;\n        bucket?: string;\n        adapter?: string;\n        entityType?: string;\n        entityId?: string;\n        category?: string;\n        uploadedAt?: Date;\n        variants?: Record<string, unknown>;\n      }>\n    >\n  > {\n    let uploadParamsArray: Partial<UploadParams>[] = [];\n\n    // Parse enum values safely (handles both typed DTO and string from form-data)\n    const category = coreParseFileCategory(dto?.category);\n    const entityType = coreParseEntityType(dto?.entityType);\n\n    if (files && files.length > 0) {\n      // Multipart upload - convert multer files to upload params\n      uploadParamsArray = files.map(file => ({\n        file: file.buffer,\n        filename: file.originalname,\n        mimeType: file.mimetype,\n        category,\n        entityType,\n        entityId: dto?.entityId,\n      }));\n    } else if (dto?.files && dto.files.length > 0) {\n      // JSON upload with base64\n      uploadParamsArray = dto.files.map(f => ({\n        ...f,\n        file: f.base64 ? Buffer.from(f.base64, 'base64') : undefined,\n      }));\n    }\n\n    const results = await this.filesService.uploadFiles(uploadParamsArray);\n\n    // Get DB records for UUIDs (same as editor app)\n    const responseData = await Promise.all(\n      results.map(async result => {\n        const dbRecord = await this.filesService.getByStoragePath(result.metadata.path);\n        return {\n          id: dbRecord?.id ?? result.metadata.fileId,\n          key: result.metadata.path,\n          filename: result.metadata.filename,\n          mimeType: result.metadata.mimeType,\n          size: result.metadata.size,\n          url: result.metadata.url,\n          publicUrl: result.metadata.url,\n          bucket: result.metadata.bucket,\n          adapter: result.metadata.adapter,\n          entityType: result.metadata.entityType,\n          entityId: result.metadata.entityId,\n          category: result.metadata.category,\n          uploadedAt: result.metadata.uploadedAt,\n          variants: result.variants,\n        };\n      })\n    );\n\n    return SuccessResponseStandard('Files uploaded successfully', responseData);\n  }\n\n  /**\n   * Generate a document from template\n   * POST /files/generate-document\n   *\n   * Uses SchemaValidationPipe for request validation via @plyaz/types schema.\n   */\n  @Post('generate-document')\n  @HttpCode(HttpStatus.OK)\n  @ApiOperation({ summary: 'Generate a document from template' })\n  @ApiBody({\n    description: 'Document generation parameters',\n    schema: {\n      type: 'object',\n      required: ['templateId', 'templateData'],\n      properties: {\n        templateId: {\n          type: 'string',\n          description: 'Template ID',\n          example: 'invoice-template',\n        },\n        templateData: {\n          type: 'object',\n          description: 'Data to populate template',\n          example: {\n            invoiceNumber: 'INV-001',\n            customerName: 'John Doe',\n            items: [{ name: 'Product A', quantity: 2, price: 29.99 }],\n            total: 59.98,\n          },\n        },\n        outputFormat: {\n          type: 'string',\n          enum: ['pdf', 'docx', 'xlsx', 'html'],\n          default: 'pdf',\n          example: 'pdf',\n        },\n        locale: { type: 'string', description: 'Locale for template', example: 'en-US' },\n        pdfOptions: {\n          type: 'object',\n          description: 'PDF rendering options',\n          example: { format: 'A4', landscape: false },\n        },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'Document generated successfully' })\n  @ApiResponse({ status: 400, description: 'Validation error' })\n  async generateDocument(\n    @Body(new SchemaValidationPipe(GenerateDocumentRequestSchema))\n    dto: GenerateDocumentRequest\n  ): Promise<ReturnResponseType<{ buffer: string; size: number }>> {\n    const buffer = await this.filesService.generateFile(dto);\n    return SuccessResponseStandard('Document generated successfully', {\n      buffer: buffer.toString('base64'),\n      size: buffer.length,\n    });\n  }\n\n  /**\n   * Get file metadata\n   * GET /files/:id\n   */\n  @Get(':id')\n  @ApiOperation({ summary: 'Get file metadata by ID' })\n  @ApiParam({\n    name: 'id',\n    description: 'File UUID from media table',\n    example: '550e8400-e29b-41d4-a716-446655440000',\n  })\n  @ApiResponse({ status: 200, description: 'File metadata retrieved' })\n  @ApiResponse({ status: 404, description: 'File not found' })\n  async getFile(@Param('id') id: string): Promise<ReturnResponseType<FilesEntity | null>> {\n    const entity = await this.filesService.getById(id);\n    return SuccessResponseStandard('File retrieved', entity);\n  }\n\n  /**\n   * Download file content\n   * GET /files/:id/download\n   */\n  @Get(':id/download')\n  @ApiOperation({ summary: 'Download file content' })\n  @ApiParam({\n    name: 'id',\n    description: 'File UUID from media table',\n    example: '550e8400-e29b-41d4-a716-446655440000',\n  })\n  @ApiResponse({ status: 200, description: 'File content (base64 encoded)' })\n  @ApiResponse({ status: 404, description: 'File not found' })\n  async downloadFile(\n    @Param('id') id: string\n  ): Promise<ReturnResponseType<{ buffer: string; filename: string; mimeType: string }>> {\n    const result = await this.filesService.downloadFile({ fileId: id });\n    return SuccessResponseStandard('File downloaded', result);\n  }\n\n  /**\n   * Get signed URL for file\n   * GET /files/:id/signed-url\n   */\n  @Get(':id/signed-url')\n  @ApiOperation({ summary: 'Get a signed URL for file download' })\n  @ApiParam({\n    name: 'id',\n    description: 'File UUID from media table',\n    example: '550e8400-e29b-41d4-a716-446655440000',\n  })\n  @ApiResponse({ status: 200, description: 'Signed URL generated' })\n  @ApiResponse({ status: 404, description: 'File not found' })\n  async getSignedUrl(\n    @Param('id') id: string\n  ): Promise<ReturnResponseType<{ url: string; expiresAt: string }>> {\n    const result = await this.filesService.getSignedUrl({ fileId: id });\n    return SuccessResponseStandard('Signed URL generated', result);\n  }\n\n  /**\n   * Delete file\n   * DELETE /files/:id\n   */\n  @Delete(':id')\n  @HttpCode(HttpStatus.OK)\n  @ApiOperation({ summary: 'Delete a file' })\n  @ApiParam({\n    name: 'id',\n    description: 'File UUID from media table',\n    example: '550e8400-e29b-41d4-a716-446655440000',\n  })\n  @ApiResponse({ status: 200, description: 'File deleted successfully' })\n  @ApiResponse({ status: 404, description: 'File not found' })\n  async deleteFile(@Param('id') id: string): Promise<ReturnResponseType<null>> {\n    await this.filesService.delete(id);\n    return SuccessResponseStandard('File deleted', null);\n  }\n}\n","/**\n * Files Module\n *\n * NestJS module for Files feature.\n * Uses domain service pattern: Module → Controller → BackendFilesService\n *\n * @example Usage in app.module.ts\n * ```typescript\n * import { CoreModule } from '@plyaz/core/nestjs';\n * import { FilesModule } from '@plyaz/core';\n *\n * @Module({\n *   imports: [\n *     CoreModule.forRoot({ envPath: '.env' }),\n *     FilesModule,\n *   ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { Module } from '@nestjs/common';\nimport { FilesController, BACKEND_FILES_DOMAIN_SERVICE } from './files.controller';\nimport { BackendFilesDomainService } from '../../domain/files';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\n\n@Module({\n  controllers: [FilesController],\n  providers: [\n    // Provide BackendFilesDomainService via ServiceRegistry\n    // Services are registered during Core.initialize() with proper injection (storage, db, etc.)\n    {\n      provide: BACKEND_FILES_DOMAIN_SERVICE,\n      useFactory: async () => ServiceRegistry.getAsync<BackendFilesDomainService>('files'),\n    },\n  ],\n  exports: [BACKEND_FILES_DOMAIN_SERVICE],\n})\nexport class FilesModule {}\n\n// Re-export for convenience\nexport { BackendFilesDomainService, BACKEND_FILES_DOMAIN_SERVICE };\n","/**\n * Notifications Controller\n *\n * REST API endpoints for Notifications management.\n * Notifications are created automatically when emails/SMS/push are sent.\n * Only listing and deletion are exposed via API.\n *\n * Also handles short URL redirects for email tracking links and\n * user notification preference management including unsubscribe.\n *\n * @endpoints\n * - GET    /notifications/health           - Health check\n * - GET    /notifications                  - List all notifications\n * - DELETE /notifications/:id              - Delete notification\n * - GET    /notifications/s/:code          - Redirect short URL (tracking)\n * - GET    /notifications/s/:code/analytics - Get short URL analytics\n * - GET    /notifications/preferences      - Get user preferences\n * - PATCH  /notifications/preferences      - Update user preferences\n * - GET    /notifications/unsubscribe      - Process unsubscribe token from email\n */\n\nimport {\n  Controller,\n  Get,\n  Delete,\n  Patch,\n  Param,\n  Query,\n  Body,\n  Inject,\n  HttpCode,\n  HttpStatus,\n  Res,\n} from '@nestjs/common';\nimport { ApiTags, ApiOperation, ApiParam, ApiQuery, ApiResponse, ApiBody } from '@nestjs/swagger';\nimport type { Response } from 'express';\nimport { SuccessResponseStandard, CorePackageError } from '@plyaz/errors';\nimport { CORE_ERROR_CODES } from '@plyaz/types';\nimport type { ReturnResponseType } from '@plyaz/types/errors';\nimport type { BackendNotificationsDomainService } from '../../domain/notifications';\nimport type { NotificationPreferencesDatabaseRow } from '../../models/notifications';\nimport { SYSTEM_USER_ID } from '@plyaz/types/core';\nimport type { QueryNotificationsDTO, NotificationsEntity } from '@plyaz/types/core';\nimport type { UrlAnalytics } from '@plyaz/types/notifications';\nimport { Core } from '../../init/CoreInitializer';\n\n// Injection token for the domain service\nexport const BACKEND_NOTIFICATIONS_DOMAIN_SERVICE = 'BACKEND_NOTIFICATIONS_DOMAIN_SERVICE';\n\n/**\n * Notifications Controller\n *\n * Routes:\n * - GET    /notifications/health  - Health check\n * - GET    /notifications         - List all notifications\n * - DELETE /notifications/:id     - Delete notification\n *\n * NOTE: Notifications are created internally when emails/SMS/push are sent.\n * No POST/PATCH/GET-by-ID endpoints are exposed.\n */\n@ApiTags('notifications')\n@Controller('notifications')\nexport class NotificationsController {\n  constructor(\n    @Inject(BACKEND_NOTIFICATIONS_DOMAIN_SERVICE)\n    private readonly notificationsService: BackendNotificationsDomainService\n  ) {}\n\n  /**\n   * Health check endpoint\n   * GET /notifications/health\n   */\n  @Get('health')\n  @ApiOperation({ summary: 'Health check for notifications service' })\n  @ApiResponse({ status: 200, description: 'Service is healthy' })\n  health(): ReturnResponseType<{ service: boolean; timestamp: string }> {\n    return SuccessResponseStandard('Service is healthy', {\n      service: this.notificationsService.isAvailable(),\n      timestamp: new Date().toISOString(),\n    });\n  }\n\n  /**\n   * List all notifications\n   * GET /notifications\n   */\n  @Get()\n  @ApiOperation({ summary: 'List all notifications' })\n  @ApiQuery({ name: 'limit', required: false, type: Number, description: 'Max results to return' })\n  @ApiQuery({ name: 'offset', required: false, type: Number, description: 'Skip results' })\n  @ApiQuery({ name: 'userId', required: false, type: String, description: 'Filter by user ID' })\n  @ApiResponse({ status: 200, description: 'Notifications retrieved successfully' })\n  async findAll(\n    @Query() query: QueryNotificationsDTO\n  ): Promise<ReturnResponseType<NotificationsEntity[]>> {\n    const entities = await this.notificationsService.getAll(query);\n    return SuccessResponseStandard('Notifications retrieved successfully', entities);\n  }\n\n  /**\n   * Delete notification\n   * DELETE /notifications/:id\n   */\n  @Delete(':id')\n  @HttpCode(HttpStatus.OK)\n  @ApiOperation({ summary: 'Delete a notification' })\n  @ApiParam({ name: 'id', description: 'Notification UUID' })\n  @ApiResponse({ status: 200, description: 'Notification deleted successfully' })\n  @ApiResponse({ status: 404, description: 'Notification not found' })\n  async remove(@Param('id') id: string): Promise<ReturnResponseType<null>> {\n    await this.notificationsService.delete(id);\n    return SuccessResponseStandard('Notification deleted successfully', null);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Short URL Redirect (for email tracking links)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Redirect short URL to original URL\n   * GET /notifications/s/:code\n   */\n  @Get('s/:code')\n  @ApiOperation({ summary: 'Redirect short URL to original URL (for email tracking)' })\n  @ApiParam({ name: 'code', description: 'Short URL code' })\n  @ApiResponse({ status: 302, description: 'Redirects to original URL' })\n  @ApiResponse({ status: 404, description: 'Short URL not found or expired' })\n  async redirectShortUrl(@Param('code') code: string, @Res() res: Response): Promise<void> {\n    const originalUrl = await this.notificationsService.resolveShortUrl(code);\n    if (!originalUrl) {\n      throw new CorePackageError(\n        'Short URL not found or expired',\n        CORE_ERROR_CODES.RESOURCE_NOT_FOUND,\n        { context: { shortCode: code } }\n      );\n    }\n    res.redirect(HttpStatus.FOUND, originalUrl);\n  }\n\n  /**\n   * Get short URL analytics\n   * GET /notifications/s/:code/analytics\n   */\n  @Get('s/:code/analytics')\n  @ApiOperation({ summary: 'Get short URL click analytics' })\n  @ApiParam({ name: 'code', description: 'Short URL code' })\n  @ApiResponse({ status: 200, description: 'Analytics retrieved successfully' })\n  @ApiResponse({ status: 404, description: 'Short URL not found' })\n  async getShortUrlAnalytics(\n    @Param('code') code: string\n  ): Promise<ReturnResponseType<UrlAnalytics>> {\n    const analytics = await this.notificationsService.getShortUrlAnalytics(code);\n    if (!analytics) {\n      throw new CorePackageError('Short URL not found', CORE_ERROR_CODES.RESOURCE_NOT_FOUND, {\n        context: { shortCode: code },\n      });\n    }\n    return SuccessResponseStandard('Short URL analytics retrieved', analytics);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Notification Preferences (for unsubscribe/opt-out management)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get user notification preferences\n   * GET /notifications/preferences\n   */\n  @Get('preferences')\n  @ApiOperation({ summary: 'Get user notification preferences' })\n  @ApiResponse({ status: 200, description: 'Preferences retrieved successfully' })\n  async getPreferences(): Promise<ReturnResponseType<NotificationPreferencesDatabaseRow>> {\n    // TODO(@Muhammad-Usman): Replace with userId from @plyaz/auth middleware\n    const userId = SYSTEM_USER_ID;\n    const preferences = await this.notificationsService.getUserPreferences(userId);\n    return SuccessResponseStandard('Notification preferences retrieved', preferences);\n  }\n\n  /**\n   * Update user notification preferences\n   * PATCH /notifications/preferences\n   */\n  @Patch('preferences')\n  @ApiOperation({ summary: 'Update user notification preferences' })\n  @ApiBody({\n    description: 'Preferences to update',\n    schema: {\n      type: 'object',\n      properties: {\n        email_enabled: { type: 'boolean', description: 'Enable email notifications' },\n        sms_enabled: { type: 'boolean', description: 'Enable SMS notifications' },\n        push_enabled: { type: 'boolean', description: 'Enable push notifications' },\n        marketing_enabled: { type: 'boolean', description: 'Enable marketing emails' },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'Preferences updated successfully' })\n  async updatePreferences(\n    @Body() body: Partial<NotificationPreferencesDatabaseRow>\n  ): Promise<ReturnResponseType<NotificationPreferencesDatabaseRow | null>> {\n    // TODO(@Muhammad-Usman): Replace with userId from @plyaz/auth middleware\n    const userId = SYSTEM_USER_ID;\n    const updated = await this.notificationsService.updateUserPreferences(userId, body ?? {});\n    return SuccessResponseStandard('Notification preferences updated', updated);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Unsubscribe (for email unsubscribe links)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Process unsubscribe token from email link\n   * GET /notifications/unsubscribe?token=...\n   */\n  @Get('unsubscribe')\n  @ApiOperation({ summary: 'Process unsubscribe token from email link' })\n  @ApiQuery({ name: 'token', required: true, description: 'Encrypted unsubscribe token' })\n  @ApiResponse({ status: 200, description: 'Unsubscribed successfully' })\n  @ApiResponse({ status: 400, description: 'Invalid or missing token' })\n  async unsubscribe(\n    @Query('token') token: string\n  ): Promise<ReturnResponseType<{ success: boolean; message: string }>> {\n    if (!token) {\n      throw new CorePackageError('Missing unsubscribe token', CORE_ERROR_CODES.VALIDATION_ERROR, {\n        context: { field: 'token' },\n      });\n    }\n\n    const encryptionKey = Core.initOptions.env?.ENCRYPTION_KEY;\n    if (!encryptionKey) {\n      throw new CorePackageError(\n        'Unsubscribe feature not configured',\n        CORE_ERROR_CODES.CONFIGURATION_INVALID,\n        { context: { reason: 'Missing encryption key' } }\n      );\n    }\n\n    const result = await this.notificationsService.unsubscribe(token, encryptionKey);\n\n    return SuccessResponseStandard(result.message, {\n      success: result.success,\n      message: result.message,\n    });\n  }\n}\n","/**\n * Notifications Module\n *\n * NestJS module for Notifications feature.\n * Uses domain service pattern: Module → Controller → BackendNotificationsService\n *\n * @example Usage in app.module.ts\n * ```typescript\n * import { CoreModule } from '@plyaz/core/nestjs';\n * import { NotificationsModule } from '@plyaz/core';\n *\n * @Module({\n *   imports: [\n *     CoreModule.forRoot({ envPath: '.env' }),\n *     NotificationsModule,\n *   ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { Module } from '@nestjs/common';\nimport {\n  NotificationsController,\n  BACKEND_NOTIFICATIONS_DOMAIN_SERVICE,\n} from './notifications.controller';\nimport { BackendNotificationsDomainService } from '../../domain/notifications';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\n\n@Module({\n  controllers: [NotificationsController],\n  providers: [\n    // Provide BackendNotificationsDomainService via ServiceRegistry\n    // Services are registered during Core.initialize() with proper injection (notifications, db, etc.)\n    {\n      provide: BACKEND_NOTIFICATIONS_DOMAIN_SERVICE,\n      useFactory: async () =>\n        ServiceRegistry.getAsync<BackendNotificationsDomainService>('notifications'),\n    },\n  ],\n  exports: [BACKEND_NOTIFICATIONS_DOMAIN_SERVICE],\n})\nexport class NotificationsModule {}\n\n// Re-export for convenience\nexport { BackendNotificationsDomainService, BACKEND_NOTIFICATIONS_DOMAIN_SERVICE };\n","/**\n * Feature Flag Domain Service (Backend)\n *\n * Backend-specific domain service that extends BaseDomainService and\n * uses providers (database, redis, memory, etc.) to manage feature flags.\n *\n * Runtime: Backend only (uses providers, no API calls)\n *\n * @example\n * ```typescript\n * // Create service instance with a provider\n * const provider = new DatabaseFeatureFlagProvider(config, FEATURES);\n * await provider.initialize();\n *\n * const flagService = new FeatureFlagDomainService({\n *   enabled: true,\n *   provider,\n * });\n *\n * // Use the service\n * const isEnabled = await flagService.isEnabled('new-feature', { userId: 'user-123' });\n * ```\n */\nimport type {\n  FeatureFlag,\n  FeatureFlagRule,\n  FeatureFlagContext,\n  FeatureFlagValue,\n  FeatureFlagEvaluation,\n  CreateFlagRequest,\n  FeatureFlagProvider,\n} from '@plyaz/types';\nimport { BaseDomainService } from '../../domain/base';\nimport { CoreEventManager } from '../../events/CoreEventManager';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n// Import for local use\nimport type {\n  FeatureFlagDomainServiceConfig as _FeatureFlagDomainServiceConfig,\n  FeatureFlagDomainEventType,\n} from '@plyaz/types/features';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Feature Flag Backend Service\n *\n * Extends BaseDomainService with generics for strong typing.\n * Uses an injected provider (database, redis, memory, etc.) for data access.\n *\n * No mapper/validator as this service handles simple flag values.\n * No API client - uses provider directly for data access.\n */\nexport class FeatureFlagDomainService extends BaseDomainService<_FeatureFlagDomainServiceConfig> {\n  /** The feature flag provider */\n  private readonly provider: FeatureFlagProvider<string>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Constructor\n  // ─────────────────────────────────────────────────────────────────────────\n\n  constructor(config: _FeatureFlagDomainServiceConfig) {\n    const serviceConfig: _FeatureFlagDomainServiceConfig = {\n      enabled: true,\n      defaults: {},\n      ...config,\n    };\n\n    super({\n      serviceName: 'FeatureFlagDomainService',\n      supportedRuntimes: ['backend'],\n      serviceConfig,\n      // No API client for backend - uses provider directly\n    });\n\n    // Store the provider\n    this.provider = config.provider;\n\n    // Mark as initialized (provider should already be initialized)\n    this._initialized = true;\n\n    this.logInfo('Service initialized with provider');\n    CoreEventManager.emit('featureFlag:backend:provider:initialized', { providerType: 'unknown' });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Abstract Implementations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Check if service is available\n   */\n  isAvailable(): boolean {\n    return this.isServiceEnabled && this.provider !== null;\n  }\n\n  /**\n   * Dispose/cleanup the service\n   */\n  dispose(): void {\n    if (this.provider) {\n      this.provider.dispose();\n      CoreEventManager.emit('featureFlag:backend:provider:disposed', {});\n    }\n    this.logInfo('Service disposed');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Provider Operations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Refresh the provider cache\n   */\n  async refresh(): Promise<void> {\n    this.assertReady();\n    await this.provider.refresh();\n    CoreEventManager.emit('featureFlag:backend:provider:refreshed', {});\n    this.logDebug('Provider cache refreshed');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Evaluation Operations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Evaluate a single feature flag\n   *\n   * @param key - Feature flag key\n   * @param context - Evaluation context (user, environment, etc.)\n   * @returns Full evaluation result\n   */\n  async evaluate(\n    key: string,\n    context?: FeatureFlagContext\n  ): Promise<FeatureFlagEvaluation<string>> {\n    this.assertReady();\n    const evalContext = context ?? this.config.defaultContext;\n\n    CoreEventManager.emit('featureFlag:backend:evaluating', { key, context: evalContext });\n\n    try {\n      const result = await this.provider.getFlag(key, evalContext);\n      CoreEventManager.emit('featureFlag:backend:evaluated', { key, result });\n      return result;\n    } catch (error) {\n      CoreEventManager.emit('featureFlag:backend:evaluate:error', { key, error });\n      throw error;\n    }\n  }\n\n  /**\n   * Check if a feature flag is enabled\n   *\n   * @param key - Feature flag key\n   * @param context - Evaluation context\n   * @returns Boolean indicating if flag is enabled\n   */\n  async isEnabled(key: string, context?: FeatureFlagContext): Promise<boolean> {\n    this.assertReady();\n    const evalContext = context ?? this.config.defaultContext;\n    return this.provider.isEnabled(key, evalContext);\n  }\n\n  /**\n   * Get the value of a feature flag\n   *\n   * @param key - Feature flag key\n   * @param context - Evaluation context\n   * @returns The flag value\n   */\n  async getValue<T = FeatureFlagValue>(key: string, context?: FeatureFlagContext): Promise<T> {\n    this.assertReady();\n    const evalContext = context ?? this.config.defaultContext;\n    return this.provider.getValue<T>(key, evalContext);\n  }\n\n  /**\n   * Evaluate all feature flags for a context\n   *\n   * @param context - Evaluation context\n   * @returns Record of all flag evaluations\n   */\n  async evaluateAll(\n    context?: FeatureFlagContext\n  ): Promise<Record<string, FeatureFlagEvaluation<string>>> {\n    this.assertReady();\n    const evalContext = context ?? this.config.defaultContext;\n\n    try {\n      const result = await this.provider.getAllFlags(evalContext);\n      return result;\n    } catch (error) {\n      this.logError('Failed to evaluate all flags', { error });\n      throw error;\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // CRUD Operations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Create a new feature flag\n   *\n   * @param data - Flag creation data\n   * @returns The created feature flag\n   */\n  async create(data: CreateFlagRequest<string>): Promise<FeatureFlag<string>> {\n    this.assertReady();\n\n    CoreEventManager.emit('featureFlag:backend:creating', { data });\n\n    try {\n      const flag = await this.provider.createFlag(data);\n      CoreEventManager.emit('featureFlag:backend:created', { flag });\n      this.logInfo('Feature flag created', { key: data.key });\n      return flag;\n    } catch (error) {\n      CoreEventManager.emit('featureFlag:backend:create:error', { error, data });\n      throw error;\n    }\n  }\n\n  /**\n   * Update an existing feature flag\n   *\n   * @param key - Flag key to update\n   * @param data - Partial update data\n   * @returns The updated feature flag\n   */\n  async update(\n    key: string,\n    data: Partial<CreateFlagRequest<string>>\n  ): Promise<FeatureFlag<string>> {\n    this.assertReady();\n\n    CoreEventManager.emit('featureFlag:backend:updating', { key, data });\n\n    try {\n      const flag = await this.provider.updateFlag(key, data);\n      CoreEventManager.emit('featureFlag:backend:updated', { flag });\n      this.logInfo('Feature flag updated', { key });\n      return flag;\n    } catch (error) {\n      CoreEventManager.emit('featureFlag:backend:update:error', { error, key });\n      throw error;\n    }\n  }\n\n  /**\n   * Delete a feature flag\n   *\n   * @param key - Flag key to delete\n   */\n  async delete(key: string): Promise<void> {\n    this.assertReady();\n\n    CoreEventManager.emit('featureFlag:backend:deleting', { key });\n\n    try {\n      await this.provider.deleteFlag(key);\n      CoreEventManager.emit('featureFlag:backend:deleted', { key });\n      this.logInfo('Feature flag deleted', { key });\n    } catch (error) {\n      CoreEventManager.emit('featureFlag:backend:delete:error', { error, key });\n      throw error;\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Rules Operations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Get rules for a specific flag\n   *\n   * @param key - Flag key\n   * @returns Array of rules\n   */\n  async getRules(key: string): Promise<FeatureFlagRule<string>[]> {\n    this.assertReady();\n\n    try {\n      const rules = await this.provider.getRules(key);\n      return rules;\n    } catch (error) {\n      this.logError('Failed to get rules', { key, error });\n      throw error;\n    }\n  }\n\n  /**\n   * Get all rules\n   *\n   * @returns Array of all rules\n   */\n  async getAllRules(): Promise<FeatureFlagRule<string>[]> {\n    this.assertReady();\n\n    try {\n      const rules = await this.provider.getAllRules();\n      return rules;\n    } catch (error) {\n      this.logError('Failed to get all rules', { error });\n      throw error;\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Override Operations (Runtime Overrides)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Set a runtime override for a flag (in-memory, not persisted)\n   *\n   * @param key - Flag key\n   * @param value - Override value\n   */\n  setOverride(key: string, value: FeatureFlagValue): void {\n    this.assertReady();\n\n    CoreEventManager.emit('featureFlag:backend:override:setting', { key, value });\n    this.provider.setOverride(key, value);\n    CoreEventManager.emit('featureFlag:backend:override:set', { key, value });\n    this.logDebug('Override set', { key, value });\n  }\n\n  /**\n   * Remove a runtime override for a flag\n   *\n   * @param key - Flag key\n   */\n  removeOverride(key: string): void {\n    this.assertReady();\n\n    CoreEventManager.emit('featureFlag:backend:override:removing', { key });\n    this.provider.removeOverride(key);\n    CoreEventManager.emit('featureFlag:backend:override:removed', { key });\n    this.logDebug('Override removed', { key });\n  }\n\n  /**\n   * Clear all runtime overrides\n   */\n  clearOverrides(): void {\n    this.assertReady();\n    this.provider.clearOverrides();\n    this.logDebug('All overrides cleared');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Subscription\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Subscribe to provider changes\n   *\n   * @param callback - Callback when flags change\n   * @returns Unsubscribe function\n   */\n  subscribe(callback: () => void): () => void {\n    this.assertReady();\n    return this.provider.subscribe(callback);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Event Subscription\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Subscribe to feature flag events\n   *\n   * @param event - Event type to subscribe to\n   * @param handler - Event handler\n   * @returns Unsubscribe function\n   */\n  on(event: FeatureFlagDomainEventType, handler: (data: unknown) => void): () => void {\n    return CoreEventManager.on(event, handler);\n  }\n}\n","/**\n * Feature Flag Service\n *\n * Domain service that wraps the provider and provides a unified API\n * for feature flag operations. This is the main entry point for\n * feature flag functionality.\n *\n * @fileoverview Domain service for feature flags\n * @version 1.0.0\n */\n\nimport type {\n  FeatureFlagProvider,\n  FeatureFlagConfig,\n  FeatureFlagContext,\n  FeatureFlagEvaluation,\n  FeatureFlagValue,\n  FeatureFlag,\n  FeatureFlagRule,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\n\n/**\n * Feature Flag Service\n *\n * The main service for feature flag operations. Wraps the provider\n * and adds logging, error handling, and lifecycle management.\n *\n * @example\n * ```typescript\n * // Create via factory\n * const service = await FeatureFlagServiceFactory.createAndInitialize(config, FEATURES);\n *\n * // Use directly\n * const isEnabled = await service.isEnabled('MY_FEATURE');\n * const flag = await service.createFlag({ key: 'NEW_FLAG', value: true, name: 'New Flag' });\n * ```\n */\nexport class FeatureFlagService<FeatureFlagKey extends string> {\n  private readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'FeatureFlagService',\n  });\n\n  private isInitialized = false;\n\n  constructor(\n    private readonly provider: FeatureFlagProvider<FeatureFlagKey>,\n    private readonly config: FeatureFlagConfig<FeatureFlagKey>\n  ) {}\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Lifecycle\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Initializes the service and underlying provider.\n   */\n  async initialize(): Promise<void> {\n    if (this.isInitialized) {\n      return;\n    }\n\n    try {\n      await this.provider.initialize();\n      this.isInitialized = true;\n      this.logger.info(`Feature flag service initialized with ${this.config.provider} provider`);\n    } catch (error) {\n      this.logger.error('Failed to initialize feature flag service', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Disposes the service and underlying provider.\n   */\n  dispose(): void {\n    this.provider.dispose();\n    this.isInitialized = false;\n    this.logger.info('Feature flag service disposed');\n  }\n\n  /**\n   * Refreshes the provider cache.\n   */\n  async refresh(): Promise<void> {\n    await this.provider.refresh();\n    this.logger.debug('Feature flag cache refreshed');\n  }\n\n  /**\n   * Gets whether the service is initialized.\n   */\n  getIsInitialized(): boolean {\n    return this.isInitialized;\n  }\n\n  /**\n   * Gets the provider type.\n   */\n  getProviderType(): string {\n    return this.config.provider;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Read Operations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Evaluates a feature flag.\n   */\n  async getFlag(\n    key: FeatureFlagKey,\n    context?: FeatureFlagContext\n  ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n    return this.provider.getFlag(key, context);\n  }\n\n  /**\n   * Gets all feature flag evaluations.\n   */\n  async getAllFlags(\n    context?: FeatureFlagContext\n  ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n    return this.provider.getAllFlags(context);\n  }\n\n  /**\n   * Checks if a feature flag is enabled.\n   */\n  async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n    return this.provider.isEnabled(key, context);\n  }\n\n  /**\n   * Gets the value of a feature flag.\n   */\n  async getValue<T = FeatureFlagValue>(\n    key: FeatureFlagKey,\n    context?: FeatureFlagContext\n  ): Promise<T> {\n    return this.provider.getValue<T>(key, context);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Flag Management\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Creates a new feature flag.\n   */\n  async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n    const flag = await this.provider.createFlag(data);\n    this.logger.info('Feature flag created', { key: data.key });\n    return flag;\n  }\n\n  /**\n   * Updates an existing feature flag.\n   */\n  async updateFlag(\n    key: FeatureFlagKey,\n    data: Partial<CreateFlagRequest<FeatureFlagKey>>\n  ): Promise<FeatureFlag<FeatureFlagKey>> {\n    const flag = await this.provider.updateFlag(key, data);\n    this.logger.info('Feature flag updated', { key });\n    return flag;\n  }\n\n  /**\n   * Deletes a feature flag.\n   */\n  async deleteFlag(key: FeatureFlagKey): Promise<void> {\n    await this.provider.deleteFlag(key);\n    this.logger.info('Feature flag deleted', { key });\n  }\n\n  /**\n   * Gets all rules for a specific flag.\n   */\n  async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    return this.provider.getRules(key);\n  }\n\n  /**\n   * Gets all enabled rules.\n   */\n  async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    return this.provider.getAllRules();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Override Operations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Sets a runtime override for a flag.\n   */\n  setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n    this.provider.setOverride(key, value);\n    this.logger.debug('Override set', { key, value });\n  }\n\n  /**\n   * Removes a runtime override for a flag.\n   */\n  removeOverride(key: FeatureFlagKey): void {\n    this.provider.removeOverride(key);\n    this.logger.debug('Override removed', { key });\n  }\n\n  /**\n   * Clears all runtime overrides.\n   */\n  clearOverrides(): void {\n    this.provider.clearOverrides();\n    this.logger.debug('All overrides cleared');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Subscription\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Subscribes to flag changes.\n   */\n  subscribe(callback: () => void): () => void {\n    return this.provider.subscribe(callback);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Provider Access (for advanced use cases)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Gets the underlying provider instance.\n   * Use with caution - prefer service methods.\n   */\n  getProvider(): FeatureFlagProvider<FeatureFlagKey> {\n    return this.provider;\n  }\n}\n","/**\n * Feature Flag Provider - Core Implementation\n *\n * Main provider class that orchestrates feature flag evaluation and management.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Core feature flag provider implementation\n * @version 1.0.0\n */\n\nimport type {\n  FeatureFlagProvider as IFeatureFlagProvider,\n  FeatureFlagConfig,\n  FeatureFlagContext,\n  FeatureFlagEvaluation,\n  FeatureFlagValue,\n  FetchFeatureFlagDataResponse,\n  FeatureFlag,\n  FeatureFlagRule,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { FeatureFlagEngine } from '@engine/featureFlags/engine';\nimport { CacheManager } from '@base/cache/index';\nimport { TIME_CONSTANTS } from '@plyaz/config';\n\n/**\n * Subscription callback function type\n */\nexport type SubscriptionCallback = () => void;\n\n/**\n * Core feature flag provider that implements the main business logic.\n * This class orchestrates between the evaluation engine, caching, and data providers.\n *\n * @class FeatureFlagProvider\n * @implements {IFeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new MemoryFeatureFlagProvider<MyFeatureFlags>(config, FEATURES);\n * await provider.initialize();\n *\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE', context);\n * const value = await provider.getValue('ROLLOUT_PERCENTAGE', context);\n * ```\n */\nexport abstract class FeatureFlagProvider<FeatureFlagKey extends string>\n  implements IFeatureFlagProvider<FeatureFlagKey>\n{\n  protected engine: FeatureFlagEngine<FeatureFlagKey>;\n  protected cacheManager: CacheManager;\n  protected subscribers = new Set<SubscriptionCallback>();\n  protected refreshTimer?: ReturnType<typeof setInterval>;\n  protected isInitialized = false;\n  protected features: Record<FeatureFlagKey, FeatureFlagValue>;\n  protected initializePromise?: Promise<void>;\n\n  /**\n   * Creates a new feature flag provider.\n   *\n   * @param config - Provider configuration\n   * @param features - Record of feature flag keys to their default values\n   */\n  constructor(\n    protected config: FeatureFlagConfig<FeatureFlagKey>,\n    features: Record<FeatureFlagKey, FeatureFlagValue>\n  ) {\n    this.features = features;\n    // Initialize engine with defaults from FEATURES constant\n    this.engine = new FeatureFlagEngine<FeatureFlagKey>(features, config.isLoggingEnabled ?? false);\n\n    // Initialize cache manager\n    this.cacheManager = new CacheManager({\n      isEnabled: config.isCacheEnabled,\n      ttl: config.cacheTtl,\n      strategy: 'memory', // Default to memory, can be overridden\n    });\n\n    this.setupRefreshTimer();\n  }\n\n  /**\n   * Abstract method to fetch flags and rules from the provider's data source.\n   * Must be implemented by concrete provider classes.\n   *\n   * @protected\n   * @abstract\n   * @returns Promise resolving to flags and rules\n   */\n  protected abstract fetchData(): Promise<FetchFeatureFlagDataResponse<FeatureFlagKey>>;\n\n  /**\n   * Initializes the provider by loading initial data.\n   *\n   * @returns Promise that resolves when initialization is complete\n   */\n  async initialize(): Promise<void> {\n    if (this.isInitialized) {\n      return;\n    }\n\n    // If already initializing, wait for that to complete\n    if (this.initializePromise) {\n      return this.initializePromise;\n    }\n\n    // Create and store the initialization promise\n    this.initializePromise = this.doInitialize();\n    return this.initializePromise;\n  }\n\n  /**\n   * Performs the actual initialization work.\n   *\n   * @private\n   * @returns Promise that resolves when initialization is complete\n   */\n  private async doInitialize(): Promise<void> {\n    try {\n      await this.refresh();\n      this.isInitialized = true;\n      this.log('Provider initialized successfully');\n    } catch (error) {\n      this.log('Failed to initialize provider:', error);\n      // Clear the promise so initialization can be retried\n      this.initializePromise = undefined;\n      throw error;\n    }\n  }\n\n  /**\n   * Gets a feature flag evaluation for the specified key and context.\n   *\n   * @param key - The feature flag key\n   * @param context - Optional context for evaluation\n   * @returns Promise resolving to the flag evaluation\n   */\n  async getFlag(\n    key: FeatureFlagKey,\n    context?: FeatureFlagContext\n  ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    // Check cache first if enabled\n    if (this.config.isCacheEnabled) {\n      const cacheKey = this.generateCacheKey(key, context);\n      const cached = await this.cacheManager.get<FeatureFlagEvaluation<FeatureFlagKey>>(cacheKey);\n      if (cached) {\n        return cached;\n      }\n\n      // Evaluate and cache the result\n      const evaluation = this.engine.evaluate(key, context);\n      await this.cacheManager.set(cacheKey, evaluation);\n      return evaluation;\n    }\n\n    // Direct evaluation without caching\n    return this.engine.evaluate(key, context);\n  }\n\n  /**\n   * Checks if a feature flag is enabled.\n   *\n   * @param key - The feature flag key\n   * @param context - Optional context for evaluation\n   * @returns Promise resolving to boolean indicating if flag is enabled\n   */\n  async isEnabled(key: FeatureFlagKey, context?: FeatureFlagContext): Promise<boolean> {\n    const evaluation = await this.getFlag(key, context);\n    return evaluation.isEnabled;\n  }\n\n  /**\n   * Gets the value of a feature flag.\n   *\n   * @template T - The expected type of the flag value\n   * @param key - The feature flag key\n   * @param context - Optional context for evaluation\n   * @returns Promise resolving to the flag value\n   */\n  async getValue<T = FeatureFlagValue>(\n    key: FeatureFlagKey,\n    context?: FeatureFlagContext\n  ): Promise<T> {\n    const evaluation = await this.getFlag(key, context);\n    return evaluation.value as T;\n  }\n\n  /**\n   * Gets all feature flag evaluations for the given context.\n   *\n   * @param context - Optional context for evaluation\n   * @returns Promise resolving to record of flag evaluations\n   */\n  async getAllFlags(\n    context?: FeatureFlagContext\n  ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n    if (!this.isInitialized) {\n      await this.initialize();\n    }\n\n    const results: Record<string, FeatureFlagEvaluation<FeatureFlagKey>> = {};\n\n    // First, evaluate all default flags from FEATURES\n    for (const key of Object.keys(this.features) as FeatureFlagKey[]) {\n      results[key] = await this.getFlag(key, context);\n    }\n\n    // Then, evaluate any additional flags from the engine\n    const engineFlags = this.engine.getFlags();\n    for (const flag of engineFlags) {\n      if (!(flag.key in results)) {\n        results[flag.key] = await this.getFlag(flag.key, context);\n      }\n    }\n\n    return results;\n  }\n\n  /**\n   * Refreshes the provider by fetching latest data from the source.\n   *\n   * @returns Promise that resolves when refresh is complete\n   */\n  async refresh(): Promise<void> {\n    try {\n      const { flags, rules } = await this.fetchData();\n\n      this.engine.setFlags(flags);\n      this.engine.setRules(rules);\n\n      // Clear cache after refresh\n      await this.cacheManager.clear();\n\n      // Notify subscribers\n      this.notifySubscribers();\n\n      this.log(`Refreshed with ${flags.length} flags and ${rules.length} rules`);\n    } catch (error) {\n      this.log('Failed to refresh provider:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Subscribes to provider updates.\n   *\n   * @param callback - Function to call when provider updates\n   * @returns Unsubscribe function\n   */\n  subscribe(callback: SubscriptionCallback): () => void {\n    this.subscribers.add(callback);\n    return () => {\n      this.subscribers.delete(callback);\n    };\n  }\n\n  /**\n   * Sets an override for a specific flag key.\n   *\n   * @param key - The flag key to override\n   * @param value - The value to force for this flag\n   */\n  setOverride(key: FeatureFlagKey, value: FeatureFlagValue): void {\n    this.engine.setOverride(key, value);\n    void this.cacheManager.clear(); // Clear cache to ensure overrides take effect\n    this.notifySubscribers();\n  }\n\n  /**\n   * Removes an override for a specific flag key.\n   *\n   * @param key - The flag key to remove override for\n   */\n  removeOverride(key: FeatureFlagKey): void {\n    this.engine.removeOverride(key);\n    void this.cacheManager.clear();\n    this.notifySubscribers();\n  }\n\n  /**\n   * Clears all overrides.\n   */\n  clearOverrides(): void {\n    this.engine.clearOverrides();\n    void this.cacheManager.clear();\n    this.notifySubscribers();\n  }\n\n  /**\n   * Disposes of the provider, cleaning up resources.\n   */\n  dispose(): void {\n    if (this.refreshTimer) {\n      clearInterval(this.refreshTimer);\n      this.refreshTimer = undefined;\n    }\n\n    this.subscribers.clear();\n    void this.cacheManager.clear();\n    this.isInitialized = false;\n\n    this.log('Provider disposed');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Flag Management Operations\n  // Each provider implements these based on its storage backend:\n  // - Memory: in-memory storage (ephemeral)\n  // - File: JSON/YAML file storage\n  // - Redis: Redis storage\n  // - API: External API calls\n  // - Database: Database storage\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Creates a new feature flag.\n   * Abstract - each provider implements based on its storage backend.\n   *\n   * @param data - Flag creation data\n   * @returns The created feature flag\n   */\n  abstract createFlag(\n    data: CreateFlagRequest<FeatureFlagKey>\n  ): Promise<FeatureFlag<FeatureFlagKey>>;\n\n  /**\n   * Updates an existing feature flag.\n   * Abstract - each provider implements based on its storage backend.\n   *\n   * @param key - Flag key to update\n   * @param data - Partial flag data to update\n   * @returns The updated feature flag\n   */\n  abstract updateFlag(\n    key: FeatureFlagKey,\n    data: Partial<CreateFlagRequest<FeatureFlagKey>>\n  ): Promise<FeatureFlag<FeatureFlagKey>>;\n\n  /**\n   * Deletes a feature flag.\n   * Abstract - each provider implements based on its storage backend.\n   *\n   * @param key - Flag key to delete\n   */\n  abstract deleteFlag(key: FeatureFlagKey): Promise<void>;\n\n  /**\n   * Gets all rules for a specific flag.\n   * Abstract - each provider implements based on its storage backend.\n   *\n   * @param key - Flag key to get rules for\n   * @returns Array of rules for the flag\n   */\n  abstract getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]>;\n\n  /**\n   * Gets all enabled rules across all flags.\n   * Abstract - each provider implements based on its storage backend.\n   *\n   * @returns Array of all enabled rules\n   */\n  abstract getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]>;\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Optional Extensions\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Optional method to sync features at runtime.\n   * This is useful for providers that can update their features dynamically.\n   *\n   * @param newFeatures - New features to sync\n   * @returns Promise that resolves when sync is complete\n   */\n  syncFeatures?(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void>;\n\n  /**\n   * Generates a cache key for flag evaluation.\n   *\n   * @protected\n   * @param key - Feature flag key\n   * @param context - Evaluation context\n   * @returns Cache key string\n   */\n  protected generateCacheKey(key: FeatureFlagKey, context?: FeatureFlagContext): string {\n    if (!context) {\n      return key;\n    }\n\n    // Create a stable cache key from context\n    const contextKey = JSON.stringify({\n      userId: context.userId,\n      userRole: context.userRole,\n      environment: context.environment,\n      platform: context.platform,\n      country: context.country,\n      version: context.version,\n    });\n\n    return `${key}:${contextKey}`;\n  }\n\n  /**\n   * Sets up the automatic refresh timer if configured.\n   *\n   * @protected\n   */\n  protected setupRefreshTimer(): void {\n    if (this.config.refreshInterval > 0) {\n      this.refreshTimer = setInterval(() => {\n        void this.refresh().catch(error => {\n          this.log('Auto-refresh failed:', error);\n        });\n      }, this.config.refreshInterval * TIME_CONSTANTS.MILLISECONDS_PER_SECOND);\n    }\n  }\n\n  /**\n   * Notifies all subscribers of provider updates.\n   *\n   * @protected\n   */\n  protected notifySubscribers(): void {\n    for (const callback of Array.from(this.subscribers)) {\n      try {\n        callback();\n      } catch (error) {\n        this.log('Subscriber callback error:', error);\n      }\n    }\n  }\n\n  /**\n   * Logs a message if logging is enabled.\n   *\n   * @protected\n   * @param args - Arguments to log\n   */\n  protected log(...args: unknown[]): void {\n    if (this.config.isLoggingEnabled) {\n      console.log('[FeatureFlagProvider]', ...args);\n    }\n  }\n}\n","/**\n * Memory Feature Flag Provider\n *\n * In-memory provider implementation that uses the FEATURES constant for flag data.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Memory provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n  FeatureFlag,\n  FeatureFlagRule,\n  FeatureFlagConfig,\n  FeatureFlagValue,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * Memory-based feature flag provider that loads flags from the FEATURES constant.\n *\n * @class MemoryFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new MemoryFeatureFlagProvider<FeatureFlagKey>({\n *   provider: 'memory',\n *   isCacheEnabled: false,\n *   isLoggingEnabled: true,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class MemoryFeatureFlagProvider<\n  FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n  private flags: FeatureFlag<FeatureFlagKey>[] = [];\n  private rules: FeatureFlagRule<FeatureFlagKey>[] = [];\n\n  /**\n   * Creates a new memory feature flag provider.\n   *\n   * @param config - Provider configuration\n   * @param features - Record of feature flag keys to their default values\n   */\n  constructor(\n    config: FeatureFlagConfig<FeatureFlagKey>,\n    features: Record<FeatureFlagKey, FeatureFlagValue>\n  ) {\n    super(config, features);\n    this.validateConfig();\n  }\n\n  /**\n   * Fetches flags and rules from memory (FEATURES constant).\n   *\n   * @protected\n   * @returns Promise resolving to flags and rules from memory\n   */\n  protected async fetchData(): Promise<{\n    flags: FeatureFlag<FeatureFlagKey>[];\n    rules: FeatureFlagRule<FeatureFlagKey>[];\n  }> {\n    this.log('Fetching feature flags from memory (FEATURES constant)');\n\n    const currentTime = new Date();\n\n    // Convert FEATURES constant to FeatureFlag objects\n    this.flags = Object.entries(this.features).map(([key, value]) =>\n      this.createFeatureFlagFromConstant(\n        key as FeatureFlagKey,\n        value as FeatureFlagValue,\n        currentTime\n      )\n    );\n\n    // Memory provider doesn't have rules by default, but allows manual addition\n    this.rules = [...this.getManualRules()];\n\n    this.log(`Loaded ${this.flags.length} flags and ${this.rules.length} rules from memory`);\n\n    return {\n      flags: this.flags,\n      rules: this.rules,\n    };\n  }\n\n  /**\n   * Creates a FeatureFlag object from a FEATURES constant entry.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @param value - The value from FEATURES constant\n   * @param currentTime - Current timestamp\n   * @returns FeatureFlag object\n   */\n  private createFeatureFlagFromConstant(\n    key: FeatureFlagKey,\n    value: FeatureFlagValue,\n    currentTime: Date\n  ): FeatureFlag<FeatureFlagKey> {\n    return {\n      key,\n      name: this.generateFlagName(key),\n      description: `Memory-based flag for ${key}`,\n      isEnabled: true,\n      value,\n      type: this.inferFlagType(value),\n      environment: 'all',\n      rolloutPercentage: undefined,\n      createdAt: currentTime,\n      updatedAt: currentTime,\n      createdBy: 'memory-system',\n      updatedBy: 'memory-system',\n    } satisfies FeatureFlag<FeatureFlagKey>;\n  }\n\n  /**\n   * Generates a human-readable name from a flag key.\n   *\n   * @private\n   * @param key - The feature flag key\n   * @returns Human-readable flag name\n   */\n  private generateFlagName(key: FeatureFlagKey): string {\n    return key\n      .split('_')\n      .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n      .join(' ');\n  }\n\n  /**\n   * Infers the flag type from its value.\n   *\n   * @private\n   * @param value - The flag value\n   * @returns The inferred type\n   */\n  private inferFlagType(value: FeatureFlagValue): 'boolean' | 'string' | 'number' | 'json' {\n    if (typeof value === 'boolean') return 'boolean';\n    if (typeof value === 'string') return 'string';\n    if (typeof value === 'number') return 'number';\n    return 'json';\n  }\n\n  /**\n   * Gets manually added rules for memory provider.\n   *\n   * @private\n   * @returns Array of manually configured rules\n   */\n  private getManualRules(): FeatureFlagRule<FeatureFlagKey>[] {\n    return this.config.memoryRules ?? [];\n  }\n\n  /**\n   * Validates the memory provider configuration.\n   *\n   * @private\n   * @throws Error if configuration is invalid\n   */\n  private validateConfig(): void {\n    if (this.config.provider !== 'memory') {\n      throw new CorePackageError(\n        'Memory provider requires provider to be set to \"memory\"',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    if (this.config.memoryRules && !Array.isArray(this.config.memoryRules)) {\n      throw new CorePackageError(\n        'memoryRules must be an array if provided',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n  }\n\n  /**\n   * Adds a rule to the memory provider at runtime.\n   *\n   * @param rule - The rule to add\n   */\n  addRule(rule: FeatureFlagRule<FeatureFlagKey>): void {\n    this.rules.push(rule);\n    this.engine.setRules(this.rules);\n    void this.cacheManager.clear();\n    this.notifySubscribers();\n    this.log(`Added rule: ${rule.name} for flag: ${rule.flagKey}`);\n  }\n\n  /**\n   * Removes a rule from the memory provider.\n   *\n   * @param ruleId - The ID of the rule to remove\n   */\n  removeRule(ruleId: string): void {\n    const initialCount = this.rules.length;\n    this.rules = this.rules.filter(rule => rule.id !== ruleId);\n\n    if (this.rules.length < initialCount) {\n      this.engine.setRules(this.rules);\n      void this.cacheManager.clear();\n      this.notifySubscribers();\n      this.log(`Removed rule with ID: ${ruleId}`);\n    } else {\n      this.log(`Rule with ID ${ruleId} not found`);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Flag Management Operations (implements abstract methods)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Creates a new feature flag in memory.\n   *\n   * @param data - Flag creation data\n   * @returns The created feature flag\n   */\n  async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n    if (this.flags.some(f => f.key === data.key)) {\n      throw new CorePackageError(\n        `Flag with key ${data.key} already exists`,\n        ERROR_CODES.DB_DUPLICATE_ENTRY\n      );\n    }\n\n    const currentTime = new Date();\n    const newFlag: FeatureFlag<FeatureFlagKey> = {\n      key: data.key,\n      name: data.name,\n      description: data.description ?? '',\n      value: data.value,\n      isEnabled: data.isEnabled ?? true,\n      type: this.inferFlagType(data.value),\n      environment: data.environment ?? 'all',\n      rolloutPercentage: data.rolloutPercentage,\n      createdAt: currentTime,\n      updatedAt: currentTime,\n      createdBy: 'memory-runtime',\n      updatedBy: 'memory-runtime',\n    };\n\n    this.flags.push(newFlag);\n    this.engine.setFlags(this.flags);\n    void this.cacheManager.clear();\n    this.notifySubscribers();\n\n    this.log(`Created flag: ${data.key}`);\n    return newFlag;\n  }\n\n  /**\n   * Updates an existing feature flag in memory.\n   *\n   * @param key - Flag key to update\n   * @param data - Partial flag data to update\n   * @returns The updated feature flag\n   */\n  async updateFlag(\n    key: FeatureFlagKey,\n    data: Partial<CreateFlagRequest<FeatureFlagKey>>\n  ): Promise<FeatureFlag<FeatureFlagKey>> {\n    const flagIndex = this.flags.findIndex(f => f.key === key);\n    if (flagIndex === -1) {\n      throw new CorePackageError(`Flag with key ${key} not found`, ERROR_CODES.RESOURCE_NOT_FOUND);\n    }\n\n    const existingFlag = this.flags[flagIndex];\n    const updatedFlag: FeatureFlag<FeatureFlagKey> = {\n      ...existingFlag,\n      ...data,\n      key, // Ensure key doesn't change\n      type: data.value !== undefined ? this.inferFlagType(data.value) : existingFlag.type,\n      updatedAt: new Date(),\n      updatedBy: 'memory-runtime',\n    };\n\n    this.flags[flagIndex] = updatedFlag;\n    this.engine.setFlags(this.flags);\n    void this.cacheManager.clear();\n    this.notifySubscribers();\n\n    this.log(`Updated flag: ${key}`);\n    return updatedFlag;\n  }\n\n  /**\n   * Deletes a feature flag from memory.\n   *\n   * @param key - Flag key to delete\n   */\n  async deleteFlag(key: FeatureFlagKey): Promise<void> {\n    const initialCount = this.flags.length;\n    this.flags = this.flags.filter(flag => flag.key !== key);\n\n    if (this.flags.length === initialCount) {\n      throw new CorePackageError(`Flag with key ${key} not found`, ERROR_CODES.RESOURCE_NOT_FOUND);\n    }\n\n    this.engine.setFlags(this.flags);\n    void this.cacheManager.clear();\n    this.notifySubscribers();\n    this.log(`Deleted flag: ${key}`);\n  }\n\n  /**\n   * Gets all rules for a specific flag.\n   *\n   * @param key - Flag key to get rules for\n   * @returns Array of rules for the flag\n   */\n  async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    return this.rules.filter(rule => rule.flagKey === key);\n  }\n\n  /**\n   * Gets all enabled rules.\n   *\n   * @returns Array of all enabled rules\n   */\n  async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    return this.rules.filter(rule => rule.isEnabled);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Memory-specific methods (beyond abstract interface)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Adds a new flag to memory at runtime.\n   *\n   * @param key - The flag key\n   * @param value - The flag value\n   * @param props - Optional flag properties\n   */\n  addFlag(\n    key: FeatureFlagKey,\n    value: FeatureFlagValue,\n    props?: Partial<\n      Pick<\n        FeatureFlag<FeatureFlagKey>,\n        'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n      >\n    >\n  ): void {\n    if (this.flagExists(key)) {\n      return;\n    }\n\n    const newFlag = this.createNewFlag(key, value, props);\n    this.addFlagToStore(key, newFlag, value);\n  }\n\n  /**\n   * Checks if a flag with the given key exists.\n   */\n  private flagExists(key: FeatureFlagKey): boolean {\n    const exists = this.flags.some(flag => flag.key === key);\n    if (exists) {\n      this.log(`Flag with key ${key} already exists in memory`);\n    }\n    return exists;\n  }\n\n  /**\n   * Creates a new flag object.\n   */\n  private createNewFlag(\n    key: FeatureFlagKey,\n    value: FeatureFlagValue,\n    props?: Partial<\n      Pick<\n        FeatureFlag<FeatureFlagKey>,\n        'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n      >\n    >\n  ): FeatureFlag<FeatureFlagKey> {\n    const currentTime = new Date();\n    const flagDefaults = this.getDefaultFlagProperties(key, value);\n    const flagProps = this.mergeWithUserProps(flagDefaults, props);\n\n    return {\n      key,\n      ...flagProps,\n      value,\n      type: flagDefaults.type,\n      createdAt: currentTime,\n      updatedAt: currentTime,\n      createdBy: 'memory-runtime',\n      updatedBy: 'memory-runtime',\n    } satisfies FeatureFlag<FeatureFlagKey>;\n  }\n\n  /**\n   * Gets default properties for a new flag.\n   */\n  private getDefaultFlagProperties(\n    key: FeatureFlagKey,\n    value: FeatureFlagValue\n  ): {\n    name: string;\n    description: string;\n    isEnabled: boolean;\n    type: 'boolean' | 'string' | 'number' | 'json';\n    environment: 'all';\n    rolloutPercentage: undefined;\n  } {\n    return {\n      name: this.generateFlagName(key),\n      description: `Runtime-added flag for ${key}`,\n      isEnabled: true,\n      type: this.inferFlagType(value),\n      environment: 'all' as const,\n      rolloutPercentage: undefined,\n    };\n  }\n\n  /**\n   * Merges default properties with user-provided properties.\n   */\n  private mergeWithUserProps(\n    defaults: ReturnType<typeof this.getDefaultFlagProperties>,\n    props?: Partial<\n      Pick<\n        FeatureFlag<FeatureFlagKey>,\n        'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n      >\n    >\n  ): Pick<\n    FeatureFlag<FeatureFlagKey>,\n    'name' | 'description' | 'isEnabled' | 'environment' | 'rolloutPercentage' | 'type'\n  > {\n    const merged = { ...defaults, ...props };\n\n    // If type is provided in props, use it; otherwise use the inferred type\n    if (props?.type) {\n      merged.type = props.type;\n    }\n\n    return merged;\n  }\n\n  /**\n   * Adds the flag to the store and notifies systems.\n   */\n  private addFlagToStore(\n    key: FeatureFlagKey,\n    newFlag: FeatureFlag<FeatureFlagKey>,\n    value: FeatureFlagValue\n  ): void {\n    this.flags.push(newFlag);\n    this.engine.setFlags(this.flags);\n    void this.cacheManager.clear();\n    this.notifySubscribers();\n    this.log(`Added new flag: ${key} with value:`, value);\n  }\n\n  /**\n   * Removes a flag from memory.\n   *\n   * @param key - The flag key to remove\n   */\n  removeFlag(key: FeatureFlagKey): void {\n    const initialCount = this.flags.length;\n    this.flags = this.flags.filter(flag => flag.key !== key);\n\n    if (this.flags.length < initialCount) {\n      this.engine.setFlags(this.flags);\n      void this.cacheManager.clear();\n      this.notifySubscribers();\n      this.log(`Removed flag: ${key}`);\n    } else {\n      this.log(`Flag with key ${key} not found in memory`);\n    }\n  }\n\n  /**\n   * Gets all current flags in memory.\n   *\n   * @returns Array of current flags\n   */\n  getCurrentFlags(): FeatureFlag<FeatureFlagKey>[] {\n    return [...this.flags];\n  }\n\n  /**\n   * Gets all current rules in memory.\n   *\n   * @returns Array of current rules\n   */\n  getCurrentRules(): FeatureFlagRule<FeatureFlagKey>[] {\n    return [...this.rules];\n  }\n\n  /**\n   * Updates the features object and syncs all flags.\n   * This allows updating the FEATURES constant at runtime.\n   *\n   * @param newFeatures - New features object to sync with\n   */\n  async syncFeatures(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void> {\n    this.log('Syncing with new FEATURES values');\n\n    // Update the internal features reference\n    this.features = newFeatures;\n\n    // Refresh to reload all flags from the new features\n    await this.refresh();\n\n    this.log(`Synced ${Object.keys(newFeatures).length} features`);\n  }\n\n  /**\n   * Resets the memory provider to its initial state.\n   */\n  async reset(): Promise<void> {\n    this.log('Resetting memory provider to initial state');\n    await this.refresh();\n  }\n\n  /**\n   * Gets statistics about the memory provider.\n   *\n   * @returns Provider statistics\n   */\n  getStats(): {\n    flagCount: number;\n    ruleCount: number;\n    cacheSize: number;\n    subscriberCount: number;\n    isInitialized: boolean;\n  } {\n    return {\n      flagCount: this.flags.length,\n      ruleCount: this.rules.length,\n      cacheSize: 0, // Memory cache size would need to be tracked\n      subscriberCount: this.subscribers.size,\n      isInitialized: this.isInitialized,\n    };\n  }\n\n  /**\n   * Logs messages with MemoryFeatureFlagProvider prefix.\n   *\n   * @param args - Arguments to log\n   */\n  protected log(...args: unknown[]): void {\n    if (this.config.isLoggingEnabled) {\n      console.log('[MemoryFeatureFlagProvider]', ...args);\n    }\n  }\n}\n","/**\n * File Feature Flag Provider\n *\n * File-based provider implementation supporting JSON and YAML configuration files.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview File provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n  FeatureFlag,\n  FeatureFlagRule,\n  FeatureFlagConfig,\n  FeatureFlagValue,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { promisify } from 'node:util';\nimport { fileURLToPath } from 'node:url';\nimport * as yaml from 'yaml';\nimport { FILE_CHECK_INTERVAL_DEFAULT, FORMAT_CONSTANTS } from '@plyaz/config';\n\nconst readFile = promisify(fs.readFile);\nconst writeFile = promisify(fs.writeFile);\nconst access = promisify(fs.access);\nconst mkdir = promisify(fs.mkdir);\n\ninterface FileData<FeatureFlagKey extends string> {\n  flags: FeatureFlag<FeatureFlagKey>[];\n  rules: FeatureFlagRule<FeatureFlagKey>[];\n}\n\nconst FORMAT_JSON_INDENT = 2;\n\n/**\n * File-based feature flag provider supporting JSON and YAML formats.\n *\n * @class FileFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new FileFeatureFlagProvider<FeatureFlagKey>({\n *   provider: 'file',\n *   fileConfig: {\n *     filePath: './config/feature-flags.json',\n *     format: 'json',\n *     shouldWatchForChanges: true,\n *   },\n *   isCacheEnabled: true,\n *   cacheTtl: 60,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class FileFeatureFlagProvider<\n  FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n  private fileWatcher?: fs.FSWatcher;\n  private lastFileContent?: string;\n  private fileCheckInterval?: ReturnType<typeof setInterval>;\n  private flags: FeatureFlag<FeatureFlagKey>[] = [];\n  private rules: FeatureFlagRule<FeatureFlagKey>[] = [];\n\n  /**\n   * Creates a new file feature flag provider.\n   *\n   * @param config - Provider configuration with file settings\n   * @param features - Record of feature flag keys to their default values\n   */\n  constructor(\n    config: FeatureFlagConfig<FeatureFlagKey>,\n    features: Record<FeatureFlagKey, FeatureFlagValue>\n  ) {\n    super(config, features);\n    this.validateConfig();\n  }\n\n  /**\n   * Initializes the provider and sets up file watching if enabled.\n   */\n  async initialize(): Promise<void> {\n    await super.initialize();\n\n    // Set up file watching after initialization\n    if (this.config.fileConfig?.shouldWatchForChanges) {\n      this.setupFileWatcher();\n    }\n  }\n\n  /**\n   * Fetches flags and rules from the configuration file.\n   *\n   * @protected\n   * @returns Promise resolving to flags and rules from file\n   */\n  protected async fetchData(): Promise<{\n    flags: FeatureFlag<FeatureFlagKey>[];\n    rules: FeatureFlagRule<FeatureFlagKey>[];\n  }> {\n    const { filePath, format } = this.config.fileConfig!;\n    const resolvedPath = this.resolveFilePath(filePath);\n\n    try {\n      await access(resolvedPath, fs.constants.R_OK);\n      const content = await readFile(resolvedPath, 'utf-8');\n      this.lastFileContent = content;\n      const data = await this.parseFileContent(content, format);\n      this.validateFileData(data);\n\n      // Store flags and rules for CRUD operations\n      this.flags = data.flags || [];\n      this.rules = data.rules || [];\n\n      return {\n        flags: this.flags,\n        rules: this.rules,\n      };\n    } catch (error) {\n      return this.handleFetchDataError(error, resolvedPath, format);\n    }\n  }\n\n  /**\n   * Parses file content based on format.\n   *\n   * @private\n   */\n  private async parseFileContent(\n    content: string,\n    format: 'json' | 'yaml'\n  ): Promise<FileData<FeatureFlagKey>> {\n    if (format === 'json') {\n      return this.parseJSON(content);\n    } else if (format === 'yaml') {\n      return await this.parseYAML(content);\n    }\n    throw new CorePackageError(\n      `Unsupported file format: ${format}`,\n      ERROR_CODES.CLIENT_INVALID_CONFIG\n    );\n  }\n\n  /**\n   * Handles errors for fetchData, including file creation and fallback.\n   *\n   * @private\n   */\n  private async handleFetchDataError(\n    error: unknown,\n    resolvedPath: string,\n    format: 'json' | 'yaml'\n  ): Promise<{ flags: FeatureFlag<FeatureFlagKey>[]; rules: FeatureFlagRule<FeatureFlagKey>[] }> {\n    const isFileNotFound = this.isFileNotFoundError(error);\n\n    if (isFileNotFound && this.config.shouldFallbackToDefaults) {\n      return await this.handleFileNotFound(resolvedPath, format);\n    }\n\n    this.log(`Error reading file ${resolvedPath}:`, error);\n\n    if (this.config.shouldFallbackToDefaults) {\n      return this.handleFallbackToDefaults();\n    }\n\n    throw error;\n  }\n\n  /**\n   * Type guard for NodeJS.ErrnoException.\n   */\n  private isFileNotFoundError(error: unknown): error is globalThis.NodeJS.ErrnoException {\n    return (\n      error instanceof Error &&\n      typeof (error as globalThis.NodeJS.ErrnoException).code === 'string' &&\n      (error as globalThis.NodeJS.ErrnoException).code === 'ENOENT'\n    );\n  }\n\n  /**\n   * Handles the case when the file is not found and fallback is enabled.\n   */\n  private async handleFileNotFound(\n    resolvedPath: string,\n    format: 'json' | 'yaml'\n  ): Promise<{ flags: FeatureFlag<FeatureFlagKey>[]; rules: FeatureFlagRule<FeatureFlagKey>[] }> {\n    this.log(`File not found at ${resolvedPath}, creating with default values`);\n    try {\n      await this.createDefaultFile(resolvedPath, format);\n      const content = await readFile(resolvedPath, 'utf-8');\n      this.lastFileContent = content;\n      const data = await this.parseFileContent(content, format);\n      return {\n        flags: data.flags || [],\n        rules: data.rules || [],\n      };\n    } catch (createError) {\n      this.log('Error creating default file:', createError);\n      return {\n        flags: this.createDefaultFlags(),\n        rules: [],\n      };\n    }\n  }\n\n  /**\n   * Handles fallback to default flags and rules.\n   */\n  private handleFallbackToDefaults(): {\n    flags: FeatureFlag<FeatureFlagKey>[];\n    rules: FeatureFlagRule<FeatureFlagKey>[];\n  } {\n    this.log('Falling back to default values');\n    return {\n      flags: this.createDefaultFlags(),\n      rules: [],\n    };\n  }\n\n  /**\n   * Validates the file provider configuration.\n   *\n   * @private\n   * @throws Error if configuration is invalid\n   */\n  private validateConfig(): void {\n    if (this.config.provider !== 'file') {\n      throw new CorePackageError(\n        'File provider requires provider to be set to \"file\"',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    if (!this.config.fileConfig) {\n      throw new CorePackageError(\n        'File configuration is required for file provider',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    const { filePath, format } = this.config.fileConfig;\n\n    if (!filePath) {\n      throw new CorePackageError('File path is required', ERROR_CODES.CLIENT_INVALID_CONFIG);\n    }\n\n    if (!format || !['json', 'yaml'].includes(format)) {\n      throw new CorePackageError(\n        'File format must be either \"json\" or \"yaml\"',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n  }\n\n  /**\n   * Resolves the file path, supporting relative and absolute paths.\n   *\n   * @private\n   * @param filePath - The file path from configuration\n   * @returns Resolved absolute file path\n   */\n  private resolveFilePath(filePath: string): string {\n    // Default to src/config/feature-provider.json if not provided\n    let pathToResolve = filePath;\n\n    if (!pathToResolve) {\n      // For ES modules, we need to calculate __dirname equivalent\n      // eslint-disable-next-line @typescript-eslint/naming-convention\n      const __filename = fileURLToPath(import.meta.url);\n      // eslint-disable-next-line @typescript-eslint/naming-convention\n      const __dirname = path.dirname(__filename);\n      pathToResolve = path.join(__dirname, '../../../config/feature-provider.json');\n    }\n\n    // If absolute path, return as is\n    if (path.isAbsolute(pathToResolve)) {\n      return pathToResolve;\n    }\n\n    // Resolve relative to current working directory\n    return path.resolve(process.cwd(), pathToResolve);\n  }\n\n  /**\n   * Parses JSON content.\n   *\n   * @private\n   * @param content - File content\n   * @returns Parsed data\n   */\n  private parseJSON(content: string): FileData<FeatureFlagKey> {\n    try {\n      return JSON.parse(content);\n    } catch (error) {\n      throw new CorePackageError(\n        `Invalid JSON format: ${error instanceof Error ? error.message : String(error)}`,\n        ERROR_CODES.VALIDATION_ERROR\n      );\n    }\n  }\n\n  /**\n   * Parses YAML content.\n   *\n   * @private\n   * @param content - File content\n   * @returns Parsed data\n   */\n  private async parseYAML(content: string): Promise<FileData<FeatureFlagKey>> {\n    try {\n      const data = yaml.parse(content) as FileData<FeatureFlagKey>;\n      return data;\n    } catch (error) {\n      throw new CorePackageError(\n        `Invalid YAML format: ${error instanceof Error ? error.message : String(error)}`,\n        ERROR_CODES.VALIDATION_ERROR\n      );\n    }\n  }\n\n  /**\n   * Validates the structure of file data.\n   *\n   * @private\n   * @param data - Parsed file data\n   */\n  private validateFileData(data: unknown): void {\n    if (!data || typeof data !== 'object') {\n      throw new CorePackageError('File must contain a valid object', ERROR_CODES.VALIDATION_ERROR);\n    }\n\n    const fileData = data as Record<string, unknown>;\n\n    this.checkFlagsArray(fileData.flags);\n    this.checkRulesArray(fileData.rules);\n  }\n\n  private checkFlagsArray(flags: unknown): void {\n    if (flags && !Array.isArray(flags)) {\n      throw new CorePackageError('\"flags\" must be an array', ERROR_CODES.VALIDATION_ERROR);\n    }\n    if (Array.isArray(flags)) {\n      this.validateFlags(flags);\n    }\n  }\n\n  private checkRulesArray(rules: unknown): void {\n    if (rules && !Array.isArray(rules)) {\n      throw new CorePackageError('\"rules\" must be an array', ERROR_CODES.VALIDATION_ERROR);\n    }\n    if (Array.isArray(rules)) {\n      this.validateRules(rules);\n    }\n  }\n\n  private validateFlags(flags: unknown[]): void {\n    flags.forEach((flag: unknown, index: number) => {\n      if (!flag || typeof flag !== 'object') {\n        throw new CorePackageError(\n          `Flag at index ${index} must be an object`,\n          ERROR_CODES.VALIDATION_ERROR\n        );\n      }\n      const flagObj = flag as Record<string, unknown>;\n      if (!flagObj.key || typeof flagObj.key !== 'string') {\n        throw new CorePackageError(\n          `Flag at index ${index} must have a \"key\" property`,\n          ERROR_CODES.VALIDATION_ERROR\n        );\n      }\n      if (flagObj.value === undefined) {\n        throw new CorePackageError(\n          `Flag \"${flagObj.key}\" must have a \"value\" property`,\n          ERROR_CODES.VALIDATION_ERROR\n        );\n      }\n    });\n  }\n\n  private validateRules(rules: unknown[]): void {\n    rules.forEach((rule: unknown, index: number) => {\n      if (!rule || typeof rule !== 'object') {\n        throw new CorePackageError(\n          `Rule at index ${index} must be an object`,\n          ERROR_CODES.VALIDATION_ERROR\n        );\n      }\n      const ruleObj = rule as Record<string, unknown>;\n      if (!ruleObj.id || typeof ruleObj.id !== 'string') {\n        throw new CorePackageError(\n          `Rule at index ${index} must have an \"id\" property`,\n          ERROR_CODES.VALIDATION_ERROR\n        );\n      }\n      if (!ruleObj.flagKey || typeof ruleObj.flagKey !== 'string') {\n        throw new CorePackageError(\n          `Rule \"${ruleObj.id}\" must have a \"flagKey\" property`,\n          ERROR_CODES.VALIDATION_ERROR\n        );\n      }\n      if (!Array.isArray(ruleObj.conditions)) {\n        throw new CorePackageError(\n          `Rule \"${ruleObj.id}\" must have a \"conditions\" array`,\n          ERROR_CODES.VALIDATION_ERROR\n        );\n      }\n    });\n  }\n\n  /**\n   * Creates a default configuration file with values from features.\n   *\n   * @private\n   * @param filePath - Path where to create the file\n   * @param format - File format (json or yaml)\n   */\n  private async createDefaultFile(filePath: string, format: 'json' | 'yaml'): Promise<void> {\n    // Ensure directory exists\n    const dir = path.dirname(filePath);\n    await mkdir(dir, { recursive: true });\n\n    // Create default data structure\n    const defaultData: FileData<FeatureFlagKey> = {\n      flags: this.createDefaultFlags(),\n      rules: [],\n    };\n\n    // Serialize based on format\n    let content: string;\n    if (format === 'json') {\n      content = JSON.stringify(defaultData, null, FORMAT_CONSTANTS.JSON_INDENT_SPACES);\n    } else {\n      content = yaml.stringify(defaultData);\n    }\n\n    // Write file\n    await writeFile(filePath, content, 'utf-8');\n    this.log(`Created default feature flag file at: ${filePath}`);\n  }\n\n  /**\n   * Creates default flags from the features configuration.\n   *\n   * @private\n   * @returns Array of default flags\n   */\n  private createDefaultFlags(): FeatureFlag<FeatureFlagKey>[] {\n    return Object.entries(this.features).map(([key, value]) => ({\n      key: key as FeatureFlagKey,\n      value: value as FeatureFlagValue,\n      isEnabled: true,\n      name: key,\n      description: `Default flag for ${key}`,\n      type:\n        typeof value === 'boolean'\n          ? 'boolean'\n          : typeof value === 'number'\n            ? 'number'\n            : typeof value === 'string'\n              ? 'string'\n              : 'json',\n      environment: 'development',\n      createdAt: new Date(),\n      updatedAt: new Date(),\n      createdBy: 'system',\n      updatedBy: 'system',\n      metadata: {},\n      tags: [],\n    }));\n  }\n\n  /**\n   * Sets up file watching for hot reload if enabled.\n   *\n   * @private\n   */\n  private setupFileWatcher(): void {\n    if (!this.config.fileConfig?.shouldWatchForChanges) {\n      return;\n    }\n\n    const { filePath } = this.config.fileConfig;\n    const resolvedPath = this.resolveFilePath(filePath);\n\n    try {\n      // Use fs.watch for file system events\n      this.fileWatcher = fs.watch(resolvedPath, async eventType => {\n        if (eventType === 'change') {\n          this.log(`File changed: ${resolvedPath}`);\n\n          // Debounce rapid changes\n          if (this.fileCheckInterval) {\n            clearTimeout(this.fileCheckInterval);\n          }\n\n          this.fileCheckInterval = setTimeout(async () => {\n            try {\n              // Check if content actually changed\n              const content = await readFile(resolvedPath, 'utf-8');\n              if (content !== this.lastFileContent) {\n                this.log('File content changed, refreshing...');\n                await this.refresh();\n              }\n            } catch (error) {\n              this.log('Error reading changed file:', error);\n            }\n          }, this.config.fileConfig?.fileCheckInterval ?? FILE_CHECK_INTERVAL_DEFAULT); // Use configured interval or default\n        }\n      });\n\n      this.log(`File watching enabled for: ${resolvedPath}`);\n    } catch (error) {\n      this.log(`Failed to set up file watching: ${error}`);\n      // File watching is optional, so we don't throw\n    }\n  }\n\n  /**\n   * Disposes of the file provider and stops file watching.\n   */\n  dispose(): void {\n    super.dispose();\n\n    if (this.fileWatcher) {\n      this.fileWatcher.close();\n      this.fileWatcher = undefined;\n      this.log('File watching stopped');\n    }\n\n    if (this.fileCheckInterval) {\n      clearTimeout(this.fileCheckInterval);\n      this.fileCheckInterval = undefined;\n    }\n  }\n\n  /**\n   * Refreshes the provider by fetching latest data from the file.\n   * Overrides base class to store rules.\n   *\n   * @returns Promise that resolves when refresh is complete\n   */\n  async refresh(): Promise<void> {\n    // Just call parent refresh - it will call fetchData and set everything properly\n    await super.refresh();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Flag Management Operations (implements abstract methods)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Creates a new feature flag and persists to file.\n   *\n   * @param data - Flag creation data\n   * @returns The created feature flag\n   */\n  async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n    if (this.flags.some(f => f.key === data.key)) {\n      throw new CorePackageError(\n        `Flag with key ${data.key} already exists`,\n        ERROR_CODES.DB_DUPLICATE_ENTRY\n      );\n    }\n\n    const currentTime = new Date();\n    const newFlag: FeatureFlag<FeatureFlagKey> = {\n      key: data.key,\n      name: data.name,\n      description: data.description ?? '',\n      value: data.value,\n      isEnabled: data.isEnabled ?? true,\n      type: this.inferFlagType(data.value),\n      environment: data.environment ?? 'all',\n      rolloutPercentage: data.rolloutPercentage,\n      createdAt: currentTime,\n      updatedAt: currentTime,\n      createdBy: 'file-provider',\n      updatedBy: 'file-provider',\n    };\n\n    this.flags.push(newFlag);\n    await this.persistToFile();\n    this.log(`Created flag: ${data.key}`);\n    return newFlag;\n  }\n\n  /**\n   * Updates an existing feature flag and persists to file.\n   *\n   * @param key - Flag key to update\n   * @param data - Partial flag data to update\n   * @returns The updated feature flag\n   */\n  async updateFlag(\n    key: FeatureFlagKey,\n    data: Partial<CreateFlagRequest<FeatureFlagKey>>\n  ): Promise<FeatureFlag<FeatureFlagKey>> {\n    const flagIndex = this.flags.findIndex(f => f.key === key);\n    if (flagIndex === -1) {\n      throw new CorePackageError(`Flag with key ${key} not found`, ERROR_CODES.RESOURCE_NOT_FOUND);\n    }\n\n    const existingFlag = this.flags[flagIndex];\n    const updatedFlag: FeatureFlag<FeatureFlagKey> = {\n      ...existingFlag,\n      ...data,\n      key, // Ensure key doesn't change\n      type: data.value !== undefined ? this.inferFlagType(data.value) : existingFlag.type,\n      updatedAt: new Date(),\n      updatedBy: 'file-provider',\n    };\n\n    this.flags[flagIndex] = updatedFlag;\n    await this.persistToFile();\n    this.log(`Updated flag: ${key}`);\n    return updatedFlag;\n  }\n\n  /**\n   * Deletes a feature flag and persists to file.\n   *\n   * @param key - Flag key to delete\n   */\n  async deleteFlag(key: FeatureFlagKey): Promise<void> {\n    const initialCount = this.flags.length;\n    this.flags = this.flags.filter(flag => flag.key !== key);\n\n    if (this.flags.length === initialCount) {\n      throw new CorePackageError(`Flag with key ${key} not found`, ERROR_CODES.RESOURCE_NOT_FOUND);\n    }\n\n    await this.persistToFile();\n    this.log(`Deleted flag: ${key}`);\n  }\n\n  /**\n   * Gets all rules for a specific flag.\n   *\n   * @param key - Flag key to get rules for\n   * @returns Array of rules for the flag\n   */\n  async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    return this.rules.filter(rule => rule.flagKey === key);\n  }\n\n  /**\n   * Gets all enabled rules.\n   *\n   * @returns Array of all enabled rules\n   */\n  async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    return this.rules.filter(rule => rule.isEnabled);\n  }\n\n  /**\n   * Persists current flags and rules to file.\n   *\n   * @private\n   */\n  private async persistToFile(): Promise<void> {\n    const { filePath, format } = this.config.fileConfig!;\n    const resolvedPath = this.resolveFilePath(filePath);\n\n    const fileData: FileData<FeatureFlagKey> = {\n      flags: this.flags,\n      rules: this.rules,\n    };\n\n    let content: string;\n    if (format === 'json') {\n      content = JSON.stringify(fileData, null, FORMAT_JSON_INDENT);\n    } else {\n      content = yaml.stringify(fileData);\n    }\n\n    await writeFile(resolvedPath, content, 'utf-8');\n    this.lastFileContent = content;\n\n    // Update engine with new flags\n    this.engine.setFlags(this.flags);\n    this.engine.setRules(this.rules);\n    void this.cacheManager.clear();\n    this.notifySubscribers();\n  }\n\n  /**\n   * Infers the flag type from its value.\n   *\n   * @private\n   */\n  private inferFlagType(value: FeatureFlagValue): 'boolean' | 'string' | 'number' | 'json' {\n    if (typeof value === 'boolean') return 'boolean';\n    if (typeof value === 'string') return 'string';\n    if (typeof value === 'number') return 'number';\n    return 'json';\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // File-specific methods (beyond abstract interface)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Updates the features object and writes to file.\n   * This allows updating the FEATURES at runtime and persisting to file.\n   *\n   * @param newFeatures - New features object to sync with\n   */\n  async syncFeatures(newFeatures: Record<FeatureFlagKey, FeatureFlagValue>): Promise<void> {\n    this.log('Syncing with new FEATURES values and updating file');\n\n    // Update the internal features reference\n    this.features = newFeatures;\n\n    // Create new file data with updated features\n    const fileData: FileData<FeatureFlagKey> = {\n      flags: this.createDefaultFlags(),\n      rules: this.rules || [],\n    };\n\n    // Write to file\n    const { filePath, format } = this.config.fileConfig!;\n    const resolvedPath = this.resolveFilePath(filePath);\n\n    try {\n      let content: string;\n      if (format === 'json') {\n        content = JSON.stringify(fileData, null, FORMAT_CONSTANTS.JSON_INDENT_SPACES);\n      } else {\n        content = yaml.stringify(fileData);\n      }\n\n      await writeFile(resolvedPath, content, 'utf-8');\n      this.lastFileContent = content;\n\n      // Update engine defaults before refresh\n      this.engine.updateDefaults(newFeatures);\n\n      // Refresh to reload from file (this will trigger watchers if enabled)\n      await this.refresh();\n\n      this.log(`Synced ${Object.keys(newFeatures).length} features to file: ${resolvedPath}`);\n    } catch (error) {\n      this.log('Error syncing features to file:', error);\n      throw new CorePackageError(\n        `Failed to sync features to file: ${error instanceof Error ? error.message : String(error)}`,\n        ERROR_CODES.STORAGE_FILE_WRITE_FAILED\n      );\n    }\n  }\n\n  /**\n   * Gets information about the file provider.\n   *\n   * @returns File provider information\n   */\n  getFileInfo(): {\n    filePath?: string;\n    resolvedPath?: string;\n    format?: string;\n    isWatchEnabled: boolean;\n    isImplemented: boolean;\n    lastModified?: Date;\n  } {\n    const filePath = this.config.fileConfig?.filePath;\n    const resolvedPath = filePath ? this.resolveFilePath(filePath) : undefined;\n\n    let lastModified: Date | undefined;\n    if (resolvedPath) {\n      try {\n        const stats = fs.statSync(resolvedPath);\n        lastModified = stats.mtime;\n      } catch {\n        // File might not exist\n      }\n    }\n\n    return {\n      filePath,\n      resolvedPath,\n      format: this.config.fileConfig?.format,\n      isWatchEnabled: Boolean(this.config.fileConfig?.shouldWatchForChanges),\n      isImplemented: true,\n      lastModified,\n    };\n  }\n}\n","/**\n * Redis Feature Flag Provider\n *\n * Redis-based provider implementation supporting distributed caching and storage.\n * This will be moved to @plyaz/core when the package structure is finalized.\n *\n * @fileoverview Redis provider implementation for feature flags\n * @version 1.0.0\n */\n\nimport type {\n  FeatureFlag,\n  FeatureFlagRule,\n  FeatureFlagConfig,\n  FeatureFlagValue,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\n\n/**\n * Redis-based feature flag provider supporting distributed caching and storage.\n *\n * @class RedisFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * const provider = new RedisFeatureFlagProvider<FeatureFlagKey>({\n *   provider: 'redis',\n *   redisConfig: {\n *     url: 'redis://localhost:6379',\n *     keyPrefix: 'feature_flags',\n *   },\n *   isCacheEnabled: true,\n *   cacheTtl: 300,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('AUTH_GOOGLE');\n * ```\n */\nexport class RedisFeatureFlagProvider<\n  FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n  /**\n   * Creates a new Redis feature flag provider.\n   *\n   * @param config - Provider configuration with Redis settings\n   * @param features - Record of feature flag keys to their default values\n   */\n  constructor(\n    config: FeatureFlagConfig<FeatureFlagKey>,\n    features: Record<FeatureFlagKey, FeatureFlagValue>\n  ) {\n    super(config, features);\n    this.validateConfig();\n    throw new CorePackageError(\n      'Redis provider requires @plyaz/core on Cache implementation',\n      ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n    );\n  }\n\n  /**\n   * Fetches flags and rules from Redis storage.\n   *\n   * @protected\n   * @returns Promise resolving to flags and rules from Redis\n   */\n  protected async fetchData(): Promise<{\n    flags: FeatureFlag<FeatureFlagKey>[];\n    rules: FeatureFlagRule<FeatureFlagKey>[];\n  }> {\n    throw new CorePackageError(\n      'Redis Provider is not yet fully implemented. Requires integration with cache layer.',\n      ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n    );\n  }\n\n  /**\n   * Validates the Redis provider configuration.\n   *\n   * @private\n   * @throws Error if configuration is invalid\n   */\n  private validateConfig(): void {\n    if (this.config.provider !== 'redis') {\n      throw new CorePackageError(\n        'Redis provider requires provider to be set to \"redis\"',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    if (!this.config.redisConfig) {\n      throw new CorePackageError(\n        'Redis configuration is required for Redis provider',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    if (!this.config.redisConfig.url) {\n      throw new CorePackageError('Redis URL is required', ERROR_CODES.CLIENT_INVALID_CONFIG);\n    }\n\n    if (!this.isValidRedisUrl(this.config.redisConfig.url)) {\n      throw new CorePackageError(\n        'Redis URL must be a valid Redis connection string (redis:// or rediss://)',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    // Configuration is valid, but implementation is not complete\n    this.log('Redis provider configuration is valid, but implementation is not ready');\n    this.log('Redis URL:', this.config.redisConfig.url);\n    this.log('Key Prefix:', this.config.redisConfig.keyPrefix ?? 'feature_flags');\n  }\n\n  /**\n   * Validates Redis URL format.\n   *\n   * @private\n   * @param url - URL to validate\n   * @returns True if valid Redis URL\n   */\n  private isValidRedisUrl(url: string): boolean {\n    return url.startsWith('redis://') || url.startsWith('rediss://');\n  }\n\n  /**\n   * Gets Redis provider information.\n   *\n   * @returns Redis provider status information\n   */\n  getRedisInfo(): {\n    url?: string;\n    keyPrefix?: string;\n    isImplemented: boolean;\n    requiredImplementation: string[];\n    recommendedPatterns: string[];\n  } {\n    return {\n      url: this.config.redisConfig?.url,\n      keyPrefix: this.config.redisConfig?.keyPrefix ?? 'feature_flags',\n      isImplemented: false,\n      requiredImplementation: [\n        'Integration with cache/strategies/redis.ts',\n        'Redis data storage patterns',\n        'Client management and health monitoring',\n        'Data serialization/deserialization',\n        'Key management strategies',\n      ],\n      recommendedPatterns: [\n        'Hash-based storage for flags',\n        'List-based storage for rules',\n        'Pub/Sub for real-time updates',\n        'TTL for automatic cleanup',\n      ],\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Flag Management Operations (stub implementations)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  // eslint-disable-next-line no-unused-vars\n  async createFlag(_data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n    throw new CorePackageError(\n      'Redis provider not yet implemented',\n      ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n    );\n  }\n\n  async updateFlag(\n    // eslint-disable-next-line no-unused-vars\n    _key: FeatureFlagKey,\n    // eslint-disable-next-line no-unused-vars\n    _data: Partial<CreateFlagRequest<FeatureFlagKey>>\n  ): Promise<FeatureFlag<FeatureFlagKey>> {\n    throw new CorePackageError(\n      'Redis provider not yet implemented',\n      ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n    );\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  async deleteFlag(_key: FeatureFlagKey): Promise<void> {\n    throw new CorePackageError(\n      'Redis provider not yet implemented',\n      ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n    );\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  async getRules(_key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    throw new CorePackageError(\n      'Redis provider not yet implemented',\n      ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n    );\n  }\n\n  async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    throw new CorePackageError(\n      'Redis provider not yet implemented',\n      ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n    );\n  }\n}\n","/**\n * API Feature Flag Provider\n *\n * Provider adapter that uses @plyaz/api services with an injected API client\n * to fetch feature flags from a remote API. This provider extends the base\n * FeatureFlagProvider and implements fetchData() using the API services.\n *\n * @fileoverview API provider adapter for feature flags\n * @version 2.0.0\n */\n\nimport type {\n  FeatureFlag,\n  FeatureFlagRule,\n  FeatureFlagValue,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { BaseError, CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\n\n// Import API services from @plyaz/api\nimport {\n  createFeatureFlag as apiCreateFlag,\n  updateFeatureFlag as apiUpdateFlag,\n  deleteFeatureFlag as apiDeleteFlag,\n  evaluateAllFeatureFlags as apiEvaluateAllFlags,\n  fetchFeatureFlagRules as apiFetchRules,\n} from '@plyaz/api/frontend';\nimport type { ServiceOptions } from '@plyaz/types/api';\nimport type { ApiFeatureFlagConfig as _ApiFeatureFlagConfig } from '@plyaz/types/features';\n\n// API client type from ServiceOptions\ntype ApiClientType = NonNullable<ServiceOptions['apiClient']>;\n\n/**\n * API response type for fetching flags and rules\n */\ninterface ApiFetchResponse<TKey extends string> {\n  flags: FeatureFlag<TKey>[];\n  rules: FeatureFlagRule<TKey>[];\n}\n\n/**\n * API-based feature flag provider\n *\n * Uses @plyaz/api services with an injected API client to communicate with the backend.\n * Pass your configured API client via the config.\n *\n * @class ApiFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // Get client from ApiClientService\n * const apiClient = ApiClientService.getClient();\n *\n * const provider = new ApiFeatureFlagProvider({\n *   provider: 'api',\n *   apiClient,\n *   isCacheEnabled: true,\n *   cacheTtl: 300,\n * }, FEATURES);\n *\n * await provider.initialize();\n * const isEnabled = await provider.isEnabled('new-feature');\n * ```\n */\nexport class ApiFeatureFlagProvider<\n  FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n  protected readonly apiClient: ApiClientType;\n\n  /**\n   * Creates a new API feature flag provider.\n   *\n   * @param config - Provider configuration with API client\n   * @param features - Record of feature flag keys to default values\n   */\n  constructor(\n    config: _ApiFeatureFlagConfig<FeatureFlagKey>,\n    features: Record<FeatureFlagKey, FeatureFlagValue>\n  ) {\n    super(config, features);\n\n    if (!config.apiClient) {\n      throw new CorePackageError(\n        'API provider requires apiClient in config',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    this.apiClient = config.apiClient;\n    this.validateConfig();\n  }\n\n  /**\n   * Get service options with injected client\n   */\n  private getServiceOptions(): ServiceOptions {\n    return { apiClient: this.apiClient };\n  }\n\n  /** Wrap error in CorePackageError if not already a package error */\n  private wrapError(error: unknown): CorePackageError {\n    // If already a package error (BaseError subclass), return as-is\n    if (error instanceof BaseError) {\n      return error as CorePackageError;\n    }\n    // Wrap other errors\n    return new CorePackageError(\n      `API request failed: ${error instanceof Error ? error.message : String(error)}`,\n      ERROR_CODES.NETWORK_ERROR,\n      { cause: error instanceof Error ? error : undefined }\n    );\n  }\n\n  /** Transform API response to flags/rules */\n  private transformResponse(data: ApiFetchResponse<FeatureFlagKey> | undefined): {\n    flags: FeatureFlag<FeatureFlagKey>[];\n    rules: FeatureFlagRule<FeatureFlagKey>[];\n  } {\n    const flags = data?.flags ?? [];\n    const rules = data?.rules ?? [];\n    this.log(`Fetched ${flags.length} flags and ${rules.length} rules from API`);\n    return { flags, rules };\n  }\n\n  /**\n   * Fetches flags and rules from the API endpoint using @plyaz/api services.\n   *\n   * @protected\n   * @returns Promise resolving to flags and rules data\n   */\n  protected async fetchData(): Promise<{\n    flags: FeatureFlag<FeatureFlagKey>[];\n    rules: FeatureFlagRule<FeatureFlagKey>[];\n  }> {\n    try {\n      const apiConfig = this.config as _ApiFeatureFlagConfig<FeatureFlagKey>;\n      const response = await apiEvaluateAllFlags<FeatureFlagKey>(\n        { context: apiConfig.context },\n        this.getServiceOptions()\n      );\n\n      if (!response.isSuccess) {\n        throw new CorePackageError(\n          `Failed to fetch feature flags: ${response.error?.message}`,\n          ERROR_CODES.NETWORK_ERROR\n        );\n      }\n\n      const data = response.data as unknown as ApiFetchResponse<FeatureFlagKey>;\n      return this.transformResponse(data);\n    } catch (error) {\n      throw this.wrapError(error);\n    }\n  }\n\n  /**\n   * Validates the API provider configuration.\n   *\n   * @private\n   */\n  private validateConfig(): void {\n    if (this.config.provider !== 'api') {\n      throw new CorePackageError(\n        'API provider requires provider to be set to \"api\"',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    this.log('API provider configured');\n  }\n\n  /**\n   * Gets API provider status and configuration info.\n   */\n  getApiInfo(): {\n    hasApiClient: boolean;\n  } {\n    return {\n      hasApiClient: Boolean(this.apiClient),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Flag Management Operations (using @plyaz/api services)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Creates a new feature flag via API\n   */\n  async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n    const requestData = {\n      ...data,\n      isEnabled: data.isEnabled ?? true,\n      environment: data.environment ?? 'development',\n      description: data.description ?? '',\n    };\n    const response = await apiCreateFlag<FeatureFlagKey>(requestData, this.getServiceOptions());\n\n    if (!response.isSuccess) {\n      throw new CorePackageError(\n        `Failed to create flag: ${response.error?.message}`,\n        ERROR_CODES.CONTEXT_OPERATION_FAILED\n      );\n    }\n\n    await this.refresh();\n    return response.data as unknown as FeatureFlag<FeatureFlagKey>;\n  }\n\n  /**\n   * Updates a feature flag via API\n   */\n  async updateFlag(\n    key: FeatureFlagKey,\n    data: Partial<CreateFlagRequest<FeatureFlagKey>>\n  ): Promise<FeatureFlag<FeatureFlagKey>> {\n    const response = await apiUpdateFlag<FeatureFlagKey>({ key, data }, this.getServiceOptions());\n\n    if (!response.isSuccess) {\n      throw new CorePackageError(\n        `Failed to update flag: ${response.error?.message}`,\n        ERROR_CODES.CONTEXT_OPERATION_FAILED\n      );\n    }\n\n    await this.refresh();\n    return response.data as unknown as FeatureFlag<FeatureFlagKey>;\n  }\n\n  /**\n   * Deletes a feature flag via API\n   */\n  async deleteFlag(key: FeatureFlagKey): Promise<void> {\n    const response = await apiDeleteFlag<FeatureFlagKey>(key, this.getServiceOptions());\n\n    if (!response.isSuccess) {\n      throw new CorePackageError(\n        `Failed to delete flag: ${response.error?.message}`,\n        ERROR_CODES.CONTEXT_OPERATION_FAILED\n      );\n    }\n\n    await this.refresh();\n  }\n\n  /**\n   * Gets rules for a specific flag via API\n   */\n  async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    const response = await apiFetchRules<FeatureFlagKey>(key, this.getServiceOptions());\n\n    if (!response.isSuccess) {\n      throw new CorePackageError(\n        `Failed to get rules: ${response.error?.message}`,\n        ERROR_CODES.CONTEXT_OPERATION_FAILED\n      );\n    }\n\n    return (response.data as unknown as { rules: FeatureFlagRule<FeatureFlagKey>[] })?.rules ?? [];\n  }\n\n  /**\n   * Gets all rules via API\n   * Note: This requires fetching rules for all flags individually or a dedicated endpoint\n   */\n  async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    // For now, return the rules from the engine (populated by fetchData)\n    // A dedicated API endpoint would be needed for a direct call\n    return this.engine.getRules();\n  }\n}\n","/**\n * Database Feature Flag Provider\n *\n * Database-based provider using DbService for persistent storage.\n * Requires Core.initialize() to be called first with database config.\n *\n * @fileoverview Database provider for feature flags\n */\n\nimport type {\n  FeatureFlag,\n  FeatureFlagRule,\n  FeatureFlagConfig,\n  FeatureFlagValue,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagProvider } from '../provider';\nimport { DbService } from '../../../services/DbService';\nimport { FeatureFlagDatabaseRepository } from '@models/featureFlags';\nimport type { CoreFeatureFlagTableConfig } from '@plyaz/types/core';\nimport { PackageLogger } from '@plyaz/logger';\n\n/**\n * Database-based feature flag provider with @plyaz/db integration.\n *\n * Uses DbService (configured via Core.initialize()) for database operations.\n * No connection string needed here - DbService handles all connection details.\n *\n * @class DatabaseFeatureFlagProvider\n * @extends {FeatureFlagProvider}\n *\n * @example\n * ```typescript\n * // First: Initialize Core with database config\n * await Core.initialize({\n *   db: { adapter: 'sql', sql: { connectionString: '...' } }\n * });\n *\n * // Then: Create database provider\n * const provider = new DatabaseFeatureFlagProvider({\n *   provider: 'database',\n *   isCacheEnabled: true,\n *   cacheTtl: 300,\n * }, FEATURES);\n * await provider.initialize();\n * ```\n */\nexport class DatabaseFeatureFlagProvider<\n  FeatureFlagKey extends string,\n> extends FeatureFlagProvider<FeatureFlagKey> {\n  private _repository?: FeatureFlagDatabaseRepository<FeatureFlagKey>;\n  private _tableConfig?: Partial<CoreFeatureFlagTableConfig>;\n  private readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'DatabaseFeatureFlagProvider',\n  });\n\n  /**\n   * Lazily get the repository, creating it on first access after DbService is initialized.\n   */\n  private get repository(): FeatureFlagDatabaseRepository<FeatureFlagKey> {\n    if (!this._repository) {\n      if (!DbService.isInitialized()) {\n        throw new CorePackageError(\n          'DbService not initialized. Call Core.initialize() with db config before accessing repository.',\n          ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n        );\n      }\n      const db = DbService.getInstance().getDatabase();\n      this._repository = new FeatureFlagDatabaseRepository<FeatureFlagKey>(db, this._tableConfig);\n    }\n    return this._repository;\n  }\n\n  /**\n   * Creates a new database feature flag provider.\n   *\n   * @param config - Provider configuration\n   * @param features - Default feature flag values\n   */\n  constructor(\n    config: FeatureFlagConfig<FeatureFlagKey>,\n    features: Record<FeatureFlagKey, FeatureFlagValue>\n  ) {\n    super(config, features);\n\n    // Build table config from databaseConfig (only include defined values)\n    // This prevents undefined values from overriding defaults in the repository\n    const tableConfig: Partial<CoreFeatureFlagTableConfig> | undefined = config.databaseConfig\n      ? (Object.fromEntries(\n          Object.entries({\n            flagsTable: config.databaseConfig.tableName,\n            rulesTable: config.databaseConfig.rulesTableName,\n            evaluationsTable: config.databaseConfig.evaluationsTableName,\n            overridesTable: config.databaseConfig.overridesTableName,\n            evaluationsSchema: config.databaseConfig.evaluationsSchema,\n          }).filter(([, value]) => value !== undefined)\n        ) as Partial<CoreFeatureFlagTableConfig>)\n      : undefined;\n\n    // Repository will be created lazily on first use after DbService is initialized\n    this._tableConfig = tableConfig;\n  }\n\n  /**\n   * Initialize database connection via DbService\n   */\n  async initialize(): Promise<void> {\n    // Ensure DbService is initialized (via Core.initialize())\n    if (!DbService.isInitialized()) {\n      throw new CorePackageError(\n        'DbService not initialized. Call Core.initialize() with db config before using database provider.',\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n    this.logger.info('Database feature flag provider initializing');\n    await super.initialize();\n    this.logger.info('Database feature flag provider initialized');\n  }\n\n  /**\n   * Fetches flags and rules from the database.\n   *\n   * @protected\n   * @returns Promise with flags and rules from database\n   */\n  protected async fetchData(): Promise<{\n    flags: FeatureFlag<FeatureFlagKey>[];\n    rules: FeatureFlagRule<FeatureFlagKey>[];\n  }> {\n    try {\n      const [flags, rules] = await Promise.all([\n        this.repository.getAllFlags(),\n        this.repository.getAllRules(),\n      ]);\n\n      this.logger.debug(`Fetched ${flags.length} flags and ${rules.length} rules from database`);\n\n      return { flags, rules };\n    } catch (error) {\n      this.logger.error('Failed to fetch feature flag data from database', { error });\n      throw error;\n    }\n  }\n\n  /**\n   * Dispose resources\n   */\n  dispose(): void {\n    super.dispose();\n    // DbService cleanup is handled at application level, not per-provider\n  }\n\n  /**\n   * Gets database provider status and configuration info.\n   *\n   * @returns Database provider status information\n   */\n  getDatabaseInfo(): {\n    tableName: string;\n    isImplemented: boolean;\n    dbServiceInitialized: boolean;\n  } {\n    return {\n      tableName: this.config.databaseConfig?.tableName ?? 'feature_flags',\n      isImplemented: true,\n      dbServiceInitialized: DbService.isInitialized(),\n    };\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // CRUD Operations (supported by database provider)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Creates a new feature flag in the database.\n   *\n   * @param data - Flag creation data\n   * @returns The created feature flag\n   */\n  async createFlag(data: CreateFlagRequest<FeatureFlagKey>): Promise<FeatureFlag<FeatureFlagKey>> {\n    this.logger.debug('Creating feature flag', { key: data.key });\n    const flag = await this.repository.createFlag(data);\n    await this.refresh();\n    this.logger.info('Feature flag created', { key: data.key });\n    return flag;\n  }\n\n  /**\n   * Updates an existing feature flag in the database.\n   *\n   * @param key - Flag key to update\n   * @param data - Partial flag data to update\n   * @returns The updated feature flag\n   */\n  async updateFlag(\n    key: FeatureFlagKey,\n    data: Partial<CreateFlagRequest<FeatureFlagKey>>\n  ): Promise<FeatureFlag<FeatureFlagKey>> {\n    this.logger.debug('Updating feature flag', { key });\n    const flag = await this.repository.updateFlag(key, data);\n    await this.refresh();\n    this.logger.info('Feature flag updated', { key });\n    return flag;\n  }\n\n  /**\n   * Deletes a feature flag from the database.\n   *\n   * @param key - Flag key to delete\n   */\n  async deleteFlag(key: FeatureFlagKey): Promise<void> {\n    this.logger.debug('Deleting feature flag', { key });\n    await this.repository.deleteFlag(key);\n    await this.refresh();\n    this.logger.info('Feature flag deleted', { key });\n  }\n\n  /**\n   * Gets all rules for a specific flag.\n   *\n   * @param key - Flag key to get rules for\n   * @returns Array of rules for the flag\n   */\n  async getRules(key: FeatureFlagKey): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    this.logger.debug('Getting rules for flag', { key });\n    return this.repository.getFlagRules(key);\n  }\n\n  /**\n   * Gets all enabled rules across all flags.\n   *\n   * @returns Array of all enabled rules\n   */\n  async getAllRules(): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    this.logger.debug('Getting all rules');\n    return this.repository.getAllRules();\n  }\n}\n","/**\n * Feature Flag Service Factory\n *\n * Factory class for creating feature flag services with configured providers.\n *\n * @fileoverview Service factory for feature flag system\n * @version 1.0.0\n */\n\nimport type {\n  FeatureFlagConfig,\n  FeatureFlagProvider,\n  FeatureFlagValue,\n  FeatureFlagProviderType,\n} from '@plyaz/types/features';\nimport { ERROR_CODES } from '@plyaz/types';\nimport { CorePackageError } from '@plyaz/errors';\nimport { FeatureFlagService } from '../service';\nimport { MemoryFeatureFlagProvider } from './memory';\nimport { FileFeatureFlagProvider } from './file';\nimport { RedisFeatureFlagProvider } from './redis';\nimport { ApiFeatureFlagProvider } from './api';\nimport { DatabaseFeatureFlagProvider } from './database';\nimport { FEATURE_FLAG_CACHE_TTL_DEFAULT, FEATURE_FLAG_FILE_PATHS } from '@plyaz/config';\n\n/**\n * Registry of available provider classes.\n * Note: Some providers (like ApiFeatureFlagProvider) have extended config requirements.\n */\nconst PROVIDER_REGISTRY = {\n  memory: MemoryFeatureFlagProvider,\n  file: FileFeatureFlagProvider,\n  redis: RedisFeatureFlagProvider,\n  api: ApiFeatureFlagProvider,\n  database: DatabaseFeatureFlagProvider,\n} as const;\n\n/**\n * Feature flag service factory for creating service instances with providers.\n *\n * @class FeatureFlagServiceFactory\n *\n * @example\n * ```typescript\n * // Create and initialize service\n * const service = await FeatureFlagServiceFactory.createAndInitialize({\n *   provider: 'database',\n *   isCacheEnabled: true,\n *   cacheTtl: 300,\n * }, FEATURES);\n *\n * // Use the service\n * const isEnabled = await service.isEnabled('MY_FEATURE');\n * await service.createFlag({ key: 'NEW', value: true, name: 'New Flag' });\n * ```\n */\nexport class FeatureFlagServiceFactory {\n  /**\n   * Creates a new feature flag service with the configured provider.\n   *\n   * @param config - Provider configuration\n   * @param features - Record of feature flag keys to their default values\n   * @returns Configured service instance (not yet initialized)\n   */\n  static createService<K extends string>(\n    config: FeatureFlagConfig<K>,\n    features: Record<K, FeatureFlagValue>\n  ): FeatureFlagService<K> {\n    const provider = FeatureFlagProviderFactory.create(config, features);\n    return new FeatureFlagService(provider, config);\n  }\n\n  /**\n   * Creates and initializes a feature flag service.\n   *\n   * @param config - Provider configuration\n   * @param features - Record of feature flag keys to their default values\n   * @returns Promise resolving to initialized service instance\n   */\n  static async createAndInitialize<K extends string>(\n    config: FeatureFlagConfig<K>,\n    features: Record<K, FeatureFlagValue>\n  ): Promise<FeatureFlagService<K>> {\n    const service = this.createService(config, features);\n    await service.initialize();\n    return service;\n  }\n\n  /**\n   * Creates a default service with memory provider.\n   *\n   * @param features - Record of feature flag keys to their default values\n   * @param overrides - Optional configuration overrides\n   * @returns Service instance\n   */\n  static createDefaultService<K extends string>(\n    features: Record<K, FeatureFlagValue>,\n    overrides?: Partial<FeatureFlagConfig<K>>\n  ): FeatureFlagService<K> {\n    const config: FeatureFlagConfig<K> = {\n      provider: 'memory',\n      isCacheEnabled: true,\n      cacheTtl: FEATURE_FLAG_CACHE_TTL_DEFAULT,\n      refreshInterval: 0,\n      isLoggingEnabled: false,\n      shouldFallbackToDefaults: true,\n      ...overrides,\n    };\n    return this.createService(config, features);\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Factory (internal use, or for advanced use cases)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Feature flag provider factory for creating provider instances directly.\n * For most use cases, use FeatureFlagServiceFactory instead.\n *\n * @class FeatureFlagProviderFactory\n */\nexport class FeatureFlagProviderFactory {\n  /**\n   * Creates a new feature flag provider instance based on configuration.\n   *\n   * @param config - Provider configuration\n   * @param features - Record of feature flag keys to their default values\n   * @returns Configured provider instance\n   * @throws Error if provider type is unsupported or configuration is invalid\n   */\n  static create<FeatureFlagKey extends string>(\n    config: FeatureFlagConfig<FeatureFlagKey>,\n    features: Record<FeatureFlagKey, FeatureFlagValue>\n  ): FeatureFlagProvider<FeatureFlagKey> {\n    this.validateConfig<FeatureFlagKey>(config);\n\n    const ProviderClass = PROVIDER_REGISTRY[config.provider];\n    if (!ProviderClass) {\n      throw new CorePackageError(\n        `Unsupported provider type: ${config.provider}. Supported: ${this.getSupportedProviders().join(', ')}`,\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    try {\n      // Cast to any to allow provider-specific config extensions (e.g., ApiFeatureFlagConfig)\n      return new (ProviderClass as new (\n        config: FeatureFlagConfig<FeatureFlagKey>,\n        features: Record<FeatureFlagKey, FeatureFlagValue>\n      ) => FeatureFlagProvider<FeatureFlagKey>)(config, features);\n    } catch (error) {\n      throw new CorePackageError(\n        `Failed to create ${config.provider} provider: ${error instanceof Error ? error.message : 'Unknown error'}`,\n        ERROR_CODES.CLIENT_INITIALIZATION_FAILED\n      );\n    }\n  }\n\n  /**\n   * Creates a provider with automatic initialization.\n   *\n   * @param config - Provider configuration\n   * @param features - Record of feature flag keys to their default values\n   * @returns Promise resolving to initialized provider instance\n   */\n  static async createAndInitialize<FeatureFlagKey extends string>(\n    config: FeatureFlagConfig<FeatureFlagKey>,\n    features: Record<FeatureFlagKey, FeatureFlagValue>\n  ): Promise<FeatureFlagProvider<FeatureFlagKey>> {\n    const provider = this.create(config, features);\n    await provider.initialize();\n    return provider;\n  }\n\n  /**\n   * Gets a list of all supported provider types.\n   *\n   * @returns Array of supported provider names\n   */\n  static getSupportedProviders(): FeatureFlagProviderType[] {\n    return Object.keys(PROVIDER_REGISTRY) as FeatureFlagProviderType[];\n  }\n\n  /**\n   * Checks if a provider type is supported.\n   *\n   * @param providerType - Provider type to check\n   * @returns True if provider type is supported\n   */\n  static isProviderSupported(providerType: string): providerType is FeatureFlagProviderType {\n    return providerType in PROVIDER_REGISTRY;\n  }\n\n  /**\n   * Gets provider information including implementation status.\n   *\n   * @returns Record of provider information\n   */\n  static getProvidersInfo(): Record<\n    FeatureFlagProviderType,\n    {\n      name: string;\n      isImplemented: boolean;\n      description: string;\n      requirements?: string[];\n    }\n  > {\n    return {\n      memory: {\n        name: 'Memory Provider',\n        isImplemented: true,\n        description: 'In-memory provider using FEATURES constant',\n      },\n      file: {\n        name: 'File Provider',\n        isImplemented: true,\n        description: 'File-based provider supporting JSON and YAML formats',\n      },\n      redis: {\n        name: 'Redis Provider',\n        isImplemented: true,\n        description: 'Redis-based provider for distributed caching',\n        requirements: ['ioredis or redis package'],\n      },\n      api: {\n        name: 'API Provider',\n        isImplemented: false,\n        description: 'Remote API provider for centralized flag management',\n        requirements: ['@plyaz/api package', 'API endpoints implementation'],\n      },\n      database: {\n        name: 'Database Provider',\n        isImplemented: false,\n        description: 'Database provider for persistent flag storage',\n        requirements: ['@plyaz/db package', 'Database schema setup'],\n      },\n    } satisfies Record<\n      FeatureFlagProviderType,\n      {\n        name: string;\n        isImplemented: boolean;\n        description: string;\n        requirements?: string[];\n      }\n    >;\n  }\n\n  /**\n   * Creates a default provider.\n   * Uses file provider if features are not provided, memory provider otherwise.\n   *\n   * @param features - Record of feature flag keys to their default values (optional)\n   * @param overrides - Optional configuration overrides\n   * @returns Provider instance\n   */\n  static createDefault<FeatureFlagKey extends string>(\n    features?: Record<FeatureFlagKey, FeatureFlagValue>,\n    overrides?: Partial<FeatureFlagConfig<FeatureFlagKey>>\n  ): FeatureFlagProvider<FeatureFlagKey> {\n    // If features are not provided, use file provider as default\n    const provider = features ? 'memory' : 'file';\n\n    const defaultConfig: FeatureFlagConfig<FeatureFlagKey> = {\n      provider,\n      isCacheEnabled: true,\n      cacheTtl: FEATURE_FLAG_CACHE_TTL_DEFAULT,\n      refreshInterval: 0, // No auto-refresh\n      isLoggingEnabled: false,\n      shouldFallbackToDefaults: true,\n      ...overrides,\n    };\n\n    // Add default file config if using file provider and no fileConfig provided\n    if (defaultConfig.provider === 'file' && !defaultConfig.fileConfig) {\n      defaultConfig.fileConfig = {\n        filePath: FEATURE_FLAG_FILE_PATHS.DEFAULT,\n        format: 'json',\n        shouldWatchForChanges: false,\n      };\n    }\n\n    return this.create(defaultConfig, features ?? ({} as Record<FeatureFlagKey, FeatureFlagValue>));\n  }\n\n  /**\n   * Type guard to check if a provider supports feature syncing.\n   *\n   * @param provider - The provider instance to check\n   * @returns True if provider has syncFeatures method\n   */\n  static isSyncableProvider<FeatureFlagKey extends string>(\n    provider: FeatureFlagProvider<FeatureFlagKey>\n  ): provider is FeatureFlagProvider<FeatureFlagKey> &\n    Required<Pick<FeatureFlagProvider<FeatureFlagKey>, 'syncFeatures'>> {\n    return 'syncFeatures' in provider && typeof provider.syncFeatures === 'function';\n  }\n\n  /**\n   * Updates features on a provider if it supports the syncFeatures method.\n   * This is useful for providers like MemoryProvider that can update their features at runtime.\n   *\n   * @param provider - The provider instance\n   * @param newFeatures - New features to sync\n   * @returns Promise that resolves when sync is complete\n   * @throws Error if provider doesn't support feature syncing\n   */\n  static async syncFeatures<FeatureFlagKey extends string>(\n    provider: FeatureFlagProvider<FeatureFlagKey>,\n    newFeatures: Record<FeatureFlagKey, FeatureFlagValue>\n  ): Promise<void> {\n    if (this.isSyncableProvider(provider)) {\n      await provider.syncFeatures(newFeatures);\n    } else {\n      throw new CorePackageError(\n        'Provider type does not support feature syncing. Only MemoryProvider and FileProvider support this.',\n        ERROR_CODES.PROVIDER_NOT_IMPLEMENTED\n      );\n    }\n  }\n\n  /**\n   * Checks if a provider supports feature syncing.\n   *\n   * @param provider - The provider instance to check\n   * @returns True if provider supports syncFeatures method\n   */\n  static supportsFeaturesSync<FeatureFlagKey extends string>(\n    provider: FeatureFlagProvider<FeatureFlagKey>\n  ): boolean {\n    return this.isSyncableProvider(provider);\n  }\n\n  /**\n   * Validates provider configuration before instantiation.\n   *\n   * @private\n   * @param config - Configuration to validate\n   * @throws Error if configuration is invalid\n   */\n  public static validateConfig<FeatureFlagKey extends string>(\n    config: FeatureFlagConfig<FeatureFlagKey>\n  ): void {\n    if (!config) {\n      throw new CorePackageError(\n        'Provider configuration is required',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    if (!config.provider) {\n      throw new CorePackageError(\n        'Provider type is required in configuration',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    if (!this.isProviderSupported(config.provider)) {\n      throw new CorePackageError(\n        `Unsupported provider type: ${config.provider}. Supported: ${this.getSupportedProviders().join(', ')}`,\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    // Validate cache configuration\n    if (config.isCacheEnabled && config.cacheTtl <= 0) {\n      throw new CorePackageError(\n        'Cache TTL must be greater than 0 when caching is enabled',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    // Validate refresh interval\n    if (config.refreshInterval < 0) {\n      throw new CorePackageError(\n        'Refresh interval cannot be negative',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    // Provider-specific validation\n    this.validateProviderSpecificConfig(config);\n  }\n\n  /**\n   * Validates provider-specific configuration requirements.\n   *\n   * @private\n   * @param config - Configuration to validate\n   * @throws Error if provider-specific configuration is invalid\n   */\n  private static validateProviderSpecificConfig<FeatureFlagKey extends string>(\n    config: FeatureFlagConfig<FeatureFlagKey>\n  ): void {\n    const validationMap = {\n      file: () => this.validateFileConfig<FeatureFlagKey>(config),\n      redis: () => this.validateRedisConfig<FeatureFlagKey>(config),\n      api: () => this.validateApiConfig<FeatureFlagKey>(config),\n      database: () => this.validateDatabaseConfig<FeatureFlagKey>(config),\n      memory: () => {}, // Memory provider has no additional requirements\n    } as const satisfies Record<string, () => void>;\n\n    const validator = validationMap[config.provider as keyof typeof validationMap];\n    if (!validator) {\n      throw new CorePackageError(\n        `Unknown provider type: ${config.provider}`,\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n\n    validator();\n  }\n\n  private static validateFileConfig<FeatureFlagKey extends string>(\n    config: FeatureFlagConfig<FeatureFlagKey>\n  ): void {\n    // File config is optional, will use defaults if not provided\n    if (config.fileConfig) {\n      const { format } = config.fileConfig;\n      if (format && !['json', 'yaml'].includes(format)) {\n        throw new CorePackageError(\n          'File format must be either \"json\" or \"yaml\"',\n          ERROR_CODES.CLIENT_INVALID_CONFIG\n        );\n      }\n    }\n  }\n\n  private static validateRedisConfig<FeatureFlagKey extends string>(\n    config: FeatureFlagConfig<FeatureFlagKey>\n  ): void {\n    if (!config.redisConfig) {\n      throw new CorePackageError(\n        'Redis configuration is required for Redis provider',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n  }\n\n  private static validateApiConfig<FeatureFlagKey extends string>(\n    config: FeatureFlagConfig<FeatureFlagKey>\n  ): void {\n    if (!config.apiEndpoint) {\n      throw new CorePackageError(\n        'API endpoint is required for API provider',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n  }\n\n  private static validateDatabaseConfig<FeatureFlagKey extends string>(\n    config: FeatureFlagConfig<FeatureFlagKey>\n  ): void {\n    if (!config.databaseConfig) {\n      throw new CorePackageError(\n        'Database configuration is required for database provider',\n        ERROR_CODES.CLIENT_INVALID_CONFIG\n      );\n    }\n  }\n}\n","/**\n * Feature Flag Module - Shared Service Factory\n *\n * Provides the service factory used by the NestJS FeatureFlagModule.\n * For NestJS usage, import from '@plyaz/core/backend/featureFlags'.\n */\n\nimport type { FeatureFlagConfig } from '@plyaz/types';\nimport { ERROR_CODES } from '@plyaz/types';\nimport type { CoreFeatureFlagModuleConfig } from '@plyaz/types/core';\nimport { FeatureFlagServiceFactory } from './providers/factory';\nimport type { FeatureFlagService } from './service';\nimport type { FeatureFlagKey } from '../types';\nimport { FEATURES, FEATURE_FLAG_CACHE_TTL_DEFAULT } from '@plyaz/config';\nimport { CorePackageError } from '@plyaz/errors';\n\nconst defaultConfig: CoreFeatureFlagModuleConfig = {\n  provider: 'memory',\n  refreshInterval: 0,\n  loggingEnabled: false,\n  cache: {\n    enabled: true,\n    ttl: FEATURE_FLAG_CACHE_TTL_DEFAULT,\n  },\n};\n\ntype ProviderConfig = Partial<FeatureFlagConfig<FeatureFlagKey>>;\n\n/** Build base config shared by all providers */\nfunction buildBaseConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n  return {\n    provider: config.provider ?? 'memory',\n    isCacheEnabled: config.cache?.enabled ?? true,\n    cacheTtl: config.cache?.ttl ?? FEATURE_FLAG_CACHE_TTL_DEFAULT,\n    refreshInterval: config.refreshInterval ?? 0,\n    isLoggingEnabled: config.loggingEnabled ?? false,\n  };\n}\n\n/** Build database provider config */\nfunction buildDatabaseProviderConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n  return {\n    databaseConfig: {\n      connectionString: '', // Not needed, DbService is already initialized\n      tableName: config.db?.tableName ?? 'feature_flags',\n      rulesTableName: config.db?.rulesTableName,\n      evaluationsTableName: config.db?.evaluationsTableName,\n      overridesTableName: config.db?.overridesTableName,\n      evaluationsSchema: config.db?.evaluationsSchema,\n    },\n  };\n}\n\n/** Build redis provider config */\nfunction buildRedisProviderConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n  if (!config.redis?.url) {\n    throw new CorePackageError(\n      'Redis URL is required when using redis provider. Provide redis: { url: \"redis://...\" }',\n      ERROR_CODES.CORE_CONFIGURATION_INVALID\n    );\n  }\n  return {\n    redisConfig: {\n      url: config.redis.url,\n      keyPrefix: config.redis.keyPrefix ?? 'feature_flags:',\n    },\n  };\n}\n\n/** Build API provider config */\n// eslint-disable-next-line complexity\nfunction buildApiProviderConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n  if (!config.api?.client && !config.api?.clientConfig?.baseURL) {\n    throw new CorePackageError(\n      'API provider requires either api.client (ApiClientService instance) or api.clientConfig.baseURL'\n    );\n  }\n  return {\n    apiEndpoint: config.api?.clientConfig?.baseURL ?? 'injected-client',\n  };\n}\n\n/** Build file provider config */\nfunction buildFileProviderConfig(config: CoreFeatureFlagModuleConfig): ProviderConfig {\n  return {\n    fileConfig: {\n      filePath: config.file?.path ?? './feature-flags.json',\n      format: config.file?.format ?? 'json',\n      shouldWatchForChanges: config.file?.watch ?? false,\n    },\n  };\n}\n\n/** Provider config builders map */\nconst providerConfigBuilders: Record<\n  string,\n  (config: CoreFeatureFlagModuleConfig) => ProviderConfig\n> = {\n  database: buildDatabaseProviderConfig,\n  redis: buildRedisProviderConfig,\n  api: buildApiProviderConfig,\n  file: buildFileProviderConfig,\n};\n\nfunction toServiceConfig(\n  config: CoreFeatureFlagModuleConfig\n): Partial<FeatureFlagConfig<FeatureFlagKey>> {\n  const baseConfig = buildBaseConfig(config);\n  const providerBuilder = providerConfigBuilders[config.provider ?? 'memory'];\n\n  if (!providerBuilder) {\n    return baseConfig;\n  }\n\n  return { ...baseConfig, ...providerBuilder(config) };\n}\n\n/**\n * Injection token for NestJS DI\n */\nexport const FEATURE_FLAG_SERVICE = 'FEATURE_FLAG_SERVICE';\n\n/**\n * Creates the FeatureFlagService\n * Used by NestJS FeatureFlagModule internally\n */\nexport async function createFeatureFlagService(\n  config: CoreFeatureFlagModuleConfig = defaultConfig\n): Promise<FeatureFlagService<FeatureFlagKey>> {\n  const serviceConfig = toServiceConfig(config);\n  return FeatureFlagServiceFactory.createAndInitialize(\n    serviceConfig as FeatureFlagConfig<FeatureFlagKey>,\n    FEATURES\n  );\n}\n\n// Re-export service for direct access\nexport { FeatureFlagService } from './service';\n","/**\n * Feature Flag Controller\n *\n * NestJS controller for feature flag management.\n * Uses the domain FeatureFlagService directly.\n *\n * @fileoverview NestJS controller for feature flags\n */\n\nimport { Controller, Get, Post, Put, Delete, Param, Body, Inject } from '@nestjs/common';\nimport { ApiTags, ApiOperation, ApiParam, ApiBody, ApiResponse } from '@nestjs/swagger';\nimport type {\n  FeatureFlagValue,\n  FeatureFlagContext,\n  FeatureFlagEvaluation,\n  FeatureFlag,\n  FeatureFlagRule,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { ERROR_CODES, HTTP_STATUS } from '@plyaz/types';\nimport { BaseError } from '@plyaz/errors';\nimport { FEATURE_FLAG_SERVICE, FeatureFlagService } from '@domain/featureFlags';\nimport type { FeatureFlagKey } from '@domain/types';\n\n/**\n * Request DTO for flag evaluation.\n */\ninterface EvaluateFlagRequest {\n  context?: FeatureFlagContext;\n}\n\n/**\n * Feature Flag Controller\n *\n * Provides REST endpoints for feature flag management and evaluation.\n * Uses the domain FeatureFlagService directly.\n *\n * @example\n * ```typescript\n * // GET /feature-flags/AUTH_GOOGLE/evaluate\n * // POST /feature-flags\n * // PUT /feature-flags/AUTH_GOOGLE\n * ```\n */\n@ApiTags('feature-flags')\n@Controller('feature-flags')\nexport class FeatureFlagController {\n  constructor(\n    @Inject(FEATURE_FLAG_SERVICE)\n    private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>\n  ) {}\n\n  /**\n   * Evaluates a feature flag for the given context.\n   */\n  @Post(':key/evaluate')\n  @ApiOperation({ summary: 'Evaluate a feature flag' })\n  @ApiParam({ name: 'key', description: 'Feature flag key' })\n  @ApiBody({\n    description: 'Evaluation context',\n    schema: {\n      type: 'object',\n      properties: {\n        context: {\n          type: 'object',\n          properties: {\n            userId: { type: 'string' },\n            email: { type: 'string' },\n            attributes: { type: 'object' },\n          },\n        },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'Flag evaluation result' })\n  async evaluateFlag(\n    @Param('key') key: FeatureFlagKey,\n    @Body() body: EvaluateFlagRequest = {}\n  ): Promise<FeatureFlagEvaluation<FeatureFlagKey>> {\n    try {\n      return await this.featureFlagService.getFlag(key, body.context);\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.API_INVALID_INPUT,\n        HTTP_STATUS.BAD_REQUEST,\n        `Failed to evaluate flag: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Checks if a feature flag is enabled.\n   */\n  @Post(':key/enabled')\n  @ApiOperation({ summary: 'Check if a feature flag is enabled' })\n  @ApiParam({ name: 'key', description: 'Feature flag key' })\n  @ApiResponse({ status: 200, description: 'Returns isEnabled boolean' })\n  async isEnabled(\n    @Param('key') key: FeatureFlagKey,\n    @Body() body: EvaluateFlagRequest = {}\n  ): Promise<{ isEnabled: boolean }> {\n    try {\n      const isEnabled = await this.featureFlagService.isEnabled(key, body.context);\n      return { isEnabled };\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.API_INVALID_INPUT,\n        HTTP_STATUS.BAD_REQUEST,\n        `Failed to check flag status: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Gets all feature flags with their evaluations.\n   */\n  @Post('evaluate-all')\n  @ApiOperation({ summary: 'Evaluate all feature flags' })\n  @ApiResponse({ status: 200, description: 'All flag evaluations' })\n  async evaluateAllFlags(\n    @Body() body: EvaluateFlagRequest = {}\n  ): Promise<Record<string, FeatureFlagEvaluation<FeatureFlagKey>>> {\n    try {\n      return await this.featureFlagService.getAllFlags(body.context);\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.SERVER_ERROR,\n        HTTP_STATUS.INTERNAL_SERVER_ERROR,\n        `Failed to evaluate all flags: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Creates a new feature flag.\n   */\n  @Post()\n  @ApiOperation({ summary: 'Create a new feature flag' })\n  @ApiBody({\n    description: 'Flag creation data',\n    schema: {\n      type: 'object',\n      required: ['key', 'defaultValue'],\n      properties: {\n        key: { type: 'string', description: 'Unique flag key' },\n        defaultValue: { description: 'Default value (boolean, string, number, or object)' },\n        description: { type: 'string' },\n        enabled: { type: 'boolean', default: true },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'Flag created successfully' })\n  async createFlag(\n    @Body() createData: CreateFlagRequest<FeatureFlagKey>\n  ): Promise<FeatureFlag<FeatureFlagKey>> {\n    try {\n      return await this.featureFlagService.createFlag(createData);\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.API_INVALID_INPUT,\n        HTTP_STATUS.BAD_REQUEST,\n        `Failed to create flag: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Updates an existing feature flag.\n   */\n  @Put(':key')\n  @ApiOperation({ summary: 'Update a feature flag' })\n  @ApiParam({ name: 'key', description: 'Feature flag key' })\n  @ApiResponse({ status: 200, description: 'Flag updated successfully' })\n  async updateFlag(\n    @Param('key') key: FeatureFlagKey,\n    @Body() updateData: Partial<CreateFlagRequest<FeatureFlagKey>>\n  ): Promise<FeatureFlag<FeatureFlagKey>> {\n    try {\n      return await this.featureFlagService.updateFlag(key, updateData);\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.API_INVALID_INPUT,\n        HTTP_STATUS.BAD_REQUEST,\n        `Failed to update flag: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Deletes a feature flag.\n   */\n  @Delete(':key')\n  @ApiOperation({ summary: 'Delete a feature flag' })\n  @ApiParam({ name: 'key', description: 'Feature flag key' })\n  @ApiResponse({ status: 200, description: 'Flag deleted successfully' })\n  async deleteFlag(@Param('key') key: FeatureFlagKey): Promise<{ isSuccessful: boolean }> {\n    try {\n      await this.featureFlagService.deleteFlag(key);\n      return { isSuccessful: true };\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.API_INVALID_INPUT,\n        HTTP_STATUS.BAD_REQUEST,\n        `Failed to delete flag: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Sets a manual override for a flag.\n   */\n  @Post(':key/override')\n  @ApiOperation({ summary: 'Set a manual override for a flag' })\n  @ApiParam({ name: 'key', description: 'Feature flag key' })\n  @ApiBody({\n    description: 'Override value',\n    schema: {\n      type: 'object',\n      required: ['value'],\n      properties: {\n        value: { description: 'Override value' },\n      },\n    },\n  })\n  @ApiResponse({ status: 200, description: 'Override set successfully' })\n  async setOverride(\n    @Param('key') key: FeatureFlagKey,\n    @Body('value') value: FeatureFlagValue\n  ): Promise<{ isSuccessful: boolean }> {\n    try {\n      this.featureFlagService.setOverride(key, value);\n      return { isSuccessful: true };\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.API_INVALID_INPUT,\n        HTTP_STATUS.BAD_REQUEST,\n        `Failed to set override: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Removes a manual override for a flag.\n   */\n  @Delete(':key/override')\n  @ApiOperation({ summary: 'Remove a manual override for a flag' })\n  @ApiParam({ name: 'key', description: 'Feature flag key' })\n  @ApiResponse({ status: 200, description: 'Override removed successfully' })\n  async removeOverride(@Param('key') key: FeatureFlagKey): Promise<{ isSuccessful: boolean }> {\n    try {\n      this.featureFlagService.removeOverride(key);\n      return { isSuccessful: true };\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.API_INVALID_INPUT,\n        HTTP_STATUS.BAD_REQUEST,\n        `Failed to remove override: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Gets all rules for a specific flag.\n   */\n  @Get(':key/rules')\n  @ApiOperation({ summary: 'Get all rules for a feature flag' })\n  @ApiParam({ name: 'key', description: 'Feature flag key' })\n  @ApiResponse({ status: 200, description: 'Flag rules retrieved' })\n  async getFlagRules(\n    @Param('key') key: FeatureFlagKey\n  ): Promise<FeatureFlagRule<FeatureFlagKey>[]> {\n    try {\n      return await this.featureFlagService.getRules(key);\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.API_INVALID_INPUT,\n        HTTP_STATUS.BAD_REQUEST,\n        `Failed to get flag rules: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Forces a refresh of the feature flag cache.\n   */\n  @Post('refresh')\n  @ApiOperation({ summary: 'Force refresh of feature flag cache' })\n  @ApiResponse({ status: 200, description: 'Cache refreshed successfully' })\n  async refreshCache(): Promise<{ isSuccessful: boolean }> {\n    try {\n      await this.featureFlagService.refresh();\n      return { isSuccessful: true };\n    } catch (error) {\n      throw new BaseError(\n        ERROR_CODES.SERVER_ERROR,\n        HTTP_STATUS.INTERNAL_SERVER_ERROR,\n        `Failed to refresh cache: ${error instanceof Error ? error.message : 'Unknown error'}`\n      );\n    }\n  }\n\n  /**\n   * Gets service health status.\n   */\n  @Get('health')\n  @ApiOperation({ summary: 'Get feature flag service health status' })\n  @ApiResponse({ status: 200, description: 'Health status retrieved' })\n  async getHealth(): Promise<{\n    isInitialized: boolean;\n    provider: string;\n  }> {\n    return {\n      isInitialized: this.featureFlagService.getIsInitialized(),\n      provider: this.featureFlagService.getProviderType(),\n    };\n  }\n}\n","/**\n * Feature Flag NestJS Module\n *\n * NestJS wrapper around the unified FeatureFlagModule.\n * Adds the controller for REST API endpoints.\n *\n * @example\n * ```typescript\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n *   imports: [FeatureFlagModule.forRoot({ provider: 'database' })],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport {\n  Module,\n  Global,\n  type DynamicModule,\n  type OnModuleDestroy,\n  type Type,\n  type ForwardReference,\n  type InjectionToken,\n} from '@nestjs/common';\nimport { FeatureFlagController } from './feature-flag.controller';\nimport { createFeatureFlagService, FEATURE_FLAG_SERVICE } from '../../domain/featureFlags/module';\nimport { FeatureFlagService } from '../../domain/featureFlags/service';\nimport type { FeatureFlagKey } from '../../domain/types';\nimport { CoreFeatureFlagModuleConfig } from '@plyaz/types/core';\n\n/**\n * Feature Flag Module\n *\n * Provides feature flag functionality as a NestJS module.\n * Uses the domain FeatureFlagService directly - no NestJS wrapper needed.\n *\n * @example\n * ```typescript\n * // In your app.module.ts\n * @Module({\n *   imports: [\n *     FeatureFlagModule.forRoot({ provider: 'database' })\n *   ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example\n * ```typescript\n * // In your service - inject the domain service\n * @Injectable()\n * export class MyService {\n *   constructor(\n *     @Inject(FEATURE_FLAG_SERVICE)\n *     private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>\n *   ) {}\n *\n *   async doSomething() {\n *     const isEnabled = await this.featureFlagService.isEnabled('MY_FEATURE');\n *   }\n * }\n * ```\n */\n@Global()\n@Module({\n  controllers: [FeatureFlagController],\n})\nexport class FeatureFlagModule implements OnModuleDestroy {\n  private static serviceInstance: FeatureFlagService<FeatureFlagKey> | null = null;\n\n  onModuleDestroy(): void {\n    if (FeatureFlagModule.serviceInstance) {\n      FeatureFlagModule.serviceInstance.dispose();\n      FeatureFlagModule.serviceInstance = null;\n    }\n  }\n\n  /**\n   * Creates the module with configuration.\n   *\n   * @param options - Module configuration options\n   * @returns Configured dynamic module\n   *\n   * @example\n   * ```typescript\n   * @Module({\n   *   imports: [\n   *     FeatureFlagModule.forRoot({\n   *       provider: 'database',\n   *       cacheEnabled: true,\n   *       cacheTtl: 600,\n   *     })\n   *   ],\n   * })\n   * export class AppModule {}\n   * ```\n   */\n  static forRoot(options: CoreFeatureFlagModuleConfig = {}): DynamicModule {\n    return {\n      module: FeatureFlagModule,\n      providers: [\n        {\n          provide: FEATURE_FLAG_SERVICE,\n          useFactory: async (): Promise<FeatureFlagService<FeatureFlagKey>> => {\n            FeatureFlagModule.serviceInstance = await createFeatureFlagService(options);\n            return FeatureFlagModule.serviceInstance;\n          },\n        },\n      ],\n      exports: [FEATURE_FLAG_SERVICE],\n    };\n  }\n\n  /**\n   * Creates the module with async configuration.\n   * Useful when configuration depends on other services.\n   *\n   * @param options - Async module configuration options\n   * @returns Configured async dynamic module\n   *\n   * @example\n   * ```typescript\n   * @Module({\n   *   imports: [\n   *     FeatureFlagModule.forRootAsync({\n   *       imports: [ConfigModule],\n   *       inject: [ConfigService],\n   *       useFactory: (configService: ConfigService) => ({\n   *         provider: configService.get('FEATURE_FLAG_PROVIDER'),\n   *         cacheEnabled: configService.get('FEATURE_FLAG_CACHE_ENABLED'),\n   *       }),\n   *     })\n   *   ],\n   * })\n   * export class AppModule {}\n   * ```\n   */\n  static forRootAsync(options: {\n    imports?: Array<Type<unknown> | DynamicModule | Promise<DynamicModule> | ForwardReference>;\n    inject?: InjectionToken[];\n    useFactory: (\n      ...args: unknown[]\n    ) => CoreFeatureFlagModuleConfig | Promise<CoreFeatureFlagModuleConfig>;\n  }): DynamicModule {\n    return {\n      module: FeatureFlagModule,\n      imports: options.imports ?? [],\n      providers: [\n        {\n          provide: FEATURE_FLAG_SERVICE,\n          inject: options.inject ?? [],\n          useFactory: async (...args: unknown[]): Promise<FeatureFlagService<FeatureFlagKey>> => {\n            const moduleOptions = await options.useFactory(...args);\n            FeatureFlagModule.serviceInstance = await createFeatureFlagService(moduleOptions);\n            return FeatureFlagModule.serviceInstance;\n          },\n        },\n      ],\n      exports: [FEATURE_FLAG_SERVICE],\n    };\n  }\n}\n","import { SetMetadata } from '@nestjs/common';\nimport type { FeatureFlagValue } from '@plyaz/types';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { FEATURE_FLAG_METADATA } from '@plyaz/types';\n\n/**\n * Decorator to require a feature flag to be in a specific state\n * before allowing access to the route handler.\n *\n * @param key - The feature flag key\n * @param expected - Expected flag value (default: true)\n */\nexport function FeatureFlag(\n  key: FeatureFlagKey,\n  expected: FeatureFlagValue = true\n): MethodDecorator {\n  return SetMetadata(FEATURE_FLAG_METADATA.FLAG_CHECK, { key, expected }) as MethodDecorator;\n}\n","import type { FeatureFlagKey } from '@domain/types';\nimport { FeatureFlag } from './feature-flag.decorator';\n\n/**\n * Shortcut decorator to require a feature flag to be disabled (false).\n */\nexport function FeatureDisabled(key: FeatureFlagKey): MethodDecorator {\n  return FeatureFlag(key, false);\n}\n","import type { FeatureFlagKey } from '@domain/types';\nimport { FeatureFlag } from './feature-flag.decorator';\n\n/**\n * FeatureEnabled decorator\n * Shorthand for enabling a feature flag with `true`\n */\nexport function FeatureEnabled(key: FeatureFlagKey): MethodDecorator {\n  return FeatureFlag(key, true);\n}\n\n// Ensure TypeScript treats this as a module\nexport {};\n","import { Injectable, CanActivate, ExecutionContext, Inject } from '@nestjs/common';\nimport { PackageLogger } from '@plyaz/logger';\nimport { Reflector } from '@nestjs/core';\nimport {\n  type FeatureFlagValue,\n  type FeatureFlagEvaluation,\n  ERROR_CODES,\n  HTTP_STATUS,\n  FEATURE_FLAG_METADATA,\n} from '@plyaz/types';\nimport type { FeatureFlagKey } from '@domain/types';\nimport { FEATURE_FLAG_SERVICE, FeatureFlagService } from '@domain/featureFlags';\nimport { BaseError } from '@plyaz/errors';\n\n/**\n * Guard that ensures a feature flag is in the expected state\n * before allowing access to a route handler.\n *\n * @example\n * ```typescript\n * @Controller('premium')\n * @UseGuards(FeatureFlagGuard)\n * export class PremiumController {\n *   @Get()\n *   @FeatureEnabled('PREMIUM_FEATURE')\n *   getPremiumData() {\n *     // Only accessible if PREMIUM_FEATURE is enabled\n *   }\n * }\n * ```\n */\n@Injectable()\nexport class FeatureFlagGuard implements CanActivate {\n  private readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'FeatureFlagGuard',\n  });\n\n  constructor(\n    private readonly reflector: Reflector,\n    @Inject(FEATURE_FLAG_SERVICE)\n    private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>\n  ) {}\n\n  async canActivate(context: ExecutionContext): Promise<boolean> {\n    // Get metadata set by @FeatureFlag decorator\n    const meta = this.reflector.get<{ key: FeatureFlagKey; expected: FeatureFlagValue }>(\n      FEATURE_FLAG_METADATA.FLAG_CHECK,\n      context.getHandler()\n    );\n\n    if (!meta) return true; // No flag restriction → allow request\n\n    const { key, expected } = meta;\n\n    // Evaluate the feature flag state using domain service\n    const evaluation: FeatureFlagEvaluation<FeatureFlagKey> =\n      await this.featureFlagService.getFlag(key);\n\n    const actual = evaluation.value ?? evaluation.isEnabled;\n\n    if (!this.matches(expected, actual)) {\n      this.logger.info(\n        `FeatureFlagGuard denied: key=${key}, expected=${expected}, actual=${actual}`\n      );\n      throw new BaseError(\n        ERROR_CODES.AUTH_FORBIDDEN,\n        HTTP_STATUS.FORBIDDEN,\n        `Feature ${key} not in required state`\n      );\n    }\n\n    return true;\n  }\n\n  /**\n   * Compare expected vs actual values.\n   */\n  private matches(expected: FeatureFlagValue, actual: unknown): boolean {\n    if (expected === undefined || expected === null) return Boolean(actual);\n\n    if (typeof actual !== 'object' || actual === null) {\n      return String(actual) === String(expected);\n    }\n\n    // Simple deep comparison for objects\n    return JSON.stringify(actual) === JSON.stringify(expected);\n  }\n}\n","import { Injectable, NestMiddleware, Inject } from '@nestjs/common';\nimport { PackageLogger } from '@plyaz/logger';\nimport { BaseError } from '@plyaz/errors';\nimport { FEATURE_FLAG_SERVICE, FeatureFlagService } from '@domain/featureFlags';\nimport type { FeatureFlagKey } from '@domain/types';\nimport type { CoreFeatureFlagRequest } from '@plyaz/types/core';\nimport { FEATURES, HTTP_STATUS } from '@plyaz/config';\nimport { ERROR_CODES } from '@plyaz/types';\n\n// Type guard Function\nfunction isFeatureFlagKey(value: string): value is FeatureFlagKey {\n  return Object.keys(FEATURES).includes(value);\n}\n\n/**\n * FeatureFlagMiddleware - Evaluates and attaches feature flags to every request\n *\n * @description This middleware runs early in the request lifecycle to evaluate feature flags\n * and attach them to the request object. It allows controllers and services to access\n * pre-evaluated flags without making additional service calls, improving performance.\n *\n * **Execution Flow:**\n * 1. Middleware executes first for every incoming HTTP request\n * 2. Extracts flag key from query params, headers, or uses default\n * 3. Calls FeatureFlagService to evaluate the specified flag\n * 4. Attaches evaluated flags to `req.featureFlags` object\n * 5. Passes control to next middleware/interceptor/controller\n *\n * **Flag Key Priority:**\n * 1. Query parameter: `?flag=FEATURE_NAME`\n * 2. HTTP header: `X-Feature-Flag: FEATURE_NAME`\n * 3. Default: `AUTH_GOOGLE`\n *\n * **Use Cases:**\n * - Global feature flag evaluation for all requests\n * - Performance optimization (evaluate once, use many times)\n * - Request-scoped feature flag context\n * - Dynamic flag selection via client parameters\n *\n * @example Setup - Register middleware globally\n * ```typescript\n * // app.module.ts\n * import { MiddlewareConsumer, Module } from '@nestjs/common';\n * import { FeatureFlagMiddleware } from './middleware/feature-flag-middleware';\n *\n * @Module({\n *   // ... other config\n * })\n * export class AppModule {\n *   configure(consumer: MiddlewareConsumer) {\n *     consumer\n *       .apply(FeatureFlagMiddleware)\n *       .forRoutes('*'); // Apply to all routes\n *   }\n * }\n * ```\n *\n * @example Client Usage - Query Parameter\n * ```bash\n * # Client specifies which flag to evaluate\n * curl \"https://api.example.com/users?flag=PREMIUM_FEATURES\"\n *\n * # Middleware evaluates PREMIUM_FEATURES and attaches to request\n * # req.featureFlags = { PREMIUM_FEATURES: true }\n * ```\n *\n * @example Client Usage - HTTP Header\n * ```bash\n * # Alternative: Use HTTP header\n * curl -H \"X-Feature-Flag: NEW_DASHBOARD\" \"https://api.example.com/dashboard\"\n *\n * # Middleware evaluates NEW_DASHBOARD\n * # req.featureFlags = { NEW_DASHBOARD: false }\n * ```\n *\n * @example Controller Access - Use pre-evaluated flags\n * ```typescript\n * @Controller('api')\n * export class ApiController {\n *   @Get('dashboard')\n *   async getDashboard(@Req() req: Request) {\n *     // Access pre-evaluated flags (no service call needed)\n *     const flags = req.featureFlags;\n *\n *     if (flags?.NEW_DASHBOARD) {\n *       return this.dashboardService.getNewDashboard();\n *     } else {\n *       return this.dashboardService.getLegacyDashboard();\n *     }\n *   }\n * }\n * ```\n *\n * @example Service Access - Inject flags into services\n * ```typescript\n * @Injectable()\n * export class UserService {\n *   async getUsers(@Req() req: Request) {\n *     const flags = req.featureFlags;\n *\n *     // Use flags to modify service behavior\n *     if (flags?.ENHANCED_USER_DATA) {\n *       return this.getUsersWithEnhancedData();\n *     }\n *\n *     return this.getBasicUsers();\n *   }\n * }\n * ```\n *\n * @example Error Handling - Invalid flag keys\n * ```typescript\n * // Request with invalid flag:\n * // GET /api/users?flag=INVALID_FLAG\n * //\n * // Response:\n * // HTTP 404 Not Found\n * // {\n * //   \"error\": \"Invalid feature flag key: INVALID_FLAG\",\n * //   \"statusCode\": 404\n * // }\n * ```\n *\n * @example Multiple Flags - Accumulate flags across requests\n * ```typescript\n * // First request adds AUTH_GOOGLE: true\n * // Second request adds PREMIUM_FEATURES: false\n * // req.featureFlags = {\n * //   AUTH_GOOGLE: true,\n * //   PREMIUM_FEATURES: false\n * // }\n * ```\n */\n@Injectable()\nexport class FeatureFlagMiddleware implements NestMiddleware {\n  private readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'FeatureFlagMiddleware',\n  });\n\n  constructor(\n    @Inject(FEATURE_FLAG_SERVICE)\n    private readonly featureFlagService: FeatureFlagService<FeatureFlagKey>\n  ) {}\n\n  /**\n   * Main middleware execution method\n   *\n   * @description Processes incoming requests to evaluate and attach feature flags.\n   * Handles flag key extraction from multiple sources and graceful error handling.\n   *\n   * @param {CoreFeatureFlagRequest} req - Express request object with feature flag extensions\n   * @param {unknown} res - Express response object (not used in this middleware)\n   * @param {Function} next - Next middleware function in the chain\n   *\n   * @throws {BaseError} When flag key is invalid or evaluation fails\n   *\n   * @example Request Processing Flow\n   * ```typescript\n   * // 1. Extract flag key from request\n   * const flagKey = req.query.flag || req.headers['x-feature-flag'] || 'AUTH_GOOGLE';\n   *\n   * // 2. Validate flag key exists in system\n   * if (!isFeatureFlagKey(flagKey)) {\n   *   throw new Error('Invalid flag key');\n   * }\n   *\n   * // 3. Evaluate flag using service\n   * const evaluation = await this.featureFlagService.evaluateFlag(flagKey);\n   *\n   * // 4. Attach to request object\n   * req.featureFlags = { [flagKey]: evaluation.isEnabled };\n   *\n   * // 5. Continue to next middleware\n   * next();\n   * ```\n   */\n  // Use a simple next type to avoid conflicts with differing framework types across environments\n  async use(\n    req: CoreFeatureFlagRequest,\n    res: unknown,\n    next: (...args: unknown[]) => void\n  ): Promise<void> {\n    try {\n      const flagKey =\n        // Prefer query param -> header -> default\n        (req.query instanceof URLSearchParams\n          ? req.query.get('flag')\n          : (req.query?.['flag'] as string | undefined)) ??\n        (req.headers?.['x-feature-flag'] as string | undefined) ??\n        'AUTH_GOOGLE';\n\n      if (!isFeatureFlagKey(flagKey)) {\n        throw new BaseError(\n          ERROR_CODES.RETRY_FAILED,\n          HTTP_STATUS.NOT_FOUND,\n          `Invalid feature flag key: ${flagKey}`\n        );\n      }\n\n      const flagEvaluation = await this.featureFlagService.getFlag(flagKey);\n      // Attach dynamically evaluated flag\n      req.featureFlags = {\n        ...req.featureFlags,\n        [flagKey]: flagEvaluation.isEnabled,\n      };\n\n      this.logger.debug(`Feature flags attached to request: ${JSON.stringify(req.featureFlags)}`);\n      next();\n    } catch (error) {\n      this.logger.error('Error evaluating feature flags', { error });\n      throw new BaseError(\n        ERROR_CODES.RETRY_FAILED,\n        HTTP_STATUS.SERVICE_UNAVAILABLE,\n        'Failed to evaluate feature flag'\n      );\n    }\n  }\n}\n","import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';\nimport { PackageLogger } from '@plyaz/logger';\nimport { Observable, tap } from 'rxjs';\n\n/**\n * Interceptor for feature flag usage analytics.\n *\n * FLOW:\n * 1. Runs AFTER middleware attaches feature flags.\n * 2. Dynamically tracks which feature flags are enabled for this request.\n * 3. Can send metrics to analytics service or database.\n * 4. Calls the next handler (controller/service).\n * 5. After controller/service finishes, optionally track request completion.\n */\n\n@Injectable()\nexport class FeatureFlagLoggingInterceptor implements NestInterceptor {\n  private readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'FeatureFlagLoggingInterceptor',\n  });\n\n  intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n    const request = context.switchToHttp().getRequest();\n    const path = request.url;\n    const flags = request.featureFlags ?? {};\n\n    // Dynamically track feature flag usage\n    const featureToTrack = request.headers?.['x-feature-flag'];\n\n    if (featureToTrack && flags[featureToTrack]) {\n      this.trackFeatureUsage(featureToTrack, path);\n    } else {\n      // Fallback: track all enabled flags\n      for (const [flag, enabled] of Object.entries(flags)) {\n        if (enabled) this.trackFeatureUsage(flag, path);\n      }\n    }\n\n    // Proceed to controller/service\n    return next.handle().pipe(\n      tap(() => {\n        // Optional: track request completion\n        this.logger.info(`Completed request: ${path}`);\n      })\n    );\n  }\n\n  private trackFeatureUsage(flag: string, path: string): void {\n    // TODO: Replace this with real analytics integration\n    this.logger.info(`Feature \"${flag}\" used on endpoint \"${path}\"`);\n  }\n}\n","import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';\nimport { PackageLogger } from '@plyaz/logger';\nimport { BaseError } from '@plyaz/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\n\nimport { Observable } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\n\n/**\n * Interceptor to enforce feature flag rules in real-time.\n *\n * FLOW:\n * 1. Runs AFTER middleware has attached feature flags to the request.\n * 2. Checks if the requested feature is enabled.\n * 3. If disabled, blocks the request with an HTTP 403.\n * 4. If enabled, passes the request to the controller/service.\n */\n@Injectable()\nexport class ErrorHandlingInterceptor implements NestInterceptor {\n  private readonly logger = new PackageLogger({\n    packageName: 'core',\n    service: 'ErrorHandlingInterceptor',\n  });\n\n  intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n    const req = context.switchToHttp().getRequest();\n    const path = req.url;\n    const flags = req.featureFlags ?? {};\n\n    // Determine which feature flag to enforce.\n    // Optionally, you can pass it in headers, query, or some route metadata.\n    const featureToCheck = req.headers?.['x-feature-flag'] ?? 'GLOBAL_FEATURE';\n\n    // Block request if the feature is disabled\n    if (!flags[featureToCheck]) {\n      this.logger.warn(`Request to ${path} blocked: ${featureToCheck} is disabled`);\n      throw new BaseError('RETRY_FAILED', HTTP_STATUS.FORBIDDEN);\n    }\n\n    // If feature is enabled, continue normally\n    this.logger.debug(`Request to ${path} allowed: ${featureToCheck} is enabled`);\n    return next.handle().pipe(\n      catchError(error => {\n        this.logger.error(`Error processing request to ${path}`, { error });\n        throw new BaseError('INTERNAL_SERVER_ERROR', HTTP_STATUS.INTERNAL_SERVER_ERROR, error);\n      })\n    );\n  }\n}\n","/**\n * Configuration Validation Utilities\n *\n * Validation utilities for feature flag configuration in NestJS applications.\n * Provides error reporting and environment-specific validation.\n *\n */\n\nimport { ValidationError, BaseError } from '@plyaz/errors';\nimport {\n  type CoreFeatureFlagEnvironmentConfig,\n  type CoreFeatureFlagValidationResult,\n} from '@plyaz/types/core';\nimport { ERROR_CODES, HTTP_STATUS, NODE_ENVIRONMENTS } from '@plyaz/types';\nimport { PackageLogger } from '@plyaz/logger';\nimport { isString, isDefined, getValidProviders } from '@/utils/common/validation';\nimport { FEATURE_FLAG_PROVIDERS, NUMERIC_CONSTANTS } from '@plyaz/config';\n\n// Module-level logger for static validation methods\nconst logger = new PackageLogger({\n  packageName: 'core',\n  service: 'FeatureFlagConfigValidator',\n});\n\n/**\n * FeatureFlagConfigValidator - Comprehensive configuration validation for feature flags\n *\n * @description Validates feature flag configuration objects to ensure they meet system requirements\n * and best practices. Provides detailed error reporting and warnings for potential issues.\n *\n * **Validation Categories:**\n * - Provider validation (memory, file, redis, api, database)\n * - Cache configuration validation\n * - Database connection validation\n * - Environment-specific settings validation\n *\n * **Usage Flow:**\n * 1. Configuration is loaded from environment variables\n * 2. Validator checks all settings for correctness\n * 3. Errors prevent system startup\n * 4. Warnings are logged but don't block startup\n *\n * @example Basic Validation\n * ```typescript\n * const config = {\n *   provider: 'database',\n *   isCacheEnabled: true,\n *   cacheTtl: 300,\n *   databaseConfig: {\n *     connectionString: 'https://project.supabase.co',\n *     tableName: 'feature_flags'\n *   }\n * };\n *\n * const result = FeatureFlagConfigValidator.validate(config);\n *\n * if (result.isValid) {\n *   console.log('Configuration is valid!');\n * } else {\n *   console.error('Configuration errors:', result.errors);\n * }\n * ```\n *\n * @example Error Handling\n * ```typescript\n * try {\n *   FeatureFlagConfigValidator.validateOrThrow(config);\n *   // Configuration is valid, proceed with initialization\n * } catch (error) {\n *   console.error('Invalid configuration:', error.message);\n *   process.exit(1);\n * }\n * ```\n */\nexport class FeatureFlagConfigValidator {\n  /**\n   * Validates feature flag configuration and returns detailed results\n   *\n   * @description Performs comprehensive validation of feature flag configuration,\n   * checking all aspects including provider settings, cache configuration,\n   * database connections, and environment-specific settings.\n   *\n   * @param {FeatureFlagEnvironmentConfig} config - Configuration object to validate\n   * @returns {ValidationResult} Validation result with errors and warnings\n   *\n   * @example Successful Validation\n   * ```typescript\n   * const validConfig = {\n   *   provider: 'memory',\n   *   isCacheEnabled: true,\n   *   cacheTtl: 300,\n   *   refreshInterval: 60\n   * };\n   *\n   * const result = FeatureFlagConfigValidator.validate(validConfig);\n   * // result.isValid = true\n   * // result.errors = []\n   * // result.warnings = []\n   * ```\n   *\n   * @example Validation with Errors\n   * ```typescript\n   * const invalidConfig = {\n   *   provider: 'invalid_provider', // Error: invalid provider\n   *   cacheTtl: -100,              // Error: negative TTL\n   *   databaseConfig: {            // Error: missing connection string\n   *     tableName: 'flags'\n   *   }\n   * };\n   *\n   * const result = FeatureFlagConfigValidator.validate(invalidConfig);\n   * // result.isValid = false\n   * // result.errors = [\n   * //   { field: 'provider', message: 'Invalid provider...', code: 'INVALID_PROVIDER' },\n   * //   { field: 'cacheTtl', message: 'Cache TTL must be non-negative', code: 'INVALID_CACHE_TTL' }\n   * // ]\n   * ```\n   *\n   * @example Validation with Warnings\n   * ```typescript\n   * const configWithWarnings = {\n   *   provider: 'database',\n   *   cacheTtl: 7200, // Warning: very high TTL\n   *   isLoggingEnabled: true, // Warning: logging in production\n   *   databaseConfig: {\n   *     connectionString: 'https://project.supabase.co',\n   *     tableName: 'feature_flags'\n   *   }\n   * };\n   *\n   * process.env.NODE_ENV = 'production';\n   * const result = FeatureFlagConfigValidator.validate(configWithWarnings);\n   * // result.isValid = true (warnings don't fail validation)\n   * // result.warnings = [\n   * //   { field: 'cacheTtl', message: 'Cache TTL is very high...', code: 'HIGH_CACHE_TTL' },\n   * //   { field: 'isLoggingEnabled', message: 'Logging is enabled in production...', code: 'PRODUCTION_LOGGING_ENABLED' }\n   * // ]\n   * ```\n   */\n  static validate(config: CoreFeatureFlagEnvironmentConfig): CoreFeatureFlagValidationResult {\n    try {\n      // Validate provider\n      this.validateProvider(config);\n\n      // Validate cache settings\n      this.validateCacheSettings(config);\n\n      // Validate database configuration\n      if (config.provider === FEATURE_FLAG_PROVIDERS.DATABASE) {\n        this.validateDatabaseConfig(config);\n      }\n\n      return {\n        isValid: true,\n        errors: [],\n        warnings: this.getWarnings(config),\n      };\n    } catch (error) {\n      return {\n        isValid: false,\n        errors: [\n          {\n            field: 'config',\n            message: error instanceof Error ? error.message : 'Validation failed',\n            code: error instanceof BaseError ? error.code : 'VALIDATION_ERROR',\n          },\n        ],\n        warnings: [],\n      };\n    }\n  }\n\n  private static validateProvider(config: CoreFeatureFlagEnvironmentConfig): void {\n    const validProviders = getValidProviders();\n\n    if (!validProviders.includes(config.provider)) {\n      throw new ValidationError(\n        ERROR_CODES.CLIENT_INVALID_CONFIG,\n        HTTP_STATUS.BAD_REQUEST,\n        `Invalid provider: ${config.provider}. Must be one of: ${validProviders.join(', ')}`\n      );\n    }\n  }\n\n  private static validateCacheSettings(config: CoreFeatureFlagEnvironmentConfig): void {\n    if (config.cacheTtl < 0) {\n      throw new ValidationError(\n        ERROR_CODES.CLIENT_INVALID_CONFIG,\n        HTTP_STATUS.BAD_REQUEST,\n        'Cache TTL must be non-negative'\n      );\n    }\n\n    if (config.refreshInterval < 0) {\n      throw new ValidationError(\n        ERROR_CODES.CLIENT_INVALID_CONFIG,\n        HTTP_STATUS.BAD_REQUEST,\n        'Refresh interval must be non-negative'\n      );\n    }\n  }\n\n  private static validateDatabaseConfig(config: CoreFeatureFlagEnvironmentConfig): void {\n    if (!config.databaseConfig) {\n      throw new ValidationError(\n        ERROR_CODES.DB_CONFIG_REQUIRED,\n        HTTP_STATUS.BAD_REQUEST,\n        'Database configuration is required for database provider'\n      );\n    }\n\n    const { connectionString, tableName, poolSize, timeout } = config.databaseConfig;\n\n    this.validateConnectionString(connectionString);\n    this.validateTableName(tableName);\n    this.validatePoolSize(poolSize);\n    this.validateTimeout(timeout);\n  }\n\n  private static validateConnectionString(connectionString: string): void {\n    if (!connectionString) {\n      throw new ValidationError(\n        ERROR_CODES.DB_CONFIG_REQUIRED,\n        HTTP_STATUS.BAD_REQUEST,\n        'Database connection string is required'\n      );\n    }\n\n    try {\n      new URL(connectionString);\n    } catch {\n      throw new ValidationError(\n        ERROR_CODES.CLIENT_INVALID_CONFIG,\n        HTTP_STATUS.BAD_REQUEST,\n        'Invalid database connection string format'\n      );\n    }\n  }\n\n  private static validateTableName(tableName: string): void {\n    if (tableName && !isString(tableName)) {\n      throw new ValidationError(\n        ERROR_CODES.CLIENT_INVALID_CONFIG,\n        HTTP_STATUS.BAD_REQUEST,\n        'Table name must be a string'\n      );\n    }\n  }\n\n  private static validatePoolSize(poolSize: number | undefined): void {\n    if (\n      isDefined(poolSize) &&\n      (poolSize < NUMERIC_CONSTANTS.MIN_POOL_SIZE || poolSize > NUMERIC_CONSTANTS.MAX_POOL_SIZE)\n    ) {\n      throw new ValidationError(\n        ERROR_CODES.CLIENT_INVALID_CONFIG,\n        HTTP_STATUS.BAD_REQUEST,\n        'Pool size must be between 1 and 100'\n      );\n    }\n  }\n\n  private static validateTimeout(timeout: number | undefined): void {\n    if (isDefined(timeout) && timeout < NUMERIC_CONSTANTS.MIN_TIMEOUT_MS) {\n      throw new ValidationError(\n        ERROR_CODES.CLIENT_INVALID_CONFIG,\n        HTTP_STATUS.BAD_REQUEST,\n        'Timeout must be at least 1000ms'\n      );\n    }\n  }\n\n  private static getWarnings(\n    config: CoreFeatureFlagEnvironmentConfig,\n    environment?: string\n  ): never[] {\n    // Use provided environment or fallback to config-based detection\n    const env =\n      environment ??\n      (config.isLoggingEnabled ? NODE_ENVIRONMENTS.DEVELOPMENT : NODE_ENVIRONMENTS.PRODUCTION);\n\n    if (config.cacheTtl > NUMERIC_CONSTANTS.ONE_HOUR_SECONDS) {\n      logger.warn(\n        'Cache TTL is very high (>1 hour). Consider reducing for better responsiveness.',\n        {\n          field: 'cacheTtl',\n          value: config.cacheTtl,\n          code: 'HIGH_CACHE_TTL',\n        }\n      );\n    }\n\n    if (env === NODE_ENVIRONMENTS.PRODUCTION && config.isLoggingEnabled) {\n      logger.warn('Logging is enabled in production. Consider disabling for performance.', {\n        field: 'isLoggingEnabled',\n        code: 'PRODUCTION_LOGGING_ENABLED',\n      });\n    }\n\n    if (env === NODE_ENVIRONMENTS.DEVELOPMENT && !config.isCacheEnabled) {\n      logger.warn('Cache is disabled in development. This may impact performance testing.', {\n        field: 'isCacheEnabled',\n        code: 'DEVELOPMENT_CACHE_DISABLED',\n      });\n    }\n\n    return [];\n  }\n\n  /**\n   * Validates configuration and throws error if validation fails\n   *\n   * @description Convenience method that validates configuration and throws a detailed\n   * error if validation fails. This is typically used during application startup\n   * to ensure the system doesn't start with invalid configuration.\n   *\n   * @param {FeatureFlagEnvironmentConfig} config - Configuration to validate\n   * @throws {DatabasePackageError} When validation fails with detailed error messages\n   *\n   * @example Startup Validation\n   * ```typescript\n   * // In FeatureFlagService.onModuleInit()\n   * try {\n   *   const config = FeatureFlagConfigFactory.fromOptions();\n   *   FeatureFlagConfigValidator.validateOrThrow(config);\n   *\n   *   // Configuration is valid, proceed with initialization\n   *   this.provider = FeatureFlagProviderFactory.create(config, FEATURES);\n   *   await this.provider.initialize();\n   * } catch (error) {\n   *   this.logger.error('Configuration validation failed:', error.message);\n   *   throw error; // Prevent service from starting\n   * }\n   * ```\n   *\n   * @example Error Output\n   * ```typescript\n   * // When validation fails, throws DatabasePackageError with message:\n   * // \"Configuration validation failed:\n   * // provider: Invalid provider: invalid_type. Must be one of: memory, file, redis, api, database\n   * // cacheTtl: Cache TTL must be non-negative\n   * // databaseConfig.connectionString: Database connection string is required\"\n   * ```\n   *\n   * @example Environment Variable Validation\n   * ```bash\n   * # Missing required environment variables:\n   * # SUPABASE_URL=  # Empty/missing\n   * # FEATURE_FLAG_PROVIDER=database\n   *\n   * # Results in error:\n   * # \"Configuration validation failed:\n   * # databaseConfig.connectionString: Database connection string is required\"\n   * ```\n   */\n  static validateOrThrow(config: CoreFeatureFlagEnvironmentConfig): void {\n    // Validate provider\n    this.validateProvider(config);\n\n    // Validate cache settings\n    this.validateCacheSettings(config);\n\n    // Validate database configuration\n    if (config.provider === FEATURE_FLAG_PROVIDERS.DATABASE) {\n      this.validateDatabaseConfig(config);\n    }\n  }\n}\n","/**\n * Feature Flag Configuration\n *\n * Configuration integration for feature flags with environment variable support.\n * Imports configuration from .env.local and provides validation.\n *\n */\n\nimport { FeatureFlagConfigValidator } from './validation';\nimport {\n  NODE_ENVIRONMENTS,\n  FEATURE_FLAG_DEFAULTS,\n  FEATURE_FLAG_PROVIDERS,\n  type CoreFeatureFlagEnvironmentConfig,\n} from '@plyaz/types/core';\nimport { Core } from '../../../init/CoreInitializer';\n\n// Import for local use\nimport type { FeatureFlagConfigOptions as _FeatureFlagConfigOptions } from '@plyaz/types/features';\n\n/**\n * Feature flag configuration factory\n *\n * This factory is the FIRST component called during application startup.\n * It reads environment variables from .env.local and creates a validated configuration object.\n *\n * @example\n * ```typescript\n * // Step 1: Called automatically by FeatureFlagService.onModuleInit()\n * const config = FeatureFlagConfigFactory.fromOptions({ environment: Core.env.NODE_ENV });\n *\n * // Step 2: Configuration is validated\n * // Step 3: Provider is created with this config\n * const provider = FeatureFlagProviderFactory.create(config, FEATURES);\n * ```\n *\n * @example Environment Variables (.env.local)\n * ```bash\n * SUPABASE_URL=https://your-project.supabase.co\n * SUPABASE_ANON_PUBLIC_KEY=your-anon-key\n * FEATURE_FLAG_PROVIDER=database\n * FEATURE_FLAG_CACHE_ENABLED=true\n * FEATURE_FLAG_CACHE_TTL=300\n * FEATURE_FLAG_TABLE_NAME=feature_flags\n * ```\n */\nexport class FeatureFlagConfigFactory {\n  /**\n   * Creates configuration from environment variables\n   *\n   * **EXECUTION ORDER: This is called FIRST in the initialization chain**\n   *\n   * Flow:\n   * 1. NestJS starts → FeatureFlagModule loads\n   * 2. FeatureFlagService.onModuleInit() called\n   * 3. → initializeProvider() called\n   * 4. → **THIS METHOD CALLED** ← YOU ARE HERE\n   * 5. → Configuration validated\n   * 6. → Provider created and initialized\n   * 7. → Database connection established\n   *\n   * @returns Validated configuration object ready for provider creation\n   * @throws {FeatureFlagConfigError} If required options are missing or invalid\n   */\n  /**\n   * Creates configuration from explicit options\n   *\n   * All options have sensible defaults - only provide what you need to override.\n   * Environment is automatically read from Core.env.NODE_ENV.\n   *\n   * Note: For 'database' provider, DbService must be initialized first via Core.initialize().\n   * The database provider uses the already-configured DbService, no connection string needed here.\n   *\n   * @example Basic usage with defaults (memory provider)\n   * ```typescript\n   * const config = FeatureFlagConfigFactory.fromOptions();\n   * // Uses memory provider, cache enabled, default TTL\n   * ```\n   *\n   * @example Database provider (requires Core.initialize() first)\n   * ```typescript\n   * // First: Core.initialize() with db config\n   * await Core.initialize({ db: { adapter: 'sql', sql: { connectionString: '...' } } });\n   *\n   * // Then: Use database provider for feature flags\n   * const config = FeatureFlagConfigFactory.fromOptions({ provider: 'database' });\n   * ```\n   *\n   * @example Custom cache settings\n   * ```typescript\n   * const config = FeatureFlagConfigFactory.fromOptions({\n   *   cacheEnabled: true,\n   *   cacheTtl: 600,  // 10 minutes\n   *   refreshInterval: 30,\n   * });\n   * ```\n   */\n  // eslint-disable-next-line complexity\n  static fromOptions(options: _FeatureFlagConfigOptions = {}): CoreFeatureFlagEnvironmentConfig {\n    // Resolve provider with default\n    const provider = options.provider ?? FEATURE_FLAG_PROVIDERS.MEMORY;\n\n    // Get environment from Core.env (set during Core.initialize())\n    const environment = Core.isInitialized ? Core.env.NODE_ENV : NODE_ENVIRONMENTS.DEVELOPMENT;\n    const isDevelopment = environment === NODE_ENVIRONMENTS.DEVELOPMENT;\n\n    const config: CoreFeatureFlagEnvironmentConfig = {\n      provider,\n      isCacheEnabled: options.cacheEnabled ?? true,\n      cacheTtl: options.cacheTtl ?? FEATURE_FLAG_DEFAULTS.CACHE_TTL,\n      refreshInterval: options.refreshInterval ?? FEATURE_FLAG_DEFAULTS.REFRESH_INTERVAL,\n      shouldFallbackToDefaults: options.fallbackToDefaults ?? true,\n      isLoggingEnabled: options.loggingEnabled ?? isDevelopment,\n    };\n\n    // Add database config if using database provider\n    // Note: Connection is handled by DbService, we just need table name\n    if (provider === FEATURE_FLAG_PROVIDERS.DATABASE) {\n      config.databaseConfig = {\n        connectionString: '', // Not used - DbService handles connection\n        tableName: options.tableName ?? FEATURE_FLAG_DEFAULTS.TABLE_NAME,\n        poolSize: FEATURE_FLAG_DEFAULTS.POOL_SIZE,\n        timeout: FEATURE_FLAG_DEFAULTS.TIMEOUT,\n      };\n    }\n\n    FeatureFlagConfigValidator.validateOrThrow(config);\n    return config;\n  }\n}\n","/**\n * Webhooks Controller\n *\n * Exposes webhook endpoints for external services.\n * Uses StorageService and NotificationService instances for webhook processing.\n * All webhooks verify signatures before processing.\n *\n * @endpoints\n * - POST /webhooks/storage/:provider     - Storage webhooks (r2 | supabase | media)\n * - POST /webhooks/notifications/:provider - Notification webhooks (sendgrid | infobip)\n * - POST /webhooks/notifications/infobip/:type - Infobip typed webhooks (delivery | tracking)\n */\n\nimport { Controller, Post, Body, Headers, Req, Param, HttpCode, HttpStatus } from '@nestjs/common';\nimport { ApiTags, ApiOperation, ApiParam, ApiResponse } from '@nestjs/swagger';\nimport type { Request } from 'express';\nimport { StorageService, NotificationService } from '../../services';\nimport { CorePackageError } from '@plyaz/errors';\nimport { CORE_ERROR_CODES } from '@plyaz/types/errors';\nimport {\n  NOTIFICATION_PROVIDERS,\n  NOTIFICATION_CHANNELS,\n  type NotificationWebhookPayload,\n  type WebhookProcessingResult as NotificationWebhookResult,\n} from '@plyaz/types/notifications';\nimport {\n  STORAGE_WEBHOOK_EVENT_TYPE,\n  type StorageWebhookPayload,\n  type StorageWebhookProcessingResult,\n} from '@plyaz/types/storage';\nimport { Core } from '../../init/CoreInitializer';\nimport { PackageLogger } from '@plyaz/logger';\n\n// Use Core's logger transport for consistency\nconst log = new PackageLogger({\n  packageName: 'core',\n  service: 'webhooks',\n  transport: Core.loggerTransport,\n});\n\ninterface WebhookRequest extends Request {\n  rawBody?: Buffer;\n}\n\n/** Supported storage webhook providers */\ntype StorageWebhookProvider = 'r2' | 'supabase' | 'media';\n\n/** Supported notification webhook providers */\ntype NotificationWebhookProvider = 'sendgrid' | 'infobip';\n\n/** Maps route param to internal provider name */\nconst STORAGE_PROVIDER_MAP: Record<StorageWebhookProvider, string> = {\n  r2: 'cloudflare-r2',\n  supabase: 'supabase-storage',\n  media: 'media-processor',\n};\n\n/** Maps route param to notification provider constant */\nconst NOTIFICATION_PROVIDER_MAP: Record<NotificationWebhookProvider, string> = {\n  sendgrid: NOTIFICATION_PROVIDERS.SENDGRID,\n  infobip: NOTIFICATION_PROVIDERS.INFOBIP,\n};\n\n/** HTTP response for webhook endpoints - subset of internal result */\ntype WebhookHttpResponse = Pick<\n  StorageWebhookProcessingResult | NotificationWebhookResult,\n  'success'\n> & {\n  message?: string;\n  eventsProcessed?: number;\n};\n\n@ApiTags('webhooks')\n@Controller('webhooks')\nexport class WebhooksController {\n  // ===========================================================================\n  // Storage Webhooks\n  // ===========================================================================\n\n  /**\n   * Generic storage webhook endpoint\n   * Handles: R2, Supabase, and media processing webhooks\n   */\n  @Post('storage/:provider')\n  @HttpCode(HttpStatus.OK)\n  @ApiOperation({ summary: 'Handle storage provider webhooks' })\n  @ApiParam({\n    name: 'provider',\n    description: 'Storage provider',\n    enum: ['r2', 'supabase', 'media'],\n  })\n  @ApiResponse({ status: 200, description: 'Webhook processed successfully' })\n  @ApiResponse({ status: 400, description: 'Unknown provider' })\n  @ApiResponse({ status: 503, description: 'Storage service not initialized' })\n  async handleStorageWebhook(\n    @Param('provider') provider: string,\n    @Headers() headers: Record<string, string>,\n    @Body() body: Record<string, unknown>,\n    @Req() req: WebhookRequest\n  ): Promise<WebhookHttpResponse> {\n    const internalProvider = this.resolveStorageProvider(provider);\n    return this.processStorageWebhook(internalProvider, headers, body, req);\n  }\n\n  private resolveStorageProvider(provider: string): string {\n    const normalizedProvider = provider.toLowerCase() as StorageWebhookProvider;\n\n    switch (normalizedProvider) {\n      case 'r2':\n      case 'supabase':\n      case 'media':\n        return STORAGE_PROVIDER_MAP[normalizedProvider];\n      default:\n        throw new CorePackageError(\n          `Unknown storage provider: ${provider}`,\n          CORE_ERROR_CODES.PROVIDER_NOT_FOUND,\n          {\n            context: { provider, service: 'storage' },\n            statusCode: HttpStatus.BAD_REQUEST,\n          }\n        );\n    }\n  }\n\n  private async processStorageWebhook(\n    provider: string,\n    headers: Record<string, string>,\n    body: Record<string, unknown>,\n    req: WebhookRequest\n  ): Promise<WebhookHttpResponse> {\n    if (!StorageService.isInitialized()) {\n      throw new CorePackageError(\n        'Storage service not initialized',\n        CORE_ERROR_CODES.INITIALIZATION_FAILED,\n        {\n          context: { provider, service: 'storage' },\n          statusCode: HttpStatus.SERVICE_UNAVAILABLE,\n        }\n      );\n    }\n\n    const storage = StorageService.getInstance().getStorage();\n\n    try {\n      const eventType = this.extractStorageEventType(body);\n\n      const payload: StorageWebhookPayload<Record<string, unknown>> = {\n        method: req.method,\n        url: req.originalUrl || req.url,\n        headers,\n        body,\n        rawBody: req.rawBody?.toString('utf-8'),\n      };\n\n      const result = await storage.handleWebhook(provider, eventType, payload);\n\n      if (result.duplicate) {\n        log.debug('[Webhook:Storage] Duplicate webhook ignored', { provider });\n        return {\n          success: true,\n          message: 'Duplicate webhook, already processed',\n        };\n      }\n\n      log.info('[Webhook:Storage] Processed', {\n        provider,\n        eventsProcessed: result.events?.length ?? 0,\n      });\n\n      return {\n        success: result.success,\n        eventsProcessed: result.events?.length ?? 0,\n      };\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      log.error('[Webhook:Storage] Processing failed', { provider, error });\n\n      if (CorePackageError.isCorePackageError(error)) {\n        throw error;\n      }\n\n      throw new CorePackageError(error.message, CORE_ERROR_CODES.OPERATION_FAILED, {\n        context: { provider, service: 'storage', operation: 'webhook' },\n        cause: error,\n        statusCode: HttpStatus.INTERNAL_SERVER_ERROR,\n      });\n    }\n  }\n\n  private extractStorageEventType(body: Record<string, unknown>): STORAGE_WEBHOOK_EVENT_TYPE {\n    // R2 format\n    if (body.Records && Array.isArray(body.Records)) {\n      const record = body.Records[0] as Record<string, unknown> | undefined;\n      const eventName = record?.eventName as string | undefined;\n\n      if (eventName?.includes('ObjectCreated')) {\n        return STORAGE_WEBHOOK_EVENT_TYPE.ObjectCreated;\n      }\n      if (eventName?.includes('ObjectRemoved')) {\n        return STORAGE_WEBHOOK_EVENT_TYPE.ObjectDeleted;\n      }\n    }\n\n    // Supabase format\n    switch (body.type) {\n      case 'INSERT':\n        return STORAGE_WEBHOOK_EVENT_TYPE.ObjectCreated;\n      case 'UPDATE':\n        return STORAGE_WEBHOOK_EVENT_TYPE.ObjectUpdated;\n      case 'DELETE':\n        return STORAGE_WEBHOOK_EVENT_TYPE.ObjectDeleted;\n    }\n\n    // Media processing format\n    if (body.event === 'transcode_complete' || body.event === 'processing_complete') {\n      return STORAGE_WEBHOOK_EVENT_TYPE.TranscodeComplete;\n    }\n\n    // Default\n    return STORAGE_WEBHOOK_EVENT_TYPE.ObjectCreated;\n  }\n\n  // ===========================================================================\n  // Notification Webhooks\n  // ===========================================================================\n\n  /**\n   * Generic notification webhook endpoint\n   * Handles: SendGrid and Infobip webhooks\n   */\n  @Post('notifications/:provider')\n  @HttpCode(HttpStatus.OK)\n  @ApiOperation({ summary: 'Handle notification provider webhooks' })\n  @ApiParam({\n    name: 'provider',\n    description: 'Notification provider',\n    enum: ['sendgrid', 'infobip'],\n  })\n  @ApiResponse({ status: 200, description: 'Webhook processed successfully' })\n  @ApiResponse({ status: 400, description: 'Unknown provider' })\n  @ApiResponse({ status: 503, description: 'Notification service not initialized' })\n  async handleNotificationWebhook(\n    @Param('provider') provider: string,\n    @Headers() headers: Record<string, string>,\n    @Body() body: Record<string, unknown>,\n    @Req() req: WebhookRequest\n  ): Promise<WebhookHttpResponse> {\n    const internalProvider = this.resolveNotificationProvider(provider);\n    return this.processNotificationWebhook(internalProvider, headers, body, req);\n  }\n\n  /**\n   * Infobip webhook with type parameter\n   * Handles: delivery status and tracking events separately\n   */\n  @Post('notifications/infobip/:type')\n  @HttpCode(HttpStatus.OK)\n  @ApiOperation({ summary: 'Handle Infobip typed webhooks (delivery/tracking)' })\n  @ApiParam({\n    name: 'type',\n    description: 'Webhook type',\n    enum: ['delivery', 'tracking'],\n  })\n  @ApiResponse({ status: 200, description: 'Webhook processed successfully' })\n  @ApiResponse({ status: 400, description: 'Unknown webhook type' })\n  async handleInfobipTypedWebhook(\n    @Param('type') type: string,\n    @Headers() headers: Record<string, string>,\n    @Body() body: Record<string, unknown>,\n    @Req() req: WebhookRequest\n  ): Promise<WebhookHttpResponse> {\n    if (type !== 'delivery' && type !== 'tracking') {\n      throw new CorePackageError(\n        `Unknown Infobip webhook type: ${type}`,\n        CORE_ERROR_CODES.VALIDATION_FAILED,\n        {\n          context: { type, provider: 'infobip', service: 'notifications' },\n          statusCode: HttpStatus.BAD_REQUEST,\n        }\n      );\n    }\n\n    return this.processNotificationWebhook(NOTIFICATION_PROVIDERS.INFOBIP, headers, body, req);\n  }\n\n  private resolveNotificationProvider(provider: string): string {\n    const normalizedProvider = provider.toLowerCase() as NotificationWebhookProvider;\n\n    switch (normalizedProvider) {\n      case 'sendgrid':\n      case 'infobip':\n        return NOTIFICATION_PROVIDER_MAP[normalizedProvider];\n      default:\n        throw new CorePackageError(\n          `Unknown notification provider: ${provider}`,\n          CORE_ERROR_CODES.PROVIDER_NOT_FOUND,\n          {\n            context: { provider, service: 'notifications' },\n            statusCode: HttpStatus.BAD_REQUEST,\n          }\n        );\n    }\n  }\n\n  private async processNotificationWebhook(\n    provider: string,\n    headers: Record<string, string>,\n    body: Record<string, unknown>,\n    req: WebhookRequest\n  ): Promise<WebhookHttpResponse> {\n    if (!NotificationService.isInitialized()) {\n      throw new CorePackageError(\n        'Notification service not initialized',\n        CORE_ERROR_CODES.INITIALIZATION_FAILED,\n        {\n          context: { provider, service: 'notifications' },\n          statusCode: HttpStatus.SERVICE_UNAVAILABLE,\n        }\n      );\n    }\n\n    const notifications = NotificationService.getInstance().getNotifications();\n\n    try {\n      const payload: NotificationWebhookPayload<Record<string, unknown>> = {\n        headers,\n        body,\n        method: req.method,\n        url: req.originalUrl || req.url,\n      };\n\n      const result = await notifications.processWebhook(\n        provider,\n        NOTIFICATION_CHANNELS.EMAIL,\n        payload\n      );\n\n      if (result.duplicate) {\n        log.debug('[Webhook:Notification] Duplicate webhook ignored', {\n          provider,\n        });\n        return {\n          success: true,\n          message: 'Duplicate webhook, already processed',\n        };\n      }\n\n      log.info('[Webhook:Notification] Processed', {\n        provider,\n        eventsProcessed: result.events?.length ?? 0,\n      });\n\n      return {\n        success: result.success,\n        eventsProcessed: result.events?.length ?? 0,\n      };\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      log.error('[Webhook:Notification] Processing failed', {\n        provider,\n        error,\n      });\n\n      if (CorePackageError.isCorePackageError(error)) {\n        throw error;\n      }\n\n      throw new CorePackageError(error.message, CORE_ERROR_CODES.OPERATION_FAILED, {\n        context: { provider, service: 'notifications', operation: 'webhook' },\n        cause: error,\n        statusCode: HttpStatus.INTERNAL_SERVER_ERROR,\n      });\n    }\n  }\n}\n","/**\n * Webhooks Module\n *\n * NestJS module for handling incoming webhooks from external services:\n * - Storage providers (R2, Supabase)\n * - Notification providers (SendGrid, Infobip)\n * - Media processing services\n *\n * Uses Core.storage and Core.notifications for webhook processing.\n * No custom service needed - all logic is handled by the packages.\n *\n * @example Usage in app.module.ts\n * ```typescript\n * import { CoreModule } from '@plyaz/core/nestjs';\n * import { WebhooksModule } from '@plyaz/core/backend';\n *\n * @Module({\n *   imports: [\n *     CoreModule.forRoot({ envPath: '.env' }),\n *     WebhooksModule,\n *   ],\n * })\n * export class AppModule {}\n * ```\n */\n\nimport { Module } from '@nestjs/common';\nimport { WebhooksController } from './webhooks.controller';\n\n@Module({\n  controllers: [WebhooksController],\n})\nexport class WebhooksModule {}\n","import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';\nimport { Observable, of, tap } from 'rxjs';\n\n/**\n * Caching interceptor for feature flag responses.\n *\n * FLOW:\n * 1. Runs AFTER middleware attaches dynamic feature flags.\n * 2. Generates a cache key based on request URL and enabled flags.\n * 3. If a cached response exists for this combination, returns it immediately.\n * 4. Otherwise, calls the next handler and caches the response.\n */\n@Injectable()\nexport class Caching implements NestInterceptor {\n  // Map to store cached responses keyed by URL + active feature flags\n  private cache = new Map<string, unknown>();\n\n  intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {\n    const request = context.switchToHttp().getRequest();\n\n    // Include active flags in cache key\n    const flagsKey = JSON.stringify(request.featureFlags ?? {});\n    const cacheKey = `${request.url}|${flagsKey}`;\n\n    if (this.cache.has(cacheKey)) {\n      // Return cached response as Observable\n      return of(this.cache.get(cacheKey));\n    }\n\n    // Otherwise, proceed to handler and cache the response\n    return next.handle().pipe(\n      tap(response => {\n        this.cache.set(cacheKey, response);\n      })\n    );\n  }\n}\n","/**\n * NestJS integration exports\n */\nimport type { INestApplication } from '@nestjs/common';\nimport { Core } from '../CoreInitializer';\nimport {\n  configureNestApp as configureNestAppInternal,\n  getDefaultNestJsConfig,\n  type ConfigureNestAppResult,\n} from './configureNestApp';\n\nexport { CoreModule, CORE_OPTIONS, DB_SERVICE } from './CoreModule';\nexport { StreamingModule } from './StreamingModule';\nexport { StreamingController, STREAM_SERVER } from './StreamingController';\nexport { getDefaultNestJsConfig, type ConfigureNestAppResult };\n\n/**\n * Configure a NestJS application with middleware based on CoreInitOptions.\n * Uses the options passed to CoreModule.forRoot() automatically.\n *\n * @param app - NestJS application instance\n * @returns Configuration result with enabled/skipped features\n *\n * @example\n * ```typescript\n * import { NestFactory } from '@nestjs/core';\n * import { configureNestApp } from '@plyaz/core/nestjs';\n *\n * const app = await NestFactory.create(AppModule);\n * const result = await configureNestApp(app);\n * console.log('Enabled:', result.enabled);\n * ```\n */\nexport async function configureNestApp(app: INestApplication): Promise<ConfigureNestAppResult> {\n  return configureNestAppInternal(app, Core.initOptions);\n}\n","/**\n * NestJS App Configuration Helper\n *\n * Configures a NestJS application with middleware based on CoreInitOptions.\n * Call this in your main.ts after creating the app.\n *\n * @example\n * ```typescript\n * import { NestFactory } from '@nestjs/core';\n * import { configureNestApp } from '@plyaz/core/nestjs';\n * import { AppModule } from './app.module';\n * import { buildCoreConfig } from './config';\n *\n * async function bootstrap() {\n *   const app = await NestFactory.create(AppModule);\n *   const options = buildCoreConfig();\n *\n *   // Configure middleware, validation, security, etc.\n *   await configureNestApp(app, options);\n *\n *   await app.listen(3000);\n * }\n * ```\n */\n\nimport {\n  VersioningType,\n  type INestApplication,\n  type ExceptionFilter,\n  type VersioningOptions,\n} from '@nestjs/common';\nimport type { CoreNestJsMiddlewareConfig } from '@plyaz/types/core';\nimport { TIME_CONSTANTS } from '@plyaz/config';\nimport { PackageLogger } from '@plyaz/logger';\nimport { createNestJsExceptionFilter } from '@plyaz/errors/middleware/backend';\nimport { Core, type CoreInitOptions } from '../CoreInitializer';\n\n// Default configuration values\nconst DEFAULTS = {\n  bodyLimit: '10mb',\n  timeout: 30000,\n  shutdownTimeout: 10000,\n  rateLimit: {\n    ttl: 60,\n    limit: 100,\n  },\n  validation: {\n    whitelist: true,\n    transform: true,\n    forbidNonWhitelisted: false,\n    disableErrorMessages: false,\n  },\n  swagger: {\n    path: 'docs', // Relative to globalPrefix\n    title: 'API Documentation',\n    version: '1.0',\n  },\n} as const;\n\n/**\n * Result of configuring a NestJS app\n */\nexport interface ConfigureNestAppResult {\n  /** Features that were enabled */\n  enabled: string[];\n  /** Features that were skipped (not configured or dependencies missing) */\n  skipped: string[];\n  /** Any warnings during configuration */\n  warnings: string[];\n  /** Configured paths */\n  paths: {\n    /** API prefix (e.g., 'api') */\n    prefix?: string;\n    /** Swagger docs path (e.g., 'api/docs') */\n    swagger?: string;\n  };\n}\n\n/**\n * Configure a NestJS application with middleware based on CoreInitOptions.\n *\n * This function applies:\n * - Compression middleware (if compression: true)\n * - Helmet security headers (if helmet: true)\n * - Rate limiting (if rateLimit config provided)\n * - Global validation pipe (if validation: true)\n * - Body size limits\n * - Request timeout\n * - Raw body parsing for webhooks\n * - Swagger documentation (if swagger config provided)\n * - CORS configuration\n * - Global prefix\n * - Graceful shutdown handlers\n *\n * @param app - NestJS application instance\n * @param options - Core initialization options (reads nestjs config)\n * @returns Configuration result with enabled/skipped features\n *\n * @example Basic usage\n * ```typescript\n * const app = await NestFactory.create(AppModule);\n * await configureNestApp(app, {\n *   nestjs: {\n *     compression: true,\n *     helmet: true,\n *     validation: true,\n *   },\n * });\n * ```\n *\n * @example Full production config\n * ```typescript\n * await configureNestApp(app, {\n *   nestjs: {\n *     compression: true,\n *     helmet: true,\n *     rateLimit: { ttl: 60, limit: 100 },\n *     validation: { whitelist: true, transform: true },\n *     bodyLimit: '10mb',\n *     timeout: 30000,\n *     rawBody: { paths: ['/webhooks/*'] },\n *     swagger: { enabled: false },\n *     globalPrefix: 'api',\n *     excludeFromPrefix: ['health', 'metrics'],\n *     gracefulShutdown: true,\n *   },\n * });\n * ```\n */\n// eslint-disable-next-line complexity, max-lines-per-function\nexport async function configureNestApp(\n  app: INestApplication,\n  options: CoreInitOptions\n): Promise<ConfigureNestAppResult> {\n  const config = options.nestjs ?? {};\n  const isProduction = options.environment === 'production' || Core.env.NODE_ENV === 'production';\n  const logger = new PackageLogger({\n    packageName: 'core',\n    service: 'NestJS',\n    transport: Core.loggerTransport,\n  });\n\n  const result: ConfigureNestAppResult = {\n    enabled: [],\n    skipped: [],\n    warnings: [],\n    paths: {},\n  };\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Compression\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.compression === true || (config.compression !== false && isProduction)) {\n    try {\n      const compression = await import('compression');\n      app.use(compression.default());\n      result.enabled.push('compression');\n      logger.debug('Compression middleware enabled');\n    } catch {\n      result.skipped.push('compression');\n      result.warnings.push('compression package not installed - run: pnpm add compression');\n    }\n  } else {\n    result.skipped.push('compression');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Helmet Security Headers\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.helmet !== false) {\n    try {\n      const helmet = await import('helmet');\n      const helmetOptions = typeof config.helmet === 'object' ? config.helmet : {};\n      app.use(helmet.default(helmetOptions));\n      result.enabled.push('helmet');\n      logger.debug('Helmet security headers enabled');\n    } catch {\n      result.skipped.push('helmet');\n      result.warnings.push('helmet package not installed - run: pnpm add helmet');\n    }\n  } else {\n    result.skipped.push('helmet');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Rate Limiting\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.rateLimit !== false) {\n    try {\n      // NestJS throttler module is typically configured in the module, not middleware\n      // We'll use express-rate-limit as a fallback for raw middleware approach\n      const rateLimit = await import('express-rate-limit');\n      const rateLimitConfig =\n        typeof config.rateLimit === 'object' ? config.rateLimit : DEFAULTS.rateLimit;\n\n      const limiter = rateLimit.default({\n        windowMs:\n          (rateLimitConfig.ttl ?? DEFAULTS.rateLimit.ttl) * TIME_CONSTANTS.MILLISECONDS_PER_SECOND,\n        max: rateLimitConfig.limit ?? DEFAULTS.rateLimit.limit,\n        standardHeaders: true,\n        legacyHeaders: false,\n        skip: 'skipIf' in rateLimitConfig ? rateLimitConfig.skipIf : undefined,\n      });\n\n      app.use(limiter);\n      result.enabled.push('rateLimit');\n      logger.debug('Rate limiting enabled', {\n        ttl: rateLimitConfig.ttl ?? DEFAULTS.rateLimit.ttl,\n        limit: rateLimitConfig.limit ?? DEFAULTS.rateLimit.limit,\n      });\n    } catch {\n      result.skipped.push('rateLimit');\n      result.warnings.push(\n        'express-rate-limit package not installed - run: pnpm add express-rate-limit'\n      );\n    }\n  } else {\n    result.skipped.push('rateLimit');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Global Validation Pipe\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.validation !== false) {\n    try {\n      const { ValidationPipe } = await import('@nestjs/common');\n      const validationConfig =\n        typeof config.validation === 'object' ? config.validation : DEFAULTS.validation;\n\n      const pipe = new ValidationPipe({\n        whitelist: validationConfig.whitelist ?? DEFAULTS.validation.whitelist,\n        transform: validationConfig.transform ?? DEFAULTS.validation.transform,\n        forbidNonWhitelisted:\n          validationConfig.forbidNonWhitelisted ?? DEFAULTS.validation.forbidNonWhitelisted,\n        disableErrorMessages:\n          validationConfig.disableErrorMessages ?? DEFAULTS.validation.disableErrorMessages,\n      });\n\n      app.useGlobalPipes(pipe);\n      result.enabled.push('validation');\n      logger.debug('Global validation pipe enabled', { ...validationConfig });\n    } catch {\n      result.skipped.push('validation');\n      result.warnings.push('Failed to create validation pipe');\n    }\n  } else {\n    result.skipped.push('validation');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Global Exception Filter (for proper ErrorResponse format)\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Use Core.httpErrorHandler if available (created during Core.initialize based on config)\n  // Falls back to direct creation if Core didn't create it (e.g., runtime detection issue)\n  try {\n    let FilterClass: (new () => ExceptionFilter) | null = null;\n\n    // Try Core.httpErrorHandler first (respects errorHandler config from Core.initialize)\n    if (Core.httpErrorHandler && typeof Core.httpErrorHandler === 'function') {\n      FilterClass = Core.httpErrorHandler as new () => ExceptionFilter;\n      logger.debug('Using Core.httpErrorHandler for exception filter');\n    } else {\n      // Fallback: create directly (in case runtime wasn't detected as nestjs)\n      const isProduction = Core.env.NODE_ENV === 'production';\n      const errorConfig = Core.errorConfig ?? {};\n      FilterClass = createNestJsExceptionFilter({\n        source: 'nestjs',\n        includeStack: errorConfig.includeStack ?? !isProduction,\n        logErrors: errorConfig.logger ?? errorConfig.logToConsole ?? true,\n      }) as unknown as new () => ExceptionFilter;\n      logger.debug('Created exception filter directly (Core.httpErrorHandler not available)');\n    }\n\n    app.useGlobalFilters(new FilterClass());\n    result.enabled.push('exceptionFilter');\n  } catch (err) {\n    result.skipped.push('exceptionFilter');\n    result.warnings.push(\n      `Failed to register exception filter: ${err instanceof Error ? err.message : String(err)}`\n    );\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Body Parser / Size Limits\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.bodyLimit) {\n    try {\n      const bodyParser = await import('body-parser');\n      const limit = config.bodyLimit ?? DEFAULTS.bodyLimit;\n      app.use(bodyParser.json({ limit }));\n      app.use(bodyParser.urlencoded({ limit, extended: true }));\n      result.enabled.push('bodyLimit');\n      logger.debug('Body parser configured', { limit });\n    } catch {\n      // body-parser is usually bundled with express, so this shouldn't fail\n      result.skipped.push('bodyLimit');\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Raw Body for Webhooks\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.rawBody) {\n    try {\n      const bodyParser = await import('body-parser');\n      const rawBodyConfig = typeof config.rawBody === 'object' ? config.rawBody : {};\n      const paths = rawBodyConfig.paths ?? ['/webhooks'];\n\n      // Add raw body parsing middleware\n      app.use(\n        bodyParser.raw({\n          type: 'application/json',\n          verify: (req: unknown, _res: unknown, buf: Buffer) => {\n            // Check if path matches\n            const request = req as { rawBody?: Buffer; originalUrl?: string };\n            const reqPath = request.originalUrl ?? '';\n            if (paths.some((p: string) => reqPath.includes(p.replace('*', '')))) {\n              request.rawBody = buf;\n            }\n          },\n        })\n      );\n\n      result.enabled.push('rawBody');\n      logger.debug('Raw body parsing enabled for paths', { paths });\n    } catch {\n      result.skipped.push('rawBody');\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // CORS\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.cors !== false && config.cors !== undefined) {\n    const corsConfig = typeof config.cors === 'object' ? config.cors : {};\n    app.enableCors({\n      origin: corsConfig.origin ?? true,\n      credentials: corsConfig.credentials ?? true,\n      methods: corsConfig.methods,\n      allowedHeaders: corsConfig.allowedHeaders,\n    });\n    result.enabled.push('cors');\n    logger.debug('CORS configured', { ...corsConfig });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // API Versioning (MUST be before setGlobalPrefix for URI versioning to work)\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.versioning) {\n    try {\n      const versionConfig = config.versioning;\n\n      // Build versioning options based on type\n      let versioningOptions: VersioningOptions;\n\n      if (versionConfig.type === 'custom' && versionConfig.extractor) {\n        versioningOptions = {\n          type: VersioningType.CUSTOM,\n          defaultVersion: versionConfig.defaultVersion,\n          extractor: versionConfig.extractor,\n        };\n      } else if (versionConfig.type === 'header') {\n        versioningOptions = {\n          type: VersioningType.HEADER,\n          defaultVersion: versionConfig.defaultVersion,\n          header: versionConfig.header ?? 'X-API-Version',\n        };\n      } else if (versionConfig.type === 'media-type') {\n        versioningOptions = {\n          type: VersioningType.MEDIA_TYPE,\n          defaultVersion: versionConfig.defaultVersion,\n          key: versionConfig.key ?? 'v',\n        };\n      } else {\n        // Default: URI versioning\n        versioningOptions = {\n          type: VersioningType.URI,\n          defaultVersion: versionConfig.defaultVersion,\n          prefix: versionConfig.prefix ?? 'v',\n        };\n      }\n\n      app.enableVersioning(versioningOptions);\n      result.enabled.push('versioning');\n      logger.debug('API versioning enabled', {\n        type: versionConfig.type ?? 'uri',\n        defaultVersion: versionConfig.defaultVersion,\n      });\n    } catch {\n      result.skipped.push('versioning');\n      result.warnings.push('Failed to enable versioning');\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Global Prefix\n  // ─────────────────────────────────────────────────────────────────────────────\n  const prefix = config.globalPrefix !== false ? (config.globalPrefix ?? 'api') : undefined;\n  if (prefix) {\n    const exclude = config.excludeFromPrefix ?? ['health'];\n    app.setGlobalPrefix(prefix, { exclude });\n    result.enabled.push('globalPrefix');\n    result.paths.prefix = prefix;\n    logger.debug('Global prefix set', { prefix, exclude });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Swagger Documentation\n  // ─────────────────────────────────────────────────────────────────────────────\n  const swaggerEnabled = isProduction\n    ? (typeof config.swagger === 'object' && config.swagger.enabled === true) ||\n      config.swagger === true\n    : config.swagger !== false;\n\n  if (swaggerEnabled) {\n    try {\n      const { SwaggerModule, DocumentBuilder } = await import('@nestjs/swagger');\n      const swaggerConfig = typeof config.swagger === 'object' ? config.swagger : DEFAULTS.swagger;\n\n      const documentBuilder = new DocumentBuilder()\n        .setTitle(swaggerConfig.title ?? DEFAULTS.swagger.title)\n        .setVersion(swaggerConfig.version ?? DEFAULTS.swagger.version);\n\n      if ('description' in swaggerConfig && swaggerConfig.description) {\n        documentBuilder.setDescription(swaggerConfig.description);\n      }\n\n      if ('bearerAuth' in swaggerConfig && swaggerConfig.bearerAuth) {\n        documentBuilder.addBearerAuth();\n      }\n\n      const document = SwaggerModule.createDocument(app, documentBuilder.build());\n      // Construct swagger path\n      // If path starts with '/', treat as absolute (don't add prefix)\n      // If path is relative (e.g., 'docs'), prepend the prefix\n      const configPath = swaggerConfig.path ?? DEFAULTS.swagger.path;\n      const isAbsolutePath = configPath.startsWith('/');\n      const cleanPath = configPath.replace(/^\\/+/, ''); // Remove leading slashes\n      const fullPath = isAbsolutePath ? cleanPath : prefix ? `${prefix}/${cleanPath}` : cleanPath;\n      SwaggerModule.setup(fullPath, app, document);\n\n      result.enabled.push('swagger');\n      result.paths.swagger = fullPath;\n      logger.debug('Swagger documentation enabled', { path: fullPath });\n    } catch {\n      result.skipped.push('swagger');\n      result.warnings.push('@nestjs/swagger package not installed - run: pnpm add @nestjs/swagger');\n    }\n  } else {\n    result.skipped.push('swagger');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Graceful Shutdown\n  // ─────────────────────────────────────────────────────────────────────────────\n  /* eslint-disable n/no-process-exit -- Graceful shutdown requires process.exit */\n  if (config.gracefulShutdown !== false) {\n    const timeout = config.shutdownTimeout ?? DEFAULTS.shutdownTimeout;\n\n    // Enable shutdown hooks\n    app.enableShutdownHooks();\n\n    // SIGTERM handler\n    process.on('SIGTERM', async () => {\n      logger.info('SIGTERM received, initiating graceful shutdown...');\n      const shutdownTimer = setTimeout(() => {\n        logger.warn('Graceful shutdown timeout, forcing exit');\n        process.exit(1);\n      }, timeout);\n\n      try {\n        await app.close();\n        clearTimeout(shutdownTimer);\n        logger.info('Graceful shutdown complete');\n        process.exit(0);\n      } catch (err) {\n        clearTimeout(shutdownTimer);\n        logger.error('Error during shutdown', { error: err });\n        process.exit(1);\n      }\n    });\n\n    // SIGINT handler (Ctrl+C)\n    process.on('SIGINT', async () => {\n      logger.info('SIGINT received, initiating graceful shutdown...');\n      const shutdownTimer = setTimeout(() => {\n        logger.warn('Graceful shutdown timeout, forcing exit');\n        process.exit(1);\n      }, timeout);\n\n      try {\n        await app.close();\n        clearTimeout(shutdownTimer);\n        logger.info('Graceful shutdown complete');\n        process.exit(0);\n      } catch (err) {\n        clearTimeout(shutdownTimer);\n        logger.error('Error during shutdown', { error: err });\n        process.exit(1);\n      }\n    });\n\n    result.enabled.push('gracefulShutdown');\n    logger.debug('Graceful shutdown handlers registered', { timeout });\n  }\n  /* eslint-enable n/no-process-exit */\n\n  // ─────────────────────────────────────────────────────────────────────────────\n  // Request Timeout (applied via middleware)\n  // ─────────────────────────────────────────────────────────────────────────────\n  if (config.timeout && config.timeout > 0) {\n    try {\n      const connectTimeout = await import('connect-timeout');\n      app.use(connectTimeout.default(`${config.timeout}ms`));\n      result.enabled.push('timeout');\n      logger.debug('Request timeout configured', { timeout: config.timeout });\n    } catch {\n      // connect-timeout is optional\n      result.skipped.push('timeout');\n    }\n  }\n\n  // Log summary\n  logger.info('NestJS app configured', {\n    enabled: result.enabled,\n    skipped: result.skipped.length > 0 ? result.skipped : undefined,\n    warnings: result.warnings.length > 0 ? result.warnings : undefined,\n  });\n\n  return result;\n}\n\n/**\n * Get default NestJS middleware configuration.\n * Use this as a base and override specific options.\n *\n * @param isProduction - Whether running in production\n * @returns Default configuration\n */\nexport function getDefaultNestJsConfig(isProduction = false): CoreNestJsMiddlewareConfig {\n  return {\n    compression: isProduction,\n    helmet: true,\n    rateLimit: isProduction ? DEFAULTS.rateLimit : false,\n    validation: DEFAULTS.validation,\n    bodyLimit: DEFAULTS.bodyLimit,\n    timeout: DEFAULTS.timeout,\n    rawBody: false,\n    swagger: { enabled: !isProduction, ...DEFAULTS.swagger },\n    globalPrefix: 'api',\n    excludeFromPrefix: ['health'],\n    gracefulShutdown: true,\n    shutdownTimeout: DEFAULTS.shutdownTimeout,\n  };\n}\n","/**\n * Next.js Adapter\n *\n * Provides utilities for Next.js API routes with auto-initialization\n * and service injection.\n *\n * @example\n * ```typescript\n * // app/api/users/route.ts\n * import { createHandler } from '@plyaz/core/adapters';\n *\n * export const GET = createHandler(async ({ db, query }) => {\n *   const users = await db.list('users');\n *   return { users };\n * });\n *\n * export const POST = createHandler(async ({ db, body }) => {\n *   const user = await db.create('users', body);\n *   return { user, status: 201 };\n * });\n * ```\n */\n\nimport { Core } from '../init/CoreInitializer';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n  CoreNextJsHandlerContext,\n  CoreNextJsHandler,\n  CoreNextJsHandlerOptions,\n  CoreNextJsHandlerResult,\n} from '@plyaz/types/core';\n\n/**\n * Parse query parameters from URL\n */\nfunction parseQuery(url: string): Record<string, string | string[]> {\n  const query: Record<string, string | string[]> = {};\n  const searchParams = new URL(url).searchParams;\n\n  for (const [key, value] of searchParams.entries()) {\n    const existing = query[key];\n    if (existing) {\n      query[key] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n    } else {\n      query[key] = value;\n    }\n  }\n\n  return query;\n}\n\n/**\n * Parse headers from Request\n */\nfunction parseHeaders(request: Request): Record<string, string> {\n  const headers: Record<string, string> = {};\n  request.headers.forEach((value, key) => {\n    headers[key] = value;\n  });\n  return headers;\n}\n\n/**\n * Create a Next.js route handler with auto-initialization and service injection\n *\n * @example Basic usage\n * ```typescript\n * // app/api/users/route.ts\n * import { createHandler } from '@plyaz/core/adapters';\n *\n * export const GET = createHandler(async ({ db }) => {\n *   const users = await db.list('users');\n *   return { users };\n * });\n * ```\n *\n * @example With params and custom status\n * ```typescript\n * // app/api/users/[id]/route.ts\n * export const GET = createHandler(async ({ db, params }) => {\n *   const user = await db.get('users', params.id);\n *   if (!user) {\n *     return { error: 'Not found', status: 404 };\n *   }\n *   return { user };\n * });\n * ```\n *\n * @example With body parsing\n * ```typescript\n * export const POST = createHandler(async ({ db, body }) => {\n *   const user = await db.create('users', body);\n *   return { user, status: 201 };\n * });\n * ```\n *\n * @example Return raw Response\n * ```typescript\n * export const GET = createHandler(async ({ db }) => {\n *   const data = await db.list('files');\n *   return new Response(JSON.stringify(data), {\n *     headers: { 'Content-Type': 'application/json' },\n *   });\n * });\n * ```\n */\n/** Parse request body for mutation methods */\nasync function parseRequestBody(request: Request): Promise<unknown> {\n  if (!['POST', 'PUT', 'PATCH'].includes(request.method)) {\n    return undefined;\n  }\n  try {\n    return await request.json();\n  } catch {\n    return undefined;\n  }\n}\n\n/** Build handler context from request */\nasync function buildHandlerContext(\n  request: Request,\n  context?: { params?: Record<string, string> }\n): Promise<CoreNextJsHandlerContext> {\n  return {\n    db: Core.db,\n    params: context?.params ?? {},\n    query: parseQuery(request.url),\n    body: await parseRequestBody(request),\n    headers: parseHeaders(request),\n    request,\n  };\n}\n\n/** Create JSON response from handler result */\nfunction createJsonResponse(result: Response | CoreNextJsHandlerResult): Response {\n  if (result instanceof Response) {\n    return result;\n  }\n\n  const { status = 200, headers: resultHeaders, ...responseBody } = result;\n  return new Response(JSON.stringify(responseBody), {\n    status,\n    headers: { 'Content-Type': 'application/json', ...resultHeaders },\n  });\n}\n\n/** Create error response */\nfunction createErrorResponse(error: unknown): Response {\n  console.error('[Next.js Handler Error]', error);\n  const message = error instanceof Error ? error.message : 'Internal Server Error';\n  const status = (error as { status?: number }).status ?? HTTP_STATUS.INTERNAL_SERVER_ERROR;\n\n  return new Response(JSON.stringify({ error: message }), {\n    status,\n    headers: { 'Content-Type': 'application/json' },\n  });\n}\n\nexport function createHandler(\n  handler: CoreNextJsHandler,\n  options?: CoreNextJsHandlerOptions\n): (request: Request, context?: { params?: Record<string, string> }) => Promise<Response> {\n  return async (request: Request, context?: { params?: Record<string, string> }) => {\n    try {\n      if (!Core.isInitialized) {\n        await Core.initialize(options?.coreOptions ?? {});\n      }\n\n      const ctx = await buildHandlerContext(request, context);\n      const result = await handler(ctx);\n      return createJsonResponse(result);\n    } catch (error) {\n      return createErrorResponse(error);\n    }\n  };\n}\n\n// Re-export for convenience\nexport { createHandler as nextHandler };\n","/**\n * NestJS Framework Adapter\n *\n * Provides CoreModule for NestJS dependency injection.\n * Initializes core services (db, env) for use across NestJS modules.\n */\n\nimport type { DynamicModule } from '@nestjs/common';\nimport { DbService } from '../services/DbService';\nimport type { CoreDbServiceConfig } from '../services/DbService';\nimport type { CoreNestJsModuleOptions, CoreNestJsModuleAsyncOptions } from '@plyaz/types/core';\nimport { config as loadDotenv } from 'dotenv';\n\n/**\n * Core module options for NestJS\n * Extended with specific DbServiceConfig type\n */\ninterface CoreModuleOptions extends Omit<CoreNestJsModuleOptions, 'db'> {\n  /** Database configuration */\n  db?: CoreDbServiceConfig;\n}\n\n/**\n * Async options for CoreModule\n * Extended with specific CoreModuleOptions type\n */\ninterface CoreModuleAsyncOptions extends Omit<CoreNestJsModuleAsyncOptions, 'useFactory'> {\n  useFactory: (...args: unknown[]) => CoreModuleOptions | Promise<CoreModuleOptions>;\n}\n\n/**\n * Injection tokens for Core services\n */\nexport const CORE_DB_SERVICE = 'CORE_DB_SERVICE';\nexport const CORE_ENV = 'CORE_ENV';\nexport const CORE_OPTIONS = 'CORE_OPTIONS';\n\n/**\n * CoreModule for NestJS\n *\n * Provides Core services (DbService, etc.) via NestJS dependency injection.\n * Import additional modules (FeatureFlagModule, etc.) separately.\n *\n * @example\n * ```typescript\n * import { Module } from '@nestjs/common';\n * import { CoreModule } from '@plyaz/core/adapters';\n * import { FeatureFlagModule } from '@plyaz/core/backend/featureFlags';\n *\n * @Module({\n *   imports: [\n *     CoreModule.forRoot({ envPath: '.env' }),\n *     FeatureFlagModule.forRoot({ provider: 'database' }), // Auto-receives DbService\n *   ],\n * })\n * export class AppModule {}\n * ```\n *\n * @example Async configuration\n * ```typescript\n * CoreModule.forRootAsync({\n *   imports: [ConfigModule],\n *   inject: [ConfigService],\n *   useFactory: (config: ConfigService) => ({\n *     db: {\n *       adapter: 'drizzle',\n *       drizzle: {\n *         connectionString: config.get('DATABASE_URL'),\n *       },\n *     },\n *   }),\n * })\n * ```\n */\nexport const CoreModule = {\n  /**\n   * Register CoreModule with static configuration\n   */\n  forRoot(options: CoreModuleOptions = {}): DynamicModule {\n    const isGlobal = options.isGlobal ?? true;\n\n    return {\n      module: CoreModuleClass,\n      global: isGlobal,\n      providers: [\n        {\n          provide: CORE_OPTIONS,\n          useValue: options,\n        },\n        {\n          provide: CORE_ENV,\n          useFactory: () => {\n            if (options.envPath) {\n              loadDotenv({ path: options.envPath });\n            }\n            return process.env;\n          },\n        },\n        {\n          provide: CORE_DB_SERVICE,\n          useFactory: async () => {\n            if (options.db) {\n              return DbService.initialize(options.db);\n            }\n            return null;\n          },\n        },\n        {\n          provide: DbService,\n          useFactory: () => DbService.getInstance(),\n        },\n      ],\n      exports: [CORE_DB_SERVICE, CORE_ENV, CORE_OPTIONS, DbService],\n    };\n  },\n\n  /**\n   * Register CoreModule with async configuration\n   */\n  forRootAsync(options: CoreModuleAsyncOptions): DynamicModule {\n    const isGlobal = options.isGlobal ?? true;\n\n    return {\n      module: CoreModuleClass,\n      global: isGlobal,\n      imports: options.imports ?? [],\n      providers: [\n        {\n          provide: CORE_OPTIONS,\n          inject: options.inject ?? [],\n          useFactory: options.useFactory,\n        },\n        {\n          provide: CORE_ENV,\n          inject: [CORE_OPTIONS],\n          useFactory: (coreOptions: CoreModuleOptions) => {\n            if (coreOptions.envPath) {\n              loadDotenv({ path: coreOptions.envPath });\n            }\n            return process.env;\n          },\n        },\n        {\n          provide: CORE_DB_SERVICE,\n          inject: [CORE_OPTIONS],\n          useFactory: async (coreOptions: CoreModuleOptions) => {\n            if (coreOptions.db) {\n              return DbService.initialize(coreOptions.db);\n            }\n            return null;\n          },\n        },\n        {\n          provide: DbService,\n          useFactory: () => DbService.getInstance(),\n        },\n      ],\n      exports: [CORE_DB_SERVICE, CORE_ENV, CORE_OPTIONS, DbService],\n    };\n  },\n};\n\n/**\n * Empty class for module reference\n * NestJS requires a class for the module property\n */\nclass CoreModuleClass {}\n"]}