UNPKG

mocha-multiple-sessions-detailed-runner

Version:
1 lines 80.6 kB
{"version":3,"file":"multi-session-detailed-runner.mjs","sources":["../../src/impl/repositories/session-meta-repository.ts","../../src/impl/repositories/report-repository.ts","../../src/impl/events/unified-event-bus.ts","../../src/impl/infrastructure/mocha-integration.ts","../../src/impl/services/report-service.ts","../../src/impl/use-cases/runner-use-cases.ts","../../src/impl/multi-session-detailed-runner.ts","../../src/impl/factory.ts"],"sourcesContent":["import type { ISessionMetaRepository, ExecutionSummary } from '../../interfaces/repositories/session-meta-repository';\r\nimport type { SessionMeta, SessionState } from '../../interfaces/core/types';\r\n\r\nexport class SessionMetaRepository implements ISessionMetaRepository {\r\n  private sessions = new Map<string, SessionMeta>();\r\n\r\n  save(sessionMeta: SessionMeta): void {\r\n    this.sessions.set(sessionMeta.label, sessionMeta);\r\n  }\r\n\r\n  findByLabel(label: string): SessionMeta | null {\r\n    return this.sessions.get(label) || null;\r\n  }\r\n\r\n  findAll(): SessionMeta[] {\r\n    return Array.from(this.sessions.values());\r\n  }\r\n\r\n  delete(label: string): boolean {\r\n    return this.sessions.delete(label);\r\n  }\r\n\r\n  clear(): void {\r\n    this.sessions.clear();\r\n  }\r\n\r\n  exists(label: string): boolean {\r\n    return this.sessions.has(label);\r\n  }\r\n\r\n  updateState(label: string, state: Partial<SessionState>): void {\r\n    const session = this.sessions.get(label);\r\n    if (session) {\r\n      Object.assign(session, state);\r\n    }\r\n  }\r\n\r\n  getStates(): Record<string, SessionState> {\r\n    const states: Record<string, SessionState> = {};\r\n    this.sessions.forEach((meta, label) => {\r\n      states[label] = {\r\n        label: meta.label,\r\n        status: meta.status,\r\n        ...(meta.timestamp && { timestamp: meta.timestamp }),\r\n        ...(meta.duration && { duration: meta.duration })\r\n      };\r\n    });\r\n    return states;\r\n  }\r\n\r\n  markAsRunning(label: string): void {\r\n    this.updateState(label, { status: 'running', timestamp: new Date() });\r\n  }\r\n\r\n  markAsCompleted(label: string, result: any): void {\r\n    this.updateState(label, { \r\n      status: 'passed', \r\n      timestamp: new Date(),\r\n      duration: result.duration\r\n    });\r\n  }\r\n\r\n  markAsFailed(label: string, error: Error): void {\r\n    const session = this.sessions.get(label);\r\n    if (session) {\r\n      session.status = 'failed';\r\n      session.error = error;\r\n      session.timestamp = new Date();\r\n    }\r\n  }\r\n\r\n  getByStatus(status: SessionState['status']): SessionMeta[] {\r\n    return this.findAll().filter(session => session.status === status);\r\n  }\r\n\r\n  getExecutionSummary(): ExecutionSummary {\r\n    const all = this.findAll();\r\n    const lastExecutionTime = all.reduce((latest, session) => {\r\n      if (session.timestamp && (!latest || session.timestamp > latest)) {\r\n        return session.timestamp;\r\n      }\r\n      return latest;\r\n    }, undefined as Date | undefined);\r\n\r\n    return {\r\n      totalSessions: all.length,\r\n      readySessions: all.filter(s => s.status === 'ready').length,\r\n      runningSessions: all.filter(s => s.status === 'running').length,\r\n      completedSessions: all.filter(s => s.status === 'passed').length,\r\n      failedSessions: all.filter(s => s.status === 'failed').length,\r\n      ...(lastExecutionTime && { lastExecutionTime })\r\n    };\r\n  }\r\n}\r\n","import type { IReportRepository, ReportMetadata } from '../../interfaces/repositories/report-repository';\r\n\r\nexport class ReportRepository implements IReportRepository {\r\n  private readonly PREFIX = 'mochaSession__';\r\n\r\n  generateResultKey(sessionLabel: string): string {\r\n    return `${this.PREFIX}${sessionLabel.replace(/\\s+/g, '_').replace(/-/g, '_')}`;\r\n  }\r\n\r\n  getReportData(resultKey: string): any | null {\r\n    return this.getWindowVariable(resultKey);\r\n  }\r\n\r\n  hasReport(resultKey: string): boolean {\r\n    return this.getWindowVariable(resultKey) !== undefined;\r\n  }\r\n\r\n  clearReport(resultKey: string): void {\r\n    this.deleteWindowVariable(resultKey);\r\n  }\r\n\r\n  getAllReports(): Record<string, any> {\r\n    const reports: Record<string, any> = {};\r\n    \r\n    // Get all window variables that match our prefix\r\n    for (const key in window) {\r\n      if (key.startsWith(this.PREFIX)) {\r\n        const value = this.getWindowVariable(key);\r\n        if (value) {\r\n          reports[key] = value;\r\n        }\r\n      }\r\n    }\r\n    \r\n    return reports;\r\n  }\r\n\r\n  getReportMetadata(resultKey: string): ReportMetadata | null {\r\n    const data = this.getReportData(resultKey);\r\n    if (!data) return null;\r\n\r\n    const sessionLabel = resultKey.replace(this.PREFIX, '').replace(/_/g, '-');\r\n    \r\n    return {\r\n      size: JSON.stringify(data).length,\r\n      generatedAt: data.timestamp ? new Date(data.timestamp) : new Date(),\r\n      sessionLabel,\r\n      stats: data.stats || {},\r\n      isValid: this.validateReport(data)\r\n    };\r\n  }\r\n\r\n  async waitForReport(resultKey: string, timeoutMs: number = 30000): Promise<any> {\r\n    return new Promise((resolve, reject) => {\r\n      const startTime = Date.now();\r\n      \r\n      const checkInterval = setInterval(() => {\r\n        const report = this.getReportData(resultKey);\r\n        \r\n        if (report) {\r\n          clearInterval(checkInterval);\r\n          resolve(report);\r\n          return;\r\n        }\r\n        \r\n        if (Date.now() - startTime > timeoutMs) {\r\n          clearInterval(checkInterval);\r\n          reject(new Error(`Timeout waiting for report: ${resultKey}`));\r\n        }\r\n      }, 100);\r\n    });\r\n  }\r\n\r\n  watchReport(resultKey: string, callback: (report: any) => void): () => void {\r\n    let isWatching = true;\r\n    \r\n    const checkInterval = setInterval(() => {\r\n      if (!isWatching) {\r\n        clearInterval(checkInterval);\r\n        return;\r\n      }\r\n      \r\n      const report = this.getReportData(resultKey);\r\n      if (report) {\r\n        callback(report);\r\n        clearInterval(checkInterval);\r\n        isWatching = false;\r\n      }\r\n    }, 100);\r\n    \r\n    // Return cleanup function\r\n    return () => {\r\n      isWatching = false;\r\n      clearInterval(checkInterval);\r\n    };\r\n  }\r\n\r\n  getWindowVariable(key: string): any {\r\n    return (window as any)[key];\r\n  }\r\n\r\n  setWindowVariable(key: string, value: any): void {\r\n    (window as any)[key] = value;\r\n  }\r\n\r\n  deleteWindowVariable(key: string): void {\r\n    delete (window as any)[key];\r\n  }\r\n\r\n  getReportSize(resultKey: string): number {\r\n    const data = this.getReportData(resultKey);\r\n    return data ? JSON.stringify(data).length : 0;\r\n  }\r\n\r\n  validateReport(reportData: any): boolean {\r\n    if (!reportData || typeof reportData !== 'object') return false;\r\n    \r\n    // Basic validation - check for required properties\r\n    return !!(\r\n      reportData.stats &&\r\n      typeof reportData.stats === 'object' &&\r\n      typeof reportData.stats.tests === 'number'\r\n    );\r\n  }\r\n}\r\n","import type { IUnifiedEventBus, EventFilter } from '../../interfaces/events/unified-event-bus';\r\nimport type { RunnerEvent, RunnerEventType } from '../../interfaces/events/runner-events';\r\nimport type { SessionEvent, SessionEventType } from '../../interfaces/events/session-events';\r\n\r\nexport class UnifiedEventBus implements IUnifiedEventBus {\r\n  private runnerListeners = new Map<RunnerEventType, Set<(event: RunnerEvent) => void>>();\r\n  private sessionListeners = new Map<SessionEventType, Set<(event: SessionEvent) => void>>();\r\n  private anyEventListeners = new Set<(event: RunnerEvent | SessionEvent) => void>();\r\n  private eventHistory: (RunnerEvent | SessionEvent)[] = [];\r\n  private readonly maxHistorySize = 1000;\r\n\r\n  emitRunnerEvent(event: RunnerEvent): void {\r\n    // Add to history\r\n    this.addToHistory(event);\r\n    \r\n    // Emit to specific listeners\r\n    const listeners = this.runnerListeners.get(event.type);\r\n    if (listeners) {\r\n      listeners.forEach(callback => {\r\n        try {\r\n          callback(event);\r\n        } catch (error) {\r\n          console.error('Error in runner event listener:', error);\r\n        }\r\n      });\r\n    }\r\n    \r\n    // Emit to universal listeners\r\n    this.anyEventListeners.forEach(callback => {\r\n      try {\r\n        callback(event);\r\n      } catch (error) {\r\n        console.error('Error in universal event listener:', error);\r\n      }\r\n    });\r\n  }\r\n\r\n  onRunnerEvent(eventType: RunnerEventType, callback: (event: RunnerEvent) => void): () => void {\r\n    if (!this.runnerListeners.has(eventType)) {\r\n      this.runnerListeners.set(eventType, new Set());\r\n    }\r\n    \r\n    this.runnerListeners.get(eventType)!.add(callback);\r\n    \r\n    // Return unsubscribe function\r\n    return () => {\r\n      const listeners = this.runnerListeners.get(eventType);\r\n      if (listeners) {\r\n        listeners.delete(callback);\r\n        if (listeners.size === 0) {\r\n          this.runnerListeners.delete(eventType);\r\n        }\r\n      }\r\n    };\r\n  }\r\n\r\n  emitSessionEvent(event: SessionEvent): void {\r\n    // Add to history\r\n    this.addToHistory(event);\r\n    \r\n    // Emit to specific listeners\r\n    const listeners = this.sessionListeners.get(event.type);\r\n    if (listeners) {\r\n      listeners.forEach(callback => {\r\n        try {\r\n          callback(event);\r\n        } catch (error) {\r\n          console.error('Error in session event listener:', error);\r\n        }\r\n      });\r\n    }\r\n    \r\n    // Emit to universal listeners\r\n    this.anyEventListeners.forEach(callback => {\r\n      try {\r\n        callback(event);\r\n      } catch (error) {\r\n        console.error('Error in universal event listener:', error);\r\n      }\r\n    });\r\n  }\r\n\r\n  onSessionEvent(eventType: SessionEventType, callback: (event: SessionEvent) => void): () => void {\r\n    if (!this.sessionListeners.has(eventType)) {\r\n      this.sessionListeners.set(eventType, new Set());\r\n    }\r\n    \r\n    this.sessionListeners.get(eventType)!.add(callback);\r\n    \r\n    // Return unsubscribe function\r\n    return () => {\r\n      const listeners = this.sessionListeners.get(eventType);\r\n      if (listeners) {\r\n        listeners.delete(callback);\r\n        if (listeners.size === 0) {\r\n          this.sessionListeners.delete(eventType);\r\n        }\r\n      }\r\n    };\r\n  }\r\n\r\n  onAnyEvent(callback: (event: RunnerEvent | SessionEvent) => void): () => void {\r\n    this.anyEventListeners.add(callback);\r\n    \r\n    // Return unsubscribe function\r\n    return () => {\r\n      this.anyEventListeners.delete(callback);\r\n    };\r\n  }\r\n\r\n  getEventHistory(filter?: EventFilter): (RunnerEvent | SessionEvent)[] {\r\n    let filtered = [...this.eventHistory];\r\n    \r\n    if (filter) {\r\n      if (filter.eventTypes) {\r\n        filtered = filtered.filter(event => filter.eventTypes!.includes(event.type as any));\r\n      }\r\n      \r\n      if (filter.sessionLabel) {\r\n        filtered = filtered.filter(event => \r\n          'sessionLabel' in event && event.sessionLabel === filter.sessionLabel\r\n        );\r\n      }\r\n      \r\n      if (filter.timeRange) {\r\n        filtered = filtered.filter(event => {\r\n          const eventTime = new Date(event.timestamp);\r\n          return eventTime >= filter.timeRange!.start && eventTime <= filter.timeRange!.end;\r\n        });\r\n      }\r\n      \r\n      if (filter.maxEvents) {\r\n        filtered = filtered.slice(-filter.maxEvents);\r\n      }\r\n    }\r\n    \r\n    return filtered;\r\n  }\r\n\r\n  clearEventHistory(): void {\r\n    this.eventHistory = [];\r\n  }\r\n\r\n  hasListeners(eventType?: RunnerEventType | SessionEventType): boolean {\r\n    if (!eventType) {\r\n      return this.runnerListeners.size > 0 || \r\n             this.sessionListeners.size > 0 || \r\n             this.anyEventListeners.size > 0;\r\n    }\r\n    \r\n    return (this.runnerListeners.get(eventType as RunnerEventType)?.size || 0) > 0 ||\r\n           (this.sessionListeners.get(eventType as SessionEventType)?.size || 0) > 0;\r\n  }\r\n\r\n  getListenerCount(eventType?: RunnerEventType | SessionEventType): number {\r\n    if (!eventType) {\r\n      let total = this.anyEventListeners.size;\r\n      this.runnerListeners.forEach(listeners => total += listeners.size);\r\n      this.sessionListeners.forEach(listeners => total += listeners.size);\r\n      return total;\r\n    }\r\n    \r\n    const runnerCount = this.runnerListeners.get(eventType as RunnerEventType)?.size || 0;\r\n    const sessionCount = this.sessionListeners.get(eventType as SessionEventType)?.size || 0;\r\n    return runnerCount + sessionCount;\r\n  }\r\n\r\n  destroy(): void {\r\n    this.runnerListeners.clear();\r\n    this.sessionListeners.clear();\r\n    this.anyEventListeners.clear();\r\n    this.eventHistory = [];\r\n  }\r\n\r\n  private addToHistory(event: RunnerEvent | SessionEvent): void {\r\n    this.eventHistory.push(event);\r\n    \r\n    // Trim history if it gets too large\r\n    if (this.eventHistory.length > this.maxHistorySize) {\r\n      this.eventHistory = this.eventHistory.slice(-this.maxHistorySize);\r\n    }\r\n  }\r\n}\r\n","import type { IMochaIntegration, EnvironmentValidation, DependencyCheck } from '../../interfaces/infrastructure/mocha-integration';\r\nimport type { MultiSessionConfig } from '../../interfaces/core/types';\r\n\r\ndeclare global {\r\n  interface Window {\r\n    // Mocha Multiple Sessions Library - Complete interface\r\n    MochaMultipleSessions?: {\r\n      testSessionSetup: (config: any) => void;\r\n      onAnySessionEvent: (callback: (event: any) => void) => () => void;\r\n      testSession: (label: string, setupFn: () => void, options?: any) => Promise<string>;\r\n      runSession: (label: string) => Promise<any>;\r\n      runAllSessions: () => Promise<any[]>;\r\n    };\r\n    \r\n    // Mocha Detailed Reporter\r\n    MochaDetailedReporter?: {\r\n      DetailedJsonReporter: any;\r\n    };\r\n    \r\n    // Basic dependencies\r\n    Mocha?: any;\r\n    mocha?: any;\r\n    chai?: any;\r\n  }\r\n}\r\n\r\nexport class MochaIntegration implements IMochaIntegration {\r\n  private isConfiguredFlag = false;\r\n  private currentConfig: any = null;\r\n\r\n  setupTestEnvironment(config: MultiSessionConfig): void {\r\n    this.validateEnvironment();\r\n    \r\n    const defaultConfig = {\r\n      createMochaInstance: (sessionLabel: string) => {\r\n        const resultKey = config.windowVariablePrefix + sessionLabel.replace(/\\s+/g, '_').replace(/-/g, '_');\r\n        \r\n        if (!window.MochaDetailedReporter) {\r\n          throw new Error('MochaDetailedReporter not available');\r\n        }\r\n        \r\n        return new window.Mocha!({\r\n          ui: 'bdd',\r\n          reporter: window.MochaDetailedReporter.DetailedJsonReporter,\r\n          reporterOptions: {\r\n            outputToWindow: 'true',\r\n            windowVariableName: resultKey,\r\n            captureConsoleLog: config.captureConsoleLog ? 'true' : 'false',\r\n            sourceCode: config.sourceCode ? 'true' : 'false',\r\n            attachStats: config.attachStats ? 'true' : 'false'\r\n          }\r\n        });\r\n      },\r\n      \r\n      injectGlobals: (mochaInstance: any) => {\r\n        mochaInstance.suite.emit('pre-require', window, null, mochaInstance);\r\n        if (window.chai) {\r\n          (window as any).expect = window.chai.expect;\r\n        }\r\n      }\r\n    };\r\n\r\n    // Use provided config or defaults\r\n    const finalConfig = {\r\n      createMochaInstance: config.createMochaInstance || defaultConfig.createMochaInstance,\r\n      injectGlobals: config.injectGlobals || defaultConfig.injectGlobals\r\n    };\r\n    \r\n    // Setup with mocha-multiple-sessions\r\n    if (window.MochaMultipleSessions?.testSessionSetup) {\r\n      window.MochaMultipleSessions.testSessionSetup(finalConfig);\r\n      this.currentConfig = finalConfig;\r\n      this.isConfiguredFlag = true;\r\n    } else {\r\n      throw new Error('MochaMultipleSessions library not available');\r\n    }\r\n  }\r\n\r\n  isConfigured(): boolean {\r\n    return this.isConfiguredFlag;\r\n  }\r\n\r\n  getConfiguration(): any {\r\n    return this.currentConfig;\r\n  }\r\n\r\n  integrateWithExistingLibrary(): void {\r\n    if (!window.MochaMultipleSessions) {\r\n      throw new Error('MochaMultipleSessions library not found');\r\n    }\r\n    \r\n    // Integration is handled in setupTestEnvironment\r\n  }\r\n\r\n  setupDefaultReporter(sessionLabel: string): any {\r\n    const resultKey = `mochaSession__${sessionLabel.replace(/\\s+/g, '_').replace(/-/g, '_')}`;\r\n    \r\n    if (!window.MochaDetailedReporter) {\r\n      throw new Error('MochaDetailedReporter not available');\r\n    }\r\n    \r\n    return new window.Mocha!({\r\n      ui: 'bdd',\r\n      reporter: window.MochaDetailedReporter.DetailedJsonReporter,\r\n      reporterOptions: {\r\n        outputToWindow: 'true',\r\n        windowVariableName: resultKey,\r\n        captureConsoleLog: 'true',\r\n        sourceCode: 'true',\r\n        attachStats: 'true'\r\n      }\r\n    });\r\n  }\r\n\r\n  bridgeSessionEvents(): void {\r\n    // This would be implemented if we need to bridge events\r\n    // For now, the existing library handles events\r\n  }\r\n\r\n  validateEnvironment(): EnvironmentValidation {\r\n    const errors: string[] = [];\r\n    const warnings: string[] = [];\r\n    const missing: string[] = [];\r\n\r\n    const deps = this.checkDependencies();\r\n    \r\n    if (!deps.mocha) {\r\n      errors.push('Mocha library not found');\r\n      missing.push('mocha');\r\n    }\r\n    \r\n    if (!deps.chai) {\r\n      warnings.push('Chai library not found - tests may not work properly');\r\n      missing.push('chai');\r\n    }\r\n    \r\n    if (!deps.detailedReporter) {\r\n      errors.push('MochaDetailedReporter not found');\r\n      missing.push('mocha-detailed-json-reporter');\r\n    }\r\n    \r\n    if (!deps.multipleSessionsLibrary) {\r\n      errors.push('MochaMultipleSessions library not found');\r\n      missing.push('mocha-multiple-sessions-ts');\r\n    }\r\n\r\n    const validation: EnvironmentValidation = {\r\n      isValid: errors.length === 0,\r\n      errors,\r\n      warnings,\r\n      missingDependencies: missing\r\n    };\r\n\r\n    if (!validation.isValid) {\r\n      throw new Error(`Environment validation failed: ${errors.join(', ')}`);\r\n    }\r\n\r\n    return validation;\r\n  }\r\n\r\n  checkDependencies(): DependencyCheck {\r\n    return {\r\n      mocha: typeof window.Mocha !== 'undefined' && typeof window.mocha !== 'undefined',\r\n      chai: typeof window.chai !== 'undefined',\r\n      detailedReporter: typeof window.MochaDetailedReporter !== 'undefined',\r\n      multipleSessionsLibrary: typeof window.MochaMultipleSessions !== 'undefined',\r\n      reporterUI: typeof (window as any).MochaDetailedReporterUI !== 'undefined'\r\n    };\r\n  }\r\n}\r\n","import type { IReportService } from '../../interfaces/services/report-service';\r\nimport type { DetailedReport, CombinedReport } from '../../interfaces/core/types';\r\nimport type { ReportSummary } from '../../interfaces/use-cases/report-use-cases';\r\nimport type { IReportRepository } from '../../interfaces/repositories/report-repository';\r\nimport type { ISessionMetaRepository } from '../../interfaces/repositories/session-meta-repository';\r\nimport type { IUnifiedEventBus } from '../../interfaces/events/unified-event-bus';\r\n\r\nexport class ReportService implements IReportService {\r\n  constructor(\r\n    private reportRepository: IReportRepository,\r\n    private sessionRepository: ISessionMetaRepository,\r\n    private eventBus: IUnifiedEventBus\r\n  ) {}\r\n\r\n  getSessionReport(label: string): DetailedReport | null {\r\n    const sessionMeta = this.sessionRepository.findByLabel(label);\r\n    if (!sessionMeta) return null;\r\n\r\n    const reportData = this.reportRepository.getReportData(sessionMeta.resultKey);\r\n    if (!reportData) return null;\r\n\r\n    const detailedReport: DetailedReport = {\r\n      data: reportData,\r\n      stats: reportData.stats || { tests: 0, passes: 0, failures: 0, pending: 0 },\r\n      timestamp: reportData.timestamp ? new Date(reportData.timestamp) : new Date(),\r\n      sessionLabel: label,\r\n      size: JSON.stringify(reportData).length\r\n    };\r\n\r\n    return detailedReport;\r\n  }\r\n\r\n  async waitForSessionReport(label: string, timeoutMs: number = 30000): Promise<DetailedReport> {\r\n    const sessionMeta = this.sessionRepository.findByLabel(label);\r\n    if (!sessionMeta) {\r\n      throw new Error(`Session '${label}' not found`);\r\n    }\r\n\r\n    const reportData = await this.reportRepository.waitForReport(sessionMeta.resultKey, timeoutMs);\r\n    \r\n    return {\r\n      data: reportData,\r\n      stats: reportData.stats || { tests: 0, passes: 0, failures: 0, pending: 0 },\r\n      timestamp: reportData.timestamp ? new Date(reportData.timestamp) : new Date(),\r\n      sessionLabel: label,\r\n      size: JSON.stringify(reportData).length\r\n    };\r\n  }\r\n\r\n  hasSessionReport(label: string): boolean {\r\n    const sessionMeta = this.sessionRepository.findByLabel(label);\r\n    if (!sessionMeta) return false;\r\n\r\n    return this.reportRepository.hasReport(sessionMeta.resultKey);\r\n  }\r\n\r\n  generateCombinedReport(): CombinedReport {\r\n    const allSessions = this.sessionRepository.findAll();\r\n    const sessions: Record<string, DetailedReport> = {};\r\n    \r\n    let totalTests = 0;\r\n    let totalPasses = 0;\r\n    let totalFailures = 0;\r\n    let totalPending = 0;\r\n    let successfulSessions = 0;\r\n    let failedSessions = 0;\r\n\r\n    for (const sessionMeta of allSessions) {\r\n      const report = this.getSessionReport(sessionMeta.label);\r\n      if (report) {\r\n        sessions[sessionMeta.label] = report;\r\n        \r\n        totalTests += report.stats.tests;\r\n        totalPasses += report.stats.passes;\r\n        totalFailures += report.stats.failures;\r\n        totalPending += report.stats.pending;\r\n        \r\n        if (report.stats.failures === 0) {\r\n          successfulSessions++;\r\n        } else {\r\n          failedSessions++;\r\n        }\r\n      }\r\n    }\r\n\r\n    const combinedReport: CombinedReport = {\r\n      generatedAt: new Date().toISOString(),\r\n      summary: {\r\n        totalTests,\r\n        totalPasses,\r\n        totalFailures,\r\n        totalPending,\r\n        totalSessions: allSessions.length,\r\n        successfulSessions,\r\n        failedSessions\r\n      },\r\n      sessions\r\n    };\r\n\r\n    // Emit report generated event\r\n    this.eventBus.emitRunnerEvent({\r\n      type: 'runner:combined-report-generated',\r\n      timestamp: new Date(),\r\n      data: {\r\n        reportType: 'combined',\r\n        totalSessions: allSessions.length,\r\n        reportSize: JSON.stringify(combinedReport).length,\r\n        generatedAt: new Date(),\r\n        summary: combinedReport.summary\r\n      }\r\n    });\r\n\r\n    return combinedReport;\r\n  }\r\n\r\n  async getCombinedReportAsync(): Promise<CombinedReport> {\r\n    // For now, just return the sync version\r\n    // In the future, this could wait for all reports to be ready\r\n    return this.generateCombinedReport();\r\n  }\r\n\r\n  watchSessionReport(label: string, callback: (report: DetailedReport) => void): () => void {\r\n    const sessionMeta = this.sessionRepository.findByLabel(label);\r\n    if (!sessionMeta) {\r\n      throw new Error(`Session '${label}' not found`);\r\n    }\r\n\r\n    return this.reportRepository.watchReport(sessionMeta.resultKey, (reportData: any) => {\r\n      const detailedReport: DetailedReport = {\r\n        data: reportData,\r\n        stats: reportData.stats || { tests: 0, passes: 0, failures: 0, pending: 0 },\r\n        timestamp: reportData.timestamp ? new Date(reportData.timestamp) : new Date(),\r\n        sessionLabel: label,\r\n        size: JSON.stringify(reportData).length\r\n      };\r\n\r\n      callback(detailedReport);\r\n    });\r\n  }\r\n\r\n  watchAllReports(callback: (sessionLabel: string, report: DetailedReport) => void): () => void {\r\n    const unsubscribeFunctions: (() => void)[] = [];\r\n    \r\n    const allSessions = this.sessionRepository.findAll();\r\n    \r\n    for (const sessionMeta of allSessions) {\r\n      const unsubscribe = this.watchSessionReport(sessionMeta.label, (report) => {\r\n        callback(sessionMeta.label, report);\r\n      });\r\n      unsubscribeFunctions.push(unsubscribe);\r\n    }\r\n\r\n    // Return function to unsubscribe from all\r\n    return () => {\r\n      unsubscribeFunctions.forEach(fn => fn());\r\n    };\r\n  }\r\n\r\n  getReportSummary(): ReportSummary {\r\n    const allSessions = this.sessionRepository.findAll();\r\n    const reportSizes: Record<string, number> = {};\r\n    \r\n    let totalReports = 0;\r\n    let totalTests = 0;\r\n    let totalPasses = 0;\r\n    let totalFailures = 0;\r\n    let oldestReport: Date | undefined;\r\n    let newestReport: Date | undefined;\r\n\r\n    for (const sessionMeta of allSessions) {\r\n      const report = this.getSessionReport(sessionMeta.label);\r\n      if (report) {\r\n        totalReports++;\r\n        totalTests += report.stats.tests;\r\n        totalPasses += report.stats.passes;\r\n        totalFailures += report.stats.failures;\r\n        reportSizes[sessionMeta.label] = report.size || 0;\r\n\r\n        if (!oldestReport || report.timestamp < oldestReport) {\r\n          oldestReport = report.timestamp;\r\n        }\r\n        if (!newestReport || report.timestamp > newestReport) {\r\n          newestReport = report.timestamp;\r\n        }\r\n      }\r\n    }\r\n\r\n    return {\r\n      totalReports,\r\n      totalTests,\r\n      totalPasses,\r\n      totalFailures,\r\n      reportSizes,\r\n      ...(oldestReport && { oldestReport }),\r\n      ...(newestReport && { newestReport })\r\n    };\r\n  }\r\n\r\n  async exportReports(format: 'json' | 'html'): Promise<string> {\r\n    const combinedReport = this.generateCombinedReport();\r\n    \r\n    if (format === 'json') {\r\n      return JSON.stringify(combinedReport, null, 2);\r\n    } else {\r\n      // Basic HTML export - could be enhanced\r\n      return `\r\n        <html>\r\n          <head><title>Test Report</title></head>\r\n          <body>\r\n            <h1>Combined Test Report</h1>\r\n            <p>Generated: ${combinedReport.generatedAt}</p>\r\n            <h2>Summary</h2>\r\n            <pre>${JSON.stringify(combinedReport.summary, null, 2)}</pre>\r\n            <h2>Sessions</h2>\r\n            <pre>${JSON.stringify(combinedReport.sessions, null, 2)}</pre>\r\n          </body>\r\n        </html>\r\n      `;\r\n    }\r\n  }\r\n\r\n  clearAllReports(): void {\r\n    const allSessions = this.sessionRepository.findAll();\r\n    \r\n    for (const sessionMeta of allSessions) {\r\n      if (this.reportRepository.hasReport(sessionMeta.resultKey)) {\r\n        this.reportRepository.clearReport(sessionMeta.resultKey);\r\n      }\r\n    }\r\n  }\r\n\r\n  validateSessionReport(sessionLabel: string): boolean {\r\n    const report = this.getSessionReport(sessionLabel);\r\n    return report !== null && this.reportRepository.validateReport(report.data);\r\n  }\r\n\r\n  getReportValidationErrors(sessionLabel: string): string[] {\r\n    const errors: string[] = [];\r\n    const report = this.getSessionReport(sessionLabel);\r\n    \r\n    if (!report) {\r\n      errors.push('Report not found');\r\n      return errors;\r\n    }\r\n\r\n    if (!report.data) {\r\n      errors.push('Report data is missing');\r\n    }\r\n\r\n    if (!report.stats) {\r\n      errors.push('Report stats are missing');\r\n    } else {\r\n      if (typeof report.stats.tests !== 'number') {\r\n        errors.push('Invalid test count');\r\n      }\r\n      if (typeof report.stats.passes !== 'number') {\r\n        errors.push('Invalid pass count');\r\n      }\r\n      if (typeof report.stats.failures !== 'number') {\r\n        errors.push('Invalid failure count');\r\n      }\r\n    }\r\n\r\n    return errors;\r\n  }\r\n}\r\n","import type { \r\n  IInitializeRunnerUseCase,\r\n  IDefineSessionUseCase,\r\n  IRunSingleSessionUseCase,\r\n  IRunAllSessionsUseCase,\r\n  IClearAllSessionsUseCase,\r\n  IDestroyRunnerUseCase\r\n} from '../../interfaces/use-cases/runner-use-cases';\r\nimport type { MultiSessionConfig, SessionResult, SessionMeta } from '../../interfaces/core/types';\r\nimport type { BatchExecutionOptions } from '../../interfaces/core/batch-execution';\r\nimport type { ISessionMetaRepository } from '../../interfaces/repositories/session-meta-repository';\r\nimport type { IReportRepository } from '../../interfaces/repositories/report-repository';\r\nimport type { IUnifiedEventBus } from '../../interfaces/events/unified-event-bus';\r\nimport type { IMochaIntegration } from '../../interfaces/infrastructure/mocha-integration';\r\n\r\n// Use the global interface from mocha-integration.ts\r\ndeclare global {\r\n  interface Window {\r\n    MochaMultipleSessions?: {\r\n      testSessionSetup: (config: any) => void;\r\n      onAnySessionEvent: (callback: (event: any) => void) => () => void;\r\n      testSession: (label: string, setupFn: () => void, options?: any) => Promise<string>;\r\n      runSession: (label: string) => Promise<any>;\r\n      runAllSessions: () => Promise<any[]>;\r\n    };\r\n  }\r\n}\r\n\r\nexport class InitializeRunnerUseCase implements IInitializeRunnerUseCase {\r\n  constructor(\r\n    private mochaIntegration: IMochaIntegration,\r\n    private eventBus: IUnifiedEventBus\r\n  ) {}\r\n\r\n  execute(config?: Partial<MultiSessionConfig>): void {\r\n    const finalConfig: MultiSessionConfig = {\r\n      windowVariablePrefix: 'mochaSession__',\r\n      autoInit: true,\r\n      captureConsoleLog: true,\r\n      sourceCode: true,\r\n      attachStats: true,\r\n      ...config\r\n    };\r\n\r\n    try {\r\n      this.mochaIntegration.setupTestEnvironment(finalConfig);\r\n      \r\n      this.eventBus.emitRunnerEvent({\r\n        type: 'runner:initialized',\r\n        timestamp: new Date(),\r\n        data: {\r\n          configUsed: finalConfig,\r\n          sessionCount: 0,\r\n          timestamp: new Date()\r\n        }\r\n      });\r\n      \r\n    } catch (error) {\r\n      this.eventBus.emitRunnerEvent({\r\n        type: 'runner:config-updated',\r\n        timestamp: new Date(),\r\n        data: {\r\n          oldConfig: {},\r\n          newConfig: finalConfig,\r\n          changes: ['initialization_failed']\r\n        }\r\n      });\r\n      throw error;\r\n    }\r\n  }\r\n}\r\n\r\nexport class DefineSessionUseCase implements IDefineSessionUseCase {\r\n  constructor(\r\n    private sessionRepository: ISessionMetaRepository,\r\n    private reportRepository: IReportRepository,\r\n    private eventBus: IUnifiedEventBus\r\n  ) {}\r\n\r\n  execute(label: string, setupFn: () => void): void {\r\n    const resultKey = this.reportRepository.generateResultKey(label);\r\n    \r\n    const sessionMeta: SessionMeta = {\r\n      label,\r\n      resultKey,\r\n      setupFn,\r\n      status: 'ready',\r\n      timestamp: new Date()\r\n    };\r\n\r\n    this.sessionRepository.save(sessionMeta);\r\n    \r\n    this.eventBus.emitRunnerEvent({\r\n      type: 'runner:session-defined',\r\n      timestamp: new Date(),\r\n      data: {\r\n        sessionLabel: label,\r\n        sessionMeta,\r\n        totalSessions: this.sessionRepository.findAll().length\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nexport class RunSingleSessionUseCase implements IRunSingleSessionUseCase {\r\n  constructor(\r\n    private sessionRepository: ISessionMetaRepository,\r\n    private reportRepository: IReportRepository,\r\n    private eventBus: IUnifiedEventBus\r\n  ) {}\r\n\r\n  async execute(label: string): Promise<SessionResult> {\r\n    const sessionMeta = this.sessionRepository.findByLabel(label);\r\n    if (!sessionMeta) {\r\n      throw new Error(`Session '${label}' not found`);\r\n    }\r\n\r\n    try {\r\n      // Mark as running\r\n      this.sessionRepository.markAsRunning(label);\r\n      \r\n      // Use the existing mocha-multiple-sessions library\r\n      if (!window.MochaMultipleSessions) {\r\n        throw new Error('MochaMultipleSessions library not available');\r\n      }\r\n\r\n      // Create the session first with better error handling\r\n      try {\r\n        await window.MochaMultipleSessions.testSession(label, sessionMeta.setupFn);\r\n        console.log(`Session '${label}' created successfully`);\r\n      } catch (sessionCreationError) {\r\n        console.error(`Failed to create session '${label}':`, sessionCreationError);\r\n        throw new Error(`Session creation failed for '${label}': ${sessionCreationError}`);\r\n      }\r\n      \r\n      // Run the session with better error handling\r\n      let result;\r\n      try {\r\n        result = await window.MochaMultipleSessions.runSession(label);\r\n        console.log(`Session '${label}' execution completed:`, result);\r\n      } catch (sessionRunError) {\r\n        console.error(`Failed to run session '${label}':`, sessionRunError);\r\n        throw new Error(`Session execution failed for '${label}': ${sessionRunError}`);\r\n      }\r\n      \r\n      // Wait for detailed report to be available\r\n      try {\r\n        await this.reportRepository.waitForReport(sessionMeta.resultKey, 5000);\r\n        console.log(`Detailed report available for '${label}'`);\r\n      } catch (waitError) {\r\n        console.warn(`Timeout waiting for detailed report for ${label}:`, waitError);\r\n        // Don't throw here, continue with basic result\r\n      }\r\n\r\n      // Mark as completed\r\n      this.sessionRepository.markAsCompleted(label, result);\r\n\r\n      const sessionResult: SessionResult = {\r\n        label,\r\n        status: result.success ? 'passed' : 'failed',\r\n        success: result.success,\r\n        timestamp: new Date(),\r\n        duration: result.duration,\r\n        stats: result.stats\r\n      };\r\n\r\n      console.log(`Session '${label}' result:`, sessionResult);\r\n      return sessionResult;\r\n\r\n    } catch (error) {\r\n      console.error(`Error in session '${label}':`, error);\r\n      this.sessionRepository.markAsFailed(label, error as Error);\r\n      \r\n      const sessionResult: SessionResult = {\r\n        label,\r\n        status: 'failed',\r\n        success: false,\r\n        timestamp: new Date(),\r\n        error: error as Error\r\n      };\r\n\r\n      return sessionResult;\r\n    }\r\n  }\r\n}\r\n\r\nexport class RunAllSessionsUseCase implements IRunAllSessionsUseCase {\r\n  constructor(\r\n    private sessionRepository: ISessionMetaRepository,\r\n    private runSingleSessionUseCase: IRunSingleSessionUseCase,\r\n    private eventBus: IUnifiedEventBus\r\n  ) {}\r\n\r\n  async execute(options?: BatchExecutionOptions): Promise<Record<string, SessionResult>> {\r\n    const allSessions = this.sessionRepository.findAll();\r\n    \r\n    if (allSessions.length === 0) {\r\n      throw new Error('No sessions defined');\r\n    }\r\n\r\n    const sessionLabels = allSessions.map(s => s.label);\r\n    const startTime = Date.now();\r\n\r\n    // Emit batch start event\r\n    this.eventBus.emitRunnerEvent({\r\n      type: 'runner:batch-started',\r\n      timestamp: new Date(),\r\n      data: {\r\n        sessionLabels,\r\n        totalSessions: sessionLabels.length,\r\n        executionMode: options?.mode || 'sequential',\r\n        options\r\n      }\r\n    });\r\n\r\n    const results: Record<string, SessionResult> = {};\r\n    let completed = 0;\r\n\r\n    try {\r\n      if (options?.mode === 'parallel') {\r\n        // Run in parallel\r\n        const promises = sessionLabels.map(async (label: string) => {\r\n          const result = await this.runSingleSessionUseCase.execute(label);\r\n          results[label] = result;\r\n          completed++;\r\n          \r\n          this.eventBus.emitRunnerEvent({\r\n            type: 'runner:batch-progress',\r\n            timestamp: new Date(),\r\n            data: {\r\n              completed,\r\n              total: sessionLabels.length,\r\n              currentSession: label,\r\n              completedSessions: Object.keys(results),\r\n              failedSessions: Object.keys(results).filter((l: string) => !results[l]?.success),\r\n              progress: Math.round((completed / sessionLabels.length) * 100)\r\n            }\r\n          });\r\n          \r\n          return result;\r\n        });\r\n\r\n        await Promise.all(promises);\r\n      } else {\r\n        // Run sequentially\r\n        for (const label of sessionLabels) {\r\n          if (options?.stopOnFirstFailure && completed > 0) {\r\n            const hasFailures = Object.values(results).some((r: SessionResult) => !r.success);\r\n            if (hasFailures) break;\r\n          }\r\n\r\n          const result = await this.runSingleSessionUseCase.execute(label);\r\n          results[label] = result;\r\n          completed++;\r\n\r\n          this.eventBus.emitRunnerEvent({\r\n            type: 'runner:batch-progress',\r\n            timestamp: new Date(),\r\n            data: {\r\n              completed,\r\n              total: sessionLabels.length,\r\n              currentSession: label,\r\n              completedSessions: Object.keys(results),\r\n              failedSessions: Object.keys(results).filter((l: string) => !results[l]?.success),\r\n              progress: Math.round((completed / sessionLabels.length) * 100)\r\n            }\r\n          });\r\n        }\r\n      }\r\n\r\n      const duration = Date.now() - startTime;\r\n      const successfulSessions = Object.values(results).filter(r => r.success).length;\r\n      const failedSessions = Object.values(results).filter(r => !r.success).length;\r\n\r\n      // Emit completion event\r\n      this.eventBus.emitRunnerEvent({\r\n        type: 'runner:batch-completed',\r\n        timestamp: new Date(),\r\n        data: {\r\n          totalSessions: sessionLabels.length,\r\n          successfulSessions,\r\n          failedSessions,\r\n          duration,\r\n          sessionResults: results,\r\n          overallSuccess: failedSessions === 0\r\n        }\r\n      });\r\n\r\n      return results;\r\n\r\n    } catch (error) {\r\n      // Emit failure event\r\n      this.eventBus.emitRunnerEvent({\r\n        type: 'runner:batch-failed',\r\n        timestamp: new Date(),\r\n        data: {\r\n          error: error as Error,\r\n          completedSessions: Object.keys(results),\r\n          partialResults: results\r\n        }\r\n      });\r\n\r\n      throw error;\r\n    }\r\n  }\r\n}\r\n\r\nexport class ClearAllSessionsUseCase implements IClearAllSessionsUseCase {\r\n  constructor(\r\n    private sessionRepository: ISessionMetaRepository,\r\n    private reportRepository: IReportRepository,\r\n    private eventBus: IUnifiedEventBus\r\n  ) {}\r\n\r\n  async execute(): Promise<void> {\r\n    const allSessions = this.sessionRepository.findAll();\r\n    const clearedSessions = allSessions.map(s => s.label);\r\n    const clearedReports: string[] = [];\r\n\r\n    // Clear all reports\r\n    for (const session of allSessions) {\r\n      if (this.reportRepository.hasReport(session.resultKey)) {\r\n        this.reportRepository.clearReport(session.resultKey);\r\n        clearedReports.push(session.resultKey);\r\n      }\r\n    }\r\n\r\n    // Clear session repository\r\n    this.sessionRepository.clear();\r\n\r\n    // Emit cleared event\r\n    this.eventBus.emitRunnerEvent({\r\n      type: 'runner:cleared',\r\n      timestamp: new Date(),\r\n      data: {\r\n        clearedSessions,\r\n        clearedReports\r\n      }\r\n    });\r\n  }\r\n}\r\n\r\nexport class DestroyRunnerUseCase implements IDestroyRunnerUseCase {\r\n  constructor(\r\n    private clearAllSessionsUseCase: IClearAllSessionsUseCase,\r\n    private eventBus: IUnifiedEventBus\r\n  ) {}\r\n\r\n  async execute(): Promise<void> {\r\n    // Clear all sessions first\r\n    await this.clearAllSessionsUseCase.execute();\r\n\r\n    // Emit destroy event\r\n    this.eventBus.emitRunnerEvent({\r\n      type: 'runner:destroyed',\r\n      timestamp: new Date()\r\n    });\r\n\r\n    // Destroy event bus\r\n    this.eventBus.destroy();\r\n  }\r\n}\r\n","import type { IMultiSessionDetailedRunner } from '../interfaces/core/IMultiSessionDetailedRunner';\r\nimport type { SessionState, SessionResult, DetailedReport, CombinedReport, MultiSessionConfig } from '../interfaces/core/types';\r\nimport type { RunnerEventType, RunnerEvent } from '../interfaces/events/runner-events';\r\nimport type { SessionEventType, SessionEvent } from '../interfaces/events/session-events';\r\nimport type { BatchExecutionOptions } from '../interfaces/core/batch-execution';\r\n\r\n// Implementation imports\r\nimport { SessionMetaRepository } from './repositories/session-meta-repository';\r\nimport { ReportRepository } from './repositories/report-repository';\r\nimport { UnifiedEventBus } from './events/unified-event-bus';\r\nimport { MochaIntegration } from './infrastructure/mocha-integration';\r\nimport { ReportService } from './services/report-service';\r\n\r\n// Use case imports\r\nimport { \r\n  InitializeRunnerUseCase,\r\n  DefineSessionUseCase,\r\n  RunSingleSessionUseCase,\r\n  RunAllSessionsUseCase,\r\n  ClearAllSessionsUseCase,\r\n  DestroyRunnerUseCase\r\n} from './use-cases/runner-use-cases';\r\n\r\nexport class MultiSessionDetailedRunner implements IMultiSessionDetailedRunner {\r\n  // Dependencies\r\n  private sessionRepository: SessionMetaRepository;\r\n  private reportRepository: ReportRepository;\r\n  private eventBus: UnifiedEventBus;\r\n  private mochaIntegration: MochaIntegration;\r\n  private reportService: ReportService;\r\n\r\n  // Use cases\r\n  private initializeUseCase: InitializeRunnerUseCase;\r\n  private defineSessionUseCase: DefineSessionUseCase;\r\n  private runSingleSessionUseCase: RunSingleSessionUseCase;\r\n  private runAllSessionsUseCase: RunAllSessionsUseCase;\r\n  private clearAllSessionsUseCase: ClearAllSessionsUseCase;\r\n  private destroyRunnerUseCase: DestroyRunnerUseCase;\r\n\r\n  // State\r\n  private initialized = false;\r\n  private destroyed = false;\r\n\r\n  constructor() {\r\n    // Initialize dependencies\r\n    this.sessionRepository = new SessionMetaRepository();\r\n    this.reportRepository = new ReportRepository();\r\n    this.eventBus = new UnifiedEventBus();\r\n    this.mochaIntegration = new MochaIntegration();\r\n    this.reportService = new ReportService(\r\n      this.reportRepository,\r\n      this.sessionRepository,\r\n      this.eventBus\r\n    );\r\n\r\n    // Initialize use cases\r\n    this.initializeUseCase = new InitializeRunnerUseCase(\r\n      this.mochaIntegration,\r\n      this.eventBus\r\n    );\r\n    \r\n    this.defineSessionUseCase = new DefineSessionUseCase(\r\n      this.sessionRepository,\r\n      this.reportRepository,\r\n      this.eventBus\r\n    );\r\n\r\n    this.runSingleSessionUseCase = new RunSingleSessionUseCase(\r\n      this.sessionRepository,\r\n      this.reportRepository,\r\n      this.eventBus\r\n    );\r\n\r\n    this.runAllSessionsUseCase = new RunAllSessionsUseCase(\r\n      this.sessionRepository,\r\n      this.runSingleSessionUseCase,\r\n      this.eventBus\r\n    );\r\n\r\n    this.clearAllSessionsUseCase = new ClearAllSessionsUseCase(\r\n      this.sessionRepository,\r\n      this.reportRepository,\r\n      this.eventBus\r\n    );\r\n\r\n    this.destroyRunnerUseCase = new DestroyRunnerUseCase(\r\n      this.clearAllSessionsUseCase,\r\n      this.eventBus\r\n    );\r\n\r\n    // Bridge session events from the existing library\r\n    this.bridgeExistingSessionEvents();\r\n  }\r\n\r\n  // Core Management\r\n  init(config?: Partial<MultiSessionConfig>): void {\r\n    if (this.destroyed) {\r\n      throw new Error('Runner has been destroyed');\r\n    }\r\n\r\n    // Set initialized flag before calling use case to avoid timing issues\r\n    this.initialized = true;\r\n    \r\n    try {\r\n      this.initializeUseCase.execute(config);\r\n    } catch (error) {\r\n      // Reset initialized flag on error\r\n      this.initialized = false;\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  define(label: string, setupFn: () => void): void {\r\n    this.ensureInitialized();\r\n    this.defineSessionUseCase.execute(label, setupFn);\r\n  }\r\n\r\n  async run(label: string): Promise<SessionResult> {\r\n    this.ensureInitialized();\r\n    return this.runSingleSessionUseCase.execute(label);\r\n  }\r\n\r\n  async runAll(options?: BatchExecutionOptions): Promise<Record<string, SessionResult>> {\r\n    this.ensureInitialized();\r\n    return this.runAllSessionsUseCase.execute(options);\r\n  }\r\n\r\n  // Report Access\r\n  getReport(label: string): DetailedReport | null {\r\n    this.ensureInitialized();\r\n    return this.reportService.getSessionReport(label);\r\n  }\r\n\r\n  getSessionStates(): Record<string, SessionState> {\r\n    this.ensureInitialized();\r\n    return this.sessionRepository.getStates();\r\n  }\r\n\r\n  getCombinedReport(): CombinedReport {\r\n    this.ensureInitialized();\r\n    return this.reportService.generateCombinedReport();\r\n  }\r\n\r\n  // Event System\r\n  onRunnerEvent(eventType: RunnerEventType, callback: (event: RunnerEvent) => void): () => void {\r\n    return this.eventBus.onRunnerEvent(eventType, callback);\r\n  }\r\n\r\n  onSessionEvent(eventType: SessionEventType, callback: (event: SessionEvent) => void): () => void {\r\n    return this.eventBus.onSessionEvent(eventType, callback);\r\n  }\r\n\r\n  onAnyEvent(callback: (event: RunnerEvent | SessionEvent) => void): () => void {\r\n    return this.eventBus.onAnyEvent(callback);\r\n  }\r\n\r\n  // State Queries\r\n  isInitialized(): boolean {\r\n    return this.initialized && !this.destroyed;\r\n  }\r\n\r\n  hasSession(label: string): boolean {\r\n    return this.sessionRepository.exists(label);\r\n  }\r\n\r\n  getSessionCount(): number {\r\n    return this.sessionRepository.findAll().length;\r\n  }\r\n\r\n  // Utility\r\n  async clear(): Promise<void> {\r\n    this.ensureInitialized();\r\n    await this.clearAllSessionsUseCase.execute();\r\n  }\r\n\r\n  async destroy(): Promise<void> {\r\n    if (this.destroyed) return;\r\n    \r\n    await this.destroyRunnerUseCase.execute();\r\n    this.destroyed = true;\r\n    this.initialized = false;\r\n  }\r\n\r\n  // Private helper methods\r\n  private ensureInitialized(): void {\r\n    if (this.destroyed) {\r\n      throw new Error('Runner has been destroyed');\r\n    }\r\n    if (!this.initialized) {\r\n      throw new Error('Runner not initialized. Call init() first.');\r\n    }\r\n  }\r\n\r\n  private bridgeExistingSessionEvents(): void {\r\n    // Bridge events from the existing mocha-multiple-sessions library\r\n    if (typeof window !== 'undefined' && window.MochaMultipleSessions?.onAnySessionEvent) {\r\n      window.MochaMultipleSessions.onAnySessionEvent((event: any) => {\r\n        // Convert and forward the event\r\n        const sessionEvent: SessionEvent = {\r\n          type: event.type,\r\n          sessionLabel: event.sessionLabel,\r\n          timestamp: event.timestamp || new Date(),\r\n          data: event.data,\r\n          source: 'mocha-multiple-sessions'\r\n        };\r\n\r\n        this.eventBus.emitSessionEvent(sessionEvent);\r\n      });\r\n    }\r\n  }\r\n}\r\n","import type { IMultiSessionDetailedRunner } from '../interfaces/core/IMultiSessionDetailedRunner';\r\nimport type { MultiSessionConfig } from '../interfaces/core/types';\r\nimport { MultiSessionDetailedRunner } from './multi-session-detailed-runner';\r\n\r\nexport function createMultiSessionDetailedRunner(\r\n  config?: Partial<MultiSessionConfig>\r\n): IMultiSessionDetailedRunner {\r\n  const runner = new MultiSessionDetailedRunner();\r\n  \r\n  // Auto-initialize if autoInit is not explicitly false\r\n  if (config?.autoInit !== false) {\r\n    runner.init(config);\r\n  }\r\n  \r\n  return runner;\r\n}\r\n\r\n// Default export for convenience\r\nexport default createMultiSessionDetailedRunner;\r\n"],"names":[],"mappings":"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"}