{"version":3,"sources":["../src/models/Card.ts","../src/models/Column.ts","../src/models/Board.ts","../src/models/index.ts","../src/index.ts","../src/store/Store.ts","../src/store/BoardStore.ts","../src/lib/DependencyEngine.ts","../src/store/DragStore.ts","../src/store/SelectionStore.ts","../src/views/ViewAdapter.ts","../src/views/ViewRegistry.ts","../src/runtime/Plugin.ts","../src/runtime/AsakaaRuntime.ts","../src/serialization/Serializer.ts","../src/serialization/JSONSerializer.ts","../src/serialization/BinarySerializer.ts","../src/serialization/SerializerRegistry.ts","../src/adapters/vanilla/BoardController.ts","../src/gantt/DependencyEngine.ts"],"names":["Card","Column","Board","cardEl","DependencyEngine"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Card Model - Immutable card entity\r\n * @module models/Card\r\n */\r\n\r\nimport type { CardData, Priority, CardStatus, Dependency } from '../types'\r\n\r\n/**\r\n * Immutable Card entity\r\n *\r\n * @example\r\n * ```typescript\r\n * const card = new Card({\r\n *   id: 'card-1',\r\n *   title: 'Implement login',\r\n *   columnId: 'todo',\r\n *   position: 0\r\n * })\r\n *\r\n * // Update creates a new instance\r\n * const updated = card.update({ title: 'Implement authentication' })\r\n * ```\r\n */\r\nexport class Card {\r\n  readonly id: string\r\n  readonly title: string\r\n  readonly description?: string\r\n  readonly position: number\r\n  readonly columnId: string\r\n  readonly priority?: Priority\r\n  readonly status?: CardStatus\r\n  readonly assignedUserIds?: readonly string[]\r\n  readonly labels?: readonly string[]\r\n  readonly startDate?: Date\r\n  readonly endDate?: Date\r\n  readonly dependencies?: readonly Dependency[]\r\n  readonly estimatedTime?: number\r\n  readonly actualTime?: number\r\n  readonly progress?: number\r\n  readonly metadata?: Readonly<Record<string, unknown>>\r\n  readonly createdAt: Date\r\n  readonly updatedAt: Date\r\n\r\n  constructor(data: Omit<CardData, 'createdAt' | 'updatedAt'> & { createdAt?: Date; updatedAt?: Date }) {\r\n    this.id = data.id\r\n    this.title = data.title\r\n    this.description = data.description\r\n    this.position = data.position\r\n    this.columnId = data.columnId\r\n    this.priority = data.priority\r\n    this.status = data.status\r\n    this.assignedUserIds = data.assignedUserIds ? Object.freeze([...data.assignedUserIds]) : undefined\r\n    this.labels = data.labels ? Object.freeze([...data.labels]) : undefined\r\n    this.startDate = data.startDate\r\n    this.endDate = data.endDate\r\n    this.dependencies = data.dependencies\r\n      ? Object.freeze(data.dependencies.map((dep) => Object.freeze({ ...dep })))\r\n      : undefined\r\n    this.estimatedTime = data.estimatedTime\r\n    this.actualTime = data.actualTime\r\n    this.progress = data.progress\r\n    this.metadata = data.metadata ? Object.freeze({ ...data.metadata }) : undefined\r\n    this.createdAt = data.createdAt || new Date()\r\n    this.updatedAt = data.updatedAt || new Date()\r\n\r\n    // Freeze the instance to make it immutable\r\n    Object.freeze(this)\r\n  }\r\n\r\n  /**\r\n   * Create a new Card instance with updated properties\r\n   *\r\n   * @param changes - Partial card data to update\r\n   * @returns New Card instance with applied changes\r\n   */\r\n  update(changes: Partial<Omit<CardData, 'id' | 'createdAt'>>): Card {\r\n    return new Card({\r\n      ...this.toData(),\r\n      ...changes,\r\n      updatedAt: new Date(),\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Convert Card instance to plain data object\r\n   *\r\n   * @returns CardData object\r\n   */\r\n  toData(): CardData {\r\n    return {\r\n      id: this.id,\r\n      title: this.title,\r\n      description: this.description,\r\n      position: this.position,\r\n      columnId: this.columnId,\r\n      priority: this.priority,\r\n      status: this.status,\r\n      assignedUserIds: this.assignedUserIds ? [...this.assignedUserIds] : undefined,\r\n      labels: this.labels ? [...this.labels] : undefined,\r\n      startDate: this.startDate,\r\n      endDate: this.endDate,\r\n      dependencies: this.dependencies ? this.dependencies.map((dep) => ({ ...dep })) : undefined,\r\n      estimatedTime: this.estimatedTime,\r\n      actualTime: this.actualTime,\r\n      progress: this.progress,\r\n      metadata: this.metadata ? { ...this.metadata } : undefined,\r\n      createdAt: this.createdAt,\r\n      updatedAt: this.updatedAt,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Create a Card from plain data object\r\n   *\r\n   * @param data - CardData object\r\n   * @returns Card instance\r\n   */\r\n  static fromData(data: CardData): Card {\r\n    return new Card(data)\r\n  }\r\n\r\n  /**\r\n   * Check if card is overdue\r\n   *\r\n   * @returns true if card has end date and it's in the past\r\n   */\r\n  isOverdue(): boolean {\r\n    if (!this.endDate) return false\r\n    return new Date(this.endDate) < new Date()\r\n  }\r\n\r\n  /**\r\n   * Get number of days until due date\r\n   *\r\n   * @returns Number of days until due (positive = future, negative = past), or undefined if no end date\r\n   */\r\n  getDaysUntilDue(): number | undefined {\r\n    if (!this.endDate) return undefined\r\n\r\n    const now = new Date()\r\n    const due = new Date(this.endDate)\r\n\r\n    // Calculate difference in milliseconds\r\n    const diffMs = due.getTime() - now.getTime()\r\n\r\n    // Convert to days (rounded)\r\n    return Math.round(diffMs / (1000 * 60 * 60 * 24))\r\n  }\r\n\r\n  /**\r\n   * Check if card is assigned to a specific user\r\n   *\r\n   * @param userId - User ID to check\r\n   * @returns true if user is assigned to this card\r\n   */\r\n  isAssignedTo(userId: string): boolean {\r\n    return this.assignedUserIds?.includes(userId) ?? false\r\n  }\r\n\r\n  /**\r\n   * Check if card has a specific label\r\n   *\r\n   * @param label - Label to check\r\n   * @returns true if card has the label\r\n   */\r\n  hasLabel(label: string): boolean {\r\n    return this.labels?.includes(label) ?? false\r\n  }\r\n\r\n  /**\r\n   * Calculate progress based on manual override or actual time vs estimated time\r\n   *\r\n   * @returns Progress percentage (0-100) or undefined if no estimate\r\n   */\r\n  getProgress(): number | undefined {\r\n    // Manual progress takes precedence\r\n    if (this.progress !== undefined) {\r\n      return Math.max(0, Math.min(100, this.progress))\r\n    }\r\n\r\n    // Calculate from time tracking\r\n    if (!this.estimatedTime || this.estimatedTime === 0) return undefined\r\n    if (!this.actualTime) return 0\r\n\r\n    const progress = (this.actualTime / this.estimatedTime) * 100\r\n    return Math.min(progress, 100) // Cap at 100%\r\n  }\r\n\r\n  /**\r\n   * Get duration in days between start and end date\r\n   *\r\n   * @returns Duration in days, or undefined if dates not set\r\n   */\r\n  getDuration(): number | undefined {\r\n    if (!this.startDate || !this.endDate) return undefined\r\n\r\n    const start = new Date(this.startDate)\r\n    const end = new Date(this.endDate)\r\n\r\n    const diffMs = end.getTime() - start.getTime()\r\n    return Math.ceil(diffMs / (1000 * 60 * 60 * 24)) // Round up to full days\r\n  }\r\n\r\n  /**\r\n   * Check if this card has any dependencies\r\n   *\r\n   * @returns true if card has dependencies\r\n   */\r\n  hasDependencies(): boolean {\r\n    return (this.dependencies?.length ?? 0) > 0\r\n  }\r\n\r\n  /**\r\n   * Get list of task IDs this card depends on\r\n   *\r\n   * @returns Array of dependent task IDs\r\n   */\r\n  getDependentTaskIds(): string[] {\r\n    if (!this.dependencies) return []\r\n    return this.dependencies.map((dep) => dep.taskId)\r\n  }\r\n\r\n  /**\r\n   * Check if this card depends on a specific task\r\n   *\r\n   * @param taskId - Task ID to check\r\n   * @returns true if this card depends on the specified task\r\n   */\r\n  dependsOn(taskId: string): boolean {\r\n    return this.getDependentTaskIds().includes(taskId)\r\n  }\r\n\r\n  /**\r\n   * Get dependency relationship with a specific task\r\n   *\r\n   * @param taskId - Task ID to check\r\n   * @returns Dependency object if exists, undefined otherwise\r\n   */\r\n  getDependency(taskId: string): Dependency | undefined {\r\n    return this.dependencies?.find((dep) => dep.taskId === taskId)\r\n  }\r\n\r\n  /**\r\n   * Add a dependency to this card\r\n   *\r\n   * @param dependency - Dependency to add\r\n   * @returns New Card instance with added dependency\r\n   */\r\n  addDependency(dependency: Dependency): Card {\r\n    const existingDeps = this.dependencies ? [...this.dependencies.map((d) => ({ ...d }))] : []\r\n\r\n    // Don't add if already exists\r\n    if (existingDeps.some((d) => d.taskId === dependency.taskId)) {\r\n      return this\r\n    }\r\n\r\n    return this.update({\r\n      dependencies: [...existingDeps, dependency],\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Remove a dependency from this card\r\n   *\r\n   * @param taskId - ID of task to remove dependency for\r\n   * @returns New Card instance with removed dependency\r\n   */\r\n  removeDependency(taskId: string): Card {\r\n    if (!this.dependencies) return this\r\n\r\n    const filtered = this.dependencies.filter((dep) => dep.taskId !== taskId).map((d) => ({ ...d }))\r\n\r\n    // If no change, return same instance\r\n    if (filtered.length === this.dependencies.length) {\r\n      return this\r\n    }\r\n\r\n    return this.update({\r\n      dependencies: filtered.length > 0 ? filtered : undefined,\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Check if dates are valid (start before end)\r\n   *\r\n   * @returns true if dates are valid or not set\r\n   */\r\n  hasValidDates(): boolean {\r\n    if (!this.startDate || !this.endDate) return true\r\n\r\n    return new Date(this.startDate) <= new Date(this.endDate)\r\n  }\r\n\r\n  /**\r\n   * Check if card is currently in progress (between start and end dates)\r\n   *\r\n   * @returns true if current date is between start and end dates\r\n   */\r\n  isInProgress(): boolean {\r\n    if (!this.startDate || !this.endDate) return false\r\n\r\n    const now = new Date()\r\n    const start = new Date(this.startDate)\r\n    const end = new Date(this.endDate)\r\n\r\n    return now >= start && now <= end\r\n  }\r\n\r\n  /**\r\n   * Check if card hasn't started yet\r\n   *\r\n   * @returns true if start date is in the future\r\n   */\r\n  isNotStarted(): boolean {\r\n    if (!this.startDate) return false\r\n\r\n    return new Date(this.startDate) > new Date()\r\n  }\r\n\r\n  /**\r\n   * Check if card is completed (past end date or 100% progress)\r\n   *\r\n   * @returns true if card is considered completed\r\n   */\r\n  isCompleted(): boolean {\r\n    // Check progress first\r\n    const progress = this.getProgress()\r\n    if (progress !== undefined && progress >= 100) return true\r\n\r\n    // Check status\r\n    if (this.status === 'DONE') return true\r\n\r\n    // Check if past end date\r\n    return this.isOverdue()\r\n  }\r\n}\r\n","/**\r\n * Column Model - Immutable column entity\r\n * @module models/Column\r\n */\r\n\r\nimport type { ColumnData } from '../types'\r\n\r\n/**\r\n * Immutable Column entity\r\n *\r\n * @example\r\n * ```typescript\r\n * const column = new Column({\r\n *   id: 'col-1',\r\n *   title: 'To Do',\r\n *   position: 0,\r\n *   cardIds: []\r\n * })\r\n *\r\n * // Add a card\r\n * const updated = column.addCard('card-1')\r\n * ```\r\n */\r\nexport class Column {\r\n  readonly id: string\r\n  readonly title: string\r\n  readonly position: number\r\n  readonly cardIds: readonly string[]\r\n  readonly wipLimit?: number\r\n  readonly wipLimitType?: 'soft' | 'hard'\r\n  readonly color?: string\r\n  readonly metadata?: Readonly<Record<string, unknown>>\r\n  readonly createdAt: Date\r\n  readonly updatedAt: Date\r\n\r\n  constructor(data: Omit<ColumnData, 'createdAt' | 'updatedAt'> & { createdAt?: Date; updatedAt?: Date }) {\r\n    this.id = data.id\r\n    this.title = data.title\r\n    this.position = data.position\r\n    this.cardIds = Object.freeze([...data.cardIds])\r\n    this.wipLimit = data.wipLimit\r\n    this.wipLimitType = data.wipLimitType\r\n    this.color = data.color\r\n    this.metadata = data.metadata ? Object.freeze({ ...data.metadata }) : undefined\r\n    this.createdAt = data.createdAt || new Date()\r\n    this.updatedAt = data.updatedAt || new Date()\r\n\r\n    // Freeze the instance\r\n    Object.freeze(this)\r\n  }\r\n\r\n  /**\r\n   * Create a new Column instance with updated properties\r\n   *\r\n   * @param changes - Partial column data to update\r\n   * @returns New Column instance with applied changes\r\n   */\r\n  update(changes: Partial<Omit<ColumnData, 'id' | 'createdAt'>>): Column {\r\n    return new Column({\r\n      ...this.toData(),\r\n      ...changes,\r\n      updatedAt: new Date(),\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Add a card to the column\r\n   *\r\n   * @param cardId - Card ID to add\r\n   * @param position - Position to insert (default: end)\r\n   * @returns New Column instance with card added\r\n   */\r\n  addCard(cardId: string, position?: number): Column {\r\n    const newCardIds = [...this.cardIds]\r\n    const insertPos = position ?? newCardIds.length\r\n\r\n    newCardIds.splice(insertPos, 0, cardId)\r\n\r\n    return this.update({ cardIds: newCardIds })\r\n  }\r\n\r\n  /**\r\n   * Remove a card from the column\r\n   *\r\n   * @param cardId - Card ID to remove\r\n   * @returns New Column instance with card removed\r\n   */\r\n  removeCard(cardId: string): Column {\r\n    const newCardIds = this.cardIds.filter(id => id !== cardId)\r\n    return this.update({ cardIds: newCardIds })\r\n  }\r\n\r\n  /**\r\n   * Move a card within the column\r\n   *\r\n   * @param cardId - Card ID to move\r\n   * @param newPosition - New position\r\n   * @returns New Column instance with card moved\r\n   */\r\n  moveCard(cardId: string, newPosition: number): Column {\r\n    const newCardIds = this.cardIds.filter(id => id !== cardId)\r\n    newCardIds.splice(newPosition, 0, cardId)\r\n    return this.update({ cardIds: newCardIds })\r\n  }\r\n\r\n  /**\r\n   * Check if column has a card\r\n   *\r\n   * @param cardId - Card ID to check\r\n   * @returns true if column contains the card\r\n   */\r\n  hasCard(cardId: string): boolean {\r\n    return this.cardIds.includes(cardId)\r\n  }\r\n\r\n  /**\r\n   * Get card count\r\n   *\r\n   * @returns Number of cards in the column\r\n   */\r\n  getCardCount(): number {\r\n    return this.cardIds.length\r\n  }\r\n\r\n  /**\r\n   * Check if WIP limit is exceeded\r\n   *\r\n   * @returns true if card count exceeds WIP limit\r\n   */\r\n  isWipLimitExceeded(): boolean {\r\n    if (!this.wipLimit) return false\r\n    return this.cardIds.length > this.wipLimit\r\n  }\r\n\r\n  /**\r\n   * Check if adding a card would exceed WIP limit\r\n   *\r\n   * @returns true if adding a card would exceed hard limit\r\n   */\r\n  canAddCard(): boolean {\r\n    if (!this.wipLimit || this.wipLimitType !== 'hard') return true\r\n    return this.cardIds.length < this.wipLimit\r\n  }\r\n\r\n  /**\r\n   * Convert Column instance to plain data object\r\n   *\r\n   * @returns ColumnData object\r\n   */\r\n  toData(): ColumnData {\r\n    return {\r\n      id: this.id,\r\n      title: this.title,\r\n      position: this.position,\r\n      cardIds: [...this.cardIds],\r\n      wipLimit: this.wipLimit,\r\n      wipLimitType: this.wipLimitType,\r\n      color: this.color,\r\n      metadata: this.metadata ? { ...this.metadata } : undefined,\r\n      createdAt: this.createdAt,\r\n      updatedAt: this.updatedAt,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Create a Column from plain data object\r\n   *\r\n   * @param data - ColumnData object\r\n   * @returns Column instance\r\n   */\r\n  static fromData(data: ColumnData): Column {\r\n    return new Column(data)\r\n  }\r\n}\r\n","/**\r\n * Board Model - Immutable board entity\r\n * @module models/Board\r\n */\r\n\r\nimport type { BoardData, BoardSettings } from '../types'\r\n\r\n/**\r\n * Immutable Board entity\r\n *\r\n * @example\r\n * ```typescript\r\n * const board = new Board({\r\n *   id: 'board-1',\r\n *   title: 'My Project',\r\n *   columnIds: ['todo', 'in-progress', 'done']\r\n * })\r\n *\r\n * // Add a column\r\n * const updated = board.addColumn('review')\r\n * ```\r\n */\r\nexport class Board {\r\n  readonly id: string\r\n  readonly title: string\r\n  readonly description?: string\r\n  readonly columnIds: readonly string[]\r\n  readonly settings?: Readonly<BoardSettings>\r\n  readonly metadata?: Readonly<Record<string, unknown>>\r\n  readonly createdAt: Date\r\n  readonly updatedAt: Date\r\n\r\n  constructor(data: Omit<BoardData, 'createdAt' | 'updatedAt'> & { createdAt?: Date; updatedAt?: Date }) {\r\n    this.id = data.id\r\n    this.title = data.title\r\n    this.description = data.description\r\n    this.columnIds = Object.freeze([...data.columnIds])\r\n    this.settings = data.settings ? Object.freeze({ ...data.settings }) : undefined\r\n    this.metadata = data.metadata ? Object.freeze({ ...data.metadata }) : undefined\r\n    this.createdAt = data.createdAt || new Date()\r\n    this.updatedAt = data.updatedAt || new Date()\r\n\r\n    // Freeze the instance\r\n    Object.freeze(this)\r\n  }\r\n\r\n  /**\r\n   * Create a new Board instance with updated properties\r\n   *\r\n   * @param changes - Partial board data to update\r\n   * @returns New Board instance with applied changes\r\n   */\r\n  update(changes: Partial<Omit<BoardData, 'id' | 'createdAt'>>): Board {\r\n    return new Board({\r\n      ...this.toData(),\r\n      ...changes,\r\n      updatedAt: new Date(),\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Add a column to the board\r\n   *\r\n   * @param columnId - Column ID to add\r\n   * @param position - Position to insert (default: end)\r\n   * @returns New Board instance with column added\r\n   */\r\n  addColumn(columnId: string, position?: number): Board {\r\n    const newColumnIds = [...this.columnIds]\r\n    const insertPos = position ?? newColumnIds.length\r\n\r\n    newColumnIds.splice(insertPos, 0, columnId)\r\n\r\n    return this.update({ columnIds: newColumnIds })\r\n  }\r\n\r\n  /**\r\n   * Remove a column from the board\r\n   *\r\n   * @param columnId - Column ID to remove\r\n   * @returns New Board instance with column removed\r\n   */\r\n  removeColumn(columnId: string): Board {\r\n    const newColumnIds = this.columnIds.filter(id => id !== columnId)\r\n    return this.update({ columnIds: newColumnIds })\r\n  }\r\n\r\n  /**\r\n   * Reorder columns\r\n   *\r\n   * @param columnIds - New column order\r\n   * @returns New Board instance with columns reordered\r\n   */\r\n  reorderColumns(columnIds: string[]): Board {\r\n    // Validate that all column IDs are present\r\n    if (columnIds.length !== this.columnIds.length) {\r\n      throw new Error('Column IDs length mismatch')\r\n    }\r\n\r\n    const sortedExisting = [...this.columnIds].sort()\r\n    const sortedNew = [...columnIds].sort()\r\n\r\n    if (JSON.stringify(sortedExisting) !== JSON.stringify(sortedNew)) {\r\n      throw new Error('Column IDs mismatch')\r\n    }\r\n\r\n    return this.update({ columnIds })\r\n  }\r\n\r\n  /**\r\n   * Move a column to a new position\r\n   *\r\n   * @param columnId - Column ID to move\r\n   * @param newPosition - New position\r\n   * @returns New Board instance with column moved\r\n   */\r\n  moveColumn(columnId: string, newPosition: number): Board {\r\n    const newColumnIds = this.columnIds.filter(id => id !== columnId)\r\n    newColumnIds.splice(newPosition, 0, columnId)\r\n    return this.update({ columnIds: newColumnIds })\r\n  }\r\n\r\n  /**\r\n   * Check if board has a column\r\n   *\r\n   * @param columnId - Column ID to check\r\n   * @returns true if board contains the column\r\n   */\r\n  hasColumn(columnId: string): boolean {\r\n    return this.columnIds.includes(columnId)\r\n  }\r\n\r\n  /**\r\n   * Get column count\r\n   *\r\n   * @returns Number of columns in the board\r\n   */\r\n  getColumnCount(): number {\r\n    return this.columnIds.length\r\n  }\r\n\r\n  /**\r\n   * Get column position\r\n   *\r\n   * @param columnId - Column ID\r\n   * @returns Column position or -1 if not found\r\n   */\r\n  getColumnPosition(columnId: string): number {\r\n    return this.columnIds.indexOf(columnId)\r\n  }\r\n\r\n  /**\r\n   * Update board settings\r\n   *\r\n   * @param settings - Partial settings to update\r\n   * @returns New Board instance with settings updated\r\n   */\r\n  updateSettings(settings: Partial<BoardSettings>): Board {\r\n    return this.update({\r\n      settings: {\r\n        ...this.settings,\r\n        ...settings,\r\n      },\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Convert Board instance to plain data object\r\n   *\r\n   * @returns BoardData object\r\n   */\r\n  toData(): BoardData {\r\n    return {\r\n      id: this.id,\r\n      title: this.title,\r\n      description: this.description,\r\n      columnIds: [...this.columnIds],\r\n      settings: this.settings ? { ...this.settings } : undefined,\r\n      metadata: this.metadata ? { ...this.metadata } : undefined,\r\n      createdAt: this.createdAt,\r\n      updatedAt: this.updatedAt,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Create a Board from plain data object\r\n   *\r\n   * @param data - BoardData object\r\n   * @returns Board instance\r\n   */\r\n  static fromData(data: BoardData): Board {\r\n    return new Board(data)\r\n  }\r\n}\r\n","/**\r\n * Immutable models for ASAKAA Core\r\n * @module models\r\n */\r\n\r\nexport { Card } from './Card'\r\nexport { Column } from './Column'\r\nexport { Board } from './Board'\r\n","/**\r\n * @libxai/core - Framework-agnostic core logic\r\n *\r\n * Pure TypeScript business logic with 0 UI dependencies.\r\n * Use with React, Vue, Svelte, or Vanilla JS.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// Models\r\nexport { Card, Column, Board } from './models'\r\n\r\n// Store\r\nexport { Store, BoardStore, DragStore, dragStore, SelectionStore, selectionStore } from './store'\r\nexport type {\r\n  BoardState,\r\n  DragState,\r\n  DragEvent,\r\n  DragEventData,\r\n  DragEventCallback,\r\n  SelectionState,\r\n  SelectionEvent,\r\n  SelectionEventData,\r\n  SelectionEventCallback,\r\n} from './store'\r\n\r\n// Types\r\nexport type {\r\n  // Base types\r\n  Priority,\r\n  CardStatus,\r\n  Dependency,\r\n  DependencyType,\r\n  BaseEntity,\r\n  CardData,\r\n  ColumnData,\r\n  BoardData,\r\n  BoardSettings,\r\n  UserData,\r\n  // Event types\r\n  EventListener,\r\n  StoreEvent,\r\n  CardEvent,\r\n  ColumnEvent,\r\n  BoardEvent,\r\n  AnyEvent,\r\n  EventType,\r\n  // Gantt types\r\n  Milestone,\r\n  Baseline,\r\n  BaselineCardSnapshot,\r\n  CriticalPath,\r\n  ScheduledTask,\r\n  ResourceAllocation,\r\n  ResourceUtilization,\r\n  GanttConfig,\r\n  GanttState,\r\n  DependencyValidation,\r\n  AutoScheduleOptions,\r\n  TaskConstraintType,\r\n  TaskConstraint,\r\n} from './types'\r\n\r\n// Views\r\nexport { BaseViewAdapter, ViewRegistry } from './views'\r\nexport type {\r\n  ViewAdapter,\r\n  ViewEvent,\r\n  ViewEventData,\r\n  ViewEventCallback,\r\n  ViewOptions,\r\n  ExportFormat,\r\n  ViewBoardData,\r\n} from './views'\r\nexport type {\r\n  ViewRegistryEvent,\r\n  ViewRegistryEventData,\r\n  ViewRegistryEventCallback,\r\n  ViewMetadata,\r\n} from './views'\r\n\r\n// Runtime\r\nexport { AsakaaRuntime, PluginRegistry } from './runtime'\r\nexport type {\r\n  RuntimeConfig,\r\n  RuntimeEvent,\r\n  RuntimeEventData,\r\n  RuntimeEventCallback,\r\n  SerializationFormat,\r\n  SerializedBoardData,\r\n  Plugin,\r\n  PluginContext,\r\n  PluginMetadata,\r\n} from './runtime'\r\n\r\n// Serialization\r\nexport {\r\n  JSONSerializer,\r\n  createJSONSerializer,\r\n  BinarySerializer,\r\n  createBinarySerializer,\r\n  SerializerRegistry,\r\n  serializerRegistry,\r\n  BaseSerializer,\r\n} from './serialization'\r\nexport type {\r\n  Serializer,\r\n  SerializedData,\r\n  SerializationOptions,\r\n  SerializerFormat,\r\n} from './serialization'\r\n\r\n// Adapters\r\nexport { BoardController } from './adapters/vanilla'\r\nexport type { BoardControllerOptions, EventHandler } from './adapters/vanilla'\r\n\r\n// Gantt - Dependency engine and utilities\r\nexport { DependencyEngine } from './gantt'\r\n","/**\r\n * Event-based Store - Framework-agnostic state management\r\n * @module store/Store\r\n */\r\n\r\nimport type { EventListener, StoreEvent } from '../types'\r\n\r\n/**\r\n * Generic event-based store using pub/sub pattern\r\n *\r\n * @example\r\n * ```typescript\r\n * interface AppState {\r\n *   count: number\r\n * }\r\n *\r\n * const store = new Store<AppState>({ count: 0 })\r\n *\r\n * // Subscribe to events\r\n * store.subscribe('count:changed', (event) => {\r\n *   console.log('Count:', event.data)\r\n * })\r\n *\r\n * // Emit events\r\n * store.emit('count:changed', { count: 1 })\r\n *\r\n * // Update state\r\n * store.setState(state => ({ count: state.count + 1 }))\r\n * ```\r\n */\r\nexport class Store<TState = unknown> {\r\n  private state: TState\r\n  private subscribers: Map<string, Set<EventListener>>\r\n  private globalSubscribers: Set<EventListener>\r\n\r\n  constructor(initialState: TState) {\r\n    this.state = initialState\r\n    this.subscribers = new Map()\r\n    this.globalSubscribers = new Set()\r\n  }\r\n\r\n  /**\r\n   * Get current state (readonly)\r\n   *\r\n   * @returns Current state\r\n   */\r\n  getState(): Readonly<TState> {\r\n    return this.state\r\n  }\r\n\r\n  /**\r\n   * Update state\r\n   *\r\n   * @param updater - Function that receives current state and returns new state\r\n   * @returns New state\r\n   */\r\n  setState(updater: (state: TState) => TState): TState {\r\n    const prevState = this.state\r\n    this.state = updater(this.state)\r\n\r\n    // Emit state:changed event\r\n    this.emit('state:changed', {\r\n      prevState,\r\n      nextState: this.state,\r\n    })\r\n\r\n    return this.state\r\n  }\r\n\r\n  /**\r\n   * Subscribe to a specific event\r\n   *\r\n   * @param eventType - Event type to listen to\r\n   * @param listener - Listener function\r\n   * @returns Unsubscribe function\r\n   */\r\n  subscribe(eventType: string, listener: EventListener): () => void {\r\n    if (!this.subscribers.has(eventType)) {\r\n      this.subscribers.set(eventType, new Set())\r\n    }\r\n\r\n    const listeners = this.subscribers.get(eventType)!\r\n    listeners.add(listener)\r\n\r\n    // Return unsubscribe function\r\n    return () => {\r\n      listeners.delete(listener)\r\n      if (listeners.size === 0) {\r\n        this.subscribers.delete(eventType)\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Subscribe to all events\r\n   *\r\n   * @param listener - Listener function\r\n   * @returns Unsubscribe function\r\n   */\r\n  subscribeAll(listener: EventListener): () => void {\r\n    this.globalSubscribers.add(listener)\r\n\r\n    return () => {\r\n      this.globalSubscribers.delete(listener)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Emit an event\r\n   *\r\n   * @param eventType - Event type\r\n   * @param data - Event data\r\n   * @param metadata - Optional metadata\r\n   */\r\n  emit<T = unknown>(eventType: string, data: T, metadata?: Record<string, unknown>): void {\r\n    const event: StoreEvent<T> = {\r\n      type: eventType,\r\n      data,\r\n      timestamp: new Date(),\r\n      metadata,\r\n    }\r\n\r\n    // Notify specific event subscribers\r\n    const listeners = this.subscribers.get(eventType)\r\n    if (listeners) {\r\n      listeners.forEach(listener => {\r\n        try {\r\n          listener(event)\r\n        } catch (error) {\r\n          console.error(`Error in event listener for ${eventType}:`, error)\r\n        }\r\n      })\r\n    }\r\n\r\n    // Notify global subscribers\r\n    this.globalSubscribers.forEach(listener => {\r\n      try {\r\n        listener(event)\r\n      } catch (error) {\r\n        console.error(`Error in global event listener:`, error)\r\n      }\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Clear all subscribers\r\n   */\r\n  clearSubscribers(): void {\r\n    this.subscribers.clear()\r\n    this.globalSubscribers.clear()\r\n  }\r\n\r\n  /**\r\n   * Get subscriber count for an event\r\n   *\r\n   * @param eventType - Event type (omit for total count)\r\n   * @returns Number of subscribers\r\n   */\r\n  getSubscriberCount(eventType?: string): number {\r\n    if (eventType) {\r\n      return this.subscribers.get(eventType)?.size ?? 0\r\n    }\r\n\r\n    let total = this.globalSubscribers.size\r\n    this.subscribers.forEach(listeners => {\r\n      total += listeners.size\r\n    })\r\n    return total\r\n  }\r\n\r\n  /**\r\n   * Check if there are any subscribers for an event\r\n   *\r\n   * @param eventType - Event type\r\n   * @returns true if there are subscribers\r\n   */\r\n  hasSubscribers(eventType: string): boolean {\r\n    return this.getSubscriberCount(eventType) > 0\r\n  }\r\n}\r\n","/**\r\n * BoardStore - Specialized store for board data\r\n * @module store/BoardStore\r\n */\r\n\r\nimport { Store } from './Store'\r\nimport { Card, Column, Board } from '../models'\r\nimport type { CardData, ColumnData, BoardData, Dependency } from '../types'\r\nimport { DependencyEngine } from '../lib/DependencyEngine'\r\n\r\n/**\r\n * Board state structure\r\n */\r\nexport interface BoardState {\r\n  board: Board | null\r\n  columns: Map<string, Column>\r\n  cards: Map<string, Card>\r\n}\r\n\r\n/**\r\n * Specialized store for managing board, columns, and cards\r\n *\r\n * @example\r\n * ```typescript\r\n * const boardStore = new BoardStore({\r\n *   board: new Board({ id: 'b1', title: 'Project', columnIds: [] }),\r\n *   columns: new Map(),\r\n *   cards: new Map()\r\n * })\r\n *\r\n * // Subscribe to card events\r\n * boardStore.subscribe('card:created', (event) => {\r\n *   console.log('New card:', event.data)\r\n * })\r\n *\r\n * // Add a card\r\n * boardStore.addCard({\r\n *   id: 'card-1',\r\n *   title: 'Task 1',\r\n *   columnId: 'todo',\r\n *   position: 0\r\n * })\r\n * ```\r\n */\r\nexport class BoardStore extends Store<BoardState> {\r\n  private dependencyEngine: DependencyEngine\r\n\r\n  constructor(initialState?: Partial<BoardState>) {\r\n    super({\r\n      board: initialState?.board || null,\r\n      columns: initialState?.columns || new Map(),\r\n      cards: initialState?.cards || new Map(),\r\n    })\r\n    this.dependencyEngine = new DependencyEngine()\r\n  }\r\n\r\n  // ========================================================================\r\n  // BOARD OPERATIONS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Set the board\r\n   */\r\n  setBoard(boardData: BoardData): void {\r\n    const board = Board.fromData(boardData)\r\n\r\n    this.setState(state => ({\r\n      ...state,\r\n      board,\r\n    }))\r\n\r\n    this.emit('board:created', board.toData())\r\n  }\r\n\r\n  /**\r\n   * Update the board\r\n   */\r\n  updateBoard(changes: Partial<Omit<BoardData, 'id' | 'createdAt'>>): void {\r\n    this.setState(state => {\r\n      if (!state.board) throw new Error('No board set')\r\n\r\n      const updatedBoard = state.board.update(changes)\r\n\r\n      return {\r\n        ...state,\r\n        board: updatedBoard,\r\n      }\r\n    })\r\n\r\n    this.emit('board:updated', { id: this.getState().board!.id, changes })\r\n  }\r\n\r\n  /**\r\n   * Get board\r\n   */\r\n  getBoard(): Board | null {\r\n    return this.getState().board\r\n  }\r\n\r\n  // ========================================================================\r\n  // COLUMN OPERATIONS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Add a column\r\n   */\r\n  addColumn(columnData: Omit<ColumnData, 'createdAt' | 'updatedAt'>): Column {\r\n    const column = new Column(columnData)\r\n\r\n    this.setState(state => {\r\n      const newColumns = new Map(state.columns)\r\n      newColumns.set(column.id, column)\r\n\r\n      const updatedBoard = state.board?.addColumn(column.id)\r\n\r\n      return {\r\n        ...state,\r\n        columns: newColumns,\r\n        board: updatedBoard || state.board,\r\n      }\r\n    })\r\n\r\n    this.emit('column:created', column.toData())\r\n\r\n    return column\r\n  }\r\n\r\n  /**\r\n   * Update a column\r\n   */\r\n  updateColumn(columnId: string, changes: Partial<Omit<ColumnData, 'id' | 'createdAt'>>): void {\r\n    this.setState(state => {\r\n      const column = state.columns.get(columnId)\r\n      if (!column) throw new Error(`Column ${columnId} not found`)\r\n\r\n      const updatedColumn = column.update(changes)\r\n      const newColumns = new Map(state.columns)\r\n      newColumns.set(columnId, updatedColumn)\r\n\r\n      return {\r\n        ...state,\r\n        columns: newColumns,\r\n      }\r\n    })\r\n\r\n    this.emit('column:updated', { id: columnId, changes })\r\n  }\r\n\r\n  /**\r\n   * Delete a column\r\n   */\r\n  deleteColumn(columnId: string): void {\r\n    this.setState(state => {\r\n      const newColumns = new Map(state.columns)\r\n      newColumns.delete(columnId)\r\n\r\n      const updatedBoard = state.board?.removeColumn(columnId)\r\n\r\n      return {\r\n        ...state,\r\n        columns: newColumns,\r\n        board: updatedBoard || state.board,\r\n      }\r\n    })\r\n\r\n    this.emit('column:deleted', { id: columnId })\r\n  }\r\n\r\n  /**\r\n   * Get a column by ID\r\n   */\r\n  getColumn(columnId: string): Column | undefined {\r\n    return this.getState().columns.get(columnId)\r\n  }\r\n\r\n  /**\r\n   * Get all columns\r\n   */\r\n  getAllColumns(): Column[] {\r\n    return Array.from(this.getState().columns.values())\r\n  }\r\n\r\n  // ========================================================================\r\n  // CARD OPERATIONS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Add a card\r\n   */\r\n  addCard(cardData: Omit<CardData, 'createdAt' | 'updatedAt'>): Card {\r\n    const card = new Card(cardData)\r\n\r\n    this.setState(state => {\r\n      const newCards = new Map(state.cards)\r\n      newCards.set(card.id, card)\r\n\r\n      // Add card to column\r\n      const column = state.columns.get(card.columnId)\r\n      if (column) {\r\n        const updatedColumn = column.addCard(card.id)\r\n        const newColumns = new Map(state.columns)\r\n        newColumns.set(column.id, updatedColumn)\r\n\r\n        return {\r\n          ...state,\r\n          cards: newCards,\r\n          columns: newColumns,\r\n        }\r\n      }\r\n\r\n      return {\r\n        ...state,\r\n        cards: newCards,\r\n      }\r\n    })\r\n\r\n    this.emit('card:created', card.toData())\r\n\r\n    return card\r\n  }\r\n\r\n  /**\r\n   * Update a card\r\n   */\r\n  updateCard(cardId: string, changes: Partial<Omit<CardData, 'id' | 'createdAt'>>): void {\r\n    this.setState(state => {\r\n      const card = state.cards.get(cardId)\r\n      if (!card) throw new Error(`Card ${cardId} not found`)\r\n\r\n      const updatedCard = card.update(changes)\r\n      const newCards = new Map(state.cards)\r\n      newCards.set(cardId, updatedCard)\r\n\r\n      return {\r\n        ...state,\r\n        cards: newCards,\r\n      }\r\n    })\r\n\r\n    this.emit('card:updated', { id: cardId, changes })\r\n  }\r\n\r\n  /**\r\n   * Delete a card\r\n   */\r\n  deleteCard(cardId: string): void {\r\n    const card = this.getState().cards.get(cardId)\r\n    if (!card) return\r\n\r\n    this.setState(state => {\r\n      const newCards = new Map(state.cards)\r\n      newCards.delete(cardId)\r\n\r\n      // Remove card from column\r\n      const column = state.columns.get(card.columnId)\r\n      if (column) {\r\n        const updatedColumn = column.removeCard(cardId)\r\n        const newColumns = new Map(state.columns)\r\n        newColumns.set(column.id, updatedColumn)\r\n\r\n        return {\r\n          ...state,\r\n          cards: newCards,\r\n          columns: newColumns,\r\n        }\r\n      }\r\n\r\n      return {\r\n        ...state,\r\n        cards: newCards,\r\n      }\r\n    })\r\n\r\n    this.emit('card:deleted', { id: cardId })\r\n  }\r\n\r\n  /**\r\n   * Move a card to another column\r\n   */\r\n  moveCard(cardId: string, toColumnId: string, newPosition: number): void {\r\n    this.setState(state => {\r\n      const card = state.cards.get(cardId)\r\n      if (!card) throw new Error(`Card ${cardId} not found`)\r\n\r\n      const fromColumnId = card.columnId\r\n\r\n      // Update card\r\n      const updatedCard = card.update({ columnId: toColumnId, position: newPosition })\r\n      const newCards = new Map(state.cards)\r\n      newCards.set(cardId, updatedCard)\r\n\r\n      // Update columns\r\n      const newColumns = new Map(state.columns)\r\n\r\n      // Remove from old column\r\n      const fromColumn = state.columns.get(fromColumnId)\r\n      if (fromColumn) {\r\n        newColumns.set(fromColumnId, fromColumn.removeCard(cardId))\r\n      }\r\n\r\n      // Add to new column\r\n      const toColumn = state.columns.get(toColumnId)\r\n      if (toColumn) {\r\n        newColumns.set(toColumnId, toColumn.addCard(cardId, newPosition))\r\n      }\r\n\r\n      return {\r\n        ...state,\r\n        cards: newCards,\r\n        columns: newColumns,\r\n      }\r\n    })\r\n\r\n    this.emit('card:moved', {\r\n      id: cardId,\r\n      fromColumnId: this.getState().cards.get(cardId)!.columnId,\r\n      toColumnId,\r\n      newPosition,\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Get a card by ID\r\n   */\r\n  getCard(cardId: string): Card | undefined {\r\n    return this.getState().cards.get(cardId)\r\n  }\r\n\r\n  /**\r\n   * Get all cards\r\n   */\r\n  getAllCards(): Card[] {\r\n    return Array.from(this.getState().cards.values())\r\n  }\r\n\r\n  /**\r\n   * Get cards by column ID\r\n   */\r\n  getCardsByColumn(columnId: string): Card[] {\r\n    const column = this.getColumn(columnId)\r\n    if (!column) return []\r\n\r\n    return column.cardIds\r\n      .map(cardId => this.getState().cards.get(cardId))\r\n      .filter((card): card is Card => card !== undefined)\r\n  }\r\n\r\n  // ========================================================================\r\n  // DEPENDENCY OPERATIONS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Add a dependency to a card\r\n   *\r\n   * @param cardId - Card to add dependency to\r\n   * @param dependency - Dependency configuration\r\n   * @throws Error if dependency would create a cycle\r\n   */\r\n  addDependency(cardId: string, dependency: Dependency): void {\r\n    const card = this.getCard(cardId)\r\n    if (!card) {\r\n      throw new Error(`Card ${cardId} not found`)\r\n    }\r\n\r\n    // Check if dependency task exists\r\n    const depTask = this.getCard(dependency.taskId)\r\n    if (!depTask) {\r\n      throw new Error(`Dependency task ${dependency.taskId} not found`)\r\n    }\r\n\r\n    // Check if would create circular dependency\r\n    if (this.dependencyEngine.wouldCreateCycle(this.getAllCards(), cardId, dependency.taskId)) {\r\n      throw new Error(`Adding dependency would create a circular dependency`)\r\n    }\r\n\r\n    // Add dependency to card\r\n    const updatedCard = card.addDependency(dependency)\r\n    const newCards = new Map(this.getState().cards)\r\n    newCards.set(cardId, updatedCard)\r\n\r\n    this.setState(state => ({\r\n      ...state,\r\n      cards: newCards,\r\n    }))\r\n\r\n    this.emit('card:dependency:added', { cardId, dependency })\r\n  }\r\n\r\n  /**\r\n   * Remove a dependency from a card\r\n   *\r\n   * @param cardId - Card to remove dependency from\r\n   * @param dependencyTaskId - ID of task to remove dependency for\r\n   */\r\n  removeDependency(cardId: string, dependencyTaskId: string): void {\r\n    const card = this.getCard(cardId)\r\n    if (!card) {\r\n      throw new Error(`Card ${cardId} not found`)\r\n    }\r\n\r\n    const updatedCard = card.removeDependency(dependencyTaskId)\r\n\r\n    // Only update if changed\r\n    if (updatedCard !== card) {\r\n      const newCards = new Map(this.getState().cards)\r\n      newCards.set(cardId, updatedCard)\r\n\r\n      this.setState(state => ({\r\n        ...state,\r\n        cards: newCards,\r\n      }))\r\n\r\n      this.emit('card:dependency:removed', { cardId, dependencyTaskId })\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get all dependencies for a card\r\n   *\r\n   * @param cardId - Card ID to get dependencies for\r\n   * @returns Array of cards this card depends on\r\n   */\r\n  getDependencies(cardId: string): Card[] {\r\n    const card = this.getCard(cardId)\r\n    if (!card || !card.dependencies) return []\r\n\r\n    const dependentTaskIds = card.getDependentTaskIds()\r\n    return this.getAllCards().filter(c => dependentTaskIds.includes(c.id))\r\n  }\r\n\r\n  /**\r\n   * Get all cards that depend on a given card (successors)\r\n   *\r\n   * @param cardId - Card ID to find dependents for\r\n   * @returns Array of cards that depend on this card\r\n   */\r\n  getDependentCards(cardId: string): Card[] {\r\n    return this.dependencyEngine.getSuccessors(this.getAllCards(), cardId)\r\n  }\r\n\r\n  /**\r\n   * Validate all dependencies in the board\r\n   *\r\n   * @throws Error if validation fails\r\n   */\r\n  validateDependencies(): void {\r\n    this.dependencyEngine.validateDependencies(this.getAllCards())\r\n  }\r\n\r\n  /**\r\n   * Resolve all dependencies and get topological order\r\n   *\r\n   * @returns Dependency resolution result with ordered tasks and critical path\r\n   */\r\n  resolveDependencies() {\r\n    return this.dependencyEngine.resolveDependencies(this.getAllCards())\r\n  }\r\n\r\n  /**\r\n   * Get cards in dependency order (dependencies first)\r\n   *\r\n   * @returns Cards sorted in topological order\r\n   */\r\n  getCardsInDependencyOrder(): Card[] {\r\n    const result = this.dependencyEngine.resolveDependencies(this.getAllCards())\r\n    return result.orderedTasks\r\n  }\r\n\r\n  /**\r\n   * Get critical path task IDs\r\n   *\r\n   * @returns Array of task IDs on the critical path\r\n   */\r\n  getCriticalPath(): string[] {\r\n    const result = this.dependencyEngine.resolveDependencies(this.getAllCards())\r\n    return result.criticalPath\r\n  }\r\n\r\n  /**\r\n   * Check if a card is on the critical path\r\n   *\r\n   * @param cardId - Card ID to check\r\n   * @returns true if card is on critical path\r\n   */\r\n  isOnCriticalPath(cardId: string): boolean {\r\n    const criticalPath = this.getCriticalPath()\r\n    return criticalPath.includes(cardId)\r\n  }\r\n\r\n  /**\r\n   * Update card dates based on dependencies (auto-schedule)\r\n   *\r\n   * This recalculates start dates for all cards based on their dependencies\r\n   */\r\n  autoSchedule(): void {\r\n    const result = this.dependencyEngine.resolveDependencies(this.getAllCards())\r\n\r\n    // Update each card with its calculated earliest start\r\n    const newCards = new Map(this.getState().cards)\r\n\r\n    result.orderedTasks.forEach(task => {\r\n      const earliestStart = result.earliestStarts.get(task.id)\r\n      if (earliestStart && task.startDate) {\r\n        const currentStart = new Date(task.startDate)\r\n\r\n        // Only update if calculated start is later than current start\r\n        if (earliestStart > currentStart) {\r\n          const duration = task.getDuration() || 0\r\n          const newEnd = new Date(earliestStart)\r\n          newEnd.setDate(newEnd.getDate() + duration)\r\n\r\n          const updatedCard = task.update({\r\n            startDate: earliestStart,\r\n            endDate: newEnd,\r\n          })\r\n\r\n          newCards.set(task.id, updatedCard)\r\n        }\r\n      }\r\n    })\r\n\r\n    this.setState(state => ({\r\n      ...state,\r\n      cards: newCards,\r\n    }))\r\n\r\n    this.emit('cards:auto-scheduled', { count: result.orderedTasks.length })\r\n  }\r\n}\r\n","/**\r\n * Dependency Engine - Manage task dependencies for Gantt scheduling\r\n * @module lib/DependencyEngine\r\n */\r\n\r\nimport type { Card } from '../models/Card'\r\n// Dependency type is used indirectly through Card model, not directly in this file\r\n// import type { Dependency } from '../types'\r\n\r\n/**\r\n * Result of dependency resolution\r\n */\r\nexport interface DependencyResolutionResult {\r\n  /** Tasks in topological order (dependencies first) */\r\n  orderedTasks: Card[]\r\n  /** Critical path task IDs */\r\n  criticalPath: string[]\r\n  /** Tasks that have circular dependencies */\r\n  circularDependencies: string[][]\r\n  /** Earliest start dates for each task */\r\n  earliestStarts: Map<string, Date>\r\n}\r\n\r\n/**\r\n * Dependency validation error\r\n */\r\nexport class DependencyError extends Error {\r\n  constructor(\r\n    message: string,\r\n    public readonly type: 'circular' | 'missing' | 'invalid',\r\n    public readonly taskIds: string[]\r\n  ) {\r\n    super(message)\r\n    this.name = 'DependencyError'\r\n  }\r\n}\r\n\r\n/**\r\n * DependencyEngine - Core engine for managing task dependencies\r\n *\r\n * Features:\r\n * - Topological sorting of tasks\r\n * - Circular dependency detection\r\n * - Critical path calculation\r\n * - Earliest start date calculation\r\n * - Support for all dependency types (FS, SS, FF, SF)\r\n *\r\n * @example\r\n * ```typescript\r\n * const engine = new DependencyEngine()\r\n * const result = engine.resolveDependencies(tasks)\r\n *\r\n * if (result.circularDependencies.length > 0) {\r\n *   console.error('Circular dependencies detected!')\r\n * }\r\n *\r\n * console.log('Critical path:', result.criticalPath)\r\n * ```\r\n */\r\nexport class DependencyEngine {\r\n  /**\r\n   * Resolve all dependencies and calculate scheduling information\r\n   *\r\n   * @param tasks - Array of tasks to analyze\r\n   * @returns Dependency resolution result\r\n   */\r\n  resolveDependencies(tasks: Card[]): DependencyResolutionResult {\r\n    // Build dependency graph\r\n    const graph = this.buildDependencyGraph(tasks)\r\n\r\n    // Detect circular dependencies\r\n    const circularDependencies = this.detectCycles(graph, tasks)\r\n\r\n    // Topological sort\r\n    const orderedTasks = this.topologicalSort(tasks, graph)\r\n\r\n    // Calculate earliest start dates\r\n    const earliestStarts = this.calculateEarliestStarts(orderedTasks, tasks)\r\n\r\n    // Calculate critical path\r\n    const criticalPath = this.calculateCriticalPath(orderedTasks, earliestStarts)\r\n\r\n    return {\r\n      orderedTasks,\r\n      criticalPath,\r\n      circularDependencies,\r\n      earliestStarts,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Build dependency graph (adjacency list)\r\n   *\r\n   * @param tasks - Array of tasks\r\n   * @returns Map of task ID to dependent task IDs\r\n   */\r\n  private buildDependencyGraph(tasks: Card[]): Map<string, Set<string>> {\r\n    const graph = new Map<string, Set<string>>()\r\n\r\n    // Initialize graph with all task IDs\r\n    tasks.forEach((task) => {\r\n      if (!graph.has(task.id)) {\r\n        graph.set(task.id, new Set())\r\n      }\r\n    })\r\n\r\n    // Add edges (dependencies)\r\n    tasks.forEach((task) => {\r\n      if (task.dependencies) {\r\n        task.dependencies.forEach((dep) => {\r\n          if (!graph.has(dep.taskId)) {\r\n            graph.set(dep.taskId, new Set())\r\n          }\r\n          // Edge from dependency to task (dependency -> task)\r\n          graph.get(dep.taskId)!.add(task.id)\r\n        })\r\n      }\r\n    })\r\n\r\n    return graph\r\n  }\r\n\r\n  /**\r\n   * Detect circular dependencies using DFS\r\n   *\r\n   * @param graph - Dependency graph\r\n   * @param tasks - Array of tasks\r\n   * @returns Array of circular dependency chains\r\n   */\r\n  private detectCycles(graph: Map<string, Set<string>>, tasks: Card[]): string[][] {\r\n    const visited = new Set<string>()\r\n    const recursionStack = new Set<string>()\r\n    const cycles: string[][] = []\r\n\r\n    const dfs = (nodeId: string, path: string[]): void => {\r\n      visited.add(nodeId)\r\n      recursionStack.add(nodeId)\r\n      path.push(nodeId)\r\n\r\n      const neighbors = graph.get(nodeId) || new Set()\r\n\r\n      for (const neighbor of neighbors) {\r\n        if (!visited.has(neighbor)) {\r\n          dfs(neighbor, [...path])\r\n        } else if (recursionStack.has(neighbor)) {\r\n          // Cycle detected\r\n          const cycleStart = path.indexOf(neighbor)\r\n          const cycle = path.slice(cycleStart)\r\n          cycles.push([...cycle, neighbor])\r\n        }\r\n      }\r\n\r\n      recursionStack.delete(nodeId)\r\n    }\r\n\r\n    tasks.forEach((task) => {\r\n      if (!visited.has(task.id)) {\r\n        dfs(task.id, [])\r\n      }\r\n    })\r\n\r\n    return cycles\r\n  }\r\n\r\n  /**\r\n   * Topological sort using Kahn's algorithm\r\n   *\r\n   * @param tasks - Array of tasks\r\n   * @param graph - Dependency graph\r\n   * @returns Tasks in dependency order\r\n   */\r\n  private topologicalSort(tasks: Card[], graph: Map<string, Set<string>>): Card[] {\r\n    const taskMap = new Map(tasks.map((task) => [task.id, task]))\r\n    const inDegree = new Map<string, number>()\r\n\r\n    // Initialize in-degree for all tasks\r\n    tasks.forEach((task) => {\r\n      inDegree.set(task.id, 0)\r\n    })\r\n\r\n    // Calculate in-degree\r\n    tasks.forEach((task) => {\r\n      if (task.dependencies) {\r\n        task.dependencies.forEach(() => {\r\n          const current = inDegree.get(task.id) || 0\r\n          inDegree.set(task.id, current + 1)\r\n        })\r\n      }\r\n    })\r\n\r\n    // Queue of tasks with no dependencies\r\n    const queue: string[] = []\r\n    inDegree.forEach((degree, taskId) => {\r\n      if (degree === 0) {\r\n        queue.push(taskId)\r\n      }\r\n    })\r\n\r\n    const sorted: Card[] = []\r\n\r\n    while (queue.length > 0) {\r\n      const taskId = queue.shift()!\r\n      const task = taskMap.get(taskId)\r\n\r\n      if (task) {\r\n        sorted.push(task)\r\n      }\r\n\r\n      // Reduce in-degree for dependent tasks\r\n      const dependents = graph.get(taskId) || new Set()\r\n      dependents.forEach((depId) => {\r\n        const degree = inDegree.get(depId) || 0\r\n        inDegree.set(depId, degree - 1)\r\n\r\n        if (degree - 1 === 0) {\r\n          queue.push(depId)\r\n        }\r\n      })\r\n    }\r\n\r\n    // If sorted length doesn't match tasks length, there's a cycle\r\n    if (sorted.length !== tasks.length) {\r\n      // Return original order if cycle detected\r\n      return tasks\r\n    }\r\n\r\n    return sorted\r\n  }\r\n\r\n  /**\r\n   * Calculate earliest start date for each task based on dependencies\r\n   *\r\n   * @param orderedTasks - Tasks in topological order\r\n   * @param allTasks - All tasks (for lookup)\r\n   * @returns Map of task ID to earliest start date\r\n   */\r\n  private calculateEarliestStarts(orderedTasks: Card[], allTasks: Card[]): Map<string, Date> {\r\n    const earliestStarts = new Map<string, Date>()\r\n    const taskMap = new Map(allTasks.map((task) => [task.id, task]))\r\n\r\n    orderedTasks.forEach((task) => {\r\n      let earliestStart = task.startDate ? new Date(task.startDate) : new Date()\r\n\r\n      // Check dependencies\r\n      if (task.dependencies && task.dependencies.length > 0) {\r\n        task.dependencies.forEach((dep) => {\r\n          const depTask = taskMap.get(dep.taskId)\r\n          if (!depTask) return\r\n\r\n          const depEarliestStart = earliestStarts.get(dep.taskId) || new Date()\r\n          const depDuration = depTask.getDuration() || 0\r\n          const lag = dep.lag || 0\r\n\r\n          let calculatedStart: Date\r\n\r\n          if (dep.type === 'finish-to-start') {\r\n            // Task can't start until dependency finishes\r\n            calculatedStart = new Date(depEarliestStart)\r\n            calculatedStart.setDate(calculatedStart.getDate() + depDuration + lag)\r\n          } else if (dep.type === 'start-to-start') {\r\n            // Task can't start until dependency starts\r\n            calculatedStart = new Date(depEarliestStart)\r\n            calculatedStart.setDate(calculatedStart.getDate() + lag)\r\n          } else if (dep.type === 'finish-to-finish') {\r\n            // Task can't finish until dependency finishes\r\n            // Work backwards from dependency finish to calculate start\r\n            const taskDuration = task.getDuration() || 0\r\n            calculatedStart = new Date(depEarliestStart)\r\n            calculatedStart.setDate(calculatedStart.getDate() + depDuration + lag - taskDuration)\r\n          } else if (dep.type === 'start-to-finish') {\r\n            // Task can't finish until dependency starts (rare)\r\n            // Work backwards from dependency start to calculate task start\r\n            const duration = task.getDuration() || 0\r\n            calculatedStart = new Date(depEarliestStart)\r\n            calculatedStart.setDate(calculatedStart.getDate() + lag - duration)\r\n          } else {\r\n            calculatedStart = depEarliestStart\r\n          }\r\n\r\n          // Use the latest calculated start date\r\n          if (calculatedStart > earliestStart) {\r\n            earliestStart = calculatedStart\r\n          }\r\n        })\r\n      }\r\n\r\n      earliestStarts.set(task.id, earliestStart)\r\n    })\r\n\r\n    return earliestStarts\r\n  }\r\n\r\n  /**\r\n   * Calculate critical path (longest path through the project)\r\n   *\r\n   * @param orderedTasks - Tasks in topological order\r\n   * @param earliestStarts - Earliest start dates\r\n   * @returns Array of task IDs on critical path\r\n   */\r\n  private calculateCriticalPath(orderedTasks: Card[], earliestStarts: Map<string, Date>): string[] {\r\n    if (orderedTasks.length === 0) return []\r\n\r\n    // Calculate latest start dates (working backwards)\r\n    const latestStarts = new Map<string, Date>()\r\n\r\n    // Find project end date (latest finish)\r\n    let projectEnd = new Date(0)\r\n    orderedTasks.forEach((task) => {\r\n      const start = earliestStarts.get(task.id) || new Date()\r\n      const duration = task.getDuration() || 0\r\n      const finish = new Date(start)\r\n      finish.setDate(finish.getDate() + duration)\r\n\r\n      if (finish > projectEnd) {\r\n        projectEnd = finish\r\n      }\r\n    })\r\n\r\n    // Calculate latest starts (backwards pass)\r\n    for (let i = orderedTasks.length - 1; i >= 0; i--) {\r\n      const currentTask = orderedTasks[i]\r\n      const duration = currentTask.getDuration() || 0\r\n\r\n      // Start with latest finish = project end\r\n      let latestFinish = new Date(projectEnd)\r\n\r\n      // Find minimum latest start of all successors\r\n      orderedTasks.forEach((otherTask) => {\r\n        if (otherTask.dependsOn(currentTask.id)) {\r\n          const otherLatestStart = latestStarts.get(otherTask.id)\r\n          if (otherLatestStart && otherLatestStart < latestFinish) {\r\n            latestFinish = otherLatestStart\r\n          }\r\n        }\r\n      })\r\n\r\n      const latestStart = new Date(latestFinish)\r\n      latestStart.setDate(latestStart.getDate() - duration)\r\n      latestStarts.set(currentTask.id, latestStart)\r\n    }\r\n\r\n    // Critical path = tasks where earliest start = latest start (zero slack)\r\n    const criticalPath: string[] = []\r\n    orderedTasks.forEach((task) => {\r\n      const earliest = earliestStarts.get(task.id)\r\n      const latest = latestStarts.get(task.id)\r\n\r\n      if (earliest && latest) {\r\n        const slack = latest.getTime() - earliest.getTime()\r\n        if (slack === 0) {\r\n          criticalPath.push(task.id)\r\n        }\r\n      }\r\n    })\r\n\r\n    return criticalPath\r\n  }\r\n\r\n  /**\r\n   * Validate dependencies for a set of tasks\r\n   *\r\n   * @param tasks - Tasks to validate\r\n   * @throws DependencyError if validation fails\r\n   */\r\n  validateDependencies(tasks: Card[]): void {\r\n    const taskIds = new Set(tasks.map((task) => task.id))\r\n\r\n    // Check for missing task references\r\n    tasks.forEach((task) => {\r\n      if (task.dependencies) {\r\n        task.dependencies.forEach((dep) => {\r\n          if (!taskIds.has(dep.taskId)) {\r\n            throw new DependencyError(\r\n              `Task ${task.id} depends on non-existent task ${dep.taskId}`,\r\n              'missing',\r\n              [task.id, dep.taskId]\r\n            )\r\n          }\r\n        })\r\n      }\r\n    })\r\n\r\n    // Check for circular dependencies\r\n    const graph = this.buildDependencyGraph(tasks)\r\n    const cycles = this.detectCycles(graph, tasks)\r\n\r\n    if (cycles.length > 0) {\r\n      throw new DependencyError(\r\n        `Circular dependencies detected: ${cycles.map((c) => c.join(' -> ')).join(', ')}`,\r\n        'circular',\r\n        cycles.flat()\r\n      )\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if adding a dependency would create a cycle\r\n   *\r\n   * @param tasks - Current tasks\r\n   * @param fromTaskId - Task that will depend on toTaskId\r\n   * @param toTaskId - Task that fromTaskId will depend on\r\n   * @returns true if adding dependency would create a cycle\r\n   */\r\n  wouldCreateCycle(tasks: Card[], fromTaskId: string, toTaskId: string): boolean {\r\n    // Create temporary task with the new dependency\r\n    const fromTask = tasks.find((t) => t.id === fromTaskId)\r\n\r\n    if (!fromTask) return false\r\n\r\n    const tempTask = fromTask.addDependency({\r\n      taskId: toTaskId,\r\n      type: 'finish-to-start',\r\n    })\r\n\r\n    const tempTasks = tasks.map((task) => (task.id === fromTaskId ? tempTask : task))\r\n\r\n    const graph = this.buildDependencyGraph(tempTasks)\r\n    const cycles = this.detectCycles(graph, tempTasks)\r\n\r\n    return cycles.length > 0\r\n  }\r\n\r\n  /**\r\n   * Get all tasks that depend on a given task (successors)\r\n   *\r\n   * @param tasks - All tasks\r\n   * @param taskId - Task ID to find successors for\r\n   * @returns Array of successor tasks\r\n   */\r\n  getSuccessors(tasks: Card[], taskId: string): Card[] {\r\n    return tasks.filter((task) => task.dependsOn(taskId))\r\n  }\r\n\r\n  /**\r\n   * Get all tasks that a given task depends on (predecessors)\r\n   *\r\n   * @param tasks - All tasks\r\n   * @param taskId - Task ID to find predecessors for\r\n   * @returns Array of predecessor tasks\r\n   */\r\n  getPredecessors(tasks: Card[], taskId: string): Card[] {\r\n    const task = tasks.find((t) => t.id === taskId)\r\n    if (!task || !task.dependencies) return []\r\n\r\n    const predecessorIds = task.getDependentTaskIds()\r\n    return tasks.filter((t) => predecessorIds.includes(t.id))\r\n  }\r\n\r\n  /**\r\n   * Calculate total slack (float) for a task\r\n   *\r\n   * @param _task - Task to calculate slack for (unused, kept for API consistency)\r\n   * @param earliestStart - Earliest possible start date\r\n   * @param latestStart - Latest allowable start date\r\n   * @returns Slack in days\r\n   */\r\n  calculateSlack(_task: Card, earliestStart: Date, latestStart: Date): number {\r\n    const diffMs = latestStart.getTime() - earliestStart.getTime()\r\n    return Math.floor(diffMs / (1000 * 60 * 60 * 24))\r\n  }\r\n}\r\n","/**\r\n * DragStore - Manages drag and drop state\r\n * @module store/DragStore\r\n *\r\n * Replacement for Jotai dragStateAtom with zero dependencies\r\n */\r\n\r\n/**\r\n * Drag state interface\r\n */\r\nexport interface DragState {\r\n  isDragging: boolean\r\n  draggedCardId: string | null\r\n  sourceColumnId: string | null\r\n  targetColumnId: string | null\r\n}\r\n\r\n/**\r\n * Drag event types\r\n */\r\nexport type DragEvent = 'drag:start' | 'drag:over' | 'drag:end' | 'drag:cancel'\r\n\r\n/**\r\n * Drag event data\r\n */\r\nexport interface DragEventData {\r\n  'drag:start': { cardId: string; sourceColumnId: string }\r\n  'drag:over': { cardId: string; targetColumnId: string }\r\n  'drag:end': { cardId: string; sourceColumnId: string; targetColumnId: string }\r\n  'drag:cancel': { cardId: string }\r\n}\r\n\r\n/**\r\n * Drag event callback\r\n */\r\nexport type DragEventCallback<K extends DragEvent> = (data: DragEventData[K]) => void\r\n\r\n/**\r\n * DragStore - Simple observable store for drag state\r\n *\r\n * @example\r\n * ```typescript\r\n * const dragStore = new DragStore()\r\n *\r\n * // Subscribe to changes\r\n * const unsubscribe = dragStore.subscribe((state) => {\r\n *   console.log('Drag state changed:', state)\r\n * })\r\n *\r\n * // Start dragging\r\n * dragStore.startDrag('card-1', 'col-1')\r\n *\r\n * // Update target\r\n * dragStore.updateTarget('col-2')\r\n *\r\n * // End drag\r\n * dragStore.endDrag()\r\n *\r\n * // Cleanup\r\n * unsubscribe()\r\n * ```\r\n */\r\nexport class DragStore {\r\n  private state: DragState = {\r\n    isDragging: false,\r\n    draggedCardId: null,\r\n    sourceColumnId: null,\r\n    targetColumnId: null,\r\n  }\r\n\r\n  private listeners = new Set<(state: DragState) => void>()\r\n  private eventListeners = new Map<DragEvent, Set<DragEventCallback<any>>>()\r\n\r\n  // ========================================================================\r\n  // GETTERS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Get current drag state\r\n   */\r\n  getState(): DragState {\r\n    return { ...this.state }\r\n  }\r\n\r\n  /**\r\n   * Check if currently dragging\r\n   */\r\n  isDragging(): boolean {\r\n    return this.state.isDragging\r\n  }\r\n\r\n  /**\r\n   * Get dragged card ID\r\n   */\r\n  getDraggedCardId(): string | null {\r\n    return this.state.draggedCardId\r\n  }\r\n\r\n  /**\r\n   * Get source column ID\r\n   */\r\n  getSourceColumnId(): string | null {\r\n    return this.state.sourceColumnId\r\n  }\r\n\r\n  /**\r\n   * Get target column ID\r\n   */\r\n  getTargetColumnId(): string | null {\r\n    return this.state.targetColumnId\r\n  }\r\n\r\n  // ========================================================================\r\n  // SETTERS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Start dragging a card\r\n   *\r\n   * @param cardId - Card being dragged\r\n   * @param sourceColumnId - Source column\r\n   */\r\n  startDrag(cardId: string, sourceColumnId: string): void {\r\n    this.state = {\r\n      isDragging: true,\r\n      draggedCardId: cardId,\r\n      sourceColumnId,\r\n      targetColumnId: sourceColumnId,\r\n    }\r\n\r\n    this.emit('drag:start', { cardId, sourceColumnId })\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * Update drag target column\r\n   *\r\n   * @param targetColumnId - Target column\r\n   */\r\n  updateTarget(targetColumnId: string): void {\r\n    if (!this.state.isDragging || !this.state.draggedCardId) {\r\n      return\r\n    }\r\n\r\n    const cardId = this.state.draggedCardId // Type narrowing\r\n\r\n    this.state = {\r\n      ...this.state,\r\n      targetColumnId,\r\n    }\r\n\r\n    this.emit('drag:over', {\r\n      cardId,\r\n      targetColumnId,\r\n    })\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * End drag operation\r\n   */\r\n  endDrag(): void {\r\n    if (!this.state.isDragging || !this.state.draggedCardId) {\r\n      return\r\n    }\r\n\r\n    const { draggedCardId, sourceColumnId, targetColumnId } = this.state\r\n\r\n    this.emit('drag:end', {\r\n      cardId: draggedCardId,\r\n      sourceColumnId: sourceColumnId!,\r\n      targetColumnId: targetColumnId!,\r\n    })\r\n\r\n    this.reset()\r\n  }\r\n\r\n  /**\r\n   * Cancel drag operation\r\n   */\r\n  cancelDrag(): void {\r\n    if (!this.state.isDragging || !this.state.draggedCardId) {\r\n      return\r\n    }\r\n\r\n    this.emit('drag:cancel', { cardId: this.state.draggedCardId })\r\n    this.reset()\r\n  }\r\n\r\n  /**\r\n   * Reset drag state\r\n   */\r\n  reset(): void {\r\n    this.state = {\r\n      isDragging: false,\r\n      draggedCardId: null,\r\n      sourceColumnId: null,\r\n      targetColumnId: null,\r\n    }\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * Set entire drag state at once\r\n   * (For compatibility with existing code)\r\n   *\r\n   * @param state - New drag state\r\n   */\r\n  setState(state: DragState): void {\r\n    this.state = { ...state }\r\n    this.notify()\r\n  }\r\n\r\n  // ========================================================================\r\n  // SUBSCRIPTIONS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Subscribe to state changes\r\n   *\r\n   * @param callback - Called when state changes\r\n   * @returns Unsubscribe function\r\n   */\r\n  subscribe(callback: (state: DragState) => void): () => void {\r\n    this.listeners.add(callback)\r\n\r\n    return () => {\r\n      this.listeners.delete(callback)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Subscribe to drag events\r\n   *\r\n   * @param event - Event type\r\n   * @param callback - Event callback\r\n   * @returns Unsubscribe function\r\n   */\r\n  on<K extends DragEvent>(event: K, callback: DragEventCallback<K>): () => void {\r\n    if (!this.eventListeners.has(event)) {\r\n      this.eventListeners.set(event, new Set())\r\n    }\r\n\r\n    this.eventListeners.get(event)!.add(callback)\r\n\r\n    return () => {\r\n      this.eventListeners.get(event)?.delete(callback)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Emit drag event\r\n   */\r\n  private emit<K extends DragEvent>(event: K, data: DragEventData[K]): void {\r\n    const listeners = this.eventListeners.get(event)\r\n    if (listeners) {\r\n      listeners.forEach((callback) => callback(data))\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Notify all subscribers\r\n   */\r\n  private notify(): void {\r\n    const state = this.getState()\r\n    this.listeners.forEach((listener) => listener(state))\r\n  }\r\n\r\n  /**\r\n   * Clear all listeners (cleanup)\r\n   */\r\n  destroy(): void {\r\n    this.listeners.clear()\r\n    this.eventListeners.clear()\r\n    this.reset()\r\n  }\r\n}\r\n\r\n// ========================================================================\r\n// SINGLETON INSTANCE (for compatibility with Jotai usage)\r\n// ========================================================================\r\n\r\n/**\r\n * Global drag store instance\r\n * Used to replace Jotai atom while maintaining same API\r\n */\r\nexport const dragStore = new DragStore()\r\n","/**\r\n * SelectionStore - Manages card selection state\r\n * @module store/SelectionStore\r\n *\r\n * Replacement for Jotai selectionStateAtom with zero dependencies\r\n */\r\n\r\n/**\r\n * Selection state interface\r\n */\r\nexport interface SelectionState {\r\n  selectedCardIds: string[]\r\n  lastSelectedCardId: string | null\r\n}\r\n\r\n/**\r\n * Selection event types\r\n */\r\nexport type SelectionEvent =\r\n  | 'selection:changed'\r\n  | 'selection:cleared'\r\n  | 'selection:card-added'\r\n  | 'selection:card-removed'\r\n\r\n/**\r\n * Selection event data\r\n */\r\nexport interface SelectionEventData {\r\n  'selection:changed': { selectedCardIds: string[]; lastSelectedCardId: string | null }\r\n  'selection:cleared': { previousCount: number }\r\n  'selection:card-added': { cardId: string }\r\n  'selection:card-removed': { cardId: string }\r\n}\r\n\r\n/**\r\n * Selection event callback\r\n */\r\nexport type SelectionEventCallback<K extends SelectionEvent> = (\r\n  data: SelectionEventData[K]\r\n) => void\r\n\r\n/**\r\n * SelectionStore - Simple observable store for selection state\r\n *\r\n * @example\r\n * ```typescript\r\n * const selectionStore = new SelectionStore()\r\n *\r\n * // Subscribe to changes\r\n * const unsubscribe = selectionStore.subscribe((state) => {\r\n *   console.log('Selection changed:', state.selectedCardIds)\r\n * })\r\n *\r\n * // Select cards\r\n * selectionStore.select('card-1')\r\n * selectionStore.selectMultiple(['card-1', 'card-2', 'card-3'])\r\n *\r\n * // Check selection\r\n * if (selectionStore.isSelected('card-1')) {\r\n *   console.log('Card 1 is selected')\r\n * }\r\n *\r\n * // Clear selection\r\n * selectionStore.clear()\r\n *\r\n * // Cleanup\r\n * unsubscribe()\r\n * ```\r\n */\r\nexport class SelectionStore {\r\n  private state: SelectionState = {\r\n    selectedCardIds: [],\r\n    lastSelectedCardId: null,\r\n  }\r\n\r\n  private listeners = new Set<(state: SelectionState) => void>()\r\n  private eventListeners = new Map<SelectionEvent, Set<SelectionEventCallback<any>>>()\r\n\r\n  // ========================================================================\r\n  // GETTERS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Get current selection state\r\n   */\r\n  getState(): SelectionState {\r\n    return {\r\n      selectedCardIds: [...this.state.selectedCardIds],\r\n      lastSelectedCardId: this.state.lastSelectedCardId,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get selected card IDs\r\n   */\r\n  getSelectedCardIds(): string[] {\r\n    return [...this.state.selectedCardIds]\r\n  }\r\n\r\n  /**\r\n   * Get last selected card ID\r\n   */\r\n  getLastSelectedCardId(): string | null {\r\n    return this.state.lastSelectedCardId\r\n  }\r\n\r\n  /**\r\n   * Get selection count\r\n   */\r\n  getCount(): number {\r\n    return this.state.selectedCardIds.length\r\n  }\r\n\r\n  /**\r\n   * Check if a card is selected\r\n   *\r\n   * @param cardId - Card ID to check\r\n   */\r\n  isSelected(cardId: string): boolean {\r\n    return this.state.selectedCardIds.includes(cardId)\r\n  }\r\n\r\n  /**\r\n   * Check if any cards are selected\r\n   */\r\n  hasSelection(): boolean {\r\n    return this.state.selectedCardIds.length > 0\r\n  }\r\n\r\n  // ========================================================================\r\n  // SETTERS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Select a single card (replaces current selection)\r\n   *\r\n   * @param cardId - Card to select\r\n   */\r\n  select(cardId: string): void {\r\n    this.state = {\r\n      selectedCardIds: [cardId],\r\n      lastSelectedCardId: cardId,\r\n    }\r\n\r\n    this.emit('selection:changed', {\r\n      selectedCardIds: [cardId],\r\n      lastSelectedCardId: cardId,\r\n    })\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * Add a card to selection\r\n   *\r\n   * @param cardId - Card to add\r\n   */\r\n  add(cardId: string): void {\r\n    if (this.state.selectedCardIds.includes(cardId)) {\r\n      return // Already selected\r\n    }\r\n\r\n    this.state = {\r\n      selectedCardIds: [...this.state.selectedCardIds, cardId],\r\n      lastSelectedCardId: cardId,\r\n    }\r\n\r\n    this.emit('selection:card-added', { cardId })\r\n    this.emit('selection:changed', {\r\n      selectedCardIds: this.state.selectedCardIds,\r\n      lastSelectedCardId: cardId,\r\n    })\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * Remove a card from selection\r\n   *\r\n   * @param cardId - Card to remove\r\n   */\r\n  remove(cardId: string): void {\r\n    if (!this.state.selectedCardIds.includes(cardId)) {\r\n      return // Not selected\r\n    }\r\n\r\n    this.state = {\r\n      selectedCardIds: this.state.selectedCardIds.filter((id) => id !== cardId),\r\n      lastSelectedCardId: this.state.lastSelectedCardId,\r\n    }\r\n\r\n    this.emit('selection:card-removed', { cardId })\r\n    this.emit('selection:changed', {\r\n      selectedCardIds: this.state.selectedCardIds,\r\n      lastSelectedCardId: this.state.lastSelectedCardId,\r\n    })\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * Toggle card selection\r\n   *\r\n   * @param cardId - Card to toggle\r\n   */\r\n  toggle(cardId: string): void {\r\n    if (this.state.selectedCardIds.includes(cardId)) {\r\n      this.remove(cardId)\r\n    } else {\r\n      this.add(cardId)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Select multiple cards (replaces current selection)\r\n   *\r\n   * @param cardIds - Cards to select\r\n   */\r\n  selectMultiple(cardIds: string[]): void {\r\n    const lastCardId = cardIds[cardIds.length - 1] || null\r\n\r\n    this.state = {\r\n      selectedCardIds: [...cardIds],\r\n      lastSelectedCardId: lastCardId,\r\n    }\r\n\r\n    this.emit('selection:changed', {\r\n      selectedCardIds: cardIds,\r\n      lastSelectedCardId: lastCardId,\r\n    })\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * Add multiple cards to selection\r\n   *\r\n   * @param cardIds - Cards to add\r\n   */\r\n  addMultiple(cardIds: string[]): void {\r\n    const newCardIds = cardIds.filter((id) => !this.state.selectedCardIds.includes(id))\r\n\r\n    if (newCardIds.length === 0) {\r\n      return // All already selected\r\n    }\r\n\r\n    const lastCardId = cardIds[cardIds.length - 1] || this.state.lastSelectedCardId\r\n\r\n    this.state = {\r\n      selectedCardIds: [...this.state.selectedCardIds, ...newCardIds],\r\n      lastSelectedCardId: lastCardId,\r\n    }\r\n\r\n    newCardIds.forEach((cardId) => {\r\n      this.emit('selection:card-added', { cardId })\r\n    })\r\n\r\n    this.emit('selection:changed', {\r\n      selectedCardIds: this.state.selectedCardIds,\r\n      lastSelectedCardId: lastCardId,\r\n    })\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * Clear all selections\r\n   */\r\n  clear(): void {\r\n    const previousCount = this.state.selectedCardIds.length\r\n\r\n    if (previousCount === 0) {\r\n      return // Already empty\r\n    }\r\n\r\n    this.state = {\r\n      selectedCardIds: [],\r\n      lastSelectedCardId: null,\r\n    }\r\n\r\n    this.emit('selection:cleared', { previousCount })\r\n    this.emit('selection:changed', {\r\n      selectedCardIds: [],\r\n      lastSelectedCardId: null,\r\n    })\r\n    this.notify()\r\n  }\r\n\r\n  /**\r\n   * Set entire selection state at once\r\n   * (For compatibility with existing code)\r\n   *\r\n   * @param state - New selection state\r\n   */\r\n  setState(state: SelectionState): void {\r\n    this.state = {\r\n      selectedCardIds: [...state.selectedCardIds],\r\n      lastSelectedCardId: state.lastSelectedCardId,\r\n    }\r\n\r\n    this.emit('selection:changed', {\r\n      selectedCardIds: this.state.selectedCardIds,\r\n      lastSelectedCardId: this.state.lastSelectedCardId,\r\n    })\r\n    this.notify()\r\n  }\r\n\r\n  // ========================================================================\r\n  // SUBSCRIPTIONS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Subscribe to state changes\r\n   *\r\n   * @param callback - Called when state changes\r\n   * @returns Unsubscribe function\r\n   */\r\n  subscribe(callback: (state: SelectionState) => void): () => void {\r\n    this.listeners.add(callback)\r\n\r\n    return () => {\r\n      this.listeners.delete(callback)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Subscribe to selection events\r\n   *\r\n   * @param event - Event type\r\n   * @param callback - Event callback\r\n   * @returns Unsubscribe function\r\n   */\r\n  on<K extends SelectionEvent>(\r\n    event: K,\r\n    callback: SelectionEventCallback<K>\r\n  ): () => void {\r\n    if (!this.eventListeners.has(event)) {\r\n      this.eventListeners.set(event, new Set())\r\n    }\r\n\r\n    this.eventListeners.get(event)!.add(callback)\r\n\r\n    return () => {\r\n      this.eventListeners.get(event)?.delete(callback)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Emit selection event\r\n   */\r\n  private emit<K extends SelectionEvent>(\r\n    event: K,\r\n    data: SelectionEventData[K]\r\n  ): void {\r\n    const listeners = this.eventListeners.get(event)\r\n    if (listeners) {\r\n      listeners.forEach((callback) => callback(data))\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Notify all subscribers\r\n   */\r\n  private notify(): void {\r\n    const state = this.getState()\r\n    this.listeners.forEach((listener) => listener(state))\r\n  }\r\n\r\n  /**\r\n   * Clear all listeners (cleanup)\r\n   */\r\n  destroy(): void {\r\n    this.listeners.clear()\r\n    this.eventListeners.clear()\r\n    this.clear()\r\n  }\r\n}\r\n\r\n// ========================================================================\r\n// SINGLETON INSTANCE (for compatibility with Jotai usage)\r\n// ========================================================================\r\n\r\n/**\r\n * Global selection store instance\r\n * Used to replace Jotai atom while maintaining same API\r\n */\r\nexport const selectionStore = new SelectionStore()\r\n","/**\r\n * ViewAdapter - Universal interface for different board views\r\n * @module views/ViewAdapter\r\n *\r\n * This interface allows different visualizations (Kanban, Gantt, TodoList, Table)\r\n * to work with the same underlying data and runtime.\r\n */\r\n\r\nimport type { BoardData, ColumnData, CardData } from '../types'\r\n\r\n/**\r\n * Serialized board data structure for views\r\n * Contains the full state needed to render a board\r\n */\r\nexport interface ViewBoardData {\r\n  board: BoardData | null\r\n  columns: ColumnData[]\r\n  cards: CardData[]\r\n}\r\n\r\n/**\r\n * View lifecycle events\r\n */\r\nexport type ViewEvent =\r\n  | 'view:mounted'\r\n  | 'view:unmounted'\r\n  | 'view:updated'\r\n  | 'view:error'\r\n  | 'view:ready'\r\n\r\n/**\r\n * View event callback data\r\n */\r\nexport interface ViewEventData {\r\n  'view:mounted': { viewId: string; timestamp: number }\r\n  'view:unmounted': { viewId: string; timestamp: number }\r\n  'view:updated': { viewId: string; data: ViewBoardData }\r\n  'view:error': { viewId: string; error: Error }\r\n  'view:ready': { viewId: string; renderTime: number }\r\n}\r\n\r\n/**\r\n * View event callback\r\n */\r\nexport type ViewEventCallback<K extends ViewEvent> = (data: ViewEventData[K]) => void\r\n\r\n/**\r\n * View configuration options\r\n */\r\nexport interface ViewOptions {\r\n  /**\r\n   * Enable animations\r\n   * @default true\r\n   */\r\n  animations?: boolean\r\n\r\n  /**\r\n   * Enable virtual scrolling\r\n   * @default false\r\n   */\r\n  virtualScrolling?: boolean\r\n\r\n  /**\r\n   * Theme\r\n   * @default 'dark'\r\n   */\r\n  theme?: 'dark' | 'light' | 'neutral'\r\n\r\n  /**\r\n   * Readonly mode (no interactions)\r\n   * @default false\r\n   */\r\n  readonly?: boolean\r\n\r\n  /**\r\n   * Custom CSS classes\r\n   */\r\n  className?: string\r\n\r\n  /**\r\n   * Custom inline styles\r\n   */\r\n  style?: Record<string, string>\r\n\r\n  /**\r\n   * View-specific options\r\n   */\r\n  [key: string]: any\r\n}\r\n\r\n/**\r\n * Export format for views\r\n */\r\nexport type ExportFormat = 'json' | 'csv' | 'pdf' | 'png' | 'svg'\r\n\r\n/**\r\n * ViewAdapter interface\r\n *\r\n * All views (Kanban, Gantt, TodoList, Table) must implement this interface\r\n * to work with the Asakaa runtime.\r\n *\r\n * @example\r\n * ```typescript\r\n * export class KanbanView implements ViewAdapter<BoardData> {\r\n *   readonly id = 'kanban'\r\n *   readonly name = 'Kanban Board'\r\n *   readonly version = '1.0.0'\r\n *\r\n *   mount(container: HTMLElement, data: BoardData): void {\r\n *     // Render kanban board\r\n *   }\r\n *\r\n *   unmount(): void {\r\n *     // Cleanup\r\n *   }\r\n *\r\n *   update(data: BoardData): void {\r\n *     // Update view with new data\r\n *   }\r\n * }\r\n * ```\r\n */\r\nexport interface ViewAdapter<TData = ViewBoardData> {\r\n  /**\r\n   * Unique identifier for this view\r\n   * @example 'kanban', 'gantt', 'todolist', 'table'\r\n   */\r\n  readonly id: string\r\n\r\n  /**\r\n   * Human-readable name\r\n   * @example 'Kanban Board', 'Gantt Chart'\r\n   */\r\n  readonly name: string\r\n\r\n  /**\r\n   * View version (semantic versioning)\r\n   * @example '1.0.0'\r\n   */\r\n  readonly version?: string\r\n\r\n  /**\r\n   * View description\r\n   */\r\n  readonly description?: string\r\n\r\n  /**\r\n   * View icon (emoji or icon name)\r\n   * @example '📋', 'kanban-icon'\r\n   */\r\n  readonly icon?: string\r\n\r\n  /**\r\n   * Supported export formats\r\n   * @default ['json']\r\n   */\r\n  readonly supportedExports?: ExportFormat[]\r\n\r\n  // ========================================================================\r\n  // LIFECYCLE METHODS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Mount the view to a container\r\n   *\r\n   * Called when the view is first activated or when switching views.\r\n   *\r\n   * @param container - DOM element to render into\r\n   * @param data - Initial data to display\r\n   */\r\n  mount(container: HTMLElement, data: TData): void\r\n\r\n  /**\r\n   * Unmount the view and cleanup\r\n   *\r\n   * Called when switching to another view or when destroying the runtime.\r\n   * Should cleanup event listeners, timers, and remove DOM elements.\r\n   */\r\n  unmount(): void\r\n\r\n  /**\r\n   * Update the view with new data\r\n   *\r\n   * Called when the underlying data changes (card moved, updated, etc).\r\n   * Should efficiently update only what changed.\r\n   *\r\n   * @param data - New data to display\r\n   */\r\n  update(data: TData): void\r\n\r\n  // ========================================================================\r\n  // EVENT SYSTEM\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Subscribe to view events\r\n   *\r\n   * @param event - Event name\r\n   * @param callback - Event callback\r\n   * @returns Unsubscribe function\r\n   */\r\n  on<K extends ViewEvent>(event: K, callback: ViewEventCallback<K>): () => void\r\n\r\n  /**\r\n   * Emit a view event\r\n   *\r\n   * @param event - Event name\r\n   * @param data - Event data\r\n   */\r\n  emit<K extends ViewEvent>(event: K, data: ViewEventData[K]): void\r\n\r\n  // ========================================================================\r\n  // CONFIGURATION\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Configure the view\r\n   *\r\n   * @param options - View options\r\n   */\r\n  configure(options: ViewOptions): void\r\n\r\n  /**\r\n   * Get current configuration\r\n   *\r\n   * @returns Current view options\r\n   */\r\n  getConfig(): ViewOptions\r\n\r\n  // ========================================================================\r\n  // EXPORT/IMPORT (Optional)\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Export view to specific format\r\n   *\r\n   * @param format - Export format\r\n   * @returns Exported data as string or Blob\r\n   */\r\n  export?(format: ExportFormat): Promise<string | Blob>\r\n\r\n  /**\r\n   * Import data into view\r\n   *\r\n   * @param data - Data to import\r\n   * @param format - Data format\r\n   * @returns Imported data\r\n   */\r\n  import?(data: string | Blob, format: ExportFormat): Promise<TData>\r\n\r\n  // ========================================================================\r\n  // OPTIONAL FEATURES\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Destroy the view and free resources\r\n   *\r\n   * Optional method for complex cleanup (WebGL contexts, Workers, etc)\r\n   */\r\n  destroy?(): void\r\n\r\n  /**\r\n   * Resize handler\r\n   *\r\n   * Called when container size changes\r\n   */\r\n  onResize?(width: number, height: number): void\r\n\r\n  /**\r\n   * Focus handler\r\n   *\r\n   * Called when view gains focus\r\n   */\r\n  onFocus?(): void\r\n\r\n  /**\r\n   * Blur handler\r\n   *\r\n   * Called when view loses focus\r\n   */\r\n  onBlur?(): void\r\n\r\n  /**\r\n   * Custom render method\r\n   *\r\n   * For framework-specific rendering (React, Vue, Svelte)\r\n   */\r\n  render?(): any\r\n}\r\n\r\n/**\r\n * Base ViewAdapter implementation\r\n *\r\n * Provides default implementations for common functionality.\r\n * Views can extend this class instead of implementing ViewAdapter from scratch.\r\n *\r\n * @example\r\n * ```typescript\r\n * export class MyCustomView extends BaseViewAdapter<BoardData> {\r\n *   readonly id = 'my-view'\r\n *   readonly name = 'My Custom View'\r\n *\r\n *   mount(container, data) {\r\n *     super.mount(container, data)\r\n *     // Your render logic\r\n *   }\r\n * }\r\n * ```\r\n */\r\nexport abstract class BaseViewAdapter<TData = ViewBoardData> implements ViewAdapter<TData> {\r\n  abstract readonly id: string\r\n  abstract readonly name: string\r\n\r\n  readonly version = '1.0.0'\r\n  readonly description = ''\r\n  readonly icon = ''\r\n  readonly supportedExports: ExportFormat[] = ['json']\r\n\r\n  protected container: HTMLElement | null = null\r\n  protected data: TData | null = null\r\n  protected options: ViewOptions = {\r\n    animations: true,\r\n    virtualScrolling: false,\r\n    theme: 'dark',\r\n    readonly: false,\r\n  }\r\n\r\n  private listeners = new Map<ViewEvent, Set<ViewEventCallback<any>>>()\r\n\r\n  // ========================================================================\r\n  // LIFECYCLE\r\n  // ========================================================================\r\n\r\n  mount(container: HTMLElement, data: TData): void {\r\n    this.container = container\r\n    this.data = data\r\n    this.emit('view:mounted', { viewId: this.id, timestamp: Date.now() })\r\n  }\r\n\r\n  unmount(): void {\r\n    // Emit before clearing listeners\r\n    this.emit('view:unmounted', { viewId: this.id, timestamp: Date.now() })\r\n\r\n    if (this.container) {\r\n      this.container.innerHTML = ''\r\n      this.container = null\r\n    }\r\n    this.data = null\r\n    this.listeners.clear()\r\n  }\r\n\r\n  update(data: TData): void {\r\n    this.data = data\r\n    this.emit('view:updated', { viewId: this.id, data: data as any })\r\n  }\r\n\r\n  // ========================================================================\r\n  // EVENTS\r\n  // ========================================================================\r\n\r\n  on<K extends ViewEvent>(event: K, callback: ViewEventCallback<K>): () => void {\r\n    if (!this.listeners.has(event)) {\r\n      this.listeners.set(event, new Set())\r\n    }\r\n    this.listeners.get(event)!.add(callback)\r\n\r\n    // Return unsubscribe function\r\n    return () => {\r\n      this.listeners.get(event)?.delete(callback)\r\n    }\r\n  }\r\n\r\n  emit<K extends ViewEvent>(event: K, data: ViewEventData[K]): void {\r\n    const callbacks = this.listeners.get(event)\r\n    if (callbacks) {\r\n      callbacks.forEach((callback) => callback(data))\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // CONFIGURATION\r\n  // ========================================================================\r\n\r\n  configure(options: ViewOptions): void {\r\n    this.options = { ...this.options, ...options }\r\n  }\r\n\r\n  getConfig(): ViewOptions {\r\n    return { ...this.options }\r\n  }\r\n\r\n  // ========================================================================\r\n  // HELPERS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Check if view is mounted\r\n   */\r\n  protected isMounted(): boolean {\r\n    return this.container !== null && this.data !== null\r\n  }\r\n\r\n  /**\r\n   * Get container dimensions\r\n   */\r\n  protected getContainerSize(): { width: number; height: number } {\r\n    if (!this.container) {\r\n      return { width: 0, height: 0 }\r\n    }\r\n    return {\r\n      width: this.container.clientWidth,\r\n      height: this.container.clientHeight,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Apply theme classes to container\r\n   */\r\n  protected applyTheme(): void {\r\n    if (!this.container) return\r\n\r\n    const themeClass = `asakaa-theme-${this.options.theme}`\r\n    this.container.classList.add('asakaa-view', themeClass)\r\n  }\r\n\r\n  /**\r\n   * Cleanup theme classes\r\n   */\r\n  protected cleanupTheme(): void {\r\n    if (!this.container) return\r\n\r\n    this.container.classList.remove(\r\n      'asakaa-view',\r\n      'asakaa-theme-dark',\r\n      'asakaa-theme-light',\r\n      'asakaa-theme-neutral'\r\n    )\r\n  }\r\n}\r\n","/**\r\n * ViewRegistry - Manages view registration and switching\r\n * @module views/ViewRegistry\r\n */\r\n\r\nimport type { ViewAdapter, ViewOptions, ViewBoardData } from './ViewAdapter'\r\n\r\n/**\r\n * View registry events\r\n */\r\nexport type ViewRegistryEvent =\r\n  | 'view:registered'\r\n  | 'view:unregistered'\r\n  | 'view:switched'\r\n  | 'view:error'\r\n\r\n/**\r\n * View registry event data\r\n */\r\nexport interface ViewRegistryEventData {\r\n  'view:registered': { viewId: string; view: ViewAdapter }\r\n  'view:unregistered': { viewId: string }\r\n  'view:switched': { fromViewId: string | null; toViewId: string; timestamp: number }\r\n  'view:error': { viewId: string; error: Error }\r\n}\r\n\r\n/**\r\n * View registry event callback\r\n */\r\nexport type ViewRegistryEventCallback<K extends ViewRegistryEvent> = (\r\n  data: ViewRegistryEventData[K]\r\n) => void\r\n\r\n/**\r\n * View metadata\r\n */\r\nexport interface ViewMetadata {\r\n  id: string\r\n  name: string\r\n  version?: string\r\n  description?: string\r\n  icon?: string\r\n  supportedExports?: string[]\r\n  registeredAt: number\r\n  timesActivated: number\r\n  lastActivatedAt: number | null\r\n}\r\n\r\n/**\r\n * ViewRegistry\r\n *\r\n * Manages registration, activation, and switching of views.\r\n *\r\n * @example\r\n * ```typescript\r\n * const registry = new ViewRegistry()\r\n *\r\n * // Register views\r\n * registry.register(new KanbanView())\r\n * registry.register(new GanttView())\r\n *\r\n * // Switch between views\r\n * await registry.activate('kanban', container, data)\r\n * await registry.switchTo('gantt') // Smooth transition\r\n *\r\n * // Query views\r\n * const views = registry.listViews()\r\n * const current = registry.getCurrentView()\r\n * ```\r\n */\r\nexport class ViewRegistry {\r\n  private views = new Map<string, ViewAdapter>()\r\n  private metadata = new Map<string, ViewMetadata>()\r\n  private currentView: ViewAdapter | null = null\r\n  private currentViewId: string | null = null\r\n  private container: HTMLElement | null = null\r\n  private currentData: ViewBoardData | null = null\r\n  private listeners = new Map<ViewRegistryEvent, Set<ViewRegistryEventCallback<any>>>()\r\n\r\n  // ========================================================================\r\n  // REGISTRATION\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Register a new view\r\n   *\r\n   * @param view - View to register\r\n   * @throws Error if view with same ID already registered\r\n   */\r\n  register(view: ViewAdapter): void {\r\n    if (this.views.has(view.id)) {\r\n      throw new Error(`View '${view.id}' is already registered`)\r\n    }\r\n\r\n    this.views.set(view.id, view)\r\n    this.metadata.set(view.id, {\r\n      id: view.id,\r\n      name: view.name,\r\n      version: view.version,\r\n      description: view.description,\r\n      icon: view.icon,\r\n      supportedExports: view.supportedExports,\r\n      registeredAt: Date.now(),\r\n      timesActivated: 0,\r\n      lastActivatedAt: null,\r\n    })\r\n\r\n    this.emit('view:registered', { viewId: view.id, view })\r\n  }\r\n\r\n  /**\r\n   * Unregister a view\r\n   *\r\n   * @param viewId - View ID to unregister\r\n   * @throws Error if trying to unregister active view\r\n   */\r\n  unregister(viewId: string): void {\r\n    if (!this.views.has(viewId)) {\r\n      throw new Error(`View '${viewId}' is not registered`)\r\n    }\r\n\r\n    if (this.currentViewId === viewId) {\r\n      throw new Error(`Cannot unregister active view '${viewId}'. Switch to another view first.`)\r\n    }\r\n\r\n    this.views.delete(viewId)\r\n    this.metadata.delete(viewId)\r\n\r\n    this.emit('view:unregistered', { viewId })\r\n  }\r\n\r\n  /**\r\n   * Check if a view is registered\r\n   */\r\n  hasView(viewId: string): boolean {\r\n    return this.views.has(viewId)\r\n  }\r\n\r\n  /**\r\n   * Get a registered view\r\n   */\r\n  getView(viewId: string): ViewAdapter | undefined {\r\n    return this.views.get(viewId)\r\n  }\r\n\r\n  /**\r\n   * List all registered views\r\n   */\r\n  listViews(): ViewMetadata[] {\r\n    return Array.from(this.metadata.values())\r\n  }\r\n\r\n  /**\r\n   * Get view metadata\r\n   */\r\n  getMetadata(viewId: string): ViewMetadata | undefined {\r\n    return this.metadata.get(viewId)\r\n  }\r\n\r\n  // ========================================================================\r\n  // ACTIVATION & SWITCHING\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Activate a view\r\n   *\r\n   * Mounts the view to the container with the provided data.\r\n   *\r\n   * @param viewId - View ID to activate\r\n   * @param container - Container element\r\n   * @param data - Initial data\r\n   * @param options - View options\r\n   * @throws Error if view not found\r\n   */\r\n  async activate(\r\n    viewId: string,\r\n    container: HTMLElement,\r\n    data: ViewBoardData,\r\n    options?: ViewOptions\r\n  ): Promise<void> {\r\n    const view = this.views.get(viewId)\r\n    if (!view) {\r\n      throw new Error(`View '${viewId}' not found`)\r\n    }\r\n\r\n    // Deactivate current view if any\r\n    if (this.currentView) {\r\n      this.currentView.unmount()\r\n    }\r\n\r\n    // Store container and data\r\n    this.container = container\r\n    this.currentData = data\r\n\r\n    // Configure view if options provided\r\n    if (options) {\r\n      view.configure(options)\r\n    }\r\n\r\n    // Mount new view\r\n    const startTime = performance.now()\r\n    try {\r\n      view.mount(container, data)\r\n\r\n      // Update metadata\r\n      const meta = this.metadata.get(viewId)\r\n      if (meta) {\r\n        meta.timesActivated++\r\n        meta.lastActivatedAt = Date.now()\r\n      }\r\n\r\n      // Update current view\r\n      const previousViewId = this.currentViewId\r\n      this.currentView = view\r\n      this.currentViewId = viewId\r\n\r\n      // Emit event\r\n      this.emit('view:switched', {\r\n        fromViewId: previousViewId,\r\n        toViewId: viewId,\r\n        timestamp: Date.now(),\r\n      })\r\n\r\n      // Emit ready event on view\r\n      const renderTime = performance.now() - startTime\r\n      view.emit('view:ready', { viewId, renderTime })\r\n    } catch (error) {\r\n      this.emit('view:error', { viewId, error: error as Error })\r\n      throw error\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Switch to another view\r\n   *\r\n   * Convenience method that unmounts current view and mounts new one.\r\n   * Uses the same container and data as current view.\r\n   *\r\n   * @param viewId - View ID to switch to\r\n   * @param options - Optional view options\r\n   * @throws Error if no view is currently active or if target view not found\r\n   */\r\n  async switchTo(viewId: string, options?: ViewOptions): Promise<void> {\r\n    if (!this.container || !this.currentData) {\r\n      throw new Error('No view is currently active. Use activate() first.')\r\n    }\r\n\r\n    await this.activate(viewId, this.container, this.currentData, options)\r\n  }\r\n\r\n  /**\r\n   * Update current view with new data\r\n   *\r\n   * @param data - New data\r\n   * @throws Error if no view is active\r\n   */\r\n  update(data: ViewBoardData): void {\r\n    if (!this.currentView) {\r\n      throw new Error('No view is currently active')\r\n    }\r\n\r\n    this.currentData = data\r\n    this.currentView.update(data)\r\n  }\r\n\r\n  /**\r\n   * Deactivate current view\r\n   */\r\n  deactivate(): void {\r\n    if (this.currentView) {\r\n      this.currentView.unmount()\r\n      this.currentView = null\r\n      this.currentViewId = null\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // STATE QUERIES\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Get current active view\r\n   */\r\n  getCurrentView(): ViewAdapter | null {\r\n    return this.currentView\r\n  }\r\n\r\n  /**\r\n   * Get current view ID\r\n   */\r\n  getCurrentViewId(): string | null {\r\n    return this.currentViewId\r\n  }\r\n\r\n  /**\r\n   * Check if a specific view is active\r\n   */\r\n  isActive(viewId: string): boolean {\r\n    return this.currentViewId === viewId\r\n  }\r\n\r\n  /**\r\n   * Get current container\r\n   */\r\n  getContainer(): HTMLElement | null {\r\n    return this.container\r\n  }\r\n\r\n  /**\r\n   * Get current data\r\n   */\r\n  getCurrentData(): ViewBoardData | null {\r\n    return this.currentData\r\n  }\r\n\r\n  // ========================================================================\r\n  // CONFIGURATION\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Configure current view\r\n   *\r\n   * @param options - View options\r\n   * @throws Error if no view is active\r\n   */\r\n  configure(options: ViewOptions): void {\r\n    if (!this.currentView) {\r\n      throw new Error('No view is currently active')\r\n    }\r\n\r\n    this.currentView.configure(options)\r\n  }\r\n\r\n  /**\r\n   * Get current view configuration\r\n   *\r\n   * @throws Error if no view is active\r\n   */\r\n  getConfig(): ViewOptions {\r\n    if (!this.currentView) {\r\n      throw new Error('No view is currently active')\r\n    }\r\n\r\n    return this.currentView.getConfig()\r\n  }\r\n\r\n  // ========================================================================\r\n  // EVENTS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Subscribe to registry events\r\n   */\r\n  on<K extends ViewRegistryEvent>(\r\n    event: K,\r\n    callback: ViewRegistryEventCallback<K>\r\n  ): () => void {\r\n    if (!this.listeners.has(event)) {\r\n      this.listeners.set(event, new Set())\r\n    }\r\n    this.listeners.get(event)!.add(callback)\r\n\r\n    return () => {\r\n      this.listeners.get(event)?.delete(callback)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Emit a registry event\r\n   */\r\n  private emit<K extends ViewRegistryEvent>(event: K, data: ViewRegistryEventData[K]): void {\r\n    const callbacks = this.listeners.get(event)\r\n    if (callbacks) {\r\n      callbacks.forEach((callback) => callback(data))\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // UTILITIES\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Get statistics about views\r\n   */\r\n  getStats(): {\r\n    totalViews: number\r\n    activeViewId: string | null\r\n    mostActivatedView: ViewMetadata | null\r\n    averageActivations: number\r\n  } {\r\n    const metas = Array.from(this.metadata.values())\r\n    const totalActivations = metas.reduce((sum, meta) => sum + meta.timesActivated, 0)\r\n\r\n    let mostActivatedView: ViewMetadata | null = null\r\n    let maxActivations = 0\r\n\r\n    metas.forEach((meta) => {\r\n      if (meta.timesActivated > maxActivations) {\r\n        maxActivations = meta.timesActivated\r\n        mostActivatedView = meta\r\n      }\r\n    })\r\n\r\n    return {\r\n      totalViews: this.views.size,\r\n      activeViewId: this.currentViewId,\r\n      mostActivatedView,\r\n      averageActivations: metas.length > 0 ? totalActivations / metas.length : 0,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Clear all listeners\r\n   */\r\n  clearListeners(): void {\r\n    this.listeners.clear()\r\n  }\r\n\r\n  /**\r\n   * Destroy registry and cleanup\r\n   */\r\n  destroy(): void {\r\n    this.deactivate()\r\n    this.views.clear()\r\n    this.metadata.clear()\r\n    this.listeners.clear()\r\n    this.container = null\r\n    this.currentData = null\r\n  }\r\n}\r\n","/**\r\n * Plugin System for AsakaaRuntime\r\n * @module runtime/Plugin\r\n */\r\n\r\nimport type { AsakaaRuntime } from './AsakaaRuntime'\r\nimport type { BoardState } from '../store'\r\n\r\n/**\r\n * Plugin context - API available to plugins\r\n */\r\nexport interface PluginContext {\r\n  /**\r\n   * Get runtime instance\r\n   */\r\n  getRuntime(): AsakaaRuntime\r\n\r\n  /**\r\n   * Get current board state\r\n   */\r\n  getState(): BoardState\r\n\r\n  /**\r\n   * Subscribe to state changes\r\n   *\r\n   * @param callback - State change callback\r\n   * @returns Unsubscribe function\r\n   */\r\n  onStateChange(callback: (state: BoardState) => void): () => void\r\n\r\n  /**\r\n   * Subscribe to view changes\r\n   *\r\n   * @param callback - View change callback\r\n   * @returns Unsubscribe function\r\n   */\r\n  onViewChange(callback: (viewId: string) => void): () => void\r\n\r\n  /**\r\n   * Store plugin-specific data\r\n   *\r\n   * @param key - Data key\r\n   * @param value - Data value\r\n   */\r\n  setData(key: string, value: any): void\r\n\r\n  /**\r\n   * Get plugin-specific data\r\n   *\r\n   * @param key - Data key\r\n   * @returns Stored value\r\n   */\r\n  getData(key: string): any\r\n\r\n  /**\r\n   * Remove all event listeners added by this plugin\r\n   */\r\n  removeAllListeners(): void\r\n\r\n  /**\r\n   * Log message (only in dev mode)\r\n   */\r\n  log(...args: any[]): void\r\n}\r\n\r\n/**\r\n * Plugin interface\r\n *\r\n * Plugins can extend Asakaa functionality without modifying core code.\r\n *\r\n * @example\r\n * ```typescript\r\n * export const autoSavePlugin: Plugin = {\r\n *   id: 'auto-save',\r\n *   name: 'Auto Save',\r\n *   version: '1.0.0',\r\n *\r\n *   install(context) {\r\n *     context.onStateChange((state) => {\r\n *       localStorage.setItem('board', JSON.stringify(state))\r\n *     })\r\n *     context.log('Auto-save plugin installed')\r\n *   },\r\n *\r\n *   uninstall(context) {\r\n *     context.removeAllListeners()\r\n *     context.log('Auto-save plugin uninstalled')\r\n *   }\r\n * }\r\n * ```\r\n */\r\nexport interface Plugin {\r\n  /**\r\n   * Unique plugin identifier\r\n   */\r\n  readonly id: string\r\n\r\n  /**\r\n   * Human-readable name\r\n   */\r\n  readonly name: string\r\n\r\n  /**\r\n   * Plugin version (semantic versioning)\r\n   */\r\n  readonly version: string\r\n\r\n  /**\r\n   * Plugin description\r\n   */\r\n  readonly description?: string\r\n\r\n  /**\r\n   * Plugin author\r\n   */\r\n  readonly author?: string\r\n\r\n  /**\r\n   * Plugin homepage URL\r\n   */\r\n  readonly homepage?: string\r\n\r\n  /**\r\n   * Install the plugin\r\n   *\r\n   * Called when plugin is first installed.\r\n   * Setup event listeners, initialize state, etc.\r\n   *\r\n   * @param context - Plugin context\r\n   */\r\n  install(context: PluginContext): void | Promise<void>\r\n\r\n  /**\r\n   * Uninstall the plugin\r\n   *\r\n   * Called when plugin is removed.\r\n   * Cleanup event listeners, remove state, etc.\r\n   *\r\n   * @param context - Plugin context\r\n   */\r\n  uninstall(context: PluginContext): void | Promise<void>\r\n\r\n  /**\r\n   * Plugin configuration options\r\n   */\r\n  config?: Record<string, any>\r\n\r\n  /**\r\n   * Enable plugin\r\n   *\r\n   * Optional method called when plugin is enabled after being disabled\r\n   */\r\n  enable?(context: PluginContext): void\r\n\r\n  /**\r\n   * Disable plugin\r\n   *\r\n   * Optional method called when plugin is temporarily disabled\r\n   */\r\n  disable?(context: PluginContext): void\r\n}\r\n\r\n/**\r\n * Plugin metadata\r\n */\r\nexport interface PluginMetadata {\r\n  id: string\r\n  name: string\r\n  version: string\r\n  description?: string\r\n  author?: string\r\n  homepage?: string\r\n  installedAt: number\r\n  enabled: boolean\r\n}\r\n\r\n/**\r\n * PluginRegistry\r\n *\r\n * Manages plugin installation, uninstallation, and lifecycle.\r\n */\r\nexport class PluginRegistry {\r\n  private plugins = new Map<string, Plugin>()\r\n  private metadata = new Map<string, PluginMetadata>()\r\n  private contexts = new Map<string, PluginContext>()\r\n  private runtime: AsakaaRuntime\r\n\r\n  constructor(runtime: AsakaaRuntime) {\r\n    this.runtime = runtime\r\n  }\r\n\r\n  /**\r\n   * Install a plugin\r\n   *\r\n   * @param plugin - Plugin to install\r\n   * @throws Error if plugin with same ID already installed\r\n   */\r\n  async install(plugin: Plugin): Promise<void> {\r\n    if (this.plugins.has(plugin.id)) {\r\n      throw new Error(`Plugin '${plugin.id}' is already installed`)\r\n    }\r\n\r\n    // Create plugin context\r\n    const context = this.createContext(plugin.id)\r\n\r\n    // Install plugin\r\n    await plugin.install(context)\r\n\r\n    // Store plugin and metadata\r\n    this.plugins.set(plugin.id, plugin)\r\n    this.contexts.set(plugin.id, context)\r\n    this.metadata.set(plugin.id, {\r\n      id: plugin.id,\r\n      name: plugin.name,\r\n      version: plugin.version,\r\n      description: plugin.description,\r\n      author: plugin.author,\r\n      homepage: plugin.homepage,\r\n      installedAt: Date.now(),\r\n      enabled: true,\r\n    })\r\n\r\n    if (this.runtime.isDevMode()) {\r\n      console.log(`[PluginRegistry] Installed plugin: ${plugin.name} v${plugin.version}`)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Uninstall a plugin\r\n   *\r\n   * @param pluginId - Plugin ID to uninstall\r\n   */\r\n  async uninstall(pluginId: string): Promise<void> {\r\n    const plugin = this.plugins.get(pluginId)\r\n    if (!plugin) {\r\n      throw new Error(`Plugin '${pluginId}' is not installed`)\r\n    }\r\n\r\n    const context = this.contexts.get(pluginId)!\r\n\r\n    // Uninstall plugin\r\n    await plugin.uninstall(context)\r\n\r\n    // Remove plugin data\r\n    this.plugins.delete(pluginId)\r\n    this.contexts.delete(pluginId)\r\n    this.metadata.delete(pluginId)\r\n\r\n    if (this.runtime.isDevMode()) {\r\n      console.log(`[PluginRegistry] Uninstalled plugin: ${plugin.name}`)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Enable a plugin\r\n   *\r\n   * @param pluginId - Plugin ID to enable\r\n   */\r\n  async enable(pluginId: string): Promise<void> {\r\n    const plugin = this.plugins.get(pluginId)\r\n    const meta = this.metadata.get(pluginId)\r\n\r\n    if (!plugin || !meta) {\r\n      throw new Error(`Plugin '${pluginId}' is not installed`)\r\n    }\r\n\r\n    if (meta.enabled) {\r\n      return // Already enabled\r\n    }\r\n\r\n    const context = this.contexts.get(pluginId)!\r\n\r\n    if (plugin.enable) {\r\n      await plugin.enable(context)\r\n    }\r\n\r\n    meta.enabled = true\r\n\r\n    if (this.runtime.isDevMode()) {\r\n      console.log(`[PluginRegistry] Enabled plugin: ${plugin.name}`)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Disable a plugin\r\n   *\r\n   * @param pluginId - Plugin ID to disable\r\n   */\r\n  async disable(pluginId: string): Promise<void> {\r\n    const plugin = this.plugins.get(pluginId)\r\n    const meta = this.metadata.get(pluginId)\r\n\r\n    if (!plugin || !meta) {\r\n      throw new Error(`Plugin '${pluginId}' is not installed`)\r\n    }\r\n\r\n    if (!meta.enabled) {\r\n      return // Already disabled\r\n    }\r\n\r\n    const context = this.contexts.get(pluginId)!\r\n\r\n    if (plugin.disable) {\r\n      await plugin.disable(context)\r\n    }\r\n\r\n    meta.enabled = false\r\n\r\n    if (this.runtime.isDevMode()) {\r\n      console.log(`[PluginRegistry] Disabled plugin: ${plugin.name}`)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if a plugin is installed\r\n   */\r\n  hasPlugin(pluginId: string): boolean {\r\n    return this.plugins.has(pluginId)\r\n  }\r\n\r\n  /**\r\n   * Get a plugin\r\n   */\r\n  getPlugin(pluginId: string): Plugin | undefined {\r\n    return this.plugins.get(pluginId)\r\n  }\r\n\r\n  /**\r\n   * List all installed plugins\r\n   */\r\n  listPlugins(): PluginMetadata[] {\r\n    return Array.from(this.metadata.values())\r\n  }\r\n\r\n  /**\r\n   * Get plugin metadata\r\n   */\r\n  getMetadata(pluginId: string): PluginMetadata | undefined {\r\n    return this.metadata.get(pluginId)\r\n  }\r\n\r\n  /**\r\n   * Destroy registry and uninstall all plugins\r\n   */\r\n  async destroy(): Promise<void> {\r\n    const pluginIds = Array.from(this.plugins.keys())\r\n\r\n    for (const pluginId of pluginIds) {\r\n      await this.uninstall(pluginId)\r\n    }\r\n\r\n    this.plugins.clear()\r\n    this.metadata.clear()\r\n    this.contexts.clear()\r\n  }\r\n\r\n  /**\r\n   * Create plugin context\r\n   */\r\n  private createContext(pluginId: string): PluginContext {\r\n    const listeners: Array<() => void> = []\r\n    const pluginData = new Map<string, any>()\r\n\r\n    return {\r\n      getRuntime: () => this.runtime,\r\n\r\n      getState: () => this.runtime.getState(),\r\n\r\n      onStateChange: (callback) => {\r\n        const unsubscribe = this.runtime.onStateChange(callback)\r\n        listeners.push(unsubscribe)\r\n        return unsubscribe\r\n      },\r\n\r\n      onViewChange: (callback) => {\r\n        const unsubscribe = this.runtime.on('view:changed', ({ viewId }) => {\r\n          callback(viewId)\r\n        })\r\n        listeners.push(unsubscribe)\r\n        return unsubscribe\r\n      },\r\n\r\n      setData: (key, value) => {\r\n        pluginData.set(key, value)\r\n      },\r\n\r\n      getData: (key) => {\r\n        return pluginData.get(key)\r\n      },\r\n\r\n      removeAllListeners: () => {\r\n        listeners.forEach((unsubscribe) => unsubscribe())\r\n        listeners.length = 0\r\n      },\r\n\r\n      log: (...args) => {\r\n        if (this.runtime.isDevMode()) {\r\n          console.log(`[Plugin:${pluginId}]`, ...args)\r\n        }\r\n      },\r\n    }\r\n  }\r\n}\r\n","/**\r\n * AsakaaRuntime - Universal runtime for Asakaa project management\r\n * @module runtime/AsakaaRuntime\r\n *\r\n * The core orchestrator that manages:\r\n * - State (BoardStore)\r\n * - Views (ViewRegistry)\r\n * - Plugins (PluginRegistry)\r\n * - Serialization (Import/Export)\r\n * - Lazy loading\r\n */\r\n\r\nimport { BoardStore } from '../store/BoardStore'\r\nimport { ViewRegistry } from '../views/ViewRegistry'\r\nimport { PluginRegistry } from './Plugin'\r\nimport type { ViewAdapter, ViewOptions } from '../views/ViewAdapter'\r\nimport type { Plugin } from './Plugin'\r\nimport type { BoardState } from '../store'\r\nimport type { BoardData, CardData, ColumnData } from '../types'\r\n\r\n/**\r\n * Runtime configuration\r\n */\r\nexport interface RuntimeConfig {\r\n  /**\r\n   * Initial board data\r\n   */\r\n  initialData?: {\r\n    board?: BoardData\r\n    columns?: ColumnData[]\r\n    cards?: CardData[]\r\n  }\r\n\r\n  /**\r\n   * Enable development mode\r\n   * @default false\r\n   */\r\n  devMode?: boolean\r\n\r\n  /**\r\n   * Enable performance monitoring\r\n   * @default false\r\n   */\r\n  enablePerfMonitoring?: boolean\r\n\r\n  /**\r\n   * Default view to activate\r\n   * @default 'kanban'\r\n   */\r\n  defaultView?: string\r\n\r\n  /**\r\n   * Auto-save configuration\r\n   */\r\n  autoSave?: {\r\n    enabled: boolean\r\n    interval: number // milliseconds\r\n    storage?: 'localStorage' | 'sessionStorage' | 'custom'\r\n    key?: string\r\n  }\r\n}\r\n\r\n/**\r\n * Runtime events\r\n */\r\nexport type RuntimeEvent =\r\n  | 'runtime:initialized'\r\n  | 'runtime:destroyed'\r\n  | 'runtime:error'\r\n  | 'state:changed'\r\n  | 'view:changed'\r\n  | 'plugin:installed'\r\n  | 'plugin:uninstalled'\r\n\r\n/**\r\n * Runtime event data\r\n */\r\nexport interface RuntimeEventData {\r\n  'runtime:initialized': { timestamp: number; config: RuntimeConfig }\r\n  'runtime:destroyed': { timestamp: number }\r\n  'runtime:error': { error: Error; context?: string }\r\n  'state:changed': { state: BoardState }\r\n  'view:changed': { viewId: string; timestamp: number }\r\n  'plugin:installed': { pluginId: string }\r\n  'plugin:uninstalled': { pluginId: string }\r\n}\r\n\r\n/**\r\n * Runtime event callback\r\n */\r\nexport type RuntimeEventCallback<K extends RuntimeEvent> = (data: RuntimeEventData[K]) => void\r\n\r\n/**\r\n * Serialization format\r\n */\r\nexport type SerializationFormat = 'json' | 'binary' | 'msgpack'\r\n\r\n/**\r\n * Serialized board data structure\r\n */\r\nexport interface SerializedBoardData {\r\n  board: BoardData | null\r\n  columns: ColumnData[]\r\n  cards: CardData[]\r\n}\r\n\r\n/**\r\n * AsakaaRuntime\r\n *\r\n * The universal runtime that orchestrates all Asakaa functionality.\r\n * This is the main entry point for using Asakaa in any framework.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Create runtime\r\n * const runtime = new AsakaaRuntime({\r\n *   initialData: { board, columns, cards },\r\n *   defaultView: 'kanban'\r\n * })\r\n *\r\n * // Register views\r\n * runtime.registerView(new KanbanView())\r\n * runtime.registerView(new GanttView())\r\n *\r\n * // Activate a view\r\n * await runtime.activateView('kanban', container)\r\n *\r\n * // Switch views\r\n * await runtime.switchView('gantt')\r\n *\r\n * // Listen to state changes\r\n * runtime.on('state:changed', ({ state }) => {\r\n *   console.log('State updated:', state)\r\n * })\r\n * ```\r\n */\r\nexport class AsakaaRuntime {\r\n  private store: BoardStore\r\n  private viewRegistry: ViewRegistry\r\n  private pluginRegistry: PluginRegistry\r\n  private config: RuntimeConfig\r\n  private listeners = new Map<RuntimeEvent, Set<RuntimeEventCallback<any>>>()\r\n  private autoSaveInterval: NodeJS.Timeout | null = null\r\n  private isDestroyed = false\r\n\r\n  // Performance monitoring\r\n  private perfMarks = new Map<string, number>()\r\n\r\n  constructor(config: RuntimeConfig = {}) {\r\n    this.config = {\r\n      devMode: false,\r\n      enablePerfMonitoring: false,\r\n      defaultView: 'kanban',\r\n      ...config,\r\n    }\r\n\r\n    // Initialize store\r\n    this.store = this.initializeStore(config.initialData)\r\n\r\n    // Initialize view registry\r\n    this.viewRegistry = new ViewRegistry()\r\n\r\n    // Initialize plugin registry (needs runtime instance, so using 'this')\r\n    this.pluginRegistry = new PluginRegistry(this)\r\n\r\n    // Setup state change listener\r\n    this.store.subscribeAll(() => {\r\n      this.emit('state:changed', { state: this.store.getState() })\r\n    })\r\n\r\n    // Setup view change listener\r\n    this.viewRegistry.on('view:switched', ({ toViewId, timestamp }) => {\r\n      this.emit('view:changed', { viewId: toViewId, timestamp })\r\n    })\r\n\r\n    // Setup auto-save if enabled\r\n    if (this.config.autoSave?.enabled) {\r\n      this.setupAutoSave()\r\n    }\r\n\r\n    this.emit('runtime:initialized', { timestamp: Date.now(), config: this.config })\r\n\r\n    if (this.config.devMode) {\r\n      console.log('[AsakaaRuntime] Initialized with config:', this.config)\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // INITIALIZATION\r\n  // ========================================================================\r\n\r\n  private initializeStore(initialData?: RuntimeConfig['initialData']): BoardStore {\r\n    const columnsMap = new Map()\r\n    const cardsMap = new Map()\r\n    let board = null\r\n\r\n    if (initialData) {\r\n      // Load columns\r\n      if (initialData.columns) {\r\n        const { Column } = require('../models')\r\n        initialData.columns.forEach((colData) => {\r\n          columnsMap.set(colData.id, new Column(colData))\r\n        })\r\n      }\r\n\r\n      // Load cards\r\n      if (initialData.cards) {\r\n        const { Card } = require('../models')\r\n        initialData.cards.forEach((cardData) => {\r\n          cardsMap.set(cardData.id, new Card(cardData))\r\n        })\r\n      }\r\n\r\n      // Load board\r\n      if (initialData.board) {\r\n        const { Board } = require('../models')\r\n        board = new Board(initialData.board)\r\n      }\r\n    }\r\n\r\n    return new BoardStore({\r\n      board,\r\n      columns: columnsMap,\r\n      cards: cardsMap,\r\n    })\r\n  }\r\n\r\n  // ========================================================================\r\n  // STATE MANAGEMENT\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Get the BoardStore instance\r\n   */\r\n  getStore(): BoardStore {\r\n    this.ensureNotDestroyed()\r\n    return this.store\r\n  }\r\n\r\n  /**\r\n   * Get current board state\r\n   */\r\n  getState(): BoardState {\r\n    this.ensureNotDestroyed()\r\n    return this.store.getState()\r\n  }\r\n\r\n  /**\r\n   * Subscribe to state changes\r\n   *\r\n   * @param callback - State change callback\r\n   * @returns Unsubscribe function\r\n   */\r\n  onStateChange(callback: (state: BoardState) => void): () => void {\r\n    this.ensureNotDestroyed()\r\n    return this.store.subscribeAll(() => {\r\n      callback(this.store.getState())\r\n    })\r\n  }\r\n\r\n  // ========================================================================\r\n  // VIEW MANAGEMENT\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Register a view\r\n   *\r\n   * @param view - View to register\r\n   */\r\n  registerView(view: ViewAdapter): void {\r\n    this.ensureNotDestroyed()\r\n    this.viewRegistry.register(view)\r\n\r\n    if (this.config.devMode) {\r\n      console.log(`[AsakaaRuntime] Registered view: ${view.id} (${view.name})`)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Unregister a view\r\n   *\r\n   * @param viewId - View ID to unregister\r\n   */\r\n  unregisterView(viewId: string): void {\r\n    this.ensureNotDestroyed()\r\n    this.viewRegistry.unregister(viewId)\r\n\r\n    if (this.config.devMode) {\r\n      console.log(`[AsakaaRuntime] Unregistered view: ${viewId}`)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Activate a view\r\n   *\r\n   * @param viewId - View ID to activate\r\n   * @param container - Container element\r\n   * @param options - View options\r\n   */\r\n  async activateView(\r\n    viewId: string,\r\n    container: HTMLElement,\r\n    options?: ViewOptions\r\n  ): Promise<void> {\r\n    this.ensureNotDestroyed()\r\n\r\n    const startTime = this.perfMark('activateView')\r\n\r\n    try {\r\n      const data = this.serializeForView()\r\n      await this.viewRegistry.activate(viewId, container, data, options)\r\n\r\n      if (this.config.enablePerfMonitoring) {\r\n        const duration = this.perfMeasure('activateView', startTime)\r\n        console.log(`[AsakaaRuntime] View activated in ${duration}ms`)\r\n      }\r\n    } catch (error) {\r\n      this.emit('runtime:error', {\r\n        error: error as Error,\r\n        context: `activateView(${viewId})`,\r\n      })\r\n      throw error\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Switch to another view\r\n   *\r\n   * @param viewId - View ID to switch to\r\n   * @param options - View options\r\n   */\r\n  async switchView(viewId: string, options?: ViewOptions): Promise<void> {\r\n    this.ensureNotDestroyed()\r\n\r\n    const startTime = this.perfMark('switchView')\r\n\r\n    try {\r\n      await this.viewRegistry.switchTo(viewId, options)\r\n\r\n      if (this.config.enablePerfMonitoring) {\r\n        const duration = this.perfMeasure('switchView', startTime)\r\n        console.log(`[AsakaaRuntime] View switched in ${duration}ms`)\r\n      }\r\n    } catch (error) {\r\n      this.emit('runtime:error', {\r\n        error: error as Error,\r\n        context: `switchView(${viewId})`,\r\n      })\r\n      throw error\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get current view ID\r\n   */\r\n  getCurrentViewId(): string | null {\r\n    this.ensureNotDestroyed()\r\n    return this.viewRegistry.getCurrentViewId()\r\n  }\r\n\r\n  /**\r\n   * List all registered views\r\n   */\r\n  listViews() {\r\n    this.ensureNotDestroyed()\r\n    return this.viewRegistry.listViews()\r\n  }\r\n\r\n  /**\r\n   * Update current view with latest data\r\n   */\r\n  updateView(): void {\r\n    this.ensureNotDestroyed()\r\n    const data = this.serializeForView()\r\n    this.viewRegistry.update(data)\r\n  }\r\n\r\n  // ========================================================================\r\n  // SERIALIZATION\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Serialize runtime state to SerializedBoardData format for views\r\n   */\r\n  private serializeForView(): SerializedBoardData {\r\n    const state = this.store.getState()\r\n\r\n    return {\r\n      board: state.board?.toData() || null,\r\n      columns: Array.from(state.columns.values()).map((col) => col.toData()),\r\n      cards: Array.from(state.cards.values()).map((card) => card.toData()),\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Export runtime state\r\n   *\r\n   * @param format - Serialization format\r\n   * @returns Serialized data\r\n   */\r\n  async serialize(format: SerializationFormat = 'json'): Promise<string> {\r\n    this.ensureNotDestroyed()\r\n\r\n    const data = this.serializeForView()\r\n\r\n    switch (format) {\r\n      case 'json':\r\n        return JSON.stringify(data, null, 2)\r\n\r\n      case 'binary':\r\n        // Future: Implement binary serialization\r\n        throw new Error('Binary serialization not yet implemented')\r\n\r\n      case 'msgpack':\r\n        // Future: Implement MessagePack serialization\r\n        throw new Error('MessagePack serialization not yet implemented')\r\n\r\n      default:\r\n        throw new Error(`Unsupported serialization format: ${format}`)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Import data into runtime\r\n   *\r\n   * @param data - Data to import\r\n   * @param format - Data format\r\n   */\r\n  async deserialize(data: string, format: SerializationFormat = 'json'): Promise<void> {\r\n    this.ensureNotDestroyed()\r\n\r\n    let boardData: SerializedBoardData\r\n\r\n    switch (format) {\r\n      case 'json':\r\n        boardData = JSON.parse(data)\r\n        break\r\n\r\n      case 'binary':\r\n        throw new Error('Binary deserialization not yet implemented')\r\n\r\n      case 'msgpack':\r\n        throw new Error('MessagePack deserialization not yet implemented')\r\n\r\n      default:\r\n        throw new Error(`Unsupported serialization format: ${format}`)\r\n    }\r\n\r\n    // Rebuild store with new data\r\n    this.store = this.initializeStore({\r\n      board: boardData.board || undefined,\r\n      columns: boardData.columns,\r\n      cards: boardData.cards,\r\n    })\r\n\r\n    // Update view if active\r\n    if (this.viewRegistry.getCurrentViewId()) {\r\n      this.updateView()\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // AUTO-SAVE\r\n  // ========================================================================\r\n\r\n  private setupAutoSave(): void {\r\n    if (!this.config.autoSave) return\r\n\r\n    const { interval, storage = 'localStorage', key = 'asakaa-board' } = this.config.autoSave\r\n\r\n    this.autoSaveInterval = setInterval(async () => {\r\n      try {\r\n        const data = await this.serialize('json')\r\n\r\n        if (storage === 'localStorage') {\r\n          localStorage.setItem(key, data)\r\n        } else if (storage === 'sessionStorage') {\r\n          sessionStorage.setItem(key, data)\r\n        }\r\n\r\n        if (this.config.devMode) {\r\n          console.log(`[AsakaaRuntime] Auto-saved to ${storage}`)\r\n        }\r\n      } catch (error) {\r\n        console.error('[AsakaaRuntime] Auto-save failed:', error)\r\n      }\r\n    }, interval)\r\n  }\r\n\r\n  /**\r\n   * Load data from auto-save storage\r\n   */\r\n  async loadFromAutoSave(): Promise<boolean> {\r\n    if (!this.config.autoSave) return false\r\n\r\n    const { storage = 'localStorage', key = 'asakaa-board' } = this.config.autoSave\r\n\r\n    try {\r\n      let data: string | null = null\r\n\r\n      if (storage === 'localStorage') {\r\n        data = localStorage.getItem(key)\r\n      } else if (storage === 'sessionStorage') {\r\n        data = sessionStorage.getItem(key)\r\n      }\r\n\r\n      if (data) {\r\n        await this.deserialize(data, 'json')\r\n        return true\r\n      }\r\n\r\n      return false\r\n    } catch (error) {\r\n      console.error('[AsakaaRuntime] Failed to load from auto-save:', error)\r\n      return false\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Clear auto-save storage\r\n   */\r\n  clearAutoSave(): void {\r\n    if (!this.config.autoSave) return\r\n\r\n    const { storage = 'localStorage', key = 'asakaa-board' } = this.config.autoSave\r\n\r\n    if (storage === 'localStorage') {\r\n      localStorage.removeItem(key)\r\n    } else if (storage === 'sessionStorage') {\r\n      sessionStorage.removeItem(key)\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // PLUGIN MANAGEMENT\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Install a plugin\r\n   *\r\n   * @param plugin - Plugin to install\r\n   */\r\n  async installPlugin(plugin: Plugin): Promise<void> {\r\n    this.ensureNotDestroyed()\r\n    await this.pluginRegistry.install(plugin)\r\n    this.emit('plugin:installed', { pluginId: plugin.id })\r\n  }\r\n\r\n  /**\r\n   * Uninstall a plugin\r\n   *\r\n   * @param pluginId - Plugin ID to uninstall\r\n   */\r\n  async uninstallPlugin(pluginId: string): Promise<void> {\r\n    this.ensureNotDestroyed()\r\n    await this.pluginRegistry.uninstall(pluginId)\r\n    this.emit('plugin:uninstalled', { pluginId })\r\n  }\r\n\r\n  /**\r\n   * Enable a plugin\r\n   *\r\n   * @param pluginId - Plugin ID to enable\r\n   */\r\n  async enablePlugin(pluginId: string): Promise<void> {\r\n    this.ensureNotDestroyed()\r\n    await this.pluginRegistry.enable(pluginId)\r\n  }\r\n\r\n  /**\r\n   * Disable a plugin\r\n   *\r\n   * @param pluginId - Plugin ID to disable\r\n   */\r\n  async disablePlugin(pluginId: string): Promise<void> {\r\n    this.ensureNotDestroyed()\r\n    await this.pluginRegistry.disable(pluginId)\r\n  }\r\n\r\n  /**\r\n   * List all installed plugins\r\n   */\r\n  listPlugins() {\r\n    this.ensureNotDestroyed()\r\n    return this.pluginRegistry.listPlugins()\r\n  }\r\n\r\n  /**\r\n   * Get plugin by ID\r\n   */\r\n  getPlugin(pluginId: string) {\r\n    this.ensureNotDestroyed()\r\n    return this.pluginRegistry.getPlugin(pluginId)\r\n  }\r\n\r\n  // ========================================================================\r\n  // EVENTS\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Subscribe to runtime events\r\n   */\r\n  on<K extends RuntimeEvent>(event: K, callback: RuntimeEventCallback<K>): () => void {\r\n    if (!this.listeners.has(event)) {\r\n      this.listeners.set(event, new Set())\r\n    }\r\n    this.listeners.get(event)!.add(callback)\r\n\r\n    return () => {\r\n      this.listeners.get(event)?.delete(callback)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Emit a runtime event\r\n   */\r\n  private emit<K extends RuntimeEvent>(event: K, data: RuntimeEventData[K]): void {\r\n    const callbacks = this.listeners.get(event)\r\n    if (callbacks) {\r\n      callbacks.forEach((callback) => callback(data))\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // PERFORMANCE MONITORING\r\n  // ========================================================================\r\n\r\n  private perfMark(name: string): number {\r\n    if (!this.config.enablePerfMonitoring) return 0\r\n    const time = performance.now()\r\n    this.perfMarks.set(name, time)\r\n    return time\r\n  }\r\n\r\n  private perfMeasure(name: string, startTime: number): number {\r\n    if (!this.config.enablePerfMonitoring) return 0\r\n    const duration = performance.now() - startTime\r\n    this.perfMarks.delete(name)\r\n    return duration\r\n  }\r\n\r\n  /**\r\n   * Get performance statistics\r\n   */\r\n  getPerformanceStats(): {\r\n    currentView: string | null\r\n    stateSize: number\r\n    viewCount: number\r\n  } {\r\n    const state = this.getState()\r\n\r\n    return {\r\n      currentView: this.getCurrentViewId(),\r\n      stateSize: state.cards.size + state.columns.size,\r\n      viewCount: this.viewRegistry.listViews().length,\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // UTILITIES\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Get runtime configuration\r\n   */\r\n  getConfig(): RuntimeConfig {\r\n    return { ...this.config }\r\n  }\r\n\r\n  /**\r\n   * Check if runtime is in dev mode\r\n   */\r\n  isDevMode(): boolean {\r\n    return this.config.devMode || false\r\n  }\r\n\r\n  /**\r\n   * Check if runtime is destroyed\r\n   */\r\n  isRuntimeDestroyed(): boolean {\r\n    return this.isDestroyed\r\n  }\r\n\r\n  private ensureNotDestroyed(): void {\r\n    if (this.isDestroyed) {\r\n      throw new Error('Runtime has been destroyed. Create a new instance.')\r\n    }\r\n  }\r\n\r\n  // ========================================================================\r\n  // LIFECYCLE\r\n  // ========================================================================\r\n\r\n  /**\r\n   * Destroy the runtime and cleanup resources\r\n   */\r\n  destroy(): void {\r\n    if (this.isDestroyed) return\r\n\r\n    // Clear auto-save interval\r\n    if (this.autoSaveInterval) {\r\n      clearInterval(this.autoSaveInterval)\r\n      this.autoSaveInterval = null\r\n    }\r\n\r\n    // Destroy plugin registry (uninstall all plugins)\r\n    this.pluginRegistry.destroy()\r\n\r\n    // Deactivate current view\r\n    this.viewRegistry.deactivate()\r\n\r\n    // Destroy view registry\r\n    this.viewRegistry.destroy()\r\n\r\n    // Clear listeners\r\n    this.listeners.clear()\r\n\r\n    // Clear performance marks\r\n    this.perfMarks.clear()\r\n\r\n    this.isDestroyed = true\r\n    this.emit('runtime:destroyed', { timestamp: Date.now() })\r\n\r\n    if (this.config.devMode) {\r\n      console.log('[AsakaaRuntime] Destroyed')\r\n    }\r\n  }\r\n}\r\n","/**\r\n * Serializer - Unified serialization interface\r\n * @module serialization/Serializer\r\n *\r\n * Provides a consistent API for serializing and deserializing board data\r\n * across multiple formats (JSON, Binary, MessagePack, etc.)\r\n */\r\n\r\nimport type { BoardData, ColumnData, CardData } from '../types'\r\n\r\n/**\r\n * Serialized data structure\r\n */\r\nexport interface SerializedData {\r\n  version: string\r\n  timestamp: number\r\n  board: BoardData | null\r\n  columns: ColumnData[]\r\n  cards: CardData[]\r\n  metadata?: Record<string, unknown>\r\n}\r\n\r\n/**\r\n * Serialization options\r\n */\r\nexport interface SerializationOptions {\r\n  /**\r\n   * Include metadata in serialization\r\n   * @default true\r\n   */\r\n  includeMetadata?: boolean\r\n\r\n  /**\r\n   * Compress data (for binary formats)\r\n   * @default false\r\n   */\r\n  compress?: boolean\r\n\r\n  /**\r\n   * Pretty-print JSON\r\n   * @default false\r\n   */\r\n  prettyPrint?: boolean\r\n\r\n  /**\r\n   * Include timestamps\r\n   * @default true\r\n   */\r\n  includeTimestamp?: boolean\r\n}\r\n\r\n/**\r\n * Serializer interface\r\n *\r\n * All serializers must implement this interface\r\n */\r\nexport interface Serializer<TOutput = string | Uint8Array> {\r\n  /**\r\n   * Serialize data\r\n   *\r\n   * @param data - Data to serialize\r\n   * @param options - Serialization options\r\n   * @returns Serialized output\r\n   */\r\n  serialize(data: SerializedData, options?: SerializationOptions): Promise<TOutput>\r\n\r\n  /**\r\n   * Deserialize data\r\n   *\r\n   * @param input - Serialized input\r\n   * @param options - Deserialization options\r\n   * @returns Deserialized data\r\n   */\r\n  deserialize(input: TOutput, options?: SerializationOptions): Promise<SerializedData>\r\n\r\n  /**\r\n   * Get MIME type for this format\r\n   */\r\n  getMimeType(): string\r\n\r\n  /**\r\n   * Get file extension for this format\r\n   */\r\n  getFileExtension(): string\r\n}\r\n\r\n/**\r\n * Base serializer with common functionality\r\n */\r\nexport abstract class BaseSerializer<TOutput = string | Uint8Array>\r\n  implements Serializer<TOutput>\r\n{\r\n  protected version = '0.7.0'\r\n\r\n  abstract serialize(\r\n    data: SerializedData,\r\n    options?: SerializationOptions\r\n  ): Promise<TOutput>\r\n\r\n  abstract deserialize(\r\n    input: TOutput,\r\n    options?: SerializationOptions\r\n  ): Promise<SerializedData>\r\n\r\n  abstract getMimeType(): string\r\n  abstract getFileExtension(): string\r\n\r\n  /**\r\n   * Create serialized data structure\r\n   */\r\n  protected createSerializedData(\r\n    board: BoardData | null,\r\n    columns: ColumnData[],\r\n    cards: CardData[],\r\n    options: SerializationOptions = {}\r\n  ): SerializedData {\r\n    const data: SerializedData = {\r\n      version: this.version,\r\n      timestamp: options.includeTimestamp !== false ? Date.now() : 0,\r\n      board,\r\n      columns,\r\n      cards,\r\n    }\r\n\r\n    if (options.includeMetadata !== false) {\r\n      data.metadata = {\r\n        serializer: this.constructor.name,\r\n        nodeVersion: typeof process !== 'undefined' ? process.version : 'unknown',\r\n        userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown',\r\n      }\r\n    }\r\n\r\n    return data\r\n  }\r\n\r\n  /**\r\n   * Validate serialized data structure\r\n   */\r\n  protected validateSerializedData(data: any): asserts data is SerializedData {\r\n    if (!data || typeof data !== 'object') {\r\n      throw new Error('Invalid serialized data: not an object')\r\n    }\r\n\r\n    if (!data.version || typeof data.version !== 'string') {\r\n      throw new Error('Invalid serialized data: missing or invalid version')\r\n    }\r\n\r\n    if (!Array.isArray(data.columns)) {\r\n      throw new Error('Invalid serialized data: columns must be an array')\r\n    }\r\n\r\n    if (!Array.isArray(data.cards)) {\r\n      throw new Error('Invalid serialized data: cards must be an array')\r\n    }\r\n\r\n    // board can be null\r\n    if (data.board !== null && typeof data.board !== 'object') {\r\n      throw new Error('Invalid serialized data: board must be an object or null')\r\n    }\r\n  }\r\n}\r\n","/**\r\n * JSONSerializer - JSON serialization implementation\r\n * @module serialization/JSONSerializer\r\n */\r\n\r\nimport { BaseSerializer, type SerializedData, type SerializationOptions } from './Serializer'\r\n\r\n/**\r\n * JSON Serializer\r\n *\r\n * Serializes board data to/from JSON format.\r\n * This is the most common and human-readable format.\r\n *\r\n * @example\r\n * ```typescript\r\n * const serializer = new JSONSerializer()\r\n *\r\n * const json = await serializer.serialize({\r\n *   version: '0.7.0',\r\n *   timestamp: Date.now(),\r\n *   board: { id: 'b1', title: 'My Board', columnIds: [] },\r\n *   columns: [],\r\n *   cards: []\r\n * })\r\n *\r\n * const data = await serializer.deserialize(json)\r\n * ```\r\n */\r\nexport class JSONSerializer extends BaseSerializer<string> {\r\n  /**\r\n   * Serialize data to JSON string\r\n   */\r\n  async serialize(\r\n    data: SerializedData,\r\n    options: SerializationOptions = {}\r\n  ): Promise<string> {\r\n    try {\r\n      const indent = options.prettyPrint ? 2 : undefined\r\n      return JSON.stringify(data, this.replacer, indent)\r\n    } catch (error) {\r\n      throw new Error(\r\n        `JSON serialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n      )\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Deserialize JSON string to data\r\n   */\r\n  async deserialize(\r\n    input: string,\r\n    _options?: SerializationOptions\r\n  ): Promise<SerializedData> {\r\n    try {\r\n      const data = JSON.parse(input, this.reviver)\r\n      this.validateSerializedData(data)\r\n      return data\r\n    } catch (error) {\r\n      throw new Error(\r\n        `JSON deserialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n      )\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get MIME type\r\n   */\r\n  getMimeType(): string {\r\n    return 'application/json'\r\n  }\r\n\r\n  /**\r\n   * Get file extension\r\n   */\r\n  getFileExtension(): string {\r\n    return '.json'\r\n  }\r\n\r\n  /**\r\n   * JSON replacer for special types\r\n   */\r\n  private replacer(_key: string, value: any): any {\r\n    // Convert Date objects to ISO strings\r\n    if (value instanceof Date) {\r\n      return { __type: 'Date', value: value.toISOString() }\r\n    }\r\n\r\n    // Convert Map to array of entries\r\n    if (value instanceof Map) {\r\n      return { __type: 'Map', value: Array.from(value.entries()) }\r\n    }\r\n\r\n    // Convert Set to array\r\n    if (value instanceof Set) {\r\n      return { __type: 'Set', value: Array.from(value) }\r\n    }\r\n\r\n    return value\r\n  }\r\n\r\n  /**\r\n   * JSON reviver for special types\r\n   */\r\n  private reviver(_key: string, value: any): any {\r\n    // Restore Date objects\r\n    if (value && value.__type === 'Date') {\r\n      return new Date(value.value)\r\n    }\r\n\r\n    // Restore Map objects\r\n    if (value && value.__type === 'Map') {\r\n      return new Map(value.value)\r\n    }\r\n\r\n    // Restore Set objects\r\n    if (value && value.__type === 'Set') {\r\n      return new Set(value.value)\r\n    }\r\n\r\n    return value\r\n  }\r\n}\r\n\r\n/**\r\n * Create a JSON serializer instance\r\n */\r\nexport function createJSONSerializer(): JSONSerializer {\r\n  return new JSONSerializer()\r\n}\r\n","/**\r\n * BinarySerializer - Binary serialization implementation\r\n * @module serialization/BinarySerializer\r\n *\r\n * Uses JSON as intermediate format, then converts to Uint8Array.\r\n * Future enhancement: Use Protocol Buffers or custom binary format.\r\n */\r\n\r\nimport { BaseSerializer, type SerializedData, type SerializationOptions } from './Serializer'\r\n\r\n/**\r\n * Binary Serializer\r\n *\r\n * Serializes board data to/from binary format (Uint8Array).\r\n * Currently uses JSON as intermediate format with UTF-8 encoding.\r\n *\r\n * @example\r\n * ```typescript\r\n * const serializer = new BinarySerializer()\r\n *\r\n * const binary = await serializer.serialize({\r\n *   version: '0.7.0',\r\n *   timestamp: Date.now(),\r\n *   board: { id: 'b1', title: 'My Board', columnIds: [] },\r\n *   columns: [],\r\n *   cards: []\r\n * })\r\n *\r\n * const data = await serializer.deserialize(binary)\r\n * ```\r\n */\r\nexport class BinarySerializer extends BaseSerializer<Uint8Array> {\r\n  private textEncoder = new TextEncoder()\r\n  private textDecoder = new TextDecoder()\r\n\r\n  /**\r\n   * Serialize data to binary format\r\n   */\r\n  async serialize(\r\n    data: SerializedData,\r\n    _options: SerializationOptions = {}\r\n  ): Promise<Uint8Array> {\r\n    try {\r\n      // Convert to JSON first\r\n      const json = JSON.stringify(data)\r\n\r\n      // Encode to UTF-8 bytes\r\n      const bytes = this.textEncoder.encode(json)\r\n\r\n      // TODO: Add compression support (gzip/deflate)\r\n      return bytes\r\n    } catch (error) {\r\n      throw new Error(\r\n        `Binary serialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n      )\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Deserialize binary format to data\r\n   */\r\n  async deserialize(\r\n    input: Uint8Array,\r\n    _options?: SerializationOptions\r\n  ): Promise<SerializedData> {\r\n    try {\r\n      // TODO: Add decompression support\r\n\r\n      // Decode UTF-8 bytes to string\r\n      const json = this.textDecoder.decode(input)\r\n\r\n      // Parse JSON\r\n      const data = JSON.parse(json)\r\n\r\n      this.validateSerializedData(data)\r\n      return data\r\n    } catch (error) {\r\n      throw new Error(\r\n        `Binary deserialization failed: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n      )\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get MIME type\r\n   */\r\n  getMimeType(): string {\r\n    return 'application/octet-stream'\r\n  }\r\n\r\n  /**\r\n   * Get file extension\r\n   */\r\n  getFileExtension(): string {\r\n    return '.bin'\r\n  }\r\n}\r\n\r\n/**\r\n * Create a binary serializer instance\r\n */\r\nexport function createBinarySerializer(): BinarySerializer {\r\n  return new BinarySerializer()\r\n}\r\n","/**\r\n * SerializerRegistry - Central registry for all serializers\r\n * @module serialization/SerializerRegistry\r\n */\r\n\r\nimport type { Serializer, SerializedData, SerializationOptions } from './Serializer'\r\nimport { JSONSerializer } from './JSONSerializer'\r\nimport { BinarySerializer } from './BinarySerializer'\r\n\r\n/**\r\n * Serializer format types\r\n */\r\nexport type SerializerFormat = 'json' | 'binary' | 'msgpack'\r\n\r\n/**\r\n * Serializer Registry\r\n *\r\n * Manages all available serializers and provides a unified API.\r\n *\r\n * @example\r\n * ```typescript\r\n * const registry = new SerializerRegistry()\r\n *\r\n * // Serialize to JSON\r\n * const json = await registry.serialize('json', data)\r\n *\r\n * // Deserialize from binary\r\n * const data = await registry.deserialize('binary', binaryData)\r\n *\r\n * // Get supported formats\r\n * const formats = registry.getSupportedFormats() // ['json', 'binary']\r\n * ```\r\n */\r\nexport class SerializerRegistry {\r\n  private serializers = new Map<SerializerFormat, Serializer<any>>()\r\n\r\n  constructor() {\r\n    // Register default serializers\r\n    this.register('json', new JSONSerializer())\r\n    this.register('binary', new BinarySerializer())\r\n  }\r\n\r\n  /**\r\n   * Register a serializer\r\n   *\r\n   * @param format - Format identifier\r\n   * @param serializer - Serializer instance\r\n   */\r\n  register<T>(format: SerializerFormat, serializer: Serializer<T>): void {\r\n    this.serializers.set(format, serializer)\r\n  }\r\n\r\n  /**\r\n   * Unregister a serializer\r\n   *\r\n   * @param format - Format identifier\r\n   */\r\n  unregister(format: SerializerFormat): void {\r\n    this.serializers.delete(format)\r\n  }\r\n\r\n  /**\r\n   * Get a serializer by format\r\n   *\r\n   * @param format - Format identifier\r\n   * @returns Serializer instance\r\n   * @throws Error if format not found\r\n   */\r\n  getSerializer<T = string | Uint8Array>(format: SerializerFormat): Serializer<T> {\r\n    const serializer = this.serializers.get(format)\r\n    if (!serializer) {\r\n      throw new Error(`Serializer for format '${format}' not found`)\r\n    }\r\n    return serializer as Serializer<T>\r\n  }\r\n\r\n  /**\r\n   * Check if a format is supported\r\n   *\r\n   * @param format - Format to check\r\n   */\r\n  isSupported(format: SerializerFormat): boolean {\r\n    return this.serializers.has(format)\r\n  }\r\n\r\n  /**\r\n   * Get all supported formats\r\n   */\r\n  getSupportedFormats(): SerializerFormat[] {\r\n    return Array.from(this.serializers.keys())\r\n  }\r\n\r\n  /**\r\n   * Serialize data using specified format\r\n   *\r\n   * @param format - Serialization format\r\n   * @param data - Data to serialize\r\n   * @param options - Serialization options\r\n   * @returns Serialized output\r\n   */\r\n  async serialize<T = string | Uint8Array>(\r\n    format: SerializerFormat,\r\n    data: SerializedData,\r\n    options?: SerializationOptions\r\n  ): Promise<T> {\r\n    const serializer = this.getSerializer<T>(format)\r\n    return serializer.serialize(data, options)\r\n  }\r\n\r\n  /**\r\n   * Deserialize data using specified format\r\n   *\r\n   * @param format - Serialization format\r\n   * @param input - Serialized input\r\n   * @param options - Deserialization options\r\n   * @returns Deserialized data\r\n   */\r\n  async deserialize<T = string | Uint8Array>(\r\n    format: SerializerFormat,\r\n    input: T,\r\n    options?: SerializationOptions\r\n  ): Promise<SerializedData> {\r\n    const serializer = this.getSerializer<T>(format)\r\n    return serializer.deserialize(input, options)\r\n  }\r\n\r\n  /**\r\n   * Get MIME type for a format\r\n   *\r\n   * @param format - Format identifier\r\n   * @returns MIME type string\r\n   */\r\n  getMimeType(format: SerializerFormat): string {\r\n    return this.getSerializer(format).getMimeType()\r\n  }\r\n\r\n  /**\r\n   * Get file extension for a format\r\n   *\r\n   * @param format - Format identifier\r\n   * @returns File extension (e.g., '.json')\r\n   */\r\n  getFileExtension(format: SerializerFormat): string {\r\n    return this.getSerializer(format).getFileExtension()\r\n  }\r\n}\r\n\r\n/**\r\n * Global serializer registry instance\r\n */\r\nexport const serializerRegistry = new SerializerRegistry()\r\n","/**\r\n * Vanilla JS Board Controller\r\n * @module adapters/vanilla\r\n *\r\n * Framework-agnostic controller for managing board state with DOM manipulation.\r\n * Can be used with vanilla JavaScript, jQuery, or any framework that doesn't have\r\n * a reactive state system.\r\n *\r\n * @example\r\n * ```typescript\r\n * const controller = new BoardController(document.getElementById('board'))\r\n *\r\n * controller.initialize({\r\n *   board: { id: 'board-1', title: 'My Board', columnIds: [] },\r\n *   columns: [],\r\n *   cards: []\r\n * })\r\n *\r\n * controller.on('card:created', (card) => {\r\n *   console.log('New card:', card)\r\n * })\r\n *\r\n * controller.addCard({\r\n *   id: 'card-1',\r\n *   title: 'New Task',\r\n *   columnId: 'col-1',\r\n *   position: 0,\r\n *   status: 'TODO'\r\n * })\r\n * ```\r\n */\r\n\r\nimport { BoardStore, Board, Column, Card } from '../../index'\r\nimport type { BoardData, ColumnData, CardData, StoreEvent } from '../../types'\r\nimport type { BoardState } from '../../store'\r\n\r\nexport interface BoardControllerOptions {\r\n  /**\r\n   * Root DOM element for the board\r\n   */\r\n  container: HTMLElement\r\n\r\n  /**\r\n   * Initial data\r\n   */\r\n  initialData?: {\r\n    board?: BoardData\r\n    columns?: ColumnData[]\r\n    cards?: CardData[]\r\n  }\r\n\r\n  /**\r\n   * Custom renderers\r\n   */\r\n  renderers?: {\r\n    renderBoard?: (container: HTMLElement, state: BoardState) => void\r\n    renderColumn?: (container: HTMLElement, column: Column, cards: Card[]) => void\r\n    renderCard?: (container: HTMLElement, card: Card) => void\r\n  }\r\n\r\n  /**\r\n   * Enable auto-render on state changes\r\n   * @default true\r\n   */\r\n  autoRender?: boolean\r\n}\r\n\r\nexport type EventHandler = (event: StoreEvent) => void\r\n\r\n/**\r\n * Vanilla JS Board Controller\r\n *\r\n * Provides a simple API for managing board state without a framework.\r\n * Handles state management via @libxai/core and provides optional DOM rendering.\r\n */\r\nexport class BoardController {\r\n  private store: BoardStore\r\n  private container: HTMLElement\r\n  private renderers: BoardControllerOptions['renderers']\r\n  private autoRender: boolean\r\n  private eventListeners: Map<string, Set<EventHandler>>\r\n\r\n  constructor(options: BoardControllerOptions) {\r\n    this.container = options.container\r\n    this.renderers = options.renderers || {}\r\n    this.autoRender = options.autoRender ?? true\r\n    this.eventListeners = new Map()\r\n\r\n    // Initialize store\r\n    const initialState: BoardState = {\r\n      board: null,\r\n      columns: new Map(),\r\n      cards: new Map(),\r\n    }\r\n\r\n    if (options.initialData) {\r\n      if (options.initialData.board) {\r\n        initialState.board = new Board(options.initialData.board)\r\n      }\r\n      if (options.initialData.columns) {\r\n        options.initialData.columns.forEach(col => {\r\n          initialState.columns.set(col.id, new Column(col))\r\n        })\r\n      }\r\n      if (options.initialData.cards) {\r\n        options.initialData.cards.forEach(card => {\r\n          initialState.cards.set(card.id, new Card(card))\r\n        })\r\n      }\r\n    }\r\n\r\n    this.store = new BoardStore(initialState)\r\n\r\n    // Setup auto-render\r\n    if (this.autoRender) {\r\n      this.store.subscribeAll((event) => {\r\n        this.handleStateChange(event)\r\n      })\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get current board state\r\n   */\r\n  getState(): BoardState {\r\n    return this.store.getState()\r\n  }\r\n\r\n  /**\r\n   * Get the board\r\n   */\r\n  getBoard(): Board | null {\r\n    return this.store.getBoard()\r\n  }\r\n\r\n  /**\r\n   * Get all columns\r\n   */\r\n  getColumns(): Column[] {\r\n    return this.store.getAllColumns()\r\n  }\r\n\r\n  /**\r\n   * Get all cards\r\n   */\r\n  getCards(): Card[] {\r\n    return this.store.getAllCards()\r\n  }\r\n\r\n  /**\r\n   * Get cards in a specific column\r\n   */\r\n  getCardsByColumn(columnId: string): Card[] {\r\n    return this.store.getCardsByColumn(columnId)\r\n  }\r\n\r\n  // ============================================================================\r\n  // Board Operations\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Update board\r\n   */\r\n  updateBoard(changes: Partial<Omit<BoardData, 'id' | 'createdAt'>>): void {\r\n    this.store.updateBoard(changes)\r\n  }\r\n\r\n  // ============================================================================\r\n  // Column Operations\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Add a new column\r\n   */\r\n  addColumn(columnData: Omit<ColumnData, 'createdAt' | 'updatedAt'>): Column {\r\n    return this.store.addColumn(columnData)\r\n  }\r\n\r\n  /**\r\n   * Update a column\r\n   */\r\n  updateColumn(columnId: string, changes: Partial<Omit<ColumnData, 'id' | 'createdAt'>>): void {\r\n    this.store.updateColumn(columnId, changes)\r\n  }\r\n\r\n  /**\r\n   * Delete a column\r\n   */\r\n  deleteColumn(columnId: string): void {\r\n    this.store.deleteColumn(columnId)\r\n  }\r\n\r\n  /**\r\n   * Get a column by ID\r\n   */\r\n  getColumn(columnId: string): Column | undefined {\r\n    return this.store.getColumn(columnId)\r\n  }\r\n\r\n  // ============================================================================\r\n  // Card Operations\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Add a new card\r\n   */\r\n  addCard(cardData: Omit<CardData, 'createdAt' | 'updatedAt'>): Card {\r\n    return this.store.addCard(cardData)\r\n  }\r\n\r\n  /**\r\n   * Update a card\r\n   */\r\n  updateCard(cardId: string, changes: Partial<Omit<CardData, 'id' | 'createdAt'>>): void {\r\n    this.store.updateCard(cardId, changes)\r\n  }\r\n\r\n  /**\r\n   * Delete a card\r\n   */\r\n  deleteCard(cardId: string): void {\r\n    this.store.deleteCard(cardId)\r\n  }\r\n\r\n  /**\r\n   * Move a card to a different column\r\n   */\r\n  moveCard(cardId: string, toColumnId: string, newPosition: number): void {\r\n    this.store.moveCard(cardId, toColumnId, newPosition)\r\n  }\r\n\r\n  /**\r\n   * Get a card by ID\r\n   */\r\n  getCard(cardId: string): Card | undefined {\r\n    return this.store.getCard(cardId)\r\n  }\r\n\r\n  // ============================================================================\r\n  // Event System\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Subscribe to events\r\n   *\r\n   * @param eventType - Event type to listen for (e.g., 'card:created', 'card:updated')\r\n   * @param handler - Event handler function\r\n   * @returns Unsubscribe function\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * const unsub = controller.on('card:created', (event) => {\r\n   *   console.log('Card created:', event.data)\r\n   * })\r\n   *\r\n   * // Later, unsubscribe\r\n   * unsub()\r\n   * ```\r\n   */\r\n  on(eventType: string, handler: EventHandler): () => void {\r\n    if (!this.eventListeners.has(eventType)) {\r\n      this.eventListeners.set(eventType, new Set())\r\n    }\r\n    this.eventListeners.get(eventType)!.add(handler)\r\n\r\n    // Also subscribe to store\r\n    const unsubStore = this.store.subscribe(eventType, handler)\r\n\r\n    // Return combined unsubscribe function\r\n    return () => {\r\n      const listeners = this.eventListeners.get(eventType)\r\n      if (listeners) {\r\n        listeners.delete(handler)\r\n        if (listeners.size === 0) {\r\n          this.eventListeners.delete(eventType)\r\n        }\r\n      }\r\n      unsubStore()\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Subscribe to all events\r\n   */\r\n  onAll(handler: EventHandler): () => void {\r\n    return this.store.subscribeAll(handler)\r\n  }\r\n\r\n  /**\r\n   * Unsubscribe from an event\r\n   */\r\n  off(eventType: string, handler: EventHandler): void {\r\n    const listeners = this.eventListeners.get(eventType)\r\n    if (listeners) {\r\n      listeners.delete(handler)\r\n      if (listeners.size === 0) {\r\n        this.eventListeners.delete(eventType)\r\n      }\r\n    }\r\n  }\r\n\r\n  // ============================================================================\r\n  // Rendering\r\n  // ============================================================================\r\n\r\n  /**\r\n   * Manually trigger a render\r\n   */\r\n  render(): void {\r\n    const state = this.getState()\r\n\r\n    if (this.renderers?.renderBoard) {\r\n      this.renderers.renderBoard(this.container, state)\r\n    } else {\r\n      this.defaultRender(state)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Default render implementation\r\n   */\r\n  private defaultRender(state: BoardState): void {\r\n    // Clear container\r\n    this.container.innerHTML = ''\r\n\r\n    // Render board\r\n    const boardEl = document.createElement('div')\r\n    boardEl.className = 'board'\r\n    boardEl.setAttribute('data-board-id', state.board?.id || '')\r\n\r\n    // Render board title\r\n    if (state.board) {\r\n      const titleEl = document.createElement('h1')\r\n      titleEl.className = 'board-title'\r\n      titleEl.textContent = state.board.title\r\n      boardEl.appendChild(titleEl)\r\n    }\r\n\r\n    // Render columns container\r\n    const columnsEl = document.createElement('div')\r\n    columnsEl.className = 'columns'\r\n\r\n    // Render each column\r\n    const columns = this.getColumns()\r\n    columns.forEach(column => {\r\n      const columnEl = this.renderColumnElement(column)\r\n      columnsEl.appendChild(columnEl)\r\n    })\r\n\r\n    boardEl.appendChild(columnsEl)\r\n    this.container.appendChild(boardEl)\r\n  }\r\n\r\n  /**\r\n   * Render a column element\r\n   */\r\n  private renderColumnElement(column: Column): HTMLElement {\r\n    const columnEl = document.createElement('div')\r\n    columnEl.className = 'column'\r\n    columnEl.setAttribute('data-column-id', column.id)\r\n\r\n    // Column header\r\n    const headerEl = document.createElement('div')\r\n    headerEl.className = 'column-header'\r\n\r\n    const titleEl = document.createElement('h2')\r\n    titleEl.textContent = column.title\r\n    headerEl.appendChild(titleEl)\r\n\r\n    const countEl = document.createElement('span')\r\n    countEl.className = 'card-count'\r\n    countEl.textContent = `${column.cardIds.length}`\r\n    headerEl.appendChild(countEl)\r\n\r\n    columnEl.appendChild(headerEl)\r\n\r\n    // Cards container\r\n    const cardsEl = document.createElement('div')\r\n    cardsEl.className = 'cards'\r\n\r\n    // Render cards\r\n    const cards = this.getCardsByColumn(column.id)\r\n    cards.forEach(card => {\r\n      const cardEl = this.renderCardElement(card)\r\n      cardsEl.appendChild(cardEl)\r\n    })\r\n\r\n    columnEl.appendChild(cardsEl)\r\n\r\n    return columnEl\r\n  }\r\n\r\n  /**\r\n   * Render a card element\r\n   */\r\n  private renderCardElement(card: Card): HTMLElement {\r\n    if (this.renderers?.renderCard) {\r\n      const cardEl = document.createElement('div')\r\n      this.renderers.renderCard(cardEl, card)\r\n      return cardEl\r\n    }\r\n\r\n    const cardEl = document.createElement('div')\r\n    cardEl.className = 'card'\r\n    cardEl.setAttribute('data-card-id', card.id)\r\n\r\n    const titleEl = document.createElement('h3')\r\n    titleEl.textContent = card.title\r\n    cardEl.appendChild(titleEl)\r\n\r\n    if (card.description) {\r\n      const descEl = document.createElement('p')\r\n      descEl.textContent = card.description\r\n      cardEl.appendChild(descEl)\r\n    }\r\n\r\n    if (card.priority) {\r\n      const priorityEl = document.createElement('span')\r\n      priorityEl.className = `priority priority-${card.priority.toLowerCase()}`\r\n      priorityEl.textContent = card.priority\r\n      cardEl.appendChild(priorityEl)\r\n    }\r\n\r\n    return cardEl\r\n  }\r\n\r\n  /**\r\n   * Handle state changes\r\n   */\r\n  private handleStateChange(_event: StoreEvent): void {\r\n    if (this.autoRender) {\r\n      this.render()\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Destroy the controller and cleanup\r\n   */\r\n  destroy(): void {\r\n    this.eventListeners.clear()\r\n    this.container.innerHTML = ''\r\n  }\r\n}\r\n","/**\r\n * Dependency Engine for Gantt Chart\r\n * Handles task dependencies, critical path analysis, topological sorting, and cycle detection\r\n * @module gantt/DependencyEngine\r\n */\r\n\r\nimport type { CardData } from '../types/base.types'\r\nimport type {\r\n  CriticalPath,\r\n  ScheduledTask,\r\n  DependencyValidation,\r\n  AutoScheduleOptions,\r\n} from '../types/gantt.types'\r\n\r\n/**\r\n * Enhanced Dependency Engine\r\n *\r\n * Features:\r\n * - Topological sort for task ordering\r\n * - Cycle detection to prevent circular dependencies\r\n * - Critical path method (CPM) calculation\r\n * - Forward and backward pass scheduling\r\n * - Slack/float calculation\r\n * - Auto-scheduling with constraints\r\n */\r\nexport class DependencyEngine {\r\n  private cards: Map<string, CardData> = new Map()\r\n  private adjacencyList: Map<string, Set<string>> = new Map()\r\n  private reverseAdjacencyList: Map<string, Set<string>> = new Map()\r\n\r\n  /**\r\n   * Initialize engine with card data\r\n   */\r\n  constructor(cards?: CardData[]) {\r\n    if (cards) {\r\n      this.setCards(cards)\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Update cards in the engine\r\n   */\r\n  setCards(cards: CardData[]): void {\r\n    this.cards.clear()\r\n    this.adjacencyList.clear()\r\n    this.reverseAdjacencyList.clear()\r\n\r\n    cards.forEach(card => {\r\n      this.cards.set(card.id, card)\r\n      this.adjacencyList.set(card.id, new Set())\r\n      this.reverseAdjacencyList.set(card.id, new Set())\r\n    })\r\n\r\n    // Build adjacency lists\r\n    cards.forEach(card => {\r\n      if (card.dependencies) {\r\n        card.dependencies.forEach(dep => {\r\n          // Forward: dep.taskId -> card.id\r\n          this.adjacencyList.get(dep.taskId)?.add(card.id)\r\n          // Reverse: card.id -> dep.taskId\r\n          this.reverseAdjacencyList.get(card.id)?.add(dep.taskId)\r\n        })\r\n      }\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Validate dependencies\r\n   * Checks for:\r\n   * - Circular dependencies (cycles)\r\n   * - Invalid task IDs\r\n   * - Self-dependencies\r\n   */\r\n  validateDependencies(): DependencyValidation {\r\n    const errors: string[] = []\r\n    const circularDependencies: string[][] = []\r\n    const invalidTaskIds: string[] = []\r\n\r\n    // Check for invalid task IDs\r\n    this.cards.forEach((card, cardId) => {\r\n      if (card.dependencies) {\r\n        card.dependencies.forEach(dep => {\r\n          if (!this.cards.has(dep.taskId)) {\r\n            invalidTaskIds.push(dep.taskId)\r\n            errors.push(`Card ${cardId} depends on non-existent task ${dep.taskId}`)\r\n          }\r\n          if (dep.taskId === cardId) {\r\n            errors.push(`Card ${cardId} has self-dependency`)\r\n          }\r\n        })\r\n      }\r\n    })\r\n\r\n    // Detect cycles using DFS\r\n    const visited = new Set<string>()\r\n    const recursionStack = new Set<string>()\r\n    const path: string[] = []\r\n\r\n    const detectCycle = (nodeId: string): boolean => {\r\n      visited.add(nodeId)\r\n      recursionStack.add(nodeId)\r\n      path.push(nodeId)\r\n\r\n      const neighbors = this.adjacencyList.get(nodeId) || new Set()\r\n      for (const neighbor of neighbors) {\r\n        if (!visited.has(neighbor)) {\r\n          if (detectCycle(neighbor)) return true\r\n        } else if (recursionStack.has(neighbor)) {\r\n          // Found a cycle\r\n          const cycleStart = path.indexOf(neighbor)\r\n          const cycle = path.slice(cycleStart)\r\n          circularDependencies.push([...cycle, neighbor])\r\n          errors.push(`Circular dependency detected: ${cycle.join(' -> ')} -> ${neighbor}`)\r\n          return true\r\n        }\r\n      }\r\n\r\n      recursionStack.delete(nodeId)\r\n      path.pop()\r\n      return false\r\n    }\r\n\r\n    for (const cardId of this.cards.keys()) {\r\n      if (!visited.has(cardId)) {\r\n        detectCycle(cardId)\r\n      }\r\n    }\r\n\r\n    return {\r\n      isValid: errors.length === 0,\r\n      circularDependencies,\r\n      invalidTaskIds: Array.from(new Set(invalidTaskIds)),\r\n      errors,\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Topological sort using Kahn's algorithm\r\n   * Returns tasks in dependency order (tasks with no dependencies first)\r\n   */\r\n  topologicalSort(): string[] {\r\n    const inDegree = new Map<string, number>()\r\n    const queue: string[] = []\r\n    const result: string[] = []\r\n\r\n    // Initialize in-degrees\r\n    this.cards.forEach((_, cardId) => {\r\n      const deps = this.reverseAdjacencyList.get(cardId) || new Set()\r\n      inDegree.set(cardId, deps.size)\r\n      if (deps.size === 0) {\r\n        queue.push(cardId)\r\n      }\r\n    })\r\n\r\n    // Process queue\r\n    while (queue.length > 0) {\r\n      const current = queue.shift()!\r\n      result.push(current)\r\n\r\n      const dependents = this.adjacencyList.get(current) || new Set()\r\n      dependents.forEach(dependent => {\r\n        const degree = inDegree.get(dependent)!\r\n        inDegree.set(dependent, degree - 1)\r\n        if (degree - 1 === 0) {\r\n          queue.push(dependent)\r\n        }\r\n      })\r\n    }\r\n\r\n    return result\r\n  }\r\n\r\n  /**\r\n   * Calculate scheduled tasks using Critical Path Method (CPM)\r\n   * Performs forward and backward pass to calculate early/late dates and floats\r\n   */\r\n  calculateSchedule(options?: AutoScheduleOptions): Map<string, ScheduledTask> {\r\n    const validation = this.validateDependencies()\r\n    if (!validation.isValid) {\r\n      throw new Error(`Invalid dependencies: ${validation.errors.join(', ')}`)\r\n    }\r\n\r\n    const scheduled = new Map<string, ScheduledTask>()\r\n    const sorted = this.topologicalSort()\r\n\r\n    const projectStartDate = options?.projectStartDate || new Date()\r\n    const workingHoursPerDay = options?.workingHoursPerDay || 8\r\n\r\n    // Forward pass: calculate early start and early finish\r\n    sorted.forEach(cardId => {\r\n      const card = this.cards.get(cardId)!\r\n      const predecessors = Array.from(this.reverseAdjacencyList.get(cardId) || new Set<string>())\r\n\r\n      let earlyStart = new Date(projectStartDate)\r\n\r\n      // Find latest early finish of all predecessors\r\n      if (predecessors.length > 0) {\r\n        const latestPredecessorFinish = Math.max(\r\n          ...predecessors.map(predId => {\r\n            const pred = scheduled.get(predId)\r\n            if (!pred) return projectStartDate.getTime()\r\n\r\n            const dep = card.dependencies?.find(d => d.taskId === predId)\r\n            const lag = (dep?.lag || 0) * 24 * 60 * 60 * 1000 // Convert days to ms\r\n\r\n            return pred.earlyFinish.getTime() + lag\r\n          })\r\n        )\r\n        earlyStart = new Date(latestPredecessorFinish)\r\n      }\r\n\r\n      // Calculate duration\r\n      const duration = this.getTaskDuration(card, workingHoursPerDay)\r\n      const earlyFinish = new Date(earlyStart.getTime() + duration * 24 * 60 * 60 * 1000)\r\n\r\n      scheduled.set(cardId, {\r\n        cardId,\r\n        earlyStart,\r\n        earlyFinish,\r\n        lateStart: earlyStart, // Will be updated in backward pass\r\n        lateFinish: earlyFinish, // Will be updated in backward pass\r\n        totalFloat: 0,\r\n        freeFloat: 0,\r\n        isCritical: false,\r\n        predecessors,\r\n        successors: Array.from(this.adjacencyList.get(cardId) || new Set<string>()),\r\n      })\r\n    })\r\n\r\n    // Find project end date (latest early finish)\r\n    const projectEndDate = new Date(\r\n      Math.max(...Array.from(scheduled.values()).map(s => s.earlyFinish.getTime()))\r\n    )\r\n\r\n    // Backward pass: calculate late start and late finish\r\n    const reversedSorted = [...sorted].reverse()\r\n    reversedSorted.forEach(cardId => {\r\n      const task = scheduled.get(cardId)!\r\n      const successors = this.adjacencyList.get(cardId) || new Set()\r\n\r\n      let lateFinish = new Date(projectEndDate)\r\n\r\n      // Find earliest late start of all successors\r\n      if (successors.size > 0) {\r\n        const earliestSuccessorStart = Math.min(\r\n          ...Array.from(successors).map(succId => {\r\n            const succ = scheduled.get(succId)\r\n            if (!succ) return projectEndDate.getTime()\r\n\r\n            const succCard = this.cards.get(succId)!\r\n            const dep = succCard.dependencies?.find(d => d.taskId === cardId)\r\n            const lag = (dep?.lag || 0) * 24 * 60 * 60 * 1000\r\n\r\n            return succ.lateStart.getTime() - lag\r\n          })\r\n        )\r\n        lateFinish = new Date(earliestSuccessorStart)\r\n      }\r\n\r\n      const duration = task.earlyFinish.getTime() - task.earlyStart.getTime()\r\n      const lateStart = new Date(lateFinish.getTime() - duration)\r\n\r\n      // Calculate floats\r\n      const totalFloat = (lateStart.getTime() - task.earlyStart.getTime()) / (24 * 60 * 60 * 1000)\r\n\r\n      // Free float: time between this task's early finish and earliest successor's early start\r\n      let freeFloat = 0\r\n      if (successors.size > 0) {\r\n        const earliestSuccStart = Math.min(\r\n          ...Array.from(successors).map(succId => scheduled.get(succId)!.earlyStart.getTime())\r\n        )\r\n        freeFloat = (earliestSuccStart - task.earlyFinish.getTime()) / (24 * 60 * 60 * 1000)\r\n      }\r\n\r\n      scheduled.set(cardId, {\r\n        ...task,\r\n        lateStart,\r\n        lateFinish,\r\n        totalFloat: Math.max(0, Math.round(totalFloat * 10) / 10),\r\n        freeFloat: Math.max(0, Math.round(freeFloat * 10) / 10),\r\n        isCritical: totalFloat <= 0.1, // Critical if float is near zero\r\n      })\r\n    })\r\n\r\n    return scheduled\r\n  }\r\n\r\n  /**\r\n   * Find critical path through the project\r\n   */\r\n  findCriticalPath(): CriticalPath {\r\n    const scheduled = this.calculateSchedule()\r\n    const criticalTasks = Array.from(scheduled.values())\r\n      .filter(task => task.isCritical)\r\n      .sort((a, b) => a.earlyStart.getTime() - b.earlyStart.getTime())\r\n\r\n    const cardIds = criticalTasks.map(task => task.cardId)\r\n    const duration = criticalTasks.reduce((sum, task) => {\r\n      const durationMs = task.earlyFinish.getTime() - task.earlyStart.getTime()\r\n      return sum + durationMs / (24 * 60 * 60 * 1000)\r\n    }, 0)\r\n\r\n    const hasDelays = criticalTasks.some(task => {\r\n      const card = this.cards.get(task.cardId)\r\n      return card?.endDate && new Date(card.endDate) < task.earlyFinish\r\n    })\r\n\r\n    return {\r\n      cardIds,\r\n      duration: Math.round(duration * 10) / 10,\r\n      hasDelays,\r\n      totalSlack: 0, // Critical path has zero slack\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get task duration in days\r\n   */\r\n  private getTaskDuration(card: CardData, workingHoursPerDay: number): number {\r\n    // If card has start and end dates, use those\r\n    if (card.startDate && card.endDate) {\r\n      const start = new Date(card.startDate)\r\n      const end = new Date(card.endDate)\r\n      const diffMs = end.getTime() - start.getTime()\r\n      return Math.ceil(diffMs / (24 * 60 * 60 * 1000))\r\n    }\r\n\r\n    // If card has estimated time, convert to days\r\n    if (card.estimatedTime) {\r\n      return Math.ceil(card.estimatedTime / workingHoursPerDay)\r\n    }\r\n\r\n    // Default to 1 day\r\n    return 1\r\n  }\r\n\r\n  /**\r\n   * Check if a task can start given its dependencies\r\n   */\r\n  canTaskStart(cardId: string, currentDate: Date = new Date()): boolean {\r\n    const card = this.cards.get(cardId)\r\n    if (!card || !card.dependencies || card.dependencies.length === 0) {\r\n      return true\r\n    }\r\n\r\n    // Check all dependencies\r\n    return card.dependencies.every(dep => {\r\n      const depCard = this.cards.get(dep.taskId)\r\n      if (!depCard) return false\r\n\r\n      // Check based on dependency type\r\n      switch (dep.type) {\r\n        case 'finish-to-start':\r\n          // Predecessor must be finished\r\n          return depCard.progress === 100 || (depCard.endDate && new Date(depCard.endDate) <= currentDate)\r\n\r\n        case 'start-to-start':\r\n          // Predecessor must be started\r\n          return depCard.progress !== undefined && depCard.progress > 0\r\n\r\n        case 'finish-to-finish':\r\n        case 'start-to-finish':\r\n          // These don't block start\r\n          return true\r\n\r\n        default:\r\n          return false\r\n      }\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Get all predecessors of a task (tasks it depends on)\r\n   */\r\n  getPredecessors(cardId: string): string[] {\r\n    return Array.from(this.reverseAdjacencyList.get(cardId) || new Set<string>())\r\n  }\r\n\r\n  /**\r\n   * Get all successors of a task (tasks that depend on it)\r\n   */\r\n  getSuccessors(cardId: string): string[] {\r\n    return Array.from(this.adjacencyList.get(cardId) || new Set<string>())\r\n  }\r\n\r\n  /**\r\n   * Add a dependency between two tasks\r\n   * @param fromCardId - Task that others depend on\r\n   * @param toCardId - Task that depends on fromCard\r\n   */\r\n  addDependency(fromCardId: string, toCardId: string): boolean {\r\n    if (!this.cards.has(fromCardId) || !this.cards.has(toCardId)) {\r\n      return false\r\n    }\r\n\r\n    // Check if this would create a cycle\r\n    const tempAdjList = new Map(this.adjacencyList)\r\n    const tempSet = new Set(tempAdjList.get(fromCardId) || [])\r\n    tempSet.add(toCardId)\r\n    tempAdjList.set(fromCardId, tempSet)\r\n\r\n    // Simple cycle check: can we reach fromCardId from toCardId?\r\n    if (this.hasPath(toCardId, fromCardId, tempAdjList)) {\r\n      return false // Would create a cycle\r\n    }\r\n\r\n    // Add the dependency\r\n    this.adjacencyList.get(fromCardId)?.add(toCardId)\r\n    this.reverseAdjacencyList.get(toCardId)?.add(fromCardId)\r\n\r\n    return true\r\n  }\r\n\r\n  /**\r\n   * Remove a dependency between two tasks\r\n   */\r\n  removeDependency(fromCardId: string, toCardId: string): boolean {\r\n    const removed1 = this.adjacencyList.get(fromCardId)?.delete(toCardId) || false\r\n    const removed2 = this.reverseAdjacencyList.get(toCardId)?.delete(fromCardId) || false\r\n    return removed1 && removed2\r\n  }\r\n\r\n  /**\r\n   * Check if there's a path from source to target\r\n   */\r\n  private hasPath(source: string, target: string, adjacencyList: Map<string, Set<string>>): boolean {\r\n    if (source === target) return true\r\n\r\n    const visited = new Set<string>()\r\n    const queue = [source]\r\n\r\n    while (queue.length > 0) {\r\n      const current = queue.shift()!\r\n      if (current === target) return true\r\n\r\n      visited.add(current)\r\n      const neighbors = adjacencyList.get(current) || new Set<string>()\r\n\r\n      for (const neighbor of neighbors) {\r\n        if (!visited.has(neighbor)) {\r\n          queue.push(neighbor)\r\n        }\r\n      }\r\n    }\r\n\r\n    return false\r\n  }\r\n}\r\n"]}