{"version":3,"file":"lifecycle-manager.mjs","sources":["../../../src/lib/coordination/lifecycle-manager.ts"],"sourcesContent":["/**\n * @file Lifecycle Manager\n * @module coordination/lifecycle-manager\n * @description PhD-level library lifecycle orchestration with dependency resolution.\n *\n * Implements sophisticated lifecycle management with:\n * - Phased initialization with configurable ordering\n * - Dependency graph resolution for startup sequencing\n * - Parallel execution within phases for performance\n * - Graceful shutdown with reverse teardown\n * - Suspend/resume for memory pressure handling\n * - Health check aggregation\n * - Error recovery with retries\n *\n * @author Agent 5 - PhD TypeScript Architect\n * @version 1.0.0\n */\n\nimport {\n  type LibraryId,\n  type PhaseId,\n  type LibraryState,\n  type LibraryRegistration,\n  type LifecyclePhase,\n  type LifecycleManager,\n  type LifecycleManagerConfig,\n  DEFAULT_LIFECYCLE_CONFIG,\n  DEFAULT_LIFECYCLE_PHASES,\n  createLibraryId,\n  createPhaseId,\n} from './types';\nimport { publishEvent } from './event-bus';\n\n// ============================================================================\n// Internal Types\n// ============================================================================\n\n/**\n * Internal library entry with runtime metadata.\n */\ninterface LibraryEntry extends LibraryRegistration {\n  /** Initialization duration */\n  initDuration?: number;\n  /** Retry count */\n  retryCount: number;\n  /** Initialization promise for deduplication */\n  initPromise?: Promise<void>;\n}\n\n/**\n * Dependency resolution result.\n */\ninterface DependencyResolution {\n  /** Whether resolution succeeded */\n  success: boolean;\n  /** Ordered list of libraries to initialize */\n  order: LibraryId[];\n  /** Any circular dependencies detected */\n  cycles: LibraryId[][];\n  /** Missing dependencies */\n  missing: Array<{ library: LibraryId; dependency: LibraryId }>;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Performs topological sort for dependency ordering.\n * @param libraries - Map of library entries\n * @returns Dependency resolution result\n */\nfunction topologicalSort(libraries: Map<LibraryId, LibraryEntry>): DependencyResolution {\n  const result: DependencyResolution = {\n    success: true,\n    order: [],\n    cycles: [],\n    missing: [],\n  };\n\n  const visited = new Set<LibraryId>();\n  const visiting = new Set<LibraryId>();\n  const order: LibraryId[] = [];\n\n  function visit(id: LibraryId, path: LibraryId[]): boolean {\n    if (visited.has(id)) return true;\n    if (visiting.has(id)) {\n      // Cycle detected\n      const cycleStart = path.indexOf(id);\n      result.cycles.push(path.slice(cycleStart));\n      result.success = false;\n      return false;\n    }\n\n    const entry = libraries.get(id);\n    if (!entry) {\n      const lastPathElement = path[path.length - 1];\n      result.missing.push({ library: createLibraryId(lastPathElement ?? ''), dependency: id });\n      return true; // Continue despite missing dependency\n    }\n\n    visiting.add(id);\n\n    for (const dep of entry.dependencies) {\n      if (!visit(dep, [...path, dep])) {\n        return false;\n      }\n    }\n\n    visiting.delete(id);\n    visited.add(id);\n    order.push(id);\n    return true;\n  }\n\n  for (const id of libraries.keys()) {\n    if (!visited.has(id)) {\n      visit(id, [id]);\n    }\n  }\n\n  result.order = order;\n  return result;\n}\n\n/**\n * Groups libraries by phase.\n * @param libraries - Map of library entries\n * @param phases - Phase definitions\n * @returns Map of phase ID to library IDs\n */\nfunction groupByPhase(\n  libraries: Map<LibraryId, LibraryEntry>,\n  phases: LifecyclePhase[]\n): Map<PhaseId, LibraryId[]> {\n  const groups = new Map<PhaseId, LibraryId[]>();\n\n  // Initialize groups\n  for (const phase of phases) {\n    groups.set(phase.id, []);\n  }\n\n  // Assign libraries to phases\n  for (const [id, entry] of libraries) {\n    const group = groups.get(entry.phase);\n    if (group) {\n      group.push(id);\n    } else {\n      // Default to 'feature' phase\n      const featurePhase = phases.find((p) => p.name === 'Feature');\n      if (featurePhase) {\n        groups.get(featurePhase.id)?.push(id);\n      }\n    }\n  }\n\n  return groups;\n}\n\n/**\n * Executes functions with timeout.\n * @param fn - Function to execute\n * @param timeout - Timeout in milliseconds\n * @param label - Label for error messages\n */\nasync function withTimeout<T>(fn: () => Promise<T>, timeout: number, label: string): Promise<T> {\n  return new Promise<T>((resolve, reject) => {\n    const timeoutId = setTimeout(() => {\n      reject(new Error(`Timeout (${timeout}ms) for: ${label}`));\n    }, timeout);\n\n    fn()\n      .then((result) => {\n        clearTimeout(timeoutId);\n        resolve(result);\n      })\n      .catch((error: unknown) => {\n        clearTimeout(timeoutId);\n        reject(error instanceof Error ? error : new Error(String(error)));\n      });\n  });\n}\n\n// ============================================================================\n// LifecycleManagerImpl Class\n// ============================================================================\n\n/**\n * Implementation of the lifecycle manager.\n *\n * @example\n * ```typescript\n * const lifecycle = new LifecycleManagerImpl();\n *\n * // Register libraries\n * lifecycle.registerLibrary({\n *   id: createLibraryId('auth'),\n *   name: 'Authentication',\n *   version: '1.0.0',\n *   dependencies: [],\n *   phase: createPhaseId('core'),\n *   initialize: async () => {\n *     await authService.init();\n *   },\n *   cleanup: async () => {\n *     await authService.cleanup();\n *   },\n * });\n *\n * // Initialize all libraries\n * await lifecycle.initialize();\n * ```\n */\nexport class LifecycleManagerImpl implements LifecycleManager {\n  /** Configuration */\n  private readonly config: LifecycleManagerConfig;\n\n  /** Registered libraries */\n  private readonly libraries: Map<LibraryId, LibraryEntry> = new Map();\n\n  /** Initialization order (computed after resolution) */\n  private initializationOrder: LibraryId[] = [];\n\n  /** Overall initialization state */\n  private state: 'idle' | 'initializing' | 'initialized' | 'shutting-down' | 'shutdown' = 'idle';\n\n  /** Initialization promise for deduplication */\n  private initPromise: Promise<void> | null = null;\n\n  /** Shutdown promise for deduplication */\n  private shutdownPromise: Promise<void> | null = null;\n\n  /**\n   * Creates a new lifecycle manager.\n   * @param config - Configuration options\n   */\n  constructor(config: Partial<LifecycleManagerConfig> = {}) {\n    this.config = {\n      ...DEFAULT_LIFECYCLE_CONFIG,\n      ...config,\n      phases: config.phases ?? [...DEFAULT_LIFECYCLE_PHASES],\n    };\n  }\n\n  // ==========================================================================\n  // Public API\n  // ==========================================================================\n\n  /**\n   * Registers a library for lifecycle management.\n   * @param registration - Library registration\n   */\n  registerLibrary(registration: Omit<LibraryRegistration, 'state'>): void {\n    if (this.state !== 'idle') {\n      throw new Error('Cannot register libraries after initialization has started');\n    }\n\n    const entry: LibraryEntry = {\n      ...registration,\n      state: 'uninitialized',\n      retryCount: 0,\n    };\n\n    this.libraries.set(registration.id, entry);\n  }\n\n  /**\n   * Unregisters a library.\n   * @param id - Library ID\n   */\n  unregisterLibrary(id: LibraryId): void {\n    if (this.state !== 'idle') {\n      throw new Error('Cannot unregister libraries after initialization has started');\n    }\n\n    this.libraries.delete(id);\n  }\n\n  /**\n   * Initializes all registered libraries.\n   * @returns Promise that resolves when initialization completes\n   */\n  async initialize(): Promise<void> {\n    // Deduplicate concurrent init calls\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n\n    if (this.state === 'initialized') {\n      return;\n    }\n\n    this.initPromise = this.doInitialize();\n    try {\n      await this.initPromise;\n    } finally {\n      this.initPromise = null;\n    }\n  }\n\n  /**\n   * Shuts down all libraries in reverse order.\n   * @returns Promise that resolves when shutdown completes\n   */\n  async shutdown(): Promise<void> {\n    // Deduplicate concurrent shutdown calls\n    if (this.shutdownPromise) {\n      return this.shutdownPromise;\n    }\n\n    if (this.state === 'shutdown' || this.state === 'idle') {\n      return;\n    }\n\n    this.shutdownPromise = this.doShutdown();\n    try {\n      await this.shutdownPromise;\n    } finally {\n      this.shutdownPromise = null;\n    }\n  }\n\n  /**\n   * Gets the state of a library.\n   * @param id - Library ID\n   * @returns Library state or undefined\n   */\n  getLibraryState(id: LibraryId): LibraryState | undefined {\n    return this.libraries.get(id)?.state;\n  }\n\n  /**\n   * Gets all library states.\n   * @returns Map of library ID to state\n   */\n  getAllStates(): Map<LibraryId, LibraryState> {\n    const states = new Map<LibraryId, LibraryState>();\n    for (const [id, entry] of this.libraries) {\n      states.set(id, entry.state);\n    }\n    return states;\n  }\n\n  /**\n   * Checks if all libraries are initialized.\n   * @returns True if all libraries are running\n   */\n  isFullyInitialized(): boolean {\n    if (this.state !== 'initialized') return false;\n    for (const entry of this.libraries.values()) {\n      if (entry.state !== 'running') return false;\n    }\n    return true;\n  }\n\n  /**\n   * Performs health check on all libraries.\n   * @returns Map of library ID to health status\n   */\n  async healthCheck(): Promise<Map<LibraryId, boolean>> {\n    const results = new Map<LibraryId, boolean>();\n\n    const checks = Array.from(this.libraries.entries()).map(\n      async ([id, entry]): Promise<[LibraryId, boolean]> => {\n        if (!entry.healthCheck) {\n          // No health check = assume healthy if running\n          return [id, entry.state === 'running'];\n        }\n\n        try {\n          const healthy = await entry.healthCheck();\n          return [id, healthy];\n        } catch {\n          return [id, false];\n        }\n      }\n    );\n\n    const checkResults = await Promise.all(checks);\n    for (const [id, healthy] of checkResults) {\n      results.set(id, healthy);\n    }\n\n    return results;\n  }\n\n  /**\n   * Suspends low-priority libraries (e.g., for memory pressure).\n   * @returns Promise that resolves when suspension completes\n   */\n  async suspend(): Promise<void> {\n    const suspendable = Array.from(this.libraries.values()).filter(\n      (e) => e.suspend != null && e.state === 'running'\n    );\n\n    await Promise.all(\n      suspendable.map(async (entry) => {\n        try {\n          entry.state = 'suspending';\n          await entry.suspend?.();\n          entry.state = 'suspended';\n        } catch (error) {\n          entry.state = 'error';\n          entry.lastError = error instanceof Error ? error : new Error(String(error));\n        }\n      })\n    );\n  }\n\n  /**\n   * Resumes suspended libraries.\n   * @returns Promise that resolves when resume completes\n   */\n  async resume(): Promise<void> {\n    const suspended = Array.from(this.libraries.values()).filter(\n      (e) => e.resume !== undefined && e.state === 'suspended'\n    );\n\n    await Promise.all(\n      suspended.map(async (entry) => {\n        try {\n          entry.state = 'resuming';\n          await entry.resume?.();\n          entry.state = 'running';\n        } catch (error) {\n          entry.state = 'error';\n          entry.lastError = error instanceof Error ? error : new Error(String(error));\n        }\n      })\n    );\n  }\n\n  // ==========================================================================\n  // Private Methods\n  // ==========================================================================\n\n  /**\n   * Performs the actual initialization.\n   */\n  private async doInitialize(): Promise<void> {\n    this.state = 'initializing';\n    const startTime = performance.now();\n\n    try {\n      // Resolve dependencies\n      const resolution = topologicalSort(this.libraries);\n\n      if (!resolution.success) {\n        const cycleStr = resolution.cycles.map((c) => c.join(' -> ')).join('; ');\n        throw new Error(`Circular dependencies detected: ${cycleStr}`);\n      }\n\n      if (resolution.missing.length > 0) {\n        console.warn(\n          '[Lifecycle] Missing dependencies:',\n          resolution.missing.map((m) => `${m.library} -> ${m.dependency}`).join(', ')\n        );\n      }\n\n      this.initializationOrder = resolution.order;\n\n      // Group libraries by phase\n      const phaseGroups = groupByPhase(this.libraries, this.config.phases);\n\n      // Initialize phase by phase\n      for (const phase of this.config.phases) {\n        const phaseStartTime = performance.now();\n        const libraryIds = phaseGroups.get(phase.id) ?? [];\n\n        if (libraryIds.length === 0) continue;\n\n        publishEvent('lifecycle:phase-started', {\n          phaseId: phase.id,\n          phaseName: phase.name,\n          order: phase.order,\n        });\n\n        if (this.config.enableParallel && phase.parallel !== false) {\n          // Parallel initialization within phase\n          await this.initializeLibrariesParallel(libraryIds, phase.timeout);\n        } else {\n          // Sequential initialization\n          await this.initializeLibrariesSequential(libraryIds, phase.timeout);\n        }\n\n        const phaseDuration = performance.now() - phaseStartTime;\n        this.config.onPhaseComplete?.(phase, phaseDuration);\n\n        publishEvent('lifecycle:phase-completed', {\n          phaseId: phase.id,\n          phaseName: phase.name,\n          duration: phaseDuration,\n        });\n      }\n\n      this.state = 'initialized';\n\n      const totalDuration = performance.now() - startTime;\n      publishEvent('lifecycle:all-initialized', {\n        totalDuration,\n        libraryCount: this.libraries.size,\n      });\n    } catch (error) {\n      this.state = 'idle';\n      throw error;\n    }\n  }\n\n  /**\n   * Initializes libraries in parallel.\n   */\n  private async initializeLibrariesParallel(ids: LibraryId[], timeout?: number): Promise<void> {\n    const promises = ids.map(async (id) => this.initializeLibrary(id, timeout));\n    await Promise.all(promises);\n  }\n\n  /**\n   * Initializes libraries sequentially.\n   */\n  private async initializeLibrariesSequential(ids: LibraryId[], timeout?: number): Promise<void> {\n    // Sort by dependency order\n    const sorted = ids.sort((a, b) => {\n      const aIndex = this.initializationOrder.indexOf(a);\n      const bIndex = this.initializationOrder.indexOf(b);\n      return aIndex - bIndex;\n    });\n\n    for (const id of sorted) {\n      await this.initializeLibrary(id, timeout);\n    }\n  }\n\n  /**\n   * Initializes a single library.\n   */\n  private async initializeLibrary(id: LibraryId, timeout?: number): Promise<void> {\n    const entry = this.libraries.get(id);\n    if (!entry) return;\n\n    // Skip if already initializing/initialized\n    if (entry.state !== 'uninitialized') {\n      if (entry.initPromise) {\n        await entry.initPromise;\n      }\n      return;\n    }\n\n    const startTime = performance.now();\n    entry.state = 'initializing';\n\n    const doInit = async (): Promise<void> => {\n      try {\n        await entry.initialize();\n        entry.state = 'running';\n        entry.initializedAt = Date.now();\n        entry.initDuration = performance.now() - startTime;\n\n        publishEvent('lifecycle:library-initialized', {\n          libraryId: id,\n          duration: entry.initDuration,\n        });\n      } catch (error) {\n        entry.lastError = error instanceof Error ? error : new Error(String(error));\n\n        // Handle retry\n        const maxRetries = this.config.phases.find((p) => p.id === entry.phase)?.retries ?? 0;\n\n        if (entry.retryCount < maxRetries) {\n          entry.retryCount++;\n          entry.state = 'uninitialized';\n          await this.initializeLibrary(id, timeout);\n        } else {\n          entry.state = 'error';\n          this.config.onError?.(entry.lastError, entry);\n          throw entry.lastError;\n        }\n      }\n    };\n\n    entry.initPromise =\n      timeout !== undefined && timeout !== 0\n        ? withTimeout(doInit, timeout, `Initialize ${entry.name}`)\n        : doInit();\n\n    try {\n      await entry.initPromise;\n    } finally {\n      entry.initPromise = undefined;\n    }\n  }\n\n  /**\n   * Performs the actual shutdown.\n   */\n  private async doShutdown(): Promise<void> {\n    this.state = 'shutting-down';\n    const startTime = performance.now();\n\n    publishEvent('lifecycle:shutdown-started', {});\n\n    // Shutdown in reverse initialization order\n    const reverseOrder = [...this.initializationOrder].reverse();\n\n    for (const id of reverseOrder) {\n      const entry = this.libraries.get(id);\n      if (!entry || entry.state === 'disposed') continue;\n\n      entry.state = 'disposing';\n\n      try {\n        if (entry.cleanup) {\n          await withTimeout(\n            async () => entry.cleanup?.(),\n            this.config.shutdownTimeout / reverseOrder.length,\n            `Cleanup ${entry.name}`\n          );\n        }\n        entry.state = 'disposed';\n      } catch (error) {\n        entry.state = 'error';\n        entry.lastError = error instanceof Error ? error : new Error(String(error));\n        console.error(`[Lifecycle] Cleanup error for ${entry.name}:`, error);\n      }\n    }\n\n    this.state = 'shutdown';\n\n    const duration = performance.now() - startTime;\n    publishEvent('lifecycle:shutdown-completed', { duration });\n  }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\n/**\n * Global lifecycle manager instance.\n */\nlet globalLifecycle: LifecycleManagerImpl | null = null;\n\n/**\n * Gets the global lifecycle manager.\n * @param config - Optional configuration\n * @returns Global lifecycle manager instance\n */\nexport function getLifecycleManager(\n  config?: Partial<LifecycleManagerConfig>\n): LifecycleManagerImpl {\n  globalLifecycle ??= new LifecycleManagerImpl(config);\n  return globalLifecycle;\n}\n\n/**\n * Sets the global lifecycle manager.\n * @param manager - Lifecycle manager instance\n */\nexport function setLifecycleManager(manager: LifecycleManagerImpl): void {\n  globalLifecycle = manager;\n}\n\n/**\n * Resets the global lifecycle manager.\n */\nexport async function resetLifecycleManager(): Promise<void> {\n  if (globalLifecycle) {\n    await globalLifecycle.shutdown();\n    globalLifecycle = null;\n  }\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Registers a library with the global lifecycle manager.\n */\nexport function registerLibrary(registration: Omit<LibraryRegistration, 'state'>): void {\n  getLifecycleManager().registerLibrary(registration);\n}\n\n/**\n * Initializes all libraries.\n */\nexport async function initializeLibraries(): Promise<void> {\n  await getLifecycleManager().initialize();\n}\n\n/**\n * Shuts down all libraries.\n */\nexport async function shutdownLibraries(): Promise<void> {\n  await getLifecycleManager().shutdown();\n}\n\n// ============================================================================\n// Pre-defined Library IDs\n// ============================================================================\n\nexport const LIBRARY_IDS = {\n  coordination: createLibraryId('coordination'),\n  auth: createLibraryId('auth'),\n  rbac: createLibraryId('rbac'),\n  theme: createLibraryId('theme'),\n  featureFlags: createLibraryId('feature-flags'),\n  hydration: createLibraryId('hydration'),\n  streaming: createLibraryId('streaming'),\n  realtime: createLibraryId('realtime'),\n  vdom: createLibraryId('vdom'),\n  state: createLibraryId('state'),\n  security: createLibraryId('security'),\n  performance: createLibraryId('performance'),\n  ux: createLibraryId('ux'),\n  system: createLibraryId('system'),\n} as const;\n\nexport const PHASE_IDS = {\n  bootstrap: createPhaseId('bootstrap'),\n  core: createPhaseId('core'),\n  feature: createPhaseId('feature'),\n  ui: createPhaseId('ui'),\n} as const;\n"],"names":["topologicalSort","libraries","result","visited","visiting","order","visit","id","path","cycleStart","entry","lastPathElement","createLibraryId","dep","groupByPhase","phases","groups","phase","group","featurePhase","p","withTimeout","fn","timeout","label","resolve","reject","timeoutId","error","LifecycleManagerImpl","config","DEFAULT_LIFECYCLE_CONFIG","DEFAULT_LIFECYCLE_PHASES","registration","states","results","checks","healthy","checkResults","suspendable","e","suspended","startTime","resolution","cycleStr","c","m","phaseGroups","phaseStartTime","libraryIds","publishEvent","phaseDuration","totalDuration","ids","promises","sorted","a","b","aIndex","bIndex","doInit","maxRetries","reverseOrder","duration","globalLifecycle","getLifecycleManager","setLifecycleManager","manager","resetLifecycleManager","registerLibrary","initializeLibraries","shutdownLibraries","LIBRARY_IDS","PHASE_IDS","createPhaseId"],"mappings":"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"}