{"version":3,"sources":["../src/base/cache/strategies/redis.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/events/CoreEventManager.ts","../src/services/ApiClientService.ts","../src/base/observability/BaseAdapter.ts","../src/base/observability/LoggerAdapter.ts","../src/base/observability/ObservabilityService.ts","../src/config/dependencies.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/StreamServer.ts","../src/events/streaming/StreamRegistry.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/base/cache/strategies/memory.ts","../src/base/cache/CacheKeyBuilder.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/featureFlags/service.ts","../src/utils/featureFlags/context.ts","../src/utils/featureFlags/conditions.ts","../src/engine/featureFlags/engine.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/services/DbService.ts","../src/models/featureFlags/FeatureFlagRepository.ts","../src/domain/featureFlags/providers/database.ts","../src/domain/featureFlags/providers/factory.ts","../src/domain/featureFlags/module.ts","../src/domain/featureFlags/FrontendFeatureFlagDomainService.ts","../src/domain/featureFlags/mappers/FeatureFlagMapper.ts","../src/domain/featureFlags/index.ts","../src/models/example/ExampleRepository.ts","../src/domain/example/mappers/ExampleMapper.ts","../src/domain/example/validators/ExampleValidator.ts","../src/domain/example/BackendExampleDomainService.ts","../src/domain/example/FrontendExampleDomainService.ts","../src/utils/files.ts","../src/utils/hmr-singleton.ts","../src/services/CacheService.ts","../src/models/files/FilesRepository.ts","../src/domain/files/mappers/FilesMapper.ts","../src/domain/files/validators/FilesValidator.ts","../src/domain/files/BackendFilesDomainService.ts","../src/services/StorageService.ts","../src/services/NotificationService.ts","../src/version.ts","../src/frameworks/base/index.ts","../src/frameworks/base/route-handler.ts","../src/frameworks/nextjs/index.ts","../src/frameworks/nextjs/config.ts","../src/frameworks/nextjs/route-factory.ts","../src/frameworks/nextjs/helpers.ts","../src/frameworks/express/index.ts","../src/frameworks/express/route-factory.ts","../src/frameworks/express/helpers.ts","../src/backend/index.ts","../src/backend/example/example.controller.ts","../src/backend/example/example.module.ts","../src/domain/files/FrontendFilesDomainService.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/models/notifications/NotificationsRepository.ts","../src/models/notifications/NotificationPreferencesRepository.ts","../src/models/shortUrls/ShortUrlRepository.ts","../src/domain/notifications/mappers/NotificationsMapper.ts","../src/domain/notifications/validators/NotificationsValidator.ts","../src/domain/notifications/BackendNotificationsDomainService.ts","../src/domain/notifications/FrontendNotificationsDomainService.ts","../src/backend/notifications/notifications.controller.ts","../src/backend/notifications/notifications.module.ts","../src/backend/featureFlags/FeatureFlagDomainService.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/frontend/index.ts","../src/frontend/components/InitializationError.tsx","../src/frontend/components/InitializationLoading.tsx","../src/frontend/providers/ApiProvider.tsx","../src/events/streaming/hooks/useStreamConnection.ts","../src/frontend/hooks/useStreamManager.ts","../src/frontend/providers/PlyazProvider.tsx","../src/frontend/files/useFiles.ts","../src/frontend/hooks/files/useAllFileProgress.ts","../src/frontend/hooks/files/useHasActiveFileOperations.ts","../src/frontend/hooks/files/useFileUpload.ts","../src/frontend/hooks/files/useFileDownload.ts","../src/frontend/hooks/files/useFile.ts","../src/frontend/hooks/files/useFileDelete.ts","../src/frontend/notifications/useNotifications.ts","../src/frontend/store/service-accessors.ts","../src/frontend/store/feature-flags.ts"],"names":["CorePackageError","ERROR_CODES","TIME_CONSTANTS","resolve","MATH_CONSTANTS","path","FEATURE_FLAG_PROVIDERS","PackageLogger","logger","DbService","CacheService","StorageService","NotificationService","DEFAULT_STALE_MINUTES","DEFAULT_MAX_STALE_AGE","HTTP_STATUS","StreamPackageError","STREAM_ERROR_CODES","STREAMING_DEFAULTS","BACKEND_RUNTIMES","FRONTEND_RUNTIMES","state","ServerErrorMiddleware","ERROR_CATEGORY","CORE_EVENTS","setDefaultApiClient","STORE_KEYS","BaseError","OBSERVABILITY_METRICS","uploadFileFetcher","uploadFilesFetcher","generateDocumentFetcher","defaultConfig","RedisCacheStrategy","API_ERROR_CODES","readFile","writeFile","access","mkdir","apiEvaluateAllFlags","apiCreateFlag","apiUpdateFlag","apiDeleteFlag","apiFetchRules","DatabasePackageError","DATABASE_ERROR_CODES","FEATURE_FLAG_CACHE_TTL_DEFAULT","createApiClient","FEATURES","BaseRepository","row","SERVICE_KEYS","CoreLogger","DEFAULT_LIMIT","SYSTEM_USER_ID","_instance","StorageServiceImpl","NotificationServiceImpl","require","fileURLToPath","dirname","join","exports","extractBearerToken","extractHeader","extractHeaders","extractJsonBody","extractQueryParams","extractRouteParams","safeExtractJsonBody","parseQueryParams","parseHeaders","getStatusForMethod","getInjectedServices","createServiceGetter","emptyServices","SuccessResponseStandard","BEARER_PREFIX_LENGTH","FILE_CATEGORY","ENTITY_TYPE","Get","ApiOperation","Post","HttpCode","HttpStatus","ApiBody","ApiResponse","Body","ApiParam","Param","Delete","ApiTags","Controller","Inject","Module","TABLE_NAME","PAGINATION_DEFAULTS","PAGE_SIZES","NotificationPackageError","NOTIFICATION_ERROR_CODES","Patch","FEATURE_FLAG_METADATA","Injectable","ValidationError","NODE_ENVIRONMENTS","CORE_ERROR_CODES","Headers","tap","jsx","Fragment","error","jsxs","useState","useEffect","DEFAULT_MAX_RECONNECT_ATTEMPTS","useRef","useCallback","ApiProvider","useUploadProgress","useMemo","useGenerateProgress","useHasActiveUploads","useHasActiveDownloads","useDownloadProgress","abortRequest","getSignedUrl","deleteFile"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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 * 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 * 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 * 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","// 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 * 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 * 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 * 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","/* 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 * 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 * 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 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 * 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 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 * 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 * 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 * 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 Domain Service (Frontend)\n *\n * Frontend-specific domain service for feature flag management.\n * Implements FeatureFlagServiceInterface for clean dependency injection.\n *\n * @example\n * ```tsx\n * // With ServiceRegistry (auto-initialization)\n * await ServiceRegistry.initialize({\n *   services: [{ service: FeatureFlagDomainService, config: { cacheTtl: 300 } }],\n * });\n * const service = ServiceRegistry.get<FeatureFlagServiceInterface>('featureFlags');\n *\n * // Manual creation with provider\n * const service = new FeatureFlagDomainService({\n *   provider,\n *   store: useFeatureFlagStore.getState(),\n * });\n * await service.fetchAndSyncAll({ userId: user.id });\n * ```\n */\n\nimport type {\n  FeatureFlag,\n  FeatureFlagKey,\n  FeatureFlagRule,\n  FeatureFlagContext,\n  FeatureFlagValue,\n  FeatureFlagEvaluation,\n  CreateFlagRequest,\n} from '@plyaz/types';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport { createApiClient } from '@plyaz/api/frontend';\nimport { ApiFeatureFlagProvider } from '../../domain/featureFlags/providers/api';\nimport { BaseFrontendDomainService } from '../base/BaseFrontendDomainService';\nimport { SERVICE_KEYS } from '@plyaz/types/core';\nimport type {\n  CoreFrontendFeatureFlagEventType,\n  CoreFeatureFlagStore,\n  CoreFeatureFlagServiceConfig,\n  CoreFeatureFlagServiceInitConfig,\n  CoreFeatureFlagServiceInterface,\n  CoreServiceCreateOptions,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Constants\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Default cache TTL in seconds (5 minutes) */\nconst DEFAULT_CACHE_TTL_SECONDS = 300;\n/** Default refresh interval in milliseconds (1 minute) */\nconst DEFAULT_REFRESH_INTERVAL_MS = 60000;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Implementation\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Feature Flag Domain Service (Frontend)\n *\n * Frontend-specific domain service for feature flag management.\n * Implements FeatureFlagServiceInterface for clean dependency injection.\n *\n * @example\n * ```tsx\n * // With ServiceRegistry (auto-initialization)\n * await ServiceRegistry.initialize({\n *   services: [{ service: FeatureFlagDomainService, config: { cacheTtl: 300 } }],\n * });\n * const service = ServiceRegistry.get<FeatureFlagServiceInterface>('featureFlags');\n *\n * // Manual creation with provider\n * const service = new FeatureFlagDomainService({\n *   provider,\n *   store: useFeatureFlagStore.getState(),\n * });\n * await service.fetchAndSyncAll({ userId: user.id });\n * ```\n */\nexport class FrontendFeatureFlagDomainService\n  extends BaseFrontendDomainService<\n    CoreFeatureFlagServiceConfig,\n    CoreFeatureFlagStore,\n    Record<string, FeatureFlagValue>\n  >\n  implements CoreFeatureFlagServiceInterface\n{\n  // ─────────────────────────────────────────────────────────────────────────\n  // Static: ServiceRegistry Interface\n  // ─────────────────────────────────────────────────────────────────────────\n\n  static readonly serviceKey = SERVICE_KEYS.FEATURE_FLAGS;\n\n  /** Build API client for feature flags */\n  private static async buildApiClient(\n    config: CoreFeatureFlagServiceInitConfig,\n    options?: CoreServiceCreateOptions\n  ): Promise<ReturnType<typeof createApiClient>> {\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\n    const apiBasePath =\n      // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n      config.apiBasePath || options?.apiClient?.options?.baseURL || '/feature-flags';\n    return createApiClient({ ...options?.apiClient?.options, baseURL: apiBasePath });\n  }\n\n  /** Build feature flag provider */\n  private static buildProvider(\n    config: CoreFeatureFlagServiceInitConfig,\n    apiClient: Awaited<ReturnType<typeof createApiClient>>\n  ): ApiFeatureFlagProvider<FeatureFlagKey> {\n    return new ApiFeatureFlagProvider<FeatureFlagKey>(\n      {\n        provider: 'api',\n        apiClient,\n        isCacheEnabled: true,\n        cacheTtl: config.cacheTtl ?? DEFAULT_CACHE_TTL_SECONDS,\n        context: config.defaultContext,\n        refreshInterval: config.refreshInterval ?? DEFAULT_REFRESH_INTERVAL_MS,\n        shouldFallbackToDefaults: config.shouldFallbackToDefaults ?? true,\n      },\n      config.featureKeys ?? {}\n    );\n  }\n\n  /**\n   * Factory method for ServiceRegistry auto-initialization.\n   */\n  static async create(\n    config: CoreFeatureFlagServiceInitConfig,\n    options?: CoreServiceCreateOptions\n  ): Promise<FrontendFeatureFlagDomainService> {\n    const apiClient = await FrontendFeatureFlagDomainService.buildApiClient(config, options);\n    const provider = FrontendFeatureFlagDomainService.buildProvider(config, apiClient);\n    await provider.initialize();\n\n    return new FrontendFeatureFlagDomainService({\n      enabled: config.enabled ?? true,\n      provider,\n      defaultContext: config.defaultContext,\n      defaults: config.defaults,\n      store: config.store,\n      readStores: config.readStores,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Instance\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Event prefix for all events emitted by this service\n   * Required by BaseFrontendDomainService\n   */\n  protected eventPrefix = 'featureFlag';\n\n  private readonly provider: CoreFeatureFlagServiceConfig['provider'];\n\n  constructor(config: CoreFeatureFlagServiceConfig) {\n    super({\n      serviceName: 'FeatureFlagDomainService',\n      supportedRuntimes: ['frontend', 'universal'],\n      serviceConfig: { enabled: true, defaults: {}, ...config },\n    });\n\n    this.provider = config.provider;\n    this._initialized = true;\n\n    this.logInfo('Service initialized', { storeCount: this.connectedStoreCount });\n    CoreEventManager.emit('featureFlag:provider:initialized', { providerType: 'api' });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // IFeatureFlagService: Lifecycle\n  // ─────────────────────────────────────────────────────────────────────────\n\n  isAvailable(): boolean {\n    return this.isServiceEnabled && this.provider !== null;\n  }\n\n  dispose(): void {\n    this.provider?.dispose();\n    CoreEventManager.emit('featureFlag:provider:disposed', {});\n    this.logInfo('Service disposed');\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // IFeatureFlagService: Provider Operations\n  // ─────────────────────────────────────────────────────────────────────────\n\n  async refresh(): Promise<void> {\n    this.assertReady();\n    this.setStoresLoading(true);\n\n    try {\n      await this.provider.refresh();\n      CoreEventManager.emit('featureFlag:provider:refreshed', {});\n\n      if (this.hasConnectedStores) {\n        const evaluations = await this.provider.getAllFlags(this.config.defaultContext);\n        this.syncToStores(this.toValues(evaluations));\n      }\n\n      this.logDebug('Provider refreshed and synced');\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // IFeatureFlagService: Evaluation\n  // ─────────────────────────────────────────────────────────────────────────\n\n  async evaluate<TKey extends string = string>(\n    key: TKey,\n    context?: FeatureFlagContext\n  ): Promise<FeatureFlagEvaluation<TKey>> {\n    this.assertReady();\n    const ctx = context ?? this.config.defaultContext;\n\n    CoreEventManager.emit('featureFlag:evaluating', { key, context: ctx });\n\n    try {\n      const result = await this.provider.getFlag(key, ctx);\n      CoreEventManager.emit('featureFlag:evaluated', { key, result });\n\n      if (this.hasConnectedStores) {\n        this.syncToStores({ [key]: result.value });\n      }\n\n      return result as FeatureFlagEvaluation<TKey>;\n    } catch (error) {\n      CoreEventManager.emit('featureFlag:evaluate:error', { key, error });\n      throw error;\n    }\n  }\n\n  async isEnabled<TKey extends string = string>(\n    key: TKey,\n    context?: FeatureFlagContext\n  ): Promise<boolean> {\n    this.assertReady();\n    return this.provider.isEnabled(key, context ?? this.config.defaultContext);\n  }\n\n  async getValue<T = FeatureFlagValue, TKey extends string = string>(\n    key: TKey,\n    context?: FeatureFlagContext\n  ): Promise<T> {\n    this.assertReady();\n    return this.provider.getValue<T>(key, context ?? this.config.defaultContext);\n  }\n\n  async evaluateAll<TKey extends string = string>(\n    context?: FeatureFlagContext\n  ): Promise<Record<string, FeatureFlagEvaluation<TKey>>> {\n    this.assertReady();\n    this.setStoresLoading(true);\n\n    try {\n      const result = await this.provider.getAllFlags(context ?? this.config.defaultContext);\n\n      if (this.hasConnectedStores) {\n        this.syncToStores(this.toValues(result));\n      }\n\n      return result as Record<string, FeatureFlagEvaluation<TKey>>;\n    } catch (error) {\n      this.logError('Failed to evaluate all flags', { error });\n      throw error;\n    } finally {\n      this.setStoresLoading(false);\n    }\n  }\n\n  async fetchAndSyncAll(context?: FeatureFlagContext): Promise<Record<string, FeatureFlagValue>> {\n    const evaluations = await this.evaluateAll(context);\n    return this.toValues(evaluations);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // IFeatureFlagService: CRUD (renamed to avoid base class conflicts)\n  // ─────────────────────────────────────────────────────────────────────────\n\n  async createFlag<TKey extends string = string>(\n    data: CreateFlagRequest<TKey>\n  ): Promise<FeatureFlag<TKey>> {\n    this.assertReady();\n    CoreEventManager.emit('featureFlag:creating', { data });\n\n    try {\n      const flag = await this.provider.createFlag(data);\n      CoreEventManager.emit('featureFlag:created', { flag });\n      this.logInfo('Flag created', { key: data.key });\n\n      if (this.hasConnectedStores) {\n        this.syncToStores({ [data.key]: flag.value });\n      }\n\n      return flag as FeatureFlag<TKey>;\n    } catch (error) {\n      CoreEventManager.emit('featureFlag:create:error', { error, data });\n      throw error;\n    }\n  }\n\n  async updateFlag<TKey extends string = string>(\n    key: TKey,\n    data: Partial<CreateFlagRequest<TKey>>\n  ): Promise<FeatureFlag<TKey>> {\n    this.assertReady();\n    CoreEventManager.emit('featureFlag:updating', { key, data });\n\n    try {\n      const flag = await this.provider.updateFlag(key, data);\n      CoreEventManager.emit('featureFlag:updated', { flag });\n      this.logInfo('Flag updated', { key });\n\n      if (this.hasConnectedStores) {\n        this.syncToStores({ [key]: flag.value });\n      }\n\n      return flag as FeatureFlag<TKey>;\n    } catch (error) {\n      CoreEventManager.emit('featureFlag:update:error', { error, key });\n      throw error;\n    }\n  }\n\n  async deleteFlag<TKey extends string = string>(key: TKey): Promise<void> {\n    this.assertReady();\n    CoreEventManager.emit('featureFlag:deleting', { key });\n\n    try {\n      await this.provider.deleteFlag(key);\n      CoreEventManager.emit('featureFlag:deleted', { key });\n      this.logInfo('Flag deleted', { key });\n\n      // Refresh all to remove deleted flag from stores\n      if (this.hasConnectedStores) {\n        const evaluations = await this.provider.getAllFlags(this.config.defaultContext);\n        this.syncToStores(this.toValues(evaluations), true);\n      }\n    } catch (error) {\n      CoreEventManager.emit('featureFlag:delete:error', { error, key });\n      throw error;\n    }\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // IFeatureFlagService: Rules\n  // ─────────────────────────────────────────────────────────────────────────\n\n  async getRules<TKey extends string = string>(key: TKey): Promise<FeatureFlagRule<TKey>[]> {\n    this.assertReady();\n    return this.provider.getRules(key) as Promise<FeatureFlagRule<TKey>[]>;\n  }\n\n  async getAllRules<TKey extends string = string>(): Promise<FeatureFlagRule<TKey>[]> {\n    this.assertReady();\n    return this.provider.getAllRules() as Promise<FeatureFlagRule<TKey>[]>;\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // IFeatureFlagService: Overrides\n  // ─────────────────────────────────────────────────────────────────────────\n\n  setOverride<TKey extends string = string>(key: TKey, value: FeatureFlagValue): void {\n    this.assertReady();\n    CoreEventManager.emit('featureFlag:override:setting', { key, value });\n    this.provider.setOverride(key, value);\n    CoreEventManager.emit('featureFlag:override:set', { key, value });\n  }\n\n  removeOverride<TKey extends string = string>(key: TKey): void {\n    this.assertReady();\n    CoreEventManager.emit('featureFlag:override:removing', { key });\n    this.provider.removeOverride(key);\n    CoreEventManager.emit('featureFlag:override:removed', { key });\n  }\n\n  clearOverrides(): void {\n    this.assertReady();\n    this.provider.clearOverrides();\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // IFeatureFlagService: Subscription\n  // ─────────────────────────────────────────────────────────────────────────\n\n  subscribe(callback: () => void): () => void {\n    this.assertReady();\n    return this.provider.subscribe(callback);\n  }\n\n  on(event: CoreFrontendFeatureFlagEventType, handler: (data: unknown) => void): () => void {\n    return CoreEventManager.on(event, handler);\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Protected: Store Sync Override\n  // ─────────────────────────────────────────────────────────────────────────\n\n  protected override syncToStores(flags: Record<string, FeatureFlagValue>, replace = false): void {\n    if (!this.primaryStore) return;\n\n    try {\n      if (!replace && this.primaryStore.updateFlags) {\n        this.primaryStore.updateFlags(flags);\n      } else {\n        this.primaryStore.setFlags(flags);\n      }\n    } catch (error) {\n      this.logError('Store sync failed', { error });\n    }\n\n    this.logDebug('Synced to stores', {\n      count: this.connectedStoreCount,\n      flags: Object.keys(flags).length,\n    });\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Private: Helpers\n  // ─────────────────────────────────────────────────────────────────────────\n\n  private toValues(\n    evaluations: Record<string, FeatureFlagEvaluation<string>>\n  ): Record<string, FeatureFlagValue> {\n    const values: Record<string, FeatureFlagValue> = {};\n    for (const [key, evaluation] of Object.entries(evaluations)) {\n      values[key] = evaluation.value;\n    }\n    return values;\n  }\n}\n","/**\n * Feature Flag Mapper\n *\n * Handles transformation between different feature flag data representations:\n * - API Response (DTO) → Domain Entity\n * - Domain Entity → Store State\n * - Domain → API Request (DTO)\n *\n * @fileoverview Feature flag data mapper\n * @version 1.0.0\n */\n\nimport { BaseMapper } from '../../base/BaseMapper';\nimport { getField, parseDateSafe } from '../../../utils/mapperUtils';\nimport type {\n  FeatureFlag,\n  FeatureFlagValue,\n  FeatureFlagRule,\n  FeatureFlagEvaluation,\n  CreateFlagRequest,\n  FetchFeatureFlagDataResponse,\n  FeatureFlagStoreState,\n  FeatureFlagStoreMetadata,\n  // DTO types\n  FeatureFlagResponseDTO,\n  FeatureFlagRuleDTO,\n  FeatureFlagEvaluationDTO,\n  FetchAllFlagsResponseDTO,\n} from '@plyaz/types/features';\n\n// Re-export DTO types for backwards compatibility\nexport type {\n  FeatureFlagResponseDTO,\n  FeatureFlagRuleDTO,\n  FeatureFlagEvaluationDTO,\n  FetchAllFlagsResponseDTO,\n} from '@plyaz/types/features';\n\n/**\n * Feature Flag Mapper\n *\n * Transforms feature flag data between API, domain, and store representations.\n */\nexport class FeatureFlagMapper extends BaseMapper<\n  FeatureFlag<string>,\n  FeatureFlagResponseDTO,\n  unknown,\n  unknown,\n  Partial<unknown>,\n  unknown,\n  Partial<FeatureFlagStoreState>\n> {\n  /**\n   * Transform API response DTO to domain entity\n   * Handles both snake_case (DTO) and camelCase (Entity) input formats\n   */\n  toDomain(dto: FeatureFlagResponseDTO | FeatureFlag<string>): FeatureFlag<string> {\n    const data = dto as unknown as Record<string, unknown>;\n\n    return {\n      key: dto.key,\n      value: dto.value,\n      name: dto.name,\n      description: dto.description ?? '',\n      isEnabled: getField<boolean>(data, 'is_enabled', 'isEnabled') ?? false,\n      type: dto.type,\n      environment: dto.environment,\n      rolloutPercentage: getField<number>(data, 'rollout_percentage', 'rolloutPercentage'),\n      metadata: dto.metadata,\n      tags: dto.tags,\n      createdAt: parseDateSafe(getField(data, 'created_at', 'createdAt')) ?? new Date(),\n      updatedAt: parseDateSafe(getField(data, 'updated_at', 'updatedAt')) ?? new Date(),\n      createdBy: getField<string>(data, 'created_by', 'createdBy') ?? '',\n      updatedBy: getField<string>(data, 'updated_by', 'updatedBy') ?? '',\n    };\n  }\n\n  /**\n   * Transform domain entity to API request DTO\n   */\n  toCreateDTO(entity: Partial<FeatureFlag<string>>): CreateFlagRequest<string> {\n    return {\n      key: entity.key!,\n      value: entity.value!,\n      name: entity.name!,\n      description: entity.description,\n      isEnabled: entity.isEnabled ?? true,\n      environment: entity.environment,\n      rolloutPercentage: entity.rolloutPercentage,\n    };\n  }\n\n  /**\n   * Transform domain entity to patch request DTO\n   */\n  toPatchDTO(entity: Partial<FeatureFlag<string>>): Partial<CreateFlagRequest<string>> {\n    const dto: Partial<CreateFlagRequest<string>> = {};\n\n    if (entity.value !== undefined) dto.value = entity.value;\n    if (entity.name !== undefined) dto.name = entity.name;\n    if (entity.description !== undefined) dto.description = entity.description;\n    if (entity.isEnabled !== undefined) dto.isEnabled = entity.isEnabled;\n    if (entity.environment !== undefined) dto.environment = entity.environment;\n    if (entity.rolloutPercentage !== undefined) dto.rolloutPercentage = entity.rolloutPercentage;\n\n    return dto;\n  }\n\n  /**\n   * Transform API rule DTO to domain rule\n   * Handles both snake_case (DTO) and camelCase (Entity) input formats\n   */\n  toRuleDomain(dto: FeatureFlagRuleDTO | FeatureFlagRule<string>): FeatureFlagRule<string> {\n    const data = dto as unknown as Record<string, unknown>;\n\n    return {\n      id: dto.id,\n      name: dto.name,\n      flagKey: getField<string>(data, 'flag_key', 'flagKey') ?? '',\n      conditions: dto.conditions.map(c => ({\n        field: c.field as FeatureFlagRule<string>['conditions'][0]['field'],\n        operator: c.operator as FeatureFlagRule<string>['conditions'][0]['operator'],\n        value: c.value,\n      })),\n      value: dto.value,\n      priority: dto.priority,\n      isEnabled: getField<boolean>(data, 'is_enabled', 'isEnabled') ?? false,\n      rolloutPercentage: getField<number>(data, 'rollout_percentage', 'rolloutPercentage'),\n      metadata: dto.metadata,\n    };\n  }\n\n  /**\n   * Transform API evaluation DTO to domain evaluation\n   * Handles both snake_case (DTO) and camelCase (Entity) input formats\n   */\n  toEvaluationDomain(\n    dto: FeatureFlagEvaluationDTO | FeatureFlagEvaluation<string>\n  ): FeatureFlagEvaluation<string> {\n    const data = dto as unknown as Record<string, unknown>;\n\n    return {\n      flagKey: getField<string>(data, 'key', 'flagKey') ?? '',\n      value: dto.value,\n      isEnabled: getField<boolean>(data, 'is_enabled', 'isEnabled') ?? false,\n      reason: dto.reason,\n      source: dto.source,\n      matchedRuleId: getField<string>(data, 'matched_rule_id', 'matchedRuleId'),\n      evaluatedAt: parseDateSafe(getField(data, 'evaluated_at', 'evaluatedAt')) ?? new Date(),\n    };\n  }\n\n  /**\n   * Transform API fetch response to domain response\n   */\n  toFetchDataResponse(dto: FetchAllFlagsResponseDTO): FetchFeatureFlagDataResponse<string> {\n    return {\n      flags: dto.flags.map(f => this.toDomain(f)),\n      rules: dto.rules?.map(r => this.toRuleDomain(r)) ?? [],\n    };\n  }\n\n  /**\n   * Transform single domain flag to partial store state format\n   * Returns partial state that can be merged with existing store state\n   */\n  override toStoreState(flag: FeatureFlag<string>): Partial<FeatureFlagStoreState> {\n    return {\n      flags: { [flag.key]: flag.isEnabled ? flag.value : false },\n      metadata: {\n        [flag.key]: {\n          updatedAt: flag.updatedAt,\n          source: 'api',\n        },\n      },\n      lastFetched: Date.now(),\n    };\n  }\n\n  /**\n   * Transform domain flags array to store state format\n   */\n  override toStoreStateList(flags: FeatureFlag<string>[]): Partial<FeatureFlagStoreState> {\n    const flagsMap: Record<string, FeatureFlagValue> = {};\n    const metadata: Record<string, FeatureFlagStoreMetadata> = {};\n\n    for (const flag of flags) {\n      // Store the value if enabled, false otherwise\n      flagsMap[flag.key] = flag.isEnabled ? flag.value : false;\n\n      // Store metadata\n      metadata[flag.key] = {\n        updatedAt: flag.updatedAt,\n        source: 'api',\n      };\n    }\n\n    return {\n      flags: flagsMap,\n      metadata,\n      lastFetched: Date.now(),\n    };\n  }\n\n  /**\n   * Transform evaluation results to store flags format\n   */\n  evaluationsToStoreFlags(\n    evaluations: Record<string, FeatureFlagEvaluation<string>>\n  ): Record<string, FeatureFlagValue> {\n    const flags: Record<string, FeatureFlagValue> = {};\n\n    for (const [key, evaluation] of Object.entries(evaluations)) {\n      flags[key] = evaluation.isEnabled ? evaluation.value : false;\n    }\n\n    return flags;\n  }\n\n  /**\n   * Transform simple flags record to domain flags array\n   * (for providers that return simple key-value pairs)\n   */\n  simpleFlagsToDomain(\n    flags: Record<string, FeatureFlagValue>,\n    environment: string = 'production'\n  ): FeatureFlag<string>[] {\n    const now = new Date();\n\n    return Object.entries(flags).map(([key, value]) => ({\n      key,\n      value,\n      name: key,\n      description: '',\n      isEnabled: Boolean(value),\n      type: this.inferType(value),\n      environment,\n      createdAt: now,\n      updatedAt: now,\n      createdBy: 'system',\n      updatedBy: 'system',\n    }));\n  }\n\n  /**\n   * Infer flag type from value\n   */\n  private inferType(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/**\n * Singleton instance for convenience\n */\nexport const featureFlagMapper = new FeatureFlagMapper();\n","/**\n * Feature Flags Domain - Main Exports\n *\n * This module provides the main exports for the feature flags domain logic.\n *\n * @fileoverview Main feature flags domain exports\n * @version 1.0.0\n */\nimport type { FeatureFlagConfig, FeatureFlagOverrides } from '@plyaz/types';\nimport { FeatureFlagServiceFactory } from './providers/factory';\nimport type { FeatureFlagKey } from '../types';\nimport { FEATURES } from '@plyaz/config';\n\n// Service factory (shared between NestJS and direct usage)\nexport { createFeatureFlagService, FEATURE_FLAG_SERVICE } from './module';\n\n// Domain service (main entry point)\nexport { FeatureFlagService } from './service';\n\n// Frontend domain service\nexport { FrontendFeatureFlagDomainService } from './FrontendFeatureFlagDomainService';\n\n// Service factory (creates service with configured provider)\nexport { FeatureFlagServiceFactory } from './providers/factory';\n\n// Provider base class and factory (for advanced use cases)\nexport { FeatureFlagProvider } from './provider';\nexport { FeatureFlagProviderFactory } from './providers/factory';\n\n// Individual providers\nexport { MemoryFeatureFlagProvider } from './providers/memory';\nexport { FileFeatureFlagProvider } from './providers/file';\nexport { RedisFeatureFlagProvider } from './providers/redis';\nexport { ApiFeatureFlagProvider } from './providers/api';\nexport { DatabaseFeatureFlagProvider } from './providers/database';\n\n// Repositories (data access layer for providers)\nexport { FeatureFlagDatabaseRepository } from '@models/featureFlags';\n\n// Mappers\nexport * from './mappers';\n\n/**\n * Default configuration for feature flags.\n * Provides sensible defaults for most use cases.\n */\nexport const DEFAULT_FEATURE_FLAG_CONFIG = {\n  provider: 'memory',\n  isCacheEnabled: true,\n  cacheTtl: 300, // 5 minutes\n  refreshInterval: 0, // No auto-refresh\n  shouldFallbackToDefaults: true,\n  isLoggingEnabled: false,\n} as const satisfies Partial<FeatureFlagConfig<FeatureFlagKey>>;\n\n/**\n * Feature flag system initialization for different environments.\n * Returns a FeatureFlagService instance for all environments.\n */\nexport const FeatureFlagSystem = {\n  /**\n   * Initialize for frontend/client applications.\n   */\n  initializeForFrontend: async (config: Partial<FeatureFlagConfig<FeatureFlagKey>> = {}) => {\n    const finalConfig = {\n      ...DEFAULT_FEATURE_FLAG_CONFIG,\n      ...config,\n    } as FeatureFlagConfig<FeatureFlagKey>;\n    return FeatureFlagServiceFactory.createAndInitialize(finalConfig, FEATURES);\n  },\n\n  /**\n   * Initialize for backend/server applications.\n   */\n  initializeForBackend: async (config: Partial<FeatureFlagConfig<FeatureFlagKey>> = {}) => {\n    const finalConfig = {\n      ...DEFAULT_FEATURE_FLAG_CONFIG,\n      ...config,\n    } as FeatureFlagConfig<FeatureFlagKey>;\n    return FeatureFlagServiceFactory.createAndInitialize(finalConfig, FEATURES);\n  },\n\n  /**\n   * Initialize for testing environments.\n   */\n  initializeForTesting: async (overrides: FeatureFlagOverrides<FeatureFlagKey> = {}) => {\n    const service = await FeatureFlagServiceFactory.createAndInitialize(\n      {\n        ...DEFAULT_FEATURE_FLAG_CONFIG,\n        provider: 'memory',\n        isCacheEnabled: false,\n        isLoggingEnabled: false,\n      },\n      FEATURES\n    );\n\n    // Apply test overrides\n    Object.entries(overrides).forEach(([key, value]) => {\n      service.setOverride(key as FeatureFlagKey, value);\n    });\n\n    return service;\n  },\n} as const;\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 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 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 * 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 * ============================================================================\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 * 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 * 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 * 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 * 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 * 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 * 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 * Base Framework Utilities\n *\n * Framework-agnostic interfaces and utilities for route handling.\n */\n\nexport { getSuccessMessage } from './route-handler';\n\n// Note: Types are NOT re-exported here.\n// Import types directly from '@plyaz/types/core':\n// - RouteContext, RouteHandler, RouteHandlerConfig\n// - MethodHandlerTypes, HandlersTypeMap, HttpMethod\n// - DEFAULT_SUCCESS_MESSAGES\n","/**\n * ============================================================================\n * FRAMEWORK-AGNOSTIC ROUTE HANDLER UTILITIES\n * ============================================================================\n *\n * Utility functions for route handlers.\n * Types are in @plyaz/types/core - import them directly from there.\n */\n\nimport { DEFAULT_SUCCESS_MESSAGES } from '@plyaz/types/core';\n\n/**\n * Get the default success message for an HTTP method\n */\nexport function getSuccessMessage(\n  method: string,\n  customMessage?: string | ((m: string) => string)\n): string {\n  if (typeof customMessage === 'function') {\n    return customMessage(method);\n  }\n  return customMessage ?? DEFAULT_SUCCESS_MESSAGES[method] ?? 'Operation successful';\n}\n","/**\n * Next.js Framework Utilities\n *\n * Helpers and utilities for integrating Plyaz with Next.js applications.\n *\n * @example Config helper\n * ```typescript\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * // In next.config.ts\n * export default withPlyazNextConfig({\n *   experimental: { serverActions: { bodySizeLimit: '100mb' } },\n * });\n * ```\n *\n * @example Route factory\n * ```typescript\n * import { createNextApiRoute } from '@plyaz/core/frameworks/nextjs';\n *\n * // In app/api/users/[id]/route.ts\n * export const { GET, PATCH, DELETE } = createNextApiRoute({\n *   service: 'users',\n *   handlers: {\n *     GET: async (service, { params }) => service.getById(params.id),\n *     PATCH: async (service, { params, body }) => service.update(params.id, body),\n *     DELETE: async (service, { params }) => service.delete(params.id),\n *   },\n * });\n * ```\n */\n\n// Config helpers\nexport {\n  withPlyazNextConfig,\n  plyazServerExternalPackages,\n  plyazWebpackClientFallbacks,\n  plyazWebpackClientAliases,\n} from './config';\n\n// Route factory\nexport { createNextApiRoute } from './route-factory';\n\n// Request helpers\nexport {\n  extractQueryParams,\n  extractJsonBody,\n  safeExtractJsonBody,\n  extractRouteParams,\n  extractHeaders,\n  extractHeader,\n  extractBearerToken,\n} from './helpers';\n","/**\n * ============================================================================\n * NEXT.JS CONFIG HELPERS\n * ============================================================================\n *\n * Helpers for configuring Next.js projects using Plyaz packages.\n * These handle common webpack fallbacks, server external packages, and other\n * configurations needed when using @plyaz/core and related packages.\n *\n * @example\n * ```typescript\n * // next.config.ts\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * export default withPlyazNextConfig({\n *   experimental: {\n *     serverActions: { bodySizeLimit: '100mb' },\n *   },\n * });\n * ```\n */\n\nimport type { NextConfig } from 'next';\nimport type { CorePlyazNextConfigOptions } from '@plyaz/types/core';\n\n/**\n * Packages that should be externalized from the server bundle.\n * These are packages with native dependencies or server-only code.\n */\nexport const plyazServerExternalPackages = [\n  // Plyaz packages with native/server dependencies\n  '@plyaz/core',\n  '@plyaz/storage',\n  '@plyaz/notifications',\n  '@plyaz/db',\n\n  // NestJS (included in @plyaz/core backend)\n  '@nestjs/common',\n  '@nestjs/core',\n  '@nestjs/platform-express',\n  'reflect-metadata',\n\n  // Native/binary packages\n  'playwright',\n  'playwright-core',\n  'puppeteer',\n  'puppeteer-core',\n  'sharp',\n\n  // File handling\n  'file-type',\n  'load-esm',\n\n  // Redis\n  'ioredis',\n] as const;\n\n/**\n * Webpack fallbacks for client-side bundling.\n * These stub out Node.js modules that might leak into the frontend bundle.\n */\nexport const plyazWebpackClientFallbacks = {\n  dns: false,\n  net: false,\n  tls: false,\n  fs: false,\n  child_process: false,\n  async_hooks: false,\n  perf_hooks: false,\n} as const;\n\n/**\n * Packages to alias to false for client-side bundling.\n * These are backend-only packages that should never be in the client bundle.\n */\nexport const plyazWebpackClientAliases = {\n  ioredis: false,\n} as const;\n\n/**\n * Wraps a Next.js config with Plyaz-specific settings.\n *\n * This function adds:\n * - Server external packages for @plyaz/* and native modules\n * - Webpack client fallbacks for Node.js modules\n * - Webpack client aliases for backend-only packages\n *\n * @param config - Your Next.js configuration\n * @param options - Optional Plyaz-specific options\n * @returns The wrapped Next.js configuration\n *\n * @example\n * ```typescript\n * // Basic usage\n * import { withPlyazNextConfig } from '@plyaz/core/frameworks/nextjs';\n *\n * export default withPlyazNextConfig({\n *   experimental: {\n *     serverActions: { bodySizeLimit: '100mb' },\n *   },\n * });\n *\n * // With next-intl or other plugins\n * import createNextIntlPlugin from 'next-intl/plugin';\n *\n * const withNextIntl = createNextIntlPlugin();\n * export default withNextIntl(withPlyazNextConfig({ ... }));\n *\n * // With custom options\n * export default withPlyazNextConfig(\n *   { ... },\n *   {\n *     additionalExternalPackages: ['my-native-package'],\n *     additionalClientFallbacks: { http: false },\n *   }\n * );\n * ```\n */\n// eslint-disable-next-line complexity\nexport function withPlyazNextConfig(\n  config: NextConfig,\n  options: CorePlyazNextConfigOptions = {}\n): NextConfig {\n  const {\n    additionalExternalPackages = [],\n    additionalClientFallbacks = {},\n    additionalClientAliases = {},\n    disableDefaultExternalPackages = false,\n    disableDefaultClientFallbacks = false,\n  } = options;\n\n  // Build server external packages list\n  const serverExternalPackages = [\n    ...(config.serverExternalPackages ?? []),\n    ...(disableDefaultExternalPackages ? [] : plyazServerExternalPackages),\n    ...additionalExternalPackages,\n  ];\n\n  // Build client fallbacks\n  const clientFallbacks = {\n    ...(disableDefaultClientFallbacks ? {} : plyazWebpackClientFallbacks),\n    ...additionalClientFallbacks,\n  };\n\n  // Build client aliases\n  const clientAliases = {\n    ...plyazWebpackClientAliases,\n    ...additionalClientAliases,\n  };\n\n  return {\n    ...config,\n    serverExternalPackages,\n    webpack: (webpackConfig, context) => {\n      // Apply client-side fallbacks and aliases\n      if (!context.isServer) {\n        webpackConfig.resolve = webpackConfig.resolve ?? {};\n        webpackConfig.resolve.fallback = {\n          ...webpackConfig.resolve.fallback,\n          ...clientFallbacks,\n        };\n        webpackConfig.resolve.alias = {\n          ...webpackConfig.resolve.alias,\n          ...clientAliases,\n        };\n      }\n\n      // Call user's webpack config if provided\n      return config.webpack?.(webpackConfig, context) ?? webpackConfig;\n    },\n  };\n}\n","/**\n * ============================================================================\n * NEXT.JS ROUTE FACTORY\n * ============================================================================\n *\n * Factory for creating Next.js App Router API routes with minimal boilerplate.\n * Supports full TypeScript generics for body, params, query, and response types.\n * Provides access to injected Core services (db, storage, notifications, cache).\n *\n * @example Basic usage\n * ```typescript\n * export const { GET, POST } = createNextApiRoute({\n *   service: 'example',\n *   handlers: {\n *     GET: async (service, ctx) => service.getAll(),\n *     POST: async (service, ctx) => service.create(ctx.body),\n *   },\n * });\n * ```\n *\n * @example With full type safety\n * ```typescript\n * interface CreateUserBody { name: string; email: string; }\n * interface UserParams { id: string; }\n *\n * export const { GET, POST } = createNextApiRoute<\n *   UserService,\n *   { GET: { params: UserParams }; POST: { body: CreateUserBody } }\n * >({\n *   service: 'users',\n *   handlers: {\n *     GET: async (service, { params }) => service.getById(params.id), // params.id is typed\n *     POST: async (service, { body }) => service.create(body), // body is CreateUserBody\n *   },\n * });\n * ```\n *\n * @example With injected services\n * ```typescript\n * export const { POST } = createNextApiRoute({\n *   service: 'files',\n *   handlers: {\n *     POST: async (service, { body, services }) => {\n *       // Access Core services\n *       const dbRecord = await services.db?.query(...);\n *       const cached = await services.cache?.get('key');\n *       await services.notifications?.send(...);\n *       return service.upload(body);\n *     },\n *   },\n * });\n * ```\n */\n\nimport type { NextRequest } from 'next/server';\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n  HandlersTypeMap,\n  CoreInjectedServices,\n  CoreNextJSRouteContext,\n  CoreNextJSRouteConfig,\n  CoreNextJSRouteExports,\n  CoreNextRequestCompat,\n  CoreNextRouteContext,\n  CoreGenericRouteHandler,\n} from '@plyaz/types/core';\nimport * as ServerErrorMiddleware from '@plyaz/errors/middleware/backend';\n\nimport { ServiceRegistry, Core } from '../../init';\nimport { getSuccessMessage } from '../base/route-handler';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HELPER FUNCTIONS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse query parameters from Next.js request\n */\nfunction parseQueryParams(request: NextRequest): Record<string, string> {\n  const query: Record<string, string> = {};\n  request.nextUrl.searchParams.forEach((value, key) => {\n    query[key] = value;\n  });\n  return query;\n}\n\n/**\n * Parse headers from Next.js request\n */\nfunction parseHeaders(request: NextRequest): Record<string, string | undefined> {\n  const headers: Record<string, string | undefined> = {};\n  request.headers.forEach((value, key) => {\n    headers[key] = value;\n  });\n  return headers;\n}\n\n/**\n * Get the appropriate HTTP status for a method\n */\nfunction getStatusForMethod(method: string): number {\n  switch (method) {\n    case 'POST':\n      return HTTP_STATUS.CREATED;\n    case 'DELETE':\n      return HTTP_STATUS.OK;\n    default:\n      return HTTP_STATUS.OK;\n  }\n}\n\n/**\n * Get injected Core services from the initialized Core instance\n * @param coreInstance - The Core class (from getCore callback or static import)\n */\nfunction getInjectedServices(coreInstance: typeof Core): CoreInjectedServices {\n  return {\n    db: coreInstance.db,\n    cache: coreInstance.cache,\n    storage: coreInstance.storage,\n    notifications: coreInstance.notifications,\n    api: coreInstance.api,\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE GETTER FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a service getter function that also returns the Core instance\n */\nfunction createServiceGetter<TService>(\n  service: string | (() => Promise<TService>),\n  getCore?: () => Promise<unknown>\n): () => Promise<{ service: TService; core: typeof Core }> {\n  return async () => {\n    // Use Core from getCore() if provided, otherwise use static import\n    // getCore returns typeof Core but typed as unknown in the config interface\n    const coreInstance = getCore ? ((await getCore()) as typeof Core) : Core;\n    const svc =\n      typeof service === 'function' ? await service() : (ServiceRegistry.get(service) as TService);\n    return { service: svc, core: coreInstance };\n  };\n}\n\n/**\n * Empty services object for when injection is disabled\n */\nconst emptyServices: CoreInjectedServices = {\n  db: undefined,\n  cache: undefined,\n  storage: undefined,\n  notifications: undefined,\n  api: undefined,\n};\n\n/**\n * Parse request body for mutation methods\n */\nasync function parseMutationBody(request: NextRequest, method: string): Promise<unknown> {\n  if (!['POST', 'PUT', 'PATCH'].includes(method)) return undefined;\n  try {\n    return await request.json();\n  } catch {\n    return undefined;\n  }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ROUTE FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create Next.js App Router API route handlers with full type safety.\n * See file header for usage examples.\n *\n * @param config - Route configuration\n * @returns Object with GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD handlers\n */\nexport function createNextApiRoute<\n  TService,\n  THandlerTypes extends HandlersTypeMap = HandlersTypeMap,\n>(config: CoreNextJSRouteConfig<TService, THandlerTypes>): CoreNextJSRouteExports {\n  const {\n    service,\n    handlers,\n    getCore,\n    successMessage,\n    errorSource = 'api',\n    injectServices = true,\n  } = config;\n\n  const getService = createServiceGetter(service, getCore);\n\n  function createHandler(\n    method: string,\n    handler: CoreGenericRouteHandler<TService>\n  ): (request: NextRequest, context?: CoreNextRouteContext) => Promise<Response> {\n    return ServerErrorMiddleware.withErrorHandler(\n      async (request: NextRequest, context?: unknown): Promise<Response> => {\n        const { service: svc, core: coreInstance } = await getService();\n        const routeContext = context as CoreNextRouteContext | undefined;\n        const params = routeContext?.params ? await routeContext.params : {};\n        const query = parseQueryParams(request);\n        const headers = parseHeaders(request);\n        const body = await parseMutationBody(request, method);\n        const services = injectServices ? getInjectedServices(coreInstance) : emptyServices;\n\n        const ctx: CoreNextJSRouteContext = {\n          params,\n          query,\n          headers,\n          method,\n          request: request as unknown as CoreNextRequestCompat,\n          body,\n          services,\n        };\n\n        const result = await handler(svc, ctx);\n        const status = getStatusForMethod(method);\n        const message = getSuccessMessage(method, successMessage);\n\n        return Response.json(SuccessResponseStandard(message, result, status), { status });\n      },\n      { source: errorSource, includeStack: process.env.NODE_ENV !== 'production', logErrors: true }\n    );\n  }\n\n  const exports: CoreNextJSRouteExports = {};\n  const handlerKeys = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'] as const;\n\n  for (const method of handlerKeys) {\n    const handler = handlers[method];\n    if (handler) {\n      exports[method] = createHandler(\n        method,\n        handler as CoreGenericRouteHandler<TService>\n      ) as CoreNextJSRouteExports[typeof method];\n    }\n  }\n\n  return exports;\n}\n","/**\n * Next.js Route Helpers\n *\n * Utility functions for working with Next.js API routes.\n * These helpers reduce boilerplate for common operations like\n * extracting query parameters and parsing request bodies.\n *\n * @example Query params with Zod validation\n * ```typescript\n * import { extractQueryParams } from '@plyaz/core/frameworks/nextjs';\n * import { z } from 'zod';\n *\n * const querySchema = z.object({\n *   page: z.coerce.number().default(1),\n *   limit: z.coerce.number().default(10),\n *   search: z.string().optional(),\n * });\n *\n * export async function GET(request: NextRequest) {\n *   const { page, limit, search } = extractQueryParams(request, querySchema);\n *   // Use typed params...\n * }\n * ```\n *\n * @example Body parsing with validation\n * ```typescript\n * import { extractJsonBody } from '@plyaz/core/frameworks/nextjs';\n * import { z } from 'zod';\n *\n * const createUserSchema = z.object({\n *   name: z.string(),\n *   email: z.string().email(),\n * });\n *\n * export async function POST(request: NextRequest) {\n *   const body = await extractJsonBody(request, createUserSchema);\n *   // body is typed as { name: string; email: string }\n * }\n * ```\n */\n\nimport type { NextRequest } from 'next/server';\n\n// Generic Zod-like schema interface for validation\ninterface ZodLikeSchema<T> {\n  parse: (data: unknown) => T;\n  safeParse: (\n    data: unknown\n  ) => { success: true; data: T } | { success: false; error: { message: string } };\n}\n\n/**\n * Extract and parse query parameters from a Next.js request.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated query parameters\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const params = extractQueryParams(request);\n * // params: Record<string, string>\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n *   page: z.coerce.number().default(1),\n *   limit: z.coerce.number().max(100).default(20),\n * });\n *\n * const { page, limit } = extractQueryParams(request, schema);\n * // page: number, limit: number\n * ```\n */\nexport function extractQueryParams<T>(request: NextRequest, schema: ZodLikeSchema<T>): T;\nexport function extractQueryParams(request: NextRequest): Record<string, string>;\nexport function extractQueryParams<T>(\n  request: NextRequest,\n  schema?: ZodLikeSchema<T>\n): T | Record<string, string> {\n  const params: Record<string, string> = {};\n\n  request.nextUrl.searchParams.forEach((value, key) => {\n    params[key] = value;\n  });\n\n  if (schema) {\n    return schema.parse(params);\n  }\n\n  return params;\n}\n\n/**\n * Extract and parse JSON body from a Next.js request.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated body\n * @throws If body parsing or validation fails\n *\n * @example Without validation\n * ```typescript\n * const body = await extractJsonBody(request);\n * // body: unknown\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n *   name: z.string(),\n *   email: z.string().email(),\n *   role: z.enum(['admin', 'user']).default('user'),\n * });\n *\n * const body = await extractJsonBody(request, schema);\n * // body: { name: string; email: string; role: 'admin' | 'user' }\n * ```\n */\nexport async function extractJsonBody<T>(\n  request: NextRequest,\n  schema: ZodLikeSchema<T>\n): Promise<T>;\nexport async function extractJsonBody(request: NextRequest): Promise<unknown>;\nexport async function extractJsonBody<T>(\n  request: NextRequest,\n  schema?: ZodLikeSchema<T>\n): Promise<T | unknown> {\n  const body = await request.json();\n\n  if (schema) {\n    return schema.parse(body);\n  }\n\n  return body;\n}\n\n/**\n * Safely extract and parse JSON body from a Next.js request.\n * Returns null if parsing fails instead of throwing.\n *\n * @param request - Next.js request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed body or null if parsing failed\n *\n * @example\n * ```typescript\n * const body = await safeExtractJsonBody(request, schema);\n * if (!body) {\n *   return Response.json({ error: 'Invalid request body' }, { status: 400 });\n * }\n * ```\n */\nexport async function safeExtractJsonBody<T>(\n  request: NextRequest,\n  schema: ZodLikeSchema<T>\n): Promise<T | null>;\nexport async function safeExtractJsonBody(request: NextRequest): Promise<unknown | null>;\nexport async function safeExtractJsonBody<T>(\n  request: NextRequest,\n  schema?: ZodLikeSchema<T>\n): Promise<T | unknown | null> {\n  try {\n    const body = await request.json();\n\n    if (schema) {\n      const result = schema.safeParse(body);\n      if (result.success) {\n        return result.data;\n      }\n      return null;\n    }\n\n    return body;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Extract route parameters from Next.js context.\n * Handles the async params pattern in Next.js App Router.\n *\n * @param context - Next.js route context with async params\n * @returns Resolved params object\n *\n * @example\n * ```typescript\n * // app/api/users/[id]/route.ts\n * export async function GET(request: NextRequest, context: { params: Promise<{ id: string }> }) {\n *   const { id } = await extractRouteParams(context);\n *   // id: string\n * }\n * ```\n */\nexport async function extractRouteParams<T extends Record<string, string> = Record<string, string>>(\n  context: { params: Promise<T> } | { params: T } | undefined\n): Promise<T> {\n  if (!context) {\n    return {} as T;\n  }\n\n  if (context.params instanceof Promise) {\n    return context.params;\n  }\n\n  return context.params;\n}\n\n/**\n * Extract headers from a Next.js request as a plain object.\n *\n * @param request - Next.js request object\n * @returns Headers as a plain object\n *\n * @example\n * ```typescript\n * const headers = extractHeaders(request);\n * const auth = headers['authorization'];\n * const contentType = headers['content-type'];\n * ```\n */\nexport function extractHeaders(request: NextRequest): Record<string, string | undefined> {\n  const headers: Record<string, string | undefined> = {};\n\n  request.headers.forEach((value, key) => {\n    headers[key] = value;\n  });\n\n  return headers;\n}\n\n/**\n * Extract a specific header value from a Next.js request.\n *\n * @param request - Next.js request object\n * @param name - Header name (case-insensitive)\n * @returns Header value or undefined\n *\n * @example\n * ```typescript\n * const auth = extractHeader(request, 'authorization');\n * if (!auth?.startsWith('Bearer ')) {\n *   return Response.json({ error: 'Unauthorized' }, { status: 401 });\n * }\n * ```\n */\nexport function extractHeader(request: NextRequest, name: string): string | undefined {\n  return request.headers.get(name) ?? undefined;\n}\n\n/**\n * Extract bearer token from Authorization header.\n *\n * @param request - Next.js request object\n * @returns Token string or null if not present/invalid\n *\n * @example\n * ```typescript\n * const token = extractBearerToken(request);\n * if (!token) {\n *   return Response.json({ error: 'No token provided' }, { status: 401 });\n * }\n * ```\n */\n// Length of 'Bearer ' prefix\nconst BEARER_PREFIX_LENGTH = 7;\n\nexport function extractBearerToken(request: NextRequest): string | null {\n  const auth = request.headers.get('authorization');\n\n  if (!auth?.startsWith('Bearer ')) {\n    return null;\n  }\n\n  return auth.slice(BEARER_PREFIX_LENGTH);\n}\n","/**\n * Express Framework Utilities\n *\n * Factory functions for creating Express route handlers with minimal boilerplate.\n * Types are available from '@plyaz/types/core'.\n *\n * @example Basic usage\n * ```typescript\n * import { createExpressRoute } from '@plyaz/core/frameworks/express';\n * import type { CoreExpressRouteConfig } from '@plyaz/types/core';\n *\n * const routes = createExpressRoute({\n *   service: 'users',\n *   handlers: {\n *     GET: async (service) => service.getAll(),\n *     POST: async (service, { body }) => service.create(body),\n *   },\n * });\n *\n * app.use('/api/users', routes.handler);\n * ```\n */\n\nexport { createExpressRoute } from './route-factory';\n\n// Request helpers\nexport {\n  extractQueryParams,\n  extractJsonBody,\n  safeExtractJsonBody,\n  extractRouteParams,\n  extractHeaders,\n  extractHeader,\n  extractBearerToken,\n} from './helpers';\n\n// Note: Types are NOT re-exported here.\n// Import types directly from '@plyaz/types/core':\n// - CoreExpressRequest, CoreExpressResponse, CoreExpressNextFunction\n// - CoreExpressRouteContext, CoreExpressRouteHandler\n// - CoreExpressRouteConfig, CoreExpressMiddleware, CoreExpressRouteExports\n","/**\n * ============================================================================\n * EXPRESS ROUTE FACTORY\n * ============================================================================\n *\n * Factory for creating Express route handlers with minimal boilerplate.\n * Supports full TypeScript generics for body, params, query, and response types.\n * Provides access to injected Core services (db, storage, notifications, cache).\n *\n * @example Basic usage\n * ```typescript\n * import { createExpressRoute } from '@plyaz/core/frameworks/express';\n *\n * const userRoutes = createExpressRoute({\n *   service: 'users',\n *   handlers: {\n *     GET: async (service, ctx) => service.getAll(),\n *     POST: async (service, ctx) => service.create(ctx.body),\n *   },\n * });\n *\n * app.use('/api/users', userRoutes.handler);\n * // OR mount individual handlers\n * app.get('/api/users', userRoutes.GET);\n * app.post('/api/users', userRoutes.POST);\n * ```\n *\n * @example With typed body and params\n * ```typescript\n * interface CreateUserBody { name: string; email: string; }\n * interface UserParams { id: string; }\n *\n * const userRoutes = createExpressRoute<\n *   UserService,\n *   { GET: { params: UserParams }; POST: { body: CreateUserBody } }\n * >({\n *   service: 'users',\n *   handlers: {\n *     GET: async (service, { params }) => service.getById(params.id),\n *     POST: async (service, { body }) => service.create(body),\n *   },\n * });\n * ```\n */\n\nimport { SuccessResponseStandard } from '@plyaz/errors';\nimport { HTTP_STATUS } from '@plyaz/types';\nimport type {\n  HandlersTypeMap,\n  CoreInjectedServices,\n  CoreExpressRequest,\n  CoreExpressResponse,\n  CoreExpressNextFunction,\n  CoreExpressRouteContext,\n  CoreExpressRouteConfig,\n  CoreExpressMiddleware,\n  CoreExpressRouteExports,\n} from '@plyaz/types/core';\n\nimport { ServiceRegistry } from '../../init';\nimport { Core } from '../../init/CoreInitializer';\nimport { getSuccessMessage } from '../base/route-handler';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HELPER FUNCTIONS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Parse query parameters from Express request\n */\nfunction parseQueryParams(req: CoreExpressRequest): Record<string, string> {\n  const query: Record<string, string> = {};\n  for (const [key, value] of Object.entries(req.query)) {\n    if (typeof value === 'string') {\n      query[key] = value;\n    } else if (Array.isArray(value) && value.length > 0) {\n      // Take first value for array query params\n      query[key] = String(value[0]);\n    }\n  }\n  return query;\n}\n\n/**\n * Parse headers from Express request\n */\nfunction parseHeaders(req: CoreExpressRequest): Record<string, string | undefined> {\n  const headers: Record<string, string | undefined> = {};\n  for (const [key, value] of Object.entries(req.headers)) {\n    if (typeof value === 'string') {\n      headers[key] = value;\n    } else if (Array.isArray(value) && value.length > 0) {\n      headers[key] = value[0];\n    }\n  }\n  return headers;\n}\n\n/**\n * Get the appropriate HTTP status for a method\n */\nfunction getStatusForMethod(method: string): number {\n  switch (method.toUpperCase()) {\n    case 'POST':\n      return HTTP_STATUS.CREATED;\n    case 'DELETE':\n      return HTTP_STATUS.OK;\n    default:\n      return HTTP_STATUS.OK;\n  }\n}\n\n/**\n * Get injected Core services\n */\nfunction getInjectedServices(): CoreInjectedServices {\n  return {\n    db: Core.db,\n    cache: Core.cache,\n    storage: Core.storage,\n    notifications: Core.notifications,\n    api: Core.api,\n  };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SERVICE GETTER FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Generic handler type for internal use\n */\ntype GenericExpressHandler<TService> = (\n  service: TService,\n  ctx: CoreExpressRouteContext\n) => Promise<unknown>;\n\n/**\n * Create a service getter function\n */\nfunction createServiceGetter<TService>(\n  service: string | (() => Promise<TService>),\n  getCore?: () => Promise<unknown>\n): () => Promise<TService> {\n  return async () => {\n    if (getCore) await getCore();\n    if (typeof service === 'function') return service();\n    return ServiceRegistry.get(service) as TService;\n  };\n}\n\n/**\n * Empty services object for when injection is disabled\n */\nconst emptyServices: CoreInjectedServices = {\n  db: undefined,\n  cache: undefined,\n  storage: undefined,\n  notifications: undefined,\n  api: undefined,\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ROUTE FACTORY\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create Express route handlers with full type safety.\n * See file header for usage examples.\n *\n * @param config - Route configuration\n * @returns Object with handler middleware and individual method handlers\n */\nexport function createExpressRoute<\n  TService,\n  THandlerTypes extends HandlersTypeMap = HandlersTypeMap,\n>(config: CoreExpressRouteConfig<TService, THandlerTypes>): CoreExpressRouteExports {\n  const {\n    service,\n    handlers,\n    getCore,\n    successMessage,\n    errorSource = 'api',\n    injectServices = true,\n  } = config;\n\n  const getService = createServiceGetter(service, getCore);\n\n  function createHandler(\n    method: string,\n    handler: GenericExpressHandler<TService>\n  ): CoreExpressMiddleware {\n    return async (\n      req: CoreExpressRequest,\n      res: CoreExpressResponse,\n      next: CoreExpressNextFunction\n    ): Promise<void> => {\n      try {\n        const svc = await getService();\n        const query = parseQueryParams(req);\n        const headers = parseHeaders(req);\n        const services = injectServices ? getInjectedServices() : emptyServices;\n\n        const ctx: CoreExpressRouteContext = {\n          params: req.params,\n          query,\n          headers,\n          method: req.method,\n          request: req,\n          body: req.body,\n          req,\n          res,\n          services,\n        };\n\n        const result = await handler(svc, ctx);\n        const status = getStatusForMethod(method);\n        const message = getSuccessMessage(method, successMessage);\n\n        res.status(status).json(SuccessResponseStandard(message, result, status));\n      } catch (error) {\n        next(error);\n      }\n    };\n  }\n\n  const combinedHandler: CoreExpressMiddleware = async (req, res, next): Promise<void> => {\n    const method = req.method.toUpperCase();\n    const handler = handlers[method as keyof typeof handlers];\n\n    if (!handler) {\n      res.status(HTTP_STATUS.METHOD_NOT_ALLOWED).json({\n        success: false,\n        error: {\n          code: 'METHOD_NOT_ALLOWED',\n          message: `Method ${method} not allowed`,\n          source: errorSource,\n        },\n      });\n      return;\n    }\n\n    await createHandler(method, handler as GenericExpressHandler<TService>)(req, res, next);\n  };\n\n  const exports: CoreExpressRouteExports = { handler: combinedHandler };\n  const handlerKeys = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'HEAD'] as const;\n\n  for (const method of handlerKeys) {\n    const handler = handlers[method];\n    if (handler) {\n      exports[method] = createHandler(method, handler as GenericExpressHandler<TService>);\n    }\n  }\n\n  return exports;\n}\n","/**\n * Express Route Helpers\n *\n * Utility functions for working with Express routes.\n * These helpers reduce boilerplate for common operations like\n * extracting query parameters and parsing request bodies.\n *\n * @example Query params with Zod validation\n * ```typescript\n * import { extractQueryParams } from '@plyaz/core/frameworks/express';\n * import { z } from 'zod';\n *\n * const querySchema = z.object({\n *   page: z.coerce.number().default(1),\n *   limit: z.coerce.number().default(10),\n *   search: z.string().optional(),\n * });\n *\n * app.get('/users', (req, res) => {\n *   const { page, limit, search } = extractQueryParams(req, querySchema);\n *   // Use typed params...\n * });\n * ```\n *\n * @example Body parsing with validation\n * ```typescript\n * import { extractJsonBody } from '@plyaz/core/frameworks/express';\n * import { z } from 'zod';\n *\n * const createUserSchema = z.object({\n *   name: z.string(),\n *   email: z.string().email(),\n * });\n *\n * app.post('/users', (req, res) => {\n *   const body = extractJsonBody(req, createUserSchema);\n *   // body is typed as { name: string; email: string }\n * });\n * ```\n */\n\nimport type { CoreExpressRequest } from '@plyaz/types/core';\n\n// Generic Zod-like schema interface for validation\ninterface ZodLikeSchema<T> {\n  parse: (data: unknown) => T;\n  safeParse: (\n    data: unknown\n  ) => { success: true; data: T } | { success: false; error: { message: string } };\n}\n\n/**\n * Extract and parse query parameters from an Express request.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated query parameters\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const params = extractQueryParams(req);\n * // params: Record<string, string>\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n *   page: z.coerce.number().default(1),\n *   limit: z.coerce.number().max(100).default(20),\n * });\n *\n * const { page, limit } = extractQueryParams(req, schema);\n * // page: number, limit: number\n * ```\n */\nexport function extractQueryParams<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T;\nexport function extractQueryParams(req: CoreExpressRequest): Record<string, string>;\nexport function extractQueryParams<T>(\n  req: CoreExpressRequest,\n  schema?: ZodLikeSchema<T>\n): T | Record<string, string> {\n  const params: Record<string, string> = {};\n\n  for (const [key, value] of Object.entries(req.query)) {\n    if (typeof value === 'string') {\n      params[key] = value;\n    } else if (Array.isArray(value) && value.length > 0) {\n      params[key] = String(value[0]);\n    }\n  }\n\n  if (schema) {\n    return schema.parse(params);\n  }\n\n  return params;\n}\n\n/**\n * Extract and parse JSON body from an Express request.\n * NOTE: Requires body-parser middleware to be configured.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed and validated body\n * @throws If validation fails\n *\n * @example Without validation\n * ```typescript\n * const body = extractJsonBody(req);\n * // body: unknown\n * ```\n *\n * @example With Zod validation\n * ```typescript\n * const schema = z.object({\n *   name: z.string(),\n *   email: z.string().email(),\n * });\n *\n * const body = extractJsonBody(req, schema);\n * // body: { name: string; email: string }\n * ```\n */\nexport function extractJsonBody<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T;\nexport function extractJsonBody(req: CoreExpressRequest): unknown;\nexport function extractJsonBody<T>(\n  req: CoreExpressRequest,\n  schema?: ZodLikeSchema<T>\n): T | unknown {\n  const body = req.body;\n\n  if (schema) {\n    return schema.parse(body);\n  }\n\n  return body;\n}\n\n/**\n * Safely extract and parse JSON body from an Express request.\n * Returns null if parsing fails instead of throwing.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Parsed body or null if parsing failed\n *\n * @example\n * ```typescript\n * const body = safeExtractJsonBody(req, schema);\n * if (!body) {\n *   res.status(400).json({ error: 'Invalid request body' });\n *   return;\n * }\n * ```\n */\nexport function safeExtractJsonBody<T>(req: CoreExpressRequest, schema: ZodLikeSchema<T>): T | null;\nexport function safeExtractJsonBody(req: CoreExpressRequest): unknown | null;\nexport function safeExtractJsonBody<T>(\n  req: CoreExpressRequest,\n  schema?: ZodLikeSchema<T>\n): T | unknown | null {\n  try {\n    const body = req.body;\n\n    if (schema) {\n      const result = schema.safeParse(body);\n      if (result.success) {\n        return result.data;\n      }\n      return null;\n    }\n\n    return body;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Extract route parameters from Express request.\n *\n * @param req - Express request object\n * @param schema - Zod schema for validation (optional)\n * @returns Params object\n *\n * @example\n * ```typescript\n * // app/api/users/:id\n * app.get('/users/:id', (req, res) => {\n *   const { id } = extractRouteParams(req);\n *   // id: string\n * });\n * ```\n */\nexport function extractRouteParams<T extends Record<string, string> = Record<string, string>>(\n  req: CoreExpressRequest,\n  schema?: ZodLikeSchema<T>\n): T {\n  if (schema) {\n    return schema.parse(req.params);\n  }\n  return req.params as T;\n}\n\n/**\n * Extract headers from an Express request as a plain object.\n *\n * @param req - Express request object\n * @returns Headers as a plain object\n *\n * @example\n * ```typescript\n * const headers = extractHeaders(req);\n * const auth = headers['authorization'];\n * const contentType = headers['content-type'];\n * ```\n */\nexport function extractHeaders(req: CoreExpressRequest): Record<string, string | undefined> {\n  const headers: Record<string, string | undefined> = {};\n\n  for (const [key, value] of Object.entries(req.headers)) {\n    if (typeof value === 'string') {\n      headers[key] = value;\n    } else if (Array.isArray(value) && value.length > 0) {\n      headers[key] = value[0];\n    }\n  }\n\n  return headers;\n}\n\n/**\n * Extract a specific header value from an Express request.\n *\n * @param req - Express request object\n * @param name - Header name (case-insensitive)\n * @returns Header value or undefined\n *\n * @example\n * ```typescript\n * const auth = extractHeader(req, 'authorization');\n * if (!auth?.startsWith('Bearer ')) {\n *   res.status(401).json({ error: 'Unauthorized' });\n *   return;\n * }\n * ```\n */\nexport function extractHeader(req: CoreExpressRequest, name: string): string | undefined {\n  return req.get(name);\n}\n\n/**\n * Extract bearer token from Authorization header.\n *\n * @param req - Express request object\n * @returns Token string or null if not present/invalid\n *\n * @example\n * ```typescript\n * const token = extractBearerToken(req);\n * if (!token) {\n *   res.status(401).json({ error: 'No token provided' });\n *   return;\n * }\n * ```\n */\n// Length of 'Bearer ' prefix\nconst BEARER_PREFIX_LENGTH = 7;\n\nexport function extractBearerToken(req: CoreExpressRequest): string | null {\n  const auth = req.get('authorization');\n\n  if (!auth?.startsWith('Bearer ')) {\n    return null;\n  }\n\n  return auth.slice(BEARER_PREFIX_LENGTH);\n}\n","/**\n * Backend Layer Exports\n *\n * NestJS-specific implementations.\n * For framework-agnostic modules, use domain exports:\n * - import { FeatureFlagModule } from '@plyaz/core/domain/featureFlags';\n */\n\n// Example Module (reference implementation)\nexport * from './example';\n\nexport * from './files';\n\nexport * from './notifications';\n\n// Feature Flags (NestJS module)\nexport * from './featureFlags';\n\n// Webhooks (NestJS module for external service callbacks)\nexport * from './webhooks';\n\n// NestJS Caching Decorators (moved here to avoid bundling @nestjs/common in frontend)\nexport * from '../base/cache/feature/caching';\n\n// NestJS Pipes (validation, transformation)\nexport * from './pipes';\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 * 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 * 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 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 * 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 * 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 * 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 * 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 * 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 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","export * from './base';\nexport * from './components';\nexport * from './example';\nexport * from './featureFlags';\nexport * from './files';\nexport * from './hooks';\nexport * from './notifications';\nexport * from './providers';\nexport * from './store';\n","/**\n * InitializationError Component\n *\n * Default error display when Plyaz initialization fails.\n * Can be overridden via the `error` prop on PlyazProvider.\n */\n\n'use client';\n\nimport type { CSSProperties, ReactElement } from 'react';\nimport type { CoreInitializationErrorProps as InitializationErrorProps } from '@plyaz/types/core';\n\n/**\n * Default styles for the error container\n */\nconst errorContainerStyle: CSSProperties = {\n  padding: '20px',\n  color: 'red',\n  fontFamily: 'system-ui, -apple-system, sans-serif',\n};\n\n/**\n * Default styles for the error heading\n */\nconst errorHeadingStyle: CSSProperties = {\n  margin: '0 0 10px 0',\n  fontSize: '1.25rem',\n  fontWeight: 600,\n};\n\n/**\n * Default styles for the error message\n */\nconst errorMessageStyle: CSSProperties = {\n  margin: 0,\n  fontSize: '0.875rem',\n};\n\n/**\n * Renders an initialization error state.\n *\n * @example\n * ```tsx\n * // Using default error display\n * <InitializationError error={new Error('Failed to connect')} />\n *\n * // Using custom error component\n * <InitializationError\n *   error={error}\n *   errorComponent={(err) => <CustomErrorBoundary error={err} />}\n * />\n * ```\n */\nexport function InitializationError({\n  error,\n  errorComponent,\n}: InitializationErrorProps): ReactElement {\n  if (errorComponent) {\n    return <>{errorComponent(error)}</>;\n  }\n\n  return (\n    <div style={errorContainerStyle}>\n      <h2 style={errorHeadingStyle}>Plyaz Initialization Failed</h2>\n      <p style={errorMessageStyle}>{error.message}</p>\n    </div>\n  );\n}\n","/**\n * InitializationLoading Component\n *\n * Default loading display while Plyaz is initializing.\n * Can be overridden via the `loading` prop on PlyazProvider.\n */\n\n'use client';\n\nimport type { CSSProperties, ReactElement } from 'react';\nimport type { CoreInitializationLoadingProps as InitializationLoadingProps } from '@plyaz/types/core';\n\n/**\n * Default styles for the loading container\n */\nconst loadingContainerStyle: CSSProperties = {\n  padding: '20px',\n  fontFamily: 'system-ui, -apple-system, sans-serif',\n};\n\n/**\n * Default styles for the loading message\n */\nconst loadingMessageStyle: CSSProperties = {\n  margin: 0,\n  fontSize: '0.875rem',\n  color: '#666',\n};\n\n/**\n * Renders an initialization loading state.\n *\n * @example\n * ```tsx\n * // Using default loading display\n * <InitializationLoading />\n *\n * // Using custom loading component\n * <InitializationLoading loading={<Skeleton />} />\n * ```\n */\nexport function InitializationLoading({ loading }: InitializationLoadingProps): ReactElement {\n  if (loading) {\n    return <>{loading}</>;\n  }\n\n  return (\n    <div style={loadingContainerStyle}>\n      <p style={loadingMessageStyle}>Initializing...</p>\n    </div>\n  );\n}\n","/**\n * API Provider Component for React/Next.js\n * Initializes the API client service with environment configuration and event handlers\n *\n * @module frontend/providers/ApiProvider\n */\n\n'use client';\n\nimport { useEffect, useState, type ReactElement } from 'react';\nimport { ApiClientService } from '../../services/ApiClientService';\nimport type { CoreApiProviderProps } from '@plyaz/types/core';\n\n/**\n * API Provider Component\n * IMPORTANT: For client components, pass sensitive config from server-side props/actions\n * Initializes the API client service for React/Next.js applications\n *\n * @example\n * ```tsx\n * // In your app layout or _app.tsx\n * import { ApiProvider } from '@plyaz/core';\n *\n * export default function RootLayout({ children }) {\n *   const envConfig = {\n *     env: process.env.NODE_ENV as 'production',\n *     apiKey: process.env.API_KEY,\n *   };\n *\n *   const apiConfig = {\n *     baseURL: process.env.API_URL!,\n *     clientEvents: {\n *       onRequestStart: (event) => console.log('Request started:', event),\n *     },\n *   };\n *\n *   return (\n *     <ApiProvider envConfig={envConfig} apiConfig={apiConfig}>\n *       {children}\n *     </ApiProvider>\n *   );\n * }\n * ```\n */\nexport function ApiProvider({\n  children,\n  envConfig,\n  apiConfig,\n  loadingComponent,\n  errorComponent,\n  onInitialized,\n  onError,\n}: CoreApiProviderProps): ReactElement {\n  const [isReady, setIsReady] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n\n  useEffect(() => {\n    // Initialize API client service once on mount\n    // The singleton pattern in ApiClientService ensures only one instance is created\n    // If already initialized, it returns the existing instance with a warning\n    ApiClientService.init(envConfig, apiConfig)\n      .then(() => {\n        setIsReady(true);\n        onInitialized?.();\n      })\n      .catch((err: unknown) => {\n        const error = err instanceof Error ? err : new Error(String(err));\n        setError(error);\n        onError?.(error);\n        globalThis.console.error('[ApiProvider] Failed to initialize API client:', error);\n      });\n\n    // Cleanup on unmount\n    return () => {\n      // Don't dispose the client on unmount - it's a singleton\n      // Only dispose if you're sure you want to tear down the client\n    };\n  }, []); // Initialize once on mount - config changes are not supported after initialization\n\n  // Show error component if initialization failed\n  if (error) {\n    if (errorComponent) {\n      return <>{errorComponent(error)}</>;\n    }\n    return (\n      <div style={{ padding: '20px', color: 'red' }}>\n        <h2>API Client Initialization Failed</h2>\n        <p>{error.message}</p>\n      </div>\n    );\n  }\n\n  // Show loading component while initializing\n  if (!isReady) {\n    if (loadingComponent) {\n      return <>{loadingComponent}</>;\n    }\n    return (\n      <div style={{ padding: '20px' }}>\n        <p>Initializing API client...</p>\n      </div>\n    );\n  }\n\n  // Render children when ready\n  return <>{children}</>;\n}\n","/**\n * Stream Connection Hook\n *\n * React hook for SSE connections to stream events.\n * Works with Next.js client components.\n */\n\n/* eslint-disable n/no-unsupported-features/node-builtins */\n/* eslint-disable max-lines-per-function */\n\n// EventSource is a stable browser API, this is a client-side hook\n\n'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type {\n  StreamChannel,\n  StreamMessage,\n  FilesUploadStreamProgress,\n  UseStreamConnectionOptions,\n  UseStreamConnectionResult,\n} from '@plyaz/types/core';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport { StreamPackageError } from '@plyaz/errors';\n\n/**\n * Default configuration\n */\nconst DEFAULT_ENDPOINT = '/api/events/stream';\nconst DEFAULT_RECONNECT_DELAY = 1000;\nconst DEFAULT_MAX_RECONNECT_ATTEMPTS = 5;\nconst EXPONENTIAL_BACKOFF_BASE = 2;\n\n/**\n * useStreamConnection - React hook for SSE connections\n *\n * Features:\n * - Auto-connect on mount\n * - Auto-reconnect on disconnect\n * - Channel subscription via query params\n * - Message event handling\n * - Connection state management\n *\n * @example\n * ```tsx\n * function UploadProgress({ fileId }: { fileId: string }) {\n *   const [progress, setProgress] = useState(0);\n *\n *   // Use generic to get properly typed message.data\n *   const { connected, error } = useStreamConnection<FilesUploadStreamProgress>({\n *     channels: [`upload:${fileId}`],\n *     onMessage: (message) => {\n *       if (message.event === 'progress') {\n *         // message.data is typed as FilesUploadStreamProgress\n *         setProgress(message.data.percentage);\n *       }\n *     },\n *   });\n *\n *   if (error) return <div>Connection error</div>;\n *   if (!connected) return <div>Connecting...</div>;\n *\n *   return <div>Progress: {progress}%</div>;\n * }\n * ```\n */\nexport function useStreamConnection<T = unknown>(\n  options: UseStreamConnectionOptions<T>\n): UseStreamConnectionResult {\n  const {\n    channels,\n    endpoint = DEFAULT_ENDPOINT,\n    autoConnect = true,\n    autoReconnect = true,\n    maxReconnectAttempts = DEFAULT_MAX_RECONNECT_ATTEMPTS,\n    reconnectDelay = DEFAULT_RECONNECT_DELAY,\n    onConnect,\n    onDisconnect,\n    onError,\n    onMessage,\n    // Response parsing options\n    unwrapSuccessResponse = true,\n    responseParser,\n  } = options;\n\n  const [connected, setConnected] = useState(false);\n\n  const eventSourceRef = useRef<EventSource | null>(null);\n  const reconnectAttemptsRef = useRef(0);\n  const reconnectTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  /**\n   * Build URL with channel query params\n   */\n  const buildUrl = useCallback(() => {\n    const url = new URL(endpoint, globalThis.window.location.origin);\n    if (channels.length > 0) {\n      url.searchParams.set('channels', channels.join(','));\n    }\n    return url.toString();\n  }, [endpoint, channels]);\n\n  /**\n   * Parse response data with configurable unwrapping.\n   *\n   * Priority:\n   * 1. Custom responseParser (full control)\n   * 2. Auto-unwrap SuccessResponse if enabled (default)\n   * 3. Return raw data as-is\n   */\n  const parseResponse = useCallback(\n    <D>(parsed: unknown): D => {\n      // Custom parser takes priority\n      if (responseParser) {\n        return responseParser(parsed) as unknown as D;\n      }\n\n      // Auto-unwrap SuccessResponse format if enabled\n      if (\n        unwrapSuccessResponse &&\n        parsed &&\n        typeof parsed === 'object' &&\n        'success' in parsed &&\n        'data' in parsed &&\n        (parsed as { success: boolean }).success === true\n      ) {\n        return (parsed as { data: D }).data;\n      }\n\n      // Return raw data\n      return parsed as D;\n    },\n    [responseParser, unwrapSuccessResponse]\n  );\n\n  /**\n   * Handle SSE message\n   */\n  const handleMessage = useCallback(\n    (event: MessageEvent) => {\n      try {\n        const parsed = JSON.parse(event.data);\n        // Extract event/channel from parsed data if available (server sends { event, channel, data })\n        const message: StreamMessage<T> = {\n          event: parsed.event ?? 'message',\n          channel: parsed.channel,\n          data: parseResponse<T>(parsed.data ?? parsed),\n        };\n        onMessage?.(message);\n      } catch {\n        // Invalid JSON, ignore\n      }\n    },\n    [onMessage, parseResponse]\n  );\n\n  /**\n   * Connect to SSE endpoint\n   */\n  const connect = useCallback(() => {\n    // Only run on client\n    if (typeof window === 'undefined') return;\n\n    // Close existing connection\n    if (eventSourceRef.current) {\n      eventSourceRef.current.close();\n    }\n\n    const url = buildUrl();\n    const eventSource = new EventSource(url);\n    eventSourceRef.current = eventSource;\n\n    eventSource.onopen = () => {\n      setConnected(true);\n      reconnectAttemptsRef.current = 0;\n      onConnect?.();\n    };\n\n    eventSource.onerror = () => {\n      setConnected(false);\n\n      // Create error - auto-populates to global error store via scoped event emission\n      const err = new StreamPackageError(\n        'SSE connection failed',\n        STREAM_ERROR_CODES.CONNECTION_FAILED,\n        {\n          context: {\n            endpoint,\n            channels,\n            reconnectAttempt: reconnectAttemptsRef.current,\n          },\n        }\n      );\n\n      onError?.(err);\n      onDisconnect?.();\n\n      // Close the broken connection\n      eventSource.close();\n      eventSourceRef.current = null;\n\n      // Attempt reconnect\n      if (autoReconnect && reconnectAttemptsRef.current < maxReconnectAttempts) {\n        reconnectAttemptsRef.current++;\n        const delay =\n          reconnectDelay * Math.pow(EXPONENTIAL_BACKOFF_BASE, reconnectAttemptsRef.current - 1);\n        reconnectTimerRef.current = setTimeout(connect, delay);\n      }\n    };\n\n    // All messages come through onmessage - event type is in JSON payload\n    // This is more scalable than hardcoding SSE named event listeners\n    eventSource.onmessage = handleMessage;\n  }, [\n    buildUrl,\n    handleMessage,\n    autoReconnect,\n    maxReconnectAttempts,\n    reconnectDelay,\n    onConnect,\n    onDisconnect,\n    onError,\n    endpoint,\n    channels,\n  ]);\n\n  /**\n   * Disconnect from SSE endpoint\n   */\n  const disconnect = useCallback(() => {\n    // Clear reconnect timer\n    if (reconnectTimerRef.current) {\n      clearTimeout(reconnectTimerRef.current);\n      reconnectTimerRef.current = null;\n    }\n\n    // Close connection\n    if (eventSourceRef.current) {\n      eventSourceRef.current.close();\n      eventSourceRef.current = null;\n    }\n\n    setConnected(false);\n    onDisconnect?.();\n  }, [onDisconnect]);\n\n  /**\n   * Reconnect (disconnect then connect)\n   */\n  const reconnect = useCallback(() => {\n    reconnectAttemptsRef.current = 0;\n    disconnect();\n    connect();\n  }, [disconnect, connect]);\n\n  /**\n   * Auto-connect on mount, cleanup on unmount\n   */\n  useEffect(() => {\n    if (autoConnect) {\n      connect();\n    }\n\n    return () => {\n      disconnect();\n    };\n  }, []);\n\n  /**\n   * Reconnect when channels change\n   */\n  useEffect(() => {\n    if (connected && eventSourceRef.current) {\n      reconnect();\n    }\n  }, [channels.join(',')]);\n\n  return {\n    connected,\n    reconnect,\n    disconnect,\n  };\n}\n\n/**\n * useUploadProgress - Convenience hook for upload progress\n *\n * @example\n * ```tsx\n * function Upload({ fileId }: { fileId: string }) {\n *   const { progress, status, connected } = useUploadProgress(fileId);\n *\n *   return (\n *     <div>\n *       <div>Status: {status}</div>\n *       <progress value={progress} max={100} />\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useUploadProgress(fileId: string): {\n  progress: number;\n  status: FilesUploadStreamProgress['status'];\n  loaded: number;\n  total: number;\n  speed?: number;\n  error?: string;\n  connected: boolean;\n} {\n  const [progressData, setProgressData] = useState<FilesUploadStreamProgress>({\n    fileId,\n    filename: '',\n    percentage: 0,\n    status: 'pending',\n    loaded: 0,\n    total: 0,\n  });\n\n  const { connected } = useStreamConnection<FilesUploadStreamProgress>({\n    channels: [`upload:${fileId}` as StreamChannel],\n    onMessage: message => {\n      if (\n        message.event === 'progress' ||\n        message.event === 'completed' ||\n        message.event === 'error'\n      ) {\n        // message.data is properly typed as FilesUploadStreamProgress\n        setProgressData(prev => ({ ...prev, ...message.data }));\n      }\n    },\n  });\n\n  return {\n    progress: progressData.percentage,\n    status: progressData.status,\n    loaded: progressData.loaded,\n    total: progressData.total,\n    speed: progressData.speed,\n    error: progressData.error,\n    connected,\n  };\n}\n","'use client';\n\n/* eslint-disable max-lines-per-function */\n/* eslint-disable complexity */\n\n/**\n * useStreamManager - Hook for managing SSE connection and stream handlers\n *\n * This hook handles:\n * 1. Establishing SSE connection when streaming is enabled\n * 2. Routing incoming messages to the stream store\n * 3. Managing connection state and reconnection\n * 4. Registering domain services' stream handlers\n *\n * @internal Used by PlyazProvider\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport { PackageLogger } from '@plyaz/logger';\nimport { StreamPackageError } from '@plyaz/errors';\nimport { serializeError } from '@plyaz/errors/middleware';\nimport { STREAM_ERROR_CODES } from '@plyaz/types/errors';\nimport { useStreamConnection } from '../../events/streaming/hooks';\nimport { FrontendFilesDomainService } from '../../domain/files/FrontendFilesDomainService';\nimport { FrontendNotificationsDomainService } from '../../domain/notifications/FrontendNotificationsDomainService';\nimport type { StreamChannel, StreamMessage } from '@plyaz/types/core';\nimport type { UseStreamManagerOptions, UseStreamManagerResult } from '@plyaz/types/core';\nimport type { PackageErrorLike } from '@plyaz/types/errors';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'useStreamManager' });\n\n/**\n * Default reconnect configuration\n */\nconst DEFAULT_MAX_RECONNECT_ATTEMPTS = 10;\nconst DEFAULT_RECONNECT_DELAY_MS = 1000;\n\n/**\n * Default channels for streaming\n */\nconst DEFAULT_CHANNELS: StreamChannel[] = [\n  'uploads' as StreamChannel,\n  'downloads' as StreamChannel,\n  'generations' as StreamChannel,\n  'notifications' as StreamChannel,\n  'system' as StreamChannel,\n];\n\n/**\n * Hook for managing SSE connection lifecycle and message routing.\n *\n * @param options - Stream manager options\n * @returns Connection state\n *\n * @example\n * ```tsx\n * const { connected, enabled } = useStreamManager({\n *   config: streamConfig,\n *   store: useRootStore,\n *   enabled: true,\n *   verbose: true,\n * });\n * // Errors are in global error store - use useErrorStore or error hooks\n * ```\n */\nexport function useStreamManager({\n  config,\n  store,\n  verbose,\n  enabled = false,\n}: UseStreamManagerOptions): UseStreamManagerResult {\n  const isConnectedRef = useRef(false);\n  const debug = config?.debug ?? verbose ?? false;\n\n  // Get stream store from root store\n  const streamStore = store.getState()?.stream;\n\n  /**\n   * Handle incoming SSE messages\n   * Routes to stream store's handleMessage for handler dispatch\n   */\n  const handleMessage = useCallback(\n    (message: StreamMessage<unknown>) => {\n      if (!enabled) return;\n\n      if (debug) {\n        logger.debug('Message received', { event: message.event });\n      }\n\n      // Get fresh stream store reference\n      const currentStreamStore = store.getState()?.stream;\n      if (!currentStreamStore) {\n        if (debug) {\n          logger.warn('Stream store not available');\n        }\n        return;\n      }\n\n      // Route message to stream store handlers\n      currentStreamStore.handleMessage({\n        event: message.event,\n        channel: message.channel,\n        data: message.data,\n        timestamp: Date.now(),\n      });\n    },\n    [store, debug, enabled]\n  );\n\n  /**\n   * Handle connection state changes\n   */\n  const handleConnect = useCallback(() => {\n    if (!enabled) return;\n\n    if (debug) {\n      logger.info('Connected to SSE');\n    }\n\n    const currentStreamStore = store.getState()?.stream;\n    if (currentStreamStore) {\n      currentStreamStore.setConnected(true);\n      currentStreamStore.setTransport('sse');\n    }\n\n    config?.onConnect?.();\n  }, [store, config, debug, enabled]);\n\n  const handleDisconnect = useCallback(() => {\n    if (!enabled) return;\n\n    if (debug) {\n      logger.info('Disconnected from SSE');\n    }\n\n    const currentStreamStore = store.getState()?.stream;\n    if (currentStreamStore) {\n      currentStreamStore.setConnected(false);\n      currentStreamStore.setTransport(null);\n    }\n\n    config?.onDisconnect?.();\n  }, [store, config, debug, enabled]);\n\n  const handleError = useCallback(\n    (error: PackageErrorLike) => {\n      if (!enabled) return;\n\n      logger.error('Connection error', { error: error.message });\n\n      // Add error to global errors store with 'stream' source\n      const errorsSlice = store.getState()?.errors;\n      if (errorsSlice) {\n        const streamError =\n          error instanceof StreamPackageError\n            ? error\n            : StreamPackageError.fromError(error, STREAM_ERROR_CODES.CONNECTION_FAILED);\n        const serialized = serializeError(streamError, 'stream');\n        errorsSlice.addError(serialized);\n      }\n\n      config?.onError?.(error);\n    },\n    [store, config, enabled]\n  );\n\n  /**\n   * Build channels array from config\n   */\n  const channels = (config?.channels ?? DEFAULT_CHANNELS) as StreamChannel[];\n\n  /**\n   * Establish SSE connection (only when enabled)\n   */\n  const { connected } = useStreamConnection<unknown>({\n    channels,\n    endpoint: config?.endpoint ?? '/api/events/stream',\n    autoConnect: enabled && (config?.autoConnect ?? true),\n    autoReconnect: enabled && (config?.reconnect?.enabled ?? true),\n    maxReconnectAttempts: config?.reconnect?.maxAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS,\n    reconnectDelay: config?.reconnect?.delay ?? DEFAULT_RECONNECT_DELAY_MS,\n    onConnect: handleConnect,\n    onDisconnect: handleDisconnect,\n    onError: handleError,\n    onMessage: handleMessage,\n  });\n\n  /**\n   * Track connection state\n   */\n  useEffect(() => {\n    isConnectedRef.current = connected;\n  }, [connected]);\n\n  /**\n   * Subscribe to channels in stream store\n   */\n  useEffect(() => {\n    if (!enabled || !streamStore) return;\n\n    streamStore.subscribeToChannels(channels as string[]);\n\n    return () => {\n      streamStore.unsubscribeFromAllChannels();\n    };\n  }, [enabled, streamStore, channels]);\n\n  /**\n   * Register domain stream handlers\n   *\n   * Each domain service registers its own handlers via its static\n   * registerStreamHandlers() method. This keeps domain logic in domain services.\n   */\n  useEffect(() => {\n    if (!enabled || !streamStore) return;\n\n    const cleanupFns: (() => void)[] = [];\n\n    // Register files domain stream handlers\n    try {\n      const cleanupFiles = FrontendFilesDomainService.registerStreamHandlers(debug);\n      cleanupFns.push(cleanupFiles);\n      if (debug) {\n        logger.debug('Registered files stream handlers');\n      }\n    } catch (err) {\n      logger.warn('Failed to register files stream handlers', {\n        error: err instanceof Error ? err.message : String(err),\n      });\n    }\n\n    // Register notifications domain stream handlers\n    try {\n      const cleanupNotifications = FrontendNotificationsDomainService.registerStreamHandlers(debug);\n      cleanupFns.push(cleanupNotifications);\n      if (debug) {\n        logger.debug('Registered notifications stream handlers');\n      }\n    } catch (err) {\n      logger.warn('Failed to register notifications stream handlers', {\n        error: err instanceof Error ? err.message : String(err),\n      });\n    }\n\n    return () => {\n      // Cleanup all domain handlers\n      cleanupFns.forEach(cleanup => {\n        try {\n          cleanup();\n        } catch {\n          // Ignore cleanup errors\n        }\n      });\n    };\n  }, [enabled, streamStore, debug]);\n\n  /**\n   * Log connection status\n   */\n  useEffect(() => {\n    if (!enabled) return;\n\n    if (debug && connected) {\n      logger.info('Ready - subscribed to channels', { channels });\n    }\n  }, [enabled, connected, channels, debug]);\n\n  return {\n    connected: enabled ? connected : false,\n    channels,\n    enabled,\n  };\n}\n\nexport default useStreamManager;\n","/* eslint-disable max-lines-per-function */\n\n/**\n * PlyazProvider - Unified React Provider for Plyaz Core Services\n *\n * A single provider that initializes and provides access to all frontend-safe\n * Plyaz services. Designed for ease of use without unnecessary limitations.\n *\n * @module frontend/providers/PlyazProvider\n *\n * @example Basic usage\n * ```tsx\n * import { PlyazProvider } from '@plyaz/core/frontend';\n *\n * export default function App({ children }) {\n *   return (\n *     <PlyazProvider\n *       config={{\n *         api: {\n *           baseURL: process.env.NEXT_PUBLIC_API_URL!,\n *           env: 'production',\n *         },\n *       }}\n *     >\n *       {children}\n *     </PlyazProvider>\n *   );\n * }\n * ```\n *\n * @example With all options\n * ```tsx\n * <PlyazProvider\n *   config={{\n *     api: {\n *       baseURL: 'https://api.example.com',\n *       env: 'production',\n *       apiKey: process.env.NEXT_PUBLIC_API_KEY,\n *     },\n *     featureFlags: {\n *       provider: 'api',\n *       refreshInterval: 60000,\n *     },\n *     appContext: 'webapp',\n *     verbose: process.env.NODE_ENV === 'development',\n *   }}\n *   onReady={(services) => console.log('Services ready:', services)}\n *   onError={(error) => Sentry.captureException(error)}\n *   loading={<Skeleton />}\n *   error={(err) => <ErrorBoundary error={err} />}\n * >\n *   {children}\n * </PlyazProvider>\n * ```\n *\n * @example Accessing services in components\n * ```tsx\n * import { usePlyaz, useApi, useEvents, useFeatureFlag } from '@plyaz/core/frontend';\n *\n * function MyComponent() {\n *   // Full access to all services\n *   const { api, events, isReady } = usePlyaz();\n *\n *   // Or use specific hooks\n *   const apiClient = useApi();\n *   const events = useEvents();\n *   const { value: darkMode } = useFeatureFlag('DARK_MODE');\n *\n *   // Make API calls\n *   const fetchData = async () => {\n *     const response = await apiClient.get('/users');\n *     return response.data;\n *   };\n *\n *   // Subscribe to events\n *   useEffect(() => {\n *     const unsubscribe = events.on('user:updated', (event) => {\n *       console.log('User updated:', event.data);\n *     });\n *     return unsubscribe;\n *   }, [events]);\n *\n *   return <div>...</div>;\n * }\n * ```\n */\n\n'use client';\n\nimport {\n  createContext,\n  useContext,\n  useEffect,\n  useState,\n  useCallback,\n  useMemo,\n  type ReactElement,\n} from 'react';\nimport { ApiProvider } from '@plyaz/api/frontend';\nimport { PackageLogger } from '@plyaz/logger';\nimport { CorePackageError } from '@plyaz/errors';\nimport { ERROR_CODES } from '@plyaz/types';\nimport type { RootStoreSlice, RootStoreHook } from '@plyaz/types/store';\nimport { Core } from '../../init/CoreInitializer';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport { detectRuntime } from '../../utils/runtime';\nimport { ApiClientService } from '../../services/ApiClientService';\nimport { CoreEventManager } from '../../events/CoreEventManager';\nimport type {\n  CoreAppContext,\n  CoreAppEnvironment,\n  CorePlyazConfig,\n  CorePlyazFeatureFlagConfig,\n  CorePlyazServices,\n  CorePlyazContextValue,\n  CorePlyazProviderProps as PlyazProviderProps,\n  CoreDomainServiceInstance,\n} from '@plyaz/types/core';\nimport type { ApiClientOptions, PackageErrorLike } from '@plyaz/types/api';\nimport { createEncryptionConfig } from '@plyaz/config/api';\nimport { InitializationError } from '../components/InitializationError';\nimport { InitializationLoading } from '../components/InitializationLoading';\nimport { useStreamManager } from '../hooks/useStreamManager';\n\nconst logger = new PackageLogger({ packageName: 'core', service: 'PlyazProvider' });\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Implementation-specific context value.\n * Extends CorePlyazContextValue with concrete implementation references.\n */\ninterface PlyazContextValue extends Omit<CorePlyazContextValue, 'api' | 'events' | 'core'> {\n  /** API client for making HTTP requests */\n  api: typeof ApiClientService | null;\n  /** Event manager for pub/sub */\n  events: typeof CoreEventManager;\n  /** Core initializer reference */\n  core: typeof Core;\n}\n\n/**\n * Implementation-specific services for callbacks.\n */\ninterface PlyazServices extends Omit<CorePlyazServices, never> {\n  /** API client for making HTTP requests */\n  api: typeof ApiClientService | null;\n  /** Event manager for pub/sub */\n  events: typeof CoreEventManager;\n  /** Core initializer reference */\n  core: typeof Core;\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst PlyazContext = createContext<PlyazContextValue | null>(null);\n\n// ============================================================================\n// Feature Flag Store (Simple in-memory implementation for frontend)\n// ============================================================================\n\n/**\n * Frontend Feature Flag Store\n *\n * Manages feature flags in frontend context with two provider options:\n * - 'memory': Flags stored in-memory (default, resets on refresh)\n * - 'api': Flags fetched from API endpoint\n *\n * For backend/server-side feature flags, use Core.initialize() with\n * database, redis, or file providers instead.\n */\nclass FeatureFlagStore {\n  private flags: Record<string, boolean> = {};\n  private config: CorePlyazFeatureFlagConfig;\n  private apiClient: typeof ApiClientService | null = null;\n  private refreshTimer: ReturnType<typeof globalThis.setInterval> | null = null;\n\n  constructor(config: CorePlyazFeatureFlagConfig = {}) {\n    this.config = config;\n    this.flags = config.defaults ?? {};\n  }\n\n  setApiClient(client: typeof ApiClientService | null): void {\n    this.apiClient = client;\n  }\n\n  get(key: string, defaultValue = false): boolean {\n    return this.flags[key] ?? defaultValue;\n  }\n\n  getAll(): Record<string, boolean> {\n    return { ...this.flags };\n  }\n\n  set(key: string, value: boolean): void {\n    this.flags[key] = value;\n  }\n\n  setAll(flags: Record<string, boolean>): void {\n    this.flags = { ...this.flags, ...flags };\n  }\n\n  async refresh(): Promise<void> {\n    // Only 'api' provider needs refresh - 'memory' is local only\n    if (this.config.provider === 'api' && this.apiClient?.isInitialized()) {\n      try {\n        const endpoint = this.config.apiEndpoint ?? '/feature-flags';\n        const client = this.apiClient.getClient();\n        const response = await client.get<{ flags?: Record<string, boolean> }>(endpoint);\n        if (response.data?.flags) {\n          this.flags = { ...this.flags, ...response.data.flags };\n        }\n      } catch (error) {\n        globalThis.console.warn('[PlyazProvider] Failed to refresh feature flags:', error);\n      }\n    }\n    // 'memory' provider: no-op, flags are managed locally\n  }\n\n  startAutoRefresh(): void {\n    // Only start auto-refresh for 'api' provider\n    if (\n      this.config.provider === 'api' &&\n      this.config.refreshInterval &&\n      this.config.refreshInterval > 0\n    ) {\n      this.refreshTimer = globalThis.setInterval(() => {\n        this.refresh().catch(() => {});\n      }, this.config.refreshInterval);\n    }\n  }\n\n  stopAutoRefresh(): void {\n    if (this.refreshTimer) {\n      globalThis.clearInterval(this.refreshTimer);\n      this.refreshTimer = null;\n    }\n  }\n\n  dispose(): void {\n    this.stopAutoRefresh();\n    this.flags = {};\n  }\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\n/**\n * PlyazProvider - Unified provider for all Plyaz frontend services\n *\n * Initializes and provides access to:\n * - API Client (HTTP requests)\n * - Event Manager (pub/sub)\n * - Feature Flags\n * - Core utilities\n */\n\n/**\n * Build API client configuration from provider config\n */\nfunction buildApiConfig(config: CorePlyazConfig): Partial<ApiClientOptions> {\n  return {\n    baseURL: config.api.baseURL,\n    timeout: config.api.timeout,\n    headers: config.api.headers ? { static: config.api.headers } : undefined,\n    retry: config.api.retry,\n    encryption:\n      config.api.encryption?.enabled && config.api.encryption?.key\n        ? createEncryptionConfig(config.api.encryption.key)\n        : undefined,\n  };\n}\n\n/** Initialize Core with frontend config */\nasync function initializeCore(config: CorePlyazConfig): Promise<void> {\n  const apiConfig = buildApiConfig(config);\n\n  await Core.initialize({\n    skipDb: true,\n    appContext: config.appContext ?? 'webapp',\n    verbose: config.verbose,\n    api: {\n      env: config.api.env ?? 'development',\n      apiKey: config.api.apiKey,\n      setAsDefault: true,\n      ...apiConfig,\n    },\n    // Feature flags config (passed to Core for memory provider setup)\n    featureFlags: config.featureFlags,\n    // Error handler is auto-initialized by Core.initialize()\n    // Store (Zustand) is auto-connected via useRootStore in Core.initializeRootStore()\n  });\n}\n\n/**\n * Create a store registry that wraps the Zustand root store.\n * This allows ServiceRegistry to inject stores into domain services.\n *\n * @param store - The root store hook from @plyaz/store, passed via PlyazProvider props\n */\nfunction createStoreRegistry(store: RootStoreHook): {\n  getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined;\n} {\n  return {\n    getStore<K extends keyof RootStoreSlice>(key: K): RootStoreSlice[K] | undefined {\n      const state = store.getState();\n      if (!state) {\n        logger.warn(\n          'Store state is undefined - store may not be hydrated yet. This can cause side effects if called during SSR or before initialization.'\n        );\n        return undefined;\n      }\n      const slice = state[key] as RootStoreSlice[K] | undefined;\n      logger.debug(`[StoreRegistry] getStore('${key}')`, {\n        hasSlice: !!slice,\n        sliceKeys: slice ? Object.keys(slice) : [],\n      });\n      return slice;\n    },\n  };\n}\n\n/** Initialize ServiceRegistry if services are configured */\nasync function initializeServices(config: CorePlyazConfig, store: RootStoreHook): Promise<void> {\n  if (!config.services || config.services.length === 0) return;\n\n  if (config.verbose) {\n    globalThis.console.log('[PlyazProvider] Initializing domain services...');\n  }\n\n  await ServiceRegistry.initialize({\n    environment: config.environment,\n    runtime: config.runtime ?? detectRuntime(),\n    apiClient: { baseURL: config.api.baseURL },\n    observability: config.observability,\n    services: config.services,\n    // Provide store registry for injecting stores into services\n    stores: createStoreRegistry(store),\n  });\n\n  if (config.verbose) {\n    globalThis.console.log(\n      '[PlyazProvider] Services initialized:',\n      ServiceRegistry.getInitializedKeys()\n    );\n  }\n}\n\n/** Initialize feature flags store */\nasync function initializeFeatureFlags(featureFlagStore: FeatureFlagStore): Promise<void> {\n  featureFlagStore.setApiClient(ApiClientService);\n  await featureFlagStore.refresh();\n  featureFlagStore.startAutoRefresh();\n}\n\n/**\n * Create PlyazServices object for callbacks\n */\nfunction createServicesObject(\n  config: CorePlyazConfig,\n  featureFlagStore: FeatureFlagStore\n): PlyazServices {\n  return {\n    api: ApiClientService,\n    events: CoreEventManager,\n    core: Core,\n    featureFlags: {\n      get: (key, def) => featureFlagStore.get(key, def),\n      getAll: () => featureFlagStore.getAll(),\n      refresh: () => featureFlagStore.refresh(),\n    },\n    appContext: config.appContext ?? 'webapp',\n    environment: config.api.env ?? 'development',\n    getService: <T extends CoreDomainServiceInstance>(key: string) => ServiceRegistry.get<T>(key),\n    getServiceAsync: <T extends CoreDomainServiceInstance>(key: string) =>\n      ServiceRegistry.getAsync<T>(key),\n    hasService: (key: string) => ServiceRegistry.has(key),\n    getServiceKeys: () => ServiceRegistry.getInitializedKeys(),\n  };\n}\n\nexport function PlyazProvider({\n  children,\n  store,\n  config,\n  loading,\n  error: errorComponent,\n  onReady,\n  onError,\n  skipLoadingState = false,\n}: PlyazProviderProps): ReactElement {\n  const [isReady, setIsReady] = useState(false);\n  const [error, setError] = useState<PackageErrorLike | null>(null);\n  const [featureFlagStore] = useState(() => new FeatureFlagStore(config.featureFlags));\n\n  // Initialize services\n  const initialize = useCallback(async () => {\n    try {\n      setError(null);\n\n      // Inject store into Core before initialization\n      Core.setRootStoreHook(store);\n\n      await initializeCore(config);\n      await initializeServices(config, store);\n      await initializeFeatureFlags(featureFlagStore);\n\n      setIsReady(true);\n      onReady?.(createServicesObject(config, featureFlagStore));\n    } catch (err) {\n      const initError =\n        err instanceof CorePackageError\n          ? err\n          : new CorePackageError(\n              err instanceof Error ? err.message : String(err),\n              ERROR_CODES.CORE_INITIALIZATION_FAILED\n            );\n      setError(initError);\n      onError?.(initError);\n      globalThis.console.error('[PlyazProvider] Initialization failed:', initError);\n    }\n  }, [config, store, featureFlagStore, onReady, onError]);\n\n  // Reinitialize function\n  const reinitialize = useCallback(async () => {\n    setIsReady(false);\n    ServiceRegistry.disposeAll();\n    await Core.reset();\n    await initialize();\n  }, [initialize]);\n\n  // Initialize on mount\n  useEffect(() => {\n    void initialize();\n\n    return () => {\n      featureFlagStore.dispose();\n      ServiceRegistry.disposeAll();\n    };\n  }, []); // Only run once on mount\n\n  // Build context value\n  const contextValue = useMemo<PlyazContextValue>(\n    () => ({\n      api: isReady ? ApiClientService : null,\n      events: CoreEventManager,\n      core: Core,\n      featureFlags: {\n        get: (key, def) => featureFlagStore.get(key, def),\n        getAll: () => featureFlagStore.getAll(),\n        refresh: () => featureFlagStore.refresh(),\n      },\n      appContext: config.appContext ?? 'webapp',\n      environment: config.api.env ?? 'development',\n      isReady,\n      error,\n      reinitialize,\n      // ServiceRegistry access\n      getService: <T extends CoreDomainServiceInstance>(key: string) => ServiceRegistry.get<T>(key),\n      getServiceAsync: <T extends CoreDomainServiceInstance>(key: string) =>\n        ServiceRegistry.getAsync<T>(key),\n      hasService: (key: string) => ServiceRegistry.has(key),\n      getServiceKeys: () => ServiceRegistry.getInitializedKeys(),\n    }),\n    [isReady, error, config.appContext, config.api.env, featureFlagStore, reinitialize]\n  );\n\n  // Handle error state\n  if (error && !skipLoadingState) {\n    return (\n      <ApiProvider>\n        <InitializationError error={error} errorComponent={errorComponent} />\n      </ApiProvider>\n    );\n  }\n\n  // Check if streaming is enabled\n  const streamingEnabled = config.streaming?.enabled ?? false;\n\n  // Initialize streaming (hook is always called, but only active when enabled)\n  useStreamManager({\n    config: config.streaming,\n    store,\n    verbose: config.verbose,\n    enabled: streamingEnabled,\n  });\n\n  // Handle loading state\n  if (!isReady && !skipLoadingState) {\n    return (\n      <ApiProvider>\n        <InitializationLoading loading={loading} />\n      </ApiProvider>\n    );\n  }\n\n  // Render children with context and React Query\n  return (\n    <ApiProvider>\n      <PlyazContext.Provider value={contextValue}>{children}</PlyazContext.Provider>\n    </ApiProvider>\n  );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Access all Plyaz services\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const { api, events, isReady, featureFlags } = usePlyaz();\n *\n *   if (!isReady) return <Loading />;\n *\n *   const handleClick = async () => {\n *     const response = await api.getClient().get('/data');\n *     events.emit('data:fetched', { data: response.data });\n *   };\n *\n *   return <button onClick={handleClick}>Fetch</button>;\n * }\n * ```\n */\nexport function usePlyaz(): PlyazContextValue {\n  const context = useContext(PlyazContext);\n  if (!context) {\n    throw new CorePackageError(\n      'usePlyaz must be used within a PlyazProvider. ' +\n        'Wrap your app with <PlyazProvider config={...}>...</PlyazProvider>',\n      ERROR_CODES.CORE_PROVIDER_NOT_FOUND\n    );\n  }\n  return context;\n}\n\n/**\n * Access API client directly\n *\n * @example\n * ```tsx\n * function UserList() {\n *   const api = useApi();\n *   const [users, setUsers] = useState([]);\n *\n *   useEffect(() => {\n *     api.getClient().get('/users').then(res => setUsers(res.data));\n *   }, [api]);\n *\n *   return <ul>{users.map(u => <li key={u.id}>{u.name}</li>)}</ul>;\n * }\n * ```\n */\nexport function useApi(): typeof ApiClientService {\n  const { api, isReady } = usePlyaz();\n  if (!isReady || !api) {\n    throw new CorePackageError(\n      'API client is not ready. Make sure PlyazProvider has finished initializing.',\n      ERROR_CODES.CORE_PROVIDER_INITIALIZATION_FAILED\n    );\n  }\n  return api;\n}\n\n/**\n * Access API client safely (returns null if not ready)\n */\nexport function useApiSafe(): typeof ApiClientService | null {\n  const { api } = usePlyaz();\n  return api;\n}\n\n/**\n * Access event manager\n *\n * @example\n * ```tsx\n * function NotificationListener() {\n *   const events = useEvents();\n *\n *   useEffect(() => {\n *     const unsubscribe = events.on('notification:received', (event) => {\n *       toast.show(event.data.message);\n *     });\n *     return unsubscribe;\n *   }, [events]);\n *\n *   return null;\n * }\n * ```\n */\nexport function useEvents(): typeof CoreEventManager {\n  const { events } = usePlyaz();\n  return events;\n}\n\n/**\n * Check if a feature flag is enabled\n *\n * @example\n * ```tsx\n * function FeatureComponent() {\n *   const isEnabled = useFlag('NEW_DASHBOARD');\n *\n *   if (!isEnabled) return null;\n *   return <NewDashboard />;\n * }\n * ```\n */\nexport function useFlag(key: string, defaultValue = false): boolean {\n  const { featureFlags } = usePlyaz();\n  return featureFlags.get(key, defaultValue);\n}\n\n/**\n * Access feature flag utilities\n *\n * @example\n * ```tsx\n * function FlagManager() {\n *   const flags = useFeatureFlags();\n *   const allFlags = flags.getAll();\n *\n *   return (\n *     <div>\n *       <pre>{JSON.stringify(allFlags, null, 2)}</pre>\n *       <button onClick={flags.refresh}>Refresh Flags</button>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useFeatureFlags(): PlyazContextValue['featureFlags'] {\n  const { featureFlags } = usePlyaz();\n  return featureFlags;\n}\n\n/**\n * Check if Plyaz services are ready\n *\n * @example\n * ```tsx\n * function LoadingAwareComponent() {\n *   const isReady = usePlyazReady();\n *\n *   if (!isReady) return <Skeleton />;\n *   return <ActualContent />;\n * }\n * ```\n */\nexport function usePlyazReady(): boolean {\n  const { isReady } = usePlyaz();\n  return isReady;\n}\n\n/**\n * Get current app context\n */\nexport function useAppContext(): CoreAppContext {\n  const { appContext } = usePlyaz();\n  return appContext;\n}\n\n/**\n * Get current environment\n */\nexport function useEnvironment(): CoreAppEnvironment {\n  const { environment } = usePlyaz();\n  return environment;\n}\n\n/**\n * Get a domain service by key.\n * Services must be registered in the `services` config.\n *\n * @param key - Service key (e.g., 'featureFlags', 'example')\n * @returns The service instance\n * @throws If service is not initialized or not found\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const flagService = useService<FeatureFlagDomainService>('featureFlags');\n *\n *   useEffect(() => {\n *     flagService.isEnabled('my-flag').then(console.log);\n *   }, [flagService]);\n *\n *   return <div>...</div>;\n * }\n * ```\n */\nexport function useService<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n  key: string\n): T {\n  const { getService, isReady } = usePlyaz();\n\n  if (!isReady) {\n    throw new CorePackageError(\n      `PlyazProvider not ready. Cannot get service '${key}'.`,\n      ERROR_CODES.CORE_PROVIDER_INITIALIZATION_FAILED\n    );\n  }\n\n  return useMemo(() => getService<T>(key), [getService, key]);\n}\n\n/**\n * Get a domain service by key with loading state.\n * Useful for lazy-initialized services.\n *\n * @param key - Service key\n * @returns Object with service, loading state, and error\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const { service, isLoading, error } = useServiceAsync<ExampleDomainService>('example');\n *\n *   if (isLoading) return <Spinner />;\n *   if (error) return <Error message={error.message} />;\n *\n *   return <div>{service?.serviceName}</div>;\n * }\n * ```\n */\nexport function useServiceAsync<T extends CoreDomainServiceInstance = CoreDomainServiceInstance>(\n  key: string\n): { service: T | null; isLoading: boolean; error: Error | null } {\n  const { getServiceAsync, isReady } = usePlyaz();\n  const [service, setService] = useState<T | null>(null);\n  const [isLoading, setIsLoading] = useState(true);\n  const [error, setError] = useState<Error | null>(null);\n\n  useEffect(() => {\n    if (!isReady) return;\n\n    let mounted = true;\n\n    const loadService = async (): Promise<void> => {\n      try {\n        setIsLoading(true);\n        const svc = await getServiceAsync<T>(key);\n        if (mounted) {\n          setService(svc);\n          setIsLoading(false);\n        }\n      } catch (err) {\n        if (mounted) {\n          setError(err instanceof Error ? err : new Error(String(err)));\n          setIsLoading(false);\n        }\n      }\n    };\n\n    void loadService();\n\n    return () => {\n      mounted = false;\n    };\n  }, [key, getServiceAsync, isReady]);\n\n  return { service, isLoading, error };\n}\n\n/**\n * Check if a service is registered and available\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const hasFlags = useHasService('featureFlags');\n *\n *   if (!hasFlags) {\n *     return <div>Feature flags not configured</div>;\n *   }\n *\n *   return <FeatureFlagUI />;\n * }\n * ```\n */\nexport function useHasService(key: string): boolean {\n  const { hasService } = usePlyaz();\n  return hasService(key);\n}\n\n/**\n * Get all initialized service keys\n *\n * @example\n * ```tsx\n * function DebugPanel() {\n *   const serviceKeys = useServiceKeys();\n *\n *   return (\n *     <div>\n *       <h3>Loaded Services:</h3>\n *       <ul>\n *         {serviceKeys.map(key => <li key={key}>{key}</li>)}\n *       </ul>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useServiceKeys(): string[] {\n  const { getServiceKeys } = usePlyaz();\n  return getServiceKeys();\n}\n\n// ============================================================================\n// Exports\n// ============================================================================\n\nexport { PlyazContext };\nexport { Core };\n","/**\n * Files Hook\n *\n * React hook for accessing Files service operations.\n * Uses ServiceRegistry for service access - the service handles all\n * data transformation, validation, and API calls.\n *\n * For most cases, use hooks directly from @plyaz/api/src/services.\n * This hook is for cases where you need integration with the domain service.\n *\n * @example\n * ```typescript\n * const { service, isLoading, error } = useFilesService();\n *\n * // Use service methods\n * const items = await service.fetchAll();\n * const item = await service.create({ name: 'New' });\n * ```\n */\n\nimport { useServiceAsync, useService } from '../providers';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport type { FrontendFilesDomainService } from '../../domain/files';\nimport type { UseServiceAsyncResult } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Key\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Service key for Files in ServiceRegistry */\nexport const FILES_SERVICE_KEY = 'files';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hooks\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for Files service (async - with loading state)\n *\n * Use this when the service may be lazily initialized.\n * Returns { service, isLoading, error }.\n *\n * @example\n * ```typescript\n * const { service, isLoading, error } = useFilesService();\n * const items = await service.fetchAll();\n * ```\n */\nexport function useFilesService(): UseServiceAsyncResult<FrontendFilesDomainService> {\n  return useServiceAsync<FrontendFilesDomainService>(FILES_SERVICE_KEY);\n}\n\n/**\n * Hook for Files service (sync - throws if not ready)\n *\n * Use this when you're sure the service is already initialized.\n * Throws if service is not available.\n *\n * @example\n * ```typescript\n * const service = useFilesServiceSync();\n * const item = await service.create({ name: 'New' });\n * ```\n */\nexport function useFilesServiceSync(): FrontendFilesDomainService {\n  return useService<FrontendFilesDomainService>(FILES_SERVICE_KEY);\n}\n\n/**\n * Get Files service directly from registry (non-hook)\n *\n * Use this in callbacks or outside React components.\n *\n * @example\n * ```typescript\n * // In a callback\n * const handleSubmit = async () => {\n *   const service = await getFilesService();\n *   await service.create(data);\n * };\n *\n * // In a store action\n * const myStore = create((set) => ({\n *   create: async (data) => {\n *     const service = await getFilesService();\n *     const entity = await service.create(data);\n *     set({ entity });\n *   },\n * }));\n * ```\n */\nexport async function getFilesService(): Promise<FrontendFilesDomainService> {\n  return ServiceRegistry.getAsync<FrontendFilesDomainService>(FILES_SERVICE_KEY);\n}\n\n/**\n * Create service accessor for Zustand stores\n *\n * @example\n * ```typescript\n * import { createFilesServiceAccessor } from './useFiles';\n *\n * const getFiles = createFilesServiceAccessor();\n *\n * const myStore = create((set) => ({\n *   items: [],\n *   fetch: async () => {\n *     const service = await getFiles();\n *     const items = await service.fetchAll();\n *     set({ items });\n *   },\n * }));\n * ```\n */\nexport function createFilesServiceAccessor(): () => Promise<FrontendFilesDomainService> {\n  return () => ServiceRegistry.getAsync<FrontendFilesDomainService>(FILES_SERVICE_KEY);\n}\n","/**\n * useAllFileProgress Hook\n *\n * Composite hook that merges upload, download, and generate progress into a unified format.\n * Reduces complexity in components that need to track multiple file operations.\n *\n * @example Basic usage\n * ```typescript\n * const { items, hasActive, overallPercentage } = useAllFileProgress();\n *\n * if (hasActive) {\n *   return <ProgressBar value={overallPercentage} />;\n * }\n * ```\n *\n * @example With filtering\n * ```typescript\n * const { items } = useAllFileProgress({\n *   types: ['upload', 'download'],\n *   includeCompleted: false,\n *   filterByIds: ['file-123', 'file-456'],\n * });\n * ```\n */\n\nimport { useMemo } from 'react';\nimport { useUploadProgress, useDownloadProgress, useGenerateProgress } from '@plyaz/store';\nimport type {\n  CoreAllFileProgressOptions,\n  CoreAllFileProgressResult,\n  CoreFileProgressItem,\n  CoreFileOperationStatus,\n} from '@plyaz/types/core';\n\n/**\n * Composite hook for tracking all file operation progress.\n *\n * Merges upload, download, and generate progress from the store into a\n * unified format for easier UI rendering.\n *\n * @param options - Filter and display options\n * @returns Unified progress items and aggregate stats\n */\nexport function useAllFileProgress(\n  options: CoreAllFileProgressOptions = {}\n): CoreAllFileProgressResult {\n  const { filterByIds, includeCompleted = false, includeFailed = true, types } = options;\n\n  const uploadProgress = useUploadProgress();\n  const downloadProgress = useDownloadProgress();\n  const generateProgress = useGenerateProgress();\n\n  return useMemo(() => {\n    const items: CoreFileProgressItem[] = [];\n\n    // Process upload progress\n    if (!types || types.includes('upload')) {\n      for (const [id, progress] of Object.entries(uploadProgress)) {\n        if (filterByIds && !filterByIds.includes(id)) continue;\n        if (!includeCompleted && progress.status === 'completed') continue;\n        if (!includeFailed && progress.status === 'failed') continue;\n\n        items.push({\n          id,\n          type: 'upload',\n          percentage: progress.percentage ?? 0,\n          loaded: progress.loaded ?? 0,\n          total: progress.total ?? 0,\n          status: progress.status as CoreFileOperationStatus,\n          filename: progress.filename,\n          error: progress.error,\n        });\n      }\n    }\n\n    // Process download progress\n    if (!types || types.includes('download')) {\n      for (const [id, progress] of Object.entries(downloadProgress)) {\n        if (filterByIds && !filterByIds.includes(id)) continue;\n        if (!includeCompleted && progress.status === 'completed') continue;\n        if (!includeFailed && progress.status === 'failed') continue;\n\n        items.push({\n          id,\n          type: 'download',\n          percentage: progress.percentage ?? 0,\n          loaded: progress.loaded ?? 0,\n          total: progress.total ?? 0,\n          status: progress.status as CoreFileOperationStatus,\n          filename: progress.filename,\n          error: progress.error,\n        });\n      }\n    }\n\n    // Process generate progress\n    if (generateProgress && (!types || types.includes('generate'))) {\n      const shouldInclude =\n        (!filterByIds || filterByIds.includes(generateProgress.templateId)) &&\n        (includeCompleted || generateProgress.status !== 'completed') &&\n        (includeFailed || generateProgress.status !== 'failed');\n\n      if (shouldInclude) {\n        items.push({\n          id: generateProgress.templateId,\n          type: 'generate',\n          percentage: generateProgress.percentage ?? 0,\n          loaded: 0,\n          total: 0,\n          status: generateProgress.status as CoreFileOperationStatus,\n          error: generateProgress.error,\n        });\n      }\n    }\n\n    // Calculate counts\n    const counts = {\n      upload: items.filter(i => i.type === 'upload').length,\n      download: items.filter(i => i.type === 'download').length,\n      generate: items.filter(i => i.type === 'generate').length,\n      total: items.length,\n    };\n\n    // Calculate overall progress\n    const activeItems = items.filter(i => !['completed', 'failed', 'cancelled'].includes(i.status));\n    const overallPercentage =\n      activeItems.length > 0\n        ? Math.round(activeItems.reduce((sum, i) => sum + i.percentage, 0) / activeItems.length)\n        : 0;\n\n    return {\n      items,\n      counts,\n      hasActive: activeItems.length > 0,\n      overallPercentage,\n    };\n  }, [\n    uploadProgress,\n    downloadProgress,\n    generateProgress,\n    filterByIds,\n    includeCompleted,\n    includeFailed,\n    types,\n  ]);\n}\n","/**\n * useHasActiveFileOperations Hook\n *\n * Simple hook to check if any file operations (upload/download/generate) are active.\n * Useful for disabling UI elements or showing global loading indicators.\n *\n * @example\n * ```typescript\n * const hasActiveOps = useHasActiveFileOperations();\n *\n * return (\n *   <button disabled={hasActiveOps}>\n *     {hasActiveOps ? 'Working...' : 'Submit'}\n *   </button>\n * );\n * ```\n */\n\nimport { useHasActiveUploads, useHasActiveDownloads, useGenerateProgress } from '@plyaz/store';\n\n/**\n * Check if any file operations are currently active.\n *\n * @returns true if any upload, download, or generate operation is in progress\n */\nexport function useHasActiveFileOperations(): boolean {\n  const hasActiveUploads = useHasActiveUploads();\n  const hasActiveDownloads = useHasActiveDownloads();\n  const generateProgress = useGenerateProgress();\n\n  const hasActiveGenerate =\n    generateProgress !== null &&\n    !['completed', 'failed', 'cancelled'].includes(generateProgress.status);\n\n  return hasActiveUploads || hasActiveDownloads || hasActiveGenerate;\n}\n","/**\n * useFileUpload Hook\n *\n * Hook for uploading files with progress tracking.\n * Progress is tracked globally via store (updated by streams).\n * Errors propagate through global error handling (error boundaries, global error store).\n *\n * @returns {CoreFileUploadResult} Object containing:\n * - `upload` - Upload a single file\n * - `uploadMultiple` - Upload multiple files in parallel\n * - `isUploading` - Whether any upload is in progress\n * - `currentFileIds` - IDs of files currently uploading\n * - `progress` - Overall upload progress (0-100)\n * - `cancel` - Cancel all active uploads\n *\n * @example Basic usage\n * ```typescript\n * const { upload, uploadMultiple, isUploading, currentFileIds, progress, cancel } = useFileUpload();\n *\n * const handleUpload = async (file: File) => {\n *   const result = await upload(file, {\n *     entityType: 'user',\n *     entityId: '123',\n *     category: 'documents',\n *   });\n *   console.log('Uploaded:', result);\n * };\n *\n * return (\n *   <button onClick={() => handleUpload(file)} disabled={isUploading}>\n *     {isUploading ? `Uploading ${progress}%` : 'Upload'}\n *   </button>\n * );\n * ```\n *\n * @example Bulk upload\n * ```typescript\n * const { uploadMultiple, isUploading, cancel } = useFileUpload();\n *\n * const handleBulkUpload = async (files: FileList) => {\n *   const results = await uploadMultiple(Array.from(files), {\n *     entityType: 'project',\n *     entityId: 'proj-456',\n *   });\n * };\n *\n * // Cancel all uploads\n * cancel();\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useHasActiveUploads, useOverallUploadProgress, useUploadProgress } from '@plyaz/store';\nimport { abortRequest, getEndpointUrl } from '@plyaz/api';\nimport type { ServiceOptions } from '@plyaz/types/api';\nimport {\n  SERVICE_KEYS,\n  type CoreFileUploadOptions,\n  type CoreFileUploadResult,\n  type CoreTemplateUploadOptions,\n  type CoreGenerateOptions,\n  type CoreBulkTemplateUploadOptions,\n} from '@plyaz/types/core';\nimport { FILE_CATEGORY, ENTITY_TYPE } from '@plyaz/types/storage';\nimport type { FrontendFilesDomainService } from '../../../domain/files';\nimport { useService } from '../../providers/PlyazProvider';\nimport { fileToBase64 } from '../../../utils/files';\n\n/** Options for building upload params */\ninterface BuildUploadParamsOptions {\n  entityType: ENTITY_TYPE;\n  entityId: string;\n  category: FILE_CATEGORY;\n  isPublic: boolean;\n}\n\n/** Upload params result from buildUploadParams */\ninterface UploadParams {\n  base64: string;\n  filename: string;\n  mimeType: string;\n  isPublic: boolean;\n  entityType: ENTITY_TYPE;\n  entityId: string;\n  category: FILE_CATEGORY;\n}\n\n/** Build upload params from file and options */\nasync function buildUploadParams(\n  file: File,\n  options: BuildUploadParamsOptions\n): Promise<UploadParams> {\n  return {\n    base64: await fileToBase64(file),\n    filename: file.name,\n    mimeType: file.type || 'application/octet-stream',\n    isPublic: options.isPublic,\n    entityType: options.entityType,\n    entityId: options.entityId,\n    category: options.category,\n  };\n}\n\n/** Create upload from template handler */\nfunction createUploadFromTemplate(filesService: FrontendFilesDomainService) {\n  return async (\n    options: CoreTemplateUploadOptions,\n    serviceOptions?: ServiceOptions\n  ): Promise<unknown> => {\n    const {\n      templateId,\n      templateData,\n      outputFormat = 'pdf',\n      locale = 'en',\n      pdfOptions,\n      entityType = ENTITY_TYPE.SYSTEM,\n      entityId = 'default',\n      category = FILE_CATEGORY.DOCUMENT,\n    } = options;\n    return filesService.uploadFile(\n      {\n        templateId,\n        templateData,\n        outputFormat,\n        locale,\n        pdfOptions,\n        entityType,\n        entityId,\n        category,\n      },\n      serviceOptions\n    );\n  };\n}\n\n/** Create bulk template upload handler */\nfunction createUploadMultipleFromTemplate(filesService: FrontendFilesDomainService) {\n  return async (\n    bulkOptions: CoreBulkTemplateUploadOptions,\n    serviceOptions?: ServiceOptions\n  ): Promise<unknown[]> => {\n    const { files, options = {} } = bulkOptions;\n    const { concurrency = 2, continueOnError = true } = options;\n    const uploadItems = files.map(file => ({\n      templateId: file.templateId,\n      templateData: file.templateData,\n      outputFormat: file.outputFormat ?? 'pdf',\n      locale: file.locale ?? 'en',\n      pdfOptions: file.pdfOptions,\n      entityType: file.entityType ?? ENTITY_TYPE.SYSTEM,\n      entityId: file.entityId ?? 'default',\n      category: file.category ?? FILE_CATEGORY.DOCUMENT,\n      filename: file.filename,\n      mimeType: file.mimeType,\n    }));\n    const response = await filesService.uploadFiles(\n      {\n        files: uploadItems,\n        options: { concurrency, continueOnError },\n      },\n      serviceOptions\n    );\n    return response.results ?? [];\n  };\n}\n\n/** Create generate document handler */\nfunction createGenerate(filesService: FrontendFilesDomainService) {\n  return async (\n    options: CoreGenerateOptions,\n    serviceOptions?: ServiceOptions\n  ): Promise<{ buffer: string; size: number }> => {\n    const {\n      templateId,\n      templateData,\n      outputFormat = 'pdf',\n      locale = 'en',\n      pdfOptions,\n      rendererName,\n      validation,\n    } = options;\n    return filesService.generateFile(\n      {\n        templateId,\n        templateData,\n        outputFormat,\n        locale,\n        pdfOptions,\n        ...(rendererName ? { rendererName } : {}),\n        ...(validation ? { validation } : {}),\n      },\n      serviceOptions\n    );\n  };\n}\n\n/**\n * Hook for uploading files with progress tracking.\n * @returns Upload functions and state\n */\nexport function useFileUpload(): CoreFileUploadResult {\n  const filesService = useService<FrontendFilesDomainService>(SERVICE_KEYS.FILES_FRONTEND);\n  const isUploading = useHasActiveUploads();\n  const progress = useOverallUploadProgress();\n  const uploadProgress = useUploadProgress();\n\n  const currentFileIds = useMemo(\n    () =>\n      Object.keys(uploadProgress).filter(\n        id => uploadProgress[id]?.status !== 'completed' && uploadProgress[id]?.status !== 'failed'\n      ),\n    [uploadProgress]\n  );\n\n  const upload = useCallback(\n    async (\n      file: File,\n      options: CoreFileUploadOptions = {},\n      serviceOptions?: ServiceOptions\n    ): Promise<unknown> => {\n      const {\n        entityType = ENTITY_TYPE.SYSTEM,\n        entityId = 'default',\n        category = FILE_CATEGORY.ATTACHMENT,\n        isPublic = false,\n      } = options;\n      const uploadParams = await buildUploadParams(file, {\n        entityType,\n        entityId,\n        category,\n        isPublic,\n      });\n      return filesService.uploadFile(uploadParams, serviceOptions);\n    },\n    [filesService]\n  );\n\n  const uploadMultiple = useCallback(\n    async (\n      files: File[],\n      options: CoreFileUploadOptions = {},\n      serviceOptions?: ServiceOptions\n    ): Promise<unknown[]> => {\n      const {\n        entityType = ENTITY_TYPE.SYSTEM,\n        entityId = 'default',\n        category = FILE_CATEGORY.ATTACHMENT,\n        isPublic = false,\n      } = options;\n      const buildOptions = { entityType, entityId, category, isPublic };\n      const uploadItems = await Promise.all(\n        files.map(file => buildUploadParams(file, buildOptions))\n      );\n      const response = await filesService.uploadFiles({ files: uploadItems }, serviceOptions);\n      return response.results ?? [];\n    },\n    [filesService]\n  );\n\n  // Use extracted helper functions for template operations (memoized)\n  const uploadFromTemplate = useMemo(() => createUploadFromTemplate(filesService), [filesService]);\n  const uploadMultipleFromTemplate = useMemo(\n    () => createUploadMultipleFromTemplate(filesService),\n    [filesService]\n  );\n  const generate = useMemo(() => createGenerate(filesService), [filesService]);\n\n  const cancel = useCallback(() => {\n    void abortRequest(getEndpointUrl('uploadFile'));\n    void abortRequest(getEndpointUrl('uploadFiles'));\n    void abortRequest(getEndpointUrl('generateDocument'));\n  }, []);\n\n  return {\n    upload,\n    uploadMultiple,\n    uploadFromTemplate,\n    uploadMultipleFromTemplate,\n    generate,\n    isUploading,\n    currentFileIds,\n    progress,\n    cancel,\n  };\n}\n","/**\n * useFileDownload Hook\n *\n * Hook for downloading files with progress tracking and browser download triggering.\n * Progress is tracked globally via store (updated by streams).\n * Errors propagate through global error handling (error boundaries, global error store).\n *\n * @returns {CoreFileDownloadResult} Object containing:\n * - `download` - Download a file by ID, returns Blob or null\n * - `isDownloading` - Whether any download is in progress\n * - `currentFileId` - ID of file currently downloading (or null)\n * - `progress` - Overall download progress (0-100)\n * - `cancel` - Cancel all active downloads\n *\n * @example Basic usage\n * ```typescript\n * const { download, isDownloading, progress, cancel } = useFileDownload();\n *\n * const handleDownload = async () => {\n *   const blob = await download('file-123');\n *   if (blob) console.log('Downloaded', blob.size, 'bytes');\n * };\n *\n * return (\n *   <button onClick={handleDownload} disabled={isDownloading}>\n *     {isDownloading ? `Downloading ${progress}%` : 'Download'}\n *   </button>\n * );\n * ```\n *\n * @example With custom filename\n * ```typescript\n * await download('file-123', { filename: 'custom-name.pdf' });\n * ```\n */\n\nimport { useCallback, useMemo } from 'react';\nimport {\n  useHasActiveDownloads,\n  useDownloadProgress,\n  useOverallDownloadProgress,\n} from '@plyaz/store';\nimport { abortRequest, endpointCachePattern } from '@plyaz/api';\nimport type { ServiceOptions } from '@plyaz/types/api';\nimport { base64ToBlob, downloadBlob, getFilenameFromKey } from '../../../utils/files';\nimport {\n  SERVICE_KEYS,\n  type CoreFileDownloadOptions,\n  type CoreFileDownloadResult,\n} from '@plyaz/types/core';\nimport type { FrontendFilesDomainService } from '../../../domain/files';\nimport { useService } from '../../providers/PlyazProvider';\n\n/**\n * Hook for downloading files with progress tracking.\n *\n * Features:\n * - Tracks download progress in real-time via store (updated by streams)\n * - Auto-triggers browser download on completion\n * - Supports custom filenames\n * - Provides cancel functionality via @plyaz/api\n * - Errors propagate to global error handling\n *\n * @returns Download function and state\n */\nexport function useFileDownload(): CoreFileDownloadResult {\n  // Get files service via useService\n  const filesService = useService<FrontendFilesDomainService>(SERVICE_KEYS.FILES_FRONTEND);\n\n  // Get state from store hooks (updated by streams)\n  const isDownloading = useHasActiveDownloads();\n  const progress = useOverallDownloadProgress();\n  const downloadProgress = useDownloadProgress();\n\n  // Derive current file ID from active downloads in store\n  const currentFileId = useMemo(\n    () =>\n      Object.keys(downloadProgress).find(\n        id =>\n          downloadProgress[id]?.status === 'downloading' ||\n          downloadProgress[id]?.status === 'pending'\n      ) ?? null,\n    [downloadProgress]\n  );\n\n  const download = useCallback(\n    async (\n      fileId: string,\n      options: CoreFileDownloadOptions = {},\n      serviceOptions?: ServiceOptions\n    ): Promise<Blob | null> => {\n      const { autoDownload = true, filename } = options;\n\n      // Call download method - store is updated automatically by service/streams\n      // Errors propagate to global error handling\n      const response = await filesService.download({ id: fileId }, serviceOptions);\n\n      // Convert base64 to blob\n      const blob = base64ToBlob(response.buffer, response.mimeType);\n\n      // Determine filename\n      const downloadFilename = filename ?? response.filename ?? getFilenameFromKey(fileId);\n\n      // Trigger browser download if autoDownload is enabled\n      if (autoDownload) {\n        downloadBlob(blob, downloadFilename);\n      }\n\n      return blob;\n    },\n    [filesService]\n  );\n\n  const cancel = useCallback(() => {\n    // Abort all download requests via @plyaz/api using endpoint patterns\n    void abortRequest(endpointCachePattern('downloadFile'));\n  }, []);\n\n  return {\n    download,\n    isDownloading,\n    currentFileId,\n    progress,\n    cancel,\n  };\n}\n","/**\n * useFile Hook\n *\n * Hook for file metadata operations (read-only).\n * Provides fetchById, getSignedUrl, and exists methods.\n *\n * @returns {CoreFileResult} Object containing:\n * - `fetchById` - Fetch file metadata by ID\n * - `getSignedUrl` - Get signed URL for a file\n * - `exists` - Check if a file exists\n *\n * @example Basic usage\n * ```typescript\n * const { fetchById, getSignedUrl, exists } = useFile();\n *\n * const metadata = await fetchById('file-123');\n * const { url, expiresAt } = await getSignedUrl('file-123');\n * const fileExists = await exists('file-123');\n * ```\n */\n\nimport { useCallback } from 'react';\nimport { SERVICE_KEYS, type CoreFileResult } from '@plyaz/types/core';\nimport type { FrontendFilesDomainService } from '../../../domain/files';\nimport { useService } from '../../providers/PlyazProvider';\n\n/**\n * Hook for file metadata operations.\n * @returns Metadata functions\n */\nexport function useFile(): CoreFileResult {\n  const filesService = useService<FrontendFilesDomainService>(SERVICE_KEYS.FILES_FRONTEND);\n\n  /**\n   * Fetch file metadata by ID\n   */\n  const fetchById = useCallback(\n    async (fileId: string): Promise<unknown> => {\n      return filesService.fetchById(fileId);\n    },\n    [filesService]\n  );\n\n  /**\n   * Get signed URL for a file\n   */\n  const getSignedUrl = useCallback(\n    async (fileId: string): Promise<{ url: string; expiresAt: string }> => {\n      return filesService.getSignedUrlForFile({ id: fileId });\n    },\n    [filesService]\n  );\n\n  /**\n   * Check if a file exists\n   */\n  const exists = useCallback(\n    async (fileId: string): Promise<boolean> => {\n      try {\n        await filesService.fetchById(fileId);\n        return true;\n      } catch {\n        return false;\n      }\n    },\n    [filesService]\n  );\n\n  return {\n    fetchById,\n    getSignedUrl,\n    exists,\n  };\n}\n","/**\n * useFileDelete Hook\n *\n * Hook for file deletion operations.\n * Provides deleteFile and deleteMultiple methods.\n *\n * @returns {CoreFileDeleteResult} Object containing:\n * - `deleteFile` - Delete a file by ID\n * - `deleteMultiple` - Delete multiple files by IDs\n * - `isDeleting` - Whether currently deleting\n *\n * @example Basic usage\n * ```typescript\n * const { deleteFile, deleteMultiple, isDeleting } = useFileDelete();\n *\n * await deleteFile('file-123');\n * await deleteMultiple(['file-1', 'file-2'], { soft: true });\n * ```\n */\n\nimport { useCallback, useState } from 'react';\nimport { SERVICE_KEYS, type CoreFileDeleteResult } from '@plyaz/types/core';\nimport type { FrontendFilesDomainService } from '../../../domain/files';\nimport { useService } from '../../providers/PlyazProvider';\n\n/**\n * Hook for file deletion operations.\n * @returns Delete functions and state\n */\nexport function useFileDelete(): CoreFileDeleteResult {\n  const filesService = useService<FrontendFilesDomainService>(SERVICE_KEYS.FILES_FRONTEND);\n  const [isDeleting, setIsDeleting] = useState(false);\n\n  /**\n   * Delete a file by ID\n   */\n  const deleteFile = useCallback(\n    async (fileId: string): Promise<void> => {\n      setIsDeleting(true);\n      try {\n        await filesService.delete(fileId);\n      } finally {\n        setIsDeleting(false);\n      }\n    },\n    [filesService]\n  );\n\n  /**\n   * Delete multiple files by IDs\n   */\n  const deleteMultiple = useCallback(\n    async (fileIds: string[], options?: { soft?: boolean }): Promise<unknown> => {\n      setIsDeleting(true);\n      try {\n        // Use bulk delete API endpoint\n        const response = await fetch('/api/files/bulk', {\n          method: 'DELETE',\n          headers: { 'Content-Type': 'application/json' },\n          body: JSON.stringify({ ids: fileIds, soft: options?.soft ?? false }),\n        });\n        return response.json();\n      } finally {\n        setIsDeleting(false);\n      }\n    },\n    []\n  );\n\n  return {\n    deleteFile,\n    deleteMultiple,\n    isDeleting,\n  };\n}\n","/**\n * Notifications Hook\n *\n * React hook for accessing Notifications service operations.\n * Uses ServiceRegistry for service access - the service handles all\n * data transformation, validation, and API calls.\n *\n * For most cases, use hooks directly from @plyaz/api/src/services.\n * This hook is for cases where you need integration with the domain service.\n *\n * @example\n * ```typescript\n * const { service, isLoading, error } = useNotificationsService();\n *\n * // Use service methods\n * const items = await service.fetchAll();\n * const item = await service.create({ name: 'New' });\n * ```\n */\n\nimport { useServiceAsync, useService } from '../providers';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport type { FrontendNotificationsDomainService } from '../../domain/notifications';\nimport type { UseServiceAsyncResult } from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Key\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** Service key for Notifications in ServiceRegistry */\nexport const NOTIFICATIONS_SERVICE_KEY = 'notifications';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hooks\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for Notifications service (async - with loading state)\n *\n * Use this when the service may be lazily initialized.\n * Returns { service, isLoading, error }.\n *\n * @example\n * ```typescript\n * const { service, isLoading, error } = useNotificationsService();\n * const items = await service.fetchAll();\n * ```\n */\nexport function useNotificationsService(): UseServiceAsyncResult<FrontendNotificationsDomainService> {\n  return useServiceAsync<FrontendNotificationsDomainService>(NOTIFICATIONS_SERVICE_KEY);\n}\n\n/**\n * Hook for Notifications service (sync - throws if not ready)\n *\n * Use this when you're sure the service is already initialized.\n * Throws if service is not available.\n *\n * @example\n * ```typescript\n * const service = useNotificationsServiceSync();\n * const item = await service.create({ name: 'New' });\n * ```\n */\nexport function useNotificationsServiceSync(): FrontendNotificationsDomainService {\n  return useService<FrontendNotificationsDomainService>(NOTIFICATIONS_SERVICE_KEY);\n}\n\n/**\n * Get Notifications service directly from registry (non-hook)\n *\n * Use this in callbacks or outside React components.\n *\n * @example\n * ```typescript\n * // In a callback\n * const handleSubmit = async () => {\n *   const service = await getNotificationsService();\n *   await service.create(data);\n * };\n *\n * // In a store action\n * const myStore = create((set) => ({\n *   create: async (data) => {\n *     const service = await getNotificationsService();\n *     const entity = await service.create(data);\n *     set({ entity });\n *   },\n * }));\n * ```\n */\nexport async function getNotificationsService(): Promise<FrontendNotificationsDomainService> {\n  return ServiceRegistry.getAsync<FrontendNotificationsDomainService>(NOTIFICATIONS_SERVICE_KEY);\n}\n\n/**\n * Create service accessor for Zustand stores\n *\n * @example\n * ```typescript\n * import { createNotificationsServiceAccessor } from './useNotifications';\n *\n * const getNotifications = createNotificationsServiceAccessor();\n *\n * const myStore = create((set) => ({\n *   items: [],\n *   fetch: async () => {\n *     const service = await getNotifications();\n *     const items = await service.fetchAll();\n *     set({ items });\n *   },\n * }));\n * ```\n */\nexport function createNotificationsServiceAccessor(): () => Promise<FrontendNotificationsDomainService> {\n  return (): Promise<FrontendNotificationsDomainService> =>\n    ServiceRegistry.getAsync<FrontendNotificationsDomainService>(NOTIFICATIONS_SERVICE_KEY);\n}\n","/**\n * Service Accessors (Generic)\n *\n * Generic utilities for accessing services from stores.\n * These work with any domain service, not just feature flags.\n */\n\nimport type { CoreDomainServiceInstance } from '@plyaz/types/core';\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Service Accessors\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a service accessor function for use in stores.\n *\n * @param serviceKey - Key of the service in the registry\n * @returns Async function that returns the service instance\n *\n * @example\n * ```typescript\n * const getExampleService = createServiceAccessor<ExampleDomainService>('example');\n *\n * const myStoreSlice = {\n *   async createEntity(data) {\n *     const service = await getExampleService();\n *     return service.create(data);\n *   },\n * };\n * ```\n */\nexport function createServiceAccessor<T extends CoreDomainServiceInstance>(\n  serviceKey: string\n): () => Promise<T> {\n  return () => ServiceRegistry.getAsync<T>(serviceKey);\n}\n\n/**\n * Create multiple service accessors at once.\n *\n * @param keys - Object mapping accessor names to service keys\n * @returns Object with accessor functions\n *\n * @example\n * ```typescript\n * const services = createServiceAccessors({\n *   flags: 'featureFlags',\n *   examples: 'example',\n *   users: 'users',\n * });\n *\n * const flags = await services.flags();\n * const example = await services.examples();\n * ```\n */\nexport function createServiceAccessors<T extends Record<string, string>>(\n  keys: T\n): { [K in keyof T]: () => Promise<CoreDomainServiceInstance> } {\n  const accessors = {} as { [K in keyof T]: () => Promise<CoreDomainServiceInstance> };\n\n  for (const [name, key] of Object.entries(keys)) {\n    accessors[name as keyof T] = createServiceAccessor(key);\n  }\n\n  return accessors;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Zustand Middleware\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a Zustand middleware that injects services into store actions.\n *\n * @param serviceKeys - Service keys to inject\n * @returns Zustand middleware function\n *\n * @example\n * ```typescript\n * import { create } from 'zustand';\n * import { withServices } from '@plyaz/core/frontend';\n *\n * interface MyStore {\n *   items: Item[];\n *   services: { example: ExampleDomainService };\n *   fetchItems: () => Promise<void>;\n * }\n *\n * const useMyStore = create<MyStore>(\n *   withServices(['example'], (set, get, services) => ({\n *     items: [],\n *     services,\n *     fetchItems: async () => {\n *       const items = await services.example.getAll();\n *       set({ items });\n *     },\n *   }))\n * );\n * ```\n */\nexport function withServices<TServices extends Record<string, CoreDomainServiceInstance>>(\n  serviceKeys: string[],\n  createStore: (set: (partial: unknown) => void, get: () => unknown, services: TServices) => unknown\n): (set: (partial: unknown) => void, get: () => unknown) => unknown {\n  return (set: (partial: unknown) => void, get: () => unknown): unknown => {\n    // Create lazy service proxies\n    const services = {} as TServices;\n\n    for (const key of serviceKeys) {\n      Object.defineProperty(services, key, {\n        get: () => ServiceRegistry.get(key),\n        enumerable: true,\n      });\n    }\n\n    return createStore(set, get, services);\n  };\n}\n","/**\n * Feature Flag Store Integration\n *\n * Utilities for integrating feature flags with Zustand stores.\n * Implements the \"pull\" pattern where stores fetch from services.\n */\n\nimport { ServiceRegistry } from '../../init/ServiceRegistry';\nimport type { FeatureFlagValue, FeatureFlagContext } from '@plyaz/types/features';\n\n// Re-export types from @plyaz/types/core\nexport type {\n  CoreFeatureFlagServiceLike,\n  CoreFeatureFlagFetcherOptions,\n  CoreFeatureFlagStoreInitConfig,\n} from '@plyaz/types/core';\n\n// Import for local use\nimport type {\n  CoreFeatureFlagServiceLike,\n  CoreFeatureFlagFetcherOptions,\n  CoreFeatureFlagStoreInitConfig,\n} from '@plyaz/types/core';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Fetcher Factory\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Create a fetchFn for feature flag store that uses ServiceRegistry.\n *\n * This bridges the ServiceRegistry with the store's callback-based pattern.\n * Use this for polling or manual refresh scenarios.\n *\n * @param options - Fetcher options\n * @returns A function compatible with store initialization\n *\n * @example\n * ```typescript\n * // Basic usage\n * const fetchFn = createFeatureFlagFetcher();\n *\n * // With context\n * const fetchFn = createFeatureFlagFetcher({\n *   context: { userId: currentUser.id },\n * });\n *\n * // Use in store initializer\n * useFeatureFlagInitializer({ fetchFn });\n * ```\n */\nexport function createFeatureFlagFetcher(\n  options: CoreFeatureFlagFetcherOptions = {}\n): () => Promise<Record<string, FeatureFlagValue>> {\n  const { serviceKey = 'featureFlags', context, transform } = options;\n\n  return async (): Promise<Record<string, FeatureFlagValue>> => {\n    const service = await ServiceRegistry.getAsync<CoreFeatureFlagServiceLike>(serviceKey);\n    const flags = await service.evaluateAll(context);\n\n    // Extract values from evaluations\n    const values: Record<string, FeatureFlagValue> = {};\n    for (const [key, evaluation] of Object.entries(flags)) {\n      if (evaluation && typeof evaluation === 'object' && 'value' in evaluation) {\n        values[key] = (evaluation as { value: FeatureFlagValue }).value;\n      } else {\n        values[key] = evaluation as FeatureFlagValue;\n      }\n    }\n\n    return transform ? transform(values) : values;\n  };\n}\n\n/**\n * Create full store initialization config with ServiceRegistry integration.\n *\n * @param options - Configuration options\n * @returns Config object for store initialization\n *\n * @example\n * ```typescript\n * const storeConfig = createFeatureFlagStoreConfig({\n *   context: { userId: user.id },\n *   defaults: { 'MY_FLAG': false },\n *   polling: { enabled: true, interval: 30000 },\n *   onFlagChange: (key, prev, next) => console.log(`${key}: ${prev} → ${next}`),\n * });\n *\n * useFeatureFlagInitializer(storeConfig);\n * ```\n */\nexport function createFeatureFlagStoreConfig(options: {\n  serviceKey?: string;\n  context?: FeatureFlagContext;\n  defaults?: Record<string, FeatureFlagValue>;\n  polling?: { enabled?: boolean; interval?: number };\n  onFlagChange?: (\n    key: string,\n    prevValue: FeatureFlagValue | undefined,\n    newValue: FeatureFlagValue\n  ) => void;\n  onError?: (error: unknown) => void;\n}): CoreFeatureFlagStoreInitConfig {\n  const { serviceKey, context, defaults, polling, onFlagChange, onError } = options;\n\n  return {\n    fetchFn: createFeatureFlagFetcher({ serviceKey, context }),\n    defaults,\n    polling,\n    onFlagChange,\n    onError,\n  };\n}\n"]}