/**
 * Events Module - Public API
 *
 * Exports the EventBus port interface and EventEmitter adapter.
 * All modules should import from this index file.
 */

// Port interface (what consumers depend on)
export type { EventBus, DomainEvent } from './types.js';

// Domain event types
export type {
  ProcessSpawnedEvent,
  ProcessStoppedEvent,
  ProcessCrashedEvent,
  ServerStartedEvent,
  ServerStoppedEvent,
  LogEntryEvent,
  WorktreeCreatedEvent,
  WorktreeRemovedEvent,
  WorktreeMergedEvent,
  WorktreeConflictEvent,
  AgentSpawnedEvent,
  AgentStoppedEvent,
  AgentCrashedEvent,
  AgentResumedEvent,
  AgentAccountSwitchedEvent,
  AgentDeletedEvent,
  AgentWaitingEvent,
  AgentOutputEvent,
  TaskQueuedEvent,
  TaskDispatchedEvent,
  TaskCompletedEvent,
  TaskBlockedEvent,
  PhaseQueuedEvent,
  PhaseStartedEvent,
  PhaseCompletedEvent,
  PhaseBlockedEvent,
  PhasePendingReviewEvent,
  PhaseChangesRequestedEvent,
  PhaseMergedEvent,
  TaskMergedEvent,
  MergeQueuedEvent,
  MergeStartedEvent,
  MergeCompletedEvent,
  MergeConflictedEvent,
  PageCreatedEvent,
  PageUpdatedEvent,
  PageDeletedEvent,
  AccountCredentialsRefreshedEvent,
  AccountCredentialsExpiredEvent,
  AccountCredentialsValidatedEvent,
  InitiativePendingReviewEvent,
  InitiativeReviewApprovedEvent,
  InitiativeChangesRequestedEvent,
  DomainEventMap,
  DomainEventType,
} from './types.js';

// Adapter implementation
export { EventEmitterBus } from './bus.js';

// Factory function for creating event bus instances
import { EventEmitterBus } from './bus.js';
import type { EventBus } from './types.js';

/**
 * Create a new EventBus instance.
 *
 * Returns the default in-process EventEmitter adapter.
 * This factory allows swapping implementations without changing call sites.
 */
export function createEventBus(): EventBus {
  return new EventEmitterBus();
}
