@affectively/aeon 1.3.0 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +5 -11
  2. package/README.md +90 -10
  3. package/dist/compression/index.cjs +20 -3
  4. package/dist/compression/index.cjs.map +1 -1
  5. package/dist/compression/index.js +20 -3
  6. package/dist/compression/index.js.map +1 -1
  7. package/dist/crypto/index.cjs +30 -0
  8. package/dist/crypto/index.cjs.map +1 -1
  9. package/dist/crypto/index.js +29 -1
  10. package/dist/crypto/index.js.map +1 -1
  11. package/dist/distributed/index.cjs +15 -8
  12. package/dist/distributed/index.cjs.map +1 -1
  13. package/dist/distributed/index.js +15 -8
  14. package/dist/distributed/index.js.map +1 -1
  15. package/dist/index.cjs +2923 -46
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.js +2879 -47
  18. package/dist/index.js.map +1 -1
  19. package/dist/optimization/index.cjs +6 -3
  20. package/dist/optimization/index.cjs.map +1 -1
  21. package/dist/optimization/index.js +6 -3
  22. package/dist/optimization/index.js.map +1 -1
  23. package/dist/persistence/index.cjs +91 -29
  24. package/dist/persistence/index.cjs.map +1 -1
  25. package/dist/persistence/index.js +91 -29
  26. package/dist/persistence/index.js.map +1 -1
  27. package/dist/presence/index.cjs.map +1 -1
  28. package/dist/presence/index.js.map +1 -1
  29. package/dist/versioning/index.cjs +4 -3
  30. package/dist/versioning/index.cjs.map +1 -1
  31. package/dist/versioning/index.js +4 -3
  32. package/dist/versioning/index.js.map +1 -1
  33. package/package.json +7 -8
  34. package/dist/compression/index.d.cts +0 -189
  35. package/dist/compression/index.d.ts +0 -189
  36. package/dist/core/index.d.cts +0 -216
  37. package/dist/core/index.d.ts +0 -216
  38. package/dist/crypto/index.d.cts +0 -446
  39. package/dist/crypto/index.d.ts +0 -446
  40. package/dist/distributed/index.d.cts +0 -1016
  41. package/dist/distributed/index.d.ts +0 -1016
  42. package/dist/index.d.cts +0 -12
  43. package/dist/index.d.ts +0 -12
  44. package/dist/offline/index.d.cts +0 -154
  45. package/dist/offline/index.d.ts +0 -154
  46. package/dist/optimization/index.d.cts +0 -347
  47. package/dist/optimization/index.d.ts +0 -347
  48. package/dist/persistence/index.d.cts +0 -63
  49. package/dist/persistence/index.d.ts +0 -63
  50. package/dist/presence/index.d.cts +0 -283
  51. package/dist/presence/index.d.ts +0 -283
  52. package/dist/types-B7gCpNX9.d.cts +0 -33
  53. package/dist/types-B7gCpNX9.d.ts +0 -33
  54. package/dist/utils/index.d.cts +0 -38
  55. package/dist/utils/index.d.ts +0 -38
  56. package/dist/versioning/index.d.cts +0 -537
  57. package/dist/versioning/index.d.ts +0 -537
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/logger.ts","../src/persistence/DashStorageAdapter.ts","../src/persistence/InMemoryStorageAdapter.ts","../src/versioning/SchemaVersionManager.ts","../src/versioning/MigrationEngine.ts","../src/versioning/DataTransformer.ts","../src/versioning/MigrationTracker.ts","../src/distributed/SyncCoordinator.ts","../src/distributed/ReplicationManager.ts","../src/distributed/SyncProtocol.ts","../src/distributed/StateReconciler.ts","../src/offline/OfflineOperationQueue.ts","../src/compression/CompressionEngine.ts","../src/compression/DeltaSyncOptimizer.ts","../src/optimization/PrefetchingEngine.ts","../src/optimization/BatchTimingOptimizer.ts","../src/optimization/AdaptiveCompressionOptimizer.ts","../src/presence/AgentPresenceManager.ts","../src/crypto/types.ts","../src/crypto/CryptoProvider.ts"],"names":["logger","result","EventEmitter","deltaSize"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Aeon Logger Interface\n *\n * Provides a pluggable logging interface that can be configured\n * by consumers to integrate with their preferred logging solution.\n */\n\n/**\n * Logger interface that consumers can implement\n */\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.debug('[AEON:DEBUG]', ...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info('[AEON:INFO]', ...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn('[AEON:WARN]', ...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error('[AEON:ERROR]', ...args);\n },\n};\n\n/**\n * No-op logger for production or when logging is disabled\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Current logger instance\n */\nlet currentLogger: Logger = consoleLogger;\n\n/**\n * Get the current logger instance\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set a custom logger implementation\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Reset to the default console logger\n */\nexport function resetLogger(): void {\n currentLogger = consoleLogger;\n}\n\n/**\n * Disable all logging\n */\nexport function disableLogging(): void {\n currentLogger = noopLogger;\n}\n\n/**\n * Create a namespaced logger\n */\nexport function createNamespacedLogger(namespace: string): Logger {\n const logger = getLogger();\n return {\n debug: (...args: unknown[]) => logger.debug(`[${namespace}]`, ...args),\n info: (...args: unknown[]) => logger.info(`[${namespace}]`, ...args),\n warn: (...args: unknown[]) => logger.warn(`[${namespace}]`, ...args),\n error: (...args: unknown[]) => logger.error(`[${namespace}]`, ...args),\n };\n}\n\n// Export default logger for convenience\nexport const logger: Logger = {\n debug: (...args: unknown[]) => getLogger().debug(...args),\n info: (...args: unknown[]) => getLogger().info(...args),\n warn: (...args: unknown[]) => getLogger().warn(...args),\n error: (...args: unknown[]) => getLogger().error(...args),\n};\n","import type { StorageAdapter } from './types';\n\nexport interface DashStorageBackend {\n get(key: string): Promise<string | null> | string | null;\n set(key: string, value: string): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n}\n\nexport interface DashStorageChange {\n key: string;\n operation: 'set' | 'delete';\n value?: string;\n timestamp: number;\n}\n\nexport interface DashSyncClient {\n syncChanges(changes: DashStorageChange[]): Promise<void>;\n}\n\nexport interface DashStorageAdapterOptions {\n syncClient?: DashSyncClient;\n syncDebounceMs?: number;\n maxPendingChanges?: number;\n onSyncError?: (error: Error, changes: DashStorageChange[]) => void;\n}\n\n/**\n * Storage adapter boundary for dash-backed persistence.\n *\n * Writes are local-first through the provided backend and optionally synced\n * to D1/R2 via a sync client using debounced change batches.\n */\nexport class DashStorageAdapter implements StorageAdapter {\n private readonly backend: DashStorageBackend;\n private readonly syncClient: DashSyncClient | null;\n private readonly syncDebounceMs: number;\n private readonly maxPendingChanges: number;\n private readonly onSyncError:\n | ((error: Error, changes: DashStorageChange[]) => void)\n | null;\n private readonly pendingChanges = new Map<string, DashStorageChange>();\n private syncTimer: ReturnType<typeof setTimeout> | null = null;\n private syncInFlight = false;\n private syncPending = false;\n\n constructor(\n backend: DashStorageBackend,\n options: DashStorageAdapterOptions = {}\n ) {\n this.backend = backend;\n this.syncClient = options.syncClient ?? null;\n this.syncDebounceMs = options.syncDebounceMs ?? 50;\n this.maxPendingChanges = options.maxPendingChanges ?? 5000;\n this.onSyncError = options.onSyncError ?? null;\n }\n\n async getItem(key: string): Promise<string | null> {\n return await this.backend.get(key);\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.backend.set(key, value);\n this.trackChange({\n key,\n operation: 'set',\n value,\n timestamp: Date.now(),\n });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.backend.delete(key);\n this.trackChange({\n key,\n operation: 'delete',\n timestamp: Date.now(),\n });\n }\n\n getPendingSyncCount(): number {\n return this.pendingChanges.size;\n }\n\n async flushSync(): Promise<void> {\n if (!this.syncClient || this.pendingChanges.size === 0) {\n return;\n }\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n this.syncTimer = null;\n }\n await this.performSync();\n }\n\n private trackChange(change: DashStorageChange): void {\n this.pendingChanges.set(change.key, change);\n this.enforcePendingLimit();\n this.scheduleSync();\n }\n\n private enforcePendingLimit(): void {\n if (this.pendingChanges.size <= this.maxPendingChanges) {\n return;\n }\n\n const sorted = Array.from(this.pendingChanges.values()).sort(\n (a, b) => a.timestamp - b.timestamp\n );\n const overflow = this.pendingChanges.size - this.maxPendingChanges;\n for (let i = 0; i < overflow; i++) {\n const toDrop = sorted[i];\n if (toDrop) {\n this.pendingChanges.delete(toDrop.key);\n }\n }\n }\n\n private scheduleSync(): void {\n if (!this.syncClient) {\n return;\n }\n\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n }\n\n this.syncTimer = setTimeout(() => {\n void this.performSync();\n }, this.syncDebounceMs);\n }\n\n private async performSync(): Promise<void> {\n if (!this.syncClient) {\n return;\n }\n\n if (this.syncInFlight) {\n this.syncPending = true;\n return;\n }\n\n const changes = Array.from(this.pendingChanges.values()).sort(\n (a, b) => a.timestamp - b.timestamp\n );\n if (changes.length === 0) {\n return;\n }\n\n this.pendingChanges.clear();\n this.syncInFlight = true;\n try {\n await this.syncClient.syncChanges(changes);\n } catch (error) {\n for (const change of changes) {\n const current = this.pendingChanges.get(change.key);\n if (!current || change.timestamp > current.timestamp) {\n this.pendingChanges.set(change.key, change);\n }\n }\n\n if (this.onSyncError) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n this.onSyncError(normalizedError, changes);\n }\n } finally {\n this.syncInFlight = false;\n const rerun = this.syncPending || this.pendingChanges.size > 0;\n this.syncPending = false;\n if (rerun) {\n this.scheduleSync();\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\n/**\n * In-memory adapter for tests and ephemeral runtimes.\n */\nexport class InMemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n","/**\n * Schema Version Manager\n *\n * Manages schema versioning across the application.\n * Tracks version history, compatibility, and migration paths.\n *\n * Features:\n * - Version tracking and comparison\n * - Compatibility matrix management\n * - Migration path calculation\n * - Version validation\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface SchemaVersion {\n major: number;\n minor: number;\n patch: number;\n timestamp: string;\n description: string;\n breaking: boolean;\n}\n\nexport interface VersionMetadata {\n version: SchemaVersion;\n previousVersion?: SchemaVersion;\n changes: string[];\n migrationsRequired: string[];\n rollbackPossible: boolean;\n}\n\nexport interface CompatibilityRule {\n from: string;\n to: string;\n compatible: boolean;\n requiresMigration: boolean;\n migrationSteps: number;\n}\n\n/**\n * Schema Version Manager\n * Tracks and manages schema versions across the application\n */\nexport class SchemaVersionManager {\n private versions: Map<string, SchemaVersion> = new Map();\n private versionHistory: SchemaVersion[] = [];\n private compatibilityMatrix: Map<string, CompatibilityRule[]> = new Map();\n private currentVersion: SchemaVersion | null = null;\n\n constructor() {\n this.initializeDefaultVersions();\n }\n\n /**\n * Initialize default versions\n */\n private initializeDefaultVersions(): void {\n const v1_0_0: SchemaVersion = {\n major: 1,\n minor: 0,\n patch: 0,\n timestamp: new Date().toISOString(),\n description: 'Initial schema version',\n breaking: false,\n };\n\n this.registerVersion(v1_0_0);\n this.currentVersion = v1_0_0;\n }\n\n /**\n * Register a new schema version\n */\n registerVersion(version: SchemaVersion): void {\n const versionString = this.versionToString(version);\n\n this.versions.set(versionString, version);\n this.versionHistory.push(version);\n\n logger.debug('[SchemaVersionManager] Version registered', {\n version: versionString,\n breaking: version.breaking,\n description: version.description,\n });\n }\n\n /**\n * Get current version\n */\n getCurrentVersion(): SchemaVersion {\n if (!this.currentVersion) {\n throw new Error('No current version set');\n }\n return this.currentVersion;\n }\n\n /**\n * Set current version\n */\n setCurrentVersion(version: SchemaVersion): void {\n if (!this.versions.has(this.versionToString(version))) {\n throw new Error(\n `Version ${this.versionToString(version)} not registered`\n );\n }\n\n this.currentVersion = version;\n logger.debug('[SchemaVersionManager] Current version set', {\n version: this.versionToString(version),\n });\n }\n\n /**\n * Get version history\n */\n getVersionHistory(): SchemaVersion[] {\n return [...this.versionHistory];\n }\n\n /**\n * Check if version exists\n */\n hasVersion(version: SchemaVersion): boolean {\n return this.versions.has(this.versionToString(version));\n }\n\n /**\n * Get version by string (e.g., \"1.2.3\")\n */\n getVersion(versionString: string): SchemaVersion | undefined {\n return this.versions.get(versionString);\n }\n\n /**\n * Register compatibility rule\n */\n registerCompatibility(rule: CompatibilityRule): void {\n if (!this.compatibilityMatrix.has(rule.from)) {\n this.compatibilityMatrix.set(rule.from, []);\n }\n\n const rules = this.compatibilityMatrix.get(rule.from);\n if (rules) {\n rules.push(rule);\n }\n\n logger.debug('[SchemaVersionManager] Compatibility rule registered', {\n from: rule.from,\n to: rule.to,\n compatible: rule.compatible,\n requiresMigration: rule.requiresMigration,\n });\n }\n\n /**\n * Check if migration path exists\n */\n canMigrate(\n fromVersion: SchemaVersion | string,\n toVersion: SchemaVersion | string\n ): boolean {\n const fromStr =\n typeof fromVersion === 'string'\n ? fromVersion\n : this.versionToString(fromVersion);\n const toStr =\n typeof toVersion === 'string'\n ? toVersion\n : this.versionToString(toVersion);\n\n const rules = this.compatibilityMatrix.get(fromStr) || [];\n return rules.some((r) => r.to === toStr && r.requiresMigration);\n }\n\n /**\n * Get migration path\n */\n getMigrationPath(\n fromVersion: SchemaVersion,\n toVersion: SchemaVersion\n ): SchemaVersion[] {\n const path: SchemaVersion[] = [];\n let current = fromVersion;\n\n const maxSteps = 100; // Prevent infinite loops\n let steps = 0;\n\n while (this.compareVersions(current, toVersion) !== 0 && steps < maxSteps) {\n const fromStr = this.versionToString(current);\n const rules = this.compatibilityMatrix.get(fromStr) || [];\n\n let found = false;\n for (const rule of rules) {\n const nextVersion = this.getVersion(rule.to);\n if (nextVersion) {\n // Find the closest path to target\n if (\n this.compareVersions(nextVersion, toVersion) <= 0 ||\n this.compareVersions(current, nextVersion) <\n this.compareVersions(current, toVersion)\n ) {\n current = nextVersion;\n path.push(current);\n found = true;\n break;\n }\n }\n }\n\n if (!found) {\n break;\n }\n\n steps++;\n }\n\n return path;\n }\n\n /**\n * Compare two versions\n * Returns: -1 if v1 < v2, 0 if equal, 1 if v1 > v2\n */\n compareVersions(\n v1: SchemaVersion | string,\n v2: SchemaVersion | string\n ): number {\n const ver1 = typeof v1 === 'string' ? this.parseVersion(v1) : v1;\n const ver2 = typeof v2 === 'string' ? this.parseVersion(v2) : v2;\n\n if (ver1.major !== ver2.major) {\n return ver1.major < ver2.major ? -1 : 1;\n }\n if (ver1.minor !== ver2.minor) {\n return ver1.minor < ver2.minor ? -1 : 1;\n }\n if (ver1.patch !== ver2.patch) {\n return ver1.patch < ver2.patch ? -1 : 1;\n }\n return 0;\n }\n\n /**\n * Parse version string to SchemaVersion\n */\n parseVersion(versionString: string): SchemaVersion {\n const parts = versionString.split('.').map(Number);\n return {\n major: parts[0] || 0,\n minor: parts[1] || 0,\n patch: parts[2] || 0,\n timestamp: new Date().toISOString(),\n description: '',\n breaking: false,\n };\n }\n\n /**\n * Create new version\n */\n createVersion(\n major: number,\n minor: number,\n patch: number,\n description: string,\n breaking: boolean = false\n ): SchemaVersion {\n return {\n major,\n minor,\n patch,\n timestamp: new Date().toISOString(),\n description,\n breaking,\n };\n }\n\n /**\n * Convert version to string\n */\n versionToString(version: SchemaVersion): string {\n return `${version.major}.${version.minor}.${version.patch}`;\n }\n\n /**\n * Get version metadata\n */\n getVersionMetadata(version: SchemaVersion): VersionMetadata {\n const history = this.versionHistory;\n const currentIndex = history.findIndex(\n (v) => this.versionToString(v) === this.versionToString(version)\n );\n\n return {\n version,\n previousVersion: currentIndex > 0 ? history[currentIndex - 1] : undefined,\n changes: [version.description],\n migrationsRequired: this.canMigrate(\n this.currentVersion || version,\n version\n )\n ? [this.versionToString(version)]\n : [],\n rollbackPossible: currentIndex > 0,\n };\n }\n\n /**\n * Get all registered versions\n */\n getAllVersions(): SchemaVersion[] {\n return Array.from(this.versions.values()).sort((a, b) =>\n this.compareVersions(a, b)\n );\n }\n\n /**\n * Clear all versions (for testing)\n */\n clear(): void {\n this.versions.clear();\n this.versionHistory = [];\n this.compatibilityMatrix.clear();\n this.currentVersion = null;\n }\n}\n","/**\n * Migration Engine\n *\n * Executes schema migrations with rollback support.\n * Manages migration execution, error handling, and state management.\n *\n * Features:\n * - Migration execution and tracking\n * - Rollback support\n * - Error handling and recovery\n * - Migration state management\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface Migration {\n id: string;\n version: string;\n name: string;\n up: (data: unknown) => unknown;\n down?: (data: unknown) => unknown;\n timestamp: string;\n description: string;\n}\n\nexport interface MigrationResult {\n migrationId: string;\n success: boolean;\n timestamp: string;\n duration: number;\n itemsAffected: number;\n errors: string[];\n}\n\nexport interface MigrationState {\n currentVersion: string;\n appliedMigrations: string[];\n failedMigrations: string[];\n lastMigrationTime: string;\n totalMigrationsRun: number;\n}\n\n/**\n * Migration Engine\n * Executes and manages schema migrations\n */\nexport class MigrationEngine {\n private migrations: Map<string, Migration> = new Map();\n private executedMigrations: MigrationResult[] = [];\n private state: MigrationState = {\n currentVersion: '1.0.0',\n appliedMigrations: [],\n failedMigrations: [],\n lastMigrationTime: new Date().toISOString(),\n totalMigrationsRun: 0,\n };\n\n /**\n * Register a migration\n */\n registerMigration(migration: Migration): void {\n this.migrations.set(migration.id, migration);\n\n logger.debug('[MigrationEngine] Migration registered', {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n });\n }\n\n /**\n * Execute a migration\n */\n async executeMigration(\n migrationId: string,\n data: unknown\n ): Promise<MigrationResult> {\n const migration = this.migrations.get(migrationId);\n if (!migration) {\n throw new Error(`Migration ${migrationId} not found`);\n }\n\n const startTime = Date.now();\n const result: MigrationResult = {\n migrationId,\n success: false,\n timestamp: new Date().toISOString(),\n duration: 0,\n itemsAffected: 0,\n errors: [],\n };\n\n try {\n logger.debug('[MigrationEngine] Executing migration', {\n id: migrationId,\n version: migration.version,\n });\n\n // Execute up migration\n migration.up(data);\n\n result.success = true;\n result.itemsAffected = Array.isArray(data)\n ? (data as unknown[]).length\n : 1;\n result.duration = Date.now() - startTime;\n\n // Track as applied\n this.state.appliedMigrations.push(migrationId);\n this.state.currentVersion = migration.version;\n this.state.totalMigrationsRun++;\n this.state.lastMigrationTime = result.timestamp;\n\n this.executedMigrations.push(result);\n\n logger.debug('[MigrationEngine] Migration executed successfully', {\n id: migrationId,\n duration: result.duration,\n itemsAffected: result.itemsAffected,\n });\n\n return result;\n } catch (error) {\n result.errors = [error instanceof Error ? error.message : String(error)];\n this.state.failedMigrations.push(migrationId);\n\n this.executedMigrations.push(result);\n\n logger.error('[MigrationEngine] Migration failed', {\n id: migrationId,\n error: result.errors[0],\n });\n\n throw new Error(`Migration ${migrationId} failed: ${result.errors[0]}`);\n }\n }\n\n /**\n * Rollback a migration\n */\n async rollbackMigration(\n migrationId: string,\n data: unknown\n ): Promise<MigrationResult> {\n const migration = this.migrations.get(migrationId);\n if (!migration) {\n throw new Error(`Migration ${migrationId} not found`);\n }\n\n if (!migration.down) {\n throw new Error(`Migration ${migrationId} does not support rollback`);\n }\n\n const startTime = Date.now();\n const result: MigrationResult = {\n migrationId,\n success: false,\n timestamp: new Date().toISOString(),\n duration: 0,\n itemsAffected: 0,\n errors: [],\n };\n\n try {\n logger.debug('[MigrationEngine] Rolling back migration', {\n id: migrationId,\n version: migration.version,\n });\n\n // Execute down migration\n migration.down(data);\n\n result.success = true;\n result.itemsAffected = Array.isArray(data)\n ? (data as unknown[]).length\n : 1;\n result.duration = Date.now() - startTime;\n\n // Remove from applied migrations\n this.state.appliedMigrations = this.state.appliedMigrations.filter(\n (id) => id !== migrationId\n );\n\n this.executedMigrations.push(result);\n\n logger.debug('[MigrationEngine] Migration rolled back', {\n id: migrationId,\n duration: result.duration,\n });\n\n return result;\n } catch (error) {\n result.errors = [error instanceof Error ? error.message : String(error)];\n\n this.executedMigrations.push(result);\n\n logger.error('[MigrationEngine] Rollback failed', {\n id: migrationId,\n error: result.errors[0],\n });\n\n throw new Error(\n `Rollback for ${migrationId} failed: ${result.errors[0]}`\n );\n }\n }\n\n /**\n * Get migration state\n */\n getState(): MigrationState {\n return { ...this.state };\n }\n\n /**\n * Get migration execution history\n */\n getExecutionHistory(): MigrationResult[] {\n return [...this.executedMigrations];\n }\n\n /**\n * Get migration by ID\n */\n getMigration(migrationId: string): Migration | undefined {\n return this.migrations.get(migrationId);\n }\n\n /**\n * Get all registered migrations\n */\n getAllMigrations(): Migration[] {\n return Array.from(this.migrations.values());\n }\n\n /**\n * Get applied migrations\n */\n getAppliedMigrations(): string[] {\n return [...this.state.appliedMigrations];\n }\n\n /**\n * Get failed migrations\n */\n getFailedMigrations(): string[] {\n return [...this.state.failedMigrations];\n }\n\n /**\n * Get pending migrations\n */\n getPendingMigrations(): Migration[] {\n return this.getAllMigrations().filter(\n (m) => !this.state.appliedMigrations.includes(m.id)\n );\n }\n\n /**\n * Get migration statistics\n */\n getStatistics() {\n const successful = this.executedMigrations.filter((m) => m.success).length;\n const failed = this.executedMigrations.filter((m) => !m.success).length;\n const totalDuration = this.executedMigrations.reduce(\n (sum, m) => sum + m.duration,\n 0\n );\n const totalAffected = this.executedMigrations.reduce(\n (sum, m) => sum + m.itemsAffected,\n 0\n );\n\n return {\n totalExecuted: this.executedMigrations.length,\n successful,\n failed,\n successRate:\n this.executedMigrations.length > 0\n ? (successful / this.executedMigrations.length) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageDurationMs:\n this.executedMigrations.length > 0\n ? totalDuration / this.executedMigrations.length\n : 0,\n totalAffected,\n };\n }\n\n /**\n * Clear history (for testing)\n */\n clear(): void {\n this.migrations.clear();\n this.executedMigrations = [];\n this.state = {\n currentVersion: '1.0.0',\n appliedMigrations: [],\n failedMigrations: [],\n lastMigrationTime: new Date().toISOString(),\n totalMigrationsRun: 0,\n };\n }\n}\n","/**\n * Data Transformer\n *\n * Transforms data structures during schema migrations.\n * Handles field transformation, type casting, and validation.\n *\n * Features:\n * - Field-level transformation\n * - Type conversion and casting\n * - Validation during transformation\n * - Error handling and reporting\n * - Batch transformation support\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface FieldTransformer {\n (value: unknown): unknown;\n}\n\nexport interface TransformationRule {\n field: string;\n transformer: FieldTransformer;\n required?: boolean;\n defaultValue?: unknown;\n}\n\nexport interface TransformationResult {\n success: boolean;\n itemsTransformed: number;\n itemsFailed: number;\n errors: Array<{ item: unknown; error: string }>;\n warnings: string[];\n duration: number;\n}\n\n/**\n * Data Transformer\n * Transforms data structures during schema migrations\n */\nexport class DataTransformer {\n private rules: Map<string, TransformationRule> = new Map();\n private transformationHistory: TransformationResult[] = [];\n\n /**\n * Register a transformation rule\n */\n registerRule(rule: TransformationRule): void {\n this.rules.set(rule.field, rule);\n\n logger.debug('[DataTransformer] Rule registered', {\n field: rule.field,\n required: rule.required,\n hasDefault: rule.defaultValue !== undefined,\n });\n }\n\n /**\n * Transform a single field value\n */\n transformField(field: string, value: unknown): unknown {\n const rule = this.rules.get(field);\n if (!rule) {\n // No rule = no transformation\n return value;\n }\n\n try {\n return rule.transformer(value);\n } catch (error) {\n if (rule.required) {\n throw new Error(\n `Failed to transform required field ${field}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n // Return default value or original value\n return rule.defaultValue !== undefined ? rule.defaultValue : value;\n }\n }\n\n /**\n * Transform a single object\n */\n transformObject(data: Record<string, unknown>): Record<string, unknown> {\n const transformed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n try {\n transformed[key] = this.transformField(key, value);\n } catch (error) {\n logger.warn('[DataTransformer] Field transformation failed', {\n field: key,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // If field is not required, include original value\n const rule = this.rules.get(key);\n if (!rule || !rule.required) {\n transformed[key] = value;\n }\n }\n }\n\n return transformed;\n }\n\n /**\n * Transform a collection of items\n */\n transformCollection(items: unknown[]): TransformationResult {\n const startTime = Date.now();\n const result: TransformationResult = {\n success: true,\n itemsTransformed: 0,\n itemsFailed: 0,\n errors: [],\n warnings: [],\n duration: 0,\n };\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n try {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n this.transformObject(item as Record<string, unknown>);\n result.itemsTransformed++;\n } else {\n // Cannot transform non-object items\n result.warnings.push(`Item ${i} is not a transformable object`);\n }\n } catch (error) {\n result.errors.push({\n item,\n error: error instanceof Error ? error.message : String(error),\n });\n result.itemsFailed++;\n }\n }\n\n result.duration = Date.now() - startTime;\n result.success = result.itemsFailed === 0;\n\n this.transformationHistory.push(result);\n\n logger.debug('[DataTransformer] Collection transformed', {\n total: items.length,\n transformed: result.itemsTransformed,\n failed: result.itemsFailed,\n duration: result.duration,\n });\n\n return result;\n }\n\n /**\n * Validate transformed data\n */\n validateTransformation(\n original: unknown[],\n transformed: unknown[]\n ): {\n valid: boolean;\n issues: string[];\n } {\n const issues: string[] = [];\n\n if (original.length !== transformed.length) {\n issues.push(\n `Item count mismatch: ${original.length} -> ${transformed.length}`\n );\n }\n\n // Check that all items were processed\n for (let i = 0; i < Math.min(original.length, transformed.length); i++) {\n const orig = original[i];\n const trans = transformed[i];\n\n if (!this.validateItem(orig, trans)) {\n issues.push(`Item ${i} validation failed`);\n }\n }\n\n return {\n valid: issues.length === 0,\n issues,\n };\n }\n\n /**\n * Validate a single item transformation\n */\n private validateItem(original: unknown, transformed: unknown): boolean {\n // Basic validation: ensure transformed exists if original exists\n if (original === null || original === undefined) {\n return true;\n }\n\n if (typeof original === 'object' && typeof transformed !== 'object') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get transformation history\n */\n getTransformationHistory(): TransformationResult[] {\n return [...this.transformationHistory];\n }\n\n /**\n * Get transformation statistics\n */\n getStatistics() {\n const totalTransformed = this.transformationHistory.reduce(\n (sum, r) => sum + r.itemsTransformed,\n 0\n );\n const totalFailed = this.transformationHistory.reduce(\n (sum, r) => sum + r.itemsFailed,\n 0\n );\n const totalDuration = this.transformationHistory.reduce(\n (sum, r) => sum + r.duration,\n 0\n );\n\n return {\n totalBatches: this.transformationHistory.length,\n totalTransformed,\n totalFailed,\n successRate:\n totalTransformed + totalFailed > 0\n ? (totalTransformed / (totalTransformed + totalFailed)) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageBatchDurationMs:\n this.transformationHistory.length > 0\n ? totalDuration / this.transformationHistory.length\n : 0,\n };\n }\n\n /**\n * Get registered rules\n */\n getRules(): TransformationRule[] {\n return Array.from(this.rules.values());\n }\n\n /**\n * Get rule for field\n */\n getRule(field: string): TransformationRule | undefined {\n return this.rules.get(field);\n }\n\n /**\n * Clear all rules (for testing)\n */\n clearRules(): void {\n this.rules.clear();\n }\n\n /**\n * Clear history (for testing)\n */\n clearHistory(): void {\n this.transformationHistory = [];\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.clearRules();\n this.clearHistory();\n }\n}\n","/**\n * Migration Tracker\n *\n * Tracks migration history and enables rollback.\n * Maintains detailed audit trail of all schema changes.\n *\n * Features:\n * - Migration history tracking\n * - Rollback path calculation\n * - Data snapshots for recovery\n * - Audit trail with timestamps\n * - Migration dependency tracking\n */\n\nimport { logger } from '../utils/logger';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface MigrationRecord {\n id: string;\n migrationId: string;\n timestamp: string;\n version: string;\n direction: 'up' | 'down';\n status: 'pending' | 'applied' | 'failed' | 'rolled-back';\n duration: number;\n itemsAffected: number;\n dataSnapshot?: {\n beforeHash: string;\n afterHash: string;\n itemCount: number;\n };\n errorMessage?: string;\n appliedBy: string;\n metadata?: Record<string, unknown>;\n previousHash?: string;\n integrityHash?: string;\n}\n\nexport interface RollbackPath {\n path: string[];\n canRollback: boolean;\n affectedVersions: string[];\n estimatedDuration: number;\n}\n\nexport interface MigrationIntegrityEntry {\n recordId: string;\n previousHash: string;\n hash: string;\n}\n\nexport interface MigrationTrackerPersistenceData {\n migrations: MigrationRecord[];\n snapshots: Array<{\n recordId: string;\n beforeHash: string;\n afterHash: string;\n itemCount: number;\n }>;\n integrity: {\n algorithm: 'sha256-chain-v1';\n entries: MigrationIntegrityEntry[];\n rootHash: string;\n };\n}\n\nexport interface MigrationTrackerPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<MigrationTrackerPersistenceData>;\n deserializer?: PersistenceDeserializer<MigrationTrackerPersistenceData>;\n}\n\nexport interface MigrationTrackerOptions {\n persistence?: MigrationTrackerPersistenceConfig;\n}\n\n/**\n * Migration Tracker\n * Tracks and manages migration history with rollback support\n */\nexport class MigrationTracker {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:migration-tracker:v1';\n private static readonly INTEGRITY_ROOT = 'aeon:migration-integrity-root:v1';\n private migrations: MigrationRecord[] = [];\n private snapshots: Map<\n string,\n { beforeHash: string; afterHash: string; itemCount: number }\n > = new Map();\n private persistence:\n | (MigrationTrackerPersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: MigrationTrackerOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? MigrationTracker.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[MigrationTracker] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Track a new migration\n */\n recordMigration(record: MigrationRecord): void {\n this.migrations.push({ ...record });\n this.schedulePersist();\n\n logger.debug('[MigrationTracker] Migration recorded', {\n id: record.id,\n migrationId: record.migrationId,\n version: record.version,\n status: record.status,\n });\n }\n\n /**\n * Track migration with snapshot\n */\n trackMigration(\n migrationId: string,\n version: string,\n beforeHash: string,\n afterHash: string,\n itemCount: number,\n duration: number,\n itemsAffected: number,\n appliedBy = 'system'\n ): void {\n const record: MigrationRecord = {\n id: `${migrationId}-${Date.now()}`,\n migrationId,\n timestamp: new Date().toISOString(),\n version,\n direction: 'up',\n status: 'applied',\n duration,\n itemsAffected,\n dataSnapshot: {\n beforeHash,\n afterHash,\n itemCount,\n },\n appliedBy,\n };\n\n this.recordMigration(record);\n this.snapshots.set(record.id, {\n beforeHash,\n afterHash,\n itemCount,\n });\n }\n\n /**\n * Get all migration records\n */\n getMigrations(): MigrationRecord[] {\n return this.migrations.map((m) => ({ ...m }));\n }\n\n /**\n * Get migrations for a specific version\n */\n getMigrationsForVersion(version: string): MigrationRecord[] {\n return this.migrations.filter((m) => m.version === version);\n }\n\n /**\n * Get migration by ID\n */\n getMigration(id: string): MigrationRecord | undefined {\n return this.migrations.find((m) => m.id === id);\n }\n\n /**\n * Check if can rollback\n */\n canRollback(fromVersion: string, toVersion: string): boolean {\n // Find all migrations from fromVersion going down to toVersion\n const fromIndex = this.migrations.findIndex(\n (m) => m.version === fromVersion\n );\n const toIndex = this.migrations.findIndex((m) => m.version === toVersion);\n\n if (fromIndex === -1 || toIndex === -1) {\n return false;\n }\n\n if (toIndex >= fromIndex) {\n return false;\n }\n\n // Check all migrations in between have rollback support (dataSnapshot)\n for (let i = fromIndex; i > toIndex; i--) {\n if (!this.migrations[i]?.dataSnapshot) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get rollback path\n */\n getRollbackPath(fromVersion: string, toVersion: string): RollbackPath {\n const canRollback = this.canRollback(fromVersion, toVersion);\n const path: string[] = [];\n const affectedVersions: string[] = [];\n let estimatedDuration = 0;\n\n if (canRollback) {\n const fromIndex = this.migrations.findIndex(\n (m) => m.version === fromVersion\n );\n const toIndex = this.migrations.findIndex((m) => m.version === toVersion);\n\n for (let i = fromIndex; i > toIndex; i--) {\n const migration = this.migrations[i];\n if (migration) {\n path.push(migration.migrationId);\n affectedVersions.push(migration.version);\n estimatedDuration += migration.duration;\n }\n }\n }\n\n return {\n path,\n canRollback,\n affectedVersions,\n estimatedDuration,\n };\n }\n\n /**\n * Get applied migrations\n */\n getAppliedMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'applied');\n }\n\n /**\n * Get failed migrations\n */\n getFailedMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'failed');\n }\n\n /**\n * Get pending migrations\n */\n getPendingMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'pending');\n }\n\n /**\n * Get latest migration\n */\n getLatestMigration(): MigrationRecord | undefined {\n return this.migrations[this.migrations.length - 1];\n }\n\n /**\n * Get migration timeline\n */\n getTimeline(): Array<{ timestamp: string; version: string; status: string }> {\n return this.migrations.map((m) => ({\n timestamp: m.timestamp,\n version: m.version,\n status: m.status,\n }));\n }\n\n /**\n * Get migration statistics\n */\n getStatistics() {\n const applied = this.migrations.filter(\n (m) => m.status === 'applied'\n ).length;\n const failed = this.migrations.filter((m) => m.status === 'failed').length;\n const pending = this.migrations.filter(\n (m) => m.status === 'pending'\n ).length;\n const rolledBack = this.migrations.filter(\n (m) => m.status === 'rolled-back'\n ).length;\n\n const totalDuration = this.migrations.reduce(\n (sum, m) => sum + m.duration,\n 0\n );\n const totalAffected = this.migrations.reduce(\n (sum, m) => sum + m.itemsAffected,\n 0\n );\n\n return {\n total: this.migrations.length,\n applied,\n failed,\n pending,\n rolledBack,\n successRate:\n this.migrations.length > 0\n ? (applied / this.migrations.length) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageDurationMs:\n this.migrations.length > 0 ? totalDuration / this.migrations.length : 0,\n totalItemsAffected: totalAffected,\n };\n }\n\n /**\n * Get audit trail\n */\n getAuditTrail(migrationId?: string) {\n const filtered = migrationId\n ? this.migrations.filter((m) => m.migrationId === migrationId)\n : this.migrations;\n\n return filtered.map((m) => ({\n id: m.id,\n timestamp: m.timestamp,\n migrationId: m.migrationId,\n version: m.version,\n status: m.status,\n appliedBy: m.appliedBy,\n duration: m.duration,\n itemsAffected: m.itemsAffected,\n error: m.errorMessage,\n }));\n }\n\n /**\n * Get data snapshot for recovery\n */\n getSnapshot(recordId: string) {\n return this.snapshots.get(recordId);\n }\n\n /**\n * Update migration status\n */\n updateMigrationStatus(\n recordId: string,\n status: MigrationRecord['status'],\n error?: string\n ): void {\n const migration = this.migrations.find((m) => m.id === recordId);\n if (migration) {\n migration.status = status;\n if (error) {\n migration.errorMessage = error;\n }\n\n logger.debug('[MigrationTracker] Migration status updated', {\n recordId,\n status,\n hasError: !!error,\n });\n this.schedulePersist();\n }\n }\n\n /**\n * Persist tracker state with integrity chain verification metadata.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const normalizedMigrations = this.migrations.map((migration) => ({\n ...migration,\n previousHash: undefined,\n integrityHash: undefined,\n }));\n\n const integrityEntries: MigrationIntegrityEntry[] = [];\n let previousHash = MigrationTracker.INTEGRITY_ROOT;\n\n for (const migration of normalizedMigrations) {\n const hash = await this.computeDigestHex(\n `${previousHash}|${this.stableStringify(migration)}`\n );\n integrityEntries.push({\n recordId: migration.id,\n previousHash,\n hash,\n });\n previousHash = hash;\n }\n\n const persistedMigrations = normalizedMigrations.map(\n (migration, index) => ({\n ...migration,\n previousHash: integrityEntries[index]?.previousHash,\n integrityHash: integrityEntries[index]?.hash,\n })\n );\n\n const data: MigrationTrackerPersistenceData = {\n migrations: persistedMigrations,\n snapshots: Array.from(this.snapshots.entries()).map(\n ([recordId, snapshot]) => ({\n recordId,\n beforeHash: snapshot.beforeHash,\n afterHash: snapshot.afterHash,\n itemCount: snapshot.itemCount,\n })\n ),\n integrity: {\n algorithm: 'sha256-chain-v1',\n entries: integrityEntries,\n rootHash: previousHash,\n },\n };\n\n const envelope: PersistedEnvelope<MigrationTrackerPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<MigrationTrackerPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load tracker state and verify integrity chain.\n */\n async loadFromPersistence(): Promise<{\n migrations: number;\n snapshots: number;\n }> {\n if (!this.persistence) {\n return { migrations: 0, snapshots: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { migrations: 0, snapshots: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(\n value\n ) as PersistedEnvelope<MigrationTrackerPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid migration tracker persistence payload');\n }\n if (\n !Array.isArray(envelope.data.migrations) ||\n !Array.isArray(envelope.data.snapshots) ||\n !envelope.data.integrity ||\n !Array.isArray(envelope.data.integrity.entries) ||\n typeof envelope.data.integrity.rootHash !== 'string'\n ) {\n throw new Error('Invalid migration tracker persistence structure');\n }\n\n if (envelope.data.integrity.algorithm !== 'sha256-chain-v1') {\n throw new Error('Unsupported migration integrity algorithm');\n }\n\n if (\n envelope.data.integrity.entries.length !== envelope.data.migrations.length\n ) {\n throw new Error('Migration integrity entry count mismatch');\n }\n\n const validatedMigrations: MigrationRecord[] = [];\n let previousHash = MigrationTracker.INTEGRITY_ROOT;\n\n for (let i = 0; i < envelope.data.migrations.length; i++) {\n const migration = envelope.data.migrations[i];\n const integrity = envelope.data.integrity.entries[i];\n\n if (!this.isValidMigrationRecord(migration)) {\n throw new Error('Invalid persisted migration record');\n }\n if (\n !integrity ||\n integrity.recordId !== migration.id ||\n integrity.previousHash !== previousHash\n ) {\n throw new Error('Migration integrity chain mismatch');\n }\n\n const expectedHash = await this.computeDigestHex(\n `${previousHash}|${this.stableStringify({\n ...migration,\n previousHash: undefined,\n integrityHash: undefined,\n })}`\n );\n\n if (expectedHash !== integrity.hash) {\n throw new Error('Migration integrity verification failed');\n }\n\n validatedMigrations.push({\n ...migration,\n previousHash: integrity.previousHash,\n integrityHash: integrity.hash,\n });\n\n previousHash = expectedHash;\n }\n\n if (previousHash !== envelope.data.integrity.rootHash) {\n throw new Error('Migration integrity root hash mismatch');\n }\n\n const validatedSnapshots = new Map<\n string,\n { beforeHash: string; afterHash: string; itemCount: number }\n >();\n\n for (const snapshot of envelope.data.snapshots) {\n if (\n typeof snapshot.recordId !== 'string' ||\n typeof snapshot.beforeHash !== 'string' ||\n typeof snapshot.afterHash !== 'string' ||\n typeof snapshot.itemCount !== 'number'\n ) {\n throw new Error('Invalid persisted migration snapshot');\n }\n\n validatedSnapshots.set(snapshot.recordId, {\n beforeHash: snapshot.beforeHash,\n afterHash: snapshot.afterHash,\n itemCount: snapshot.itemCount,\n });\n }\n\n this.migrations = validatedMigrations;\n this.snapshots = validatedSnapshots;\n\n logger.debug('[MigrationTracker] Loaded from persistence', {\n key: this.persistence.key,\n migrations: this.migrations.length,\n snapshots: this.snapshots.size,\n });\n\n return {\n migrations: this.migrations.length,\n snapshots: this.snapshots.size,\n };\n }\n\n /**\n * Remove persisted migration tracker state.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n /**\n * Clear history (for testing)\n */\n clear(): void {\n this.migrations = [];\n this.snapshots.clear();\n this.schedulePersist();\n }\n\n /**\n * Get total migrations tracked\n */\n getTotalMigrations(): number {\n return this.migrations.length;\n }\n\n /**\n * Find migrations by time range\n */\n getMigrationsByTimeRange(\n startTime: string,\n endTime: string\n ): MigrationRecord[] {\n const start = new Date(startTime).getTime();\n const end = new Date(endTime).getTime();\n\n return this.migrations.filter((m) => {\n const time = new Date(m.timestamp).getTime();\n return time >= start && time <= end;\n });\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[MigrationTracker] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidMigrationRecord(value: unknown): value is MigrationRecord {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const record = value as Partial<MigrationRecord>;\n const validDirection =\n record.direction === 'up' || record.direction === 'down';\n const validStatus =\n record.status === 'pending' ||\n record.status === 'applied' ||\n record.status === 'failed' ||\n record.status === 'rolled-back';\n return (\n typeof record.id === 'string' &&\n typeof record.migrationId === 'string' &&\n typeof record.timestamp === 'string' &&\n typeof record.version === 'string' &&\n validDirection &&\n validStatus &&\n typeof record.duration === 'number' &&\n typeof record.itemsAffected === 'number' &&\n typeof record.appliedBy === 'string'\n );\n }\n\n private stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => this.stableStringify(item)).join(',')}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => a.localeCompare(b)\n );\n\n return `{${entries\n .map(\n ([key, entryValue]) =>\n `${JSON.stringify(key)}:${this.stableStringify(entryValue)}`\n )\n .join(',')}}`;\n }\n\n private async computeDigestHex(value: string): Promise<string> {\n if (globalThis.crypto?.subtle) {\n const bytes = new TextEncoder().encode(value);\n const normalized = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n );\n const digest = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n normalized\n );\n return this.toHex(new Uint8Array(digest));\n }\n\n return this.fallbackDigestHex(value);\n }\n\n private toHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n\n private fallbackDigestHex(value: string): string {\n let hash = 2166136261;\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n }\n}\n","/**\n * Sync Coordinator\n *\n * Coordinates synchronization between multiple nodes in a distributed system.\n * Manages sync sessions, node registration, and synchronization workflows.\n *\n * Features:\n * - Node registration and discovery\n * - Sync session management\n * - Synchronization workflow orchestration\n * - Node health monitoring\n * - Conflict detection and resolution coordination\n * - DID-based node identification\n * - Authenticated sync sessions\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { AeonEncryptionMode } from '../crypto/types';\n\nexport interface SyncNode {\n id: string;\n address: string;\n port: number;\n status: 'online' | 'offline' | 'syncing';\n lastHeartbeat: string;\n version: string;\n capabilities: string[];\n // DID-based identity (optional, for authenticated nodes)\n did?: string;\n // Public signing key for verification\n publicSigningKey?: JsonWebKey;\n // Public encryption key for E2E encryption\n publicEncryptionKey?: JsonWebKey;\n // Granted capabilities via UCAN\n grantedCapabilities?: string[];\n}\n\nexport interface SyncSession {\n id: string;\n initiatorId: string;\n participantIds: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n itemsSynced: number;\n itemsFailed: number;\n conflictsDetected: number;\n // Security fields for authenticated sessions\n initiatorDID?: string;\n participantDIDs?: string[];\n encryptionMode?: AeonEncryptionMode;\n requiredCapabilities?: string[];\n sessionToken?: string;\n}\n\nexport interface SyncEvent {\n type:\n | 'node-joined'\n | 'node-left'\n | 'sync-started'\n | 'sync-completed'\n | 'conflict-detected';\n sessionId?: string;\n nodeId: string;\n timestamp: string;\n data?: unknown;\n}\n\n/**\n * Sync Coordinator\n * Coordinates synchronization across distributed nodes\n */\nexport class SyncCoordinator extends EventEmitter {\n private nodes: Map<string, SyncNode> = new Map();\n private sessions: Map<string, SyncSession> = new Map();\n private syncEvents: SyncEvent[] = [];\n private nodeHeartbeats: Map<string, number> = new Map();\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private nodesByDID: Map<string, string> = new Map(); // DID -> nodeId\n\n constructor() {\n super();\n }\n\n /**\n * Configure cryptographic provider for authenticated sync\n */\n configureCrypto(provider: ICryptoProvider): void {\n this.cryptoProvider = provider;\n\n logger.debug('[SyncCoordinator] Crypto configured', {\n initialized: provider.isInitialized(),\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Register a node with DID-based identity\n */\n async registerAuthenticatedNode(\n nodeInfo: Omit<\n SyncNode,\n 'did' | 'publicSigningKey' | 'publicEncryptionKey'\n > & {\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }\n ): Promise<SyncNode> {\n const node: SyncNode = {\n ...nodeInfo,\n };\n\n this.nodes.set(node.id, node);\n this.nodeHeartbeats.set(node.id, Date.now());\n this.nodesByDID.set(nodeInfo.did, node.id);\n\n // Register with crypto provider if available\n if (this.cryptoProvider) {\n await this.cryptoProvider.registerRemoteNode({\n id: node.id,\n did: nodeInfo.did,\n publicSigningKey: nodeInfo.publicSigningKey,\n publicEncryptionKey: nodeInfo.publicEncryptionKey,\n });\n }\n\n const event: SyncEvent = {\n type: 'node-joined',\n nodeId: node.id,\n timestamp: new Date().toISOString(),\n data: { did: nodeInfo.did, authenticated: true },\n };\n\n this.syncEvents.push(event);\n this.emit('node-joined', node);\n\n logger.debug('[SyncCoordinator] Authenticated node registered', {\n nodeId: node.id,\n did: nodeInfo.did,\n version: node.version,\n });\n\n return node;\n }\n\n /**\n * Get node by DID\n */\n getNodeByDID(did: string): SyncNode | undefined {\n const nodeId = this.nodesByDID.get(did);\n if (!nodeId) return undefined;\n return this.nodes.get(nodeId);\n }\n\n /**\n * Get all authenticated nodes (nodes with DIDs)\n */\n getAuthenticatedNodes(): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) => n.did);\n }\n\n /**\n * Create an authenticated sync session with UCAN-based authorization\n */\n async createAuthenticatedSyncSession(\n initiatorDID: string,\n participantDIDs: string[],\n options?: {\n encryptionMode?: AeonEncryptionMode;\n requiredCapabilities?: string[];\n }\n ): Promise<SyncSession> {\n // Find the initiator node by DID\n const initiatorNodeId = this.nodesByDID.get(initiatorDID);\n if (!initiatorNodeId) {\n throw new Error(`Initiator node with DID ${initiatorDID} not found`);\n }\n\n // Find participant node IDs\n const participantIds: string[] = [];\n for (const did of participantDIDs) {\n const nodeId = this.nodesByDID.get(did);\n if (nodeId) {\n participantIds.push(nodeId);\n }\n }\n\n // Create session token if crypto is available\n let sessionToken: string | undefined;\n if (this.cryptoProvider && this.cryptoProvider.isInitialized()) {\n // Create a UCAN that grants sync capabilities to all participants\n const capabilities = (\n options?.requiredCapabilities || ['aeon:sync:read', 'aeon:sync:write']\n ).map((cap) => ({ can: cap, with: '*' }));\n\n // Create token for the first participant (in production, you'd create one per participant)\n if (participantDIDs.length > 0) {\n sessionToken = await this.cryptoProvider.createUCAN(\n participantDIDs[0],\n capabilities,\n { expirationSeconds: 3600 } // 1 hour\n );\n }\n }\n\n const session: SyncSession = {\n id: `sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n initiatorId: initiatorNodeId,\n participantIds,\n status: 'pending',\n startTime: new Date().toISOString(),\n itemsSynced: 0,\n itemsFailed: 0,\n conflictsDetected: 0,\n initiatorDID,\n participantDIDs,\n encryptionMode: options?.encryptionMode || 'none',\n requiredCapabilities: options?.requiredCapabilities,\n sessionToken,\n };\n\n this.sessions.set(session.id, session);\n\n const event: SyncEvent = {\n type: 'sync-started',\n sessionId: session.id,\n nodeId: initiatorNodeId,\n timestamp: new Date().toISOString(),\n data: {\n authenticated: true,\n initiatorDID,\n participantCount: participantDIDs.length,\n encryptionMode: session.encryptionMode,\n },\n };\n\n this.syncEvents.push(event);\n this.emit('sync-started', session);\n\n logger.debug('[SyncCoordinator] Authenticated sync session created', {\n sessionId: session.id,\n initiatorDID,\n participants: participantDIDs.length,\n encryptionMode: session.encryptionMode,\n });\n\n return session;\n }\n\n /**\n * Verify a node's UCAN capabilities for a session\n */\n async verifyNodeCapabilities(\n sessionId: string,\n nodeDID: string,\n token: string\n ): Promise<{ authorized: boolean; error?: string }> {\n if (!this.cryptoProvider) {\n return { authorized: true }; // No crypto, always authorized\n }\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return { authorized: false, error: `Session ${sessionId} not found` };\n }\n\n const result = await this.cryptoProvider.verifyUCAN(token, {\n requiredCapabilities: session.requiredCapabilities?.map((cap) => ({\n can: cap,\n with: '*',\n })),\n });\n\n if (!result.authorized) {\n logger.warn('[SyncCoordinator] Node capability verification failed', {\n sessionId,\n nodeDID,\n error: result.error,\n });\n }\n\n return result;\n }\n\n /**\n * Register a node in the cluster\n */\n registerNode(node: SyncNode): void {\n this.nodes.set(node.id, node);\n this.nodeHeartbeats.set(node.id, Date.now());\n\n const event: SyncEvent = {\n type: 'node-joined',\n nodeId: node.id,\n timestamp: new Date().toISOString(),\n };\n\n this.syncEvents.push(event);\n this.emit('node-joined', node);\n\n logger.debug('[SyncCoordinator] Node registered', {\n nodeId: node.id,\n address: node.address,\n version: node.version,\n });\n }\n\n /**\n * Deregister a node from the cluster\n */\n deregisterNode(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node ${nodeId} not found`);\n }\n\n this.nodes.delete(nodeId);\n this.nodeHeartbeats.delete(nodeId);\n\n const event: SyncEvent = {\n type: 'node-left',\n nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.syncEvents.push(event);\n this.emit('node-left', node);\n\n logger.debug('[SyncCoordinator] Node deregistered', { nodeId });\n }\n\n /**\n * Create a new sync session\n */\n createSyncSession(\n initiatorId: string,\n participantIds: string[]\n ): SyncSession {\n const node = this.nodes.get(initiatorId);\n if (!node) {\n throw new Error(`Initiator node ${initiatorId} not found`);\n }\n\n const session: SyncSession = {\n id: `sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n initiatorId,\n participantIds,\n status: 'pending',\n startTime: new Date().toISOString(),\n itemsSynced: 0,\n itemsFailed: 0,\n conflictsDetected: 0,\n };\n\n this.sessions.set(session.id, session);\n\n const event: SyncEvent = {\n type: 'sync-started',\n sessionId: session.id,\n nodeId: initiatorId,\n timestamp: new Date().toISOString(),\n };\n\n this.syncEvents.push(event);\n this.emit('sync-started', session);\n\n logger.debug('[SyncCoordinator] Sync session created', {\n sessionId: session.id,\n initiator: initiatorId,\n participants: participantIds.length,\n });\n\n return session;\n }\n\n /**\n * Update sync session\n */\n updateSyncSession(sessionId: string, updates: Partial<SyncSession>): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n Object.assign(session, updates);\n\n if (updates.status === 'completed' || updates.status === 'failed') {\n session.endTime = new Date().toISOString();\n\n const event: SyncEvent = {\n type: 'sync-completed',\n sessionId,\n nodeId: session.initiatorId,\n timestamp: new Date().toISOString(),\n data: { status: updates.status, itemsSynced: session.itemsSynced },\n };\n\n this.syncEvents.push(event);\n this.emit('sync-completed', session);\n }\n\n logger.debug('[SyncCoordinator] Sync session updated', {\n sessionId,\n status: session.status,\n itemsSynced: session.itemsSynced,\n });\n }\n\n /**\n * Record a conflict during sync\n */\n recordConflict(\n sessionId: string,\n nodeId: string,\n conflictData?: unknown\n ): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.conflictsDetected++;\n\n const event: SyncEvent = {\n type: 'conflict-detected',\n sessionId,\n nodeId,\n timestamp: new Date().toISOString(),\n data: conflictData,\n };\n\n this.syncEvents.push(event);\n this.emit('conflict-detected', { session, nodeId, conflictData });\n\n logger.debug('[SyncCoordinator] Conflict recorded', {\n sessionId,\n nodeId,\n totalConflicts: session.conflictsDetected,\n });\n }\n }\n\n /**\n * Update node status\n */\n updateNodeStatus(nodeId: string, status: SyncNode['status']): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node ${nodeId} not found`);\n }\n\n node.status = status;\n this.nodeHeartbeats.set(nodeId, Date.now());\n\n logger.debug('[SyncCoordinator] Node status updated', {\n nodeId,\n status,\n });\n }\n\n /**\n * Record heartbeat from node\n */\n recordHeartbeat(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n return;\n }\n\n node.lastHeartbeat = new Date().toISOString();\n this.nodeHeartbeats.set(nodeId, Date.now());\n }\n\n /**\n * Get all nodes\n */\n getNodes(): SyncNode[] {\n return Array.from(this.nodes.values());\n }\n\n /**\n * Get node by ID\n */\n getNode(nodeId: string): SyncNode | undefined {\n return this.nodes.get(nodeId);\n }\n\n /**\n * Get online nodes\n */\n getOnlineNodes(): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) => n.status === 'online');\n }\n\n /**\n * Get nodes by capability\n */\n getNodesByCapability(capability: string): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) =>\n n.capabilities.includes(capability)\n );\n }\n\n /**\n * Get sync session\n */\n getSyncSession(sessionId: string): SyncSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Get all sync sessions\n */\n getAllSyncSessions(): SyncSession[] {\n return Array.from(this.sessions.values());\n }\n\n /**\n * Get active sync sessions\n */\n getActiveSyncSessions(): SyncSession[] {\n return Array.from(this.sessions.values()).filter(\n (s) => s.status === 'active'\n );\n }\n\n /**\n * Get sessions for a node\n */\n getSessionsForNode(nodeId: string): SyncSession[] {\n return Array.from(this.sessions.values()).filter(\n (s) => s.initiatorId === nodeId || s.participantIds.includes(nodeId)\n );\n }\n\n /**\n * Get sync statistics\n */\n getStatistics() {\n const sessions = Array.from(this.sessions.values());\n const completed = sessions.filter((s) => s.status === 'completed').length;\n const failed = sessions.filter((s) => s.status === 'failed').length;\n const active = sessions.filter((s) => s.status === 'active').length;\n\n const totalItemsSynced = sessions.reduce(\n (sum, s) => sum + s.itemsSynced,\n 0\n );\n const totalConflicts = sessions.reduce(\n (sum, s) => sum + s.conflictsDetected,\n 0\n );\n\n return {\n totalNodes: this.nodes.size,\n onlineNodes: this.getOnlineNodes().length,\n offlineNodes: this.nodes.size - this.getOnlineNodes().length,\n totalSessions: sessions.length,\n activeSessions: active,\n completedSessions: completed,\n failedSessions: failed,\n successRate:\n sessions.length > 0 ? (completed / sessions.length) * 100 : 0,\n totalItemsSynced,\n totalConflicts,\n averageConflictsPerSession:\n sessions.length > 0 ? totalConflicts / sessions.length : 0,\n };\n }\n\n /**\n * Get sync events\n */\n getSyncEvents(limit?: number): SyncEvent[] {\n const events = [...this.syncEvents];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n\n /**\n * Get sync events for session\n */\n getSessionEvents(sessionId: string): SyncEvent[] {\n return this.syncEvents.filter((e) => e.sessionId === sessionId);\n }\n\n /**\n * Check node health\n */\n getNodeHealth(): Record<string, { isHealthy: boolean; downtime: number }> {\n const health: Record<string, { isHealthy: boolean; downtime: number }> = {};\n\n for (const [nodeId, lastHeartbeat] of this.nodeHeartbeats) {\n const now = Date.now();\n const downtime = now - lastHeartbeat;\n const isHealthy = downtime < 30000; // 30 seconds threshold\n\n health[nodeId] = {\n isHealthy,\n downtime,\n };\n }\n\n return health;\n }\n\n /**\n * Start heartbeat monitoring\n */\n startHeartbeatMonitoring(interval: number = 5000): void {\n if (this.heartbeatInterval) {\n return;\n }\n\n this.heartbeatInterval = setInterval(() => {\n const health = this.getNodeHealth();\n\n for (const [nodeId, { isHealthy }] of Object.entries(health)) {\n const node = this.nodes.get(nodeId);\n if (!node) {\n continue;\n }\n\n const newStatus = isHealthy ? 'online' : 'offline';\n if (node.status !== newStatus) {\n this.updateNodeStatus(nodeId, newStatus);\n }\n }\n }, interval);\n\n logger.debug('[SyncCoordinator] Heartbeat monitoring started', {\n interval,\n });\n }\n\n /**\n * Stop heartbeat monitoring\n */\n stopHeartbeatMonitoring(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n\n logger.debug('[SyncCoordinator] Heartbeat monitoring stopped');\n }\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.nodes.clear();\n this.sessions.clear();\n this.syncEvents = [];\n this.nodeHeartbeats.clear();\n this.nodesByDID.clear();\n this.cryptoProvider = null;\n this.stopHeartbeatMonitoring();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Replication Manager\n *\n * Manages data replication across multiple nodes.\n * Handles replication policies, consistency levels, and replica coordination.\n *\n * Features:\n * - Replica set management\n * - Replication policy enforcement\n * - Consistency level tracking\n * - Replication health monitoring\n * - Replica synchronization coordination\n * - End-to-end encryption for replicated data\n * - DID-based replica authentication\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { AeonEncryptionMode } from '../crypto/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface Replica {\n id: string;\n nodeId: string;\n status: 'primary' | 'secondary' | 'syncing' | 'failed';\n lastSyncTime: string;\n lagBytes: number;\n lagMillis: number;\n // DID-based identity for authenticated replicas\n did?: string;\n // Whether this replica uses encrypted data\n encrypted?: boolean;\n}\n\nexport interface ReplicationPolicy {\n id: string;\n name: string;\n replicationFactor: number;\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong';\n syncInterval: number;\n maxReplicationLag: number;\n // Encryption settings for this policy\n encryptionMode?: AeonEncryptionMode;\n // Required capabilities for replicas\n requiredCapabilities?: string[];\n}\n\nexport interface ReplicationEvent {\n type: 'replica-added' | 'replica-removed' | 'replica-synced' | 'sync-failed';\n replicaId: string;\n nodeId: string;\n timestamp: string;\n details?: unknown;\n}\n\n/**\n * Encrypted replication data envelope\n */\nexport interface EncryptedReplicationData {\n /** Encrypted ciphertext (base64) */\n ct: string;\n /** Initialization vector (base64) */\n iv: string;\n /** Authentication tag (base64) */\n tag: string;\n /** Ephemeral public key for ECIES */\n epk?: JsonWebKey;\n /** Sender DID */\n senderDID?: string;\n /** Target replica DID */\n targetDID?: string;\n /** Encryption timestamp */\n encryptedAt: number;\n}\n\nexport interface ReplicationPersistenceData {\n replicas: Replica[];\n policies: ReplicationPolicy[];\n syncStatus: Array<{ nodeId: string; synced: number; failed: number }>;\n}\n\nexport interface ReplicationPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<ReplicationPersistenceData>;\n deserializer?: PersistenceDeserializer<ReplicationPersistenceData>;\n}\n\nexport interface ReplicationManagerOptions {\n persistence?: ReplicationPersistenceConfig;\n}\n\n/**\n * Replication Manager\n * Manages data replication across distributed nodes\n */\nexport class ReplicationManager {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:replication-state:v1';\n private replicas: Map<string, Replica> = new Map();\n private policies: Map<string, ReplicationPolicy> = new Map();\n private replicationEvents: ReplicationEvent[] = [];\n private syncStatus: Map<string, { synced: number; failed: number }> =\n new Map();\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private replicasByDID: Map<string, string> = new Map(); // DID -> replicaId\n private persistence: (ReplicationPersistenceConfig & { key: string }) | null =\n null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: ReplicationManagerOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? ReplicationManager.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[ReplicationManager] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Configure cryptographic provider for encrypted replication\n */\n configureCrypto(provider: ICryptoProvider): void {\n this.cryptoProvider = provider;\n\n logger.debug('[ReplicationManager] Crypto configured', {\n initialized: provider.isInitialized(),\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Register an authenticated replica with DID\n */\n async registerAuthenticatedReplica(\n replica: Omit<Replica, 'did' | 'encrypted'> & {\n did: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n },\n encrypted = false\n ): Promise<Replica> {\n const authenticatedReplica: Replica = {\n ...replica,\n encrypted,\n };\n\n this.replicas.set(replica.id, authenticatedReplica);\n this.replicasByDID.set(replica.did, replica.id);\n\n if (!this.syncStatus.has(replica.nodeId)) {\n this.syncStatus.set(replica.nodeId, { synced: 0, failed: 0 });\n }\n\n // Register with crypto provider if keys provided\n if (this.cryptoProvider && replica.publicSigningKey) {\n await this.cryptoProvider.registerRemoteNode({\n id: replica.nodeId,\n did: replica.did,\n publicSigningKey: replica.publicSigningKey,\n publicEncryptionKey: replica.publicEncryptionKey,\n });\n }\n\n const event: ReplicationEvent = {\n type: 'replica-added',\n replicaId: replica.id,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n details: { did: replica.did, encrypted, authenticated: true },\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Authenticated replica registered', {\n replicaId: replica.id,\n did: replica.did,\n encrypted,\n });\n\n return authenticatedReplica;\n }\n\n /**\n * Get replica by DID\n */\n getReplicaByDID(did: string): Replica | undefined {\n const replicaId = this.replicasByDID.get(did);\n if (!replicaId) return undefined;\n return this.replicas.get(replicaId);\n }\n\n /**\n * Get all encrypted replicas\n */\n getEncryptedReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter((r) => r.encrypted);\n }\n\n /**\n * Encrypt data for replication to a specific replica\n */\n async encryptForReplica(\n data: unknown,\n targetReplicaDID: string\n ): Promise<EncryptedReplicationData> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const dataBytes = new TextEncoder().encode(JSON.stringify(data));\n const encrypted = await this.cryptoProvider.encrypt(\n dataBytes,\n targetReplicaDID\n );\n\n const localDID = this.cryptoProvider.getLocalDID();\n\n return {\n ct: encrypted.ct,\n iv: encrypted.iv,\n tag: encrypted.tag,\n epk: encrypted.epk,\n senderDID: localDID || undefined,\n targetDID: targetReplicaDID,\n encryptedAt: encrypted.encryptedAt,\n };\n }\n\n /**\n * Decrypt data received from replication\n */\n async decryptReplicationData<T>(\n encrypted: EncryptedReplicationData\n ): Promise<T> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const decrypted = await this.cryptoProvider.decrypt(\n {\n alg: 'ECIES-P256',\n ct: encrypted.ct,\n iv: encrypted.iv,\n tag: encrypted.tag,\n epk: encrypted.epk,\n },\n encrypted.senderDID\n );\n\n return JSON.parse(new TextDecoder().decode(decrypted)) as T;\n }\n\n /**\n * Create an encrypted replication policy\n */\n createEncryptedPolicy(\n name: string,\n replicationFactor: number,\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong',\n encryptionMode: AeonEncryptionMode,\n options?: {\n syncInterval?: number;\n maxReplicationLag?: number;\n requiredCapabilities?: string[];\n }\n ): ReplicationPolicy {\n const policy: ReplicationPolicy = {\n id: `policy-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n replicationFactor,\n consistencyLevel,\n syncInterval: options?.syncInterval || 1000,\n maxReplicationLag: options?.maxReplicationLag || 10000,\n encryptionMode,\n requiredCapabilities: options?.requiredCapabilities,\n };\n\n this.policies.set(policy.id, policy);\n\n logger.debug('[ReplicationManager] Encrypted policy created', {\n policyId: policy.id,\n name,\n replicationFactor,\n encryptionMode,\n });\n\n return policy;\n }\n\n /**\n * Verify a replica's capabilities via UCAN\n */\n async verifyReplicaCapabilities(\n replicaDID: string,\n token: string,\n policyId?: string\n ): Promise<{ authorized: boolean; error?: string }> {\n if (!this.cryptoProvider) {\n return { authorized: true }; // No crypto, always authorized\n }\n\n const policy = policyId ? this.policies.get(policyId) : undefined;\n\n const result = await this.cryptoProvider.verifyUCAN(token, {\n requiredCapabilities: policy?.requiredCapabilities?.map((cap) => ({\n can: cap,\n with: '*',\n })),\n });\n\n if (!result.authorized) {\n logger.warn(\n '[ReplicationManager] Replica capability verification failed',\n {\n replicaDID,\n error: result.error,\n }\n );\n }\n\n return result;\n }\n\n /**\n * Register a replica\n */\n registerReplica(replica: Replica): void {\n this.replicas.set(replica.id, replica);\n\n if (!this.syncStatus.has(replica.nodeId)) {\n this.syncStatus.set(replica.nodeId, { synced: 0, failed: 0 });\n }\n\n const event: ReplicationEvent = {\n type: 'replica-added',\n replicaId: replica.id,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Replica registered', {\n replicaId: replica.id,\n nodeId: replica.nodeId,\n status: replica.status,\n });\n }\n\n /**\n * Remove a replica\n */\n removeReplica(replicaId: string): void {\n const replica = this.replicas.get(replicaId);\n if (!replica) {\n throw new Error(`Replica ${replicaId} not found`);\n }\n\n this.replicas.delete(replicaId);\n\n const event: ReplicationEvent = {\n type: 'replica-removed',\n replicaId,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Replica removed', { replicaId });\n }\n\n /**\n * Create a replication policy\n */\n createPolicy(\n name: string,\n replicationFactor: number,\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong',\n syncInterval = 1000,\n maxReplicationLag = 10000\n ): ReplicationPolicy {\n const policy: ReplicationPolicy = {\n id: `policy-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n replicationFactor,\n consistencyLevel,\n syncInterval,\n maxReplicationLag,\n };\n\n this.policies.set(policy.id, policy);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Policy created', {\n policyId: policy.id,\n name,\n replicationFactor,\n consistencyLevel,\n });\n\n return policy;\n }\n\n /**\n * Update replica status\n */\n updateReplicaStatus(\n replicaId: string,\n status: Replica['status'],\n lagBytes = 0,\n lagMillis = 0\n ): void {\n const replica = this.replicas.get(replicaId);\n if (!replica) {\n throw new Error(`Replica ${replicaId} not found`);\n }\n\n replica.status = status;\n replica.lagBytes = lagBytes;\n replica.lagMillis = lagMillis;\n replica.lastSyncTime = new Date().toISOString();\n\n const event: ReplicationEvent = {\n type: status === 'syncing' ? 'replica-synced' : 'sync-failed',\n replicaId,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n details: { status, lagBytes, lagMillis },\n };\n\n this.replicationEvents.push(event);\n\n const syncStatus = this.syncStatus.get(replica.nodeId);\n if (syncStatus) {\n if (status === 'syncing' || status === 'secondary') {\n syncStatus.synced++;\n } else if (status === 'failed') {\n syncStatus.failed++;\n }\n }\n\n logger.debug('[ReplicationManager] Replica status updated', {\n replicaId,\n status,\n lagBytes,\n lagMillis,\n });\n\n this.schedulePersist();\n }\n\n /**\n * Get replicas for node\n */\n getReplicasForNode(nodeId: string): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.nodeId === nodeId\n );\n }\n\n /**\n * Get healthy replicas\n */\n getHealthyReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'secondary' || r.status === 'primary'\n );\n }\n\n /**\n * Get syncing replicas\n */\n getSyncingReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'syncing'\n );\n }\n\n /**\n * Get failed replicas\n */\n getFailedReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'failed'\n );\n }\n\n /**\n * Check replication health for policy\n */\n checkReplicationHealth(policyId: string): {\n healthy: boolean;\n replicasInPolicy: number;\n healthyReplicas: number;\n replicationLag: number;\n } {\n const policy = this.policies.get(policyId);\n if (!policy) {\n throw new Error(`Policy ${policyId} not found`);\n }\n\n const healthy = this.getHealthyReplicas();\n const maxLag = Math.max(0, ...healthy.map((r) => r.lagMillis));\n\n return {\n healthy:\n healthy.length >= policy.replicationFactor &&\n maxLag <= policy.maxReplicationLag,\n replicasInPolicy: policy.replicationFactor,\n healthyReplicas: healthy.length,\n replicationLag: maxLag,\n };\n }\n\n /**\n * Get consistency level\n */\n getConsistencyLevel(\n policyId: string\n ): 'eventual' | 'read-after-write' | 'strong' {\n const policy = this.policies.get(policyId);\n if (!policy) {\n return 'eventual';\n }\n\n return policy.consistencyLevel;\n }\n\n /**\n * Get replica\n */\n getReplica(replicaId: string): Replica | undefined {\n return this.replicas.get(replicaId);\n }\n\n /**\n * Get all replicas\n */\n getAllReplicas(): Replica[] {\n return Array.from(this.replicas.values());\n }\n\n /**\n * Get policy\n */\n getPolicy(policyId: string): ReplicationPolicy | undefined {\n return this.policies.get(policyId);\n }\n\n /**\n * Get all policies\n */\n getAllPolicies(): ReplicationPolicy[] {\n return Array.from(this.policies.values());\n }\n\n /**\n * Get replication statistics\n */\n getStatistics() {\n const healthy = this.getHealthyReplicas().length;\n const syncing = this.getSyncingReplicas().length;\n const failed = this.getFailedReplicas().length;\n const total = this.replicas.size;\n\n const replicationLags = Array.from(this.replicas.values()).map(\n (r) => r.lagMillis\n );\n const avgLag =\n replicationLags.length > 0\n ? replicationLags.reduce((a, b) => a + b) / replicationLags.length\n : 0;\n const maxLag =\n replicationLags.length > 0 ? Math.max(...replicationLags) : 0;\n\n return {\n totalReplicas: total,\n healthyReplicas: healthy,\n syncingReplicas: syncing,\n failedReplicas: failed,\n healthiness: total > 0 ? (healthy / total) * 100 : 0,\n averageReplicationLagMs: avgLag,\n maxReplicationLagMs: maxLag,\n totalPolicies: this.policies.size,\n };\n }\n\n /**\n * Get replication events\n */\n getReplicationEvents(limit?: number): ReplicationEvent[] {\n const events = [...this.replicationEvents];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n\n /**\n * Get sync status for node\n */\n getSyncStatus(nodeId: string): { synced: number; failed: number } {\n return this.syncStatus.get(nodeId) || { synced: 0, failed: 0 };\n }\n\n /**\n * Get replication lag distribution\n */\n getReplicationLagDistribution(): Record<string, number> {\n const distribution: Record<string, number> = {\n '0-100ms': 0,\n '100-500ms': 0,\n '500-1000ms': 0,\n '1000+ms': 0,\n };\n\n for (const replica of this.replicas.values()) {\n if (replica.lagMillis <= 100) {\n distribution['0-100ms']++;\n } else if (replica.lagMillis <= 500) {\n distribution['100-500ms']++;\n } else if (replica.lagMillis <= 1000) {\n distribution['500-1000ms']++;\n } else {\n distribution['1000+ms']++;\n }\n }\n\n return distribution;\n }\n\n /**\n * Check if can satisfy consistency level\n */\n canSatisfyConsistency(policyId: string, _requiredAcks: number): boolean {\n const policy = this.policies.get(policyId);\n if (!policy) {\n return false;\n }\n\n const healthyCount = this.getHealthyReplicas().length;\n\n switch (policy.consistencyLevel) {\n case 'eventual':\n return true; // Always achievable\n case 'read-after-write':\n return healthyCount >= 1;\n case 'strong':\n return healthyCount >= policy.replicationFactor;\n default:\n return false;\n }\n }\n\n /**\n * Persist current replication state snapshot.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const data: ReplicationPersistenceData = {\n replicas: this.getAllReplicas(),\n policies: this.getAllPolicies(),\n syncStatus: Array.from(this.syncStatus.entries()).map(\n ([nodeId, state]) => ({\n nodeId,\n synced: state.synced,\n failed: state.failed,\n })\n ),\n };\n\n const envelope: PersistedEnvelope<ReplicationPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<ReplicationPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load replication snapshot from persistence.\n */\n async loadFromPersistence(): Promise<{\n replicas: number;\n policies: number;\n syncStatus: number;\n }> {\n if (!this.persistence) {\n return { replicas: 0, policies: 0, syncStatus: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { replicas: 0, policies: 0, syncStatus: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<ReplicationPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid replication persistence payload');\n }\n if (\n !Array.isArray(envelope.data.replicas) ||\n !Array.isArray(envelope.data.policies) ||\n !Array.isArray(envelope.data.syncStatus)\n ) {\n throw new Error('Invalid replication persistence structure');\n }\n\n this.replicas.clear();\n this.policies.clear();\n this.syncStatus.clear();\n this.replicasByDID.clear();\n\n let importedReplicas = 0;\n for (const replica of envelope.data.replicas) {\n if (this.isValidReplica(replica)) {\n this.replicas.set(replica.id, replica);\n if (replica.did) {\n this.replicasByDID.set(replica.did, replica.id);\n }\n importedReplicas++;\n }\n }\n\n let importedPolicies = 0;\n for (const policy of envelope.data.policies) {\n if (this.isValidPolicy(policy)) {\n this.policies.set(policy.id, policy);\n importedPolicies++;\n }\n }\n\n let importedSyncStatus = 0;\n for (const status of envelope.data.syncStatus) {\n if (\n typeof status.nodeId === 'string' &&\n typeof status.synced === 'number' &&\n typeof status.failed === 'number'\n ) {\n this.syncStatus.set(status.nodeId, {\n synced: status.synced,\n failed: status.failed,\n });\n importedSyncStatus++;\n }\n }\n\n logger.debug('[ReplicationManager] Loaded from persistence', {\n key: this.persistence.key,\n replicas: importedReplicas,\n policies: importedPolicies,\n syncStatus: importedSyncStatus,\n });\n\n return {\n replicas: importedReplicas,\n policies: importedPolicies,\n syncStatus: importedSyncStatus,\n };\n }\n\n /**\n * Remove persisted replication snapshot.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[ReplicationManager] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidReplica(value: unknown): value is Replica {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as Partial<Replica>;\n const validStatus =\n candidate.status === 'primary' ||\n candidate.status === 'secondary' ||\n candidate.status === 'syncing' ||\n candidate.status === 'failed';\n\n return (\n typeof candidate.id === 'string' &&\n typeof candidate.nodeId === 'string' &&\n validStatus &&\n typeof candidate.lastSyncTime === 'string' &&\n typeof candidate.lagBytes === 'number' &&\n typeof candidate.lagMillis === 'number'\n );\n }\n\n private isValidPolicy(value: unknown): value is ReplicationPolicy {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const candidate = value as Partial<ReplicationPolicy>;\n const validConsistency =\n candidate.consistencyLevel === 'eventual' ||\n candidate.consistencyLevel === 'read-after-write' ||\n candidate.consistencyLevel === 'strong';\n\n return (\n typeof candidate.id === 'string' &&\n typeof candidate.name === 'string' &&\n typeof candidate.replicationFactor === 'number' &&\n validConsistency &&\n typeof candidate.syncInterval === 'number' &&\n typeof candidate.maxReplicationLag === 'number'\n );\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.replicas.clear();\n this.policies.clear();\n this.replicationEvents = [];\n this.syncStatus.clear();\n this.replicasByDID.clear();\n this.cryptoProvider = null;\n this.schedulePersist();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Sync Protocol\n *\n * Handles synchronization protocol messages and handshaking.\n * Manages message serialization, protocol versioning, and compatibility.\n *\n * Features:\n * - Message serialization and deserialization\n * - Protocol version management\n * - Handshake handling\n * - Message validation and error handling\n * - Protocol state machine\n * - Optional cryptographic authentication and encryption\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type {\n AeonEncryptionMode,\n AuthenticatedMessageFields,\n} from '../crypto/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface SyncMessage {\n type: 'handshake' | 'sync-request' | 'sync-response' | 'ack' | 'error';\n version: string;\n sender: string;\n receiver: string;\n messageId: string;\n timestamp: string;\n payload?: unknown;\n // Authentication fields (populated when crypto is configured)\n auth?: AuthenticatedMessageFields;\n}\n\nexport interface Handshake {\n protocolVersion: string;\n nodeId: string;\n capabilities: string[];\n state: 'initiating' | 'responding' | 'completed';\n // DID for authenticated handshakes\n did?: string;\n // Public signing key (JWK)\n publicSigningKey?: JsonWebKey;\n // Public encryption key (JWK)\n publicEncryptionKey?: JsonWebKey;\n // UCAN token for capability verification\n ucan?: string;\n}\n\n/**\n * Crypto configuration for sync protocol\n */\nexport interface SyncProtocolCryptoConfig {\n /** Encryption mode for messages */\n encryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Required capabilities for sync operations */\n requiredCapabilities?: Array<{ can: string; with: string }>;\n}\n\nexport interface SyncRequest {\n sessionId: string;\n fromVersion: string;\n toVersion: string;\n filter?: Record<string, unknown>;\n}\n\nexport interface SyncResponse {\n sessionId: string;\n fromVersion: string;\n toVersion: string;\n data: unknown[];\n hasMore: boolean;\n offset: number;\n}\n\nexport interface ProtocolError {\n code: string;\n message: string;\n recoverable: boolean;\n}\n\nexport interface SyncProtocolPersistenceData {\n protocolVersion: string;\n messageCounter: number;\n messageQueue: SyncMessage[];\n handshakes: Array<{ nodeId: string; handshake: Handshake }>;\n protocolErrors: Array<{ error: ProtocolError; timestamp: string }>;\n}\n\nexport interface SyncProtocolPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<SyncProtocolPersistenceData>;\n deserializer?: PersistenceDeserializer<SyncProtocolPersistenceData>;\n}\n\nexport interface SyncProtocolOptions {\n persistence?: SyncProtocolPersistenceConfig;\n}\n\n/**\n * Sync Protocol\n * Handles synchronization protocol messages and handshaking\n */\nexport class SyncProtocol {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:sync-protocol:v1';\n private version = '1.0.0';\n private messageQueue: SyncMessage[] = [];\n private messageMap: Map<string, SyncMessage> = new Map();\n private handshakes: Map<string, Handshake> = new Map();\n private protocolErrors: Array<{ error: ProtocolError; timestamp: string }> =\n [];\n private messageCounter = 0;\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private cryptoConfig: SyncProtocolCryptoConfig | null = null;\n private persistence:\n | (SyncProtocolPersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: SyncProtocolOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? SyncProtocol.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[SyncProtocol] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Configure cryptographic provider for authenticated/encrypted messages\n */\n configureCrypto(\n provider: ICryptoProvider,\n config?: Partial<SyncProtocolCryptoConfig>\n ): void {\n this.cryptoProvider = provider;\n this.cryptoConfig = {\n encryptionMode: config?.encryptionMode ?? 'none',\n requireSignatures: config?.requireSignatures ?? false,\n requireCapabilities: config?.requireCapabilities ?? false,\n requiredCapabilities: config?.requiredCapabilities,\n };\n\n logger.debug('[SyncProtocol] Crypto configured', {\n encryptionMode: this.cryptoConfig.encryptionMode,\n requireSignatures: this.cryptoConfig.requireSignatures,\n requireCapabilities: this.cryptoConfig.requireCapabilities,\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Get crypto configuration\n */\n getCryptoConfig(): SyncProtocolCryptoConfig | null {\n return this.cryptoConfig ? { ...this.cryptoConfig } : null;\n }\n\n /**\n * Get protocol version\n */\n getVersion(): string {\n return this.version;\n }\n\n /**\n * Create authenticated handshake message with DID and keys\n */\n async createAuthenticatedHandshake(\n capabilities: string[],\n targetDID?: string\n ): Promise<SyncMessage> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n if (!localDID) {\n throw new Error('Local DID not available');\n }\n\n const publicInfo = await this.cryptoProvider.exportPublicIdentity();\n if (!publicInfo) {\n throw new Error('Cannot export public identity');\n }\n\n // Create UCAN if target DID is specified and capabilities are required\n let ucan: string | undefined;\n if (targetDID && this.cryptoConfig?.requireCapabilities) {\n const caps = this.cryptoConfig.requiredCapabilities || [\n { can: 'aeon:sync:read', with: '*' },\n { can: 'aeon:sync:write', with: '*' },\n ];\n ucan = await this.cryptoProvider.createUCAN(targetDID, caps);\n }\n\n const handshakePayload: Handshake = {\n protocolVersion: this.version,\n nodeId: localDID,\n capabilities,\n state: 'initiating',\n did: localDID,\n publicSigningKey: publicInfo.publicSigningKey,\n publicEncryptionKey: publicInfo.publicEncryptionKey,\n ucan,\n };\n\n const message: SyncMessage = {\n type: 'handshake',\n version: this.version,\n sender: localDID,\n receiver: targetDID || '',\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: handshakePayload,\n };\n\n // Sign the message if signatures are required\n if (this.cryptoConfig?.requireSignatures) {\n const signed = await this.cryptoProvider.signData(handshakePayload);\n message.auth = {\n senderDID: localDID,\n receiverDID: targetDID,\n signature: signed.signature,\n };\n }\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Authenticated handshake created', {\n messageId: message.messageId,\n did: localDID,\n capabilities: capabilities.length,\n hasUCAN: !!ucan,\n });\n\n return message;\n }\n\n /**\n * Verify and process an authenticated handshake\n */\n async verifyAuthenticatedHandshake(\n message: SyncMessage\n ): Promise<{ valid: boolean; handshake?: Handshake; error?: string }> {\n if (message.type !== 'handshake') {\n return { valid: false, error: 'Message is not a handshake' };\n }\n\n const handshake = message.payload as Handshake;\n\n // If crypto is not configured, just process normally\n if (!this.cryptoProvider || !this.cryptoConfig) {\n this.handshakes.set(message.sender, handshake);\n this.schedulePersist();\n return { valid: true, handshake };\n }\n\n // Register the remote node if we have their keys\n if (handshake.did && handshake.publicSigningKey) {\n await this.cryptoProvider.registerRemoteNode({\n id: handshake.nodeId,\n did: handshake.did,\n publicSigningKey: handshake.publicSigningKey,\n publicEncryptionKey: handshake.publicEncryptionKey,\n });\n }\n\n // Verify signature if required\n if (this.cryptoConfig.requireSignatures && message.auth?.signature) {\n const signed = {\n payload: handshake,\n signature: message.auth.signature,\n signer: message.auth.senderDID || message.sender,\n algorithm: 'ES256',\n signedAt: Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n logger.warn('[SyncProtocol] Handshake signature verification failed', {\n messageId: message.messageId,\n sender: message.sender,\n });\n return { valid: false, error: 'Invalid signature' };\n }\n }\n\n // Verify UCAN if required\n if (this.cryptoConfig.requireCapabilities && handshake.ucan) {\n const localDID = this.cryptoProvider.getLocalDID();\n const result = await this.cryptoProvider.verifyUCAN(handshake.ucan, {\n expectedAudience: localDID || undefined,\n requiredCapabilities: this.cryptoConfig.requiredCapabilities,\n });\n\n if (!result.authorized) {\n logger.warn('[SyncProtocol] Handshake UCAN verification failed', {\n messageId: message.messageId,\n error: result.error,\n });\n return { valid: false, error: result.error || 'Unauthorized' };\n }\n }\n\n this.handshakes.set(message.sender, handshake);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Authenticated handshake verified', {\n messageId: message.messageId,\n did: handshake.did,\n });\n\n return { valid: true, handshake };\n }\n\n /**\n * Sign and optionally encrypt a message payload\n */\n async signMessage<T>(\n message: SyncMessage,\n payload: T,\n encrypt = false\n ): Promise<SyncMessage> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n\n // Sign the payload\n const signed = await this.cryptoProvider.signData(payload);\n\n message.auth = {\n senderDID: localDID || undefined,\n receiverDID: message.receiver || undefined,\n signature: signed.signature,\n encrypted: false,\n };\n\n // Encrypt if requested and we have a recipient\n if (\n encrypt &&\n message.receiver &&\n this.cryptoConfig?.encryptionMode !== 'none'\n ) {\n const payloadBytes = new TextEncoder().encode(JSON.stringify(payload));\n const encrypted = await this.cryptoProvider.encrypt(\n payloadBytes,\n message.receiver\n );\n\n message.payload = encrypted;\n message.auth.encrypted = true;\n\n logger.debug('[SyncProtocol] Message encrypted', {\n messageId: message.messageId,\n recipient: message.receiver,\n });\n } else {\n message.payload = payload;\n }\n\n return message;\n }\n\n /**\n * Verify signature and optionally decrypt a message\n */\n async verifyMessage<T>(\n message: SyncMessage\n ): Promise<{ valid: boolean; payload?: T; error?: string }> {\n if (!this.cryptoProvider || !message.auth) {\n // No crypto or no auth - return payload as-is\n return { valid: true, payload: message.payload as T };\n }\n\n let payload = message.payload;\n\n // Decrypt if encrypted\n if (message.auth.encrypted && message.payload) {\n try {\n const encrypted = message.payload as {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n };\n\n const decrypted = await this.cryptoProvider.decrypt(\n encrypted,\n message.auth.senderDID\n );\n\n payload = JSON.parse(new TextDecoder().decode(decrypted));\n\n logger.debug('[SyncProtocol] Message decrypted', {\n messageId: message.messageId,\n });\n } catch (error) {\n return {\n valid: false,\n error: `Decryption failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n }\n\n // Verify signature if present\n if (message.auth.signature && message.auth.senderDID) {\n const signed = {\n payload,\n signature: message.auth.signature,\n signer: message.auth.senderDID,\n algorithm: 'ES256',\n signedAt: Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n return { valid: false, error: 'Invalid signature' };\n }\n }\n\n return { valid: true, payload: payload as T };\n }\n\n /**\n * Create handshake message\n */\n createHandshakeMessage(nodeId: string, capabilities: string[]): SyncMessage {\n const message: SyncMessage = {\n type: 'handshake',\n version: this.version,\n sender: nodeId,\n receiver: '',\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n protocolVersion: this.version,\n nodeId,\n capabilities,\n state: 'initiating',\n } as Handshake,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Handshake message created', {\n messageId: message.messageId,\n nodeId,\n capabilities: capabilities.length,\n });\n\n return message;\n }\n\n /**\n * Create sync request message\n */\n createSyncRequestMessage(\n sender: string,\n receiver: string,\n sessionId: string,\n fromVersion: string,\n toVersion: string,\n filter?: Record<string, unknown>\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'sync-request',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n sessionId,\n fromVersion,\n toVersion,\n filter,\n } as SyncRequest,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Sync request created', {\n messageId: message.messageId,\n sessionId,\n fromVersion,\n toVersion,\n });\n\n return message;\n }\n\n /**\n * Create sync response message\n */\n createSyncResponseMessage(\n sender: string,\n receiver: string,\n sessionId: string,\n fromVersion: string,\n toVersion: string,\n data: unknown[],\n hasMore = false,\n offset = 0\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'sync-response',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n sessionId,\n fromVersion,\n toVersion,\n data,\n hasMore,\n offset,\n } as SyncResponse,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Sync response created', {\n messageId: message.messageId,\n sessionId,\n itemCount: data.length,\n hasMore,\n });\n\n return message;\n }\n\n /**\n * Create acknowledgement message\n */\n createAckMessage(\n sender: string,\n receiver: string,\n messageId: string\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'ack',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: { acknowledgedMessageId: messageId },\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n return message;\n }\n\n /**\n * Create error message\n */\n createErrorMessage(\n sender: string,\n receiver: string,\n error: ProtocolError,\n relatedMessageId?: string\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'error',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n error,\n relatedMessageId,\n },\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n this.protocolErrors.push({\n error,\n timestamp: new Date().toISOString(),\n });\n this.schedulePersist();\n\n logger.error('[SyncProtocol] Error message created', {\n messageId: message.messageId,\n errorCode: error.code,\n recoverable: error.recoverable,\n });\n\n return message;\n }\n\n /**\n * Validate message\n */\n validateMessage(message: SyncMessage): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!message.type) {\n errors.push('Message type is required');\n }\n\n if (!message.sender) {\n errors.push('Sender is required');\n }\n\n if (!message.messageId) {\n errors.push('Message ID is required');\n }\n\n if (!message.timestamp) {\n errors.push('Timestamp is required');\n }\n\n const timestampValue = new Date(message.timestamp);\n if (Number.isNaN(timestampValue.getTime())) {\n errors.push('Invalid timestamp format');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Serialize message\n */\n serializeMessage(message: SyncMessage): string {\n try {\n return JSON.stringify(message);\n } catch (error) {\n logger.error('[SyncProtocol] Message serialization failed', {\n messageId: message.messageId,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw new Error(\n `Failed to serialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Deserialize message\n */\n deserializeMessage(data: string): SyncMessage {\n try {\n const message = JSON.parse(data) as SyncMessage;\n const validation = this.validateMessage(message);\n\n if (!validation.valid) {\n throw new Error(`Invalid message: ${validation.errors.join(', ')}`);\n }\n\n return message;\n } catch (error) {\n logger.error('[SyncProtocol] Message deserialization failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw new Error(\n `Failed to deserialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Process handshake\n */\n processHandshake(message: SyncMessage): Handshake {\n if (message.type !== 'handshake') {\n throw new Error('Message is not a handshake');\n }\n\n const handshake = message.payload as Handshake;\n const nodeId = message.sender;\n\n this.handshakes.set(nodeId, handshake);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Handshake processed', {\n nodeId,\n protocolVersion: handshake.protocolVersion,\n capabilities: handshake.capabilities.length,\n });\n\n return handshake;\n }\n\n /**\n * Get message\n */\n getMessage(messageId: string): SyncMessage | undefined {\n return this.messageMap.get(messageId);\n }\n\n /**\n * Get all messages\n */\n getAllMessages(): SyncMessage[] {\n return [...this.messageQueue];\n }\n\n /**\n * Get messages by type\n */\n getMessagesByType(type: SyncMessage['type']): SyncMessage[] {\n return this.messageQueue.filter((m) => m.type === type);\n }\n\n /**\n * Get messages from sender\n */\n getMessagesFromSender(sender: string): SyncMessage[] {\n return this.messageQueue.filter((m) => m.sender === sender);\n }\n\n /**\n * Get pending messages\n */\n getPendingMessages(receiver: string): SyncMessage[] {\n return this.messageQueue.filter((m) => m.receiver === receiver);\n }\n\n /**\n * Get handshakes\n */\n getHandshakes(): Map<string, Handshake> {\n return new Map(this.handshakes);\n }\n\n /**\n * Get protocol statistics\n */\n getStatistics() {\n const messagesByType: Record<string, number> = {};\n for (const message of this.messageQueue) {\n messagesByType[message.type] = (messagesByType[message.type] || 0) + 1;\n }\n\n const errorCount = this.protocolErrors.length;\n const recoverableErrors = this.protocolErrors.filter(\n (e) => e.error.recoverable\n ).length;\n\n return {\n totalMessages: this.messageQueue.length,\n messagesByType,\n totalHandshakes: this.handshakes.size,\n totalErrors: errorCount,\n recoverableErrors,\n unrecoverableErrors: errorCount - recoverableErrors,\n };\n }\n\n /**\n * Get protocol errors\n */\n getErrors(): Array<{ error: ProtocolError; timestamp: string }> {\n return [...this.protocolErrors];\n }\n\n /**\n * Persist protocol state for reconnect/replay.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const data: SyncProtocolPersistenceData = {\n protocolVersion: this.version,\n messageCounter: this.messageCounter,\n messageQueue: this.getAllMessages(),\n handshakes: Array.from(this.handshakes.entries()).map(\n ([nodeId, handshake]) => ({\n nodeId,\n handshake,\n })\n ),\n protocolErrors: this.getErrors(),\n };\n\n const envelope: PersistedEnvelope<SyncProtocolPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<SyncProtocolPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load protocol state from persistence.\n */\n async loadFromPersistence(): Promise<{\n messages: number;\n handshakes: number;\n errors: number;\n }> {\n if (!this.persistence) {\n return { messages: 0, handshakes: 0, errors: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { messages: 0, handshakes: 0, errors: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<SyncProtocolPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid sync protocol persistence payload');\n }\n if (\n !Array.isArray(envelope.data.messageQueue) ||\n !Array.isArray(envelope.data.handshakes) ||\n !Array.isArray(envelope.data.protocolErrors)\n ) {\n throw new Error('Invalid sync protocol persistence structure');\n }\n\n const nextMessages: SyncMessage[] = [];\n for (const message of envelope.data.messageQueue) {\n const validation = this.validateMessage(message);\n if (!validation.valid) {\n throw new Error(\n `Invalid persisted message ${\n message?.messageId ?? 'unknown'\n }: ${validation.errors.join(', ')}`\n );\n }\n nextMessages.push(message);\n }\n\n const nextHandshakes = new Map<string, Handshake>();\n for (const entry of envelope.data.handshakes) {\n if (\n typeof entry.nodeId !== 'string' ||\n !this.isValidHandshake(entry.handshake)\n ) {\n throw new Error('Invalid persisted handshake payload');\n }\n nextHandshakes.set(entry.nodeId, entry.handshake);\n }\n\n const nextErrors: Array<{ error: ProtocolError; timestamp: string }> = [];\n for (const entry of envelope.data.protocolErrors) {\n if (!this.isValidProtocolErrorEntry(entry)) {\n throw new Error('Invalid persisted protocol error payload');\n }\n nextErrors.push(entry);\n }\n\n this.messageQueue = nextMessages;\n this.messageMap = new Map(nextMessages.map((m) => [m.messageId, m]));\n this.handshakes = nextHandshakes;\n this.protocolErrors = nextErrors;\n this.messageCounter = Math.max(\n envelope.data.messageCounter || 0,\n this.messageQueue.length\n );\n\n logger.debug('[SyncProtocol] Loaded from persistence', {\n key: this.persistence.key,\n messages: this.messageQueue.length,\n handshakes: this.handshakes.size,\n errors: this.protocolErrors.length,\n });\n\n return {\n messages: this.messageQueue.length,\n handshakes: this.handshakes.size,\n errors: this.protocolErrors.length,\n };\n }\n\n /**\n * Clear persisted protocol checkpoint.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[SyncProtocol] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidHandshake(value: unknown): value is Handshake {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const handshake = value as Partial<Handshake>;\n const validState =\n handshake.state === 'initiating' ||\n handshake.state === 'responding' ||\n handshake.state === 'completed';\n\n return (\n typeof handshake.protocolVersion === 'string' &&\n typeof handshake.nodeId === 'string' &&\n Array.isArray(handshake.capabilities) &&\n handshake.capabilities.every((cap) => typeof cap === 'string') &&\n validState\n );\n }\n\n private isValidProtocolErrorEntry(\n entry: unknown\n ): entry is { error: ProtocolError; timestamp: string } {\n if (typeof entry !== 'object' || entry === null) {\n return false;\n }\n const candidate = entry as {\n error?: Partial<ProtocolError>;\n timestamp?: string;\n };\n return (\n typeof candidate.timestamp === 'string' &&\n typeof candidate.error?.code === 'string' &&\n typeof candidate.error.message === 'string' &&\n typeof candidate.error.recoverable === 'boolean'\n );\n }\n\n /**\n * Generate message ID\n */\n private generateMessageId(): string {\n this.messageCounter++;\n return `msg-${Date.now()}-${this.messageCounter}`;\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.messageQueue = [];\n this.messageMap.clear();\n this.handshakes.clear();\n this.protocolErrors = [];\n this.messageCounter = 0;\n this.cryptoProvider = null;\n this.cryptoConfig = null;\n this.schedulePersist();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * State Reconciler\n *\n * Reconciles conflicting state across multiple nodes in a distributed system.\n * Applies merge strategies and resolves divergent state.\n *\n * Features:\n * - State comparison and diff generation\n * - Multiple merge strategies (last-write-wins, vector-clock based, custom)\n * - Conflict detection and resolution\n * - State validation and verification\n * - Version tracking\n * - Cryptographic verification of state versions\n * - Signed state for tamper detection\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { SignedSyncData } from '../crypto/types';\n\nexport interface StateVersion {\n version: string;\n timestamp: string;\n nodeId: string;\n hash: string;\n data: unknown;\n // Cryptographic fields for signed versions\n signerDID?: string;\n signature?: string;\n signedAt?: number;\n}\n\nexport interface StateDiff {\n added: Record<string, unknown>;\n modified: Record<string, { old: unknown; new: unknown }>;\n removed: string[];\n timestamp: string;\n}\n\nexport interface ReconciliationResult {\n success: boolean;\n mergedState: unknown;\n conflictsResolved: number;\n strategy: string;\n timestamp: string;\n}\n\nexport type MergeStrategy =\n | 'last-write-wins'\n | 'vector-clock'\n | 'majority-vote'\n | 'custom';\n\n/**\n * State Reconciler\n * Reconciles state conflicts across distributed nodes\n */\nexport class StateReconciler {\n private stateVersions: Map<string, StateVersion[]> = new Map();\n private reconciliationHistory: ReconciliationResult[] = [];\n private cryptoProvider: ICryptoProvider | null = null;\n private requireSignedVersions: boolean = false;\n\n /**\n * Configure cryptographic provider for signed state versions\n */\n configureCrypto(\n provider: ICryptoProvider,\n requireSigned: boolean = false\n ): void {\n this.cryptoProvider = provider;\n this.requireSignedVersions = requireSigned;\n\n logger.debug('[StateReconciler] Crypto configured', {\n initialized: provider.isInitialized(),\n requireSigned,\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Record a signed state version with cryptographic verification\n */\n async recordSignedStateVersion(\n key: string,\n version: string,\n data: unknown\n ): Promise<StateVersion> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n if (!localDID) {\n throw new Error('Local DID not available');\n }\n\n // Hash the data\n const dataBytes = new TextEncoder().encode(JSON.stringify(data));\n const hashBytes = await this.cryptoProvider.hash(dataBytes);\n const hash = Array.from(hashBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Sign the version\n const versionData = { version, data, hash };\n const signed = await this.cryptoProvider.signData(versionData);\n\n const stateVersion: StateVersion = {\n version,\n timestamp: new Date().toISOString(),\n nodeId: localDID,\n hash,\n data,\n signerDID: localDID,\n signature: signed.signature,\n signedAt: signed.signedAt,\n };\n\n if (!this.stateVersions.has(key)) {\n this.stateVersions.set(key, []);\n }\n\n this.stateVersions.get(key)!.push(stateVersion);\n\n logger.debug('[StateReconciler] Signed state version recorded', {\n key,\n version,\n signerDID: localDID,\n hash: hash.slice(0, 16) + '...',\n });\n\n return stateVersion;\n }\n\n /**\n * Verify a state version's signature\n */\n async verifyStateVersion(\n version: StateVersion\n ): Promise<{ valid: boolean; error?: string }> {\n // If no signature, verify based on hash only\n if (!version.signature || !version.signerDID) {\n if (this.requireSignedVersions) {\n return { valid: false, error: 'Signature required but not present' };\n }\n\n // Verify hash matches data\n const dataBytes = new TextEncoder().encode(JSON.stringify(version.data));\n if (this.cryptoProvider) {\n const hashBytes = await this.cryptoProvider.hash(dataBytes);\n const computedHash = Array.from(hashBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n if (computedHash !== version.hash) {\n return { valid: false, error: 'Hash mismatch' };\n }\n }\n\n return { valid: true };\n }\n\n // Verify signature\n if (!this.cryptoProvider) {\n return { valid: false, error: 'Crypto provider not configured' };\n }\n\n const versionData = {\n version: version.version,\n data: version.data,\n hash: version.hash,\n };\n\n const signed: SignedSyncData<typeof versionData> = {\n payload: versionData,\n signature: version.signature,\n signer: version.signerDID,\n algorithm: 'ES256',\n signedAt: version.signedAt || Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n return { valid: false, error: 'Invalid signature' };\n }\n\n return { valid: true };\n }\n\n /**\n * Reconcile with verification - only accept verified versions\n */\n async reconcileWithVerification(\n key: string,\n strategy: MergeStrategy = 'last-write-wins'\n ): Promise<ReconciliationResult & { verificationErrors: string[] }> {\n const versions = this.stateVersions.get(key) || [];\n const verifiedVersions: StateVersion[] = [];\n const verificationErrors: string[] = [];\n\n // Verify all versions\n for (const version of versions) {\n const result = await this.verifyStateVersion(version);\n if (result.valid) {\n verifiedVersions.push(version);\n } else {\n verificationErrors.push(\n `Version ${version.version} from ${version.nodeId}: ${result.error}`\n );\n logger.warn('[StateReconciler] Version verification failed', {\n version: version.version,\n nodeId: version.nodeId,\n error: result.error,\n });\n }\n }\n\n if (verifiedVersions.length === 0) {\n return {\n success: false,\n mergedState: null,\n conflictsResolved: 0,\n strategy,\n timestamp: new Date().toISOString(),\n verificationErrors,\n };\n }\n\n // Apply reconciliation strategy\n let result: ReconciliationResult;\n switch (strategy) {\n case 'last-write-wins':\n result = this.reconcileLastWriteWins(verifiedVersions);\n break;\n case 'vector-clock':\n result = this.reconcileVectorClock(verifiedVersions);\n break;\n case 'majority-vote':\n result = this.reconcileMajorityVote(verifiedVersions);\n break;\n default:\n result = this.reconcileLastWriteWins(verifiedVersions);\n }\n\n return { ...result, verificationErrors };\n }\n\n /**\n * Record a state version\n */\n recordStateVersion(\n key: string,\n version: string,\n timestamp: string,\n nodeId: string,\n hash: string,\n data: unknown\n ): void {\n if (!this.stateVersions.has(key)) {\n this.stateVersions.set(key, []);\n }\n\n const versions = this.stateVersions.get(key)!;\n versions.push({\n version,\n timestamp,\n nodeId,\n hash,\n data,\n });\n\n logger.debug('[StateReconciler] State version recorded', {\n key,\n version,\n nodeId,\n hash,\n });\n }\n\n /**\n * Detect conflicts in state versions\n */\n detectConflicts(key: string): boolean {\n const versions = this.stateVersions.get(key);\n if (!versions || versions.length <= 1) {\n return false;\n }\n\n const hashes = new Set(versions.map((v) => v.hash));\n return hashes.size > 1;\n }\n\n /**\n * Compare two states and generate diff\n */\n compareStates(\n state1: Record<string, unknown>,\n state2: Record<string, unknown>\n ): StateDiff {\n const diff: StateDiff = {\n added: {},\n modified: {},\n removed: [],\n timestamp: new Date().toISOString(),\n };\n\n // Find added and modified\n for (const [key, value] of Object.entries(state2)) {\n if (!(key in state1)) {\n diff.added[key] = value;\n } else if (JSON.stringify(state1[key]) !== JSON.stringify(value)) {\n diff.modified[key] = { old: state1[key], new: value };\n }\n }\n\n // Find removed\n for (const key of Object.keys(state1)) {\n if (!(key in state2)) {\n diff.removed.push(key);\n }\n }\n\n return diff;\n }\n\n /**\n * Reconcile states using last-write-wins strategy\n */\n reconcileLastWriteWins(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // Sort by timestamp descending, most recent first\n const sorted = [...versions].sort(\n (a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n const latest = sorted[0];\n const conflictsResolved = versions.length - 1;\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: latest.data,\n conflictsResolved,\n strategy: 'last-write-wins',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (last-write-wins)', {\n winnerNode: latest.nodeId,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Reconcile states using vector clock strategy\n */\n reconcileVectorClock(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // For vector clock, use the version with highest timestamp\n // In production, this would use actual vector clocks\n const sorted = [...versions].sort(\n (a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n const latest = sorted[0];\n let conflictsResolved = 0;\n\n // Count concurrent versions (those with similar timestamps)\n for (const v of versions) {\n const timeDiff = Math.abs(\n new Date(v.timestamp).getTime() - new Date(latest.timestamp).getTime()\n );\n if (timeDiff > 100) {\n // More than 100ms difference\n conflictsResolved++;\n }\n }\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: latest.data,\n conflictsResolved,\n strategy: 'vector-clock',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (vector-clock)', {\n winnerVersion: latest.version,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Reconcile states using majority vote strategy\n */\n reconcileMajorityVote(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // Group versions by hash\n const hashGroups: Map<string, StateVersion[]> = new Map();\n for (const version of versions) {\n if (!hashGroups.has(version.hash)) {\n hashGroups.set(version.hash, []);\n }\n hashGroups.get(version.hash)!.push(version);\n }\n\n // Find the majority\n let majorityVersion: StateVersion | null = null;\n let maxCount = 0;\n\n for (const [, versionGroup] of hashGroups) {\n if (versionGroup.length > maxCount) {\n maxCount = versionGroup.length;\n majorityVersion = versionGroup[0];\n }\n }\n\n if (!majorityVersion) {\n majorityVersion = versions[0];\n }\n\n const conflictsResolved = versions.length - maxCount;\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: majorityVersion.data,\n conflictsResolved,\n strategy: 'majority-vote',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (majority-vote)', {\n majorityCount: maxCount,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Merge multiple states\n */\n mergeStates(states: Record<string, unknown>[]): unknown {\n if (states.length === 0) {\n return {};\n }\n\n if (states.length === 1) {\n return states[0];\n }\n\n // Simple merge: take all keys, preferring later states\n const merged: Record<string, unknown> = {};\n\n for (const state of states) {\n if (typeof state === 'object' && state !== null) {\n Object.assign(merged, state);\n }\n }\n\n return merged;\n }\n\n /**\n * Validate state after reconciliation\n */\n validateState(state: unknown): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (state === null) {\n errors.push('State is null');\n } else if (state === undefined) {\n errors.push('State is undefined');\n } else if (typeof state !== 'object') {\n errors.push('State is not an object');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get state versions for a key\n */\n getStateVersions(key: string): StateVersion[] {\n return this.stateVersions.get(key) || [];\n }\n\n /**\n * Get all state versions\n */\n getAllStateVersions(): Record<string, StateVersion[]> {\n const result: Record<string, StateVersion[]> = {};\n\n for (const [key, versions] of this.stateVersions) {\n result[key] = [...versions];\n }\n\n return result;\n }\n\n /**\n * Get reconciliation history\n */\n getReconciliationHistory(): ReconciliationResult[] {\n return [...this.reconciliationHistory];\n }\n\n /**\n * Get reconciliation statistics\n */\n getStatistics() {\n const resolvedConflicts = this.reconciliationHistory.reduce(\n (sum, r) => sum + r.conflictsResolved,\n 0\n );\n\n const strategyUsage: Record<string, number> = {};\n for (const result of this.reconciliationHistory) {\n strategyUsage[result.strategy] =\n (strategyUsage[result.strategy] || 0) + 1;\n }\n\n return {\n totalReconciliations: this.reconciliationHistory.length,\n successfulReconciliations: this.reconciliationHistory.filter(\n (r) => r.success\n ).length,\n totalConflictsResolved: resolvedConflicts,\n averageConflictsPerReconciliation:\n this.reconciliationHistory.length > 0\n ? resolvedConflicts / this.reconciliationHistory.length\n : 0,\n strategyUsage,\n trackedKeys: this.stateVersions.size,\n };\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.stateVersions.clear();\n this.reconciliationHistory = [];\n this.cryptoProvider = null;\n this.requireSignedVersions = false;\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Offline Operation Queue (Phase 11)\n *\n * Manages pending operations for offline-first clients.\n * Provides priority-based queuing, persistence, and retry logic.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { getLogger } from '../utils/logger';\nimport type { Operation, OperationPriority } from '../core/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nconst logger = getLogger();\n\n// Re-export OperationPriority from core\nexport type { OperationPriority } from '../core/types';\n\nexport interface OfflineOperation {\n id: string;\n type: Operation['type'];\n data: Record<string, unknown>;\n sessionId: string;\n priority: OperationPriority;\n createdAt: number;\n retryCount: number;\n maxRetries: number;\n lastError?: string;\n status: 'pending' | 'syncing' | 'failed' | 'synced';\n}\n\nexport interface OfflineQueueStats {\n pending: number;\n syncing: number;\n failed: number;\n synced: number;\n totalOperations: number;\n oldestPendingMs: number;\n averageRetries: number;\n}\n\nexport interface OfflineQueueEvents {\n 'operation-added': (operation: OfflineOperation) => void;\n 'operation-synced': (operation: OfflineOperation) => void;\n 'operation-failed': (operation: OfflineOperation, error: Error) => void;\n 'queue-empty': () => void;\n 'sync-started': () => void;\n 'sync-completed': (stats: { synced: number; failed: number }) => void;\n}\n\nexport interface OfflineQueuePersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<OfflineOperation[]>;\n deserializer?: PersistenceDeserializer<OfflineOperation[]>;\n}\n\nexport interface OfflineOperationQueueOptions {\n maxQueueSize?: number;\n defaultMaxRetries?: number;\n persistence?: OfflineQueuePersistenceConfig;\n}\n\n// ============================================================================\n// Offline Operation Queue\n// ============================================================================\n\nexport class OfflineOperationQueue extends EventEmitter<OfflineQueueEvents> {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:offline-queue:v1';\n private queue: Map<string, OfflineOperation> = new Map();\n private syncingIds: Set<string> = new Set();\n private maxQueueSize = 1000;\n private defaultMaxRetries = 3;\n private persistence:\n | (OfflineQueuePersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(\n maxQueueSizeOrOptions: number | OfflineOperationQueueOptions = 1000,\n defaultMaxRetries = 3\n ) {\n super();\n\n if (typeof maxQueueSizeOrOptions === 'number') {\n this.maxQueueSize = maxQueueSizeOrOptions;\n this.defaultMaxRetries = defaultMaxRetries;\n } else {\n this.maxQueueSize = maxQueueSizeOrOptions.maxQueueSize ?? 1000;\n this.defaultMaxRetries = maxQueueSizeOrOptions.defaultMaxRetries ?? 3;\n\n if (maxQueueSizeOrOptions.persistence) {\n this.persistence = {\n ...maxQueueSizeOrOptions.persistence,\n key:\n maxQueueSizeOrOptions.persistence.key ??\n OfflineOperationQueue.DEFAULT_PERSIST_KEY,\n autoPersist: maxQueueSizeOrOptions.persistence.autoPersist ?? true,\n autoLoad: maxQueueSizeOrOptions.persistence.autoLoad ?? false,\n persistDebounceMs:\n maxQueueSizeOrOptions.persistence.persistDebounceMs ?? 25,\n };\n\n if (this.persistence.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[OfflineOperationQueue] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n }\n\n logger.debug('[OfflineOperationQueue] Initialized', {\n maxQueueSize: this.maxQueueSize,\n defaultMaxRetries: this.defaultMaxRetries,\n persistenceEnabled: this.persistence !== null,\n });\n }\n\n /**\n * Add operation to the queue\n */\n enqueue(\n type: Operation['type'],\n data: Record<string, unknown>,\n sessionId: string,\n priority: OperationPriority = 'normal',\n maxRetries?: number\n ): OfflineOperation {\n if (this.queue.size >= this.maxQueueSize) {\n // Remove oldest low-priority operation\n const oldest = this.findOldestLowPriority();\n if (oldest) {\n this.queue.delete(oldest.id);\n logger.warn('[OfflineOperationQueue] Queue full, removed oldest', {\n removedId: oldest.id,\n });\n }\n }\n\n const operation: OfflineOperation = {\n id: `op-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type,\n data,\n sessionId,\n priority,\n createdAt: Date.now(),\n retryCount: 0,\n maxRetries: maxRetries ?? this.defaultMaxRetries,\n status: 'pending',\n };\n\n this.queue.set(operation.id, operation);\n this.emit('operation-added', operation);\n this.schedulePersist();\n\n logger.debug('[OfflineOperationQueue] Operation enqueued', {\n id: operation.id,\n type,\n priority,\n queueSize: this.queue.size,\n });\n\n return operation;\n }\n\n /**\n * Get next operations to sync (by priority)\n */\n getNextBatch(batchSize = 10): OfflineOperation[] {\n const pending = Array.from(this.queue.values())\n .filter((op) => op.status === 'pending' && !this.syncingIds.has(op.id))\n .sort((a, b) => {\n // Sort by priority first, then by creation time\n const priorityOrder = { high: 0, normal: 1, low: 2 };\n const priorityDiff =\n priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n\n return pending.slice(0, batchSize);\n }\n\n /**\n * Mark operations as syncing\n */\n markSyncing(operationIds: string[]): void {\n let changed = false;\n for (const id of operationIds) {\n const op = this.queue.get(id);\n if (op) {\n op.status = 'syncing';\n this.syncingIds.add(id);\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Mark operation as synced\n */\n markSynced(operationId: string): void {\n const op = this.queue.get(operationId);\n if (op) {\n op.status = 'synced';\n this.syncingIds.delete(operationId);\n this.emit('operation-synced', op);\n this.schedulePersist();\n\n // Remove synced operations after short delay\n setTimeout(() => {\n this.queue.delete(operationId);\n this.schedulePersist();\n if (this.getPendingCount() === 0) {\n this.emit('queue-empty');\n }\n }, 1000);\n }\n }\n\n /**\n * Mark operation as failed\n */\n markFailed(operationId: string, error: Error): void {\n const op = this.queue.get(operationId);\n if (op) {\n op.retryCount++;\n op.lastError = error.message;\n this.syncingIds.delete(operationId);\n\n if (op.retryCount >= op.maxRetries) {\n op.status = 'failed';\n this.emit('operation-failed', op, error);\n logger.error('[OfflineOperationQueue] Operation permanently failed', {\n id: operationId,\n retries: op.retryCount,\n error: error.message,\n });\n } else {\n op.status = 'pending';\n logger.warn('[OfflineOperationQueue] Operation failed, will retry', {\n id: operationId,\n retryCount: op.retryCount,\n maxRetries: op.maxRetries,\n });\n }\n\n this.schedulePersist();\n }\n }\n\n /**\n * Get operation by ID\n */\n getOperation(operationId: string): OfflineOperation | undefined {\n return this.queue.get(operationId);\n }\n\n /**\n * Get all pending operations\n */\n getPendingOperations(): OfflineOperation[] {\n return Array.from(this.queue.values()).filter(\n (op) => op.status === 'pending'\n );\n }\n\n /**\n * Get pending count\n */\n getPendingCount(): number {\n return Array.from(this.queue.values()).filter(\n (op) => op.status === 'pending'\n ).length;\n }\n\n /**\n * Get queue statistics\n */\n getStats(): OfflineQueueStats {\n const operations = Array.from(this.queue.values());\n\n const pending = operations.filter((op) => op.status === 'pending').length;\n const syncing = operations.filter((op) => op.status === 'syncing').length;\n const failed = operations.filter((op) => op.status === 'failed').length;\n const synced = operations.filter((op) => op.status === 'synced').length;\n\n const pendingOps = operations.filter((op) => op.status === 'pending');\n const oldestPendingMs =\n pendingOps.length > 0\n ? Date.now() - Math.min(...pendingOps.map((op) => op.createdAt))\n : 0;\n\n const averageRetries =\n operations.length > 0\n ? operations.reduce((sum, op) => sum + op.retryCount, 0) /\n operations.length\n : 0;\n\n return {\n pending,\n syncing,\n failed,\n synced,\n totalOperations: operations.length,\n oldestPendingMs,\n averageRetries,\n };\n }\n\n /**\n * Clear all operations\n */\n clear(): void {\n this.queue.clear();\n this.syncingIds.clear();\n this.schedulePersist();\n logger.debug('[OfflineOperationQueue] Queue cleared');\n }\n\n /**\n * Clear failed operations\n */\n clearFailed(): void {\n let changed = false;\n for (const [id, op] of this.queue.entries()) {\n if (op.status === 'failed') {\n this.queue.delete(id);\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Retry failed operations\n */\n retryFailed(): void {\n let changed = false;\n for (const op of this.queue.values()) {\n if (op.status === 'failed') {\n op.status = 'pending';\n op.retryCount = 0;\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Find oldest low-priority operation\n */\n private findOldestLowPriority(): OfflineOperation | null {\n const lowPriority = Array.from(this.queue.values())\n .filter((op) => op.priority === 'low' && op.status === 'pending')\n .sort((a, b) => a.createdAt - b.createdAt);\n\n return lowPriority[0] ?? null;\n }\n\n /**\n * Export queue for persistence\n */\n export(): OfflineOperation[] {\n return Array.from(this.queue.values());\n }\n\n /**\n * Import queue from persistence\n */\n import(operations: OfflineOperation[]): void {\n this.queue.clear();\n this.syncingIds.clear();\n\n for (const op of operations) {\n if (this.isValidOfflineOperation(op)) {\n this.queue.set(op.id, {\n ...op,\n status: op.status === 'syncing' ? 'pending' : op.status,\n });\n }\n }\n\n this.schedulePersist();\n\n logger.debug('[OfflineOperationQueue] Imported operations', {\n count: this.queue.size,\n });\n }\n\n /**\n * Persist current queue snapshot.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const envelope: PersistedEnvelope<OfflineOperation[]> = {\n version: 1,\n updatedAt: Date.now(),\n data: this.export(),\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<OfflineOperation[]>) => JSON.stringify(value));\n const raw = serialize(envelope);\n\n await this.persistence.adapter.setItem(this.persistence.key, raw);\n }\n\n /**\n * Load queue snapshot from persistence.\n */\n async loadFromPersistence(): Promise<number> {\n if (!this.persistence) {\n return 0;\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return 0;\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<OfflineOperation[]>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !Array.isArray(envelope.data)) {\n throw new Error('Invalid offline queue persistence payload');\n }\n\n this.queue.clear();\n this.syncingIds.clear();\n\n let imported = 0;\n for (const operation of envelope.data) {\n if (this.isValidOfflineOperation(operation)) {\n this.queue.set(operation.id, {\n ...operation,\n status: operation.status === 'syncing' ? 'pending' : operation.status,\n });\n imported++;\n }\n }\n\n logger.debug('[OfflineOperationQueue] Loaded from persistence', {\n key: this.persistence.key,\n imported,\n });\n\n return imported;\n }\n\n /**\n * Remove persisted queue snapshot.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[OfflineOperationQueue] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidOfflineOperation(value: unknown): value is OfflineOperation {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const candidate = value as Partial<OfflineOperation>;\n const validType =\n candidate.type === 'create' ||\n candidate.type === 'update' ||\n candidate.type === 'delete' ||\n candidate.type === 'sync' ||\n candidate.type === 'batch';\n const validPriority =\n candidate.priority === 'high' ||\n candidate.priority === 'normal' ||\n candidate.priority === 'low';\n const validStatus =\n candidate.status === 'pending' ||\n candidate.status === 'syncing' ||\n candidate.status === 'failed' ||\n candidate.status === 'synced';\n\n return (\n typeof candidate.id === 'string' &&\n validType &&\n typeof candidate.data === 'object' &&\n candidate.data !== null &&\n !Array.isArray(candidate.data) &&\n typeof candidate.sessionId === 'string' &&\n validPriority &&\n typeof candidate.createdAt === 'number' &&\n typeof candidate.retryCount === 'number' &&\n typeof candidate.maxRetries === 'number' &&\n validStatus\n );\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet offlineQueueInstance: OfflineOperationQueue | null = null;\n\nexport function getOfflineOperationQueue(): OfflineOperationQueue {\n if (!offlineQueueInstance) {\n offlineQueueInstance = new OfflineOperationQueue();\n }\n return offlineQueueInstance;\n}\n\nexport function resetOfflineOperationQueue(): void {\n offlineQueueInstance = null;\n}\n","/**\n * Compression Engine (Phase 12)\n *\n * Provides compression for delta operations using native CompressionStream API.\n * Falls back gracefully when native compression is unavailable.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompressedBatch {\n id: string;\n compressed: Uint8Array;\n originalSize: number;\n compressedSize: number;\n compressionRatio: number;\n algorithm: 'gzip' | 'deflate' | 'none';\n timestamp: number;\n}\n\nexport interface CompressedChunk {\n chunkId: string;\n batchId: string;\n data: Uint8Array;\n index: number;\n total: number;\n checksum: string;\n}\n\nexport interface CompressionStats {\n totalCompressed: number;\n totalDecompressed: number;\n totalOriginalBytes: number;\n totalCompressedBytes: number;\n averageCompressionRatio: number;\n compressionTimeMs: number;\n decompressionTimeMs: number;\n}\n\n// ============================================================================\n// Compression Engine\n// ============================================================================\n\nexport class CompressionEngine {\n private stats: CompressionStats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n private preferredAlgorithm: 'gzip' | 'deflate' = 'gzip';\n\n constructor(preferredAlgorithm: 'gzip' | 'deflate' = 'gzip') {\n this.preferredAlgorithm = preferredAlgorithm;\n logger.debug('[CompressionEngine] Initialized', {\n algorithm: preferredAlgorithm,\n supportsNative: this.supportsNativeCompression(),\n });\n }\n\n /**\n * Check if native compression is available\n */\n supportsNativeCompression(): boolean {\n return (\n typeof CompressionStream !== 'undefined' &&\n typeof DecompressionStream !== 'undefined'\n );\n }\n\n /**\n * Compress data\n */\n async compress(data: Uint8Array | string): Promise<CompressedBatch> {\n const startTime = performance.now();\n\n const inputData =\n typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const originalSize = inputData.byteLength;\n\n let compressed: Uint8Array;\n let algorithm: 'gzip' | 'deflate' | 'none' = this.preferredAlgorithm;\n\n if (this.supportsNativeCompression()) {\n try {\n compressed = await this.compressNative(\n inputData,\n this.preferredAlgorithm\n );\n } catch (error) {\n logger.warn(\n '[CompressionEngine] Native compression failed, using fallback',\n error\n );\n compressed = inputData;\n algorithm = 'none';\n }\n } else {\n // No native compression - return uncompressed\n compressed = inputData;\n algorithm = 'none';\n }\n\n const compressionRatio =\n originalSize > 0 ? 1 - compressed.byteLength / originalSize : 0;\n\n const batch: CompressedBatch = {\n id: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n compressed,\n originalSize,\n compressedSize: compressed.byteLength,\n compressionRatio,\n algorithm,\n timestamp: Date.now(),\n };\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalCompressed++;\n this.stats.totalOriginalBytes += originalSize;\n this.stats.totalCompressedBytes += compressed.byteLength;\n this.stats.compressionTimeMs += elapsed;\n this.updateAverageRatio();\n\n logger.debug('[CompressionEngine] Compressed', {\n original: originalSize,\n compressed: compressed.byteLength,\n ratio: (compressionRatio * 100).toFixed(1) + '%',\n algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return batch;\n }\n\n /**\n * Decompress data\n */\n async decompress(batch: CompressedBatch): Promise<Uint8Array> {\n const startTime = performance.now();\n\n let decompressed: Uint8Array;\n\n if (batch.algorithm === 'none') {\n decompressed = batch.compressed;\n } else if (this.supportsNativeCompression()) {\n try {\n decompressed = await this.decompressNative(\n batch.compressed,\n batch.algorithm\n );\n } catch (error) {\n logger.warn('[CompressionEngine] Native decompression failed', error);\n throw error;\n }\n } else {\n throw new Error('Native decompression not available');\n }\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalDecompressed++;\n this.stats.decompressionTimeMs += elapsed;\n\n logger.debug('[CompressionEngine] Decompressed', {\n compressed: batch.compressedSize,\n decompressed: decompressed.byteLength,\n algorithm: batch.algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return decompressed;\n }\n\n /**\n * Compress using native CompressionStream\n */\n private async compressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new CompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Decompress using native DecompressionStream\n */\n private async decompressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new DecompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Split compressed batch into chunks for transmission\n */\n splitIntoChunks(\n batch: CompressedBatch,\n chunkSize = 64 * 1024\n ): CompressedChunk[] {\n const chunks: CompressedChunk[] = [];\n const data = batch.compressed;\n const total = Math.ceil(data.byteLength / chunkSize);\n\n for (let i = 0; i < total; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, data.byteLength);\n const chunkData = data.slice(start, end);\n\n chunks.push({\n chunkId: `${batch.id}-chunk-${i}`,\n batchId: batch.id,\n data: chunkData,\n index: i,\n total,\n checksum: this.simpleChecksum(chunkData),\n });\n }\n\n return chunks;\n }\n\n /**\n * Reassemble chunks into compressed batch\n */\n reassembleChunks(chunks: CompressedChunk[]): Uint8Array {\n // Sort by index\n const sorted = [...chunks].sort((a, b) => a.index - b.index);\n\n // Verify all chunks present\n const total = sorted[0]?.total ?? 0;\n if (sorted.length !== total) {\n throw new Error(\n `Missing chunks: got ${sorted.length}, expected ${total}`\n );\n }\n\n // Combine\n const totalLength = sorted.reduce(\n (sum, chunk) => sum + chunk.data.length,\n 0\n );\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of sorted) {\n combined.set(chunk.data, offset);\n offset += chunk.data.length;\n }\n\n return combined;\n }\n\n /**\n * Simple checksum for chunk verification\n */\n private simpleChecksum(data: Uint8Array): string {\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + data[i]) | 0;\n }\n return hash.toString(16);\n }\n\n /**\n * Update average compression ratio\n */\n private updateAverageRatio(): void {\n if (this.stats.totalOriginalBytes > 0) {\n this.stats.averageCompressionRatio =\n 1 - this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): CompressionStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet compressionEngineInstance: CompressionEngine | null = null;\n\nexport function getCompressionEngine(): CompressionEngine {\n if (!compressionEngineInstance) {\n compressionEngineInstance = new CompressionEngine();\n }\n return compressionEngineInstance;\n}\n\nexport function resetCompressionEngine(): void {\n compressionEngineInstance = null;\n}\n","/**\n * Delta Sync Optimizer (Phase 12)\n *\n * Implements field-level change detection to reduce payload size.\n * Computes delta between current and previous operation state.\n *\n * Performance Impact:\n * - Delta sync alone: 70-80% payload reduction\n * - Combined with compression: 80-90% total reduction\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Delta operation - represents only changed fields\n */\nexport interface DeltaOperation {\n id: string;\n type: 'full' | 'delta';\n operationId: string;\n operationType: Operation['type'];\n sessionId: string;\n timestamp: number;\n changes?: Record<string, unknown>; // Only for delta type\n changeMask?: string[]; // Field names that changed\n fullData?: Record<string, unknown>; // Only for full type (new records)\n priority?: 'high' | 'normal' | 'low';\n}\n\n/**\n * Batch of delta operations\n */\nexport interface DeltaBatch {\n batchId: string;\n operations: DeltaOperation[];\n timestamp: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n reductionPercent: number;\n}\n\n/**\n * Statistics about delta sync performance\n */\nexport interface DeltaStats {\n totalOperations: number;\n totalFull: number;\n totalDelta: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n averageReductionPercent: number;\n lastSyncTime: number;\n fullOperationThreshold: number;\n}\n\n// ============================================================================\n// Delta Sync Optimizer\n// ============================================================================\n\nexport class DeltaSyncOptimizer {\n private operationHistory: Map<string, Operation> = new Map();\n private stats: DeltaStats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: 1000, // Force full if delta > 1KB\n };\n\n constructor(fullOperationThreshold = 1000) {\n this.stats.fullOperationThreshold = fullOperationThreshold;\n logger.debug('[DeltaSyncOptimizer] Initialized', {\n threshold: fullOperationThreshold,\n });\n }\n\n /**\n * Compute delta for single operation\n */\n computeDelta(operation: Operation): DeltaOperation {\n const operationJson = JSON.stringify(operation);\n const originalSize = new TextEncoder().encode(operationJson).byteLength;\n\n // Check if we have historical state\n const previous = this.operationHistory.get(operation.id);\n\n if (!previous) {\n // New operation - return as full\n const delta: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'full',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n fullData: operation.data,\n priority: operation.priority,\n };\n\n // Update stats\n this.stats.totalOperations++;\n this.stats.totalFull++;\n this.stats.totalOriginalSize += originalSize;\n\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(delta)\n ).byteLength;\n this.stats.totalDeltaSize += deltaSize;\n\n // Store in history\n this.operationHistory.set(operation.id, operation);\n\n return delta;\n }\n\n // Compare with previous - extract changed fields\n const changes: Record<string, unknown> = {};\n const changeMask: string[] = [];\n let hasMeaningfulChanges = false;\n\n for (const [key, value] of Object.entries(operation.data)) {\n const oldValue = previous.data[key];\n\n if (!this.deepEqual(value, oldValue)) {\n changes[key] = value;\n changeMask.push(key);\n hasMeaningfulChanges = true;\n }\n }\n\n // Check for deleted fields\n for (const key of Object.keys(previous.data)) {\n if (!(key in operation.data)) {\n changes[key] = null;\n changeMask.push(`${key}:deleted`);\n hasMeaningfulChanges = true;\n }\n }\n\n // Build delta operation\n const deltaData: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'delta',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n changes: hasMeaningfulChanges ? changes : undefined,\n changeMask: hasMeaningfulChanges ? changeMask : undefined,\n priority: operation.priority,\n };\n\n // If delta is too large, send as full instead\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(deltaData)\n ).byteLength;\n\n const finalDelta =\n deltaSize > this.stats.fullOperationThreshold\n ? {\n ...deltaData,\n type: 'full' as const,\n fullData: operation.data,\n changes: undefined,\n changeMask: undefined,\n }\n : deltaData;\n\n // Update stats\n this.stats.totalOperations++;\n if (finalDelta.type === 'full') {\n this.stats.totalFull++;\n } else {\n this.stats.totalDelta++;\n }\n\n this.stats.totalOriginalSize += originalSize;\n this.stats.totalDeltaSize += deltaSize;\n\n // Update history\n this.operationHistory.set(operation.id, operation);\n\n return finalDelta;\n }\n\n /**\n * Compute deltas for batch of operations\n */\n computeBatchDeltas(operations: Operation[]): DeltaBatch {\n const deltas = operations.map((op) => this.computeDelta(op));\n\n const totalOriginalSize = operations.reduce(\n (sum, op) =>\n sum + new TextEncoder().encode(JSON.stringify(op)).byteLength,\n 0\n );\n\n const totalDeltaSize = deltas.reduce(\n (sum, delta) =>\n sum + new TextEncoder().encode(JSON.stringify(delta)).byteLength,\n 0\n );\n\n const reductionPercent =\n totalOriginalSize > 0\n ? Math.round(\n ((totalOriginalSize - totalDeltaSize) / totalOriginalSize) * 100\n )\n : 0;\n\n const batch: DeltaBatch = {\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n operations: deltas,\n timestamp: Date.now(),\n totalOriginalSize,\n totalDeltaSize,\n reductionPercent,\n };\n\n logger.debug('[DeltaSyncOptimizer] Batch computed', {\n operations: operations.length,\n reduction: reductionPercent,\n size: totalDeltaSize,\n });\n\n return batch;\n }\n\n /**\n * Decompress delta operation back to full operation\n */\n decompressDelta(delta: DeltaOperation): Operation {\n if (delta.type === 'full') {\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.fullData || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n const previous = this.operationHistory.get(delta.operationId);\n\n if (!previous) {\n logger.warn('[DeltaSyncOptimizer] Cannot decompress - no history', {\n operationId: delta.operationId,\n });\n\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.changes || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n // Apply changes to historical state\n const reconstructed = {\n ...previous,\n data: {\n ...previous.data,\n ...(delta.changes || {}),\n },\n };\n\n // Remove null fields (marked as deleted)\n if (delta.changes) {\n for (const [key, value] of Object.entries(delta.changes)) {\n if (value === null) {\n delete reconstructed.data[key];\n }\n }\n }\n\n return reconstructed;\n }\n\n /**\n * Update history after successful sync\n */\n updateHistory(operations: Operation[]): void {\n for (const op of operations) {\n this.operationHistory.set(op.id, op);\n }\n\n logger.debug('[DeltaSyncOptimizer] History updated', {\n count: operations.length,\n totalHistorySize: this.operationHistory.size,\n });\n }\n\n /**\n * Clear history for specific operations\n */\n clearHistory(operationIds: string[]): void {\n for (const id of operationIds) {\n this.operationHistory.delete(id);\n }\n\n logger.debug('[DeltaSyncOptimizer] History cleared', {\n cleared: operationIds.length,\n remaining: this.operationHistory.size,\n });\n }\n\n /**\n * Get current performance statistics\n */\n getStats(): DeltaStats {\n if (this.stats.totalOperations > 0) {\n this.stats.averageReductionPercent = Math.round(\n ((this.stats.totalOriginalSize - this.stats.totalDeltaSize) /\n this.stats.totalOriginalSize) *\n 100\n );\n }\n\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: this.stats.fullOperationThreshold,\n };\n\n logger.debug('[DeltaSyncOptimizer] Stats reset');\n }\n\n /**\n * Set the full operation threshold\n */\n setFullOperationThreshold(bytes: number): void {\n this.stats.fullOperationThreshold = bytes;\n logger.debug('[DeltaSyncOptimizer] Threshold updated', { bytes });\n }\n\n /**\n * Get history size for memory monitoring\n */\n getHistorySize(): number {\n return this.operationHistory.size;\n }\n\n /**\n * Get memory footprint estimate\n */\n getMemoryEstimate(): number {\n let totalBytes = 0;\n\n for (const op of this.operationHistory.values()) {\n totalBytes += new TextEncoder().encode(JSON.stringify(op)).byteLength;\n }\n\n return totalBytes;\n }\n\n /**\n * Deep equality check for nested objects\n */\n private deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!this.deepEqual(aObj[key], bObj[key])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet deltaSyncInstance: DeltaSyncOptimizer | null = null;\n\nexport function getDeltaSyncOptimizer(threshold?: number): DeltaSyncOptimizer {\n if (!deltaSyncInstance) {\n deltaSyncInstance = new DeltaSyncOptimizer(threshold);\n }\n return deltaSyncInstance;\n}\n\nexport function resetDeltaSyncOptimizer(): void {\n deltaSyncInstance = null;\n}\n","/**\n * Prefetching Engine (Phase 13)\n *\n * Predictively pre-compresses batches based on detected operation patterns.\n * Analyzes historical data to predict which operations are most likely to occur.\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Pattern in operation sequence\n */\nexport interface OperationPattern {\n sequence: string[];\n frequency: number;\n probability: number;\n lastOccurred: number;\n avgIntervalMs: number;\n}\n\n/**\n * Prediction for next operations\n */\nexport interface OperationPrediction {\n operationType: string;\n probability: number;\n reason: string;\n shouldPrefetch: boolean;\n estimatedTimeMs: number;\n}\n\n/**\n * Prefetched batch\n */\nexport interface PrefetchedBatch {\n id: string;\n operationType: string;\n compressed: Uint8Array;\n compressedSize: number;\n originalSize: number;\n compressionRatio: number;\n compressed_at: number;\n created_at: number;\n ttl: number;\n expiresAt: number;\n hitCount: number;\n missCount: number;\n}\n\n/**\n * Prefetching statistics\n */\nexport interface PrefetchingStats {\n totalPrefetched: number;\n totalHits: number;\n totalMisses: number;\n totalOverwrites: number;\n hitRatio: number;\n bandwidthSaved: number;\n patternsDetected: number;\n predictionAccuracy: number;\n}\n\n// ============================================================================\n// Prefetching Engine\n// ============================================================================\n\nexport class PrefetchingEngine {\n private operationHistory: Array<{\n type: string;\n timestamp: number;\n size: number;\n }> = [];\n private patterns: Map<string, OperationPattern> = new Map();\n private prefetchCache: Map<string, PrefetchedBatch[]> = new Map();\n private maxHistoryEntries = 1000;\n private maxCachePerType = 5;\n private prefetchTTL = 5 * 60 * 1000; // 5 minutes\n private predictionThreshold = 0.3;\n private stats: PrefetchingStats = {\n totalPrefetched: 0,\n totalHits: 0,\n totalMisses: 0,\n totalOverwrites: 0,\n hitRatio: 0,\n bandwidthSaved: 0,\n patternsDetected: 0,\n predictionAccuracy: 0,\n };\n private lastPredictionTime = 0;\n private predictionInterval = 30 * 1000;\n\n constructor() {\n logger.debug('[PrefetchingEngine] Initialized', {\n ttl: this.prefetchTTL,\n threshold: this.predictionThreshold,\n });\n }\n\n /**\n * Record operation for pattern analysis\n */\n recordOperation(operationType: string, size: number): void {\n const now = Date.now();\n\n this.operationHistory.push({\n type: operationType,\n timestamp: now,\n size,\n });\n\n if (this.operationHistory.length > this.maxHistoryEntries) {\n this.operationHistory.shift();\n }\n\n // Clean expired prefetches periodically\n if (Math.random() < 0.1) {\n this.cleanExpiredPrefetches();\n }\n\n logger.debug('[PrefetchingEngine] Operation recorded', {\n type: operationType,\n size,\n historySize: this.operationHistory.length,\n });\n }\n\n /**\n * Analyze patterns in operation history\n */\n private analyzePatterns(): void {\n if (this.operationHistory.length < 5) {\n return;\n }\n\n const patterns = new Map<string, OperationPattern>();\n\n // Find 2-3 operation sequences\n for (let length = 2; length <= 3; length++) {\n for (let i = 0; i < this.operationHistory.length - length; i++) {\n const sequence = this.operationHistory\n .slice(i, i + length)\n .map((op) => op.type);\n const key = sequence.join(' → ');\n\n if (!patterns.has(key)) {\n patterns.set(key, {\n sequence,\n frequency: 0,\n probability: 0,\n lastOccurred: 0,\n avgIntervalMs: 0,\n });\n }\n\n const pattern = patterns.get(key)!;\n pattern.frequency++;\n pattern.lastOccurred = Date.now();\n }\n }\n\n // Calculate probabilities\n const totalSequences = this.operationHistory.length;\n\n for (const [key, pattern] of patterns.entries()) {\n pattern.probability = Math.min(1, pattern.frequency / totalSequences);\n }\n\n this.patterns = patterns;\n this.stats.patternsDetected = patterns.size;\n\n logger.debug('[PrefetchingEngine] Patterns analyzed', {\n patternsFound: patterns.size,\n });\n }\n\n /**\n * Predict next operations\n */\n predictNextOperations(recentOperations: Operation[]): OperationPrediction[] {\n const now = Date.now();\n\n if (now - this.lastPredictionTime > this.predictionInterval) {\n this.analyzePatterns();\n this.lastPredictionTime = now;\n }\n\n if (this.patterns.size === 0) {\n return [];\n }\n\n const predictions: OperationPrediction[] = [];\n const recentTypeSequence = recentOperations\n .slice(-3)\n .map((op) => op.type)\n .join(' → ');\n\n for (const [key, pattern] of this.patterns.entries()) {\n if (key.includes(recentTypeSequence)) {\n const nextType = pattern.sequence[pattern.sequence.length - 1];\n\n const prediction: OperationPrediction = {\n operationType: nextType,\n probability: pattern.probability,\n reason: `Detected pattern: ${key}`,\n shouldPrefetch: pattern.probability > this.predictionThreshold,\n estimatedTimeMs: pattern.avgIntervalMs,\n };\n\n predictions.push(prediction);\n }\n }\n\n // Deduplicate and sort\n const deduped = Array.from(\n new Map(predictions.map((p) => [p.operationType, p])).values()\n ).sort((a, b) => b.probability - a.probability);\n\n logger.debug('[PrefetchingEngine] Predictions', {\n predictions: deduped.slice(0, 3).map((p) => ({\n type: p.operationType,\n probability: (p.probability * 100).toFixed(1) + '%',\n })),\n });\n\n return deduped;\n }\n\n /**\n * Add prefetched batch\n */\n addPrefetchedBatch(\n operationType: string,\n compressed: Uint8Array,\n originalSize: number\n ): PrefetchedBatch {\n if (!this.prefetchCache.has(operationType)) {\n this.prefetchCache.set(operationType, []);\n }\n\n const cache = this.prefetchCache.get(operationType)!;\n\n if (cache.length >= this.maxCachePerType) {\n const oldest = cache.shift()!;\n if (oldest.hitCount === 0) {\n this.stats.totalMisses++;\n } else {\n this.stats.totalOverwrites++;\n }\n }\n\n const batch: PrefetchedBatch = {\n id: `prefetch-${operationType}-${Date.now()}-${Math.random()\n .toString(36)\n .substr(2, 9)}`,\n operationType,\n compressed,\n compressedSize: compressed.length,\n originalSize,\n compressionRatio: 1 - compressed.length / originalSize,\n compressed_at: Date.now(),\n created_at: Date.now(),\n ttl: this.prefetchTTL,\n expiresAt: Date.now() + this.prefetchTTL,\n hitCount: 0,\n missCount: 0,\n };\n\n cache.push(batch);\n this.stats.totalPrefetched++;\n this.stats.bandwidthSaved += originalSize - compressed.length;\n\n logger.debug('[PrefetchingEngine] Prefetched batch added', {\n type: operationType,\n id: batch.id,\n ratio: (batch.compressionRatio * 100).toFixed(1) + '%',\n });\n\n return batch;\n }\n\n /**\n * Try to use prefetched batch\n */\n getPrefetchedBatch(operationType: string): PrefetchedBatch | null {\n const cache = this.prefetchCache.get(operationType);\n if (!cache || cache.length === 0) {\n return null;\n }\n\n const now = Date.now();\n for (let i = 0; i < cache.length; i++) {\n const batch = cache[i];\n\n if (batch.expiresAt > now) {\n batch.hitCount++;\n this.stats.totalHits++;\n this.updatePredictionAccuracy(true);\n\n logger.debug('[PrefetchingEngine] Prefetch hit', {\n type: operationType,\n id: batch.id,\n });\n\n return batch;\n } else {\n cache.splice(i, 1);\n i--;\n batch.missCount++;\n this.stats.totalMisses++;\n this.updatePredictionAccuracy(false);\n }\n }\n\n return null;\n }\n\n /**\n * Update prediction accuracy metric\n */\n private updatePredictionAccuracy(hit: boolean): void {\n const total = this.stats.totalHits + this.stats.totalMisses;\n if (total === 0) return;\n\n this.stats.predictionAccuracy = this.stats.totalHits / total;\n }\n\n /**\n * Clean expired prefetches\n */\n private cleanExpiredPrefetches(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [type, cache] of this.prefetchCache.entries()) {\n for (let i = cache.length - 1; i >= 0; i--) {\n if (cache[i].expiresAt < now) {\n const batch = cache.splice(i, 1)[0];\n if (batch.hitCount === 0) {\n this.stats.totalMisses++;\n }\n cleanedCount++;\n }\n }\n\n if (cache.length === 0) {\n this.prefetchCache.delete(type);\n }\n }\n\n if (cleanedCount > 0) {\n logger.debug('[PrefetchingEngine] Cleaned expired prefetches', {\n count: cleanedCount,\n });\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): PrefetchingStats {\n const total = this.stats.totalHits + this.stats.totalMisses;\n this.stats.hitRatio = total > 0 ? this.stats.totalHits / total : 0;\n\n return { ...this.stats };\n }\n\n /**\n * Clear all caches\n */\n clear(): void {\n this.operationHistory = [];\n this.patterns.clear();\n this.prefetchCache.clear();\n this.stats = {\n totalPrefetched: 0,\n totalHits: 0,\n totalMisses: 0,\n totalOverwrites: 0,\n hitRatio: 0,\n bandwidthSaved: 0,\n patternsDetected: 0,\n predictionAccuracy: 0,\n };\n logger.debug('[PrefetchingEngine] Cleared all caches');\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet prefetchingEngineInstance: PrefetchingEngine | null = null;\n\nexport function getPrefetchingEngine(): PrefetchingEngine {\n if (!prefetchingEngineInstance) {\n prefetchingEngineInstance = new PrefetchingEngine();\n }\n return prefetchingEngineInstance;\n}\n\nexport function resetPrefetchingEngine(): void {\n prefetchingEngineInstance = null;\n}\n","/**\n * Batch Timing Optimizer (Phase 13)\n *\n * Intelligently schedules batch transmission based on network conditions,\n * device resources, and user activity patterns.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network window quality assessment\n */\nexport interface NetworkWindow {\n startTime: number;\n endTime: number;\n expectedDurationMs: number;\n latencyMs: number;\n bandwidthMbps: number;\n quality: 'excellent' | 'good' | 'fair' | 'poor';\n isStable: boolean;\n congestionLevel: number;\n recommendedBatchSize: number;\n}\n\n/**\n * Activity pattern\n */\nexport interface ActivityPattern {\n type: 'user-active' | 'idle' | 'background' | 'sleep';\n startTime: number;\n duration: number;\n probability: number;\n}\n\n/**\n * Batch scheduling decision\n */\nexport interface SchedulingDecision {\n shouldSendNow: boolean;\n nextOptimalWindowMs: number;\n recommendedDelay: number;\n reason: string;\n priority: 'critical' | 'high' | 'normal' | 'low';\n estimatedDeliveryMs: number;\n}\n\n/**\n * Batch timing statistics\n */\nexport interface BatchTimingStats {\n totalBatches: number;\n immediateDeliveries: number;\n deferredBatches: number;\n averageWaitTimeMs: number;\n averageDeliveryTimeMs: number;\n networkWindowsUsed: number;\n congestionAvoided: number;\n userFocusedOptimizations: number;\n}\n\n// ============================================================================\n// Batch Timing Optimizer\n// ============================================================================\n\nexport class BatchTimingOptimizer {\n private networkHistory: Array<{\n latencyMs: number;\n bandwidthMbps: number;\n timestamp: number;\n quality: 'excellent' | 'good' | 'fair' | 'poor';\n }> = [];\n private activityHistory: ActivityPattern[] = [];\n private stats: BatchTimingStats = {\n totalBatches: 0,\n immediateDeliveries: 0,\n deferredBatches: 0,\n averageWaitTimeMs: 0,\n averageDeliveryTimeMs: 0,\n networkWindowsUsed: 0,\n congestionAvoided: 0,\n userFocusedOptimizations: 0,\n };\n private lastActivityTime = Date.now();\n private isUserActive = true;\n private congestionDetectionWindow = 60 * 1000;\n private optimalBatchSize = 50 * 1024;\n\n constructor() {\n logger.debug('[BatchTimingOptimizer] Initialized', {\n congestionWindow: this.congestionDetectionWindow,\n optimalBatchSize: this.optimalBatchSize,\n });\n }\n\n /**\n * Record network measurement\n */\n recordNetworkMeasurement(latencyMs: number, bandwidthMbps: number): void {\n const quality = this.assessNetworkQuality(latencyMs, bandwidthMbps);\n\n this.networkHistory.push({\n latencyMs,\n bandwidthMbps,\n timestamp: Date.now(),\n quality,\n });\n\n if (this.networkHistory.length > 100) {\n this.networkHistory.shift();\n }\n\n this.stats.networkWindowsUsed++;\n\n logger.debug('[BatchTimingOptimizer] Network measured', {\n latency: latencyMs + 'ms',\n bandwidth: bandwidthMbps.toFixed(1) + ' Mbps',\n quality,\n });\n }\n\n /**\n * Assess network quality\n */\n private assessNetworkQuality(\n latencyMs: number,\n bandwidthMbps: number\n ): 'excellent' | 'good' | 'fair' | 'poor' {\n if (latencyMs < 20 && bandwidthMbps > 10) return 'excellent';\n if (latencyMs < 50 && bandwidthMbps > 5) return 'good';\n if (latencyMs < 100 && bandwidthMbps > 2) return 'fair';\n return 'poor';\n }\n\n /**\n * Detect congestion in network\n */\n private detectCongestion(): number {\n const recentMeasurements = this.networkHistory.filter(\n (m) => Date.now() - m.timestamp < this.congestionDetectionWindow\n );\n\n if (recentMeasurements.length < 3) {\n return 0;\n }\n\n const poorCount = recentMeasurements.filter(\n (m) => m.quality === 'poor'\n ).length;\n\n return poorCount / recentMeasurements.length;\n }\n\n /**\n * Find next optimal network window\n */\n private findOptimalWindow(): NetworkWindow {\n const now = Date.now();\n\n const recentMeasurements = this.networkHistory.slice(-20);\n if (recentMeasurements.length === 0) {\n return {\n startTime: now,\n endTime: now + 1000,\n expectedDurationMs: 1000,\n latencyMs: 50,\n bandwidthMbps: 5,\n quality: 'good',\n isStable: true,\n congestionLevel: 0,\n recommendedBatchSize: this.optimalBatchSize,\n };\n }\n\n const avgLatency =\n recentMeasurements.reduce((sum, m) => sum + m.latencyMs, 0) /\n recentMeasurements.length;\n const avgBandwidth =\n recentMeasurements.reduce((sum, m) => sum + m.bandwidthMbps, 0) /\n recentMeasurements.length;\n\n const latencyVariance =\n Math.sqrt(\n recentMeasurements.reduce(\n (sum, m) => sum + Math.pow(m.latencyMs - avgLatency, 2),\n 0\n ) / recentMeasurements.length\n ) / avgLatency;\n\n const isStable = latencyVariance < 0.2;\n const congestionLevel = this.detectCongestion();\n const quality = this.assessNetworkQuality(avgLatency, avgBandwidth);\n\n const recommendedBatchSize = Math.max(\n 10 * 1024,\n Math.min(500 * 1024, (avgBandwidth * 1024 * 100) / 8)\n );\n\n return {\n startTime: now,\n endTime: now + (isStable ? 30 * 1000 : 10 * 1000),\n expectedDurationMs: isStable ? 30 * 1000 : 10 * 1000,\n latencyMs: avgLatency,\n bandwidthMbps: avgBandwidth,\n quality,\n isStable,\n congestionLevel,\n recommendedBatchSize,\n };\n }\n\n /**\n * Get scheduling decision for a batch\n */\n getSchedulingDecision(\n batchSize: number,\n batchPriority: 'critical' | 'high' | 'normal' | 'low' = 'normal',\n isUserTriggered = false\n ): SchedulingDecision {\n const now = Date.now();\n const currentWindow = this.findOptimalWindow();\n const congestionLevel = this.detectCongestion();\n\n let shouldSendNow = false;\n let recommendedDelay = 0;\n let reason = '';\n let priority = batchPriority;\n\n if (priority === 'critical') {\n shouldSendNow = true;\n reason = 'Critical operation (bypass optimization)';\n } else if (isUserTriggered && this.isUserActive) {\n shouldSendNow = true;\n reason = 'User-triggered operation';\n priority = 'high';\n } else if (\n currentWindow.quality === 'excellent' ||\n currentWindow.quality === 'good'\n ) {\n if (congestionLevel < 0.3) {\n shouldSendNow = true;\n reason = 'Good network conditions';\n } else {\n shouldSendNow = true;\n reason = 'Good network despite some congestion';\n recommendedDelay = 1000 + Math.random() * 2000;\n }\n } else if (currentWindow.quality === 'fair') {\n if (priority === 'high') {\n shouldSendNow = true;\n reason = 'High priority despite fair network';\n } else {\n shouldSendNow = false;\n reason = 'Fair network: waiting for better window';\n recommendedDelay = 30 * 1000 + Math.random() * 30 * 1000;\n }\n } else {\n shouldSendNow = false;\n reason = 'Poor network conditions: deferring';\n if (priority === 'high') {\n recommendedDelay = 60 * 1000 + Math.random() * 30 * 1000;\n } else {\n recommendedDelay = 120 * 1000 + Math.random() * 60 * 1000;\n }\n }\n\n const estimatedDeliveryMs =\n (batchSize / ((currentWindow.bandwidthMbps * 1024 * 1024) / 8)) * 1000 +\n currentWindow.latencyMs +\n recommendedDelay;\n\n const decision: SchedulingDecision = {\n shouldSendNow,\n nextOptimalWindowMs: now + recommendedDelay,\n recommendedDelay,\n reason,\n priority,\n estimatedDeliveryMs,\n };\n\n logger.debug('[BatchTimingOptimizer] Scheduling decision', {\n size: (batchSize / 1024).toFixed(1) + ' KB',\n shouldSendNow,\n delay: recommendedDelay + 'ms',\n reason,\n });\n\n return decision;\n }\n\n /**\n * Apply scheduling and update stats\n */\n applyScheduling(\n batchSize: number,\n sendNow: boolean,\n actualDelay: number\n ): void {\n this.stats.totalBatches++;\n\n if (sendNow) {\n this.stats.immediateDeliveries++;\n } else {\n this.stats.deferredBatches++;\n }\n\n const totalWait =\n this.stats.averageWaitTimeMs * (this.stats.totalBatches - 1) +\n actualDelay;\n this.stats.averageWaitTimeMs = totalWait / this.stats.totalBatches;\n\n if (this.detectCongestion() > 0.3 && !sendNow) {\n this.stats.congestionAvoided++;\n }\n\n if (this.isUserActive) {\n this.stats.userFocusedOptimizations++;\n }\n\n this.stats.networkWindowsUsed++;\n }\n\n /**\n * Get optimal batch size recommendation\n */\n getOptimalBatchSize(): number {\n const window = this.findOptimalWindow();\n return window.recommendedBatchSize;\n }\n\n /**\n * Get current network window\n */\n getCurrentNetworkWindow(): NetworkWindow {\n return this.findOptimalWindow();\n }\n\n /**\n * Set user activity state\n */\n setUserActive(active: boolean): void {\n this.isUserActive = active;\n if (active) {\n this.lastActivityTime = Date.now();\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): BatchTimingStats {\n return { ...this.stats };\n }\n\n /**\n * Clear history\n */\n clear(): void {\n this.networkHistory = [];\n this.activityHistory = [];\n this.stats = {\n totalBatches: 0,\n immediateDeliveries: 0,\n deferredBatches: 0,\n averageWaitTimeMs: 0,\n averageDeliveryTimeMs: 0,\n networkWindowsUsed: 0,\n congestionAvoided: 0,\n userFocusedOptimizations: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet batchTimingOptimizerInstance: BatchTimingOptimizer | null = null;\n\nexport function getBatchTimingOptimizer(): BatchTimingOptimizer {\n if (!batchTimingOptimizerInstance) {\n batchTimingOptimizerInstance = new BatchTimingOptimizer();\n }\n return batchTimingOptimizerInstance;\n}\n\nexport function resetBatchTimingOptimizer(): void {\n batchTimingOptimizerInstance = null;\n}\n","/**\n * Adaptive Compression Optimizer (Phase 13)\n *\n * Automatically adjusts compression level based on network conditions,\n * device capabilities, and real-time performance metrics.\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { CompressionStats } from '../compression/CompressionEngine';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network conditions affecting compression\n */\nexport interface NetworkProfile {\n estimatedSpeedKbps: number;\n latencyMs: number;\n isOnline: boolean;\n isWifi: boolean;\n isFast: boolean;\n isSlow: boolean;\n isEmpty: boolean;\n}\n\n/**\n * Device capabilities for compression\n */\nexport interface DeviceProfile {\n cpuCores: number;\n cpuUtilization: number;\n memoryAvailableMB: number;\n memoryTotalMB: number;\n isConstrained: boolean;\n isPremium: boolean;\n supportsWebWorkers: boolean;\n supportsWebAssembly: boolean;\n}\n\n/**\n * Compression recommendation based on conditions\n */\nexport interface CompressionRecommendation {\n recommendedLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n reason: string;\n confidence: number;\n estimatedCompressionMs: number;\n estimatedRatio: number;\n networkFactor: number;\n deviceFactor: number;\n}\n\n/**\n * Adaptive compression statistics\n */\nexport interface AdaptiveStats {\n currentLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n averageCompressionMs: number;\n averageRatio: number;\n levelsUsed: Set<number>;\n adjustmentCount: number;\n totalBatches: number;\n networkCondition: 'fast' | 'normal' | 'slow' | 'offline';\n}\n\n// ============================================================================\n// Adaptive Compression Optimizer\n// ============================================================================\n\nexport class AdaptiveCompressionOptimizer {\n private currentLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 = 6;\n private networkProfile: NetworkProfile = {\n estimatedSpeedKbps: 5000,\n latencyMs: 50,\n isOnline: true,\n isWifi: false,\n isFast: true,\n isSlow: false,\n isEmpty: false,\n };\n private deviceProfile: DeviceProfile = {\n cpuCores: 4,\n cpuUtilization: 0.3,\n memoryAvailableMB: 512,\n memoryTotalMB: 1024,\n isConstrained: false,\n isPremium: false,\n supportsWebWorkers: true,\n supportsWebAssembly: true,\n };\n private compressionHistory: Array<{\n level: number;\n ratio: number;\n timeMs: number;\n timestamp: number;\n }> = [];\n private stats: AdaptiveStats = {\n currentLevel: 6,\n averageCompressionMs: 10,\n averageRatio: 0.85,\n levelsUsed: new Set([6]),\n adjustmentCount: 0,\n totalBatches: 0,\n networkCondition: 'normal',\n };\n\n constructor() {\n logger.debug('[AdaptiveCompressionOptimizer] Initialized', {\n level: this.currentLevel,\n });\n }\n\n /**\n * Update network conditions\n */\n updateNetworkConditions(\n speedKbps: number,\n latencyMs?: number,\n isOnline?: boolean\n ): void {\n this.networkProfile.estimatedSpeedKbps = speedKbps;\n if (latencyMs !== undefined) {\n this.networkProfile.latencyMs = latencyMs;\n }\n if (isOnline !== undefined) {\n this.networkProfile.isOnline = isOnline;\n }\n\n this.networkProfile.isFast = speedKbps > 5000;\n this.networkProfile.isSlow = speedKbps < 1000;\n this.networkProfile.isEmpty = speedKbps < 100;\n\n if (isOnline === false) {\n this.stats.networkCondition = 'offline';\n } else if (this.networkProfile.isSlow) {\n this.stats.networkCondition = 'slow';\n } else if (this.networkProfile.isFast) {\n this.stats.networkCondition = 'fast';\n } else {\n this.stats.networkCondition = 'normal';\n }\n\n logger.debug('[AdaptiveCompressionOptimizer] Network updated', {\n speedKbps,\n condition: this.stats.networkCondition,\n });\n }\n\n /**\n * Update device resource usage\n */\n updateDeviceResources(\n cpuUtilization: number,\n memoryAvailableMB: number\n ): void {\n this.deviceProfile.cpuUtilization = Math.max(\n 0,\n Math.min(1, cpuUtilization)\n );\n this.deviceProfile.memoryAvailableMB = memoryAvailableMB;\n this.deviceProfile.isConstrained = memoryAvailableMB < 512;\n this.deviceProfile.isPremium = memoryAvailableMB > 2048;\n\n logger.debug('[AdaptiveCompressionOptimizer] Device resources updated', {\n cpuUtilization: (cpuUtilization * 100).toFixed(1) + '%',\n memoryAvailableMB,\n });\n }\n\n /**\n * Record compression performance\n */\n recordCompressionPerformance(\n level: number,\n compressionMs: number,\n ratio: number\n ): void {\n this.compressionHistory.push({\n level,\n ratio,\n timeMs: compressionMs,\n timestamp: Date.now(),\n });\n\n if (this.compressionHistory.length > 100) {\n this.compressionHistory.shift();\n }\n\n this.stats.totalBatches++;\n this.stats.averageCompressionMs =\n this.compressionHistory.reduce((sum, h) => sum + h.timeMs, 0) /\n this.compressionHistory.length;\n this.stats.averageRatio =\n this.compressionHistory.reduce((sum, h) => sum + h.ratio, 0) /\n this.compressionHistory.length;\n }\n\n /**\n * Get compression recommendation based on conditions\n */\n getRecommendedLevel(): CompressionRecommendation {\n const networkFactor = this.calculateNetworkFactor();\n const deviceFactor = this.calculateDeviceFactor();\n const combinedFactor = (networkFactor + deviceFactor) / 2;\n\n const recommendedLevel = Math.max(\n 1,\n Math.min(9, Math.round(combinedFactor * 9))\n ) as 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n\n const estimatedCompressionMs =\n this.estimateCompressionTime(recommendedLevel);\n const estimatedRatio = this.estimateCompressionRatio(recommendedLevel);\n\n let reason = '';\n if (networkFactor < 0.3 && deviceFactor < 0.3) {\n reason = 'Slow network + constrained device: using level 1-2 (fast)';\n } else if (networkFactor > 0.7 && deviceFactor > 0.7) {\n reason =\n 'Fast network + premium device: using level 8-9 (best compression)';\n } else if (networkFactor > 0.7) {\n reason = 'Fast network: prioritizing compression ratio';\n } else if (deviceFactor < 0.3) {\n reason = 'Constrained device: prioritizing speed';\n } else {\n reason = 'Normal conditions: balanced compression level';\n }\n\n const recommendation: CompressionRecommendation = {\n recommendedLevel,\n reason,\n confidence: this.compressionHistory.length > 10 ? 0.9 : 0.5,\n estimatedCompressionMs,\n estimatedRatio,\n networkFactor,\n deviceFactor,\n };\n\n logger.debug(\n '[AdaptiveCompressionOptimizer] Recommendation',\n recommendation\n );\n\n return recommendation;\n }\n\n /**\n * Calculate network factor (0-1)\n */\n private calculateNetworkFactor(): number {\n if (!this.networkProfile.isOnline) return 0;\n\n const speedMbps = this.networkProfile.estimatedSpeedKbps / 1000;\n\n if (speedMbps < 0.1) return 0;\n if (speedMbps < 1) return 0.1 + (speedMbps / 1) * 0.2;\n if (speedMbps < 5) return 0.3 + ((speedMbps - 1) / 4) * 0.3;\n if (speedMbps < 20) return 0.6 + ((speedMbps - 5) / 15) * 0.3;\n return Math.min(1, 0.9 + (speedMbps - 20) / 200);\n }\n\n /**\n * Calculate device factor (0-1)\n */\n private calculateDeviceFactor(): number {\n let factor = 0.5;\n\n if (this.deviceProfile.isPremium) {\n factor = 0.8;\n } else if (this.deviceProfile.isConstrained) {\n factor = 0.2;\n }\n\n if (this.deviceProfile.cpuUtilization > 0.8) {\n factor *= 0.7;\n } else if (this.deviceProfile.cpuUtilization < 0.2) {\n factor *= 1.1;\n }\n\n if (this.deviceProfile.supportsWebAssembly) {\n factor = Math.min(1, factor + 0.1);\n }\n\n return Math.max(0, Math.min(1, factor));\n }\n\n /**\n * Estimate compression time for a level (in ms)\n */\n private estimateCompressionTime(level: number): number {\n return Math.max(1, level * 2.5);\n }\n\n /**\n * Estimate compression ratio for a level\n */\n private estimateCompressionRatio(level: number): number {\n return 0.6 + (level / 9) * 0.3;\n }\n\n /**\n * Apply recommendation and get new level\n */\n applyRecommendation(): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 {\n const recommendation = this.getRecommendedLevel();\n const oldLevel = this.currentLevel;\n\n const shouldChange =\n recommendation.confidence > 0.7 ||\n Math.abs(recommendation.recommendedLevel - oldLevel) > 2;\n\n if (shouldChange) {\n this.currentLevel = recommendation.recommendedLevel;\n this.stats.levelsUsed.add(this.currentLevel);\n\n if (oldLevel !== this.currentLevel) {\n this.stats.adjustmentCount++;\n logger.debug('[AdaptiveCompressionOptimizer] Level adjusted', {\n from: oldLevel,\n to: this.currentLevel,\n reason: recommendation.reason,\n });\n }\n }\n\n this.stats.currentLevel = this.currentLevel;\n return this.currentLevel;\n }\n\n /**\n * Get current level\n */\n getCurrentLevel(): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 {\n return this.currentLevel;\n }\n\n /**\n * Get statistics\n */\n getStats(): AdaptiveStats {\n return { ...this.stats };\n }\n\n /**\n * Get detailed analysis\n */\n getDetailedAnalysis() {\n return {\n stats: this.stats,\n network: this.networkProfile,\n device: this.deviceProfile,\n recommendation: this.getRecommendedLevel(),\n history: this.compressionHistory.slice(-20),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet adaptiveOptimizerInstance: AdaptiveCompressionOptimizer | null = null;\n\nexport function getAdaptiveCompressionOptimizer(): AdaptiveCompressionOptimizer {\n if (!adaptiveOptimizerInstance) {\n adaptiveOptimizerInstance = new AdaptiveCompressionOptimizer();\n }\n return adaptiveOptimizerInstance;\n}\n\nexport function resetAdaptiveCompressionOptimizer(): void {\n adaptiveOptimizerInstance = null;\n}\n","/**\n * Agent Presence Manager (Phase 14)\n *\n * Tracks real-time presence of all agents in a session.\n * Provides status updates, cursor tracking, and activity monitoring.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AgentPresence {\n agentId: string;\n name: string;\n role: 'user' | 'assistant' | 'monitor' | 'admin';\n status: 'online' | 'away' | 'offline' | 'reconnecting';\n joinedAt: string;\n lastSeen: string;\n cursorPosition?: { x: number; y: number; path: string };\n activeSection?: string;\n focusNode?: string;\n selectionRange?: AgentSelectionRange;\n typingState?: AgentTypingState;\n scrollState?: AgentScrollState;\n viewport?: AgentViewportState;\n inputState?: AgentInputState;\n emotionState?: AgentEmotionState;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AgentSelectionRange {\n start: number;\n end: number;\n direction?: 'forward' | 'backward' | 'none';\n path?: string;\n}\n\nexport interface AgentTypingState {\n isTyping: boolean;\n field?: string;\n isComposing?: boolean;\n startedAt?: string;\n stoppedAt?: string;\n}\n\nexport interface AgentScrollState {\n depth: number;\n y?: number;\n viewportHeight?: number;\n documentHeight?: number;\n path?: string;\n}\n\nexport interface AgentViewportState {\n width: number;\n height: number;\n}\n\nexport interface AgentInputState {\n field: string;\n hasFocus: boolean;\n valueLength?: number;\n selectionStart?: number;\n selectionEnd?: number;\n isComposing?: boolean;\n inputMode?: string;\n}\n\nexport interface AgentEmotionState {\n primary?: string;\n secondary?: string;\n confidence?: number;\n intensity?: number;\n valence?: number;\n arousal?: number;\n dominance?: number;\n source?: 'self-report' | 'inferred' | 'sensor' | 'hybrid';\n updatedAt?: string;\n}\n\nexport interface PresenceUpdate {\n agentId: string;\n changes: Partial<AgentPresence>;\n timestamp: string;\n}\n\nexport interface PresenceEvents {\n presence_updated: (data: {\n agentId: string;\n presence: AgentPresence;\n }) => void;\n agent_joined: (data: { agentId: string; presence: AgentPresence }) => void;\n agent_left: (data: { agentId: string; presence: AgentPresence }) => void;\n cursor_updated: (data: {\n agentId: string;\n cursorPosition: { x: number; y: number; path: string };\n }) => void;\n section_updated: (data: { agentId: string; activeSection: string }) => void;\n focus_updated: (data: { agentId: string; focusNode: string }) => void;\n selection_updated: (data: {\n agentId: string;\n selectionRange: AgentSelectionRange;\n }) => void;\n typing_updated: (data: {\n agentId: string;\n typingState: AgentTypingState;\n }) => void;\n scroll_updated: (data: {\n agentId: string;\n scrollState: AgentScrollState;\n }) => void;\n viewport_updated: (data: {\n agentId: string;\n viewport: AgentViewportState;\n }) => void;\n input_state_updated: (data: {\n agentId: string;\n inputState?: AgentInputState;\n }) => void;\n emotion_updated: (data: {\n agentId: string;\n emotionState?: AgentEmotionState;\n }) => void;\n status_updated: (data: {\n agentId: string;\n status: AgentPresence['status'];\n }) => void;\n}\n\n// ============================================================================\n// Agent Presence Manager\n// ============================================================================\n\nexport class AgentPresenceManager extends EventEmitter<PresenceEvents> {\n private presences: Map<string, AgentPresence> = new Map();\n private sessionId: string;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private heartbeatTimeout = 30000;\n private inactivityThreshold = 60000;\n\n constructor(sessionId: string) {\n super();\n this.sessionId = sessionId;\n this.startHeartbeatCheck();\n logger.debug('[AgentPresenceManager] Initialized', { sessionId });\n }\n\n /**\n * Add or update agent presence\n */\n updatePresence(\n agentId: string,\n presence: Omit<AgentPresence, 'joinedAt' | 'lastSeen'>\n ): void {\n const existing = this.presences.get(agentId);\n const now = new Date().toISOString();\n\n const updated: AgentPresence = {\n ...existing,\n ...presence,\n agentId,\n joinedAt: existing?.joinedAt ?? now,\n lastSeen: now,\n };\n\n this.presences.set(agentId, updated);\n\n this.emit('presence_updated', {\n agentId,\n presence: updated,\n });\n }\n\n /**\n * Agent joined\n */\n agentJoined(\n agentId: string,\n name: string,\n role: AgentPresence['role'] = 'user',\n metadata?: Record<string, unknown>\n ): void {\n const now = new Date().toISOString();\n\n const presence: AgentPresence = {\n agentId,\n name,\n role,\n status: 'online',\n joinedAt: now,\n lastSeen: now,\n metadata,\n };\n\n this.presences.set(agentId, presence);\n this.emit('agent_joined', { agentId, presence });\n\n logger.debug('[AgentPresenceManager] Agent joined', {\n agentId,\n name,\n role,\n });\n }\n\n /**\n * Agent left\n */\n agentLeft(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.status = 'offline';\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('agent_left', { agentId, presence });\n\n logger.debug('[AgentPresenceManager] Agent left', { agentId });\n }\n }\n\n /**\n * Update cursor position\n */\n updateCursor(agentId: string, x: number, y: number, path: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.cursorPosition = { x, y, path };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('cursor_updated', {\n agentId,\n cursorPosition: presence.cursorPosition,\n });\n }\n }\n\n /**\n * Update active section\n */\n updateActiveSection(agentId: string, section: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.activeSection = section;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('section_updated', {\n agentId,\n activeSection: section,\n });\n }\n }\n\n /**\n * Update focused node path\n */\n updateFocusNode(agentId: string, nodePath: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.focusNode = nodePath;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('focus_updated', {\n agentId,\n focusNode: nodePath,\n });\n }\n }\n\n /**\n * Update text selection range\n */\n updateSelection(agentId: string, selectionRange: AgentSelectionRange): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.selectionRange = selectionRange;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('selection_updated', {\n agentId,\n selectionRange,\n });\n }\n }\n\n /**\n * Update typing state\n */\n updateTyping(\n agentId: string,\n isTyping: boolean,\n field?: string,\n isComposing = false\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const now = new Date().toISOString();\n const previous = presence.typingState;\n const typingState: AgentTypingState = {\n isTyping,\n field,\n isComposing,\n startedAt:\n isTyping && !previous?.isTyping\n ? now\n : isTyping\n ? previous?.startedAt\n : undefined,\n stoppedAt: isTyping ? undefined : now,\n };\n\n presence.typingState = typingState;\n presence.lastSeen = now;\n\n this.presences.set(agentId, presence);\n this.emit('typing_updated', {\n agentId,\n typingState,\n });\n }\n }\n\n /**\n * Update scroll state\n */\n updateScroll(agentId: string, scrollState: AgentScrollState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.scrollState = {\n ...scrollState,\n depth: Math.max(0, Math.min(1, scrollState.depth)),\n };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('scroll_updated', {\n agentId,\n scrollState: presence.scrollState,\n });\n }\n }\n\n /**\n * Update viewport size\n */\n updateViewport(agentId: string, width: number, height: number): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.viewport = { width, height };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('viewport_updated', {\n agentId,\n viewport: presence.viewport,\n });\n }\n }\n\n /**\n * Update input state\n */\n updateInputState(agentId: string, inputState: AgentInputState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = inputState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState,\n });\n }\n }\n\n /**\n * Clear input state\n */\n clearInputState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState: undefined,\n });\n }\n }\n\n /**\n * Update emotional state\n */\n updateEmotionState(\n agentId: string,\n emotionState: Omit<AgentEmotionState, 'updatedAt'>\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const enrichedState: AgentEmotionState = {\n ...emotionState,\n updatedAt: new Date().toISOString(),\n };\n presence.emotionState = enrichedState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: enrichedState,\n });\n }\n }\n\n /**\n * Clear emotional state\n */\n clearEmotionState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.emotionState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: undefined,\n });\n }\n }\n\n /**\n * Update status\n */\n updateStatus(agentId: string, status: AgentPresence['status']): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.status = status;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('status_updated', { agentId, status });\n }\n }\n\n /**\n * Heartbeat from agent (keeps them online)\n */\n heartbeat(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n if (presence.status === 'reconnecting') {\n presence.status = 'online';\n this.emit('status_updated', { agentId, status: 'online' });\n }\n\n presence.lastSeen = new Date().toISOString();\n this.presences.set(agentId, presence);\n }\n }\n\n /**\n * Get presence for agent\n */\n getPresence(agentId: string): AgentPresence | undefined {\n return this.presences.get(agentId);\n }\n\n /**\n * Get all online agents\n */\n getOnlineAgents(): AgentPresence[] {\n return Array.from(this.presences.values()).filter(\n (p) => p.status === 'online'\n );\n }\n\n /**\n * Get all agents\n */\n getAllAgents(): AgentPresence[] {\n return Array.from(this.presences.values());\n }\n\n /**\n * Get all presences\n */\n getAllPresences(): AgentPresence[] {\n return Array.from(this.presences.values());\n }\n\n /**\n * Get agent count\n */\n getAgentCount(): Record<AgentPresence['status'], number> {\n const counts = {\n online: 0,\n away: 0,\n offline: 0,\n reconnecting: 0,\n };\n\n this.presences.forEach((p) => {\n counts[p.status]++;\n });\n\n return counts;\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n totalAgents: this.presences.size,\n onlineAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'online'\n ).length,\n offlineAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'offline'\n ).length,\n awayAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'away'\n ).length,\n reconnectingAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'reconnecting'\n ).length,\n };\n }\n\n /**\n * Clear expired presences\n */\n clearExpiredPresences(maxAgeMs: number): void {\n const now = Date.now();\n const toRemove: string[] = [];\n\n this.presences.forEach((presence, agentId) => {\n const lastSeenTime = new Date(presence.lastSeen).getTime();\n const ageMs = now - lastSeenTime;\n\n if (ageMs > maxAgeMs && presence.status === 'offline') {\n toRemove.push(agentId);\n }\n });\n\n toRemove.forEach((agentId) => {\n this.presences.delete(agentId);\n });\n\n if (toRemove.length > 0) {\n logger.debug('[AgentPresenceManager] Cleared expired presences', {\n count: toRemove.length,\n });\n }\n }\n\n /**\n * Get agents by role\n */\n getByRole(role: AgentPresence['role']): AgentPresence[] {\n return Array.from(this.presences.values()).filter((p) => p.role === role);\n }\n\n /**\n * Get agents in active section\n */\n getInSection(section: string): AgentPresence[] {\n return Array.from(this.presences.values()).filter(\n (p) => p.activeSection === section && p.status === 'online'\n );\n }\n\n /**\n * Get presence timeline\n */\n getPresenceStats() {\n const stats = {\n total: this.presences.size,\n online: 0,\n away: 0,\n offline: 0,\n reconnecting: 0,\n byRole: {} as Record<string, number>,\n };\n\n this.presences.forEach((p) => {\n stats[p.status]++;\n stats.byRole[p.role] = (stats.byRole[p.role] ?? 0) + 1;\n });\n\n return stats;\n }\n\n /**\n * Start heartbeat check (mark inactive agents as away)\n */\n private startHeartbeatCheck(): void {\n this.heartbeatInterval = setInterval(() => {\n const now = Date.now();\n\n this.presences.forEach((presence) => {\n const lastSeenTime = new Date(presence.lastSeen).getTime();\n const timeSinceLastSeen = now - lastSeenTime;\n\n if (\n timeSinceLastSeen > this.inactivityThreshold &&\n presence.status === 'online'\n ) {\n presence.status = 'away';\n this.emit('status_updated', {\n agentId: presence.agentId,\n status: 'away',\n });\n }\n\n if (\n timeSinceLastSeen > this.heartbeatTimeout &&\n presence.status !== 'offline'\n ) {\n presence.status = 'reconnecting';\n this.emit('status_updated', {\n agentId: presence.agentId,\n status: 'reconnecting',\n });\n }\n });\n }, 10000);\n }\n\n /**\n * Stop heartbeat monitoring\n */\n stopHeartbeatMonitoring(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Clear all presences\n */\n clear(): void {\n this.presences.clear();\n }\n\n /**\n * Destroy the manager\n */\n destroy(): void {\n this.stopHeartbeatMonitoring();\n this.presences.clear();\n this.removeAllListeners();\n logger.debug('[AgentPresenceManager] Destroyed', {\n sessionId: this.sessionId,\n });\n }\n}\n\n// ============================================================================\n// Singleton Instance Map\n// ============================================================================\n\nconst instances = new Map<string, AgentPresenceManager>();\n\nexport function getAgentPresenceManager(\n sessionId: string\n): AgentPresenceManager {\n if (!instances.has(sessionId)) {\n instances.set(sessionId, new AgentPresenceManager(sessionId));\n }\n return instances.get(sessionId)!;\n}\n\nexport function clearAgentPresenceManager(sessionId: string): void {\n const instance = instances.get(sessionId);\n if (instance) {\n instance.destroy();\n instances.delete(sessionId);\n }\n}\n","/**\n * Aeon Crypto Types\n *\n * Type definitions for cryptographic operations in Aeon.\n * These are compatible with @affectively/ucan and @affectively/zk-encryption.\n */\n\n// =============================================================================\n// IDENTITY TYPES (compatible with @affectively/ucan)\n// =============================================================================\n\n/**\n * Decentralized Identifier (DID)\n * Format: did:method:identifier\n */\nexport type DID = `did:${string}:${string}`;\n\n/**\n * Supported signing algorithms\n */\nexport type SigningAlgorithm = 'ES256' | 'Ed25519' | 'ES384' | 'ES512';\n\n/**\n * Key pair for signing and verification\n */\nexport interface KeyPair {\n algorithm: SigningAlgorithm;\n publicKey: JsonWebKey;\n privateKey?: JsonWebKey;\n fingerprint: string;\n}\n\n/**\n * Identity representing a user or node\n */\nexport interface Identity {\n did: DID;\n signingKey: KeyPair;\n encryptionKey?: KeyPair;\n createdAt: number;\n displayName?: string;\n}\n\n/**\n * UCAN Capability structure\n */\nexport interface Capability {\n can: string;\n with: string;\n constraints?: Record<string, unknown>;\n}\n\n/**\n * UCAN Token payload\n */\nexport interface UCANPayload {\n iss: DID;\n aud: DID;\n exp: number;\n nbf?: number;\n iat?: number;\n nonce?: string;\n jti?: string;\n att: Capability[];\n prf?: string[];\n fct?: Record<string, unknown>;\n}\n\n/**\n * Parsed UCAN Token\n */\nexport interface UCANToken {\n payload: UCANPayload;\n raw: string;\n signature: Uint8Array;\n algorithm: string;\n}\n\n/**\n * UCAN verification result\n */\nexport interface VerificationResult {\n valid: boolean;\n payload?: UCANPayload;\n error?: string;\n expired?: boolean;\n shouldRotate?: boolean;\n expiresIn?: number;\n}\n\n// =============================================================================\n// ENCRYPTION TYPES (compatible with @affectively/zk-encryption)\n// =============================================================================\n\n/**\n * Encryption algorithms supported\n */\nexport type EncryptionAlgorithm = 'ECIES-P256' | 'AES-256-GCM';\n\n/**\n * HKDF domain separator categories\n */\nexport type DomainCategory =\n | 'default'\n | 'sync'\n | 'message'\n | 'api-key'\n | 'personal-data'\n | string;\n\n/**\n * EC Key pair for ECDH operations\n */\nexport interface ECKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n createdAt: string;\n}\n\n/**\n * Encrypted data envelope\n */\nexport interface EncryptedPayload {\n alg: EncryptionAlgorithm;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n category?: DomainCategory;\n nonce?: string;\n encryptedAt: number;\n}\n\n/**\n * Decryption result\n */\nexport interface DecryptionResult {\n plaintext: Uint8Array;\n category?: DomainCategory;\n encryptedAt: number;\n}\n\n// =============================================================================\n// AEON-SPECIFIC TYPES\n// =============================================================================\n\n/**\n * Aeon encryption mode\n */\nexport type AeonEncryptionMode =\n | 'none' // No encryption (development/testing)\n | 'transport' // Encrypt in transit only (session keys)\n | 'at-rest' // Encrypt for storage\n | 'end-to-end'; // Full E2E encryption between nodes\n\n/**\n * Aeon sync capability namespace\n */\nexport const AEON_CAPABILITIES = {\n // Basic sync operations\n SYNC_READ: 'aeon:sync:read',\n SYNC_WRITE: 'aeon:sync:write',\n SYNC_ADMIN: 'aeon:sync:admin',\n\n // Node operations\n NODE_REGISTER: 'aeon:node:register',\n NODE_HEARTBEAT: 'aeon:node:heartbeat',\n\n // Replication operations\n REPLICATE_READ: 'aeon:replicate:read',\n REPLICATE_WRITE: 'aeon:replicate:write',\n\n // State operations\n STATE_READ: 'aeon:state:read',\n STATE_WRITE: 'aeon:state:write',\n STATE_RECONCILE: 'aeon:state:reconcile',\n} as const;\n\nexport type AeonCapability =\n (typeof AEON_CAPABILITIES)[keyof typeof AEON_CAPABILITIES];\n\n/**\n * Crypto configuration for Aeon\n */\nexport interface AeonCryptoConfig {\n /** Default encryption mode for sync messages */\n defaultEncryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Allowed signature algorithms */\n allowedSignatureAlgorithms: string[];\n /** Allowed encryption algorithms */\n allowedEncryptionAlgorithms: string[];\n /** UCAN audience DID for verification */\n ucanAudience?: string;\n /** Session key expiration (ms) */\n sessionKeyExpiration?: number;\n}\n\n/**\n * Default crypto configuration\n */\nexport const DEFAULT_CRYPTO_CONFIG: AeonCryptoConfig = {\n defaultEncryptionMode: 'none',\n requireSignatures: false,\n requireCapabilities: false,\n allowedSignatureAlgorithms: ['ES256', 'Ed25519'],\n allowedEncryptionAlgorithms: ['ECIES-P256', 'AES-256-GCM'],\n sessionKeyExpiration: 24 * 60 * 60 * 1000, // 24 hours\n};\n\n/**\n * Authenticated sync message fields\n */\nexport interface AuthenticatedMessageFields {\n /** Sender DID */\n senderDID?: string;\n /** Receiver DID */\n receiverDID?: string;\n /** UCAN token for capability verification */\n ucan?: string;\n /** Message signature (base64url) */\n signature?: string;\n /** Whether payload is encrypted */\n encrypted?: boolean;\n}\n\n/**\n * Secure sync session\n */\nexport interface SecureSyncSession {\n id: string;\n initiator: string;\n participants: string[];\n sessionKey?: Uint8Array;\n encryptionMode: AeonEncryptionMode;\n requiredCapabilities: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n}\n\n/**\n * Node with identity information\n */\nexport interface SecureNodeInfo {\n id: string;\n did?: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n capabilities?: string[];\n lastSeen?: number;\n}\n\n/**\n * Capability verification result\n */\nexport interface AeonCapabilityResult {\n authorized: boolean;\n error?: string;\n issuer?: string;\n grantedCapabilities?: Array<{ can: string; with: string }>;\n}\n\n/**\n * Signed data envelope for sync operations\n */\nexport interface SignedSyncData<T = unknown> {\n payload: T;\n signature: string;\n signer: string;\n algorithm: string;\n signedAt: number;\n}\n","/**\n * Aeon Crypto Provider Interface\n *\n * Abstract interface for cryptographic operations.\n * Aeon core remains zero-dependency - crypto is injected through this interface.\n */\n\nimport type {\n AeonCapabilityResult,\n SignedSyncData,\n SecureNodeInfo,\n} from './types';\n\n/**\n * Abstract crypto provider interface\n *\n * Implementations use @affectively/ucan and @affectively/zk-encryption\n * or other compatible libraries.\n */\nexport interface ICryptoProvider {\n // ===========================================================================\n // IDENTITY OPERATIONS\n // ===========================================================================\n\n /**\n * Generate a new identity with DID and key pairs\n */\n generateIdentity(displayName?: string): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }>;\n\n /**\n * Get the local identity's DID\n */\n getLocalDID(): string | null;\n\n /**\n * Export local identity's public info for sharing\n */\n exportPublicIdentity(): Promise<SecureNodeInfo | null>;\n\n /**\n * Register a known remote node's public keys\n */\n registerRemoteNode(node: SecureNodeInfo): Promise<void>;\n\n /**\n * Get a remote node's public key\n */\n getRemotePublicKey(did: string): Promise<JsonWebKey | null>;\n\n // ===========================================================================\n // SIGNING OPERATIONS\n // ===========================================================================\n\n /**\n * Sign data with local identity's private key\n */\n sign(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Sign structured data and wrap in SignedSyncData envelope\n */\n signData<T>(data: T): Promise<SignedSyncData<T>>;\n\n /**\n * Verify a signature from a remote node\n */\n verify(\n did: string,\n signature: Uint8Array,\n data: Uint8Array\n ): Promise<boolean>;\n\n /**\n * Verify a SignedSyncData envelope\n */\n verifySignedData<T>(signedData: SignedSyncData<T>): Promise<boolean>;\n\n // ===========================================================================\n // ENCRYPTION OPERATIONS\n // ===========================================================================\n\n /**\n * Encrypt data for a recipient\n */\n encrypt(\n plaintext: Uint8Array,\n recipientDID: string\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt data\n */\n decrypt(\n encrypted: {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n },\n senderDID?: string\n ): Promise<Uint8Array>;\n\n /**\n * Derive or get a session key for communication with a peer\n */\n getSessionKey(peerDID: string): Promise<Uint8Array>;\n\n /**\n * Encrypt with a session key\n */\n encryptWithSessionKey(\n plaintext: Uint8Array,\n sessionKey: Uint8Array\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt with a session key\n */\n decryptWithSessionKey(\n encrypted: {\n ct: string;\n iv: string;\n tag: string;\n },\n sessionKey: Uint8Array\n ): Promise<Uint8Array>;\n\n // ===========================================================================\n // UCAN OPERATIONS\n // ===========================================================================\n\n /**\n * Create a UCAN token\n */\n createUCAN(\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n proofs?: string[];\n }\n ): Promise<string>;\n\n /**\n * Verify a UCAN token\n */\n verifyUCAN(\n token: string,\n options?: {\n expectedAudience?: string;\n requiredCapabilities?: Array<{ can: string; with: string }>;\n }\n ): Promise<AeonCapabilityResult>;\n\n /**\n * Delegate capabilities\n */\n delegateCapabilities(\n parentToken: string,\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n }\n ): Promise<string>;\n\n // ===========================================================================\n // UTILITY OPERATIONS\n // ===========================================================================\n\n /**\n * Compute hash of data\n */\n hash(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): Uint8Array;\n\n /**\n * Check if crypto is properly initialized\n */\n isInitialized(): boolean;\n}\n\n/**\n * Null crypto provider for when crypto is disabled\n *\n * All operations either throw or return permissive defaults.\n */\nexport class NullCryptoProvider implements ICryptoProvider {\n private notConfiguredError(): Error {\n return new Error('Crypto provider not configured');\n }\n\n async generateIdentity(): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }> {\n throw this.notConfiguredError();\n }\n\n getLocalDID(): string | null {\n return null;\n }\n\n async exportPublicIdentity(): Promise<SecureNodeInfo | null> {\n return null;\n }\n\n async registerRemoteNode(): Promise<void> {\n // No-op when crypto disabled\n }\n\n async getRemotePublicKey(): Promise<JsonWebKey | null> {\n return null;\n }\n\n async sign(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async signData<T>(_data: T): Promise<SignedSyncData<T>> {\n throw this.notConfiguredError();\n }\n\n async verify(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async verifySignedData(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async encrypt(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decrypt(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async getSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async encryptWithSessionKey(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decryptWithSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async createUCAN(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async verifyUCAN(): Promise<AeonCapabilityResult> {\n // Permissive when crypto disabled\n return { authorized: true };\n }\n\n async delegateCapabilities(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async hash(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n randomBytes(length: number): Uint8Array {\n // Use crypto.getRandomValues even without full crypto setup\n return crypto.getRandomValues(new Uint8Array(length));\n }\n\n isInitialized(): boolean {\n return false;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/logger.ts","../src/persistence/DashStorageAdapter.ts","../src/persistence/InMemoryStorageAdapter.ts","../src/versioning/SchemaVersionManager.ts","../src/versioning/MigrationEngine.ts","../src/versioning/DataTransformer.ts","../src/versioning/MigrationTracker.ts","../src/distributed/SyncCoordinator.ts","../src/distributed/ReplicationManager.ts","../src/distributed/SyncProtocol.ts","../src/distributed/StateReconciler.ts","../src/offline/OfflineOperationQueue.ts","../src/compression/CompressionEngine.ts","../src/compression/DeltaSyncOptimizer.ts","../src/optimization/PrefetchingEngine.ts","../src/optimization/BatchTimingOptimizer.ts","../src/optimization/AdaptiveCompressionOptimizer.ts","../src/presence/AgentPresenceManager.ts","../src/crypto/types.ts","../src/crypto/CryptoProvider.ts","../src/crypto/transactionSigner.ts","../src/flow/FlowCodec.ts","../src/flow/types.ts","../src/flow/AeonFlowProtocol.ts","../src/flow/frame-reassembler.ts","../src/flow/UDPFlowTransport.ts","../src/transport/dashrelay.ts","../src/transport/bluetooth.ts","../src/transport/webrtc.ts","../src/transport/tcp.ts","../src/transport/ipc.ts","../src/transport/usb.ts","../src/transport/http.ts","../src/federation/federated-inference.ts","../src/index.ts"],"names":["logger","result","EventEmitter","deltaSize","encoder","decoder","LENGTH_PREFIX_SIZE"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Aeon Logger Interface\n *\n * Provides a pluggable logging interface that can be configured\n * by consumers to integrate with their preferred logging solution.\n */\n\n/**\n * Logger interface that consumers can implement\n */\nexport interface Logger {\n debug: (...args: unknown[]) => void;\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n}\n\n/**\n * Default console logger implementation\n */\nconst consoleLogger: Logger = {\n debug: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.debug('[AEON:DEBUG]', ...args);\n },\n info: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.info('[AEON:INFO]', ...args);\n },\n warn: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.warn('[AEON:WARN]', ...args);\n },\n error: (...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error('[AEON:ERROR]', ...args);\n },\n};\n\n/**\n * No-op logger for production or when logging is disabled\n */\nconst noopLogger: Logger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Current logger instance\n */\nlet currentLogger: Logger = consoleLogger;\n\n/**\n * Get the current logger instance\n */\nexport function getLogger(): Logger {\n return currentLogger;\n}\n\n/**\n * Set a custom logger implementation\n */\nexport function setLogger(logger: Logger): void {\n currentLogger = logger;\n}\n\n/**\n * Reset to the default console logger\n */\nexport function resetLogger(): void {\n currentLogger = consoleLogger;\n}\n\n/**\n * Disable all logging\n */\nexport function disableLogging(): void {\n currentLogger = noopLogger;\n}\n\n/**\n * Create a namespaced logger\n */\nexport function createNamespacedLogger(namespace: string): Logger {\n const logger = getLogger();\n return {\n debug: (...args: unknown[]) => logger.debug(`[${namespace}]`, ...args),\n info: (...args: unknown[]) => logger.info(`[${namespace}]`, ...args),\n warn: (...args: unknown[]) => logger.warn(`[${namespace}]`, ...args),\n error: (...args: unknown[]) => logger.error(`[${namespace}]`, ...args),\n };\n}\n\n// Export default logger for convenience\nexport const logger: Logger = {\n debug: (...args: unknown[]) => getLogger().debug(...args),\n info: (...args: unknown[]) => getLogger().info(...args),\n warn: (...args: unknown[]) => getLogger().warn(...args),\n error: (...args: unknown[]) => getLogger().error(...args),\n};\n","import type { StorageAdapter } from './types';\n\nexport interface DashStorageBackend {\n get(key: string): Promise<string | null> | string | null;\n set(key: string, value: string): Promise<void> | void;\n delete(key: string): Promise<void> | void;\n}\n\nexport interface DashStorageChange {\n key: string;\n operation: 'set' | 'delete';\n value?: string;\n timestamp: number;\n}\n\nexport interface DashSyncClient {\n syncChanges(changes: DashStorageChange[]): Promise<void>;\n}\n\nexport type DashSyncUrgency = 'realtime' | 'deferred' | 'lazy';\n\nexport interface DashSyncRule {\n /** How quickly to sync changes for keys matching this rule/prefix */\n urgency: DashSyncUrgency;\n /** Debounce/Interval for deferred/lazy sync (e.g. '1s', '1m', '1h') */\n debounce?: string | number;\n /** Maximum number of pending changes before forcing a sync */\n maxBufferSize?: number;\n /** Whether to return pending values from memory (default: true) */\n readThrough?: boolean;\n}\n\nexport interface DashSyncRules {\n default?: DashSyncRule;\n /** Key prefix mapping to sync rules */\n prefixes?: Record<string, DashSyncRule>;\n}\n\nexport interface DashStorageAdapterHooks {\n onSync?: (changes: DashStorageChange[]) => void;\n onSyncError?: (error: Error, changes: DashStorageChange[]) => void;\n onBufferOverflow?: (prefix: string, size: number, max: number) => void;\n onFlush?: (count: number) => void;\n}\n\nexport interface DashStorageAdapterOptions {\n syncClient?: DashSyncClient;\n rules?: DashSyncRules;\n hooks?: DashStorageAdapterHooks;\n /** @deprecated Use rules.default.debounce */\n syncDebounceMs?: number;\n /** @deprecated Use rules.default.maxBufferSize */\n maxPendingChanges?: number;\n /** @deprecated Use hooks.onSyncError */\n onSyncError?: (error: Error, changes: DashStorageChange[]) => void;\n}\n\nconst DEFAULT_RULE: DashSyncRule = {\n urgency: 'deferred',\n debounce: 50,\n maxBufferSize: 5000,\n readThrough: true,\n};\n\n/**\n * Storage adapter boundary for dash-backed persistence.\n *\n * Provides a \"Write Pool\" layer that buffers local-first writes and flushes\n * them to D1/R2 via a sync client based on declarative rules.\n */\nexport class DashStorageAdapter implements StorageAdapter {\n private readonly backend: DashStorageBackend;\n private readonly syncClient: DashSyncClient | null;\n private readonly rules: DashSyncRules;\n private readonly hooks: DashStorageAdapterHooks;\n private readonly pendingChanges = new Map<string, DashStorageChange>();\n private syncTimer: ReturnType<typeof setTimeout> | null = null;\n private syncInFlight = false;\n private syncPending = false;\n\n constructor(\n backend: DashStorageBackend,\n options: DashStorageAdapterOptions = {}\n ) {\n this.backend = backend;\n this.syncClient = options.syncClient ?? null;\n this.hooks = options.hooks ?? {};\n\n // Migration/Fallback for deprecated options\n const defaultRule: DashSyncRule = {\n ...DEFAULT_RULE,\n ...(options.rules?.default ?? {}),\n };\n if (options.syncDebounceMs !== undefined)\n defaultRule.debounce = options.syncDebounceMs;\n if (options.maxPendingChanges !== undefined)\n defaultRule.maxBufferSize = options.maxPendingChanges;\n if (options.onSyncError && !this.hooks.onSyncError)\n this.hooks.onSyncError = options.onSyncError;\n\n this.rules = {\n default: defaultRule,\n prefixes: options.rules?.prefixes ?? {},\n };\n }\n\n /**\n * Get an item, checking the write pool (pending changes) first for consistency.\n */\n async getItem(key: string): Promise<string | null> {\n const rule = this.getRuleForKey(key);\n\n // Read-through: check memory first if enabled\n if (rule.readThrough !== false) {\n const pending = this.pendingChanges.get(key);\n if (pending) {\n return pending.operation === 'delete' ? null : pending.value ?? null;\n }\n }\n\n return await this.backend.get(key);\n }\n\n async setItem(key: string, value: string): Promise<void> {\n await this.backend.set(key, value);\n this.trackChange({\n key,\n operation: 'set',\n value,\n timestamp: Date.now(),\n });\n }\n\n async removeItem(key: string): Promise<void> {\n await this.backend.delete(key);\n this.trackChange({\n key,\n operation: 'delete',\n timestamp: Date.now(),\n });\n }\n\n getPendingSyncCount(): number {\n return this.pendingChanges.size;\n }\n\n async flushSync(): Promise<void> {\n if (!this.syncClient || this.pendingChanges.size === 0) {\n return;\n }\n if (this.syncTimer) {\n clearTimeout(this.syncTimer);\n this.syncTimer = null;\n }\n await this.performSync();\n }\n\n private trackChange(change: DashStorageChange): void {\n this.pendingChanges.set(change.key, change);\n\n const rule = this.getRuleForKey(change.key);\n\n // Immediate flush for realtime\n if (rule.urgency === 'realtime') {\n void this.performSync();\n return;\n }\n\n // Check for buffer overflow\n const maxSize = rule.maxBufferSize ?? 5000;\n if (this.pendingChanges.size >= maxSize) {\n this.hooks.onBufferOverflow?.(\n this.getPrefixMatch(change.key) || 'default',\n this.pendingChanges.size,\n maxSize\n );\n void this.performSync();\n return;\n }\n\n this.scheduleSync(rule);\n }\n\n private getRuleForKey(key: string): DashSyncRule {\n const prefix = this.getPrefixMatch(key);\n return (\n (prefix ? this.rules.prefixes?.[prefix] : this.rules.default) ??\n this.rules.default!\n );\n }\n\n private getPrefixMatch(key: string): string | null {\n if (!this.rules.prefixes) {\n return null;\n }\n // Match longest prefix first\n const prefixes = Object.keys(this.rules.prefixes).sort(\n (a, b) => b.length - a.length\n );\n return prefixes.find((p) => key.startsWith(p)) ?? null;\n }\n\n private scheduleSync(rule: DashSyncRule): void {\n if (!this.syncClient || this.syncTimer) {\n return;\n }\n\n const debounceMs =\n typeof rule.debounce === 'string'\n ? this.parseInterval(rule.debounce)\n : rule.debounce ?? 50;\n\n this.syncTimer = setTimeout(() => {\n this.syncTimer = null;\n void this.performSync();\n }, debounceMs);\n }\n\n private async performSync(): Promise<void> {\n if (!this.syncClient) {\n return;\n }\n\n if (this.syncInFlight) {\n this.syncPending = true;\n return;\n }\n\n const changes = Array.from(this.pendingChanges.values()).sort(\n (a, b) => a.timestamp - b.timestamp\n );\n if (changes.length === 0) {\n return;\n }\n\n this.pendingChanges.clear();\n this.syncInFlight = true;\n try {\n await this.syncClient.syncChanges(changes);\n this.hooks.onSync?.(changes);\n this.hooks.onFlush?.(changes.length);\n } catch (error) {\n // Re-queue changes if they haven't been overwritten by newer local writes\n for (const change of changes) {\n const current = this.pendingChanges.get(change.key);\n if (!current || change.timestamp > current.timestamp) {\n this.pendingChanges.set(change.key, change);\n }\n }\n\n if (this.hooks.onSyncError) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n this.hooks.onSyncError(normalizedError, changes);\n }\n } finally {\n this.syncInFlight = false;\n const rerun = this.syncPending || this.pendingChanges.size > 0;\n this.syncPending = false;\n if (rerun) {\n // Use default rule for re-run or wait for next trackChange\n this.scheduleSync(this.rules.default!);\n }\n }\n }\n\n private parseInterval(input: string): number {\n const match = input.match(/^(\\d+)(ms|s|m|h|d)$/);\n if (!match) return 50;\n const value = parseInt(match[1], 10);\n const unit = match[2];\n switch (unit) {\n case 'ms':\n return value;\n case 's':\n return value * 1000;\n case 'm':\n return value * 60 * 1000;\n case 'h':\n return value * 60 * 60 * 1000;\n case 'd':\n return value * 24 * 60 * 60 * 1000;\n default:\n return 50;\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\n/**\n * In-memory adapter for tests and ephemeral runtimes.\n */\nexport class InMemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n setItem(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n removeItem(key: string): void {\n this.store.delete(key);\n }\n\n async flushSync(): Promise<void> {\n /* noop */\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n","/**\n * Schema Version Manager\n *\n * Manages schema versioning across the application.\n * Tracks version history, compatibility, and migration paths.\n *\n * Features:\n * - Version tracking and comparison\n * - Compatibility matrix management\n * - Migration path calculation\n * - Version validation\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface SchemaVersion {\n major: number;\n minor: number;\n patch: number;\n timestamp: string;\n description: string;\n breaking: boolean;\n}\n\nexport interface VersionMetadata {\n version: SchemaVersion;\n previousVersion?: SchemaVersion;\n changes: string[];\n migrationsRequired: string[];\n rollbackPossible: boolean;\n}\n\nexport interface CompatibilityRule {\n from: string;\n to: string;\n compatible: boolean;\n requiresMigration: boolean;\n migrationSteps: number;\n}\n\n/**\n * Schema Version Manager\n * Tracks and manages schema versions across the application\n */\nexport class SchemaVersionManager {\n private versions: Map<string, SchemaVersion> = new Map();\n private versionHistory: SchemaVersion[] = [];\n private compatibilityMatrix: Map<string, CompatibilityRule[]> = new Map();\n private currentVersion: SchemaVersion | null = null;\n\n constructor() {\n this.initializeDefaultVersions();\n }\n\n /**\n * Initialize default versions\n */\n private initializeDefaultVersions(): void {\n const v1_0_0: SchemaVersion = {\n major: 1,\n minor: 0,\n patch: 0,\n timestamp: new Date().toISOString(),\n description: 'Initial schema version',\n breaking: false,\n };\n\n this.registerVersion(v1_0_0);\n this.currentVersion = v1_0_0;\n }\n\n /**\n * Register a new schema version\n */\n registerVersion(version: SchemaVersion): void {\n const versionString = this.versionToString(version);\n\n this.versions.set(versionString, version);\n this.versionHistory.push(version);\n\n logger.debug('[SchemaVersionManager] Version registered', {\n version: versionString,\n breaking: version.breaking,\n description: version.description,\n });\n }\n\n /**\n * Get current version\n */\n getCurrentVersion(): SchemaVersion {\n if (!this.currentVersion) {\n throw new Error('No current version set');\n }\n return this.currentVersion;\n }\n\n /**\n * Set current version\n */\n setCurrentVersion(version: SchemaVersion): void {\n if (!this.versions.has(this.versionToString(version))) {\n throw new Error(\n `Version ${this.versionToString(version)} not registered`\n );\n }\n\n this.currentVersion = version;\n logger.debug('[SchemaVersionManager] Current version set', {\n version: this.versionToString(version),\n });\n }\n\n /**\n * Get version history\n */\n getVersionHistory(): SchemaVersion[] {\n return [...this.versionHistory];\n }\n\n /**\n * Check if version exists\n */\n hasVersion(version: SchemaVersion): boolean {\n return this.versions.has(this.versionToString(version));\n }\n\n /**\n * Get version by string (e.g., \"1.2.3\")\n */\n getVersion(versionString: string): SchemaVersion | undefined {\n return this.versions.get(versionString);\n }\n\n /**\n * Register compatibility rule\n */\n registerCompatibility(rule: CompatibilityRule): void {\n if (!this.compatibilityMatrix.has(rule.from)) {\n this.compatibilityMatrix.set(rule.from, []);\n }\n\n const rules = this.compatibilityMatrix.get(rule.from);\n if (rules) {\n rules.push(rule);\n }\n\n logger.debug('[SchemaVersionManager] Compatibility rule registered', {\n from: rule.from,\n to: rule.to,\n compatible: rule.compatible,\n requiresMigration: rule.requiresMigration,\n });\n }\n\n /**\n * Check if migration path exists\n */\n canMigrate(\n fromVersion: SchemaVersion | string,\n toVersion: SchemaVersion | string\n ): boolean {\n const fromStr =\n typeof fromVersion === 'string'\n ? fromVersion\n : this.versionToString(fromVersion);\n const toStr =\n typeof toVersion === 'string'\n ? toVersion\n : this.versionToString(toVersion);\n\n const rules = this.compatibilityMatrix.get(fromStr) || [];\n return rules.some((r) => r.to === toStr && r.requiresMigration);\n }\n\n /**\n * Get migration path\n */\n getMigrationPath(\n fromVersion: SchemaVersion,\n toVersion: SchemaVersion\n ): SchemaVersion[] {\n const path: SchemaVersion[] = [];\n let current = fromVersion;\n\n const maxSteps = 100; // Prevent infinite loops\n let steps = 0;\n\n while (this.compareVersions(current, toVersion) !== 0 && steps < maxSteps) {\n const fromStr = this.versionToString(current);\n const rules = this.compatibilityMatrix.get(fromStr) || [];\n\n let found = false;\n for (const rule of rules) {\n const nextVersion = this.getVersion(rule.to);\n if (nextVersion) {\n // Find the closest path to target\n if (\n this.compareVersions(nextVersion, toVersion) <= 0 ||\n this.compareVersions(current, nextVersion) <\n this.compareVersions(current, toVersion)\n ) {\n current = nextVersion;\n path.push(current);\n found = true;\n break;\n }\n }\n }\n\n if (!found) {\n break;\n }\n\n steps++;\n }\n\n return path;\n }\n\n /**\n * Compare two versions\n * Returns: -1 if v1 < v2, 0 if equal, 1 if v1 > v2\n */\n compareVersions(\n v1: SchemaVersion | string,\n v2: SchemaVersion | string\n ): number {\n const ver1 = typeof v1 === 'string' ? this.parseVersion(v1) : v1;\n const ver2 = typeof v2 === 'string' ? this.parseVersion(v2) : v2;\n\n if (ver1.major !== ver2.major) {\n return ver1.major < ver2.major ? -1 : 1;\n }\n if (ver1.minor !== ver2.minor) {\n return ver1.minor < ver2.minor ? -1 : 1;\n }\n if (ver1.patch !== ver2.patch) {\n return ver1.patch < ver2.patch ? -1 : 1;\n }\n return 0;\n }\n\n /**\n * Parse version string to SchemaVersion\n */\n parseVersion(versionString: string): SchemaVersion {\n const parts = versionString.split('.').map(Number);\n const safeInt = (v: number | undefined): number =>\n v !== undefined && Number.isFinite(v) ? v : 0;\n return {\n major: safeInt(parts[0]),\n minor: safeInt(parts[1]),\n patch: safeInt(parts[2]),\n timestamp: new Date().toISOString(),\n description: '',\n breaking: false,\n };\n }\n\n /**\n * Create new version\n */\n createVersion(\n major: number,\n minor: number,\n patch: number,\n description: string,\n breaking: boolean = false\n ): SchemaVersion {\n return {\n major,\n minor,\n patch,\n timestamp: new Date().toISOString(),\n description,\n breaking,\n };\n }\n\n /**\n * Convert version to string\n */\n versionToString(version: SchemaVersion): string {\n return `${version.major}.${version.minor}.${version.patch}`;\n }\n\n /**\n * Get version metadata\n */\n getVersionMetadata(version: SchemaVersion): VersionMetadata {\n const history = this.versionHistory;\n const currentIndex = history.findIndex(\n (v) => this.versionToString(v) === this.versionToString(version)\n );\n\n return {\n version,\n previousVersion: currentIndex > 0 ? history[currentIndex - 1] : undefined,\n changes: [version.description],\n migrationsRequired: this.canMigrate(\n this.currentVersion || version,\n version\n )\n ? [this.versionToString(version)]\n : [],\n rollbackPossible: currentIndex > 0,\n };\n }\n\n /**\n * Get all registered versions\n */\n getAllVersions(): SchemaVersion[] {\n return Array.from(this.versions.values()).sort((a, b) =>\n this.compareVersions(a, b)\n );\n }\n\n /**\n * Clear all versions (for testing)\n */\n clear(): void {\n this.versions.clear();\n this.versionHistory = [];\n this.compatibilityMatrix.clear();\n this.currentVersion = null;\n }\n}\n","/**\n * Migration Engine\n *\n * Executes schema migrations with rollback support.\n * Manages migration execution, error handling, and state management.\n *\n * Features:\n * - Migration execution and tracking\n * - Rollback support\n * - Error handling and recovery\n * - Migration state management\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface Migration {\n id: string;\n version: string;\n name: string;\n up: (data: unknown) => unknown;\n down?: (data: unknown) => unknown;\n timestamp: string;\n description: string;\n}\n\nexport interface MigrationResult {\n migrationId: string;\n success: boolean;\n timestamp: string;\n duration: number;\n itemsAffected: number;\n errors: string[];\n}\n\nexport interface MigrationState {\n currentVersion: string;\n appliedMigrations: string[];\n failedMigrations: string[];\n lastMigrationTime: string;\n totalMigrationsRun: number;\n}\n\n/**\n * Migration Engine\n * Executes and manages schema migrations\n */\nexport class MigrationEngine {\n private migrations: Map<string, Migration> = new Map();\n private executedMigrations: MigrationResult[] = [];\n private state: MigrationState = {\n currentVersion: '1.0.0',\n appliedMigrations: [],\n failedMigrations: [],\n lastMigrationTime: new Date().toISOString(),\n totalMigrationsRun: 0,\n };\n\n /**\n * Register a migration\n */\n registerMigration(migration: Migration): void {\n this.migrations.set(migration.id, migration);\n\n logger.debug('[MigrationEngine] Migration registered', {\n id: migration.id,\n version: migration.version,\n name: migration.name,\n });\n }\n\n /**\n * Execute a migration\n */\n async executeMigration(\n migrationId: string,\n data: unknown\n ): Promise<MigrationResult> {\n const migration = this.migrations.get(migrationId);\n if (!migration) {\n throw new Error(`Migration ${migrationId} not found`);\n }\n\n const startTime = Date.now();\n const result: MigrationResult = {\n migrationId,\n success: false,\n timestamp: new Date().toISOString(),\n duration: 0,\n itemsAffected: 0,\n errors: [],\n };\n\n try {\n logger.debug('[MigrationEngine] Executing migration', {\n id: migrationId,\n version: migration.version,\n });\n\n // Execute up migration\n migration.up(data);\n\n result.success = true;\n result.itemsAffected = Array.isArray(data)\n ? (data as unknown[]).length\n : 1;\n result.duration = Date.now() - startTime;\n\n // Track as applied\n this.state.appliedMigrations.push(migrationId);\n this.state.currentVersion = migration.version;\n this.state.totalMigrationsRun++;\n this.state.lastMigrationTime = result.timestamp;\n\n this.executedMigrations.push(result);\n\n logger.debug('[MigrationEngine] Migration executed successfully', {\n id: migrationId,\n duration: result.duration,\n itemsAffected: result.itemsAffected,\n });\n\n return result;\n } catch (error) {\n result.errors = [error instanceof Error ? error.message : String(error)];\n this.state.failedMigrations.push(migrationId);\n\n this.executedMigrations.push(result);\n\n logger.error('[MigrationEngine] Migration failed', {\n id: migrationId,\n error: result.errors[0],\n });\n\n throw new Error(`Migration ${migrationId} failed: ${result.errors[0]}`);\n }\n }\n\n /**\n * Rollback a migration\n */\n async rollbackMigration(\n migrationId: string,\n data: unknown\n ): Promise<MigrationResult> {\n const migration = this.migrations.get(migrationId);\n if (!migration) {\n throw new Error(`Migration ${migrationId} not found`);\n }\n\n if (!migration.down) {\n throw new Error(`Migration ${migrationId} does not support rollback`);\n }\n\n const startTime = Date.now();\n const result: MigrationResult = {\n migrationId,\n success: false,\n timestamp: new Date().toISOString(),\n duration: 0,\n itemsAffected: 0,\n errors: [],\n };\n\n try {\n logger.debug('[MigrationEngine] Rolling back migration', {\n id: migrationId,\n version: migration.version,\n });\n\n // Execute down migration\n migration.down(data);\n\n result.success = true;\n result.itemsAffected = Array.isArray(data)\n ? (data as unknown[]).length\n : 1;\n result.duration = Date.now() - startTime;\n\n // Remove from applied migrations\n this.state.appliedMigrations = this.state.appliedMigrations.filter(\n (id) => id !== migrationId\n );\n\n this.executedMigrations.push(result);\n\n logger.debug('[MigrationEngine] Migration rolled back', {\n id: migrationId,\n duration: result.duration,\n });\n\n return result;\n } catch (error) {\n result.errors = [error instanceof Error ? error.message : String(error)];\n\n this.executedMigrations.push(result);\n\n logger.error('[MigrationEngine] Rollback failed', {\n id: migrationId,\n error: result.errors[0],\n });\n\n throw new Error(\n `Rollback for ${migrationId} failed: ${result.errors[0]}`\n );\n }\n }\n\n /**\n * Get migration state\n */\n getState(): MigrationState {\n return { ...this.state };\n }\n\n /**\n * Get migration execution history\n */\n getExecutionHistory(): MigrationResult[] {\n return [...this.executedMigrations];\n }\n\n /**\n * Get migration by ID\n */\n getMigration(migrationId: string): Migration | undefined {\n return this.migrations.get(migrationId);\n }\n\n /**\n * Get all registered migrations\n */\n getAllMigrations(): Migration[] {\n return Array.from(this.migrations.values());\n }\n\n /**\n * Get applied migrations\n */\n getAppliedMigrations(): string[] {\n return [...this.state.appliedMigrations];\n }\n\n /**\n * Get failed migrations\n */\n getFailedMigrations(): string[] {\n return [...this.state.failedMigrations];\n }\n\n /**\n * Get pending migrations\n */\n getPendingMigrations(): Migration[] {\n return this.getAllMigrations().filter(\n (m) => !this.state.appliedMigrations.includes(m.id)\n );\n }\n\n /**\n * Get migration statistics\n */\n getStatistics() {\n const successful = this.executedMigrations.filter((m) => m.success).length;\n const failed = this.executedMigrations.filter((m) => !m.success).length;\n const totalDuration = this.executedMigrations.reduce(\n (sum, m) => sum + m.duration,\n 0\n );\n const totalAffected = this.executedMigrations.reduce(\n (sum, m) => sum + m.itemsAffected,\n 0\n );\n\n return {\n totalExecuted: this.executedMigrations.length,\n successful,\n failed,\n successRate:\n this.executedMigrations.length > 0\n ? (successful / this.executedMigrations.length) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageDurationMs:\n this.executedMigrations.length > 0\n ? totalDuration / this.executedMigrations.length\n : 0,\n totalAffected,\n };\n }\n\n /**\n * Clear history (for testing)\n */\n clear(): void {\n this.migrations.clear();\n this.executedMigrations = [];\n this.state = {\n currentVersion: '1.0.0',\n appliedMigrations: [],\n failedMigrations: [],\n lastMigrationTime: new Date().toISOString(),\n totalMigrationsRun: 0,\n };\n }\n}\n","/**\n * Data Transformer\n *\n * Transforms data structures during schema migrations.\n * Handles field transformation, type casting, and validation.\n *\n * Features:\n * - Field-level transformation\n * - Type conversion and casting\n * - Validation during transformation\n * - Error handling and reporting\n * - Batch transformation support\n */\n\nimport { logger } from '../utils/logger';\n\nexport interface FieldTransformer {\n (value: unknown): unknown;\n}\n\nexport interface TransformationRule {\n field: string;\n transformer: FieldTransformer;\n required?: boolean;\n defaultValue?: unknown;\n}\n\nexport interface TransformationResult {\n success: boolean;\n itemsTransformed: number;\n itemsFailed: number;\n errors: Array<{ item: unknown; error: string }>;\n warnings: string[];\n duration: number;\n}\n\n/**\n * Data Transformer\n * Transforms data structures during schema migrations\n */\nexport class DataTransformer {\n private rules: Map<string, TransformationRule> = new Map();\n private transformationHistory: TransformationResult[] = [];\n\n /**\n * Register a transformation rule\n */\n registerRule(rule: TransformationRule): void {\n this.rules.set(rule.field, rule);\n\n logger.debug('[DataTransformer] Rule registered', {\n field: rule.field,\n required: rule.required,\n hasDefault: rule.defaultValue !== undefined,\n });\n }\n\n /**\n * Transform a single field value\n */\n transformField(field: string, value: unknown): unknown {\n const rule = this.rules.get(field);\n if (!rule) {\n // No rule = no transformation\n return value;\n }\n\n try {\n return rule.transformer(value);\n } catch (error) {\n if (rule.required) {\n throw new Error(\n `Failed to transform required field ${field}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n // Return default value or original value\n return rule.defaultValue !== undefined ? rule.defaultValue : value;\n }\n }\n\n /**\n * Transform a single object\n */\n transformObject(data: Record<string, unknown>): Record<string, unknown> {\n const transformed: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n try {\n transformed[key] = this.transformField(key, value);\n } catch (error) {\n logger.warn('[DataTransformer] Field transformation failed', {\n field: key,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // If field is not required, include original value\n const rule = this.rules.get(key);\n if (!rule || !rule.required) {\n transformed[key] = value;\n }\n }\n }\n\n return transformed;\n }\n\n /**\n * Transform a collection of items\n */\n transformCollection(items: unknown[]): TransformationResult {\n const startTime = Date.now();\n const result: TransformationResult = {\n success: true,\n itemsTransformed: 0,\n itemsFailed: 0,\n errors: [],\n warnings: [],\n duration: 0,\n };\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n\n try {\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n this.transformObject(item as Record<string, unknown>);\n result.itemsTransformed++;\n } else {\n // Cannot transform non-object items\n result.warnings.push(`Item ${i} is not a transformable object`);\n }\n } catch (error) {\n result.errors.push({\n item,\n error: error instanceof Error ? error.message : String(error),\n });\n result.itemsFailed++;\n }\n }\n\n result.duration = Date.now() - startTime;\n result.success = result.itemsFailed === 0;\n\n this.transformationHistory.push(result);\n\n logger.debug('[DataTransformer] Collection transformed', {\n total: items.length,\n transformed: result.itemsTransformed,\n failed: result.itemsFailed,\n duration: result.duration,\n });\n\n return result;\n }\n\n /**\n * Validate transformed data\n */\n validateTransformation(\n original: unknown[],\n transformed: unknown[]\n ): {\n valid: boolean;\n issues: string[];\n } {\n const issues: string[] = [];\n\n if (original.length !== transformed.length) {\n issues.push(\n `Item count mismatch: ${original.length} -> ${transformed.length}`\n );\n }\n\n // Check that all items were processed\n for (let i = 0; i < Math.min(original.length, transformed.length); i++) {\n const orig = original[i];\n const trans = transformed[i];\n\n if (!this.validateItem(orig, trans)) {\n issues.push(`Item ${i} validation failed`);\n }\n }\n\n return {\n valid: issues.length === 0,\n issues,\n };\n }\n\n /**\n * Validate a single item transformation\n */\n private validateItem(original: unknown, transformed: unknown): boolean {\n // Basic validation: ensure transformed exists if original exists\n if (original === null || original === undefined) {\n return true;\n }\n\n if (typeof original === 'object' && typeof transformed !== 'object') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Get transformation history\n */\n getTransformationHistory(): TransformationResult[] {\n return [...this.transformationHistory];\n }\n\n /**\n * Get transformation statistics\n */\n getStatistics() {\n const totalTransformed = this.transformationHistory.reduce(\n (sum, r) => sum + r.itemsTransformed,\n 0\n );\n const totalFailed = this.transformationHistory.reduce(\n (sum, r) => sum + r.itemsFailed,\n 0\n );\n const totalDuration = this.transformationHistory.reduce(\n (sum, r) => sum + r.duration,\n 0\n );\n\n return {\n totalBatches: this.transformationHistory.length,\n totalTransformed,\n totalFailed,\n successRate:\n totalTransformed + totalFailed > 0\n ? (totalTransformed / (totalTransformed + totalFailed)) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageBatchDurationMs:\n this.transformationHistory.length > 0\n ? totalDuration / this.transformationHistory.length\n : 0,\n };\n }\n\n /**\n * Get registered rules\n */\n getRules(): TransformationRule[] {\n return Array.from(this.rules.values());\n }\n\n /**\n * Get rule for field\n */\n getRule(field: string): TransformationRule | undefined {\n return this.rules.get(field);\n }\n\n /**\n * Clear all rules (for testing)\n */\n clearRules(): void {\n this.rules.clear();\n }\n\n /**\n * Clear history (for testing)\n */\n clearHistory(): void {\n this.transformationHistory = [];\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.clearRules();\n this.clearHistory();\n }\n}\n","/**\n * Migration Tracker\n *\n * Tracks migration history and enables rollback.\n * Maintains detailed audit trail of all schema changes.\n *\n * Features:\n * - Migration history tracking\n * - Rollback path calculation\n * - Data snapshots for recovery\n * - Audit trail with timestamps\n * - Migration dependency tracking\n */\n\nimport { logger } from '../utils/logger';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface MigrationRecord {\n id: string;\n migrationId: string;\n timestamp: string;\n version: string;\n direction: 'up' | 'down';\n status: 'pending' | 'applied' | 'failed' | 'rolled-back';\n duration: number;\n itemsAffected: number;\n dataSnapshot?: {\n beforeHash: string;\n afterHash: string;\n itemCount: number;\n };\n errorMessage?: string;\n appliedBy: string;\n metadata?: Record<string, unknown>;\n previousHash?: string;\n integrityHash?: string;\n}\n\nexport interface RollbackPath {\n path: string[];\n canRollback: boolean;\n affectedVersions: string[];\n estimatedDuration: number;\n}\n\nexport interface MigrationIntegrityEntry {\n recordId: string;\n previousHash: string;\n hash: string;\n}\n\nexport interface MigrationTrackerPersistenceData {\n migrations: MigrationRecord[];\n snapshots: Array<{\n recordId: string;\n beforeHash: string;\n afterHash: string;\n itemCount: number;\n }>;\n integrity: {\n algorithm: 'sha256-chain-v1';\n entries: MigrationIntegrityEntry[];\n rootHash: string;\n };\n}\n\nexport interface MigrationTrackerPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<MigrationTrackerPersistenceData>;\n deserializer?: PersistenceDeserializer<MigrationTrackerPersistenceData>;\n}\n\nexport interface MigrationTrackerOptions {\n persistence?: MigrationTrackerPersistenceConfig;\n}\n\n/**\n * Migration Tracker\n * Tracks and manages migration history with rollback support\n */\nexport class MigrationTracker {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:migration-tracker:v1';\n private static readonly INTEGRITY_ROOT = 'aeon:migration-integrity-root:v1';\n private migrations: MigrationRecord[] = [];\n private snapshots: Map<\n string,\n { beforeHash: string; afterHash: string; itemCount: number }\n > = new Map();\n private persistence:\n | (MigrationTrackerPersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: MigrationTrackerOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? MigrationTracker.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[MigrationTracker] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Track a new migration\n */\n recordMigration(record: MigrationRecord): void {\n this.migrations.push({ ...record });\n this.schedulePersist();\n\n logger.debug('[MigrationTracker] Migration recorded', {\n id: record.id,\n migrationId: record.migrationId,\n version: record.version,\n status: record.status,\n });\n }\n\n /**\n * Track migration with snapshot\n */\n trackMigration(\n migrationId: string,\n version: string,\n beforeHash: string,\n afterHash: string,\n itemCount: number,\n duration: number,\n itemsAffected: number,\n appliedBy = 'system'\n ): void {\n const record: MigrationRecord = {\n id: `${migrationId}-${Date.now()}`,\n migrationId,\n timestamp: new Date().toISOString(),\n version,\n direction: 'up',\n status: 'applied',\n duration,\n itemsAffected,\n dataSnapshot: {\n beforeHash,\n afterHash,\n itemCount,\n },\n appliedBy,\n };\n\n this.recordMigration(record);\n this.snapshots.set(record.id, {\n beforeHash,\n afterHash,\n itemCount,\n });\n }\n\n /**\n * Get all migration records\n */\n getMigrations(): MigrationRecord[] {\n return this.migrations.map((m) => ({ ...m }));\n }\n\n /**\n * Get migrations for a specific version\n */\n getMigrationsForVersion(version: string): MigrationRecord[] {\n return this.migrations.filter((m) => m.version === version);\n }\n\n /**\n * Get migration by ID\n */\n getMigration(id: string): MigrationRecord | undefined {\n return this.migrations.find((m) => m.id === id);\n }\n\n /**\n * Check if can rollback\n */\n canRollback(fromVersion: string, toVersion: string): boolean {\n // Find all migrations from fromVersion going down to toVersion\n const fromIndex = this.migrations.findIndex(\n (m) => m.version === fromVersion\n );\n const toIndex = this.migrations.findIndex((m) => m.version === toVersion);\n\n if (fromIndex === -1 || toIndex === -1) {\n return false;\n }\n\n if (toIndex >= fromIndex) {\n return false;\n }\n\n // Check all migrations in between have rollback support (dataSnapshot)\n for (let i = fromIndex; i > toIndex; i--) {\n if (!this.migrations[i]?.dataSnapshot) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Get rollback path\n */\n getRollbackPath(fromVersion: string, toVersion: string): RollbackPath {\n const canRollback = this.canRollback(fromVersion, toVersion);\n const path: string[] = [];\n const affectedVersions: string[] = [];\n let estimatedDuration = 0;\n\n if (canRollback) {\n const fromIndex = this.migrations.findIndex(\n (m) => m.version === fromVersion\n );\n const toIndex = this.migrations.findIndex((m) => m.version === toVersion);\n\n for (let i = fromIndex; i > toIndex; i--) {\n const migration = this.migrations[i];\n if (migration) {\n path.push(migration.migrationId);\n affectedVersions.push(migration.version);\n estimatedDuration += migration.duration;\n }\n }\n }\n\n return {\n path,\n canRollback,\n affectedVersions,\n estimatedDuration,\n };\n }\n\n /**\n * Get applied migrations\n */\n getAppliedMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'applied');\n }\n\n /**\n * Get failed migrations\n */\n getFailedMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'failed');\n }\n\n /**\n * Get pending migrations\n */\n getPendingMigrations(): MigrationRecord[] {\n return this.migrations.filter((m) => m.status === 'pending');\n }\n\n /**\n * Get latest migration\n */\n getLatestMigration(): MigrationRecord | undefined {\n return this.migrations[this.migrations.length - 1];\n }\n\n /**\n * Get migration timeline\n */\n getTimeline(): Array<{ timestamp: string; version: string; status: string }> {\n return this.migrations.map((m) => ({\n timestamp: m.timestamp,\n version: m.version,\n status: m.status,\n }));\n }\n\n /**\n * Get migration statistics\n */\n getStatistics() {\n const applied = this.migrations.filter(\n (m) => m.status === 'applied'\n ).length;\n const failed = this.migrations.filter((m) => m.status === 'failed').length;\n const pending = this.migrations.filter(\n (m) => m.status === 'pending'\n ).length;\n const rolledBack = this.migrations.filter(\n (m) => m.status === 'rolled-back'\n ).length;\n\n const totalDuration = this.migrations.reduce(\n (sum, m) => sum + m.duration,\n 0\n );\n const totalAffected = this.migrations.reduce(\n (sum, m) => sum + m.itemsAffected,\n 0\n );\n\n return {\n total: this.migrations.length,\n applied,\n failed,\n pending,\n rolledBack,\n successRate:\n this.migrations.length > 0\n ? (applied / this.migrations.length) * 100\n : 0,\n totalDurationMs: totalDuration,\n averageDurationMs:\n this.migrations.length > 0 ? totalDuration / this.migrations.length : 0,\n totalItemsAffected: totalAffected,\n };\n }\n\n /**\n * Get audit trail\n */\n getAuditTrail(migrationId?: string) {\n const filtered = migrationId\n ? this.migrations.filter((m) => m.migrationId === migrationId)\n : this.migrations;\n\n return filtered.map((m) => ({\n id: m.id,\n timestamp: m.timestamp,\n migrationId: m.migrationId,\n version: m.version,\n status: m.status,\n appliedBy: m.appliedBy,\n duration: m.duration,\n itemsAffected: m.itemsAffected,\n error: m.errorMessage,\n }));\n }\n\n /**\n * Get data snapshot for recovery\n */\n getSnapshot(recordId: string) {\n return this.snapshots.get(recordId);\n }\n\n /**\n * Update migration status\n */\n updateMigrationStatus(\n recordId: string,\n status: MigrationRecord['status'],\n error?: string\n ): void {\n const migration = this.migrations.find((m) => m.id === recordId);\n if (migration) {\n migration.status = status;\n if (error) {\n migration.errorMessage = error;\n }\n\n logger.debug('[MigrationTracker] Migration status updated', {\n recordId,\n status,\n hasError: !!error,\n });\n this.schedulePersist();\n }\n }\n\n /**\n * Persist tracker state with integrity chain verification metadata.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const normalizedMigrations = this.migrations.map((migration) => ({\n ...migration,\n previousHash: undefined,\n integrityHash: undefined,\n }));\n\n const integrityEntries: MigrationIntegrityEntry[] = [];\n let previousHash = MigrationTracker.INTEGRITY_ROOT;\n\n for (const migration of normalizedMigrations) {\n const hash = await this.computeDigestHex(\n `${previousHash}|${this.stableStringify(migration)}`\n );\n integrityEntries.push({\n recordId: migration.id,\n previousHash,\n hash,\n });\n previousHash = hash;\n }\n\n const persistedMigrations = normalizedMigrations.map(\n (migration, index) => ({\n ...migration,\n previousHash: integrityEntries[index]?.previousHash,\n integrityHash: integrityEntries[index]?.hash,\n })\n );\n\n const data: MigrationTrackerPersistenceData = {\n migrations: persistedMigrations,\n snapshots: Array.from(this.snapshots.entries()).map(\n ([recordId, snapshot]) => ({\n recordId,\n beforeHash: snapshot.beforeHash,\n afterHash: snapshot.afterHash,\n itemCount: snapshot.itemCount,\n })\n ),\n integrity: {\n algorithm: 'sha256-chain-v1',\n entries: integrityEntries,\n rootHash: previousHash,\n },\n };\n\n const envelope: PersistedEnvelope<MigrationTrackerPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<MigrationTrackerPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load tracker state and verify integrity chain.\n */\n async loadFromPersistence(): Promise<{\n migrations: number;\n snapshots: number;\n }> {\n if (!this.persistence) {\n return { migrations: 0, snapshots: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { migrations: 0, snapshots: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(\n value\n ) as PersistedEnvelope<MigrationTrackerPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid migration tracker persistence payload');\n }\n if (\n !Array.isArray(envelope.data.migrations) ||\n !Array.isArray(envelope.data.snapshots) ||\n !envelope.data.integrity ||\n !Array.isArray(envelope.data.integrity.entries) ||\n typeof envelope.data.integrity.rootHash !== 'string'\n ) {\n throw new Error('Invalid migration tracker persistence structure');\n }\n\n if (envelope.data.integrity.algorithm !== 'sha256-chain-v1') {\n throw new Error('Unsupported migration integrity algorithm');\n }\n\n if (\n envelope.data.integrity.entries.length !== envelope.data.migrations.length\n ) {\n throw new Error('Migration integrity entry count mismatch');\n }\n\n const validatedMigrations: MigrationRecord[] = [];\n let previousHash = MigrationTracker.INTEGRITY_ROOT;\n\n for (let i = 0; i < envelope.data.migrations.length; i++) {\n const migration = envelope.data.migrations[i];\n const integrity = envelope.data.integrity.entries[i];\n\n if (!this.isValidMigrationRecord(migration)) {\n throw new Error('Invalid persisted migration record');\n }\n if (\n !integrity ||\n integrity.recordId !== migration.id ||\n integrity.previousHash !== previousHash\n ) {\n throw new Error('Migration integrity chain mismatch');\n }\n\n const expectedHash = await this.computeDigestHex(\n `${previousHash}|${this.stableStringify({\n ...migration,\n previousHash: undefined,\n integrityHash: undefined,\n })}`\n );\n\n if (expectedHash !== integrity.hash) {\n throw new Error('Migration integrity verification failed');\n }\n\n validatedMigrations.push({\n ...migration,\n previousHash: integrity.previousHash,\n integrityHash: integrity.hash,\n });\n\n previousHash = expectedHash;\n }\n\n if (previousHash !== envelope.data.integrity.rootHash) {\n throw new Error('Migration integrity root hash mismatch');\n }\n\n const validatedSnapshots = new Map<\n string,\n { beforeHash: string; afterHash: string; itemCount: number }\n >();\n\n for (const snapshot of envelope.data.snapshots) {\n if (\n typeof snapshot.recordId !== 'string' ||\n typeof snapshot.beforeHash !== 'string' ||\n typeof snapshot.afterHash !== 'string' ||\n typeof snapshot.itemCount !== 'number'\n ) {\n throw new Error('Invalid persisted migration snapshot');\n }\n\n validatedSnapshots.set(snapshot.recordId, {\n beforeHash: snapshot.beforeHash,\n afterHash: snapshot.afterHash,\n itemCount: snapshot.itemCount,\n });\n }\n\n this.migrations = validatedMigrations;\n this.snapshots = validatedSnapshots;\n\n logger.debug('[MigrationTracker] Loaded from persistence', {\n key: this.persistence.key,\n migrations: this.migrations.length,\n snapshots: this.snapshots.size,\n });\n\n return {\n migrations: this.migrations.length,\n snapshots: this.snapshots.size,\n };\n }\n\n /**\n * Remove persisted migration tracker state.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n /**\n * Clear history (for testing)\n */\n clear(): void {\n this.migrations = [];\n this.snapshots.clear();\n this.schedulePersist();\n }\n\n /**\n * Get total migrations tracked\n */\n getTotalMigrations(): number {\n return this.migrations.length;\n }\n\n /**\n * Find migrations by time range\n */\n getMigrationsByTimeRange(\n startTime: string,\n endTime: string\n ): MigrationRecord[] {\n const start = new Date(startTime).getTime();\n const end = new Date(endTime).getTime();\n\n return this.migrations.filter((m) => {\n const time = new Date(m.timestamp).getTime();\n return time >= start && time <= end;\n });\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[MigrationTracker] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidMigrationRecord(value: unknown): value is MigrationRecord {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const record = value as Partial<MigrationRecord>;\n const validDirection =\n record.direction === 'up' || record.direction === 'down';\n const validStatus =\n record.status === 'pending' ||\n record.status === 'applied' ||\n record.status === 'failed' ||\n record.status === 'rolled-back';\n return (\n typeof record.id === 'string' &&\n typeof record.migrationId === 'string' &&\n typeof record.timestamp === 'string' &&\n typeof record.version === 'string' &&\n validDirection &&\n validStatus &&\n typeof record.duration === 'number' &&\n typeof record.itemsAffected === 'number' &&\n typeof record.appliedBy === 'string'\n );\n }\n\n private stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => this.stableStringify(item)).join(',')}]`;\n }\n\n const entries = Object.entries(value as Record<string, unknown>).sort(\n ([a], [b]) => a.localeCompare(b)\n );\n\n return `{${entries\n .map(\n ([key, entryValue]) =>\n `${JSON.stringify(key)}:${this.stableStringify(entryValue)}`\n )\n .join(',')}}`;\n }\n\n private async computeDigestHex(value: string): Promise<string> {\n if (globalThis.crypto?.subtle) {\n const bytes = new TextEncoder().encode(value);\n const normalized = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n );\n const digest = await globalThis.crypto.subtle.digest(\n 'SHA-256',\n normalized\n );\n return this.toHex(new Uint8Array(digest));\n }\n\n return this.fallbackDigestHex(value);\n }\n\n private toHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, '0'))\n .join('');\n }\n\n private fallbackDigestHex(value: string): string {\n let hash = 2166136261;\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n }\n}\n","/**\n * Sync Coordinator\n *\n * Coordinates synchronization between multiple nodes in a distributed system.\n * Manages sync sessions, node registration, and synchronization workflows.\n *\n * Features:\n * - Node registration and discovery\n * - Sync session management\n * - Synchronization workflow orchestration\n * - Node health monitoring\n * - Conflict detection and resolution coordination\n * - DID-based node identification\n * - Authenticated sync sessions\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { AeonEncryptionMode } from '../crypto/types';\n\nexport interface SyncNode {\n id: string;\n address: string;\n port: number;\n status: 'online' | 'offline' | 'syncing';\n lastHeartbeat: string;\n version: string;\n capabilities: string[];\n // DID-based identity (optional, for authenticated nodes)\n did?: string;\n // Public signing key for verification\n publicSigningKey?: JsonWebKey;\n // Public encryption key for E2E encryption\n publicEncryptionKey?: JsonWebKey;\n // Granted capabilities via UCAN\n grantedCapabilities?: string[];\n}\n\nexport interface SyncSession {\n id: string;\n initiatorId: string;\n participantIds: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n itemsSynced: number;\n itemsFailed: number;\n conflictsDetected: number;\n // Security fields for authenticated sessions\n initiatorDID?: string;\n participantDIDs?: string[];\n encryptionMode?: AeonEncryptionMode;\n requiredCapabilities?: string[];\n sessionToken?: string;\n}\n\nexport interface SyncEvent {\n type:\n | 'node-joined'\n | 'node-left'\n | 'sync-started'\n | 'sync-completed'\n | 'conflict-detected';\n sessionId?: string;\n nodeId: string;\n timestamp: string;\n data?: unknown;\n}\n\n/**\n * Sync Coordinator\n * Coordinates synchronization across distributed nodes\n */\nexport class SyncCoordinator extends EventEmitter {\n private static readonly MAX_SYNC_EVENTS = 10000;\n\n private nodes: Map<string, SyncNode> = new Map();\n private sessions: Map<string, SyncSession> = new Map();\n private syncEvents: SyncEvent[] = [];\n private nodeHeartbeats: Map<string, number> = new Map();\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private nodesByDID: Map<string, string> = new Map(); // DID -> nodeId\n\n constructor() {\n super();\n }\n\n private addSyncEvent(event: SyncEvent): void {\n this.syncEvents.push(event);\n if (this.syncEvents.length > SyncCoordinator.MAX_SYNC_EVENTS) {\n this.syncEvents = this.syncEvents.slice(-SyncCoordinator.MAX_SYNC_EVENTS);\n }\n }\n\n /**\n * Configure cryptographic provider for authenticated sync\n */\n configureCrypto(provider: ICryptoProvider): void {\n this.cryptoProvider = provider;\n\n logger.debug('[SyncCoordinator] Crypto configured', {\n initialized: provider.isInitialized(),\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Register a node with DID-based identity\n */\n async registerAuthenticatedNode(\n nodeInfo: Omit<\n SyncNode,\n 'did' | 'publicSigningKey' | 'publicEncryptionKey'\n > & {\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }\n ): Promise<SyncNode> {\n const node: SyncNode = {\n ...nodeInfo,\n };\n\n this.nodes.set(node.id, node);\n this.nodeHeartbeats.set(node.id, Date.now());\n this.nodesByDID.set(nodeInfo.did, node.id);\n\n // Register with crypto provider if available\n if (this.cryptoProvider) {\n await this.cryptoProvider.registerRemoteNode({\n id: node.id,\n did: nodeInfo.did,\n publicSigningKey: nodeInfo.publicSigningKey,\n publicEncryptionKey: nodeInfo.publicEncryptionKey,\n });\n }\n\n const event: SyncEvent = {\n type: 'node-joined',\n nodeId: node.id,\n timestamp: new Date().toISOString(),\n data: { did: nodeInfo.did, authenticated: true },\n };\n\n this.addSyncEvent(event);\n this.emit('node-joined', node);\n\n logger.debug('[SyncCoordinator] Authenticated node registered', {\n nodeId: node.id,\n did: nodeInfo.did,\n version: node.version,\n });\n\n return node;\n }\n\n /**\n * Get node by DID\n */\n getNodeByDID(did: string): SyncNode | undefined {\n const nodeId = this.nodesByDID.get(did);\n if (!nodeId) return undefined;\n return this.nodes.get(nodeId);\n }\n\n /**\n * Get all authenticated nodes (nodes with DIDs)\n */\n getAuthenticatedNodes(): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) => n.did);\n }\n\n /**\n * Create an authenticated sync session with UCAN-based authorization\n */\n async createAuthenticatedSyncSession(\n initiatorDID: string,\n participantDIDs: string[],\n options?: {\n encryptionMode?: AeonEncryptionMode;\n requiredCapabilities?: string[];\n }\n ): Promise<SyncSession> {\n // Find the initiator node by DID\n const initiatorNodeId = this.nodesByDID.get(initiatorDID);\n if (!initiatorNodeId) {\n throw new Error(`Initiator node with DID ${initiatorDID} not found`);\n }\n\n // Find participant node IDs\n const participantIds: string[] = [];\n for (const did of participantDIDs) {\n const nodeId = this.nodesByDID.get(did);\n if (nodeId) {\n participantIds.push(nodeId);\n }\n }\n\n // Create session token if crypto is available\n let sessionToken: string | undefined;\n if (this.cryptoProvider && this.cryptoProvider.isInitialized()) {\n // Create a UCAN that grants sync capabilities to all participants\n const capabilities = (\n options?.requiredCapabilities || ['aeon:sync:read', 'aeon:sync:write']\n ).map((cap) => ({ can: cap, with: '*' }));\n\n // Create token for the first participant (in production, you'd create one per participant)\n if (participantDIDs.length > 0) {\n sessionToken = await this.cryptoProvider.createUCAN(\n participantDIDs[0],\n capabilities,\n { expirationSeconds: 3600 } // 1 hour\n );\n }\n }\n\n const session: SyncSession = {\n id: `sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n initiatorId: initiatorNodeId,\n participantIds,\n status: 'pending',\n startTime: new Date().toISOString(),\n itemsSynced: 0,\n itemsFailed: 0,\n conflictsDetected: 0,\n initiatorDID,\n participantDIDs,\n encryptionMode: options?.encryptionMode || 'none',\n requiredCapabilities: options?.requiredCapabilities,\n sessionToken,\n };\n\n this.sessions.set(session.id, session);\n\n const event: SyncEvent = {\n type: 'sync-started',\n sessionId: session.id,\n nodeId: initiatorNodeId,\n timestamp: new Date().toISOString(),\n data: {\n authenticated: true,\n initiatorDID,\n participantCount: participantDIDs.length,\n encryptionMode: session.encryptionMode,\n },\n };\n\n this.addSyncEvent(event);\n this.emit('sync-started', session);\n\n logger.debug('[SyncCoordinator] Authenticated sync session created', {\n sessionId: session.id,\n initiatorDID,\n participants: participantDIDs.length,\n encryptionMode: session.encryptionMode,\n });\n\n return session;\n }\n\n /**\n * Verify a node's UCAN capabilities for a session\n */\n async verifyNodeCapabilities(\n sessionId: string,\n nodeDID: string,\n token: string\n ): Promise<{ authorized: boolean; error?: string }> {\n if (!this.cryptoProvider) {\n return { authorized: true }; // No crypto, always authorized\n }\n\n const session = this.sessions.get(sessionId);\n if (!session) {\n return { authorized: false, error: `Session ${sessionId} not found` };\n }\n\n const result = await this.cryptoProvider.verifyUCAN(token, {\n requiredCapabilities: session.requiredCapabilities?.map((cap) => ({\n can: cap,\n with: '*',\n })),\n });\n\n if (!result.authorized) {\n logger.warn('[SyncCoordinator] Node capability verification failed', {\n sessionId,\n nodeDID,\n error: result.error,\n });\n }\n\n return result;\n }\n\n /**\n * Register a node in the cluster\n */\n registerNode(node: SyncNode): void {\n this.nodes.set(node.id, node);\n this.nodeHeartbeats.set(node.id, Date.now());\n\n const event: SyncEvent = {\n type: 'node-joined',\n nodeId: node.id,\n timestamp: new Date().toISOString(),\n };\n\n this.addSyncEvent(event);\n this.emit('node-joined', node);\n\n logger.debug('[SyncCoordinator] Node registered', {\n nodeId: node.id,\n address: node.address,\n version: node.version,\n });\n }\n\n /**\n * Deregister a node from the cluster\n */\n deregisterNode(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node ${nodeId} not found`);\n }\n\n this.nodes.delete(nodeId);\n this.nodeHeartbeats.delete(nodeId);\n\n const event: SyncEvent = {\n type: 'node-left',\n nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.addSyncEvent(event);\n this.emit('node-left', node);\n\n logger.debug('[SyncCoordinator] Node deregistered', { nodeId });\n }\n\n /**\n * Create a new sync session\n */\n createSyncSession(\n initiatorId: string,\n participantIds: string[]\n ): SyncSession {\n const node = this.nodes.get(initiatorId);\n if (!node) {\n throw new Error(`Initiator node ${initiatorId} not found`);\n }\n\n const session: SyncSession = {\n id: `sync-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n initiatorId,\n participantIds,\n status: 'pending',\n startTime: new Date().toISOString(),\n itemsSynced: 0,\n itemsFailed: 0,\n conflictsDetected: 0,\n };\n\n this.sessions.set(session.id, session);\n\n const event: SyncEvent = {\n type: 'sync-started',\n sessionId: session.id,\n nodeId: initiatorId,\n timestamp: new Date().toISOString(),\n };\n\n this.addSyncEvent(event);\n this.emit('sync-started', session);\n\n logger.debug('[SyncCoordinator] Sync session created', {\n sessionId: session.id,\n initiator: initiatorId,\n participants: participantIds.length,\n });\n\n return session;\n }\n\n /**\n * Update sync session\n */\n updateSyncSession(sessionId: string, updates: Partial<SyncSession>): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n Object.assign(session, updates);\n\n if (updates.status === 'completed' || updates.status === 'failed') {\n session.endTime = new Date().toISOString();\n\n const event: SyncEvent = {\n type: 'sync-completed',\n sessionId,\n nodeId: session.initiatorId,\n timestamp: new Date().toISOString(),\n data: { status: updates.status, itemsSynced: session.itemsSynced },\n };\n\n this.addSyncEvent(event);\n this.emit('sync-completed', session);\n }\n\n logger.debug('[SyncCoordinator] Sync session updated', {\n sessionId,\n status: session.status,\n itemsSynced: session.itemsSynced,\n });\n }\n\n /**\n * Record a conflict during sync\n */\n recordConflict(\n sessionId: string,\n nodeId: string,\n conflictData?: unknown\n ): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.conflictsDetected++;\n\n const event: SyncEvent = {\n type: 'conflict-detected',\n sessionId,\n nodeId,\n timestamp: new Date().toISOString(),\n data: conflictData,\n };\n\n this.addSyncEvent(event);\n this.emit('conflict-detected', { session, nodeId, conflictData });\n\n logger.debug('[SyncCoordinator] Conflict recorded', {\n sessionId,\n nodeId,\n totalConflicts: session.conflictsDetected,\n });\n }\n }\n\n /**\n * Update node status\n */\n updateNodeStatus(nodeId: string, status: SyncNode['status']): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n throw new Error(`Node ${nodeId} not found`);\n }\n\n node.status = status;\n this.nodeHeartbeats.set(nodeId, Date.now());\n\n logger.debug('[SyncCoordinator] Node status updated', {\n nodeId,\n status,\n });\n }\n\n /**\n * Record heartbeat from node\n */\n recordHeartbeat(nodeId: string): void {\n const node = this.nodes.get(nodeId);\n if (!node) {\n return;\n }\n\n node.lastHeartbeat = new Date().toISOString();\n this.nodeHeartbeats.set(nodeId, Date.now());\n }\n\n /**\n * Get all nodes\n */\n getNodes(): SyncNode[] {\n return Array.from(this.nodes.values());\n }\n\n /**\n * Get node by ID\n */\n getNode(nodeId: string): SyncNode | undefined {\n return this.nodes.get(nodeId);\n }\n\n /**\n * Get online nodes\n */\n getOnlineNodes(): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) => n.status === 'online');\n }\n\n /**\n * Get nodes by capability\n */\n getNodesByCapability(capability: string): SyncNode[] {\n return Array.from(this.nodes.values()).filter((n) =>\n n.capabilities.includes(capability)\n );\n }\n\n /**\n * Get sync session\n */\n getSyncSession(sessionId: string): SyncSession | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Get all sync sessions\n */\n getAllSyncSessions(): SyncSession[] {\n return Array.from(this.sessions.values());\n }\n\n /**\n * Get active sync sessions\n */\n getActiveSyncSessions(): SyncSession[] {\n return Array.from(this.sessions.values()).filter(\n (s) => s.status === 'active'\n );\n }\n\n /**\n * Get sessions for a node\n */\n getSessionsForNode(nodeId: string): SyncSession[] {\n return Array.from(this.sessions.values()).filter(\n (s) => s.initiatorId === nodeId || s.participantIds.includes(nodeId)\n );\n }\n\n /**\n * Get sync statistics\n */\n getStatistics() {\n const sessions = Array.from(this.sessions.values());\n const completed = sessions.filter((s) => s.status === 'completed').length;\n const failed = sessions.filter((s) => s.status === 'failed').length;\n const active = sessions.filter((s) => s.status === 'active').length;\n\n const totalItemsSynced = sessions.reduce(\n (sum, s) => sum + s.itemsSynced,\n 0\n );\n const totalConflicts = sessions.reduce(\n (sum, s) => sum + s.conflictsDetected,\n 0\n );\n\n return {\n totalNodes: this.nodes.size,\n onlineNodes: this.getOnlineNodes().length,\n offlineNodes: this.nodes.size - this.getOnlineNodes().length,\n totalSessions: sessions.length,\n activeSessions: active,\n completedSessions: completed,\n failedSessions: failed,\n successRate:\n sessions.length > 0 ? (completed / sessions.length) * 100 : 0,\n totalItemsSynced,\n totalConflicts,\n averageConflictsPerSession:\n sessions.length > 0 ? totalConflicts / sessions.length : 0,\n };\n }\n\n /**\n * Get sync events\n */\n getSyncEvents(limit?: number): SyncEvent[] {\n const events = [...this.syncEvents];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n\n /**\n * Get sync events for session\n */\n getSessionEvents(sessionId: string): SyncEvent[] {\n return this.syncEvents.filter((e) => e.sessionId === sessionId);\n }\n\n /**\n * Check node health\n */\n getNodeHealth(): Record<string, { isHealthy: boolean; downtime: number }> {\n const health: Record<string, { isHealthy: boolean; downtime: number }> = {};\n\n for (const [nodeId, lastHeartbeat] of this.nodeHeartbeats) {\n const now = Date.now();\n const downtime = now - lastHeartbeat;\n const isHealthy = downtime < 30000; // 30 seconds threshold\n\n health[nodeId] = {\n isHealthy,\n downtime,\n };\n }\n\n return health;\n }\n\n /**\n * Start heartbeat monitoring\n */\n startHeartbeatMonitoring(interval: number = 5000): void {\n if (this.heartbeatInterval) {\n return;\n }\n\n this.heartbeatInterval = setInterval(() => {\n const health = this.getNodeHealth();\n\n for (const [nodeId, { isHealthy }] of Object.entries(health)) {\n const node = this.nodes.get(nodeId);\n if (!node) {\n continue;\n }\n\n const newStatus = isHealthy ? 'online' : 'offline';\n if (node.status !== newStatus) {\n this.updateNodeStatus(nodeId, newStatus);\n }\n }\n }, interval);\n\n logger.debug('[SyncCoordinator] Heartbeat monitoring started', {\n interval,\n });\n }\n\n /**\n * Stop heartbeat monitoring\n */\n stopHeartbeatMonitoring(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n\n logger.debug('[SyncCoordinator] Heartbeat monitoring stopped');\n }\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.nodes.clear();\n this.sessions.clear();\n this.syncEvents = [];\n this.nodeHeartbeats.clear();\n this.nodesByDID.clear();\n this.cryptoProvider = null;\n this.stopHeartbeatMonitoring();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Replication Manager\n *\n * Manages data replication across multiple nodes.\n * Handles replication policies, consistency levels, and replica coordination.\n *\n * Features:\n * - Replica set management\n * - Replication policy enforcement\n * - Consistency level tracking\n * - Replication health monitoring\n * - Replica synchronization coordination\n * - End-to-end encryption for replicated data\n * - DID-based replica authentication\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { AeonEncryptionMode } from '../crypto/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface Replica {\n id: string;\n nodeId: string;\n status: 'primary' | 'secondary' | 'syncing' | 'failed';\n lastSyncTime: string;\n lagBytes: number;\n lagMillis: number;\n // DID-based identity for authenticated replicas\n did?: string;\n // Whether this replica uses encrypted data\n encrypted?: boolean;\n}\n\nexport interface ReplicationPolicy {\n id: string;\n name: string;\n replicationFactor: number;\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong';\n syncInterval: number;\n maxReplicationLag: number;\n // Encryption settings for this policy\n encryptionMode?: AeonEncryptionMode;\n // Required capabilities for replicas\n requiredCapabilities?: string[];\n}\n\nexport interface ReplicationEvent {\n type: 'replica-added' | 'replica-removed' | 'replica-synced' | 'sync-failed';\n replicaId: string;\n nodeId: string;\n timestamp: string;\n details?: unknown;\n}\n\n/**\n * Encrypted replication data envelope\n */\nexport interface EncryptedReplicationData {\n /** Encrypted ciphertext (base64) */\n ct: string;\n /** Initialization vector (base64) */\n iv: string;\n /** Authentication tag (base64) */\n tag: string;\n /** Ephemeral public key for ECIES */\n epk?: JsonWebKey;\n /** Sender DID */\n senderDID?: string;\n /** Target replica DID */\n targetDID?: string;\n /** Encryption timestamp */\n encryptedAt: number;\n}\n\nexport interface ReplicationPersistenceData {\n replicas: Replica[];\n policies: ReplicationPolicy[];\n syncStatus: Array<{ nodeId: string; synced: number; failed: number }>;\n}\n\nexport interface ReplicationPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<ReplicationPersistenceData>;\n deserializer?: PersistenceDeserializer<ReplicationPersistenceData>;\n}\n\nexport interface ReplicationManagerOptions {\n persistence?: ReplicationPersistenceConfig;\n}\n\n/**\n * Replication Manager\n * Manages data replication across distributed nodes\n */\nexport class ReplicationManager {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:replication-state:v1';\n private replicas: Map<string, Replica> = new Map();\n private policies: Map<string, ReplicationPolicy> = new Map();\n private replicationEvents: ReplicationEvent[] = [];\n private syncStatus: Map<string, { synced: number; failed: number }> =\n new Map();\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private replicasByDID: Map<string, string> = new Map(); // DID -> replicaId\n private persistence: (ReplicationPersistenceConfig & { key: string }) | null =\n null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: ReplicationManagerOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? ReplicationManager.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[ReplicationManager] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Configure cryptographic provider for encrypted replication\n */\n configureCrypto(provider: ICryptoProvider): void {\n this.cryptoProvider = provider;\n\n logger.debug('[ReplicationManager] Crypto configured', {\n initialized: provider.isInitialized(),\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Register an authenticated replica with DID\n */\n async registerAuthenticatedReplica(\n replica: Omit<Replica, 'did' | 'encrypted'> & {\n did: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n },\n encrypted = false\n ): Promise<Replica> {\n const authenticatedReplica: Replica = {\n ...replica,\n encrypted,\n };\n\n this.replicas.set(replica.id, authenticatedReplica);\n this.replicasByDID.set(replica.did, replica.id);\n\n if (!this.syncStatus.has(replica.nodeId)) {\n this.syncStatus.set(replica.nodeId, { synced: 0, failed: 0 });\n }\n\n // Register with crypto provider if keys provided\n if (this.cryptoProvider && replica.publicSigningKey) {\n await this.cryptoProvider.registerRemoteNode({\n id: replica.nodeId,\n did: replica.did,\n publicSigningKey: replica.publicSigningKey,\n publicEncryptionKey: replica.publicEncryptionKey,\n });\n }\n\n const event: ReplicationEvent = {\n type: 'replica-added',\n replicaId: replica.id,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n details: { did: replica.did, encrypted, authenticated: true },\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Authenticated replica registered', {\n replicaId: replica.id,\n did: replica.did,\n encrypted,\n });\n\n return authenticatedReplica;\n }\n\n /**\n * Get replica by DID\n */\n getReplicaByDID(did: string): Replica | undefined {\n const replicaId = this.replicasByDID.get(did);\n if (!replicaId) return undefined;\n return this.replicas.get(replicaId);\n }\n\n /**\n * Get all encrypted replicas\n */\n getEncryptedReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter((r) => r.encrypted);\n }\n\n /**\n * Encrypt data for replication to a specific replica\n */\n async encryptForReplica(\n data: unknown,\n targetReplicaDID: string\n ): Promise<EncryptedReplicationData> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const dataBytes = new TextEncoder().encode(JSON.stringify(data));\n const encrypted = await this.cryptoProvider.encrypt(\n dataBytes,\n targetReplicaDID\n );\n\n const localDID = this.cryptoProvider.getLocalDID();\n\n return {\n ct: encrypted.ct,\n iv: encrypted.iv,\n tag: encrypted.tag,\n epk: encrypted.epk,\n senderDID: localDID || undefined,\n targetDID: targetReplicaDID,\n encryptedAt: encrypted.encryptedAt,\n };\n }\n\n /**\n * Decrypt data received from replication\n */\n async decryptReplicationData<T>(\n encrypted: EncryptedReplicationData\n ): Promise<T> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const decrypted = await this.cryptoProvider.decrypt(\n {\n alg: 'ECIES-P256',\n ct: encrypted.ct,\n iv: encrypted.iv,\n tag: encrypted.tag,\n epk: encrypted.epk,\n },\n encrypted.senderDID\n );\n\n return JSON.parse(new TextDecoder().decode(decrypted)) as T;\n }\n\n /**\n * Create an encrypted replication policy\n */\n createEncryptedPolicy(\n name: string,\n replicationFactor: number,\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong',\n encryptionMode: AeonEncryptionMode,\n options?: {\n syncInterval?: number;\n maxReplicationLag?: number;\n requiredCapabilities?: string[];\n }\n ): ReplicationPolicy {\n const policy: ReplicationPolicy = {\n id: `policy-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n replicationFactor,\n consistencyLevel,\n syncInterval: options?.syncInterval || 1000,\n maxReplicationLag: options?.maxReplicationLag || 10000,\n encryptionMode,\n requiredCapabilities: options?.requiredCapabilities,\n };\n\n this.policies.set(policy.id, policy);\n\n logger.debug('[ReplicationManager] Encrypted policy created', {\n policyId: policy.id,\n name,\n replicationFactor,\n encryptionMode,\n });\n\n return policy;\n }\n\n /**\n * Verify a replica's capabilities via UCAN\n */\n async verifyReplicaCapabilities(\n replicaDID: string,\n token: string,\n policyId?: string\n ): Promise<{ authorized: boolean; error?: string }> {\n if (!this.cryptoProvider) {\n return { authorized: true }; // No crypto, always authorized\n }\n\n const policy = policyId ? this.policies.get(policyId) : undefined;\n\n const result = await this.cryptoProvider.verifyUCAN(token, {\n requiredCapabilities: policy?.requiredCapabilities?.map((cap) => ({\n can: cap,\n with: '*',\n })),\n });\n\n if (!result.authorized) {\n logger.warn(\n '[ReplicationManager] Replica capability verification failed',\n {\n replicaDID,\n error: result.error,\n }\n );\n }\n\n return result;\n }\n\n /**\n * Register a replica\n */\n registerReplica(replica: Replica): void {\n this.replicas.set(replica.id, replica);\n\n if (!this.syncStatus.has(replica.nodeId)) {\n this.syncStatus.set(replica.nodeId, { synced: 0, failed: 0 });\n }\n\n const event: ReplicationEvent = {\n type: 'replica-added',\n replicaId: replica.id,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Replica registered', {\n replicaId: replica.id,\n nodeId: replica.nodeId,\n status: replica.status,\n });\n }\n\n /**\n * Remove a replica\n */\n removeReplica(replicaId: string): void {\n const replica = this.replicas.get(replicaId);\n if (!replica) {\n throw new Error(`Replica ${replicaId} not found`);\n }\n\n this.replicas.delete(replicaId);\n\n const event: ReplicationEvent = {\n type: 'replica-removed',\n replicaId,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n };\n\n this.replicationEvents.push(event);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Replica removed', { replicaId });\n }\n\n /**\n * Create a replication policy\n */\n createPolicy(\n name: string,\n replicationFactor: number,\n consistencyLevel: 'eventual' | 'read-after-write' | 'strong',\n syncInterval = 1000,\n maxReplicationLag = 10000\n ): ReplicationPolicy {\n const policy: ReplicationPolicy = {\n id: `policy-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n name,\n replicationFactor,\n consistencyLevel,\n syncInterval,\n maxReplicationLag,\n };\n\n this.policies.set(policy.id, policy);\n this.schedulePersist();\n\n logger.debug('[ReplicationManager] Policy created', {\n policyId: policy.id,\n name,\n replicationFactor,\n consistencyLevel,\n });\n\n return policy;\n }\n\n /**\n * Update replica status\n */\n updateReplicaStatus(\n replicaId: string,\n status: Replica['status'],\n lagBytes = 0,\n lagMillis = 0\n ): void {\n const replica = this.replicas.get(replicaId);\n if (!replica) {\n throw new Error(`Replica ${replicaId} not found`);\n }\n\n replica.status = status;\n replica.lagBytes = lagBytes;\n replica.lagMillis = lagMillis;\n replica.lastSyncTime = new Date().toISOString();\n\n const event: ReplicationEvent = {\n type: status === 'syncing' ? 'replica-synced' : 'sync-failed',\n replicaId,\n nodeId: replica.nodeId,\n timestamp: new Date().toISOString(),\n details: { status, lagBytes, lagMillis },\n };\n\n this.replicationEvents.push(event);\n\n const syncStatus = this.syncStatus.get(replica.nodeId);\n if (syncStatus) {\n if (status === 'syncing' || status === 'secondary') {\n syncStatus.synced++;\n } else if (status === 'failed') {\n syncStatus.failed++;\n }\n }\n\n logger.debug('[ReplicationManager] Replica status updated', {\n replicaId,\n status,\n lagBytes,\n lagMillis,\n });\n\n this.schedulePersist();\n }\n\n /**\n * Get replicas for node\n */\n getReplicasForNode(nodeId: string): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.nodeId === nodeId\n );\n }\n\n /**\n * Get healthy replicas\n */\n getHealthyReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'secondary' || r.status === 'primary'\n );\n }\n\n /**\n * Get syncing replicas\n */\n getSyncingReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'syncing'\n );\n }\n\n /**\n * Get failed replicas\n */\n getFailedReplicas(): Replica[] {\n return Array.from(this.replicas.values()).filter(\n (r) => r.status === 'failed'\n );\n }\n\n /**\n * Check replication health for policy\n */\n checkReplicationHealth(policyId: string): {\n healthy: boolean;\n replicasInPolicy: number;\n healthyReplicas: number;\n replicationLag: number;\n } {\n const policy = this.policies.get(policyId);\n if (!policy) {\n throw new Error(`Policy ${policyId} not found`);\n }\n\n const healthy = this.getHealthyReplicas();\n const maxLag = Math.max(0, ...healthy.map((r) => r.lagMillis));\n\n return {\n healthy:\n healthy.length >= policy.replicationFactor &&\n maxLag <= policy.maxReplicationLag,\n replicasInPolicy: policy.replicationFactor,\n healthyReplicas: healthy.length,\n replicationLag: maxLag,\n };\n }\n\n /**\n * Get consistency level\n */\n getConsistencyLevel(\n policyId: string\n ): 'eventual' | 'read-after-write' | 'strong' {\n const policy = this.policies.get(policyId);\n if (!policy) {\n return 'eventual';\n }\n\n return policy.consistencyLevel;\n }\n\n /**\n * Get replica\n */\n getReplica(replicaId: string): Replica | undefined {\n return this.replicas.get(replicaId);\n }\n\n /**\n * Get all replicas\n */\n getAllReplicas(): Replica[] {\n return Array.from(this.replicas.values());\n }\n\n /**\n * Get policy\n */\n getPolicy(policyId: string): ReplicationPolicy | undefined {\n return this.policies.get(policyId);\n }\n\n /**\n * Get all policies\n */\n getAllPolicies(): ReplicationPolicy[] {\n return Array.from(this.policies.values());\n }\n\n /**\n * Get replication statistics\n */\n getStatistics() {\n const healthy = this.getHealthyReplicas().length;\n const syncing = this.getSyncingReplicas().length;\n const failed = this.getFailedReplicas().length;\n const total = this.replicas.size;\n\n const replicationLags = Array.from(this.replicas.values()).map(\n (r) => r.lagMillis\n );\n const avgLag =\n replicationLags.length > 0\n ? replicationLags.reduce((a, b) => a + b) / replicationLags.length\n : 0;\n const maxLag =\n replicationLags.length > 0 ? Math.max(...replicationLags) : 0;\n\n return {\n totalReplicas: total,\n healthyReplicas: healthy,\n syncingReplicas: syncing,\n failedReplicas: failed,\n healthiness: total > 0 ? (healthy / total) * 100 : 0,\n averageReplicationLagMs: avgLag,\n maxReplicationLagMs: maxLag,\n totalPolicies: this.policies.size,\n };\n }\n\n /**\n * Get replication events\n */\n getReplicationEvents(limit?: number): ReplicationEvent[] {\n const events = [...this.replicationEvents];\n if (limit) {\n return events.slice(-limit);\n }\n return events;\n }\n\n /**\n * Get sync status for node\n */\n getSyncStatus(nodeId: string): { synced: number; failed: number } {\n return this.syncStatus.get(nodeId) || { synced: 0, failed: 0 };\n }\n\n /**\n * Get replication lag distribution\n */\n getReplicationLagDistribution(): Record<string, number> {\n const distribution: Record<string, number> = {\n '0-100ms': 0,\n '100-500ms': 0,\n '500-1000ms': 0,\n '1000+ms': 0,\n };\n\n for (const replica of this.replicas.values()) {\n if (replica.lagMillis <= 100) {\n distribution['0-100ms']++;\n } else if (replica.lagMillis <= 500) {\n distribution['100-500ms']++;\n } else if (replica.lagMillis <= 1000) {\n distribution['500-1000ms']++;\n } else {\n distribution['1000+ms']++;\n }\n }\n\n return distribution;\n }\n\n /**\n * Check if can satisfy consistency level\n */\n canSatisfyConsistency(policyId: string, _requiredAcks: number): boolean {\n const policy = this.policies.get(policyId);\n if (!policy) {\n return false;\n }\n\n const healthyCount = this.getHealthyReplicas().length;\n\n switch (policy.consistencyLevel) {\n case 'eventual':\n return true; // Always achievable\n case 'read-after-write':\n return healthyCount >= 1;\n case 'strong':\n return healthyCount >= policy.replicationFactor;\n default:\n return false;\n }\n }\n\n /**\n * Persist current replication state snapshot.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const data: ReplicationPersistenceData = {\n replicas: this.getAllReplicas(),\n policies: this.getAllPolicies(),\n syncStatus: Array.from(this.syncStatus.entries()).map(\n ([nodeId, state]) => ({\n nodeId,\n synced: state.synced,\n failed: state.failed,\n })\n ),\n };\n\n const envelope: PersistedEnvelope<ReplicationPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<ReplicationPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load replication snapshot from persistence.\n */\n async loadFromPersistence(): Promise<{\n replicas: number;\n policies: number;\n syncStatus: number;\n }> {\n if (!this.persistence) {\n return { replicas: 0, policies: 0, syncStatus: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { replicas: 0, policies: 0, syncStatus: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<ReplicationPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid replication persistence payload');\n }\n if (\n !Array.isArray(envelope.data.replicas) ||\n !Array.isArray(envelope.data.policies) ||\n !Array.isArray(envelope.data.syncStatus)\n ) {\n throw new Error('Invalid replication persistence structure');\n }\n\n this.replicas.clear();\n this.policies.clear();\n this.syncStatus.clear();\n this.replicasByDID.clear();\n\n let importedReplicas = 0;\n for (const replica of envelope.data.replicas) {\n if (this.isValidReplica(replica)) {\n this.replicas.set(replica.id, replica);\n if (replica.did) {\n this.replicasByDID.set(replica.did, replica.id);\n }\n importedReplicas++;\n }\n }\n\n let importedPolicies = 0;\n for (const policy of envelope.data.policies) {\n if (this.isValidPolicy(policy)) {\n this.policies.set(policy.id, policy);\n importedPolicies++;\n }\n }\n\n let importedSyncStatus = 0;\n for (const status of envelope.data.syncStatus) {\n if (\n typeof status.nodeId === 'string' &&\n typeof status.synced === 'number' &&\n typeof status.failed === 'number'\n ) {\n this.syncStatus.set(status.nodeId, {\n synced: status.synced,\n failed: status.failed,\n });\n importedSyncStatus++;\n }\n }\n\n logger.debug('[ReplicationManager] Loaded from persistence', {\n key: this.persistence.key,\n replicas: importedReplicas,\n policies: importedPolicies,\n syncStatus: importedSyncStatus,\n });\n\n return {\n replicas: importedReplicas,\n policies: importedPolicies,\n syncStatus: importedSyncStatus,\n };\n }\n\n /**\n * Remove persisted replication snapshot.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[ReplicationManager] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidReplica(value: unknown): value is Replica {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const candidate = value as Partial<Replica>;\n const validStatus =\n candidate.status === 'primary' ||\n candidate.status === 'secondary' ||\n candidate.status === 'syncing' ||\n candidate.status === 'failed';\n\n return (\n typeof candidate.id === 'string' &&\n typeof candidate.nodeId === 'string' &&\n validStatus &&\n typeof candidate.lastSyncTime === 'string' &&\n typeof candidate.lagBytes === 'number' &&\n typeof candidate.lagMillis === 'number'\n );\n }\n\n private isValidPolicy(value: unknown): value is ReplicationPolicy {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const candidate = value as Partial<ReplicationPolicy>;\n const validConsistency =\n candidate.consistencyLevel === 'eventual' ||\n candidate.consistencyLevel === 'read-after-write' ||\n candidate.consistencyLevel === 'strong';\n\n return (\n typeof candidate.id === 'string' &&\n typeof candidate.name === 'string' &&\n typeof candidate.replicationFactor === 'number' &&\n validConsistency &&\n typeof candidate.syncInterval === 'number' &&\n typeof candidate.maxReplicationLag === 'number'\n );\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.replicas.clear();\n this.policies.clear();\n this.replicationEvents = [];\n this.syncStatus.clear();\n this.replicasByDID.clear();\n this.cryptoProvider = null;\n this.schedulePersist();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Sync Protocol\n *\n * Handles synchronization protocol messages and handshaking.\n * Manages message serialization, protocol versioning, and compatibility.\n *\n * Features:\n * - Message serialization and deserialization\n * - Protocol version management\n * - Handshake handling\n * - Message validation and error handling\n * - Protocol state machine\n * - Optional cryptographic authentication and encryption\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type {\n AeonEncryptionMode,\n AuthenticatedMessageFields,\n} from '../crypto/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nexport interface SyncMessage {\n type: 'handshake' | 'sync-request' | 'sync-response' | 'ack' | 'error';\n version: string;\n sender: string;\n receiver: string;\n messageId: string;\n timestamp: string;\n payload?: unknown;\n // Authentication fields (populated when crypto is configured)\n auth?: AuthenticatedMessageFields;\n}\n\nexport interface Handshake {\n protocolVersion: string;\n nodeId: string;\n capabilities: string[];\n state: 'initiating' | 'responding' | 'completed';\n // DID for authenticated handshakes\n did?: string;\n // Public signing key (JWK)\n publicSigningKey?: JsonWebKey;\n // Public encryption key (JWK)\n publicEncryptionKey?: JsonWebKey;\n // UCAN token for capability verification\n ucan?: string;\n}\n\n/**\n * Crypto configuration for sync protocol\n */\nexport interface SyncProtocolCryptoConfig {\n /** Encryption mode for messages */\n encryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Required capabilities for sync operations */\n requiredCapabilities?: Array<{ can: string; with: string }>;\n}\n\nexport interface SyncRequest {\n sessionId: string;\n fromVersion: string;\n toVersion: string;\n filter?: Record<string, unknown>;\n}\n\nexport interface SyncResponse {\n sessionId: string;\n fromVersion: string;\n toVersion: string;\n data: unknown[];\n hasMore: boolean;\n offset: number;\n}\n\nexport interface ProtocolError {\n code: string;\n message: string;\n recoverable: boolean;\n}\n\nexport interface SyncProtocolPersistenceData {\n protocolVersion: string;\n messageCounter: number;\n messageQueue: SyncMessage[];\n handshakes: Array<{ nodeId: string; handshake: Handshake }>;\n protocolErrors: Array<{ error: ProtocolError; timestamp: string }>;\n}\n\nexport interface SyncProtocolPersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<SyncProtocolPersistenceData>;\n deserializer?: PersistenceDeserializer<SyncProtocolPersistenceData>;\n}\n\nexport interface SyncProtocolOptions {\n persistence?: SyncProtocolPersistenceConfig;\n}\n\n/**\n * Sync Protocol\n * Handles synchronization protocol messages and handshaking\n */\nexport class SyncProtocol {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:sync-protocol:v1';\n private version = '1.0.0';\n private messageQueue: SyncMessage[] = [];\n private messageMap: Map<string, SyncMessage> = new Map();\n private handshakes: Map<string, Handshake> = new Map();\n private protocolErrors: Array<{ error: ProtocolError; timestamp: string }> =\n [];\n private messageCounter = 0;\n\n // Crypto support\n private cryptoProvider: ICryptoProvider | null = null;\n private cryptoConfig: SyncProtocolCryptoConfig | null = null;\n private persistence:\n | (SyncProtocolPersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(options?: SyncProtocolOptions) {\n if (options?.persistence) {\n this.persistence = {\n ...options.persistence,\n key: options.persistence.key ?? SyncProtocol.DEFAULT_PERSIST_KEY,\n autoPersist: options.persistence.autoPersist ?? true,\n autoLoad: options.persistence.autoLoad ?? false,\n persistDebounceMs: options.persistence.persistDebounceMs ?? 25,\n };\n }\n\n if (this.persistence?.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[SyncProtocol] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n\n /**\n * Configure cryptographic provider for authenticated/encrypted messages\n */\n configureCrypto(\n provider: ICryptoProvider,\n config?: Partial<SyncProtocolCryptoConfig>\n ): void {\n this.cryptoProvider = provider;\n this.cryptoConfig = {\n encryptionMode: config?.encryptionMode ?? 'none',\n requireSignatures: config?.requireSignatures ?? false,\n requireCapabilities: config?.requireCapabilities ?? false,\n requiredCapabilities: config?.requiredCapabilities,\n };\n\n logger.debug('[SyncProtocol] Crypto configured', {\n encryptionMode: this.cryptoConfig.encryptionMode,\n requireSignatures: this.cryptoConfig.requireSignatures,\n requireCapabilities: this.cryptoConfig.requireCapabilities,\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Get crypto configuration\n */\n getCryptoConfig(): SyncProtocolCryptoConfig | null {\n return this.cryptoConfig ? { ...this.cryptoConfig } : null;\n }\n\n /**\n * Get protocol version\n */\n getVersion(): string {\n return this.version;\n }\n\n /**\n * Create authenticated handshake message with DID and keys\n */\n async createAuthenticatedHandshake(\n capabilities: string[],\n targetDID?: string\n ): Promise<SyncMessage> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n if (!localDID) {\n throw new Error('Local DID not available');\n }\n\n const publicInfo = await this.cryptoProvider.exportPublicIdentity();\n if (!publicInfo) {\n throw new Error('Cannot export public identity');\n }\n\n // Create UCAN if target DID is specified and capabilities are required\n let ucan: string | undefined;\n if (targetDID && this.cryptoConfig?.requireCapabilities) {\n const caps = this.cryptoConfig.requiredCapabilities || [\n { can: 'aeon:sync:read', with: '*' },\n { can: 'aeon:sync:write', with: '*' },\n ];\n ucan = await this.cryptoProvider.createUCAN(targetDID, caps);\n }\n\n const handshakePayload: Handshake = {\n protocolVersion: this.version,\n nodeId: localDID,\n capabilities,\n state: 'initiating',\n did: localDID,\n publicSigningKey: publicInfo.publicSigningKey,\n publicEncryptionKey: publicInfo.publicEncryptionKey,\n ucan,\n };\n\n const message: SyncMessage = {\n type: 'handshake',\n version: this.version,\n sender: localDID,\n receiver: targetDID || '',\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: handshakePayload,\n };\n\n // Sign the message if signatures are required\n if (this.cryptoConfig?.requireSignatures) {\n const signed = await this.cryptoProvider.signData(handshakePayload);\n message.auth = {\n senderDID: localDID,\n receiverDID: targetDID,\n signature: signed.signature,\n };\n }\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Authenticated handshake created', {\n messageId: message.messageId,\n did: localDID,\n capabilities: capabilities.length,\n hasUCAN: !!ucan,\n });\n\n return message;\n }\n\n /**\n * Verify and process an authenticated handshake\n */\n async verifyAuthenticatedHandshake(\n message: SyncMessage\n ): Promise<{ valid: boolean; handshake?: Handshake; error?: string }> {\n if (message.type !== 'handshake') {\n return { valid: false, error: 'Message is not a handshake' };\n }\n\n const handshake = message.payload as Handshake;\n\n // If crypto is not configured, just process normally\n if (!this.cryptoProvider || !this.cryptoConfig) {\n this.handshakes.set(message.sender, handshake);\n this.schedulePersist();\n return { valid: true, handshake };\n }\n\n // Register the remote node if we have their keys\n if (handshake.did && handshake.publicSigningKey) {\n await this.cryptoProvider.registerRemoteNode({\n id: handshake.nodeId,\n did: handshake.did,\n publicSigningKey: handshake.publicSigningKey,\n publicEncryptionKey: handshake.publicEncryptionKey,\n });\n }\n\n // Verify signature if required\n if (this.cryptoConfig.requireSignatures && message.auth?.signature) {\n const signed = {\n payload: handshake,\n signature: message.auth.signature,\n signer: message.auth.senderDID || message.sender,\n algorithm: 'ES256',\n signedAt: Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n logger.warn('[SyncProtocol] Handshake signature verification failed', {\n messageId: message.messageId,\n sender: message.sender,\n });\n return { valid: false, error: 'Invalid signature' };\n }\n }\n\n // Verify UCAN if required\n if (this.cryptoConfig.requireCapabilities && handshake.ucan) {\n const localDID = this.cryptoProvider.getLocalDID();\n const result = await this.cryptoProvider.verifyUCAN(handshake.ucan, {\n expectedAudience: localDID || undefined,\n requiredCapabilities: this.cryptoConfig.requiredCapabilities,\n });\n\n if (!result.authorized) {\n logger.warn('[SyncProtocol] Handshake UCAN verification failed', {\n messageId: message.messageId,\n error: result.error,\n });\n return { valid: false, error: result.error || 'Unauthorized' };\n }\n }\n\n this.handshakes.set(message.sender, handshake);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Authenticated handshake verified', {\n messageId: message.messageId,\n did: handshake.did,\n });\n\n return { valid: true, handshake };\n }\n\n /**\n * Sign and optionally encrypt a message payload\n */\n async signMessage<T>(\n message: SyncMessage,\n payload: T,\n encrypt = false\n ): Promise<SyncMessage> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n\n // Sign the payload\n const signed = await this.cryptoProvider.signData(payload);\n\n message.auth = {\n senderDID: localDID || undefined,\n receiverDID: message.receiver || undefined,\n signature: signed.signature,\n encrypted: false,\n };\n\n // Encrypt if requested and we have a recipient\n if (\n encrypt &&\n message.receiver &&\n this.cryptoConfig?.encryptionMode !== 'none'\n ) {\n const payloadBytes = new TextEncoder().encode(JSON.stringify(payload));\n const encrypted = await this.cryptoProvider.encrypt(\n payloadBytes,\n message.receiver\n );\n\n message.payload = encrypted;\n message.auth.encrypted = true;\n\n logger.debug('[SyncProtocol] Message encrypted', {\n messageId: message.messageId,\n recipient: message.receiver,\n });\n } else {\n message.payload = payload;\n }\n\n return message;\n }\n\n /**\n * Verify signature and optionally decrypt a message\n */\n async verifyMessage<T>(\n message: SyncMessage\n ): Promise<{ valid: boolean; payload?: T; error?: string }> {\n if (!this.cryptoProvider || !message.auth) {\n // No crypto or no auth - return payload as-is\n return { valid: true, payload: message.payload as T };\n }\n\n let payload = message.payload;\n\n // Decrypt if encrypted\n if (message.auth.encrypted && message.payload) {\n try {\n const encrypted = message.payload as {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n };\n\n const decrypted = await this.cryptoProvider.decrypt(\n encrypted,\n message.auth.senderDID\n );\n\n payload = JSON.parse(new TextDecoder().decode(decrypted));\n\n logger.debug('[SyncProtocol] Message decrypted', {\n messageId: message.messageId,\n });\n } catch (error) {\n return {\n valid: false,\n error: `Decryption failed: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n }\n\n // Verify signature if present\n if (message.auth.signature && message.auth.senderDID) {\n const signed = {\n payload,\n signature: message.auth.signature,\n signer: message.auth.senderDID,\n algorithm: 'ES256',\n signedAt: Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n return { valid: false, error: 'Invalid signature' };\n }\n }\n\n return { valid: true, payload: payload as T };\n }\n\n /**\n * Create handshake message\n */\n createHandshakeMessage(nodeId: string, capabilities: string[]): SyncMessage {\n const message: SyncMessage = {\n type: 'handshake',\n version: this.version,\n sender: nodeId,\n receiver: '',\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n protocolVersion: this.version,\n nodeId,\n capabilities,\n state: 'initiating',\n } as Handshake,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Handshake message created', {\n messageId: message.messageId,\n nodeId,\n capabilities: capabilities.length,\n });\n\n return message;\n }\n\n /**\n * Create sync request message\n */\n createSyncRequestMessage(\n sender: string,\n receiver: string,\n sessionId: string,\n fromVersion: string,\n toVersion: string,\n filter?: Record<string, unknown>\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'sync-request',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n sessionId,\n fromVersion,\n toVersion,\n filter,\n } as SyncRequest,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Sync request created', {\n messageId: message.messageId,\n sessionId,\n fromVersion,\n toVersion,\n });\n\n return message;\n }\n\n /**\n * Create sync response message\n */\n createSyncResponseMessage(\n sender: string,\n receiver: string,\n sessionId: string,\n fromVersion: string,\n toVersion: string,\n data: unknown[],\n hasMore = false,\n offset = 0\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'sync-response',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n sessionId,\n fromVersion,\n toVersion,\n data,\n hasMore,\n offset,\n } as SyncResponse,\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Sync response created', {\n messageId: message.messageId,\n sessionId,\n itemCount: data.length,\n hasMore,\n });\n\n return message;\n }\n\n /**\n * Create acknowledgement message\n */\n createAckMessage(\n sender: string,\n receiver: string,\n messageId: string\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'ack',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: { acknowledgedMessageId: messageId },\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n this.schedulePersist();\n\n return message;\n }\n\n /**\n * Create error message\n */\n createErrorMessage(\n sender: string,\n receiver: string,\n error: ProtocolError,\n relatedMessageId?: string\n ): SyncMessage {\n const message: SyncMessage = {\n type: 'error',\n version: this.version,\n sender,\n receiver,\n messageId: this.generateMessageId(),\n timestamp: new Date().toISOString(),\n payload: {\n error,\n relatedMessageId,\n },\n };\n\n this.messageMap.set(message.messageId, message);\n this.messageQueue.push(message);\n\n this.protocolErrors.push({\n error,\n timestamp: new Date().toISOString(),\n });\n this.schedulePersist();\n\n logger.error('[SyncProtocol] Error message created', {\n messageId: message.messageId,\n errorCode: error.code,\n recoverable: error.recoverable,\n });\n\n return message;\n }\n\n /**\n * Validate message\n */\n validateMessage(message: SyncMessage): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!message.type) {\n errors.push('Message type is required');\n }\n\n if (!message.sender) {\n errors.push('Sender is required');\n }\n\n if (!message.messageId) {\n errors.push('Message ID is required');\n }\n\n if (!message.timestamp) {\n errors.push('Timestamp is required');\n }\n\n const timestampValue = new Date(message.timestamp);\n if (Number.isNaN(timestampValue.getTime())) {\n errors.push('Invalid timestamp format');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Serialize message\n */\n serializeMessage(message: SyncMessage): string {\n try {\n return JSON.stringify(message);\n } catch (error) {\n logger.error('[SyncProtocol] Message serialization failed', {\n messageId: message.messageId,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw new Error(\n `Failed to serialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Deserialize message\n */\n deserializeMessage(data: string): SyncMessage {\n try {\n const message = JSON.parse(data) as SyncMessage;\n const validation = this.validateMessage(message);\n\n if (!validation.valid) {\n throw new Error(`Invalid message: ${validation.errors.join(', ')}`);\n }\n\n return message;\n } catch (error) {\n logger.error('[SyncProtocol] Message deserialization failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw new Error(\n `Failed to deserialize message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n }\n\n /**\n * Process handshake\n */\n processHandshake(message: SyncMessage): Handshake {\n if (message.type !== 'handshake') {\n throw new Error('Message is not a handshake');\n }\n\n const handshake = message.payload as Handshake;\n const nodeId = message.sender;\n\n this.handshakes.set(nodeId, handshake);\n this.schedulePersist();\n\n logger.debug('[SyncProtocol] Handshake processed', {\n nodeId,\n protocolVersion: handshake.protocolVersion,\n capabilities: handshake.capabilities.length,\n });\n\n return handshake;\n }\n\n /**\n * Get message\n */\n getMessage(messageId: string): SyncMessage | undefined {\n return this.messageMap.get(messageId);\n }\n\n /**\n * Get all messages\n */\n getAllMessages(): SyncMessage[] {\n return [...this.messageQueue];\n }\n\n /**\n * Get messages by type\n */\n getMessagesByType(type: SyncMessage['type']): SyncMessage[] {\n return this.messageQueue.filter((m) => m.type === type);\n }\n\n /**\n * Get messages from sender\n */\n getMessagesFromSender(sender: string): SyncMessage[] {\n return this.messageQueue.filter((m) => m.sender === sender);\n }\n\n /**\n * Get pending messages\n */\n getPendingMessages(receiver: string): SyncMessage[] {\n return this.messageQueue.filter((m) => m.receiver === receiver);\n }\n\n /**\n * Get handshakes\n */\n getHandshakes(): Map<string, Handshake> {\n return new Map(this.handshakes);\n }\n\n /**\n * Get protocol statistics\n */\n getStatistics() {\n const messagesByType: Record<string, number> = {};\n for (const message of this.messageQueue) {\n messagesByType[message.type] = (messagesByType[message.type] || 0) + 1;\n }\n\n const errorCount = this.protocolErrors.length;\n const recoverableErrors = this.protocolErrors.filter(\n (e) => e.error.recoverable\n ).length;\n\n return {\n totalMessages: this.messageQueue.length,\n messagesByType,\n totalHandshakes: this.handshakes.size,\n totalErrors: errorCount,\n recoverableErrors,\n unrecoverableErrors: errorCount - recoverableErrors,\n };\n }\n\n /**\n * Get protocol errors\n */\n getErrors(): Array<{ error: ProtocolError; timestamp: string }> {\n return [...this.protocolErrors];\n }\n\n /**\n * Persist protocol state for reconnect/replay.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const data: SyncProtocolPersistenceData = {\n protocolVersion: this.version,\n messageCounter: this.messageCounter,\n messageQueue: this.getAllMessages(),\n handshakes: Array.from(this.handshakes.entries()).map(\n ([nodeId, handshake]) => ({\n nodeId,\n handshake,\n })\n ),\n protocolErrors: this.getErrors(),\n };\n\n const envelope: PersistedEnvelope<SyncProtocolPersistenceData> = {\n version: 1,\n updatedAt: Date.now(),\n data,\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<SyncProtocolPersistenceData>) =>\n JSON.stringify(value));\n\n await this.persistence.adapter.setItem(\n this.persistence.key,\n serialize(envelope)\n );\n }\n\n /**\n * Load protocol state from persistence.\n */\n async loadFromPersistence(): Promise<{\n messages: number;\n handshakes: number;\n errors: number;\n }> {\n if (!this.persistence) {\n return { messages: 0, handshakes: 0, errors: 0 };\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return { messages: 0, handshakes: 0, errors: 0 };\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<SyncProtocolPersistenceData>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !envelope.data) {\n throw new Error('Invalid sync protocol persistence payload');\n }\n if (\n !Array.isArray(envelope.data.messageQueue) ||\n !Array.isArray(envelope.data.handshakes) ||\n !Array.isArray(envelope.data.protocolErrors)\n ) {\n throw new Error('Invalid sync protocol persistence structure');\n }\n\n const nextMessages: SyncMessage[] = [];\n for (const message of envelope.data.messageQueue) {\n const validation = this.validateMessage(message);\n if (!validation.valid) {\n throw new Error(\n `Invalid persisted message ${\n message?.messageId ?? 'unknown'\n }: ${validation.errors.join(', ')}`\n );\n }\n nextMessages.push(message);\n }\n\n const nextHandshakes = new Map<string, Handshake>();\n for (const entry of envelope.data.handshakes) {\n if (\n typeof entry.nodeId !== 'string' ||\n !this.isValidHandshake(entry.handshake)\n ) {\n throw new Error('Invalid persisted handshake payload');\n }\n nextHandshakes.set(entry.nodeId, entry.handshake);\n }\n\n const nextErrors: Array<{ error: ProtocolError; timestamp: string }> = [];\n for (const entry of envelope.data.protocolErrors) {\n if (!this.isValidProtocolErrorEntry(entry)) {\n throw new Error('Invalid persisted protocol error payload');\n }\n nextErrors.push(entry);\n }\n\n this.messageQueue = nextMessages;\n this.messageMap = new Map(nextMessages.map((m) => [m.messageId, m]));\n this.handshakes = nextHandshakes;\n this.protocolErrors = nextErrors;\n this.messageCounter = Math.max(\n envelope.data.messageCounter || 0,\n this.messageQueue.length\n );\n\n logger.debug('[SyncProtocol] Loaded from persistence', {\n key: this.persistence.key,\n messages: this.messageQueue.length,\n handshakes: this.handshakes.size,\n errors: this.protocolErrors.length,\n });\n\n return {\n messages: this.messageQueue.length,\n handshakes: this.handshakes.size,\n errors: this.protocolErrors.length,\n };\n }\n\n /**\n * Clear persisted protocol checkpoint.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[SyncProtocol] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidHandshake(value: unknown): value is Handshake {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const handshake = value as Partial<Handshake>;\n const validState =\n handshake.state === 'initiating' ||\n handshake.state === 'responding' ||\n handshake.state === 'completed';\n\n return (\n typeof handshake.protocolVersion === 'string' &&\n typeof handshake.nodeId === 'string' &&\n Array.isArray(handshake.capabilities) &&\n handshake.capabilities.every((cap) => typeof cap === 'string') &&\n validState\n );\n }\n\n private isValidProtocolErrorEntry(\n entry: unknown\n ): entry is { error: ProtocolError; timestamp: string } {\n if (typeof entry !== 'object' || entry === null) {\n return false;\n }\n const candidate = entry as {\n error?: Partial<ProtocolError>;\n timestamp?: string;\n };\n return (\n typeof candidate.timestamp === 'string' &&\n typeof candidate.error?.code === 'string' &&\n typeof candidate.error.message === 'string' &&\n typeof candidate.error.recoverable === 'boolean'\n );\n }\n\n /**\n * Generate message ID\n */\n private generateMessageId(): string {\n this.messageCounter++;\n return `msg-${Date.now()}-${this.messageCounter}`;\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.messageQueue = [];\n this.messageMap.clear();\n this.handshakes.clear();\n this.protocolErrors = [];\n this.messageCounter = 0;\n this.cryptoProvider = null;\n this.cryptoConfig = null;\n this.schedulePersist();\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * State Reconciler\n *\n * Reconciles conflicting state across multiple nodes in a distributed system.\n * Applies merge strategies and resolves divergent state.\n *\n * Features:\n * - State comparison and diff generation\n * - Multiple merge strategies (last-write-wins, vector-clock based, custom)\n * - Conflict detection and resolution\n * - State validation and verification\n * - Version tracking\n * - Cryptographic verification of state versions\n * - Signed state for tamper detection\n */\n\nimport { logger } from '../utils/logger';\nimport type { ICryptoProvider } from '../crypto/CryptoProvider';\nimport type { SignedSyncData } from '../crypto/types';\n\nexport interface StateVersion {\n version: string;\n timestamp: string;\n nodeId: string;\n hash: string;\n data: unknown;\n // Cryptographic fields for signed versions\n signerDID?: string;\n signature?: string;\n signedAt?: number;\n}\n\nexport interface StateDiff {\n added: Record<string, unknown>;\n modified: Record<string, { old: unknown; new: unknown }>;\n removed: string[];\n timestamp: string;\n}\n\nexport interface ReconciliationResult {\n success: boolean;\n mergedState: unknown;\n conflictsResolved: number;\n strategy: string;\n timestamp: string;\n}\n\nexport type MergeStrategy =\n | 'last-write-wins'\n | 'vector-clock'\n | 'majority-vote'\n | 'custom';\n\n/**\n * State Reconciler\n * Reconciles state conflicts across distributed nodes\n */\nexport class StateReconciler {\n private stateVersions: Map<string, StateVersion[]> = new Map();\n private reconciliationHistory: ReconciliationResult[] = [];\n private cryptoProvider: ICryptoProvider | null = null;\n private requireSignedVersions: boolean = false;\n\n /**\n * Configure cryptographic provider for signed state versions\n */\n configureCrypto(\n provider: ICryptoProvider,\n requireSigned: boolean = false\n ): void {\n this.cryptoProvider = provider;\n this.requireSignedVersions = requireSigned;\n\n logger.debug('[StateReconciler] Crypto configured', {\n initialized: provider.isInitialized(),\n requireSigned,\n });\n }\n\n /**\n * Check if crypto is configured\n */\n isCryptoEnabled(): boolean {\n return this.cryptoProvider !== null && this.cryptoProvider.isInitialized();\n }\n\n /**\n * Record a signed state version with cryptographic verification\n */\n async recordSignedStateVersion(\n key: string,\n version: string,\n data: unknown\n ): Promise<StateVersion> {\n if (!this.cryptoProvider || !this.cryptoProvider.isInitialized()) {\n throw new Error('Crypto provider not initialized');\n }\n\n const localDID = this.cryptoProvider.getLocalDID();\n if (!localDID) {\n throw new Error('Local DID not available');\n }\n\n // Hash the data\n const dataBytes = new TextEncoder().encode(JSON.stringify(data));\n const hashBytes = await this.cryptoProvider.hash(dataBytes);\n const hash = Array.from(hashBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n // Sign the version\n const versionData = { version, data, hash };\n const signed = await this.cryptoProvider.signData(versionData);\n\n const stateVersion: StateVersion = {\n version,\n timestamp: new Date().toISOString(),\n nodeId: localDID,\n hash,\n data,\n signerDID: localDID,\n signature: signed.signature,\n signedAt: signed.signedAt,\n };\n\n if (!this.stateVersions.has(key)) {\n this.stateVersions.set(key, []);\n }\n\n this.stateVersions.get(key)!.push(stateVersion);\n\n logger.debug('[StateReconciler] Signed state version recorded', {\n key,\n version,\n signerDID: localDID,\n hash: hash.slice(0, 16) + '...',\n });\n\n return stateVersion;\n }\n\n /**\n * Verify a state version's signature\n */\n async verifyStateVersion(\n version: StateVersion\n ): Promise<{ valid: boolean; error?: string }> {\n // If no signature, verify based on hash only\n if (!version.signature || !version.signerDID) {\n if (this.requireSignedVersions) {\n return { valid: false, error: 'Signature required but not present' };\n }\n\n // Verify hash matches data\n const dataBytes = new TextEncoder().encode(JSON.stringify(version.data));\n if (this.cryptoProvider) {\n const hashBytes = await this.cryptoProvider.hash(dataBytes);\n const computedHash = Array.from(hashBytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n if (computedHash !== version.hash) {\n return { valid: false, error: 'Hash mismatch' };\n }\n }\n\n return { valid: true };\n }\n\n // Verify signature\n if (!this.cryptoProvider) {\n return { valid: false, error: 'Crypto provider not configured' };\n }\n\n const versionData = {\n version: version.version,\n data: version.data,\n hash: version.hash,\n };\n\n const signed: SignedSyncData<typeof versionData> = {\n payload: versionData,\n signature: version.signature,\n signer: version.signerDID,\n algorithm: 'ES256',\n signedAt: version.signedAt || Date.now(),\n };\n\n const isValid = await this.cryptoProvider.verifySignedData(signed);\n if (!isValid) {\n return { valid: false, error: 'Invalid signature' };\n }\n\n return { valid: true };\n }\n\n /**\n * Reconcile with verification - only accept verified versions\n */\n async reconcileWithVerification(\n key: string,\n strategy: MergeStrategy = 'last-write-wins'\n ): Promise<ReconciliationResult & { verificationErrors: string[] }> {\n const versions = this.stateVersions.get(key) || [];\n const verifiedVersions: StateVersion[] = [];\n const verificationErrors: string[] = [];\n\n // Verify all versions\n for (const version of versions) {\n const result = await this.verifyStateVersion(version);\n if (result.valid) {\n verifiedVersions.push(version);\n } else {\n verificationErrors.push(\n `Version ${version.version} from ${version.nodeId}: ${result.error}`\n );\n logger.warn('[StateReconciler] Version verification failed', {\n version: version.version,\n nodeId: version.nodeId,\n error: result.error,\n });\n }\n }\n\n if (verifiedVersions.length === 0) {\n return {\n success: false,\n mergedState: null,\n conflictsResolved: 0,\n strategy,\n timestamp: new Date().toISOString(),\n verificationErrors,\n };\n }\n\n // Apply reconciliation strategy\n let result: ReconciliationResult;\n switch (strategy) {\n case 'last-write-wins':\n result = this.reconcileLastWriteWins(verifiedVersions);\n break;\n case 'vector-clock':\n result = this.reconcileVectorClock(verifiedVersions);\n break;\n case 'majority-vote':\n result = this.reconcileMajorityVote(verifiedVersions);\n break;\n default:\n result = this.reconcileLastWriteWins(verifiedVersions);\n }\n\n return { ...result, verificationErrors };\n }\n\n /**\n * Record a state version\n */\n recordStateVersion(\n key: string,\n version: string,\n timestamp: string,\n nodeId: string,\n hash: string,\n data: unknown\n ): void {\n if (!this.stateVersions.has(key)) {\n this.stateVersions.set(key, []);\n }\n\n const versions = this.stateVersions.get(key)!;\n versions.push({\n version,\n timestamp,\n nodeId,\n hash,\n data,\n });\n\n logger.debug('[StateReconciler] State version recorded', {\n key,\n version,\n nodeId,\n hash,\n });\n }\n\n /**\n * Detect conflicts in state versions\n */\n detectConflicts(key: string): boolean {\n const versions = this.stateVersions.get(key);\n if (!versions || versions.length <= 1) {\n return false;\n }\n\n const hashes = new Set(versions.map((v) => v.hash));\n return hashes.size > 1;\n }\n\n /**\n * Compare two states and generate diff\n */\n compareStates(\n state1: Record<string, unknown>,\n state2: Record<string, unknown>\n ): StateDiff {\n const diff: StateDiff = {\n added: {},\n modified: {},\n removed: [],\n timestamp: new Date().toISOString(),\n };\n\n // Find added and modified\n for (const [key, value] of Object.entries(state2)) {\n if (!(key in state1)) {\n diff.added[key] = value;\n } else if (JSON.stringify(state1[key]) !== JSON.stringify(value)) {\n diff.modified[key] = { old: state1[key], new: value };\n }\n }\n\n // Find removed\n for (const key of Object.keys(state1)) {\n if (!(key in state2)) {\n diff.removed.push(key);\n }\n }\n\n return diff;\n }\n\n /**\n * Reconcile states using last-write-wins strategy\n */\n reconcileLastWriteWins(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // Sort by timestamp descending, most recent first\n const sorted = [...versions].sort(\n (a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n const latest = sorted[0];\n const conflictsResolved = versions.length - 1;\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: latest.data,\n conflictsResolved,\n strategy: 'last-write-wins',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (last-write-wins)', {\n winnerNode: latest.nodeId,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Reconcile states using vector clock strategy\n */\n reconcileVectorClock(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // For vector clock, use the version with highest timestamp\n // In production, this would use actual vector clocks\n const sorted = [...versions].sort(\n (a, b) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n const latest = sorted[0];\n let conflictsResolved = 0;\n\n // Count concurrent versions (those with similar timestamps)\n for (const v of versions) {\n const timeDiff = Math.abs(\n new Date(v.timestamp).getTime() - new Date(latest.timestamp).getTime()\n );\n if (timeDiff > 100) {\n // More than 100ms difference\n conflictsResolved++;\n }\n }\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: latest.data,\n conflictsResolved,\n strategy: 'vector-clock',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (vector-clock)', {\n winnerVersion: latest.version,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Reconcile states using majority vote strategy\n */\n reconcileMajorityVote(versions: StateVersion[]): ReconciliationResult {\n if (versions.length === 0) {\n throw new Error('No versions to reconcile');\n }\n\n // Group versions by hash\n const hashGroups: Map<string, StateVersion[]> = new Map();\n for (const version of versions) {\n if (!hashGroups.has(version.hash)) {\n hashGroups.set(version.hash, []);\n }\n hashGroups.get(version.hash)!.push(version);\n }\n\n // Find the majority\n let majorityVersion: StateVersion | null = null;\n let maxCount = 0;\n\n for (const [, versionGroup] of hashGroups) {\n if (versionGroup.length > maxCount) {\n maxCount = versionGroup.length;\n majorityVersion = versionGroup[0];\n }\n }\n\n if (!majorityVersion) {\n majorityVersion = versions[0];\n }\n\n const conflictsResolved = versions.length - maxCount;\n\n const result: ReconciliationResult = {\n success: true,\n mergedState: majorityVersion.data,\n conflictsResolved,\n strategy: 'majority-vote',\n timestamp: new Date().toISOString(),\n };\n\n this.reconciliationHistory.push(result);\n\n logger.debug('[StateReconciler] State reconciled (majority-vote)', {\n majorityCount: maxCount,\n conflictsResolved,\n });\n\n return result;\n }\n\n /**\n * Merge multiple states\n */\n mergeStates(states: Record<string, unknown>[]): unknown {\n if (states.length === 0) {\n return {};\n }\n\n if (states.length === 1) {\n return states[0];\n }\n\n // Simple merge: take all keys, preferring later states\n const merged: Record<string, unknown> = {};\n\n for (const state of states) {\n if (typeof state === 'object' && state !== null) {\n Object.assign(merged, state);\n }\n }\n\n return merged;\n }\n\n /**\n * Validate state after reconciliation\n */\n validateState(state: unknown): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (state === null) {\n errors.push('State is null');\n } else if (state === undefined) {\n errors.push('State is undefined');\n } else if (typeof state !== 'object') {\n errors.push('State is not an object');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get state versions for a key\n */\n getStateVersions(key: string): StateVersion[] {\n return this.stateVersions.get(key) || [];\n }\n\n /**\n * Get all state versions\n */\n getAllStateVersions(): Record<string, StateVersion[]> {\n const result: Record<string, StateVersion[]> = {};\n\n for (const [key, versions] of this.stateVersions) {\n result[key] = [...versions];\n }\n\n return result;\n }\n\n /**\n * Get reconciliation history\n */\n getReconciliationHistory(): ReconciliationResult[] {\n return [...this.reconciliationHistory];\n }\n\n /**\n * Get reconciliation statistics\n */\n getStatistics() {\n const resolvedConflicts = this.reconciliationHistory.reduce(\n (sum, r) => sum + r.conflictsResolved,\n 0\n );\n\n const strategyUsage: Record<string, number> = {};\n for (const result of this.reconciliationHistory) {\n strategyUsage[result.strategy] =\n (strategyUsage[result.strategy] || 0) + 1;\n }\n\n return {\n totalReconciliations: this.reconciliationHistory.length,\n successfulReconciliations: this.reconciliationHistory.filter(\n (r) => r.success\n ).length,\n totalConflictsResolved: resolvedConflicts,\n averageConflictsPerReconciliation:\n this.reconciliationHistory.length > 0\n ? resolvedConflicts / this.reconciliationHistory.length\n : 0,\n strategyUsage,\n trackedKeys: this.stateVersions.size,\n };\n }\n\n /**\n * Clear all state (for testing)\n */\n clear(): void {\n this.stateVersions.clear();\n this.reconciliationHistory = [];\n this.cryptoProvider = null;\n this.requireSignedVersions = false;\n }\n\n /**\n * Get the crypto provider (for advanced usage)\n */\n getCryptoProvider(): ICryptoProvider | null {\n return this.cryptoProvider;\n }\n}\n","/**\n * Offline Operation Queue (Phase 11)\n *\n * Manages pending operations for offline-first clients.\n * Provides priority-based queuing, persistence, and retry logic.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { getLogger } from '../utils/logger';\nimport type { Operation, OperationPriority } from '../core/types';\nimport type {\n PersistedEnvelope,\n PersistenceDeserializer,\n PersistenceSerializer,\n StorageAdapter,\n} from '../persistence';\n\nconst logger = getLogger();\n\n// Re-export OperationPriority from core\nexport type { OperationPriority } from '../core/types';\n\nexport interface OfflineOperation {\n id: string;\n type: Operation['type'];\n data: Record<string, unknown>;\n sessionId: string;\n priority: OperationPriority;\n createdAt: number;\n retryCount: number;\n maxRetries: number;\n lastError?: string;\n status: 'pending' | 'syncing' | 'failed' | 'synced';\n}\n\nexport interface OfflineQueueStats {\n pending: number;\n syncing: number;\n failed: number;\n synced: number;\n totalOperations: number;\n oldestPendingMs: number;\n averageRetries: number;\n}\n\nexport interface OfflineQueueEvents {\n 'operation-added': (operation: OfflineOperation) => void;\n 'operation-synced': (operation: OfflineOperation) => void;\n 'operation-failed': (operation: OfflineOperation, error: Error) => void;\n 'queue-empty': () => void;\n 'sync-started': () => void;\n 'sync-completed': (stats: { synced: number; failed: number }) => void;\n}\n\nexport interface OfflineQueuePersistenceConfig {\n adapter: StorageAdapter;\n key?: string;\n autoPersist?: boolean;\n autoLoad?: boolean;\n persistDebounceMs?: number;\n serializer?: PersistenceSerializer<OfflineOperation[]>;\n deserializer?: PersistenceDeserializer<OfflineOperation[]>;\n}\n\nexport interface OfflineOperationQueueOptions {\n maxQueueSize?: number;\n defaultMaxRetries?: number;\n persistence?: OfflineQueuePersistenceConfig;\n}\n\n// ============================================================================\n// Offline Operation Queue\n// ============================================================================\n\nexport class OfflineOperationQueue extends EventEmitter<OfflineQueueEvents> {\n private static readonly DEFAULT_PERSIST_KEY = 'aeon:offline-queue:v1';\n private queue: Map<string, OfflineOperation> = new Map();\n private syncingIds: Set<string> = new Set();\n private maxQueueSize = 1000;\n private defaultMaxRetries = 3;\n private persistence:\n | (OfflineQueuePersistenceConfig & { key: string })\n | null = null;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n private persistInFlight = false;\n private persistPending = false;\n\n constructor(\n maxQueueSizeOrOptions: number | OfflineOperationQueueOptions = 1000,\n defaultMaxRetries = 3\n ) {\n super();\n\n if (typeof maxQueueSizeOrOptions === 'number') {\n this.maxQueueSize = maxQueueSizeOrOptions;\n this.defaultMaxRetries = defaultMaxRetries;\n } else {\n this.maxQueueSize = maxQueueSizeOrOptions.maxQueueSize ?? 1000;\n this.defaultMaxRetries = maxQueueSizeOrOptions.defaultMaxRetries ?? 3;\n\n if (maxQueueSizeOrOptions.persistence) {\n this.persistence = {\n ...maxQueueSizeOrOptions.persistence,\n key:\n maxQueueSizeOrOptions.persistence.key ??\n OfflineOperationQueue.DEFAULT_PERSIST_KEY,\n autoPersist: maxQueueSizeOrOptions.persistence.autoPersist ?? true,\n autoLoad: maxQueueSizeOrOptions.persistence.autoLoad ?? false,\n persistDebounceMs:\n maxQueueSizeOrOptions.persistence.persistDebounceMs ?? 25,\n };\n\n if (this.persistence.autoLoad) {\n void this.loadFromPersistence().catch((error) => {\n logger.error('[OfflineOperationQueue] Failed to load persistence', {\n key: this.persistence?.key,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n }\n }\n }\n\n logger.debug('[OfflineOperationQueue] Initialized', {\n maxQueueSize: this.maxQueueSize,\n defaultMaxRetries: this.defaultMaxRetries,\n persistenceEnabled: this.persistence !== null,\n });\n }\n\n /**\n * Add operation to the queue\n */\n enqueue(\n type: Operation['type'],\n data: Record<string, unknown>,\n sessionId: string,\n priority: OperationPriority = 'normal',\n maxRetries?: number\n ): OfflineOperation {\n if (this.queue.size >= this.maxQueueSize) {\n // Remove oldest low-priority operation\n const oldest = this.findOldestLowPriority();\n if (oldest) {\n this.queue.delete(oldest.id);\n logger.warn('[OfflineOperationQueue] Queue full, removed oldest', {\n removedId: oldest.id,\n });\n }\n }\n\n const operation: OfflineOperation = {\n id: `op-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type,\n data,\n sessionId,\n priority,\n createdAt: Date.now(),\n retryCount: 0,\n maxRetries: maxRetries ?? this.defaultMaxRetries,\n status: 'pending',\n };\n\n this.queue.set(operation.id, operation);\n this.emit('operation-added', operation);\n this.schedulePersist();\n\n logger.debug('[OfflineOperationQueue] Operation enqueued', {\n id: operation.id,\n type,\n priority,\n queueSize: this.queue.size,\n });\n\n return operation;\n }\n\n /**\n * Get next operations to sync (by priority)\n */\n getNextBatch(batchSize = 10): OfflineOperation[] {\n const pending = Array.from(this.queue.values())\n .filter((op) => op.status === 'pending' && !this.syncingIds.has(op.id))\n .sort((a, b) => {\n // Sort by priority first, then by creation time\n const priorityOrder = { high: 0, normal: 1, low: 2 };\n const priorityDiff =\n priorityOrder[a.priority] - priorityOrder[b.priority];\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n\n return pending.slice(0, batchSize);\n }\n\n /**\n * Mark operations as syncing\n */\n markSyncing(operationIds: string[]): void {\n let changed = false;\n for (const id of operationIds) {\n const op = this.queue.get(id);\n if (op) {\n op.status = 'syncing';\n this.syncingIds.add(id);\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Mark operation as synced\n */\n markSynced(operationId: string): void {\n const op = this.queue.get(operationId);\n if (op) {\n op.status = 'synced';\n this.syncingIds.delete(operationId);\n this.emit('operation-synced', op);\n this.schedulePersist();\n\n // Remove synced operations after short delay\n setTimeout(() => {\n this.queue.delete(operationId);\n this.schedulePersist();\n if (this.getPendingCount() === 0) {\n this.emit('queue-empty');\n }\n }, 1000);\n }\n }\n\n /**\n * Mark operation as failed\n */\n markFailed(operationId: string, error: Error): void {\n const op = this.queue.get(operationId);\n if (op) {\n op.retryCount++;\n op.lastError = error.message;\n this.syncingIds.delete(operationId);\n\n if (op.retryCount >= op.maxRetries) {\n op.status = 'failed';\n this.emit('operation-failed', op, error);\n logger.error('[OfflineOperationQueue] Operation permanently failed', {\n id: operationId,\n retries: op.retryCount,\n error: error.message,\n });\n } else {\n op.status = 'pending';\n logger.warn('[OfflineOperationQueue] Operation failed, will retry', {\n id: operationId,\n retryCount: op.retryCount,\n maxRetries: op.maxRetries,\n });\n }\n\n this.schedulePersist();\n }\n }\n\n /**\n * Get operation by ID\n */\n getOperation(operationId: string): OfflineOperation | undefined {\n return this.queue.get(operationId);\n }\n\n /**\n * Get all pending operations\n */\n getPendingOperations(): OfflineOperation[] {\n return Array.from(this.queue.values()).filter(\n (op) => op.status === 'pending'\n );\n }\n\n /**\n * Get pending count\n */\n getPendingCount(): number {\n return Array.from(this.queue.values()).filter(\n (op) => op.status === 'pending'\n ).length;\n }\n\n /**\n * Get queue statistics\n */\n getStats(): OfflineQueueStats {\n const operations = Array.from(this.queue.values());\n\n const pending = operations.filter((op) => op.status === 'pending').length;\n const syncing = operations.filter((op) => op.status === 'syncing').length;\n const failed = operations.filter((op) => op.status === 'failed').length;\n const synced = operations.filter((op) => op.status === 'synced').length;\n\n const pendingOps = operations.filter((op) => op.status === 'pending');\n const oldestPendingMs =\n pendingOps.length > 0\n ? Date.now() - Math.min(...pendingOps.map((op) => op.createdAt))\n : 0;\n\n const averageRetries =\n operations.length > 0\n ? operations.reduce((sum, op) => sum + op.retryCount, 0) /\n operations.length\n : 0;\n\n return {\n pending,\n syncing,\n failed,\n synced,\n totalOperations: operations.length,\n oldestPendingMs,\n averageRetries,\n };\n }\n\n /**\n * Clear all operations\n */\n clear(): void {\n this.queue.clear();\n this.syncingIds.clear();\n this.schedulePersist();\n logger.debug('[OfflineOperationQueue] Queue cleared');\n }\n\n /**\n * Clear failed operations\n */\n clearFailed(): void {\n let changed = false;\n for (const [id, op] of this.queue.entries()) {\n if (op.status === 'failed') {\n this.queue.delete(id);\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Retry failed operations\n */\n retryFailed(): void {\n let changed = false;\n for (const op of this.queue.values()) {\n if (op.status === 'failed') {\n op.status = 'pending';\n op.retryCount = 0;\n changed = true;\n }\n }\n\n if (changed) {\n this.schedulePersist();\n }\n }\n\n /**\n * Find oldest low-priority operation\n */\n private findOldestLowPriority(): OfflineOperation | null {\n const lowPriority = Array.from(this.queue.values())\n .filter((op) => op.priority === 'low' && op.status === 'pending')\n .sort((a, b) => a.createdAt - b.createdAt);\n\n return lowPriority[0] ?? null;\n }\n\n /**\n * Export queue for persistence\n */\n export(): OfflineOperation[] {\n return Array.from(this.queue.values());\n }\n\n /**\n * Import queue from persistence\n */\n import(operations: OfflineOperation[]): void {\n this.queue.clear();\n this.syncingIds.clear();\n\n for (const op of operations) {\n if (this.isValidOfflineOperation(op)) {\n this.queue.set(op.id, {\n ...op,\n status: op.status === 'syncing' ? 'pending' : op.status,\n });\n }\n }\n\n this.schedulePersist();\n\n logger.debug('[OfflineOperationQueue] Imported operations', {\n count: this.queue.size,\n });\n }\n\n /**\n * Persist current queue snapshot.\n */\n async saveToPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n const envelope: PersistedEnvelope<OfflineOperation[]> = {\n version: 1,\n updatedAt: Date.now(),\n data: this.export(),\n };\n\n const serialize =\n this.persistence.serializer ??\n ((value: PersistedEnvelope<OfflineOperation[]>) => JSON.stringify(value));\n const raw = serialize(envelope);\n\n await this.persistence.adapter.setItem(this.persistence.key, raw);\n }\n\n /**\n * Load queue snapshot from persistence.\n */\n async loadFromPersistence(): Promise<number> {\n if (!this.persistence) {\n return 0;\n }\n\n const raw = await this.persistence.adapter.getItem(this.persistence.key);\n if (!raw) {\n return 0;\n }\n\n const deserialize =\n this.persistence.deserializer ??\n ((value: string) =>\n JSON.parse(value) as PersistedEnvelope<OfflineOperation[]>);\n\n const envelope = deserialize(raw);\n if (envelope.version !== 1 || !Array.isArray(envelope.data)) {\n throw new Error('Invalid offline queue persistence payload');\n }\n\n this.queue.clear();\n this.syncingIds.clear();\n\n let imported = 0;\n for (const operation of envelope.data) {\n if (this.isValidOfflineOperation(operation)) {\n this.queue.set(operation.id, {\n ...operation,\n status: operation.status === 'syncing' ? 'pending' : operation.status,\n });\n imported++;\n }\n }\n\n logger.debug('[OfflineOperationQueue] Loaded from persistence', {\n key: this.persistence.key,\n imported,\n });\n\n return imported;\n }\n\n /**\n * Remove persisted queue snapshot.\n */\n async clearPersistence(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n await this.persistence.adapter.removeItem(this.persistence.key);\n }\n\n private schedulePersist(): void {\n if (!this.persistence || this.persistence.autoPersist === false) {\n return;\n }\n\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n }\n\n this.persistTimer = setTimeout(() => {\n void this.persistSafely();\n }, this.persistence.persistDebounceMs ?? 25);\n }\n\n private async persistSafely(): Promise<void> {\n if (!this.persistence) {\n return;\n }\n\n if (this.persistInFlight) {\n this.persistPending = true;\n return;\n }\n\n this.persistInFlight = true;\n\n try {\n await this.saveToPersistence();\n } catch (error) {\n logger.error('[OfflineOperationQueue] Persistence write failed', {\n key: this.persistence.key,\n error: error instanceof Error ? error.message : String(error),\n });\n } finally {\n this.persistInFlight = false;\n const shouldRunAgain = this.persistPending;\n this.persistPending = false;\n if (shouldRunAgain) {\n void this.persistSafely();\n }\n }\n }\n\n private isValidOfflineOperation(value: unknown): value is OfflineOperation {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n\n const candidate = value as Partial<OfflineOperation>;\n const validType =\n candidate.type === 'create' ||\n candidate.type === 'update' ||\n candidate.type === 'delete' ||\n candidate.type === 'sync' ||\n candidate.type === 'batch';\n const validPriority =\n candidate.priority === 'high' ||\n candidate.priority === 'normal' ||\n candidate.priority === 'low';\n const validStatus =\n candidate.status === 'pending' ||\n candidate.status === 'syncing' ||\n candidate.status === 'failed' ||\n candidate.status === 'synced';\n\n return (\n typeof candidate.id === 'string' &&\n validType &&\n typeof candidate.data === 'object' &&\n candidate.data !== null &&\n !Array.isArray(candidate.data) &&\n typeof candidate.sessionId === 'string' &&\n validPriority &&\n typeof candidate.createdAt === 'number' &&\n typeof candidate.retryCount === 'number' &&\n typeof candidate.maxRetries === 'number' &&\n validStatus\n );\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet offlineQueueInstance: OfflineOperationQueue | null = null;\n\nexport function getOfflineOperationQueue(): OfflineOperationQueue {\n if (!offlineQueueInstance) {\n offlineQueueInstance = new OfflineOperationQueue();\n }\n return offlineQueueInstance;\n}\n\nexport function resetOfflineOperationQueue(): void {\n offlineQueueInstance = null;\n}\n","/**\n * Compression Engine (Phase 12)\n *\n * Provides compression for delta operations using native CompressionStream API.\n * Falls back gracefully when native compression is unavailable.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CompressedBatch {\n id: string;\n compressed: Uint8Array;\n originalSize: number;\n compressedSize: number;\n compressionRatio: number;\n algorithm: 'gzip' | 'deflate' | 'none';\n timestamp: number;\n}\n\nexport interface CompressedChunk {\n chunkId: string;\n batchId: string;\n data: Uint8Array;\n index: number;\n total: number;\n checksum: string;\n}\n\nexport interface CompressionStats {\n totalCompressed: number;\n totalDecompressed: number;\n totalOriginalBytes: number;\n totalCompressedBytes: number;\n averageCompressionRatio: number;\n compressionTimeMs: number;\n decompressionTimeMs: number;\n}\n\n// ============================================================================\n// Compression Engine\n// ============================================================================\n\nexport class CompressionEngine {\n private stats: CompressionStats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n private preferredAlgorithm: 'gzip' | 'deflate' = 'gzip';\n\n constructor(preferredAlgorithm: 'gzip' | 'deflate' = 'gzip') {\n this.preferredAlgorithm = preferredAlgorithm;\n logger.debug('[CompressionEngine] Initialized', {\n algorithm: preferredAlgorithm,\n supportsNative: this.supportsNativeCompression(),\n });\n }\n\n /**\n * Check if native compression is available\n */\n supportsNativeCompression(): boolean {\n return (\n typeof CompressionStream !== 'undefined' &&\n typeof DecompressionStream !== 'undefined'\n );\n }\n\n /**\n * Compress data\n */\n async compress(data: Uint8Array | string): Promise<CompressedBatch> {\n const startTime = performance.now();\n\n const inputData =\n typeof data === 'string' ? new TextEncoder().encode(data) : data;\n const originalSize = inputData.byteLength;\n\n let compressed: Uint8Array;\n let algorithm: 'gzip' | 'deflate' | 'none' = this.preferredAlgorithm;\n\n if (this.supportsNativeCompression()) {\n try {\n compressed = await this.compressNative(\n inputData,\n this.preferredAlgorithm\n );\n } catch (error) {\n logger.warn(\n '[CompressionEngine] Native compression failed, using fallback',\n error\n );\n compressed = inputData;\n algorithm = 'none';\n }\n } else {\n // No native compression - return uncompressed\n compressed = inputData;\n algorithm = 'none';\n }\n\n const compressionRatio =\n originalSize > 0 ? 1 - compressed.byteLength / originalSize : 0;\n\n const batch: CompressedBatch = {\n id: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n compressed,\n originalSize,\n compressedSize: compressed.byteLength,\n compressionRatio,\n algorithm,\n timestamp: Date.now(),\n };\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalCompressed++;\n this.stats.totalOriginalBytes += originalSize;\n this.stats.totalCompressedBytes += compressed.byteLength;\n this.stats.compressionTimeMs += elapsed;\n this.updateAverageRatio();\n\n logger.debug('[CompressionEngine] Compressed', {\n original: originalSize,\n compressed: compressed.byteLength,\n ratio: (compressionRatio * 100).toFixed(1) + '%',\n algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return batch;\n }\n\n /**\n * Decompress data\n */\n async decompress(batch: CompressedBatch): Promise<Uint8Array> {\n const startTime = performance.now();\n\n let decompressed: Uint8Array;\n\n if (batch.algorithm === 'none') {\n decompressed = batch.compressed;\n } else if (this.supportsNativeCompression()) {\n try {\n decompressed = await this.decompressNative(\n batch.compressed,\n batch.algorithm\n );\n } catch (error) {\n logger.warn('[CompressionEngine] Native decompression failed', error);\n throw error;\n }\n } else {\n throw new Error('Native decompression not available');\n }\n\n // Update stats\n const elapsed = performance.now() - startTime;\n this.stats.totalDecompressed++;\n this.stats.decompressionTimeMs += elapsed;\n\n logger.debug('[CompressionEngine] Decompressed', {\n compressed: batch.compressedSize,\n decompressed: decompressed.byteLength,\n algorithm: batch.algorithm,\n timeMs: elapsed.toFixed(2),\n });\n\n return decompressed;\n }\n\n /**\n * Compress using native CompressionStream\n */\n private async compressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new CompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Decompress using native DecompressionStream\n */\n private async decompressNative(\n data: Uint8Array,\n algorithm: 'gzip' | 'deflate'\n ): Promise<Uint8Array> {\n const stream = new DecompressionStream(algorithm);\n const writer = stream.writable.getWriter();\n const reader = stream.readable.getReader();\n\n writer.write(\n new Uint8Array(\n data.buffer,\n data.byteOffset,\n data.byteLength\n ) as BufferSource\n );\n writer.close();\n\n const chunks: Uint8Array[] = [];\n let done = false;\n\n while (!done) {\n const result = await reader.read();\n done = result.done;\n if (result.value) {\n chunks.push(result.value);\n }\n }\n\n // Combine chunks\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Split compressed batch into chunks for transmission\n */\n splitIntoChunks(\n batch: CompressedBatch,\n chunkSize = 64 * 1024\n ): CompressedChunk[] {\n const chunks: CompressedChunk[] = [];\n const data = batch.compressed;\n const total = Math.ceil(data.byteLength / chunkSize);\n\n for (let i = 0; i < total; i++) {\n const start = i * chunkSize;\n const end = Math.min(start + chunkSize, data.byteLength);\n const chunkData = data.slice(start, end);\n\n chunks.push({\n chunkId: `${batch.id}-chunk-${i}`,\n batchId: batch.id,\n data: chunkData,\n index: i,\n total,\n checksum: this.simpleChecksum(chunkData),\n });\n }\n\n return chunks;\n }\n\n /**\n * Reassemble chunks into compressed batch\n */\n reassembleChunks(chunks: CompressedChunk[]): Uint8Array {\n // Sort by index\n const sorted = [...chunks].sort((a, b) => a.index - b.index);\n\n // Verify all chunks present\n if (sorted.length === 0) {\n throw new Error('Cannot reassemble: no chunks provided');\n }\n const total = sorted[0].total;\n if (sorted.length !== total) {\n throw new Error(\n `Missing chunks: got ${sorted.length}, expected ${total}`\n );\n }\n\n // Combine\n const totalLength = sorted.reduce(\n (sum, chunk) => sum + chunk.data.length,\n 0\n );\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of sorted) {\n combined.set(chunk.data, offset);\n offset += chunk.data.length;\n }\n\n return combined;\n }\n\n /**\n * Simple checksum for chunk verification\n */\n private simpleChecksum(data: Uint8Array): string {\n let hash = 0;\n for (let i = 0; i < data.length; i++) {\n hash = ((hash << 5) - hash + data[i]) | 0;\n }\n return (hash >>> 0).toString(16);\n }\n\n /**\n * Update average compression ratio\n */\n private updateAverageRatio(): void {\n if (this.stats.totalOriginalBytes > 0) {\n this.stats.averageCompressionRatio =\n 1 - this.stats.totalCompressedBytes / this.stats.totalOriginalBytes;\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): CompressionStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalCompressed: 0,\n totalDecompressed: 0,\n totalOriginalBytes: 0,\n totalCompressedBytes: 0,\n averageCompressionRatio: 0,\n compressionTimeMs: 0,\n decompressionTimeMs: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet compressionEngineInstance: CompressionEngine | null = null;\n\nexport function getCompressionEngine(): CompressionEngine {\n if (!compressionEngineInstance) {\n compressionEngineInstance = new CompressionEngine();\n }\n return compressionEngineInstance;\n}\n\nexport function resetCompressionEngine(): void {\n compressionEngineInstance = null;\n}\n","/**\n * Delta Sync Optimizer (Phase 12)\n *\n * Implements field-level change detection to reduce payload size.\n * Computes delta between current and previous operation state.\n *\n * Performance Impact:\n * - Delta sync alone: 70-80% payload reduction\n * - Combined with compression: 80-90% total reduction\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Delta operation - represents only changed fields\n */\nexport interface DeltaOperation {\n id: string;\n type: 'full' | 'delta';\n operationId: string;\n operationType: Operation['type'];\n sessionId: string;\n timestamp: number;\n changes?: Record<string, unknown>; // Only for delta type\n changeMask?: string[]; // Field names that changed\n fullData?: Record<string, unknown>; // Only for full type (new records)\n priority?: 'high' | 'normal' | 'low';\n}\n\n/**\n * Batch of delta operations\n */\nexport interface DeltaBatch {\n batchId: string;\n operations: DeltaOperation[];\n timestamp: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n reductionPercent: number;\n}\n\n/**\n * Statistics about delta sync performance\n */\nexport interface DeltaStats {\n totalOperations: number;\n totalFull: number;\n totalDelta: number;\n totalOriginalSize: number;\n totalDeltaSize: number;\n averageReductionPercent: number;\n lastSyncTime: number;\n fullOperationThreshold: number;\n}\n\n// ============================================================================\n// Delta Sync Optimizer\n// ============================================================================\n\nexport class DeltaSyncOptimizer {\n private static readonly MAX_HISTORY_SIZE = 10000;\n private operationHistory: Map<string, Operation> = new Map();\n private stats: DeltaStats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: 1000, // Force full if delta > 1KB\n };\n\n constructor(fullOperationThreshold = 1000) {\n this.stats.fullOperationThreshold = fullOperationThreshold;\n logger.debug('[DeltaSyncOptimizer] Initialized', {\n threshold: fullOperationThreshold,\n });\n }\n\n /**\n * Compute delta for single operation\n */\n computeDelta(operation: Operation): DeltaOperation {\n const operationJson = JSON.stringify(operation);\n const originalSize = new TextEncoder().encode(operationJson).byteLength;\n\n // Check if we have historical state\n const previous = this.operationHistory.get(operation.id);\n\n if (!previous) {\n // New operation - return as full\n const delta: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'full',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n fullData: operation.data,\n priority: operation.priority,\n };\n\n // Update stats\n this.stats.totalOperations++;\n this.stats.totalFull++;\n this.stats.totalOriginalSize += originalSize;\n\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(delta)\n ).byteLength;\n this.stats.totalDeltaSize += deltaSize;\n\n // Store in history (evict oldest if over limit)\n this.operationHistory.set(operation.id, operation);\n if (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n }\n\n return delta;\n }\n\n // Compare with previous - extract changed fields\n const changes: Record<string, unknown> = {};\n const changeMask: string[] = [];\n let hasMeaningfulChanges = false;\n\n for (const [key, value] of Object.entries(operation.data)) {\n const oldValue = previous.data[key];\n\n if (!this.deepEqual(value, oldValue)) {\n changes[key] = value;\n changeMask.push(key);\n hasMeaningfulChanges = true;\n }\n }\n\n // Check for deleted fields\n for (const key of Object.keys(previous.data)) {\n if (!(key in operation.data)) {\n changes[key] = null;\n changeMask.push(`${key}:deleted`);\n hasMeaningfulChanges = true;\n }\n }\n\n // Build delta operation\n const deltaData: DeltaOperation = {\n id: `delta-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n type: 'delta',\n operationId: operation.id,\n operationType: operation.type,\n sessionId: operation.sessionId,\n timestamp: Date.now(),\n changes: hasMeaningfulChanges ? changes : undefined,\n changeMask: hasMeaningfulChanges ? changeMask : undefined,\n priority: operation.priority,\n };\n\n // If delta is too large, send as full instead\n const deltaSize = new TextEncoder().encode(\n JSON.stringify(deltaData)\n ).byteLength;\n\n const finalDelta =\n deltaSize > this.stats.fullOperationThreshold\n ? {\n ...deltaData,\n type: 'full' as const,\n fullData: operation.data,\n changes: undefined,\n changeMask: undefined,\n }\n : deltaData;\n\n // Update stats\n this.stats.totalOperations++;\n if (finalDelta.type === 'full') {\n this.stats.totalFull++;\n } else {\n this.stats.totalDelta++;\n }\n\n this.stats.totalOriginalSize += originalSize;\n this.stats.totalDeltaSize += deltaSize;\n\n // Update history (evict oldest if over limit)\n this.operationHistory.set(operation.id, operation);\n if (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n }\n\n return finalDelta;\n }\n\n /**\n * Compute deltas for batch of operations\n */\n computeBatchDeltas(operations: Operation[]): DeltaBatch {\n const deltas = operations.map((op) => this.computeDelta(op));\n\n const totalOriginalSize = operations.reduce(\n (sum, op) =>\n sum + new TextEncoder().encode(JSON.stringify(op)).byteLength,\n 0\n );\n\n const totalDeltaSize = deltas.reduce(\n (sum, delta) =>\n sum + new TextEncoder().encode(JSON.stringify(delta)).byteLength,\n 0\n );\n\n const reductionPercent =\n totalOriginalSize > 0\n ? Math.round(\n ((totalOriginalSize - totalDeltaSize) / totalOriginalSize) * 100\n )\n : 0;\n\n const batch: DeltaBatch = {\n batchId: `batch-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n operations: deltas,\n timestamp: Date.now(),\n totalOriginalSize,\n totalDeltaSize,\n reductionPercent,\n };\n\n logger.debug('[DeltaSyncOptimizer] Batch computed', {\n operations: operations.length,\n reduction: reductionPercent,\n size: totalDeltaSize,\n });\n\n return batch;\n }\n\n /**\n * Decompress delta operation back to full operation\n */\n decompressDelta(delta: DeltaOperation): Operation {\n if (delta.type === 'full') {\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.fullData || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n const previous = this.operationHistory.get(delta.operationId);\n\n if (!previous) {\n logger.warn('[DeltaSyncOptimizer] Cannot decompress - no history', {\n operationId: delta.operationId,\n });\n\n return {\n id: delta.operationId,\n type: delta.operationType,\n sessionId: delta.sessionId,\n data: delta.changes || {},\n status: 'pending',\n createdAt: delta.timestamp,\n };\n }\n\n // Apply changes to historical state\n const reconstructed = {\n ...previous,\n data: {\n ...previous.data,\n ...(delta.changes || {}),\n },\n };\n\n // Remove null fields (marked as deleted)\n if (delta.changes) {\n for (const [key, value] of Object.entries(delta.changes)) {\n if (value === null) {\n delete reconstructed.data[key];\n }\n }\n }\n\n return reconstructed;\n }\n\n /**\n * Update history after successful sync\n */\n updateHistory(operations: Operation[]): void {\n for (const op of operations) {\n this.operationHistory.set(op.id, op);\n }\n // Evict oldest entries if over limit\n while (this.operationHistory.size > DeltaSyncOptimizer.MAX_HISTORY_SIZE) {\n const firstKey = this.operationHistory.keys().next().value;\n if (firstKey !== undefined) this.operationHistory.delete(firstKey);\n else break;\n }\n\n logger.debug('[DeltaSyncOptimizer] History updated', {\n count: operations.length,\n totalHistorySize: this.operationHistory.size,\n });\n }\n\n /**\n * Clear history for specific operations\n */\n clearHistory(operationIds: string[]): void {\n for (const id of operationIds) {\n this.operationHistory.delete(id);\n }\n\n logger.debug('[DeltaSyncOptimizer] History cleared', {\n cleared: operationIds.length,\n remaining: this.operationHistory.size,\n });\n }\n\n /**\n * Get current performance statistics\n */\n getStats(): DeltaStats {\n if (this.stats.totalOperations > 0) {\n this.stats.averageReductionPercent = Math.round(\n ((this.stats.totalOriginalSize - this.stats.totalDeltaSize) /\n this.stats.totalOriginalSize) *\n 100\n );\n }\n\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalOperations: 0,\n totalFull: 0,\n totalDelta: 0,\n totalOriginalSize: 0,\n totalDeltaSize: 0,\n averageReductionPercent: 0,\n lastSyncTime: 0,\n fullOperationThreshold: this.stats.fullOperationThreshold,\n };\n\n logger.debug('[DeltaSyncOptimizer] Stats reset');\n }\n\n /**\n * Set the full operation threshold\n */\n setFullOperationThreshold(bytes: number): void {\n this.stats.fullOperationThreshold = bytes;\n logger.debug('[DeltaSyncOptimizer] Threshold updated', { bytes });\n }\n\n /**\n * Get history size for memory monitoring\n */\n getHistorySize(): number {\n return this.operationHistory.size;\n }\n\n /**\n * Get memory footprint estimate\n */\n getMemoryEstimate(): number {\n let totalBytes = 0;\n\n for (const op of this.operationHistory.values()) {\n totalBytes += new TextEncoder().encode(JSON.stringify(op)).byteLength;\n }\n\n return totalBytes;\n }\n\n /**\n * Deep equality check for nested objects\n */\n private deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n const aObj = a as Record<string, unknown>;\n const bObj = b as Record<string, unknown>;\n\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n\n if (aKeys.length !== bKeys.length) return false;\n\n for (const key of aKeys) {\n if (!this.deepEqual(aObj[key], bObj[key])) {\n return false;\n }\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet deltaSyncInstance: DeltaSyncOptimizer | null = null;\n\nexport function getDeltaSyncOptimizer(threshold?: number): DeltaSyncOptimizer {\n if (!deltaSyncInstance) {\n deltaSyncInstance = new DeltaSyncOptimizer(threshold);\n }\n return deltaSyncInstance;\n}\n\nexport function resetDeltaSyncOptimizer(): void {\n deltaSyncInstance = null;\n}\n","/**\n * Prefetching Engine (Phase 13)\n *\n * Predictively pre-compresses batches based on detected operation patterns.\n * Analyzes historical data to predict which operations are most likely to occur.\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { Operation } from '../core/types';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Pattern in operation sequence\n */\nexport interface OperationPattern {\n sequence: string[];\n frequency: number;\n probability: number;\n lastOccurred: number;\n avgIntervalMs: number;\n}\n\n/**\n * Prediction for next operations\n */\nexport interface OperationPrediction {\n operationType: string;\n probability: number;\n reason: string;\n shouldPrefetch: boolean;\n estimatedTimeMs: number;\n}\n\n/**\n * Prefetched batch\n */\nexport interface PrefetchedBatch {\n id: string;\n operationType: string;\n compressed: Uint8Array;\n compressedSize: number;\n originalSize: number;\n compressionRatio: number;\n compressed_at: number;\n created_at: number;\n ttl: number;\n expiresAt: number;\n hitCount: number;\n missCount: number;\n}\n\n/**\n * Prefetching statistics\n */\nexport interface PrefetchingStats {\n totalPrefetched: number;\n totalHits: number;\n totalMisses: number;\n totalOverwrites: number;\n hitRatio: number;\n bandwidthSaved: number;\n patternsDetected: number;\n predictionAccuracy: number;\n}\n\n// ============================================================================\n// Prefetching Engine\n// ============================================================================\n\nexport class PrefetchingEngine {\n private operationHistory: Array<{\n type: string;\n timestamp: number;\n size: number;\n }> = [];\n private patterns: Map<string, OperationPattern> = new Map();\n private prefetchCache: Map<string, PrefetchedBatch[]> = new Map();\n private maxHistoryEntries = 1000;\n private maxCachePerType = 5;\n private prefetchTTL = 5 * 60 * 1000; // 5 minutes\n private predictionThreshold = 0.3;\n private stats: PrefetchingStats = {\n totalPrefetched: 0,\n totalHits: 0,\n totalMisses: 0,\n totalOverwrites: 0,\n hitRatio: 0,\n bandwidthSaved: 0,\n patternsDetected: 0,\n predictionAccuracy: 0,\n };\n private lastPredictionTime = 0;\n private predictionInterval = 30 * 1000;\n\n constructor() {\n logger.debug('[PrefetchingEngine] Initialized', {\n ttl: this.prefetchTTL,\n threshold: this.predictionThreshold,\n });\n }\n\n /**\n * Record operation for pattern analysis\n */\n recordOperation(operationType: string, size: number): void {\n const now = Date.now();\n\n this.operationHistory.push({\n type: operationType,\n timestamp: now,\n size,\n });\n\n if (this.operationHistory.length > this.maxHistoryEntries) {\n this.operationHistory.shift();\n }\n\n // Clean expired prefetches periodically\n if (Math.random() < 0.1) {\n this.cleanExpiredPrefetches();\n }\n\n logger.debug('[PrefetchingEngine] Operation recorded', {\n type: operationType,\n size,\n historySize: this.operationHistory.length,\n });\n }\n\n /**\n * Analyze patterns in operation history\n */\n private analyzePatterns(): void {\n if (this.operationHistory.length < 5) {\n return;\n }\n\n const patterns = new Map<string, OperationPattern>();\n\n // Find 2-3 operation sequences\n for (let length = 2; length <= 3; length++) {\n for (let i = 0; i < this.operationHistory.length - length; i++) {\n const sequence = this.operationHistory\n .slice(i, i + length)\n .map((op) => op.type);\n const key = sequence.join(' → ');\n\n if (!patterns.has(key)) {\n patterns.set(key, {\n sequence,\n frequency: 0,\n probability: 0,\n lastOccurred: 0,\n avgIntervalMs: 0,\n });\n }\n\n const pattern = patterns.get(key)!;\n pattern.frequency++;\n pattern.lastOccurred = Date.now();\n }\n }\n\n // Calculate probabilities\n const totalSequences = this.operationHistory.length;\n\n for (const [key, pattern] of patterns.entries()) {\n pattern.probability = Math.min(1, pattern.frequency / totalSequences);\n }\n\n this.patterns = patterns;\n this.stats.patternsDetected = patterns.size;\n\n logger.debug('[PrefetchingEngine] Patterns analyzed', {\n patternsFound: patterns.size,\n });\n }\n\n /**\n * Predict next operations\n */\n predictNextOperations(recentOperations: Operation[]): OperationPrediction[] {\n const now = Date.now();\n\n if (now - this.lastPredictionTime > this.predictionInterval) {\n this.analyzePatterns();\n this.lastPredictionTime = now;\n }\n\n if (this.patterns.size === 0) {\n return [];\n }\n\n const predictions: OperationPrediction[] = [];\n const recentTypeSequence = recentOperations\n .slice(-3)\n .map((op) => op.type)\n .join(' → ');\n\n for (const [key, pattern] of this.patterns.entries()) {\n if (key.includes(recentTypeSequence) && pattern.sequence.length > 0) {\n const nextType = pattern.sequence[pattern.sequence.length - 1];\n\n const prediction: OperationPrediction = {\n operationType: nextType,\n probability: pattern.probability,\n reason: `Detected pattern: ${key}`,\n shouldPrefetch: pattern.probability > this.predictionThreshold,\n estimatedTimeMs: pattern.avgIntervalMs,\n };\n\n predictions.push(prediction);\n }\n }\n\n // Deduplicate and sort\n const deduped = Array.from(\n new Map(predictions.map((p) => [p.operationType, p])).values()\n ).sort((a, b) => b.probability - a.probability);\n\n logger.debug('[PrefetchingEngine] Predictions', {\n predictions: deduped.slice(0, 3).map((p) => ({\n type: p.operationType,\n probability: (p.probability * 100).toFixed(1) + '%',\n })),\n });\n\n return deduped;\n }\n\n /**\n * Add prefetched batch\n */\n addPrefetchedBatch(\n operationType: string,\n compressed: Uint8Array,\n originalSize: number\n ): PrefetchedBatch {\n if (!this.prefetchCache.has(operationType)) {\n this.prefetchCache.set(operationType, []);\n }\n\n const cache = this.prefetchCache.get(operationType)!;\n\n if (cache.length >= this.maxCachePerType) {\n const oldest = cache.shift()!;\n if (oldest.hitCount === 0) {\n this.stats.totalMisses++;\n } else {\n this.stats.totalOverwrites++;\n }\n }\n\n const batch: PrefetchedBatch = {\n id: `prefetch-${operationType}-${Date.now()}-${Math.random()\n .toString(36)\n .substr(2, 9)}`,\n operationType,\n compressed,\n compressedSize: compressed.length,\n originalSize,\n compressionRatio: 1 - compressed.length / originalSize,\n compressed_at: Date.now(),\n created_at: Date.now(),\n ttl: this.prefetchTTL,\n expiresAt: Date.now() + this.prefetchTTL,\n hitCount: 0,\n missCount: 0,\n };\n\n cache.push(batch);\n this.stats.totalPrefetched++;\n this.stats.bandwidthSaved += originalSize - compressed.length;\n\n logger.debug('[PrefetchingEngine] Prefetched batch added', {\n type: operationType,\n id: batch.id,\n ratio: (batch.compressionRatio * 100).toFixed(1) + '%',\n });\n\n return batch;\n }\n\n /**\n * Try to use prefetched batch\n */\n getPrefetchedBatch(operationType: string): PrefetchedBatch | null {\n const cache = this.prefetchCache.get(operationType);\n if (!cache || cache.length === 0) {\n return null;\n }\n\n const now = Date.now();\n for (let i = 0; i < cache.length; i++) {\n const batch = cache[i];\n\n if (batch.expiresAt > now) {\n batch.hitCount++;\n this.stats.totalHits++;\n this.updatePredictionAccuracy(true);\n\n logger.debug('[PrefetchingEngine] Prefetch hit', {\n type: operationType,\n id: batch.id,\n });\n\n return batch;\n } else {\n cache.splice(i, 1);\n i--;\n batch.missCount++;\n this.stats.totalMisses++;\n this.updatePredictionAccuracy(false);\n }\n }\n\n return null;\n }\n\n /**\n * Update prediction accuracy metric\n */\n private updatePredictionAccuracy(hit: boolean): void {\n const total = this.stats.totalHits + this.stats.totalMisses;\n if (total === 0) return;\n\n this.stats.predictionAccuracy = this.stats.totalHits / total;\n }\n\n /**\n * Clean expired prefetches\n */\n private cleanExpiredPrefetches(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n for (const [type, cache] of this.prefetchCache.entries()) {\n for (let i = cache.length - 1; i >= 0; i--) {\n if (cache[i].expiresAt < now) {\n const batch = cache.splice(i, 1)[0];\n if (batch.hitCount === 0) {\n this.stats.totalMisses++;\n }\n cleanedCount++;\n }\n }\n\n if (cache.length === 0) {\n this.prefetchCache.delete(type);\n }\n }\n\n if (cleanedCount > 0) {\n logger.debug('[PrefetchingEngine] Cleaned expired prefetches', {\n count: cleanedCount,\n });\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): PrefetchingStats {\n const total = this.stats.totalHits + this.stats.totalMisses;\n this.stats.hitRatio = total > 0 ? this.stats.totalHits / total : 0;\n\n return { ...this.stats };\n }\n\n /**\n * Clear all caches\n */\n clear(): void {\n this.operationHistory = [];\n this.patterns.clear();\n this.prefetchCache.clear();\n this.stats = {\n totalPrefetched: 0,\n totalHits: 0,\n totalMisses: 0,\n totalOverwrites: 0,\n hitRatio: 0,\n bandwidthSaved: 0,\n patternsDetected: 0,\n predictionAccuracy: 0,\n };\n logger.debug('[PrefetchingEngine] Cleared all caches');\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet prefetchingEngineInstance: PrefetchingEngine | null = null;\n\nexport function getPrefetchingEngine(): PrefetchingEngine {\n if (!prefetchingEngineInstance) {\n prefetchingEngineInstance = new PrefetchingEngine();\n }\n return prefetchingEngineInstance;\n}\n\nexport function resetPrefetchingEngine(): void {\n prefetchingEngineInstance = null;\n}\n","/**\n * Batch Timing Optimizer (Phase 13)\n *\n * Intelligently schedules batch transmission based on network conditions,\n * device resources, and user activity patterns.\n */\n\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network window quality assessment\n */\nexport interface NetworkWindow {\n startTime: number;\n endTime: number;\n expectedDurationMs: number;\n latencyMs: number;\n bandwidthMbps: number;\n quality: 'excellent' | 'good' | 'fair' | 'poor';\n isStable: boolean;\n congestionLevel: number;\n recommendedBatchSize: number;\n}\n\n/**\n * Activity pattern\n */\nexport interface ActivityPattern {\n type: 'user-active' | 'idle' | 'background' | 'sleep';\n startTime: number;\n duration: number;\n probability: number;\n}\n\n/**\n * Batch scheduling decision\n */\nexport interface SchedulingDecision {\n shouldSendNow: boolean;\n nextOptimalWindowMs: number;\n recommendedDelay: number;\n reason: string;\n priority: 'critical' | 'high' | 'normal' | 'low';\n estimatedDeliveryMs: number;\n}\n\n/**\n * Batch timing statistics\n */\nexport interface BatchTimingStats {\n totalBatches: number;\n immediateDeliveries: number;\n deferredBatches: number;\n averageWaitTimeMs: number;\n averageDeliveryTimeMs: number;\n networkWindowsUsed: number;\n congestionAvoided: number;\n userFocusedOptimizations: number;\n}\n\n// ============================================================================\n// Batch Timing Optimizer\n// ============================================================================\n\nexport class BatchTimingOptimizer {\n private networkHistory: Array<{\n latencyMs: number;\n bandwidthMbps: number;\n timestamp: number;\n quality: 'excellent' | 'good' | 'fair' | 'poor';\n }> = [];\n private activityHistory: ActivityPattern[] = [];\n private stats: BatchTimingStats = {\n totalBatches: 0,\n immediateDeliveries: 0,\n deferredBatches: 0,\n averageWaitTimeMs: 0,\n averageDeliveryTimeMs: 0,\n networkWindowsUsed: 0,\n congestionAvoided: 0,\n userFocusedOptimizations: 0,\n };\n private lastActivityTime = Date.now();\n private isUserActive = true;\n private congestionDetectionWindow = 60 * 1000;\n private optimalBatchSize = 50 * 1024;\n\n constructor() {\n logger.debug('[BatchTimingOptimizer] Initialized', {\n congestionWindow: this.congestionDetectionWindow,\n optimalBatchSize: this.optimalBatchSize,\n });\n }\n\n /**\n * Record network measurement\n */\n recordNetworkMeasurement(latencyMs: number, bandwidthMbps: number): void {\n const quality = this.assessNetworkQuality(latencyMs, bandwidthMbps);\n\n this.networkHistory.push({\n latencyMs,\n bandwidthMbps,\n timestamp: Date.now(),\n quality,\n });\n\n if (this.networkHistory.length > 100) {\n this.networkHistory.shift();\n }\n\n this.stats.networkWindowsUsed++;\n\n logger.debug('[BatchTimingOptimizer] Network measured', {\n latency: latencyMs + 'ms',\n bandwidth: bandwidthMbps.toFixed(1) + ' Mbps',\n quality,\n });\n }\n\n /**\n * Assess network quality\n */\n private assessNetworkQuality(\n latencyMs: number,\n bandwidthMbps: number\n ): 'excellent' | 'good' | 'fair' | 'poor' {\n if (latencyMs < 20 && bandwidthMbps > 10) return 'excellent';\n if (latencyMs < 50 && bandwidthMbps > 5) return 'good';\n if (latencyMs < 100 && bandwidthMbps > 2) return 'fair';\n return 'poor';\n }\n\n /**\n * Detect congestion in network\n */\n private detectCongestion(): number {\n const recentMeasurements = this.networkHistory.filter(\n (m) => Date.now() - m.timestamp < this.congestionDetectionWindow\n );\n\n if (recentMeasurements.length < 3) {\n return 0;\n }\n\n const poorCount = recentMeasurements.filter(\n (m) => m.quality === 'poor'\n ).length;\n\n return poorCount / recentMeasurements.length;\n }\n\n /**\n * Find next optimal network window\n */\n private findOptimalWindow(): NetworkWindow {\n const now = Date.now();\n\n const recentMeasurements = this.networkHistory.slice(-20);\n if (recentMeasurements.length === 0) {\n return {\n startTime: now,\n endTime: now + 1000,\n expectedDurationMs: 1000,\n latencyMs: 50,\n bandwidthMbps: 5,\n quality: 'good',\n isStable: true,\n congestionLevel: 0,\n recommendedBatchSize: this.optimalBatchSize,\n };\n }\n\n const avgLatency =\n recentMeasurements.reduce((sum, m) => sum + m.latencyMs, 0) /\n recentMeasurements.length;\n const avgBandwidth =\n recentMeasurements.reduce((sum, m) => sum + m.bandwidthMbps, 0) /\n recentMeasurements.length;\n\n const latencyVariance =\n Math.sqrt(\n recentMeasurements.reduce(\n (sum, m) => sum + Math.pow(m.latencyMs - avgLatency, 2),\n 0\n ) / recentMeasurements.length\n ) / avgLatency;\n\n const isStable = latencyVariance < 0.2;\n const congestionLevel = this.detectCongestion();\n const quality = this.assessNetworkQuality(avgLatency, avgBandwidth);\n\n const recommendedBatchSize = Math.max(\n 10 * 1024,\n Math.min(500 * 1024, (avgBandwidth * 1024 * 100) / 8)\n );\n\n return {\n startTime: now,\n endTime: now + (isStable ? 30 * 1000 : 10 * 1000),\n expectedDurationMs: isStable ? 30 * 1000 : 10 * 1000,\n latencyMs: avgLatency,\n bandwidthMbps: avgBandwidth,\n quality,\n isStable,\n congestionLevel,\n recommendedBatchSize,\n };\n }\n\n /**\n * Get scheduling decision for a batch\n */\n getSchedulingDecision(\n batchSize: number,\n batchPriority: 'critical' | 'high' | 'normal' | 'low' = 'normal',\n isUserTriggered = false\n ): SchedulingDecision {\n const now = Date.now();\n const currentWindow = this.findOptimalWindow();\n const congestionLevel = this.detectCongestion();\n\n let shouldSendNow = false;\n let recommendedDelay = 0;\n let reason = '';\n let priority = batchPriority;\n\n if (priority === 'critical') {\n shouldSendNow = true;\n reason = 'Critical operation (bypass optimization)';\n } else if (isUserTriggered && this.isUserActive) {\n shouldSendNow = true;\n reason = 'User-triggered operation';\n priority = 'high';\n } else if (\n currentWindow.quality === 'excellent' ||\n currentWindow.quality === 'good'\n ) {\n if (congestionLevel < 0.3) {\n shouldSendNow = true;\n reason = 'Good network conditions';\n } else {\n shouldSendNow = true;\n reason = 'Good network despite some congestion';\n recommendedDelay = 1000 + Math.random() * 2000;\n }\n } else if (currentWindow.quality === 'fair') {\n if (priority === 'high') {\n shouldSendNow = true;\n reason = 'High priority despite fair network';\n } else {\n shouldSendNow = false;\n reason = 'Fair network: waiting for better window';\n recommendedDelay = 30 * 1000 + Math.random() * 30 * 1000;\n }\n } else {\n shouldSendNow = false;\n reason = 'Poor network conditions: deferring';\n if (priority === 'high') {\n recommendedDelay = 60 * 1000 + Math.random() * 30 * 1000;\n } else {\n recommendedDelay = 120 * 1000 + Math.random() * 60 * 1000;\n }\n }\n\n const estimatedDeliveryMs =\n (batchSize / ((currentWindow.bandwidthMbps * 1024 * 1024) / 8)) * 1000 +\n currentWindow.latencyMs +\n recommendedDelay;\n\n const decision: SchedulingDecision = {\n shouldSendNow,\n nextOptimalWindowMs: now + recommendedDelay,\n recommendedDelay,\n reason,\n priority,\n estimatedDeliveryMs,\n };\n\n logger.debug('[BatchTimingOptimizer] Scheduling decision', {\n size: (batchSize / 1024).toFixed(1) + ' KB',\n shouldSendNow,\n delay: recommendedDelay + 'ms',\n reason,\n });\n\n return decision;\n }\n\n /**\n * Apply scheduling and update stats\n */\n applyScheduling(\n batchSize: number,\n sendNow: boolean,\n actualDelay: number\n ): void {\n this.stats.totalBatches++;\n\n if (sendNow) {\n this.stats.immediateDeliveries++;\n } else {\n this.stats.deferredBatches++;\n }\n\n const totalWait =\n this.stats.averageWaitTimeMs * (this.stats.totalBatches - 1) +\n actualDelay;\n this.stats.averageWaitTimeMs = totalWait / this.stats.totalBatches;\n\n if (this.detectCongestion() > 0.3 && !sendNow) {\n this.stats.congestionAvoided++;\n }\n\n if (this.isUserActive) {\n this.stats.userFocusedOptimizations++;\n }\n\n this.stats.networkWindowsUsed++;\n }\n\n /**\n * Get optimal batch size recommendation\n */\n getOptimalBatchSize(): number {\n const window = this.findOptimalWindow();\n return window.recommendedBatchSize;\n }\n\n /**\n * Get current network window\n */\n getCurrentNetworkWindow(): NetworkWindow {\n return this.findOptimalWindow();\n }\n\n /**\n * Set user activity state\n */\n setUserActive(active: boolean): void {\n this.isUserActive = active;\n if (active) {\n this.lastActivityTime = Date.now();\n }\n }\n\n /**\n * Get statistics\n */\n getStats(): BatchTimingStats {\n return { ...this.stats };\n }\n\n /**\n * Clear history\n */\n clear(): void {\n this.networkHistory = [];\n this.activityHistory = [];\n this.stats = {\n totalBatches: 0,\n immediateDeliveries: 0,\n deferredBatches: 0,\n averageWaitTimeMs: 0,\n averageDeliveryTimeMs: 0,\n networkWindowsUsed: 0,\n congestionAvoided: 0,\n userFocusedOptimizations: 0,\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet batchTimingOptimizerInstance: BatchTimingOptimizer | null = null;\n\nexport function getBatchTimingOptimizer(): BatchTimingOptimizer {\n if (!batchTimingOptimizerInstance) {\n batchTimingOptimizerInstance = new BatchTimingOptimizer();\n }\n return batchTimingOptimizerInstance;\n}\n\nexport function resetBatchTimingOptimizer(): void {\n batchTimingOptimizerInstance = null;\n}\n","/**\n * Adaptive Compression Optimizer (Phase 13)\n *\n * Automatically adjusts compression level based on network conditions,\n * device capabilities, and real-time performance metrics.\n */\n\nimport { getLogger } from '../utils/logger';\nimport type { CompressionStats } from '../compression/CompressionEngine';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Network conditions affecting compression\n */\nexport interface NetworkProfile {\n estimatedSpeedKbps: number;\n latencyMs: number;\n isOnline: boolean;\n isWifi: boolean;\n isFast: boolean;\n isSlow: boolean;\n isEmpty: boolean;\n}\n\n/**\n * Device capabilities for compression\n */\nexport interface DeviceProfile {\n cpuCores: number;\n cpuUtilization: number;\n memoryAvailableMB: number;\n memoryTotalMB: number;\n isConstrained: boolean;\n isPremium: boolean;\n supportsWebWorkers: boolean;\n supportsWebAssembly: boolean;\n}\n\n/**\n * Compression recommendation based on conditions\n */\nexport interface CompressionRecommendation {\n recommendedLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n reason: string;\n confidence: number;\n estimatedCompressionMs: number;\n estimatedRatio: number;\n networkFactor: number;\n deviceFactor: number;\n}\n\n/**\n * Adaptive compression statistics\n */\nexport interface AdaptiveStats {\n currentLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n averageCompressionMs: number;\n averageRatio: number;\n levelsUsed: Set<number>;\n adjustmentCount: number;\n totalBatches: number;\n networkCondition: 'fast' | 'normal' | 'slow' | 'offline';\n}\n\n// ============================================================================\n// Adaptive Compression Optimizer\n// ============================================================================\n\nexport class AdaptiveCompressionOptimizer {\n private currentLevel: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 = 6;\n private networkProfile: NetworkProfile = {\n estimatedSpeedKbps: 5000,\n latencyMs: 50,\n isOnline: true,\n isWifi: false,\n isFast: true,\n isSlow: false,\n isEmpty: false,\n };\n private deviceProfile: DeviceProfile = {\n cpuCores: 4,\n cpuUtilization: 0.3,\n memoryAvailableMB: 512,\n memoryTotalMB: 1024,\n isConstrained: false,\n isPremium: false,\n supportsWebWorkers: true,\n supportsWebAssembly: true,\n };\n private compressionHistory: Array<{\n level: number;\n ratio: number;\n timeMs: number;\n timestamp: number;\n }> = [];\n private stats: AdaptiveStats = {\n currentLevel: 6,\n averageCompressionMs: 10,\n averageRatio: 0.85,\n levelsUsed: new Set([6]),\n adjustmentCount: 0,\n totalBatches: 0,\n networkCondition: 'normal',\n };\n\n constructor() {\n logger.debug('[AdaptiveCompressionOptimizer] Initialized', {\n level: this.currentLevel,\n });\n }\n\n /**\n * Update network conditions\n */\n updateNetworkConditions(\n speedKbps: number,\n latencyMs?: number,\n isOnline?: boolean\n ): void {\n this.networkProfile.estimatedSpeedKbps = speedKbps;\n if (latencyMs !== undefined) {\n this.networkProfile.latencyMs = latencyMs;\n }\n if (isOnline !== undefined) {\n this.networkProfile.isOnline = isOnline;\n }\n\n this.networkProfile.isFast = speedKbps > 5000;\n this.networkProfile.isSlow = speedKbps < 1000;\n this.networkProfile.isEmpty = speedKbps < 100;\n\n if (isOnline === false) {\n this.stats.networkCondition = 'offline';\n } else if (this.networkProfile.isSlow) {\n this.stats.networkCondition = 'slow';\n } else if (this.networkProfile.isFast) {\n this.stats.networkCondition = 'fast';\n } else {\n this.stats.networkCondition = 'normal';\n }\n\n logger.debug('[AdaptiveCompressionOptimizer] Network updated', {\n speedKbps,\n condition: this.stats.networkCondition,\n });\n }\n\n /**\n * Update device resource usage\n */\n updateDeviceResources(\n cpuUtilization: number,\n memoryAvailableMB: number\n ): void {\n this.deviceProfile.cpuUtilization = Math.max(\n 0,\n Math.min(1, cpuUtilization)\n );\n this.deviceProfile.memoryAvailableMB = memoryAvailableMB;\n this.deviceProfile.isConstrained = memoryAvailableMB < 512;\n this.deviceProfile.isPremium = memoryAvailableMB > 2048;\n\n logger.debug('[AdaptiveCompressionOptimizer] Device resources updated', {\n cpuUtilization: (cpuUtilization * 100).toFixed(1) + '%',\n memoryAvailableMB,\n });\n }\n\n /**\n * Record compression performance\n */\n recordCompressionPerformance(\n level: number,\n compressionMs: number,\n ratio: number\n ): void {\n this.compressionHistory.push({\n level,\n ratio,\n timeMs: compressionMs,\n timestamp: Date.now(),\n });\n\n if (this.compressionHistory.length > 100) {\n this.compressionHistory.shift();\n }\n\n this.stats.totalBatches++;\n const historyLength = this.compressionHistory.length;\n if (historyLength > 0) {\n this.stats.averageCompressionMs =\n this.compressionHistory.reduce((sum, h) => sum + h.timeMs, 0) /\n historyLength;\n this.stats.averageRatio =\n this.compressionHistory.reduce((sum, h) => sum + h.ratio, 0) /\n historyLength;\n }\n }\n\n /**\n * Get compression recommendation based on conditions\n */\n getRecommendedLevel(): CompressionRecommendation {\n const networkFactor = this.calculateNetworkFactor();\n const deviceFactor = this.calculateDeviceFactor();\n const combinedFactor = (networkFactor + deviceFactor) / 2;\n\n const recommendedLevel = Math.max(\n 1,\n Math.min(9, Math.round(combinedFactor * 9))\n ) as 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;\n\n const estimatedCompressionMs =\n this.estimateCompressionTime(recommendedLevel);\n const estimatedRatio = this.estimateCompressionRatio(recommendedLevel);\n\n let reason = '';\n if (networkFactor < 0.3 && deviceFactor < 0.3) {\n reason = 'Slow network + constrained device: using level 1-2 (fast)';\n } else if (networkFactor > 0.7 && deviceFactor > 0.7) {\n reason =\n 'Fast network + premium device: using level 8-9 (best compression)';\n } else if (networkFactor > 0.7) {\n reason = 'Fast network: prioritizing compression ratio';\n } else if (deviceFactor < 0.3) {\n reason = 'Constrained device: prioritizing speed';\n } else {\n reason = 'Normal conditions: balanced compression level';\n }\n\n const recommendation: CompressionRecommendation = {\n recommendedLevel,\n reason,\n confidence: this.compressionHistory.length > 10 ? 0.9 : 0.5,\n estimatedCompressionMs,\n estimatedRatio,\n networkFactor,\n deviceFactor,\n };\n\n logger.debug(\n '[AdaptiveCompressionOptimizer] Recommendation',\n recommendation\n );\n\n return recommendation;\n }\n\n /**\n * Calculate network factor (0-1)\n */\n private calculateNetworkFactor(): number {\n if (!this.networkProfile.isOnline) return 0;\n\n const speedMbps = this.networkProfile.estimatedSpeedKbps / 1000;\n\n if (speedMbps < 0.1) return 0;\n if (speedMbps < 1) return 0.1 + (speedMbps / 1) * 0.2;\n if (speedMbps < 5) return 0.3 + ((speedMbps - 1) / 4) * 0.3;\n if (speedMbps < 20) return 0.6 + ((speedMbps - 5) / 15) * 0.3;\n return Math.min(1, 0.9 + (speedMbps - 20) / 200);\n }\n\n /**\n * Calculate device factor (0-1)\n */\n private calculateDeviceFactor(): number {\n let factor = 0.5;\n\n if (this.deviceProfile.isPremium) {\n factor = 0.8;\n } else if (this.deviceProfile.isConstrained) {\n factor = 0.2;\n }\n\n if (this.deviceProfile.cpuUtilization > 0.8) {\n factor *= 0.7;\n } else if (this.deviceProfile.cpuUtilization < 0.2) {\n factor *= 1.1;\n }\n\n if (this.deviceProfile.supportsWebAssembly) {\n factor = Math.min(1, factor + 0.1);\n }\n\n return Math.max(0, Math.min(1, factor));\n }\n\n /**\n * Estimate compression time for a level (in ms)\n */\n private estimateCompressionTime(level: number): number {\n return Math.max(1, level * 2.5);\n }\n\n /**\n * Estimate compression ratio for a level\n */\n private estimateCompressionRatio(level: number): number {\n return 0.6 + (level / 9) * 0.3;\n }\n\n /**\n * Apply recommendation and get new level\n */\n applyRecommendation(): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 {\n const recommendation = this.getRecommendedLevel();\n const oldLevel = this.currentLevel;\n\n const shouldChange =\n recommendation.confidence > 0.7 ||\n Math.abs(recommendation.recommendedLevel - oldLevel) > 2;\n\n if (shouldChange) {\n this.currentLevel = recommendation.recommendedLevel;\n this.stats.levelsUsed.add(this.currentLevel);\n\n if (oldLevel !== this.currentLevel) {\n this.stats.adjustmentCount++;\n logger.debug('[AdaptiveCompressionOptimizer] Level adjusted', {\n from: oldLevel,\n to: this.currentLevel,\n reason: recommendation.reason,\n });\n }\n }\n\n this.stats.currentLevel = this.currentLevel;\n return this.currentLevel;\n }\n\n /**\n * Get current level\n */\n getCurrentLevel(): 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 {\n return this.currentLevel;\n }\n\n /**\n * Get statistics\n */\n getStats(): AdaptiveStats {\n return { ...this.stats };\n }\n\n /**\n * Get detailed analysis\n */\n getDetailedAnalysis() {\n return {\n stats: this.stats,\n network: this.networkProfile,\n device: this.deviceProfile,\n recommendation: this.getRecommendedLevel(),\n history: this.compressionHistory.slice(-20),\n };\n }\n}\n\n// ============================================================================\n// Singleton Instance\n// ============================================================================\n\nlet adaptiveOptimizerInstance: AdaptiveCompressionOptimizer | null = null;\n\nexport function getAdaptiveCompressionOptimizer(): AdaptiveCompressionOptimizer {\n if (!adaptiveOptimizerInstance) {\n adaptiveOptimizerInstance = new AdaptiveCompressionOptimizer();\n }\n return adaptiveOptimizerInstance;\n}\n\nexport function resetAdaptiveCompressionOptimizer(): void {\n adaptiveOptimizerInstance = null;\n}\n","/**\n * Agent Presence Manager (Phase 14)\n *\n * Tracks real-time presence of all agents in a session.\n * Provides status updates, cursor tracking, and activity monitoring.\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { getLogger } from '../utils/logger';\n\nconst logger = getLogger();\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AgentPresence {\n agentId: string;\n name: string;\n role: 'user' | 'assistant' | 'monitor' | 'admin';\n status: 'online' | 'away' | 'offline' | 'reconnecting';\n joinedAt: string;\n lastSeen: string;\n cursorPosition?: { x: number; y: number; path?: string };\n activeSection?: string;\n focusNode?: string;\n selectionRange?: AgentSelectionRange;\n typingState?: AgentTypingState;\n scrollState?: AgentScrollState;\n viewport?: AgentViewportState;\n inputState?: AgentInputState;\n emotionState?: AgentEmotionState;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AgentSelectionRange {\n start: number;\n end: number;\n direction?: 'forward' | 'backward' | 'none';\n path?: string;\n}\n\nexport interface AgentTypingState {\n isTyping: boolean;\n field?: string;\n isComposing?: boolean;\n startedAt?: string;\n stoppedAt?: string;\n}\n\nexport interface AgentScrollState {\n depth: number;\n y?: number;\n viewportHeight?: number;\n documentHeight?: number;\n path?: string;\n}\n\nexport interface AgentViewportState {\n width: number;\n height: number;\n}\n\nexport interface AgentInputState {\n field: string;\n hasFocus: boolean;\n valueLength?: number;\n selectionStart?: number;\n selectionEnd?: number;\n isComposing?: boolean;\n inputMode?: string;\n}\n\nexport interface AgentEmotionState {\n primary?: string;\n secondary?: string;\n confidence?: number;\n intensity?: number;\n valence?: number;\n arousal?: number;\n dominance?: number;\n source?: 'self-report' | 'inferred' | 'sensor' | 'hybrid';\n updatedAt?: string;\n}\n\nexport interface PresenceUpdate {\n agentId: string;\n changes: Partial<AgentPresence>;\n timestamp: string;\n}\n\nexport interface PresenceEvents {\n presence_updated: (data: {\n agentId: string;\n presence: AgentPresence;\n }) => void;\n agent_joined: (data: { agentId: string; presence: AgentPresence }) => void;\n agent_left: (data: { agentId: string; presence: AgentPresence }) => void;\n cursor_updated: (data: {\n agentId: string;\n cursorPosition: { x: number; y: number; path?: string };\n }) => void;\n section_updated: (data: { agentId: string; activeSection: string }) => void;\n focus_updated: (data: { agentId: string; focusNode: string }) => void;\n selection_updated: (data: {\n agentId: string;\n selectionRange: AgentSelectionRange;\n }) => void;\n typing_updated: (data: {\n agentId: string;\n typingState: AgentTypingState;\n }) => void;\n scroll_updated: (data: {\n agentId: string;\n scrollState: AgentScrollState;\n }) => void;\n viewport_updated: (data: {\n agentId: string;\n viewport: AgentViewportState;\n }) => void;\n input_state_updated: (data: {\n agentId: string;\n inputState?: AgentInputState;\n }) => void;\n emotion_updated: (data: {\n agentId: string;\n emotionState?: AgentEmotionState;\n }) => void;\n status_updated: (data: {\n agentId: string;\n status: AgentPresence['status'];\n }) => void;\n}\n\n// ============================================================================\n// Agent Presence Manager\n// ============================================================================\n\nexport class AgentPresenceManager extends EventEmitter<PresenceEvents> {\n private presences: Map<string, AgentPresence> = new Map();\n private sessionId: string;\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null;\n private heartbeatTimeout = 30000;\n private inactivityThreshold = 60000;\n\n constructor(sessionId: string) {\n super();\n this.sessionId = sessionId;\n this.startHeartbeatCheck();\n logger.debug('[AgentPresenceManager] Initialized', { sessionId });\n }\n\n /**\n * Add or update agent presence\n */\n updatePresence(\n agentId: string,\n presence: Omit<AgentPresence, 'joinedAt' | 'lastSeen'>\n ): void {\n const existing = this.presences.get(agentId);\n const now = new Date().toISOString();\n\n const updated: AgentPresence = {\n ...existing,\n ...presence,\n agentId,\n joinedAt: existing?.joinedAt ?? now,\n lastSeen: now,\n };\n\n this.presences.set(agentId, updated);\n\n this.emit('presence_updated', {\n agentId,\n presence: updated,\n });\n }\n\n /**\n * Agent joined\n */\n agentJoined(\n agentId: string,\n name: string,\n role: AgentPresence['role'] = 'user',\n metadata?: Record<string, unknown>\n ): void {\n const now = new Date().toISOString();\n\n const presence: AgentPresence = {\n agentId,\n name,\n role,\n status: 'online',\n joinedAt: now,\n lastSeen: now,\n metadata,\n };\n\n this.presences.set(agentId, presence);\n this.emit('agent_joined', { agentId, presence });\n\n logger.debug('[AgentPresenceManager] Agent joined', {\n agentId,\n name,\n role,\n });\n }\n\n /**\n * Agent left\n */\n agentLeft(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.status = 'offline';\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('agent_left', { agentId, presence });\n\n logger.debug('[AgentPresenceManager] Agent left', { agentId });\n }\n }\n\n /**\n * Update cursor position\n */\n updateCursor(agentId: string, x: number, y: number, path?: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.cursorPosition = { x, y, path };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('cursor_updated', {\n agentId,\n cursorPosition: presence.cursorPosition,\n });\n }\n }\n\n /**\n * Update active section\n */\n updateActiveSection(agentId: string, section: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.activeSection = section;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('section_updated', {\n agentId,\n activeSection: section,\n });\n }\n }\n\n /**\n * Update focused node path\n */\n updateFocusNode(agentId: string, nodePath: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.focusNode = nodePath;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('focus_updated', {\n agentId,\n focusNode: nodePath,\n });\n }\n }\n\n /**\n * Update text selection range\n */\n updateSelection(agentId: string, selectionRange: AgentSelectionRange): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.selectionRange = selectionRange;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('selection_updated', {\n agentId,\n selectionRange,\n });\n }\n }\n\n /**\n * Update typing state\n */\n updateTyping(\n agentId: string,\n isTyping: boolean,\n field?: string,\n isComposing = false\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const now = new Date().toISOString();\n const previous = presence.typingState;\n const typingState: AgentTypingState = {\n isTyping,\n field,\n isComposing,\n startedAt:\n isTyping && !previous?.isTyping\n ? now\n : isTyping\n ? previous?.startedAt\n : undefined,\n stoppedAt: isTyping ? undefined : now,\n };\n\n presence.typingState = typingState;\n presence.lastSeen = now;\n\n this.presences.set(agentId, presence);\n this.emit('typing_updated', {\n agentId,\n typingState,\n });\n }\n }\n\n /**\n * Update scroll state\n */\n updateScroll(agentId: string, scrollState: AgentScrollState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.scrollState = {\n ...scrollState,\n depth: Math.max(0, Math.min(1, scrollState.depth)),\n };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('scroll_updated', {\n agentId,\n scrollState: presence.scrollState,\n });\n }\n }\n\n /**\n * Update viewport size\n */\n updateViewport(agentId: string, width: number, height: number): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.viewport = { width, height };\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('viewport_updated', {\n agentId,\n viewport: presence.viewport,\n });\n }\n }\n\n /**\n * Update input state\n */\n updateInputState(agentId: string, inputState: AgentInputState): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = inputState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState,\n });\n }\n }\n\n /**\n * Clear input state\n */\n clearInputState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.inputState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('input_state_updated', {\n agentId,\n inputState: undefined,\n });\n }\n }\n\n /**\n * Update emotional state\n */\n updateEmotionState(\n agentId: string,\n emotionState: Omit<AgentEmotionState, 'updatedAt'>\n ): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n const enrichedState: AgentEmotionState = {\n ...emotionState,\n updatedAt: new Date().toISOString(),\n };\n presence.emotionState = enrichedState;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: enrichedState,\n });\n }\n }\n\n /**\n * Clear emotional state\n */\n clearEmotionState(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.emotionState = undefined;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('emotion_updated', {\n agentId,\n emotionState: undefined,\n });\n }\n }\n\n /**\n * Update status\n */\n updateStatus(agentId: string, status: AgentPresence['status']): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n presence.status = status;\n presence.lastSeen = new Date().toISOString();\n\n this.presences.set(agentId, presence);\n this.emit('status_updated', { agentId, status });\n }\n }\n\n /**\n * Heartbeat from agent (keeps them online)\n */\n heartbeat(agentId: string): void {\n const presence = this.presences.get(agentId);\n\n if (presence) {\n if (presence.status === 'reconnecting') {\n presence.status = 'online';\n this.emit('status_updated', { agentId, status: 'online' });\n }\n\n presence.lastSeen = new Date().toISOString();\n this.presences.set(agentId, presence);\n }\n }\n\n /**\n * Get presence for agent\n */\n getPresence(agentId: string): AgentPresence | undefined {\n return this.presences.get(agentId);\n }\n\n /**\n * Get all online agents\n */\n getOnlineAgents(): AgentPresence[] {\n return Array.from(this.presences.values()).filter(\n (p) => p.status === 'online'\n );\n }\n\n /**\n * Get all agents\n */\n getAllAgents(): AgentPresence[] {\n return Array.from(this.presences.values());\n }\n\n /**\n * Get all presences\n */\n getAllPresences(): AgentPresence[] {\n return Array.from(this.presences.values());\n }\n\n /**\n * Get agent count\n */\n getAgentCount(): Record<AgentPresence['status'], number> {\n const counts = {\n online: 0,\n away: 0,\n offline: 0,\n reconnecting: 0,\n };\n\n this.presences.forEach((p) => {\n counts[p.status]++;\n });\n\n return counts;\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n totalAgents: this.presences.size,\n onlineAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'online'\n ).length,\n offlineAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'offline'\n ).length,\n awayAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'away'\n ).length,\n reconnectingAgents: Array.from(this.presences.values()).filter(\n (p) => p.status === 'reconnecting'\n ).length,\n };\n }\n\n /**\n * Clear expired presences\n */\n clearExpiredPresences(maxAgeMs: number): void {\n const now = Date.now();\n const toRemove: string[] = [];\n\n this.presences.forEach((presence, agentId) => {\n const lastSeenTime = new Date(presence.lastSeen).getTime();\n const ageMs = now - lastSeenTime;\n\n if (ageMs > maxAgeMs && presence.status === 'offline') {\n toRemove.push(agentId);\n }\n });\n\n toRemove.forEach((agentId) => {\n this.presences.delete(agentId);\n });\n\n if (toRemove.length > 0) {\n logger.debug('[AgentPresenceManager] Cleared expired presences', {\n count: toRemove.length,\n });\n }\n }\n\n /**\n * Get agents by role\n */\n getByRole(role: AgentPresence['role']): AgentPresence[] {\n return Array.from(this.presences.values()).filter((p) => p.role === role);\n }\n\n /**\n * Get agents in active section\n */\n getInSection(section: string): AgentPresence[] {\n return Array.from(this.presences.values()).filter(\n (p) => p.activeSection === section && p.status === 'online'\n );\n }\n\n /**\n * Get presence timeline\n */\n getPresenceStats() {\n const stats = {\n total: this.presences.size,\n online: 0,\n away: 0,\n offline: 0,\n reconnecting: 0,\n byRole: {} as Record<string, number>,\n };\n\n this.presences.forEach((p) => {\n stats[p.status]++;\n stats.byRole[p.role] = (stats.byRole[p.role] ?? 0) + 1;\n });\n\n return stats;\n }\n\n /**\n * Start heartbeat check (mark inactive agents as away)\n */\n private startHeartbeatCheck(): void {\n this.heartbeatInterval = setInterval(() => {\n const now = Date.now();\n\n this.presences.forEach((presence) => {\n const lastSeenTime = new Date(presence.lastSeen).getTime();\n const timeSinceLastSeen = now - lastSeenTime;\n\n if (\n timeSinceLastSeen > this.inactivityThreshold &&\n presence.status === 'online'\n ) {\n presence.status = 'away';\n this.emit('status_updated', {\n agentId: presence.agentId,\n status: 'away',\n });\n }\n\n if (\n timeSinceLastSeen > this.heartbeatTimeout &&\n presence.status !== 'offline'\n ) {\n presence.status = 'reconnecting';\n this.emit('status_updated', {\n agentId: presence.agentId,\n status: 'reconnecting',\n });\n }\n });\n }, 10000);\n }\n\n /**\n * Stop heartbeat monitoring\n */\n stopHeartbeatMonitoring(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Clear all presences\n */\n clear(): void {\n this.presences.clear();\n }\n\n /**\n * Destroy the manager\n */\n destroy(): void {\n this.stopHeartbeatMonitoring();\n this.presences.clear();\n this.removeAllListeners();\n logger.debug('[AgentPresenceManager] Destroyed', {\n sessionId: this.sessionId,\n });\n }\n}\n\n// ============================================================================\n// Singleton Instance Map\n// ============================================================================\n\nconst instances = new Map<string, AgentPresenceManager>();\n\nexport function getAgentPresenceManager(\n sessionId: string\n): AgentPresenceManager {\n if (!instances.has(sessionId)) {\n instances.set(sessionId, new AgentPresenceManager(sessionId));\n }\n return instances.get(sessionId)!;\n}\n\nexport function clearAgentPresenceManager(sessionId: string): void {\n const instance = instances.get(sessionId);\n if (instance) {\n instance.destroy();\n instances.delete(sessionId);\n }\n}\n","/**\n * Aeon Crypto Types\n *\n * Type definitions for cryptographic operations in Aeon.\n * These are compatible with @affectively/auth and @affectively/auth.\n */\n\n// =============================================================================\n// IDENTITY TYPES (compatible with @affectively/auth)\n// =============================================================================\n\n/**\n * Decentralized Identifier (DID)\n * Format: did:method:identifier\n */\nexport type DID = `did:${string}:${string}`;\n\n/**\n * Supported signing algorithms\n */\nexport type SigningAlgorithm = 'ES256' | 'Ed25519' | 'ES384' | 'ES512';\n\n/**\n * Key pair for signing and verification\n */\nexport interface KeyPair {\n algorithm: SigningAlgorithm;\n publicKey: JsonWebKey;\n privateKey?: JsonWebKey;\n fingerprint: string;\n}\n\n/**\n * Identity representing a user or node\n */\nexport interface Identity {\n did: DID;\n signingKey: KeyPair;\n encryptionKey?: KeyPair;\n createdAt: number;\n displayName?: string;\n}\n\n/**\n * UCAN Capability structure\n */\nexport interface Capability {\n can: string;\n with: string;\n constraints?: Record<string, unknown>;\n}\n\n/**\n * UCAN Token payload\n */\nexport interface UCANPayload {\n iss: DID;\n aud: DID;\n exp: number;\n nbf?: number;\n iat?: number;\n nonce?: string;\n jti?: string;\n att: Capability[];\n prf?: string[];\n fct?: Record<string, unknown>;\n}\n\n/**\n * Parsed UCAN Token\n */\nexport interface UCANToken {\n payload: UCANPayload;\n raw: string;\n signature: Uint8Array;\n algorithm: string;\n}\n\n/**\n * UCAN verification result\n */\nexport interface VerificationResult {\n valid: boolean;\n payload?: UCANPayload;\n error?: string;\n expired?: boolean;\n shouldRotate?: boolean;\n expiresIn?: number;\n}\n\n// =============================================================================\n// ENCRYPTION TYPES (compatible with @affectively/auth)\n// =============================================================================\n\n/**\n * Encryption algorithms supported\n */\nexport type EncryptionAlgorithm = 'ECIES-P256' | 'AES-256-GCM';\n\n/**\n * HKDF domain separator categories\n */\nexport type DomainCategory =\n | 'default'\n | 'sync'\n | 'message'\n | 'api-key'\n | 'personal-data'\n | string;\n\n/**\n * EC Key pair for ECDH operations\n */\nexport interface ECKeyPair {\n publicKey: JsonWebKey;\n privateKey: JsonWebKey;\n keyId: string;\n createdAt: string;\n}\n\n/**\n * Encrypted data envelope\n */\nexport interface EncryptedPayload {\n alg: EncryptionAlgorithm;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n category?: DomainCategory;\n nonce?: string;\n encryptedAt: number;\n}\n\n/**\n * Decryption result\n */\nexport interface DecryptionResult {\n plaintext: Uint8Array;\n category?: DomainCategory;\n encryptedAt: number;\n}\n\n// =============================================================================\n// AEON-SPECIFIC TYPES\n// =============================================================================\n\n/**\n * Aeon encryption mode\n */\nexport type AeonEncryptionMode =\n | 'none' // No encryption (development/testing)\n | 'transport' // Encrypt in transit only (session keys)\n | 'at-rest' // Encrypt for storage\n | 'end-to-end'; // Full E2E encryption between nodes\n\n/**\n * Aeon sync capability namespace\n */\nexport const AEON_CAPABILITIES = {\n // Basic sync operations\n SYNC_READ: 'aeon:sync:read',\n SYNC_WRITE: 'aeon:sync:write',\n SYNC_ADMIN: 'aeon:sync:admin',\n\n // Node operations\n NODE_REGISTER: 'aeon:node:register',\n NODE_HEARTBEAT: 'aeon:node:heartbeat',\n\n // Replication operations\n REPLICATE_READ: 'aeon:replicate:read',\n REPLICATE_WRITE: 'aeon:replicate:write',\n\n // State operations\n STATE_READ: 'aeon:state:read',\n STATE_WRITE: 'aeon:state:write',\n STATE_RECONCILE: 'aeon:state:reconcile',\n} as const;\n\nexport type AeonCapability =\n (typeof AEON_CAPABILITIES)[keyof typeof AEON_CAPABILITIES];\n\n/**\n * Crypto configuration for Aeon\n */\nexport interface AeonCryptoConfig {\n /** Default encryption mode for sync messages */\n defaultEncryptionMode: AeonEncryptionMode;\n /** Require all messages to be signed */\n requireSignatures: boolean;\n /** Require UCAN capability verification */\n requireCapabilities: boolean;\n /** Allowed signature algorithms */\n allowedSignatureAlgorithms: string[];\n /** Allowed encryption algorithms */\n allowedEncryptionAlgorithms: string[];\n /** UCAN audience DID for verification */\n ucanAudience?: string;\n /** Session key expiration (ms) */\n sessionKeyExpiration?: number;\n}\n\n/**\n * Default crypto configuration\n */\nexport const DEFAULT_CRYPTO_CONFIG: AeonCryptoConfig = {\n defaultEncryptionMode: 'none',\n requireSignatures: false,\n requireCapabilities: false,\n allowedSignatureAlgorithms: ['ES256', 'Ed25519'],\n allowedEncryptionAlgorithms: ['ECIES-P256', 'AES-256-GCM'],\n sessionKeyExpiration: 24 * 60 * 60 * 1000, // 24 hours\n};\n\n/**\n * Authenticated sync message fields\n */\nexport interface AuthenticatedMessageFields {\n /** Sender DID */\n senderDID?: string;\n /** Receiver DID */\n receiverDID?: string;\n /** UCAN token for capability verification */\n ucan?: string;\n /** Message signature (base64url) */\n signature?: string;\n /** Whether payload is encrypted */\n encrypted?: boolean;\n}\n\n/**\n * Secure sync session\n */\nexport interface SecureSyncSession {\n id: string;\n initiator: string;\n participants: string[];\n sessionKey?: Uint8Array;\n encryptionMode: AeonEncryptionMode;\n requiredCapabilities: string[];\n status: 'pending' | 'active' | 'completed' | 'failed';\n startTime: string;\n endTime?: string;\n}\n\n/**\n * Node with identity information\n */\nexport interface SecureNodeInfo {\n id: string;\n did?: string;\n publicSigningKey?: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n capabilities?: string[];\n lastSeen?: number;\n}\n\n/**\n * Capability verification result\n */\nexport interface AeonCapabilityResult {\n authorized: boolean;\n error?: string;\n issuer?: string;\n grantedCapabilities?: Array<{ can: string; with: string }>;\n}\n\n/**\n * Signed data envelope for sync operations\n */\nexport interface SignedSyncData<T = unknown> {\n payload: T;\n signature: string;\n signer: string;\n algorithm: string;\n signedAt: number;\n}\n","/**\n * Aeon Crypto Provider Interface\n *\n * Abstract interface for cryptographic operations.\n * Aeon core remains zero-dependency - crypto is injected through this interface.\n */\n\nimport type {\n AeonCapabilityResult,\n SignedSyncData,\n SecureNodeInfo,\n} from './types';\n\n/**\n * Abstract crypto provider interface\n *\n * Implementations use @affectively/auth and @affectively/auth\n * or other compatible libraries.\n */\nexport interface ICryptoProvider {\n // ===========================================================================\n // IDENTITY OPERATIONS\n // ===========================================================================\n\n /**\n * Generate a new identity with DID and key pairs\n */\n generateIdentity(displayName?: string): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }>;\n\n /**\n * Get the local identity's DID\n */\n getLocalDID(): string | null;\n\n /**\n * Export local identity's public info for sharing\n */\n exportPublicIdentity(): Promise<SecureNodeInfo | null>;\n\n /**\n * Register a known remote node's public keys\n */\n registerRemoteNode(node: SecureNodeInfo): Promise<void>;\n\n /**\n * Get a remote node's public key\n */\n getRemotePublicKey(did: string): Promise<JsonWebKey | null>;\n\n // ===========================================================================\n // SIGNING OPERATIONS\n // ===========================================================================\n\n /**\n * Sign data with local identity's private key\n */\n sign(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Sign structured data and wrap in SignedSyncData envelope\n */\n signData<T>(data: T): Promise<SignedSyncData<T>>;\n\n /**\n * Verify a signature from a remote node\n */\n verify(\n did: string,\n signature: Uint8Array,\n data: Uint8Array\n ): Promise<boolean>;\n\n /**\n * Verify a SignedSyncData envelope\n */\n verifySignedData<T>(signedData: SignedSyncData<T>): Promise<boolean>;\n\n // ===========================================================================\n // ENCRYPTION OPERATIONS\n // ===========================================================================\n\n /**\n * Encrypt data for a recipient\n */\n encrypt(\n plaintext: Uint8Array,\n recipientDID: string\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt data\n */\n decrypt(\n encrypted: {\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n },\n senderDID?: string\n ): Promise<Uint8Array>;\n\n /**\n * Derive or get a session key for communication with a peer\n */\n getSessionKey(peerDID: string): Promise<Uint8Array>;\n\n /**\n * Encrypt with a session key\n */\n encryptWithSessionKey(\n plaintext: Uint8Array,\n sessionKey: Uint8Array\n ): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }>;\n\n /**\n * Decrypt with a session key\n */\n decryptWithSessionKey(\n encrypted: {\n ct: string;\n iv: string;\n tag: string;\n },\n sessionKey: Uint8Array\n ): Promise<Uint8Array>;\n\n // ===========================================================================\n // UCAN OPERATIONS\n // ===========================================================================\n\n /**\n * Create a UCAN token\n */\n createUCAN(\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n proofs?: string[];\n }\n ): Promise<string>;\n\n /**\n * Verify a UCAN token\n */\n verifyUCAN(\n token: string,\n options?: {\n expectedAudience?: string;\n requiredCapabilities?: Array<{ can: string; with: string }>;\n }\n ): Promise<AeonCapabilityResult>;\n\n /**\n * Delegate capabilities\n */\n delegateCapabilities(\n parentToken: string,\n audience: string,\n capabilities: Array<{ can: string; with: string }>,\n options?: {\n expirationSeconds?: number;\n }\n ): Promise<string>;\n\n // ===========================================================================\n // UTILITY OPERATIONS\n // ===========================================================================\n\n /**\n * Compute hash of data\n */\n hash(data: Uint8Array): Promise<Uint8Array>;\n\n /**\n * Generate random bytes\n */\n randomBytes(length: number): Uint8Array;\n\n /**\n * Check if crypto is properly initialized\n */\n isInitialized(): boolean;\n}\n\n/**\n * Null crypto provider for when crypto is disabled\n *\n * All operations either throw or return permissive defaults.\n */\nexport class NullCryptoProvider implements ICryptoProvider {\n private notConfiguredError(): Error {\n return new Error('Crypto provider not configured');\n }\n\n async generateIdentity(): Promise<{\n did: string;\n publicSigningKey: JsonWebKey;\n publicEncryptionKey?: JsonWebKey;\n }> {\n throw this.notConfiguredError();\n }\n\n getLocalDID(): string | null {\n return null;\n }\n\n async exportPublicIdentity(): Promise<SecureNodeInfo | null> {\n return null;\n }\n\n async registerRemoteNode(): Promise<void> {\n // No-op when crypto disabled\n }\n\n async getRemotePublicKey(): Promise<JsonWebKey | null> {\n return null;\n }\n\n async sign(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async signData<T>(_data: T): Promise<SignedSyncData<T>> {\n throw this.notConfiguredError();\n }\n\n async verify(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async verifySignedData(): Promise<boolean> {\n // Permissive when crypto disabled\n return true;\n }\n\n async encrypt(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n epk?: JsonWebKey;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decrypt(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async getSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async encryptWithSessionKey(): Promise<{\n alg: string;\n ct: string;\n iv: string;\n tag: string;\n encryptedAt: number;\n }> {\n throw this.notConfiguredError();\n }\n\n async decryptWithSessionKey(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n async createUCAN(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async verifyUCAN(): Promise<AeonCapabilityResult> {\n // Permissive when crypto disabled\n return { authorized: true };\n }\n\n async delegateCapabilities(): Promise<string> {\n throw this.notConfiguredError();\n }\n\n async hash(): Promise<Uint8Array> {\n throw this.notConfiguredError();\n }\n\n randomBytes(length: number): Uint8Array {\n // Use crypto.getRandomValues even without full crypto setup\n return crypto.getRandomValues(new Uint8Array(length));\n }\n\n isInitialized(): boolean {\n return false;\n }\n}\n","/**\n * Aeon Transaction Signer Abstraction\n *\n * Keeps sync cryptography (`ICryptoProvider`) decoupled from on-chain write signing.\n * This interface matches custodial signer semantics so server and Aeon callers\n * converge on one contract shape.\n */\n\nexport type HexString = `0x${string}`;\n\nexport type TransactionSignerPayloadMap = Record<string, unknown>;\n\nexport type TransactionSignerExecuteRequest<\n TPayloads extends TransactionSignerPayloadMap,\n TAction extends keyof TPayloads & string = keyof TPayloads & string\n> = {\n action: TAction;\n payload: TPayloads[TAction];\n chainId?: number;\n waitForReceipt?: boolean;\n requestId?: string;\n};\n\nexport type TransactionSignerErrorCode =\n | 'invalid_request'\n | 'signer_unavailable'\n | 'signer_denied'\n | 'tx_failed'\n | 'tx_reverted'\n | 'unauthorized'\n | 'forbidden'\n | 'unknown_action'\n | 'upstream_error';\n\nexport interface TransactionSignerExecuteResponse<\n TAction extends string = string\n> {\n success: boolean;\n action: TAction;\n chainId: number;\n txHash?: HexString;\n receiptStatus?: 'pending' | 'success' | 'reverted';\n signerAddress?: HexString;\n keyVersion?: string;\n errorCode?: TransactionSignerErrorCode;\n errorMessage?: string;\n revertReason?: string;\n}\n\nexport interface TransactionSignerMetadata<TAction extends string = string> {\n action: TAction;\n chainId: number;\n signerAddress: HexString;\n keyVersion: string;\n keyName: string;\n}\n\nexport interface TransactionSignerHealth {\n ok: boolean;\n service: string;\n timestamp: string;\n}\n\nexport interface ITransactionSigner<\n TPayloads extends TransactionSignerPayloadMap = TransactionSignerPayloadMap\n> {\n execute<TAction extends keyof TPayloads & string>(\n request: TransactionSignerExecuteRequest<TPayloads, TAction>\n ): Promise<TransactionSignerExecuteResponse<TAction>>;\n\n getSigner<TAction extends keyof TPayloads & string>(\n action: TAction\n ): Promise<TransactionSignerMetadata<TAction>>;\n\n health(): Promise<TransactionSignerHealth>;\n}\n\nexport class NullTransactionSigner<\n TPayloads extends TransactionSignerPayloadMap = TransactionSignerPayloadMap\n> implements ITransactionSigner<TPayloads>\n{\n async execute<TAction extends keyof TPayloads & string>(\n request: TransactionSignerExecuteRequest<TPayloads, TAction>\n ): Promise<TransactionSignerExecuteResponse<TAction>> {\n return {\n success: false,\n action: request.action,\n chainId: request.chainId || 0,\n errorCode: 'signer_unavailable',\n errorMessage: 'Transaction signer not configured',\n };\n }\n\n async getSigner<TAction extends keyof TPayloads & string>(\n action: TAction\n ): Promise<TransactionSignerMetadata<TAction>> {\n throw new Error(\n `Transaction signer metadata unavailable for action: ${action}`\n );\n }\n\n async health(): Promise<TransactionSignerHealth> {\n return {\n ok: false,\n service: 'transaction-signer',\n timestamp: new Date().toISOString(),\n };\n }\n}\n\nexport function createTransactionSignerAdapter<\n TPayloads extends TransactionSignerPayloadMap\n>(contract: ITransactionSigner<TPayloads>): ITransactionSigner<TPayloads> {\n return contract;\n}\n","/**\n * Aeon Flow Codec — Binary Frame Layer\n *\n * Encodes and decodes FlowFrames into a compact 10-byte header + payload\n * binary wire format. Optionally accelerated by WASM; falls back to pure JS.\n *\n * Wire format (10 bytes header):\n * [0..1] stream_id u16 big-endian\n * [2..5] sequence u32 big-endian\n * [6] flags u8\n * [7..9] length u24 big-endian (payload bytes, max 16 MB)\n *\n * The codec is zerocopy where possible: decode returns a Uint8Array view\n * into the original buffer rather than copying payload bytes.\n *\n * @see docs/ebooks/145-log-rolling-pipelined-prefill/ch14-aeon-flow-protocol.md\n */\n\nimport type { FlowFrame } from './types';\n\n/** Header size in bytes */\nexport const HEADER_SIZE = 10;\n\n/** Maximum payload length (2^24 - 1 = 16,777,215 bytes ≈ 16 MB) */\nexport const MAX_PAYLOAD_LENGTH = 0xFFFFFF;\n\n/**\n * FlowCodec — binary encoder/decoder for FlowFrames.\n *\n * Create via `FlowCodec.create()` which attempts WASM acceleration,\n * falling back to the pure JS path (which is always available).\n */\nexport class FlowCodec {\n private wasmInstance: WebAssembly.Instance | null = null;\n\n private constructor(wasmInstance: WebAssembly.Instance | null) {\n this.wasmInstance = wasmInstance;\n }\n\n /**\n * Create a FlowCodec. Tries WASM acceleration, falls back to JS.\n * The JS path is always correct — WASM is a performance optimization only.\n */\n static async create(): Promise<FlowCodec> {\n // WASM acceleration is a future enhancement.\n // For now, always use the pure JS path which is correct and portable.\n return new FlowCodec(null);\n }\n\n /**\n * Create a FlowCodec synchronously (JS-only, no WASM attempt).\n */\n static createSync(): FlowCodec {\n return new FlowCodec(null);\n }\n\n /**\n * Whether WASM acceleration is active.\n */\n get isWasmAccelerated(): boolean {\n return this.wasmInstance !== null;\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Encode\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Encode a single FlowFrame into a binary buffer.\n *\n * Returns a new Uint8Array containing the 10-byte header followed by\n * the payload bytes.\n */\n encode(frame: FlowFrame): Uint8Array {\n const payloadLen = frame.payload.length;\n if (payloadLen > MAX_PAYLOAD_LENGTH) {\n throw new RangeError(\n `Payload length ${payloadLen} exceeds maximum ${MAX_PAYLOAD_LENGTH}`\n );\n }\n\n const buf = new Uint8Array(HEADER_SIZE + payloadLen);\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n\n // stream_id: u16\n view.setUint16(0, frame.streamId);\n // sequence: u32\n view.setUint32(2, frame.sequence);\n // flags: u8\n buf[6] = frame.flags;\n // length: u24 big-endian\n buf[7] = (payloadLen >>> 16) & 0xFF;\n buf[8] = (payloadLen >>> 8) & 0xFF;\n buf[9] = payloadLen & 0xFF;\n // payload\n buf.set(frame.payload, HEADER_SIZE);\n\n return buf;\n }\n\n /**\n * Decode a single FlowFrame from a buffer at the given offset.\n *\n * The returned frame's `payload` is a zerocopy view into the original\n * buffer — no data is copied. Callers who need the payload to outlive\n * the original buffer should `.slice()` it.\n *\n * @returns The decoded frame and the number of bytes consumed.\n */\n decode(\n buffer: Uint8Array,\n offset: number = 0\n ): { frame: FlowFrame; bytesRead: number } {\n if (buffer.length - offset < HEADER_SIZE) {\n throw new RangeError(\n `Buffer too small: need at least ${HEADER_SIZE} bytes, have ${buffer.length - offset}`\n );\n }\n\n const view = new DataView(\n buffer.buffer,\n buffer.byteOffset + offset,\n buffer.byteLength - offset\n );\n\n const streamId = view.getUint16(0);\n const sequence = view.getUint32(2);\n const flags = buffer[offset + 6];\n const length =\n (buffer[offset + 7] << 16) |\n (buffer[offset + 8] << 8) |\n buffer[offset + 9];\n\n if (buffer.length - offset - HEADER_SIZE < length) {\n throw new RangeError(\n `Buffer too small for payload: need ${length} bytes, have ${buffer.length - offset - HEADER_SIZE}`\n );\n }\n\n // Zerocopy: payload is a view into the original buffer\n const payload = buffer.subarray(\n offset + HEADER_SIZE,\n offset + HEADER_SIZE + length\n );\n\n return {\n frame: { streamId, sequence, flags, payload },\n bytesRead: HEADER_SIZE + length,\n };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Batch encode/decode\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Encode multiple frames into a single contiguous buffer.\n *\n * Frames are laid out sequentially: [header+payload][header+payload]...\n */\n encodeBatch(frames: FlowFrame[]): Uint8Array {\n // Calculate total size\n let totalSize = 0;\n for (const frame of frames) {\n if (frame.payload.length > MAX_PAYLOAD_LENGTH) {\n throw new RangeError(\n `Payload length ${frame.payload.length} exceeds maximum ${MAX_PAYLOAD_LENGTH}`\n );\n }\n totalSize += HEADER_SIZE + frame.payload.length;\n }\n\n const buf = new Uint8Array(totalSize);\n let writeOffset = 0;\n\n for (const frame of frames) {\n const encoded = this.encode(frame);\n buf.set(encoded, writeOffset);\n writeOffset += encoded.length;\n }\n\n return buf;\n }\n\n /**\n * Decode all frames from a contiguous buffer.\n *\n * Payloads are zerocopy views into the original buffer.\n */\n decodeBatch(buffer: Uint8Array): FlowFrame[] {\n const frames: FlowFrame[] = [];\n let offset = 0;\n\n while (offset < buffer.length) {\n // Need at least a header to continue\n if (buffer.length - offset < HEADER_SIZE) {\n throw new RangeError(\n `Truncated frame at offset ${offset}: need ${HEADER_SIZE} bytes, have ${buffer.length - offset}`\n );\n }\n\n const { frame, bytesRead } = this.decode(buffer, offset);\n frames.push(frame);\n offset += bytesRead;\n }\n\n return frames;\n }\n}\n","/**\n * Aeon Flow Protocol — Type Definitions\n *\n * The Aeon Flow Protocol extracts the fork/race/collapse primitive that\n * appears independently across the entire stack (inference, ESI, sync,\n * shell, frontend) into a unified, protocol-level abstraction with a\n * pure binary wire format.\n *\n * @see docs/ebooks/145-log-rolling-pipelined-prefill/ch14-aeon-flow-protocol.md\n */\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Frame Flags\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Fork: opens child streams from a parent */\nexport const FORK = 0x01;\n/** Race: marks streams as racing — first to complete wins */\nexport const RACE = 0x02;\n/** Collapse: merge results from multiple streams into one */\nexport const COLLAPSE = 0x04;\n/** Poison: NaN propagation, error, or cancellation */\nexport const POISON = 0x08;\n/** Fin: stream is complete, no more frames will be sent */\nexport const FIN = 0x10;\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Wire Format Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * A single frame on the wire.\n *\n * FlowFrame {\n * stream_id: u16 // multiplexed stream identifier\n * sequence: u32 // position within stream\n * flags: u8 // FORK | RACE | COLLAPSE | POISON | FIN\n * length: u24 // payload length (up to 16MB)\n * payload: [u8] // raw bytes\n * }\n *\n * Total header: 10 bytes.\n */\nexport interface FlowFrame {\n /** Multiplexed stream identifier (u16, 0–65535) */\n streamId: number;\n /** Sequence number within the stream (u32) */\n sequence: number;\n /** Bitfield of frame flags (FORK, RACE, COLLAPSE, POISON, FIN) */\n flags: number;\n /** Raw payload bytes */\n payload: Uint8Array;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Stream Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Stream lifecycle states */\nexport type FlowStreamState =\n | 'open'\n | 'racing'\n | 'collapsing'\n | 'closed'\n | 'poisoned';\n\n/**\n * A logical stream within the protocol.\n *\n * Streams form a tree: fork() creates children, race()/collapse()\n * operate on sibling streams, poison() propagates down the tree.\n */\nexport interface FlowStream {\n /** Stream identifier (even = client-initiated, odd = server-initiated) */\n id: number;\n /** Current lifecycle state */\n state: FlowStreamState;\n /** Parent stream that forked this one (undefined for root streams) */\n parent?: number;\n /** Child streams forked from this one */\n children: number[];\n /** Next sequence number to assign */\n nextSequence: number;\n /** Number of frames buffered (for backpressure) */\n bufferedFrames: number;\n /** Accumulated result frames (for race/collapse) */\n results: Uint8Array[];\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Transport Abstraction\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Transport-agnostic interface for sending/receiving binary data.\n *\n * Implementations exist for WebSocket, TCP, WebRTC DataChannel, IPC,\n * and in-memory (for testing).\n */\nexport interface FlowTransport {\n /** Send binary data over the transport */\n send(data: Uint8Array): void;\n /** Register a handler for incoming data */\n onReceive(handler: (data: Uint8Array) => void): void;\n /** Close the transport */\n close(): void;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Protocol Configuration\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Configuration for the Aeon Flow Protocol.\n */\nexport interface FlowProtocolConfig {\n /**\n * Per-stream high-water mark for backpressure.\n * When a stream has this many unacknowledged frames buffered,\n * sends are paused until the remote drains.\n * @default 64\n */\n highWaterMark: number;\n\n /**\n * Whether this side initiates even-numbered streams (client)\n * or odd-numbered streams (server). Like HTTP/2.\n * @default 'client'\n */\n role: 'client' | 'server';\n\n /**\n * Maximum number of concurrent open streams.\n * @default 256\n */\n maxConcurrentStreams: number;\n}\n\n/**\n * Default protocol configuration.\n */\nexport const DEFAULT_FLOW_CONFIG: FlowProtocolConfig = {\n highWaterMark: 64,\n role: 'client',\n maxConcurrentStreams: 256,\n};\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Event Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Events emitted by the protocol.\n */\nexport interface FlowProtocolEvents {\n /** A new frame arrived on a stream */\n frame: { streamId: number; frame: FlowFrame };\n /** A stream reached the FIN state */\n streamEnd: { streamId: number };\n /** A stream was poisoned */\n streamPoisoned: { streamId: number };\n /** Backpressure: stream is paused */\n streamPaused: { streamId: number };\n /** Backpressure: stream is resumed */\n streamResumed: { streamId: number };\n}\n","/**\n * Aeon Flow Protocol — Stream Multiplexing with Fork/Race/Collapse\n *\n * The Flow Layer sits between the Frame Layer (FlowCodec) and the\n * Application Layer (inference, ESI, sync, shell, speculate). It manages\n * multiplexed streams with three protocol-level primitives:\n *\n * - **Fork**: Create N child streams from a parent stream. Each child\n * runs independently. Used for parallel pipelines, fragment fetching,\n * reality branching.\n *\n * - **Race**: Mark streams as racing. The first to send a FIN frame wins.\n * Losers are automatically poisoned. Used for speculative decoding,\n * cache races, A/B testing.\n *\n * - **Collapse**: Wait for all streams to complete (or poison), then\n * merge their results via a caller-provided function. Used for shard\n * assembly, fragment stitching, branch reconciliation.\n *\n * Stream IDs: even = client-initiated, odd = server-initiated (like HTTP/2).\n * Backpressure via per-stream high-water mark (configurable, default 64).\n * Poison propagates from parent to all descendants.\n *\n * @see docs/ebooks/145-log-rolling-pipelined-prefill/ch14-aeon-flow-protocol.md\n */\n\nimport { FlowCodec } from './FlowCodec';\nimport {\n FORK,\n RACE,\n COLLAPSE,\n POISON,\n FIN,\n DEFAULT_FLOW_CONFIG,\n} from './types';\nimport type {\n FlowFrame,\n FlowStream,\n FlowStreamState,\n FlowTransport,\n FlowProtocolConfig,\n} from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Internal helpers\n// ═══════════════════════════════════════════════════════════════════════════════\n\ntype FrameHandler = (frame: FlowFrame) => void;\ntype VoidHandler = () => void;\n\n/**\n * AeonFlowProtocol\n *\n * Manages multiplexed binary streams over a transport with\n * fork/race/collapse semantics.\n */\nexport class AeonFlowProtocol {\n private streams: Map<number, FlowStream> = new Map();\n private nextEvenId: number = 0;\n private nextOddId: number = 1;\n private codec: FlowCodec;\n private transport: FlowTransport;\n private config: FlowProtocolConfig;\n\n // Event handlers\n private frameHandlers: Map<number, Set<FrameHandler>> = new Map();\n private endHandlers: Map<number, Set<VoidHandler>> = new Map();\n private poisonHandlers: Map<number, Set<VoidHandler>> = new Map();\n\n // Race tracking\n private raceGroups: Map<string, {\n streamIds: number[];\n resolve: (result: { winner: number; result: Uint8Array }) => void;\n settled: boolean;\n }> = new Map();\n\n // Collapse tracking\n private collapseGroups: Map<string, {\n streamIds: number[];\n merger: (results: Map<number, Uint8Array>) => Uint8Array;\n resolve: (result: Uint8Array) => void;\n results: Map<number, Uint8Array>;\n completed: Set<number>;\n settled: boolean;\n }> = new Map();\n\n constructor(\n transport: FlowTransport,\n config?: Partial<FlowProtocolConfig>\n ) {\n this.transport = transport;\n this.config = { ...DEFAULT_FLOW_CONFIG, ...config };\n this.codec = FlowCodec.createSync();\n\n // Wire up incoming data\n this.transport.onReceive((data: Uint8Array) => {\n this.handleIncoming(data);\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Stream management\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Open a new root stream (no parent).\n *\n * Client-initiated streams get even IDs; server-initiated get odd IDs.\n */\n openStream(): number {\n const id = this.allocateStreamId();\n this.createStream(id);\n return id;\n }\n\n /**\n * Get the current state of a stream.\n */\n getStream(streamId: number): FlowStream | undefined {\n return this.streams.get(streamId);\n }\n\n /**\n * Get all active streams.\n */\n getActiveStreams(): FlowStream[] {\n return Array.from(this.streams.values()).filter(\n (s) => s.state !== 'closed' && s.state !== 'poisoned'\n );\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Fork: create N child streams from a parent\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Fork a parent stream into N child streams.\n *\n * Each child stream is independent and can send/receive frames.\n * The parent tracks all children. Poisoning the parent poisons all children.\n *\n * @param parentStreamId The stream to fork from\n * @param count Number of child streams to create\n * @returns Array of child stream IDs\n */\n fork(parentStreamId: number, count: number): number[] {\n const parent = this.requireStream(parentStreamId, 'open');\n if (count < 1) {\n throw new RangeError('Fork count must be at least 1');\n }\n\n if (this.streams.size + count > this.config.maxConcurrentStreams) {\n throw new Error(\n `Cannot fork ${count} streams: would exceed maxConcurrentStreams (${this.config.maxConcurrentStreams})`\n );\n }\n\n const childIds: number[] = [];\n for (let i = 0; i < count; i++) {\n const childId = this.allocateStreamId();\n this.createStream(childId, parentStreamId);\n parent.children.push(childId);\n childIds.push(childId);\n }\n\n // Send FORK frame on parent to notify remote\n this.sendFrame(parentStreamId, FORK, new Uint8Array(\n childIds.flatMap((id) => [(id >>> 8) & 0xFF, id & 0xFF])\n ));\n\n return childIds;\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Race: first stream to FIN wins, losers are poisoned\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Race multiple streams. The first to send a FIN frame wins.\n * All other streams in the race are automatically poisoned.\n *\n * @param streamIds Streams to race (must all be open)\n * @returns Promise resolving with the winner's stream ID and final payload\n */\n race(streamIds: number[]): Promise<{ winner: number; result: Uint8Array }> {\n if (streamIds.length < 2) {\n throw new RangeError('Race requires at least 2 streams');\n }\n\n // Mark all streams as racing\n for (const id of streamIds) {\n const stream = this.requireStream(id);\n stream.state = 'racing';\n }\n\n // Send RACE frame on each stream\n for (const id of streamIds) {\n const peerIds = streamIds.filter((sid) => sid !== id);\n this.sendFrame(id, RACE, new Uint8Array(\n peerIds.flatMap((pid) => [(pid >>> 8) & 0xFF, pid & 0xFF])\n ));\n }\n\n const groupId = `race-${streamIds.join('-')}-${Date.now()}`;\n\n return new Promise((resolve) => {\n this.raceGroups.set(groupId, {\n streamIds,\n resolve,\n settled: false,\n });\n\n // Listen for FIN on each stream\n for (const id of streamIds) {\n this.onStreamEnd(id, () => {\n this.settleRace(groupId, id);\n });\n }\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Collapse: wait for all streams, merge results\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Collapse multiple streams: wait for all to complete (or poison),\n * then merge their results.\n *\n * @param streamIds Streams to collapse\n * @param merger Function that merges results from all streams\n * @returns Promise resolving with the merged result\n */\n collapse(\n streamIds: number[],\n merger: (results: Map<number, Uint8Array>) => Uint8Array\n ): Promise<Uint8Array> {\n if (streamIds.length < 1) {\n throw new RangeError('Collapse requires at least 1 stream');\n }\n\n // Mark all streams as collapsing\n for (const id of streamIds) {\n const stream = this.requireStream(id);\n stream.state = 'collapsing';\n }\n\n // Send COLLAPSE frame on each stream\n for (const id of streamIds) {\n this.sendFrame(id, COLLAPSE, new Uint8Array(0));\n }\n\n const groupId = `collapse-${streamIds.join('-')}-${Date.now()}`;\n\n return new Promise((resolve) => {\n const group = {\n streamIds,\n merger,\n resolve,\n results: new Map<number, Uint8Array>(),\n completed: new Set<number>(),\n settled: false,\n };\n\n this.collapseGroups.set(groupId, group);\n\n // Listen for FIN or POISON on each stream\n for (const id of streamIds) {\n this.onStreamEnd(id, () => {\n this.settleCollapse(groupId, id, false);\n });\n this.onStreamPoisoned(id, () => {\n this.settleCollapse(groupId, id, true);\n });\n }\n });\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Send / Poison / Close\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Send a payload on a stream.\n */\n send(streamId: number, payload: Uint8Array, flags: number = 0): void {\n const stream = this.requireStream(streamId);\n\n // Backpressure check\n if (stream.bufferedFrames >= this.config.highWaterMark) {\n throw new Error(\n `Stream ${streamId} backpressure: ${stream.bufferedFrames} frames buffered (high-water mark: ${this.config.highWaterMark})`\n );\n }\n\n // Accumulate locally so race/collapse can read results\n if (payload.length > 0) {\n stream.results.push(payload);\n }\n stream.bufferedFrames++;\n\n this.sendFrame(streamId, flags, payload);\n }\n\n /**\n * Finish a stream. Sends a FIN frame and transitions to 'closed'.\n *\n * @param streamId Stream to finish\n * @param finalPayload Optional final payload to include with the FIN\n */\n finish(streamId: number, finalPayload?: Uint8Array): void {\n const stream = this.requireStream(streamId);\n\n // Accumulate final payload locally\n if (finalPayload && finalPayload.length > 0) {\n stream.results.push(finalPayload);\n }\n\n this.sendFrame(streamId, FIN, finalPayload ?? new Uint8Array(0));\n stream.state = 'closed';\n\n // Notify end handlers\n const handlers = this.endHandlers.get(streamId);\n if (handlers) {\n for (const handler of handlers) {\n handler();\n }\n }\n }\n\n /**\n * Poison a stream. Sends a POISON frame and propagates to all descendants.\n *\n * Poisoning is the protocol-level equivalent of NaN propagation,\n * AbortSignal cancellation, or error cascading.\n */\n poison(streamId: number): void {\n const stream = this.streams.get(streamId);\n if (!stream || stream.state === 'poisoned' || stream.state === 'closed') {\n return; // Already dead\n }\n\n stream.state = 'poisoned';\n this.sendFrame(streamId, POISON, new Uint8Array(0));\n\n // Notify poison handlers\n const handlers = this.poisonHandlers.get(streamId);\n if (handlers) {\n for (const handler of handlers) {\n handler();\n }\n }\n\n // Propagate poison to all children (recursively)\n for (const childId of stream.children) {\n this.poison(childId);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Event handlers\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Register a handler for frames arriving on a specific stream.\n */\n onFrame(streamId: number, handler: FrameHandler): () => void {\n let handlers = this.frameHandlers.get(streamId);\n if (!handlers) {\n handlers = new Set();\n this.frameHandlers.set(streamId, handlers);\n }\n handlers.add(handler);\n return () => { handlers!.delete(handler); };\n }\n\n /**\n * Register a handler for when a stream ends (FIN received).\n */\n onStreamEnd(streamId: number, handler: VoidHandler): () => void {\n let handlers = this.endHandlers.get(streamId);\n if (!handlers) {\n handlers = new Set();\n this.endHandlers.set(streamId, handlers);\n }\n handlers.add(handler);\n return () => { handlers!.delete(handler); };\n }\n\n /**\n * Register a handler for when a stream is poisoned.\n */\n onStreamPoisoned(streamId: number, handler: VoidHandler): () => void {\n let handlers = this.poisonHandlers.get(streamId);\n if (!handlers) {\n handlers = new Set();\n this.poisonHandlers.set(streamId, handlers);\n }\n handlers.add(handler);\n return () => { handlers!.delete(handler); };\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Destroy\n // ═══════════════════════════════════════════════════════════════════════\n\n /**\n * Close the protocol and underlying transport.\n * Poisons all open streams first.\n */\n destroy(): void {\n for (const [id, stream] of this.streams) {\n if (stream.state !== 'closed' && stream.state !== 'poisoned') {\n stream.state = 'closed';\n }\n }\n this.streams.clear();\n this.frameHandlers.clear();\n this.endHandlers.clear();\n this.poisonHandlers.clear();\n this.raceGroups.clear();\n this.collapseGroups.clear();\n this.transport.close();\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private: incoming frame handling\n // ═══════════════════════════════════════════════════════════════════════\n\n private handleIncoming(data: Uint8Array): void {\n // Decode all frames from the received buffer\n let frames: FlowFrame[];\n try {\n frames = this.codec.decodeBatch(data);\n } catch {\n // Malformed data — nothing to do\n return;\n }\n\n for (const frame of frames) {\n this.handleFrame(frame);\n }\n }\n\n private handleFrame(frame: FlowFrame): void {\n const { streamId, flags } = frame;\n\n // Auto-create stream if we receive a frame on an unknown stream\n // (the remote opened it)\n if (!this.streams.has(streamId)) {\n this.createStream(streamId);\n }\n\n const stream = this.streams.get(streamId)!;\n\n // Handle control flags\n if (flags & POISON) {\n this.poison(streamId);\n return;\n }\n\n if (flags & FIN) {\n // Accumulate final payload if present\n if (frame.payload.length > 0) {\n stream.results.push(frame.payload);\n }\n stream.state = 'closed';\n\n // Notify end handlers\n const endHandlers = this.endHandlers.get(streamId);\n if (endHandlers) {\n for (const handler of endHandlers) {\n handler();\n }\n }\n return;\n }\n\n if (flags & FORK) {\n // Remote is notifying us about forked child streams\n // Parse child IDs from payload (u16 pairs)\n for (let i = 0; i + 1 < frame.payload.length; i += 2) {\n const childId = (frame.payload[i] << 8) | frame.payload[i + 1];\n if (!this.streams.has(childId)) {\n this.createStream(childId, streamId);\n }\n if (!stream.children.includes(childId)) {\n stream.children.push(childId);\n }\n }\n return;\n }\n\n // Data frame — accumulate result and notify handlers\n if (frame.payload.length > 0) {\n stream.results.push(frame.payload);\n }\n stream.bufferedFrames++;\n\n const handlers = this.frameHandlers.get(streamId);\n if (handlers) {\n for (const handler of handlers) {\n handler(frame);\n }\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private: race/collapse settlement\n // ═══════════════════════════════════════════════════════════════════════\n\n private settleRace(groupId: string, winnerId: number): void {\n const group = this.raceGroups.get(groupId);\n if (!group || group.settled) return;\n group.settled = true;\n\n const winnerStream = this.streams.get(winnerId);\n const result = winnerStream\n ? this.concatenateResults(winnerStream.results)\n : new Uint8Array(0);\n\n // Poison all losers\n for (const id of group.streamIds) {\n if (id !== winnerId) {\n this.poison(id);\n }\n }\n\n group.resolve({ winner: winnerId, result });\n this.raceGroups.delete(groupId);\n }\n\n private settleCollapse(\n groupId: string,\n streamId: number,\n wasPoisoned: boolean\n ): void {\n const group = this.collapseGroups.get(groupId);\n if (!group || group.settled) return;\n\n group.completed.add(streamId);\n\n if (!wasPoisoned) {\n const stream = this.streams.get(streamId);\n if (stream) {\n group.results.set(streamId, this.concatenateResults(stream.results));\n }\n }\n // Poisoned streams contribute nothing to the merge\n\n // Check if all streams have completed or been poisoned\n if (group.completed.size >= group.streamIds.length) {\n group.settled = true;\n const merged = group.merger(group.results);\n group.resolve(merged);\n this.collapseGroups.delete(groupId);\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════\n // Private: stream helpers\n // ═══════════════════════════════════════════════════════════════════════\n\n private allocateStreamId(): number {\n if (this.config.role === 'client') {\n const id = this.nextEvenId;\n this.nextEvenId += 2;\n return id;\n } else {\n const id = this.nextOddId;\n this.nextOddId += 2;\n return id;\n }\n }\n\n private createStream(id: number, parent?: number): FlowStream {\n const stream: FlowStream = {\n id,\n state: 'open',\n parent,\n children: [],\n nextSequence: 0,\n bufferedFrames: 0,\n results: [],\n };\n this.streams.set(id, stream);\n return stream;\n }\n\n private requireStream(\n streamId: number,\n ...allowedStates: FlowStreamState[]\n ): FlowStream {\n const stream = this.streams.get(streamId);\n if (!stream) {\n throw new Error(`Stream ${streamId} does not exist`);\n }\n if (\n allowedStates.length > 0 &&\n !allowedStates.includes(stream.state)\n ) {\n throw new Error(\n `Stream ${streamId} is in state '${stream.state}', expected one of: ${allowedStates.join(', ')}`\n );\n }\n return stream;\n }\n\n private sendFrame(\n streamId: number,\n flags: number,\n payload: Uint8Array\n ): void {\n const stream = this.streams.get(streamId);\n if (!stream) return;\n\n const frame: FlowFrame = {\n streamId,\n sequence: stream.nextSequence++,\n flags,\n payload,\n };\n\n const encoded = this.codec.encode(frame);\n this.transport.send(encoded);\n }\n\n private concatenateResults(chunks: Uint8Array[]): Uint8Array {\n if (chunks.length === 0) return new Uint8Array(0);\n if (chunks.length === 1) return chunks[0];\n\n let totalLen = 0;\n for (const chunk of chunks) totalLen += chunk.length;\n\n const result = new Uint8Array(totalLen);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n}\n","/**\n * Frame Reassembler — Out-of-Order Frame Reconstruction\n *\n * Over TCP/WebSocket, frames arrive in order. Over UDP, they don't.\n * The flow header's stream_id (u16) + sequence (u32) already carry\n * the information needed to reassemble — this module uses it.\n *\n * Per-stream reorder buffer with configurable window. Frames arriving\n * out of order are buffered until the gap fills. Frames arriving\n * beyond the window are dropped (assumed lost, will be retransmitted).\n *\n * This is the same insight as QUIC: per-stream ordering eliminates\n * head-of-line blocking across streams. Stream A's lost packet doesn't\n * block Stream B. Only Stream A waits for its own retransmission.\n */\n\nimport type { FlowFrame } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface ReassemblerConfig {\n /**\n * Maximum number of frames to buffer per stream while waiting\n * for gaps to fill. Frames beyond this are dropped.\n * @default 256\n */\n maxBufferPerStream: number;\n\n /**\n * Maximum number of tracked streams. Oldest streams are evicted\n * when this limit is reached.\n * @default 1024\n */\n maxStreams: number;\n\n /**\n * Maximum gap in sequence numbers before declaring frames lost.\n * If we receive seq 10 but are expecting seq 3, and gap > maxGap,\n * we skip ahead and emit what we have.\n * @default 64\n */\n maxGap: number;\n}\n\nconst DEFAULT_REASSEMBLER_CONFIG: ReassemblerConfig = {\n maxBufferPerStream: 256,\n maxStreams: 1024,\n maxGap: 64,\n};\n\n/** Per-stream reassembly state */\ninterface StreamReassemblyState {\n /** Next expected sequence number */\n nextExpected: number;\n /** Buffered out-of-order frames, keyed by sequence number */\n buffer: Map<number, FlowFrame>;\n /** Last time a frame was received on this stream */\n lastActivity: number;\n /** Sequence numbers we've already emitted (dedup window) */\n emittedSequences: Set<number>;\n}\n\nexport interface ReassemblerStats {\n /** Total frames received */\n framesReceived: number;\n /** Frames delivered in order */\n framesDelivered: number;\n /** Frames currently buffered (waiting for gaps) */\n framesBuffered: number;\n /** Frames dropped (duplicates or beyond window) */\n framesDropped: number;\n /** Frames reordered (delivered from buffer after gap fill) */\n framesReordered: number;\n /** Active streams being tracked */\n activeStreams: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Reassembler\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport class FrameReassembler {\n private config: ReassemblerConfig;\n private streams = new Map<number, StreamReassemblyState>();\n private stats: ReassemblerStats = {\n framesReceived: 0,\n framesDelivered: 0,\n framesBuffered: 0,\n framesDropped: 0,\n framesReordered: 0,\n activeStreams: 0,\n };\n\n constructor(config?: Partial<ReassemblerConfig>) {\n this.config = { ...DEFAULT_REASSEMBLER_CONFIG, ...config };\n }\n\n /**\n * Process an incoming frame. Returns an array of frames that are\n * now deliverable in order. May return 0 frames (buffered), 1 frame\n * (in order), or multiple frames (gap was filled, releasing buffered).\n *\n * This is the core reassembly operation:\n * - In-order frame → deliver immediately + flush any buffered followers\n * - Out-of-order frame → buffer until gap fills\n * - Duplicate → drop\n * - Beyond window → drop\n */\n push(frame: FlowFrame): FlowFrame[] {\n this.stats.framesReceived++;\n\n const streamId = frame.streamId;\n let state = this.streams.get(streamId);\n\n if (!state) {\n // New stream — enforce stream limit\n if (this.streams.size >= this.config.maxStreams) {\n this.evictOldestStream();\n }\n\n state = {\n nextExpected: 0,\n buffer: new Map(),\n lastActivity: Date.now(),\n emittedSequences: new Set(),\n };\n this.streams.set(streamId, state);\n this.stats.activeStreams = this.streams.size;\n }\n\n state.lastActivity = Date.now();\n\n // Dedup: already emitted this sequence?\n if (state.emittedSequences.has(frame.sequence)) {\n this.stats.framesDropped++;\n return [];\n }\n\n // Already buffered?\n if (state.buffer.has(frame.sequence)) {\n this.stats.framesDropped++;\n return [];\n }\n\n const seq = frame.sequence;\n\n // Case 1: Frame is exactly what we expected → deliver + flush\n if (seq === state.nextExpected) {\n return this.deliverAndFlush(state, frame);\n }\n\n // Case 2: Frame is behind what we expected → duplicate, drop\n if (seq < state.nextExpected) {\n this.stats.framesDropped++;\n return [];\n }\n\n // Case 3: Frame is ahead of expected → buffer (gap exists)\n const gap = seq - state.nextExpected;\n\n // If gap is too large, skip ahead\n if (gap > this.config.maxGap) {\n // Declare everything in the gap as lost, skip ahead\n state.nextExpected = seq;\n return this.deliverAndFlush(state, frame);\n }\n\n // Buffer the frame if we have space\n if (state.buffer.size >= this.config.maxBufferPerStream) {\n this.stats.framesDropped++;\n return [];\n }\n\n state.buffer.set(seq, frame);\n this.stats.framesBuffered++;\n\n return [];\n }\n\n /**\n * Get the sequence numbers that are missing (gaps) for a stream.\n * Used by the reliability layer to request retransmission.\n */\n getMissingSequences(streamId: number): number[] {\n const state = this.streams.get(streamId);\n if (!state) return [];\n\n const missing: number[] = [];\n const maxBuffered = state.buffer.size > 0\n ? Math.max(...state.buffer.keys())\n : state.nextExpected;\n\n for (let seq = state.nextExpected; seq < maxBuffered; seq++) {\n if (!state.buffer.has(seq)) {\n missing.push(seq);\n }\n }\n\n return missing;\n }\n\n /**\n * Clean up a stream's reassembly state.\n * Call when a stream is closed or poisoned.\n */\n closeStream(streamId: number): void {\n const state = this.streams.get(streamId);\n if (state) {\n this.stats.framesBuffered -= state.buffer.size;\n this.streams.delete(streamId);\n this.stats.activeStreams = this.streams.size;\n }\n }\n\n /**\n * Get current reassembly statistics.\n */\n getStats(): Readonly<ReassemblerStats> {\n return { ...this.stats };\n }\n\n /**\n * Reset all state.\n */\n reset(): void {\n this.streams.clear();\n this.stats = {\n framesReceived: 0,\n framesDelivered: 0,\n framesBuffered: 0,\n framesDropped: 0,\n framesReordered: 0,\n activeStreams: 0,\n };\n }\n\n // ─── Internal ──────────────────────────────────────────────────────────\n\n /**\n * Deliver a frame and flush any consecutively-buffered followers.\n */\n private deliverAndFlush(\n state: StreamReassemblyState,\n frame: FlowFrame\n ): FlowFrame[] {\n const deliverable: FlowFrame[] = [frame];\n state.emittedSequences.add(frame.sequence);\n state.nextExpected = frame.sequence + 1;\n this.stats.framesDelivered++;\n\n // Flush consecutive frames from buffer\n while (state.buffer.has(state.nextExpected)) {\n const buffered = state.buffer.get(state.nextExpected)!;\n state.buffer.delete(state.nextExpected);\n state.emittedSequences.add(state.nextExpected);\n state.nextExpected++;\n deliverable.push(buffered);\n this.stats.framesBuffered--;\n this.stats.framesDelivered++;\n this.stats.framesReordered++;\n }\n\n // Trim dedup set to avoid unbounded growth\n if (state.emittedSequences.size > 1024) {\n const cutoff = state.nextExpected - 512;\n for (const seq of state.emittedSequences) {\n if (seq < cutoff) state.emittedSequences.delete(seq);\n }\n }\n\n return deliverable;\n }\n\n /**\n * Evict the least-recently-active stream to make room.\n */\n private evictOldestStream(): void {\n let oldestKey = -1;\n let oldestTime = Infinity;\n\n for (const [key, state] of this.streams) {\n if (state.lastActivity < oldestTime) {\n oldestTime = state.lastActivity;\n oldestKey = key;\n }\n }\n\n if (oldestKey >= 0) {\n this.closeStream(oldestKey);\n }\n }\n}\n","/**\n * UDP Flow Transport — Zero Head-of-Line Blocking\n *\n * Aeon Flow works over UDP. The 10-byte header is self-describing —\n * stream_id + sequence in every frame means frames can arrive out of\n * order and be reassembled. No TCP head-of-line blocking.\n *\n * This is the same insight as QUIC (HTTP/3) — but with 10-byte frames\n * instead of QUIC's more complex framing. No TLS ceremony (WASM\n * inference doesn't need it). No connection setup (first datagram IS\n * data). No head-of-line blocking (each stream reassembles independently).\n *\n * Reliability layer:\n * - ACK bitmaps: receiver sends periodic ACK frames with a bitmap\n * of received sequences. Compact: 8 bytes covers 64 contiguous seqs.\n * - Selective retransmit: sender retransmits only missing frames,\n * not the entire window (like TCP SACK but simpler).\n * - Congestion window: simple AIMD (additive-increase multiplicative-\n * decrease) like TCP Reno but per-stream.\n *\n * MTU handling:\n * - Flow frames > MTU are fragmented into MTU-sized UDP datagrams.\n * - Each fragment carries: [frag_header:4][flow_frame_chunk]\n * - Fragment header: [frame_id:u16][frag_index:u8][frag_total:u8]\n * - Max 255 fragments × 1400 bytes = ~350 KB per flow frame over UDP.\n * - Most flow frames are <1400 bytes (10-byte header + small payload).\n * Large payloads (16MB) are rare and better served over WebSocket.\n *\n * Environment support:\n * - Node.js/Bun: native dgram module\n * - Cloudflare Workers: connect() API (Cloudflare's UDP socket support)\n * - Browser: WebTransport (HTTP/3) provides UDP-like unreliable datagrams\n *\n * Usage:\n * const transport = new UDPFlowTransport({ host: '0.0.0.0', port: 4242 });\n * const protocol = new AeonFlowProtocol(transport, { role: 'server' });\n */\n\nimport type { FlowTransport } from './types';\nimport { FlowCodec, HEADER_SIZE } from './FlowCodec';\nimport { FrameReassembler } from './frame-reassembler';\nimport type { FlowFrame } from './types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Safe MTU for UDP datagrams (1500 Ethernet - 20 IP - 8 UDP) */\nexport const UDP_MTU = 1472;\n\n/** Fragment header size: [frame_id:u16][frag_index:u8][frag_total:u8] */\nexport const FRAGMENT_HEADER_SIZE = 4;\n\n/** Max payload per UDP datagram after fragment header */\nexport const MAX_FRAGMENT_PAYLOAD = UDP_MTU - FRAGMENT_HEADER_SIZE;\n\n/** ACK frame flag — not a real flow flag, internal to UDP transport */\nexport const ACK_FLAG = 0x80;\n\n/** How often to send ACK bitmaps (ms) */\nconst ACK_INTERVAL_MS = 50;\n\n/** How long before retransmitting an unacked frame (ms) */\nconst RETRANSMIT_TIMEOUT_MS = 200;\n\n/** Initial congestion window (frames) */\nconst INITIAL_CWND = 16;\n\n/** Max congestion window (frames) */\nconst MAX_CWND = 256;\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface UDPFlowTransportConfig {\n /** Local bind address */\n host: string;\n /** Local bind port */\n port: number;\n /** Remote host (for client mode) */\n remoteHost?: string;\n /** Remote port (for client mode) */\n remotePort?: number;\n /** MTU override (default: 1472) */\n mtu?: number;\n /** Enable reliability (ACKs + retransmit). Default: true */\n reliable?: boolean;\n /** Reassembler config overrides */\n reassembler?: {\n maxBufferPerStream?: number;\n maxStreams?: number;\n maxGap?: number;\n };\n}\n\n/** Sent frame awaiting acknowledgment */\ninterface InflightFrame {\n data: Uint8Array;\n streamId: number;\n sequence: number;\n sentAt: number;\n retransmits: number;\n}\n\n/** ACK bitmap: acknowledges sequences [baseSeq .. baseSeq+63] */\ninterface AckBitmap {\n streamId: number;\n baseSeq: number;\n /** 64-bit bitmap as two u32s */\n bitmapHi: number;\n bitmapLo: number;\n}\n\n/** Fragment reassembly state */\ninterface FragmentGroup {\n frameId: number;\n total: number;\n received: Map<number, Uint8Array>;\n createdAt: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// UDP Flow Transport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * UDP-based FlowTransport implementation.\n *\n * Implements the FlowTransport interface over UDP datagrams with:\n * - MTU-safe fragmentation/reassembly\n * - Out-of-order frame reassembly (via FrameReassembler)\n * - Optional reliability (ACK bitmaps + selective retransmit)\n * - Simple AIMD congestion control\n *\n * The same AeonFlowProtocol instance works unchanged — it just sees\n * frames arriving (possibly out of order, which the reassembler fixes).\n */\nexport class UDPFlowTransport implements FlowTransport {\n private config: Required<UDPFlowTransportConfig>;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n\n // UDP socket (set by bind/connect)\n private socket: UDPSocket | null = null;\n\n // Frame reassembly (out-of-order)\n private reassembler: FrameReassembler;\n\n // Fragment reassembly (MTU splitting)\n private fragmentGroups = new Map<number, FragmentGroup>();\n private nextFrameId = 0;\n\n // Reliability: inflight tracking\n private inflight = new Map<string, InflightFrame>();\n\n // Reliability: ACK state\n private receivedPerStream = new Map<number, Set<number>>();\n private ackTimer: ReturnType<typeof setInterval> | null = null;\n private retransmitTimer: ReturnType<typeof setInterval> | null = null;\n\n // Congestion control\n private cwnd = INITIAL_CWND;\n private inflightCount = 0;\n\n // Flow codec for ACK frame encoding\n private codec = FlowCodec.createSync();\n\n constructor(config: UDPFlowTransportConfig) {\n this.config = {\n host: config.host,\n port: config.port,\n remoteHost: config.remoteHost ?? '',\n remotePort: config.remotePort ?? 0,\n mtu: config.mtu ?? UDP_MTU,\n reliable: config.reliable ?? true,\n reassembler: config.reassembler ?? {},\n };\n\n this.reassembler = new FrameReassembler(this.config.reassembler);\n }\n\n /**\n * Bind and start the UDP transport.\n *\n * In server mode (no remoteHost), listens for incoming datagrams.\n * In client mode, binds and sets the remote endpoint.\n */\n async bind(): Promise<void> {\n this.socket = await createUDPSocket(this.config.host, this.config.port);\n\n this.socket.onMessage((data: Uint8Array, rinfo: RemoteInfo) => {\n if (this.closed) return;\n\n // Remember remote for server mode\n if (!this.config.remoteHost && rinfo.address) {\n this.config.remoteHost = rinfo.address;\n this.config.remotePort = rinfo.port;\n }\n\n this.handleDatagram(data);\n });\n\n // Start ACK and retransmit timers if reliable\n if (this.config.reliable) {\n this.ackTimer = setInterval(() => this.sendAcks(), ACK_INTERVAL_MS);\n this.retransmitTimer = setInterval(() => this.retransmitLost(), RETRANSMIT_TIMEOUT_MS);\n }\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed || !this.socket) return;\n\n // Congestion control: don't exceed window\n if (this.config.reliable && this.inflightCount >= this.cwnd) {\n // Drop — backpressure. Protocol layer will handle via highWaterMark.\n return;\n }\n\n const maxPayload = this.config.mtu - FRAGMENT_HEADER_SIZE;\n\n if (data.length <= maxPayload) {\n // Fits in one datagram — no fragmentation needed\n const frameId = this.nextFrameId++ & 0xFFFF;\n const datagram = this.wrapFragment(frameId, 0, 1, data);\n this.sendDatagram(datagram);\n this.trackInflight(data, frameId);\n } else {\n // Fragment into MTU-sized chunks\n const frameId = this.nextFrameId++ & 0xFFFF;\n const totalFragments = Math.ceil(data.length / maxPayload);\n\n if (totalFragments > 255) {\n // Too large for UDP fragmentation — caller should use WebSocket\n // for payloads > ~350KB\n return;\n }\n\n for (let i = 0; i < totalFragments; i++) {\n const start = i * maxPayload;\n const end = Math.min(start + maxPayload, data.length);\n const chunk = data.slice(start, end);\n const datagram = this.wrapFragment(frameId, i, totalFragments, chunk);\n this.sendDatagram(datagram);\n }\n this.trackInflight(data, frameId);\n }\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.ackTimer) clearInterval(this.ackTimer);\n if (this.retransmitTimer) clearInterval(this.retransmitTimer);\n\n this.socket?.close();\n this.socket = null;\n this.receiveHandler = null;\n this.inflight.clear();\n this.fragmentGroups.clear();\n this.reassembler.reset();\n }\n\n // ─── Stats ─────────────────────────────────────────────────────────────\n\n /** Get reassembly statistics */\n getReassemblerStats() {\n return this.reassembler.getStats();\n }\n\n /** Current congestion window size */\n get congestionWindow(): number {\n return this.cwnd;\n }\n\n /** Number of frames in flight (unacked) */\n get framesInFlight(): number {\n return this.inflightCount;\n }\n\n // ─── Internal: datagram handling ───────────────────────────────────────\n\n /**\n * Handle an incoming UDP datagram.\n *\n * Datagram format:\n * [frame_id:u16][frag_index:u8][frag_total:u8][payload...]\n */\n private handleDatagram(data: Uint8Array): void {\n if (data.length < FRAGMENT_HEADER_SIZE) return;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const frameId = view.getUint16(0);\n const fragIndex = data[2];\n const fragTotal = data[3];\n const payload = data.subarray(FRAGMENT_HEADER_SIZE);\n\n if (fragTotal === 1) {\n // Single fragment — no reassembly needed\n this.handleReassembledFrame(payload);\n } else {\n // Multi-fragment — reassemble\n this.handleFragment(frameId, fragIndex, fragTotal, payload);\n }\n }\n\n /**\n * Handle a fragment of a multi-datagram flow frame.\n */\n private handleFragment(\n frameId: number,\n fragIndex: number,\n fragTotal: number,\n payload: Uint8Array\n ): void {\n let group = this.fragmentGroups.get(frameId);\n if (!group) {\n group = {\n frameId,\n total: fragTotal,\n received: new Map(),\n createdAt: Date.now(),\n };\n this.fragmentGroups.set(frameId, group);\n }\n\n group.received.set(fragIndex, payload.slice()); // slice to own the data\n\n // Check if complete\n if (group.received.size === group.total) {\n // Reassemble in order\n let totalLen = 0;\n for (let i = 0; i < group.total; i++) {\n totalLen += group.received.get(i)!.length;\n }\n\n const reassembled = new Uint8Array(totalLen);\n let offset = 0;\n for (let i = 0; i < group.total; i++) {\n const frag = group.received.get(i)!;\n reassembled.set(frag, offset);\n offset += frag.length;\n }\n\n this.fragmentGroups.delete(frameId);\n this.handleReassembledFrame(reassembled);\n }\n\n // Clean up stale fragment groups (>5 seconds old)\n if (this.fragmentGroups.size > 100) {\n const cutoff = Date.now() - 5000;\n for (const [id, g] of this.fragmentGroups) {\n if (g.createdAt < cutoff) {\n this.fragmentGroups.delete(id);\n }\n }\n }\n }\n\n /**\n * Handle a complete (reassembled) flow frame.\n * This is where we do out-of-order reassembly using the stream_id + sequence.\n */\n private handleReassembledFrame(data: Uint8Array): void {\n // Check if this is an ACK frame (internal to UDP transport)\n if (data.length >= HEADER_SIZE) {\n const flags = data[6];\n if (flags & ACK_FLAG) {\n this.handleAck(data);\n return;\n }\n }\n\n // Decode the flow frame to get stream_id + sequence for reassembly\n let frame: FlowFrame;\n try {\n const result = this.codec.decode(data);\n frame = result.frame;\n } catch {\n return; // Malformed\n }\n\n // Track received sequence for ACK generation\n if (this.config.reliable) {\n let seqSet = this.receivedPerStream.get(frame.streamId);\n if (!seqSet) {\n seqSet = new Set();\n this.receivedPerStream.set(frame.streamId, seqSet);\n }\n seqSet.add(frame.sequence);\n }\n\n // Push through the reassembler for ordering\n const deliverable = this.reassembler.push(frame);\n\n // Deliver ordered frames to the protocol layer\n for (const orderedFrame of deliverable) {\n // Re-encode to binary for the FlowTransport interface\n // (the protocol layer expects raw bytes it can decode itself)\n const encoded = this.codec.encode(orderedFrame);\n if (this.receiveHandler) {\n this.receiveHandler(encoded);\n }\n }\n }\n\n // ─── Internal: fragmentation ───────────────────────────────────────────\n\n /**\n * Wrap a flow frame chunk in a fragment header.\n */\n private wrapFragment(\n frameId: number,\n fragIndex: number,\n fragTotal: number,\n payload: Uint8Array\n ): Uint8Array {\n const datagram = new Uint8Array(FRAGMENT_HEADER_SIZE + payload.length);\n const view = new DataView(datagram.buffer);\n view.setUint16(0, frameId);\n datagram[2] = fragIndex;\n datagram[3] = fragTotal;\n datagram.set(payload, FRAGMENT_HEADER_SIZE);\n return datagram;\n }\n\n /**\n * Send a UDP datagram to the remote endpoint.\n */\n private sendDatagram(data: Uint8Array): void {\n if (!this.socket || !this.config.remoteHost) return;\n this.socket.send(data, this.config.remoteHost, this.config.remotePort);\n }\n\n // ─── Internal: reliability ─────────────────────────────────────────────\n\n /**\n * Track a sent frame for potential retransmission.\n */\n private trackInflight(data: Uint8Array, frameId: number): void {\n if (!this.config.reliable) return;\n\n // Extract stream_id and sequence from the flow frame\n if (data.length < HEADER_SIZE) return;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const streamId = view.getUint16(0);\n const sequence = view.getUint32(2);\n\n const key = `${streamId}:${sequence}`;\n this.inflight.set(key, {\n data: data.slice(),\n streamId,\n sequence,\n sentAt: Date.now(),\n retransmits: 0,\n });\n\n this.inflightCount++;\n }\n\n /**\n * Handle an incoming ACK frame.\n *\n * ACK payload format:\n * [stream_id:u16][base_seq:u32][bitmap_hi:u32][bitmap_lo:u32]\n * (can repeat for multiple streams)\n */\n private handleAck(data: Uint8Array): void {\n // Skip the 10-byte flow header\n const payload = data.subarray(HEADER_SIZE);\n const view = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);\n\n for (let offset = 0; offset + 14 <= payload.length; offset += 14) {\n const streamId = view.getUint16(offset);\n const baseSeq = view.getUint32(offset + 2);\n const bitmapHi = view.getUint32(offset + 6);\n const bitmapLo = view.getUint32(offset + 10);\n\n // Check each bit in the bitmap\n for (let bit = 0; bit < 64; bit++) {\n const seq = baseSeq + bit;\n const isAcked = bit < 32\n ? (bitmapLo & (1 << bit)) !== 0\n : (bitmapHi & (1 << (bit - 32))) !== 0;\n\n if (isAcked) {\n const key = `${streamId}:${seq}`;\n if (this.inflight.has(key)) {\n this.inflight.delete(key);\n this.inflightCount--;\n\n // Congestion control: ACK received, increase window\n if (this.cwnd < MAX_CWND) {\n this.cwnd += 1 / this.cwnd; // AIMD additive increase\n }\n }\n }\n }\n }\n }\n\n /**\n * Send ACK bitmaps for all received sequences.\n */\n private sendAcks(): void {\n if (this.receivedPerStream.size === 0) return;\n\n const ackEntries: Uint8Array[] = [];\n\n for (const [streamId, seqSet] of this.receivedPerStream) {\n if (seqSet.size === 0) continue;\n\n // Find the base sequence (lowest)\n let baseSeq = Infinity;\n for (const seq of seqSet) {\n if (seq < baseSeq) baseSeq = seq;\n }\n\n // Build bitmap for [baseSeq .. baseSeq+63]\n let bitmapHi = 0;\n let bitmapLo = 0;\n\n for (const seq of seqSet) {\n const bit = seq - baseSeq;\n if (bit >= 0 && bit < 64) {\n if (bit < 32) {\n bitmapLo |= (1 << bit);\n } else {\n bitmapHi |= (1 << (bit - 32));\n }\n }\n }\n\n // Encode: [stream_id:u16][base_seq:u32][bitmap_hi:u32][bitmap_lo:u32]\n const entry = new Uint8Array(14);\n const view = new DataView(entry.buffer);\n view.setUint16(0, streamId);\n view.setUint32(2, baseSeq);\n view.setUint32(6, bitmapHi);\n view.setUint32(10, bitmapLo);\n ackEntries.push(entry);\n\n // Trim old sequences\n if (seqSet.size > 128) {\n const cutoff = baseSeq + 64;\n for (const seq of seqSet) {\n if (seq < cutoff) seqSet.delete(seq);\n }\n }\n }\n\n if (ackEntries.length === 0) return;\n\n // Combine all ACK entries into one payload\n let totalLen = 0;\n for (const e of ackEntries) totalLen += e.length;\n const payload = new Uint8Array(totalLen);\n let offset = 0;\n for (const e of ackEntries) {\n payload.set(e, offset);\n offset += e.length;\n }\n\n // Encode as a flow frame with ACK_FLAG\n const ackFrame = this.codec.encode({\n streamId: 0xFFFF, // Reserved stream for transport-level control\n sequence: 0,\n flags: ACK_FLAG,\n payload,\n });\n\n // Send as a single datagram (ACKs are always small)\n const datagram = this.wrapFragment(\n this.nextFrameId++ & 0xFFFF,\n 0,\n 1,\n ackFrame\n );\n this.sendDatagram(datagram);\n }\n\n /**\n * Retransmit frames that haven't been ACKed.\n */\n private retransmitLost(): void {\n const now = Date.now();\n\n for (const [key, frame] of this.inflight) {\n if (now - frame.sentAt > RETRANSMIT_TIMEOUT_MS) {\n if (frame.retransmits >= 5) {\n // Give up after 5 retransmits\n this.inflight.delete(key);\n this.inflightCount--;\n\n // Congestion control: loss detected, halve window\n this.cwnd = Math.max(INITIAL_CWND, Math.floor(this.cwnd / 2));\n continue;\n }\n\n // Retransmit\n frame.retransmits++;\n frame.sentAt = now;\n\n const frameId = this.nextFrameId++ & 0xFFFF;\n const maxPayload = this.config.mtu - FRAGMENT_HEADER_SIZE;\n\n if (frame.data.length <= maxPayload) {\n const datagram = this.wrapFragment(frameId, 0, 1, frame.data);\n this.sendDatagram(datagram);\n } else {\n const totalFragments = Math.ceil(frame.data.length / maxPayload);\n for (let i = 0; i < totalFragments; i++) {\n const start = i * maxPayload;\n const end = Math.min(start + maxPayload, frame.data.length);\n const chunk = frame.data.slice(start, end);\n const datagram = this.wrapFragment(frameId, i, totalFragments, chunk);\n this.sendDatagram(datagram);\n }\n }\n\n // Congestion control: retransmit = loss indicator\n this.cwnd = Math.max(INITIAL_CWND, Math.floor(this.cwnd / 2));\n }\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// UDP Socket Abstraction (Node/Bun dgram)\n// ═══════════════════════════════════════════════════════════════════════════════\n\ninterface RemoteInfo {\n address: string;\n port: number;\n}\n\ninterface UDPSocket {\n send(data: Uint8Array, host: string, port: number): void;\n onMessage(handler: (data: Uint8Array, rinfo: RemoteInfo) => void): void;\n close(): void;\n}\n\n/**\n * Create a UDP socket. Uses Node/Bun dgram module.\n */\nasync function createUDPSocket(host: string, port: number): Promise<UDPSocket> {\n // Dynamic import for Node/Bun dgram (not available in browser/CF Workers)\n const dgram = await import('dgram');\n const socket = dgram.createSocket('udp4');\n\n return new Promise((resolve, reject) => {\n socket.on('error', (err: Error) => reject(err));\n\n socket.bind(port, host, () => {\n const udpSocket: UDPSocket = {\n send(data: Uint8Array, remoteHost: string, remotePort: number) {\n socket.send(data, 0, data.length, remotePort, remoteHost);\n },\n onMessage(handler: (data: Uint8Array, rinfo: RemoteInfo) => void) {\n socket.on('message', (msg: Buffer, rinfo: { address: string; port: number }) => {\n handler(new Uint8Array(msg), { address: rinfo.address, port: rinfo.port });\n });\n },\n close() {\n socket.close();\n },\n };\n resolve(udpSocket);\n });\n });\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// WebTransport Adapter (Browser — HTTP/3 unreliable datagrams)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * WebTransport-based FlowTransport for browsers.\n *\n * WebTransport (HTTP/3) provides unreliable datagrams — essentially UDP\n * from the browser. This adapter wraps WebTransport's datagram API with\n * the same fragmentation and reassembly used by UDPFlowTransport.\n *\n * Usage:\n * const transport = await WebTransportFlowTransport.connect(\n * 'https://site.example.com/.aeon/udp'\n * );\n * const protocol = new AeonFlowProtocol(transport, { role: 'client' });\n */\nexport class WebTransportFlowTransport implements FlowTransport {\n private wt: any; // WebTransport instance (typed as any for portability)\n private writer: any;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private reassembler: FrameReassembler;\n private fragmentGroups = new Map<number, FragmentGroup>();\n private nextFrameId = 0;\n private codec = FlowCodec.createSync();\n\n private constructor(wt: any) {\n this.wt = wt;\n this.reassembler = new FrameReassembler();\n }\n\n /**\n * Connect to a WebTransport endpoint and return a FlowTransport.\n */\n static async connect(url: string): Promise<WebTransportFlowTransport> {\n // WebTransport is a browser API — check availability\n if (typeof (globalThis as any).WebTransport === 'undefined') {\n throw new Error('WebTransport not available in this environment');\n }\n\n const wt = new (globalThis as any).WebTransport(url);\n await wt.ready;\n\n const transport = new WebTransportFlowTransport(wt);\n transport.writer = wt.datagrams.writable.getWriter();\n\n // Start reading datagrams\n transport.readLoop(wt.datagrams.readable.getReader());\n\n return transport;\n }\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n const maxPayload = UDP_MTU - FRAGMENT_HEADER_SIZE;\n\n if (data.length <= maxPayload) {\n const frameId = this.nextFrameId++ & 0xFFFF;\n const datagram = new Uint8Array(FRAGMENT_HEADER_SIZE + data.length);\n const view = new DataView(datagram.buffer);\n view.setUint16(0, frameId);\n datagram[2] = 0;\n datagram[3] = 1;\n datagram.set(data, FRAGMENT_HEADER_SIZE);\n this.writer.write(datagram).catch(() => {});\n } else {\n const frameId = this.nextFrameId++ & 0xFFFF;\n const totalFragments = Math.ceil(data.length / maxPayload);\n if (totalFragments > 255) return;\n\n for (let i = 0; i < totalFragments; i++) {\n const start = i * maxPayload;\n const end = Math.min(start + maxPayload, data.length);\n const chunk = data.slice(start, end);\n const datagram = new Uint8Array(FRAGMENT_HEADER_SIZE + chunk.length);\n const view = new DataView(datagram.buffer);\n view.setUint16(0, frameId);\n datagram[2] = i;\n datagram[3] = totalFragments;\n datagram.set(chunk, FRAGMENT_HEADER_SIZE);\n this.writer.write(datagram).catch(() => {});\n }\n }\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.wt.close();\n this.receiveHandler = null;\n }\n\n private async readLoop(reader: any): Promise<void> {\n try {\n while (!this.closed) {\n const { value, done } = await reader.read();\n if (done) break;\n\n const data = new Uint8Array(value);\n if (data.length < FRAGMENT_HEADER_SIZE) continue;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const frameId = view.getUint16(0);\n const fragIndex = data[2];\n const fragTotal = data[3];\n const payload = data.subarray(FRAGMENT_HEADER_SIZE);\n\n let reassembled: Uint8Array;\n\n if (fragTotal === 1) {\n reassembled = payload;\n } else {\n let group = this.fragmentGroups.get(frameId);\n if (!group) {\n group = { frameId, total: fragTotal, received: new Map(), createdAt: Date.now() };\n this.fragmentGroups.set(frameId, group);\n }\n group.received.set(fragIndex, payload.slice());\n\n if (group.received.size < group.total) continue;\n\n let totalLen = 0;\n for (let i = 0; i < group.total; i++) totalLen += group.received.get(i)!.length;\n reassembled = new Uint8Array(totalLen);\n let offset = 0;\n for (let i = 0; i < group.total; i++) {\n const frag = group.received.get(i)!;\n reassembled.set(frag, offset);\n offset += frag.length;\n }\n this.fragmentGroups.delete(frameId);\n }\n\n // Decode flow frame and push through reassembler\n try {\n const result = this.codec.decode(reassembled);\n const deliverable = this.reassembler.push(result.frame);\n for (const frame of deliverable) {\n const encoded = this.codec.encode(frame);\n if (this.receiveHandler) {\n this.receiveHandler(encoded);\n }\n }\n } catch {\n // Malformed frame\n }\n }\n } catch {\n // Stream closed\n }\n }\n}\n","/**\n * DashRelay Flow Transport\n *\n * FlowTransport adapter for DashRelay WebSocket relay.\n * THE backbone transport — all Aeon data flows through DashRelay.\n *\n * DashRelay provides:\n * - Room-based pub/sub (peers join rooms by name)\n * - Binary broadcast to all peers in a room\n * - Peer discovery (join/leave events)\n * - Auth via API key or UCAN token\n * - Automatic reconnection with exponential backoff\n *\n * This transport wraps DashRelay's broadcast/message system as a\n * FlowTransport interface, enabling flow protocol (fork/race/collapse)\n * over the relay mesh. Every app in the stack — forge sites, shell,\n * inference, presence, CRDT sync — speaks Aeon flow protocol over\n * DashRelay internally. HTTP is just the normie projection.\n *\n * Two modes:\n * 1. **Room broadcast**: All peers in the room receive all flow frames.\n * Good for mesh networking, federated inference, presence.\n * 2. **Directed**: Flow frames include a target peer ID header.\n * Good for point-to-point within a room (shell ↔ specific forge site).\n *\n * The transport is DashRelay-client agnostic — it takes a minimal\n * interface so it works with any DashRelay client implementation.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Minimal DashRelay client interface.\n * Works with @dashrelay/client or any compatible implementation.\n */\nexport interface DashRelayLike {\n /** Broadcast binary data to all peers in the room */\n broadcast(payload: Uint8Array): void;\n /** Register handler for incoming messages */\n on(event: 'message', handler: (senderId: string, payload: Uint8Array) => void): void;\n /** Unregister handler */\n off(event: 'message', handler: (senderId: string, payload: Uint8Array) => void): void;\n /** Peer events */\n on(event: 'peerJoined', handler: (peerId: string) => void): void;\n on(event: 'peerLeft', handler: (peerId: string) => void): void;\n off(event: 'peerJoined', handler: (peerId: string) => void): void;\n off(event: 'peerLeft', handler: (peerId: string) => void): void;\n /** Connection events */\n on(event: 'connected', handler: () => void): void;\n on(event: 'disconnected', handler: () => void): void;\n off(event: 'connected', handler: () => void): void;\n off(event: 'disconnected', handler: () => void): void;\n}\n\nexport interface DashRelayFlowConfig {\n /** Target specific peer (directed mode) or broadcast to all (default) */\n targetPeerId?: string;\n /** This peer's ID (for filtering own messages) */\n localPeerId?: string;\n /** Channel tag for multiplexing multiple flow protocols in one room */\n channel?: string;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Wire Envelope\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Envelope for flow frames over DashRelay broadcast.\n *\n * Format (binary):\n * [0] u8 version (0x01)\n * [1] u8 flags (0x01 = directed, 0x02 = has-channel)\n * [2-5] u32 target peer ID length (0 if broadcast)\n * [6-9] u32 channel length (0 if no channel)\n * [...] target peer ID bytes (if directed)\n * [...] channel bytes (if has-channel)\n * [...] flow frame payload\n */\nconst ENVELOPE_VERSION = 0x01;\nconst FLAG_DIRECTED = 0x01;\nconst FLAG_HAS_CHANNEL = 0x02;\n\nfunction encodeEnvelope(\n payload: Uint8Array,\n targetPeerId?: string,\n channel?: string\n): Uint8Array {\n const encoder = new TextEncoder();\n const targetBytes = targetPeerId ? encoder.encode(targetPeerId) : new Uint8Array(0);\n const channelBytes = channel ? encoder.encode(channel) : new Uint8Array(0);\n\n let flags = 0;\n if (targetPeerId) flags |= FLAG_DIRECTED;\n if (channel) flags |= FLAG_HAS_CHANNEL;\n\n const headerSize = 10; // version(1) + flags(1) + targetLen(4) + channelLen(4)\n const totalSize = headerSize + targetBytes.byteLength + channelBytes.byteLength + payload.byteLength;\n const envelope = new Uint8Array(totalSize);\n const view = new DataView(envelope.buffer);\n\n envelope[0] = ENVELOPE_VERSION;\n envelope[1] = flags;\n view.setUint32(2, targetBytes.byteLength, false);\n view.setUint32(6, channelBytes.byteLength, false);\n\n let offset = headerSize;\n envelope.set(targetBytes, offset);\n offset += targetBytes.byteLength;\n envelope.set(channelBytes, offset);\n offset += channelBytes.byteLength;\n envelope.set(payload, offset);\n\n return envelope;\n}\n\nfunction decodeEnvelope(data: Uint8Array): {\n target: string | null;\n channel: string | null;\n payload: Uint8Array;\n} | null {\n if (data.byteLength < 10) return null;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n\n if (data[0] !== ENVELOPE_VERSION) return null;\n\n const flags = data[1];\n const targetLen = view.getUint32(2, false);\n const channelLen = view.getUint32(6, false);\n\n const headerSize = 10;\n if (data.byteLength < headerSize + targetLen + channelLen) return null;\n\n const decoder = new TextDecoder();\n let offset = headerSize;\n\n const target = (flags & FLAG_DIRECTED)\n ? decoder.decode(data.subarray(offset, offset + targetLen))\n : null;\n offset += targetLen;\n\n const channel = (flags & FLAG_HAS_CHANNEL)\n ? decoder.decode(data.subarray(offset, offset + channelLen))\n : null;\n offset += channelLen;\n\n const payload = data.subarray(offset);\n\n return { target, channel, payload };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// DashRelay FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over DashRelay broadcast.\n *\n * All peers in a DashRelay room receive flow frames.\n * In directed mode, frames include a target peer ID and\n * non-target peers ignore them.\n *\n * This is the primary transport for the Aeon stack.\n * Everything talks Aeon internally over DashRelay.\n */\nexport class DashRelayFlowTransport implements FlowTransport {\n private relay: DashRelayLike;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private config: DashRelayFlowConfig;\n private peerHandler: ((senderId: string, payload: Uint8Array) => void) | null = null;\n\n /** Connected peers observed via relay events */\n private peers = new Set<string>();\n private peerJoinHandler: ((peerId: string) => void) | null = null;\n private peerLeaveHandler: ((peerId: string) => void) | null = null;\n\n /** Optional handlers for peer lifecycle events */\n onPeerJoin: ((peerId: string) => void) | null = null;\n onPeerLeave: ((peerId: string) => void) | null = null;\n\n constructor(relay: DashRelayLike, config?: DashRelayFlowConfig) {\n this.relay = relay;\n this.config = config ?? {};\n\n // Wire up message handler\n this.peerHandler = (senderId: string, payload: Uint8Array) => {\n if (!this.receiveHandler) return;\n\n // Ignore own messages\n if (this.config.localPeerId && senderId === this.config.localPeerId) return;\n\n // Decode envelope\n const envelope = decodeEnvelope(payload);\n if (!envelope) return;\n\n // Check if directed to us\n if (envelope.target && this.config.localPeerId && envelope.target !== this.config.localPeerId) {\n return; // Not for us\n }\n\n // Check channel match\n if (this.config.channel && envelope.channel !== this.config.channel) {\n return; // Wrong channel\n }\n\n this.receiveHandler(envelope.payload);\n };\n\n relay.on('message', this.peerHandler);\n\n // Track peers\n this.peerJoinHandler = (peerId: string) => {\n this.peers.add(peerId);\n this.onPeerJoin?.(peerId);\n };\n\n this.peerLeaveHandler = (peerId: string) => {\n this.peers.delete(peerId);\n this.onPeerLeave?.(peerId);\n };\n\n relay.on('peerJoined', this.peerJoinHandler);\n relay.on('peerLeft', this.peerLeaveHandler);\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n const envelope = encodeEnvelope(\n data,\n this.config.targetPeerId,\n this.config.channel\n );\n\n this.relay.broadcast(envelope);\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.peerHandler) {\n this.relay.off('message', this.peerHandler);\n }\n if (this.peerJoinHandler) {\n this.relay.off('peerJoined', this.peerJoinHandler);\n }\n if (this.peerLeaveHandler) {\n this.relay.off('peerLeft', this.peerLeaveHandler);\n }\n\n this.receiveHandler = null;\n this.onPeerJoin = null;\n this.onPeerLeave = null;\n }\n\n // ─── Peer awareness ───────────────────────────────────────────────\n\n /** Get all known peers in the room */\n getPeers(): string[] {\n return Array.from(this.peers);\n }\n\n /** Number of peers in the room */\n get peerCount(): number {\n return this.peers.size;\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n\n /** Send to a specific peer (overrides config.targetPeerId for this call) */\n sendTo(peerId: string, data: Uint8Array): void {\n if (this.closed) return;\n\n const envelope = encodeEnvelope(data, peerId, this.config.channel);\n this.relay.broadcast(envelope);\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Factory: Create Flow over DashRelay room\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a FlowTransport connected to a DashRelay room.\n *\n * This is the standard way to establish Aeon flow protocol\n * over the relay mesh. Use channels to multiplex different\n * flow protocols within the same room.\n *\n * @param relay - Connected DashRelay client instance\n * @param channel - Optional channel tag for multiplexing\n * @param config - Optional transport configuration\n */\nexport function createDashRelayFlow(\n relay: DashRelayLike,\n channel?: string,\n config?: Omit<DashRelayFlowConfig, 'channel'>\n): DashRelayFlowTransport {\n return new DashRelayFlowTransport(relay, { ...config, channel });\n}\n","/**\n * Bluetooth Flow Transport\n *\n * FlowTransport adapter for Web Bluetooth API.\n * Enables flow protocol over BLE between nearby devices —\n * the mesh networking primitive for federated inference.\n *\n * Two devices running aeon-flux can fork/race inference across\n * both browsers via Bluetooth, zero cloud cost.\n *\n * Uses GATT characteristics for binary frame exchange:\n * - TX characteristic: this device writes flow frames\n * - RX characteristic: this device reads flow frames\n *\n * MTU-aware: fragments large FlowFrames across multiple BLE writes.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Web Bluetooth API type declarations\n// These are not included in standard lib.dom.d.ts — declared here to avoid\n// adding a devDependency on @types/web-bluetooth.\n// ═══════════════════════════════════════════════════════════════════════════════\n\ndeclare global {\n interface BluetoothLEScanFilter {\n services?: BluetoothServiceUUID[];\n name?: string;\n namePrefix?: string;\n }\n\n type BluetoothServiceUUID = string | number;\n\n interface BluetoothDevice extends EventTarget {\n readonly id: string;\n readonly name?: string;\n readonly gatt?: BluetoothRemoteGATTServer;\n }\n\n interface BluetoothRemoteGATTServer {\n readonly connected: boolean;\n readonly device: BluetoothDevice;\n connect(): Promise<BluetoothRemoteGATTServer>;\n disconnect(): void;\n getPrimaryService(service: BluetoothServiceUUID): Promise<BluetoothRemoteGATTService>;\n }\n\n interface BluetoothRemoteGATTService {\n readonly device: BluetoothDevice;\n readonly uuid: string;\n getCharacteristic(characteristic: string): Promise<BluetoothRemoteGATTCharacteristic>;\n }\n\n interface BluetoothRemoteGATTCharacteristic extends EventTarget {\n readonly service: BluetoothRemoteGATTService;\n readonly uuid: string;\n readonly value: DataView | null;\n writeValueWithoutResponse(value: BufferSource): Promise<void>;\n startNotifications(): Promise<BluetoothRemoteGATTCharacteristic>;\n stopNotifications(): Promise<BluetoothRemoteGATTCharacteristic>;\n }\n\n interface RequestDeviceOptions {\n filters?: BluetoothLEScanFilter[];\n optionalServices?: BluetoothServiceUUID[];\n acceptAllDevices?: boolean;\n }\n\n interface Bluetooth {\n requestDevice(options: RequestDeviceOptions): Promise<BluetoothDevice>;\n }\n\n interface Navigator {\n bluetooth: Bluetooth;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Aeon Flow BLE Service UUID */\nexport const AEON_FLOW_SERVICE_UUID = '0000af10-0000-1000-8000-00805f9b34fb';\n/** TX Characteristic — write flow frames */\nexport const AEON_FLOW_TX_UUID = '0000af11-0000-1000-8000-00805f9b34fb';\n/** RX Characteristic — receive flow frames (notify) */\nexport const AEON_FLOW_RX_UUID = '0000af12-0000-1000-8000-00805f9b34fb';\n\n/** Default BLE MTU minus ATT overhead */\nconst DEFAULT_MTU = 512 - 3;\n\n/** Frame boundary marker (4 bytes) to reassemble fragmented frames */\nconst FRAME_BOUNDARY = new Uint8Array([0xAE, 0x0F, 0x10, 0xFF]);\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface BluetoothFlowConfig {\n /** BLE MTU (default: 509, negotiated at connection time) */\n mtu?: number;\n /** Service UUID override */\n serviceUuid?: string;\n /** Optional name filter for device discovery */\n namePrefix?: string;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Bluetooth FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over Web Bluetooth GATT.\n *\n * Fragments flow frames to fit within BLE MTU, reassembles on receive.\n * Uses notifications on RX characteristic for incoming frames.\n */\nexport class BluetoothFlowTransport implements FlowTransport {\n private device: BluetoothDevice | null = null;\n private txChar: BluetoothRemoteGATTCharacteristic | null = null;\n private rxChar: BluetoothRemoteGATTCharacteristic | null = null;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private mtu: number;\n private closed = false;\n\n /** Reassembly buffer for fragmented incoming frames */\n private rxBuffer: Uint8Array[] = [];\n\n constructor(private config: BluetoothFlowConfig = {}) {\n this.mtu = config.mtu ?? DEFAULT_MTU;\n }\n\n /**\n * Scan for and connect to a nearby Aeon device.\n * Returns the connected device name.\n */\n async connect(): Promise<string> {\n const serviceUuid = this.config.serviceUuid ?? AEON_FLOW_SERVICE_UUID;\n\n const filters: BluetoothLEScanFilter[] = [];\n if (this.config.namePrefix) {\n filters.push({ namePrefix: this.config.namePrefix });\n }\n filters.push({ services: [serviceUuid] });\n\n this.device = await navigator.bluetooth.requestDevice({\n filters,\n optionalServices: [serviceUuid],\n });\n\n if (!this.device.gatt) {\n throw new Error('GATT not available on device');\n }\n\n const server = await this.device.gatt.connect();\n const service = await server.getPrimaryService(serviceUuid);\n\n this.txChar = await service.getCharacteristic(\n this.config.serviceUuid ? AEON_FLOW_TX_UUID : AEON_FLOW_TX_UUID\n );\n this.rxChar = await service.getCharacteristic(AEON_FLOW_RX_UUID);\n\n // Start notifications on RX\n await this.rxChar.startNotifications();\n this.rxChar.addEventListener(\n 'characteristicvaluechanged',\n this.handleRxNotification\n );\n\n // Handle disconnection\n this.device.addEventListener('gattserverdisconnected', () => {\n this.closed = true;\n this.receiveHandler = null;\n });\n\n return this.device.name || this.device.id;\n }\n\n /**\n * Create from an already-connected GATT server (for peripheral/server mode).\n */\n static fromCharacteristics(\n tx: BluetoothRemoteGATTCharacteristic,\n rx: BluetoothRemoteGATTCharacteristic,\n config?: BluetoothFlowConfig\n ): BluetoothFlowTransport {\n const transport = new BluetoothFlowTransport(config);\n transport.txChar = tx;\n transport.rxChar = rx;\n\n rx.addEventListener(\n 'characteristicvaluechanged',\n transport.handleRxNotification\n );\n\n return transport;\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed || !this.txChar) return;\n\n // Fragment if data exceeds MTU\n const fragmentSize = this.mtu - FRAME_BOUNDARY.length;\n\n if (data.byteLength <= fragmentSize) {\n // Fits in one write — send with boundary marker\n const packet = new Uint8Array(data.byteLength + FRAME_BOUNDARY.length);\n packet.set(data);\n packet.set(FRAME_BOUNDARY, data.byteLength);\n this.writeCharacteristic(packet);\n } else {\n // Fragment across multiple writes\n let offset = 0;\n while (offset < data.byteLength) {\n const chunkSize = Math.min(fragmentSize, data.byteLength - offset);\n const isLast = offset + chunkSize >= data.byteLength;\n const chunk = data.subarray(offset, offset + chunkSize);\n\n if (isLast) {\n // Last fragment gets boundary marker\n const packet = new Uint8Array(chunk.byteLength + FRAME_BOUNDARY.length);\n packet.set(chunk);\n packet.set(FRAME_BOUNDARY, chunk.byteLength);\n this.writeCharacteristic(packet);\n } else {\n // Intermediate fragment — no boundary\n this.writeCharacteristic(chunk);\n }\n\n offset += chunkSize;\n }\n }\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.rxChar) {\n this.rxChar.removeEventListener(\n 'characteristicvaluechanged',\n this.handleRxNotification\n );\n this.rxChar.stopNotifications().catch(() => {});\n }\n\n if (this.device?.gatt?.connected) {\n this.device.gatt.disconnect();\n }\n\n this.receiveHandler = null;\n this.rxBuffer = [];\n }\n\n /** Whether Bluetooth is connected */\n get isConnected(): boolean {\n return !this.closed && !!this.device?.gatt?.connected;\n }\n\n // ─── Internal ──────────────────────────────────────────────────────\n\n private async writeCharacteristic(data: Uint8Array): Promise<void> {\n if (!this.txChar) return;\n\n try {\n await this.txChar.writeValueWithoutResponse(data);\n } catch {\n // Write failed — BLE disconnected or busy\n }\n }\n\n private handleRxNotification = (event: Event): void => {\n const target = event.target as BluetoothRemoteGATTCharacteristic;\n if (!target.value) return;\n\n const chunk = new Uint8Array(target.value.buffer);\n\n // Check if chunk ends with frame boundary\n if (this.endsWithBoundary(chunk)) {\n // Complete frame (or last fragment)\n const frameData = chunk.subarray(0, chunk.byteLength - FRAME_BOUNDARY.length);\n\n if (this.rxBuffer.length > 0) {\n // Reassemble fragments\n this.rxBuffer.push(frameData);\n const totalLen = this.rxBuffer.reduce((s, b) => s + b.byteLength, 0);\n const assembled = new Uint8Array(totalLen);\n let offset = 0;\n for (const buf of this.rxBuffer) {\n assembled.set(buf, offset);\n offset += buf.byteLength;\n }\n this.rxBuffer = [];\n this.receiveHandler?.(assembled);\n } else {\n // Single-packet frame\n this.receiveHandler?.(frameData);\n }\n } else {\n // Intermediate fragment — buffer it\n this.rxBuffer.push(chunk);\n }\n };\n\n private endsWithBoundary(data: Uint8Array): boolean {\n if (data.byteLength < FRAME_BOUNDARY.length) return false;\n const tail = data.subarray(data.byteLength - FRAME_BOUNDARY.length);\n return (\n tail[0] === FRAME_BOUNDARY[0] &&\n tail[1] === FRAME_BOUNDARY[1] &&\n tail[2] === FRAME_BOUNDARY[2] &&\n tail[3] === FRAME_BOUNDARY[3]\n );\n }\n}\n","/**\n * WebRTC Flow Transport\n *\n * FlowTransport adapter for WebRTC DataChannel.\n * Enables flow protocol between browsers via DashRelay signaling —\n * the foundation for federated browser inference.\n *\n * Two devices open a DataChannel via DashRelay as the signaling layer,\n * then speak flow protocol directly peer-to-peer. The fork/race/collapse\n * primitives work across the mesh — inference forked to N peers,\n * fastest result wins.\n *\n * Binary-mode DataChannel: no base64, no JSON wrapping.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface WebRTCFlowConfig {\n /** DashRelay signaling URL (default: wss://relay.dashrelay.com) */\n signalingUrl?: string;\n /** Room ID for peer discovery */\n roomId: string;\n /** This peer's ID */\n peerId?: string;\n /** ICE servers (default: Google STUN) */\n iceServers?: RTCIceServer[];\n /** DataChannel label */\n channelLabel?: string;\n /** Max buffered amount before backpressure (default: 16MB) */\n maxBufferedAmount?: number;\n}\n\nexport interface SignalingMessage {\n type: 'offer' | 'answer' | 'ice-candidate';\n from: string;\n to: string;\n payload: RTCSessionDescriptionInit | RTCIceCandidateInit;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// WebRTC FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over WebRTC DataChannel.\n *\n * Uses DashRelay WebSocket for signaling (offer/answer/ICE exchange),\n * then establishes a direct peer-to-peer DataChannel for binary\n * flow frame exchange.\n */\nexport class WebRTCFlowTransport implements FlowTransport {\n private pc: RTCPeerConnection | null = null;\n private dc: RTCDataChannel | null = null;\n private signalingWs: WebSocket | null = null;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private peerId: string;\n private config: WebRTCFlowConfig;\n private maxBufferedAmount: number;\n\n constructor(config: WebRTCFlowConfig) {\n this.config = config;\n this.peerId = config.peerId ?? crypto.randomUUID();\n this.maxBufferedAmount = config.maxBufferedAmount ?? 16 * 1024 * 1024;\n }\n\n /**\n * Initialize as the offering peer (initiator).\n * Connects to signaling, creates offer, waits for answer.\n */\n async offer(): Promise<void> {\n await this.connectSignaling();\n\n this.pc = new RTCPeerConnection({\n iceServers: this.config.iceServers ?? [\n { urls: 'stun:stun.l.google.com:19302' },\n ],\n });\n\n // Create DataChannel\n const label = this.config.channelLabel ?? 'aeon-flow';\n this.dc = this.pc.createDataChannel(label, {\n ordered: true,\n protocol: 'aeon-flow',\n });\n this.dc.binaryType = 'arraybuffer';\n this.wireDataChannel(this.dc);\n\n // ICE candidates\n this.pc.onicecandidate = (event) => {\n if (event.candidate) {\n this.sendSignaling({\n type: 'ice-candidate',\n from: this.peerId,\n to: '*',\n payload: event.candidate.toJSON(),\n });\n }\n };\n\n // Create and send offer\n const offer = await this.pc.createOffer();\n await this.pc.setLocalDescription(offer);\n\n this.sendSignaling({\n type: 'offer',\n from: this.peerId,\n to: '*',\n payload: offer,\n });\n }\n\n /**\n * Initialize as the answering peer (responder).\n * Waits for an offer, creates answer.\n */\n async answer(): Promise<void> {\n await this.connectSignaling();\n\n this.pc = new RTCPeerConnection({\n iceServers: this.config.iceServers ?? [\n { urls: 'stun:stun.l.google.com:19302' },\n ],\n });\n\n // ICE candidates\n this.pc.onicecandidate = (event) => {\n if (event.candidate) {\n this.sendSignaling({\n type: 'ice-candidate',\n from: this.peerId,\n to: '*',\n payload: event.candidate.toJSON(),\n });\n }\n };\n\n // Wait for incoming DataChannel\n this.pc.ondatachannel = (event) => {\n this.dc = event.channel;\n this.dc.binaryType = 'arraybuffer';\n this.wireDataChannel(this.dc);\n };\n\n // Wait for offer via signaling\n // (handled in signaling message handler)\n }\n\n /**\n * Wait until the DataChannel is open and ready.\n */\n async waitForOpen(): Promise<void> {\n if (this.dc?.readyState === 'open') return;\n\n return new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('WebRTC DataChannel open timeout'));\n }, 30_000);\n\n const check = () => {\n if (this.dc?.readyState === 'open') {\n clearTimeout(timeout);\n resolve();\n }\n };\n\n // Poll — DataChannel events may have already fired\n const interval = setInterval(check, 100);\n check();\n\n // Also listen for the open event\n if (this.dc) {\n const onOpen = () => {\n clearTimeout(timeout);\n clearInterval(interval);\n resolve();\n };\n this.dc.addEventListener('open', onOpen, { once: true });\n }\n });\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed || !this.dc) return;\n\n if (this.dc.readyState !== 'open') return;\n\n // Backpressure: check buffered amount\n if (this.dc.bufferedAmount > this.maxBufferedAmount) {\n console.warn('[aeon-webrtc] DataChannel buffer full, dropping frame');\n return;\n }\n\n this.dc.send(data);\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n this.dc?.close();\n this.pc?.close();\n this.signalingWs?.close();\n\n this.receiveHandler = null;\n this.dc = null;\n this.pc = null;\n this.signalingWs = null;\n }\n\n /** Whether the DataChannel is open */\n get isOpen(): boolean {\n return !this.closed && this.dc?.readyState === 'open';\n }\n\n /** Get this peer's ID */\n get id(): string {\n return this.peerId;\n }\n\n // ─── Internal ──────────────────────────────────────────────────────\n\n private wireDataChannel(dc: RTCDataChannel): void {\n dc.onmessage = (event) => {\n if (!this.receiveHandler) return;\n\n if (event.data instanceof ArrayBuffer) {\n this.receiveHandler(new Uint8Array(event.data));\n }\n };\n\n dc.onclose = () => {\n this.closed = true;\n this.receiveHandler = null;\n };\n\n dc.onerror = () => {\n // Errors are followed by close\n };\n }\n\n private async connectSignaling(): Promise<void> {\n const url =\n this.config.signalingUrl ?? 'wss://relay.dashrelay.com/relay/sync';\n const roomUrl = `${url}?room=${encodeURIComponent(this.config.roomId)}&peer=${encodeURIComponent(this.peerId)}`;\n\n this.signalingWs = new WebSocket(roomUrl);\n\n await new Promise<void>((resolve, reject) => {\n const ws = this.signalingWs!;\n ws.onopen = () => resolve();\n ws.onerror = () => reject(new Error('Signaling connection failed'));\n });\n\n this.signalingWs.onmessage = async (event) => {\n try {\n const msg: SignalingMessage = JSON.parse(event.data);\n\n // Ignore own messages\n if (msg.from === this.peerId) return;\n\n switch (msg.type) {\n case 'offer': {\n if (!this.pc) return;\n const desc = msg.payload as RTCSessionDescriptionInit;\n await this.pc.setRemoteDescription(desc);\n const answer = await this.pc.createAnswer();\n await this.pc.setLocalDescription(answer);\n this.sendSignaling({\n type: 'answer',\n from: this.peerId,\n to: msg.from,\n payload: answer,\n });\n break;\n }\n\n case 'answer': {\n if (!this.pc) return;\n const desc = msg.payload as RTCSessionDescriptionInit;\n await this.pc.setRemoteDescription(desc);\n break;\n }\n\n case 'ice-candidate': {\n if (!this.pc) return;\n const candidate = msg.payload as RTCIceCandidateInit;\n await this.pc.addIceCandidate(candidate);\n break;\n }\n }\n } catch {\n // Ignore malformed signaling messages\n }\n };\n }\n\n private sendSignaling(msg: SignalingMessage): void {\n if (this.signalingWs?.readyState === WebSocket.OPEN) {\n this.signalingWs.send(JSON.stringify(msg));\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Factory: Create a peer-to-peer flow connection via DashRelay\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a flow protocol connection between two peers via WebRTC.\n *\n * Uses DashRelay for signaling, then establishes a direct P2P\n * DataChannel for binary flow frame exchange.\n *\n * @param roomId - Shared room ID for peer discovery\n * @param role - 'initiator' creates the offer, 'responder' waits\n */\nexport async function createP2PFlow(\n roomId: string,\n role: 'initiator' | 'responder',\n config?: Partial<WebRTCFlowConfig>\n): Promise<WebRTCFlowTransport> {\n const transport = new WebRTCFlowTransport({ roomId, ...config });\n\n if (role === 'initiator') {\n await transport.offer();\n } else {\n await transport.answer();\n }\n\n await transport.waitForOpen();\n return transport;\n}\n","/**\n * TCP Flow Transport\n *\n * FlowTransport adapter for Node/Bun TCP sockets.\n * Enables flow protocol between server processes —\n * coordinator ↔ layer nodes, forge ↔ deploy targets.\n *\n * Uses length-prefixed framing over raw TCP to delineate\n * flow frame boundaries. Each message is:\n * [u32 length][payload bytes]\n *\n * This is the backbone transport for server-to-server\n * Aeon protocol communication.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface TCPFlowConfig {\n /** Host to connect to (client) or bind to (server) */\n host?: string;\n /** Port number */\n port: number;\n /** Connection timeout in ms (default: 10000) */\n connectTimeout?: number;\n /** Keep-alive interval in ms (default: 30000) */\n keepAliveMs?: number;\n}\n\n/** Minimal TCP socket interface — works with Node net.Socket and Bun */\ninterface TCPSocket {\n write(data: Uint8Array): boolean;\n on(event: 'data', handler: (data: Buffer | Uint8Array) => void): void;\n on(event: 'close', handler: () => void): void;\n on(event: 'error', handler: (err: Error) => void): void;\n end(): void;\n destroy(): void;\n setKeepAlive?(enable: boolean, initialDelay?: number): void;\n setNoDelay?(noDelay?: boolean): void;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Length-Prefixed Framing\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 4 bytes for u32 length prefix */\nconst LENGTH_PREFIX_SIZE = 4;\n\n/**\n * Encode a message with a u32 length prefix.\n */\nfunction encodeFrame(data: Uint8Array): Uint8Array {\n const frame = new Uint8Array(LENGTH_PREFIX_SIZE + data.byteLength);\n const view = new DataView(frame.buffer);\n view.setUint32(0, data.byteLength, false); // big-endian\n frame.set(data, LENGTH_PREFIX_SIZE);\n return frame;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// TCP FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over TCP with length-prefixed framing.\n *\n * Handles message boundary detection (TCP is a stream, not message-oriented).\n * Uses a u32 length prefix so the receiver knows exactly how many bytes\n * to read for each flow frame.\n */\nexport class TCPFlowTransport implements FlowTransport {\n private socket: TCPSocket;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n\n /** Reassembly buffer for TCP stream → discrete messages */\n private rxBuffer: Uint8Array = new Uint8Array(0);\n\n constructor(socket: TCPSocket, config?: Partial<TCPFlowConfig>) {\n this.socket = socket;\n\n // TCP optimizations\n socket.setNoDelay?.(true); // Disable Nagle for low-latency\n socket.setKeepAlive?.(true, config?.keepAliveMs ?? 30_000);\n\n // Wire up receive\n socket.on('data', (chunk: Buffer | Uint8Array) => {\n this.onData(new Uint8Array(chunk));\n });\n\n socket.on('close', () => {\n this.closed = true;\n this.receiveHandler = null;\n });\n\n socket.on('error', () => {\n // Errors are followed by close\n });\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n const frame = encodeFrame(data);\n this.socket.write(frame);\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.receiveHandler = null;\n this.socket.end();\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n\n // ─── Internal: Stream Reassembly ──────────────────────────────────\n\n private onData(chunk: Uint8Array): void {\n // Append to reassembly buffer\n const combined = new Uint8Array(this.rxBuffer.byteLength + chunk.byteLength);\n combined.set(this.rxBuffer);\n combined.set(chunk, this.rxBuffer.byteLength);\n this.rxBuffer = combined;\n\n // Extract complete messages\n while (this.rxBuffer.byteLength >= LENGTH_PREFIX_SIZE) {\n const view = new DataView(\n this.rxBuffer.buffer,\n this.rxBuffer.byteOffset,\n this.rxBuffer.byteLength\n );\n const msgLen = view.getUint32(0, false); // big-endian\n\n if (this.rxBuffer.byteLength < LENGTH_PREFIX_SIZE + msgLen) {\n break; // Incomplete message — wait for more data\n }\n\n // Extract the complete message\n const message = this.rxBuffer.slice(\n LENGTH_PREFIX_SIZE,\n LENGTH_PREFIX_SIZE + msgLen\n );\n\n // Advance the buffer\n this.rxBuffer = this.rxBuffer.slice(LENGTH_PREFIX_SIZE + msgLen);\n\n // Deliver\n this.receiveHandler?.(message);\n }\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Factory: Create TCP FlowTransport from connection params\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a TCP FlowTransport by connecting to a remote host.\n *\n * Uses dynamic import of 'net' so this module is tree-shakeable\n * in browser builds.\n *\n * @param host - Remote host\n * @param port - Remote port\n * @param config - Optional TCP configuration\n */\nexport async function connectTCPFlow(\n host: string,\n port: number,\n config?: Partial<TCPFlowConfig>\n): Promise<TCPFlowTransport> {\n const net = await import('net');\n const timeout = config?.connectTimeout ?? 10_000;\n\n return new Promise<TCPFlowTransport>((resolve, reject) => {\n const socket = net.createConnection({ host, port }, () => {\n resolve(new TCPFlowTransport(socket, config));\n });\n\n socket.setTimeout(timeout);\n socket.on('timeout', () => {\n socket.destroy();\n reject(new Error(`TCP connection timeout to ${host}:${port}`));\n });\n\n socket.on('error', (err) => {\n reject(new Error(`TCP connection failed to ${host}:${port}: ${err.message}`));\n });\n });\n}\n\n/**\n * Create a TCP flow server that accepts incoming connections.\n *\n * Each accepted connection becomes a FlowTransport.\n *\n * @param port - Port to listen on\n * @param host - Host to bind to (default: '0.0.0.0')\n * @param onConnection - Called for each new flow transport connection\n */\nexport async function listenTCPFlow(\n port: number,\n host: string,\n onConnection: (transport: TCPFlowTransport) => void\n): Promise<{ close: () => void }> {\n const net = await import('net');\n\n const server = net.createServer((socket) => {\n const transport = new TCPFlowTransport(socket);\n onConnection(transport);\n });\n\n return new Promise((resolve, reject) => {\n server.listen(port, host, () => {\n resolve({\n close: () => server.close(),\n });\n });\n\n server.on('error', (err) => {\n reject(new Error(`TCP flow server failed on ${host}:${port}: ${err.message}`));\n });\n });\n}\n","/**\n * IPC Flow Transport\n *\n * FlowTransport adapter for inter-process communication:\n * - MessagePort (Web Workers, SharedWorker, BroadcastChannel)\n * - MessageChannel (Node/Bun worker_threads)\n * - child_process IPC (Node fork)\n *\n * Enables flow protocol between:\n * - Main thread ↔ inference Web Worker (browser)\n * - Shell process ↔ forge daemon (local)\n * - Any two processes on the same machine\n *\n * Zero-copy when possible — transfers ArrayBuffers via\n * structured clone's transfer list.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Minimal MessagePort-like interface.\n * Covers Web Workers, worker_threads, BroadcastChannel.\n */\nexport interface MessagePortLike {\n postMessage(data: unknown, transfer?: Transferable[]): void;\n addEventListener?(type: 'message', handler: (event: MessageEvent) => void): void;\n removeEventListener?(type: 'message', handler: (event: MessageEvent) => void): void;\n onmessage?: ((event: MessageEvent) => void) | null;\n close?(): void;\n start?(): void;\n}\n\n/**\n * Minimal child_process-like interface for IPC.\n * Covers Node child_process.fork() results.\n */\nexport interface ChildProcessLike {\n send(data: unknown): boolean;\n on(event: 'message', handler: (data: unknown) => void): void;\n on(event: 'exit', handler: (code: number | null) => void): void;\n removeListener?(event: string, handler: (...args: unknown[]) => void): void;\n kill?(): void;\n}\n\nexport interface IPCFlowConfig {\n /** Whether to transfer ArrayBuffers (zero-copy but invalidates sender's ref) */\n transferBuffers?: boolean;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// MessagePort FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over MessagePort (Web Workers, worker_threads, BroadcastChannel).\n *\n * Uses structured clone for binary transfer. When `transferBuffers` is true,\n * the ArrayBuffer backing the Uint8Array is transferred (zero-copy) rather\n * than cloned. This is faster but invalidates the sender's reference.\n */\nexport class MessagePortFlowTransport implements FlowTransport {\n private port: MessagePortLike;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private transferBuffers: boolean;\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n constructor(port: MessagePortLike, config?: IPCFlowConfig) {\n this.port = port;\n this.transferBuffers = config?.transferBuffers ?? false;\n\n // Start the port if needed (Web MessagePort requires start())\n port.start?.();\n\n // Wire up receive\n this.messageHandler = (event: MessageEvent) => {\n if (!this.receiveHandler) return;\n\n const data = event.data;\n if (data instanceof ArrayBuffer) {\n this.receiveHandler(new Uint8Array(data));\n } else if (data instanceof Uint8Array) {\n this.receiveHandler(data);\n } else if (data?.type === 'aeon-flow' && data.buffer instanceof ArrayBuffer) {\n this.receiveHandler(new Uint8Array(data.buffer));\n }\n };\n\n if (port.addEventListener) {\n port.addEventListener('message', this.messageHandler);\n } else {\n port.onmessage = this.messageHandler;\n }\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n if (this.transferBuffers) {\n // Zero-copy transfer — sender loses access to the buffer\n const copy = new Uint8Array(data); // copy first since we transfer\n this.port.postMessage(copy.buffer, [copy.buffer]);\n } else {\n // Structured clone — data is copied, sender retains access\n this.port.postMessage({ type: 'aeon-flow', buffer: data.buffer.slice(0) });\n }\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.messageHandler) {\n if (this.port.removeEventListener) {\n this.port.removeEventListener('message', this.messageHandler);\n } else {\n this.port.onmessage = null;\n }\n }\n\n this.receiveHandler = null;\n this.port.close?.();\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// ChildProcess FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over Node child_process IPC.\n *\n * Uses process.send()/process.on('message') for fork()-based IPC.\n * Messages are serialized via V8's structured clone, so Uint8Array\n * arrives as a Buffer on the other side.\n */\nexport class ChildProcessFlowTransport implements FlowTransport {\n private process: ChildProcessLike;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private ipcHandler: ((data: unknown) => void) | null = null;\n\n constructor(childProcess: ChildProcessLike) {\n this.process = childProcess;\n\n this.ipcHandler = (data: unknown) => {\n if (!this.receiveHandler) return;\n\n if (data instanceof Uint8Array || Buffer.isBuffer(data)) {\n this.receiveHandler(new Uint8Array(data));\n } else if (\n typeof data === 'object' &&\n data !== null &&\n (data as { type?: string }).type === 'aeon-flow'\n ) {\n const buffer = (data as { buffer?: unknown }).buffer;\n if (buffer instanceof ArrayBuffer) {\n this.receiveHandler(new Uint8Array(buffer));\n } else if (\n typeof buffer === 'object' &&\n buffer !== null &&\n 'data' in (buffer as Record<string, unknown>)\n ) {\n // V8 serialization turns Uint8Array into { type: 'Buffer', data: [...] }\n const arr = (buffer as { data: number[] }).data;\n this.receiveHandler(new Uint8Array(arr));\n }\n }\n };\n\n childProcess.on('message', this.ipcHandler);\n\n childProcess.on('exit', () => {\n this.closed = true;\n this.receiveHandler = null;\n });\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n // Wrap in an envelope so receiver can identify aeon-flow messages\n // among other IPC traffic\n this.process.send({\n type: 'aeon-flow',\n buffer: Array.from(data), // Serialize as plain array for V8 IPC\n });\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n\n if (this.ipcHandler && this.process.removeListener) {\n this.process.removeListener('message', this.ipcHandler);\n }\n\n this.receiveHandler = null;\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Factory: Create IPC pair (for testing or in-process use)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Create a pair of linked MessagePort FlowTransports.\n *\n * Uses MessageChannel to create a bidirectional pair —\n * data sent on one arrives on the other.\n *\n * Works in browsers, Bun, and Node (with worker_threads).\n */\nexport function createIPCPair(\n config?: IPCFlowConfig\n): [MessagePortFlowTransport, MessagePortFlowTransport] {\n const channel = new MessageChannel();\n return [\n new MessagePortFlowTransport(channel.port1, config),\n new MessagePortFlowTransport(channel.port2, config),\n ];\n}\n","/**\n * USB Flow Transport\n *\n * FlowTransport adapter for WebUSB API.\n * Enables flow protocol between browser and USB devices —\n * the communication channel for Rabbit R1 and other\n * hardware endpoints.\n *\n * Uses bulk transfer endpoints for binary flow frame exchange.\n * Length-prefixed framing (u32) for message boundary detection\n * over the bulk pipe.\n *\n * The device must expose a vendor-specific interface with\n * IN and OUT bulk endpoints that speak Aeon flow frames.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Constants\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** Aeon vendor-specific interface class */\nexport const AEON_USB_INTERFACE_CLASS = 0xFF; // Vendor-specific\n/** Aeon vendor-specific subclass */\nexport const AEON_USB_SUBCLASS = 0xAE;\n/** Aeon protocol ID within the interface */\nexport const AEON_USB_PROTOCOL = 0x01;\n\n/** Length prefix size for framing */\nconst LENGTH_PREFIX_SIZE = 4;\n\n/** Default USB transfer size (64KB) */\nconst DEFAULT_TRANSFER_SIZE = 64 * 1024;\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface USBFlowConfig {\n /** Interface number to claim (auto-detected if not specified) */\n interfaceNumber?: number;\n /** OUT endpoint number (auto-detected if not specified) */\n outEndpoint?: number;\n /** IN endpoint number (auto-detected if not specified) */\n inEndpoint?: number;\n /** Transfer size for bulk reads (default: 64KB) */\n transferSize?: number;\n /** USB vendor ID filter for device selection */\n vendorId?: number;\n /** USB product ID filter for device selection */\n productId?: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// USB FlowTransport\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * FlowTransport over WebUSB bulk endpoints.\n *\n * Uses length-prefixed framing over bulk transfers to delineate\n * flow frame boundaries. Continuously polls the IN endpoint\n * for incoming data.\n */\nexport class USBFlowTransport implements FlowTransport {\n private device: USBDevice;\n private receiveHandler: ((data: Uint8Array) => void) | null = null;\n private closed = false;\n private interfaceNum: number;\n private outEndpoint: number;\n private inEndpoint: number;\n private transferSize: number;\n private readLoopRunning = false;\n\n /** Reassembly buffer for length-prefixed framing */\n private rxBuffer: Uint8Array = new Uint8Array(0);\n\n private constructor(\n device: USBDevice,\n interfaceNum: number,\n outEndpoint: number,\n inEndpoint: number,\n transferSize: number\n ) {\n this.device = device;\n this.interfaceNum = interfaceNum;\n this.outEndpoint = outEndpoint;\n this.inEndpoint = inEndpoint;\n this.transferSize = transferSize;\n }\n\n /**\n * Connect to a USB device and create a FlowTransport.\n *\n * Requests device access, opens it, claims the Aeon interface,\n * and auto-detects bulk endpoints if not specified.\n */\n static async connect(config?: USBFlowConfig): Promise<USBFlowTransport> {\n const filters: USBDeviceFilter[] = [];\n\n if (config?.vendorId !== undefined) {\n const filter: USBDeviceFilter = { vendorId: config.vendorId };\n if (config.productId !== undefined) {\n filter.productId = config.productId;\n }\n filters.push(filter);\n }\n\n // Request device — triggers browser permission prompt\n const device = await navigator.usb.requestDevice({\n filters: filters.length > 0 ? filters : [{ classCode: AEON_USB_INTERFACE_CLASS }],\n });\n\n await device.open();\n\n // Find the Aeon interface\n let interfaceNum = config?.interfaceNumber;\n let outEp = config?.outEndpoint;\n let inEp = config?.inEndpoint;\n\n if (interfaceNum === undefined || outEp === undefined || inEp === undefined) {\n // Auto-detect from device configuration\n const iface = device.configuration?.interfaces.find((i) =>\n i.alternates.some(\n (alt) =>\n alt.interfaceClass === AEON_USB_INTERFACE_CLASS &&\n alt.interfaceSubclass === AEON_USB_SUBCLASS\n )\n );\n\n if (!iface) {\n throw new Error('No Aeon USB interface found on device');\n }\n\n interfaceNum = iface.interfaceNumber;\n\n const alternate = iface.alternates.find(\n (alt) =>\n alt.interfaceClass === AEON_USB_INTERFACE_CLASS &&\n alt.interfaceSubclass === AEON_USB_SUBCLASS\n )!;\n\n for (const ep of alternate.endpoints) {\n if (ep.type === 'bulk') {\n if (ep.direction === 'out' && outEp === undefined) {\n outEp = ep.endpointNumber;\n } else if (ep.direction === 'in' && inEp === undefined) {\n inEp = ep.endpointNumber;\n }\n }\n }\n }\n\n if (interfaceNum === undefined || outEp === undefined || inEp === undefined) {\n throw new Error('Could not find bulk endpoints on Aeon USB interface');\n }\n\n await device.claimInterface(interfaceNum);\n\n const transport = new USBFlowTransport(\n device,\n interfaceNum,\n outEp,\n inEp,\n config?.transferSize ?? DEFAULT_TRANSFER_SIZE\n );\n\n // Start the read loop\n transport.startReadLoop();\n\n return transport;\n }\n\n /**\n * Create from an already-opened USB device (for testing or manual setup).\n */\n static fromDevice(\n device: USBDevice,\n interfaceNum: number,\n outEndpoint: number,\n inEndpoint: number,\n config?: Partial<USBFlowConfig>\n ): USBFlowTransport {\n const transport = new USBFlowTransport(\n device,\n interfaceNum,\n outEndpoint,\n inEndpoint,\n config?.transferSize ?? DEFAULT_TRANSFER_SIZE\n );\n transport.startReadLoop();\n return transport;\n }\n\n // ─── FlowTransport interface ───────────────────────────────────────\n\n send(data: Uint8Array): void {\n if (this.closed) return;\n\n // Length-prefixed framing\n const frame = new Uint8Array(LENGTH_PREFIX_SIZE + data.byteLength);\n const view = new DataView(frame.buffer);\n view.setUint32(0, data.byteLength, false);\n frame.set(data, LENGTH_PREFIX_SIZE);\n\n // Fire-and-forget bulk write\n this.device.transferOut(this.outEndpoint, frame).catch(() => {\n // Write failed — device disconnected\n });\n }\n\n onReceive(handler: (data: Uint8Array) => void): void {\n this.receiveHandler = handler;\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.readLoopRunning = false;\n this.receiveHandler = null;\n\n // Release interface and close device\n this.device.releaseInterface(this.interfaceNum).then(() => {\n this.device.close().catch(() => {});\n }).catch(() => {});\n }\n\n /** Whether the transport is still open */\n get isOpen(): boolean {\n return !this.closed;\n }\n\n /** Get the USB device info */\n get deviceInfo(): { vendorId: number; productId: number; name: string } {\n return {\n vendorId: this.device.vendorId,\n productId: this.device.productId,\n name: this.device.productName ?? this.device.serialNumber ?? 'Unknown',\n };\n }\n\n // ─── Internal: Continuous Read Loop ───────────────────────────────\n\n private startReadLoop(): void {\n if (this.readLoopRunning) return;\n this.readLoopRunning = true;\n\n const loop = async () => {\n while (this.readLoopRunning && !this.closed) {\n try {\n const result = await this.device.transferIn(\n this.inEndpoint,\n this.transferSize\n );\n\n if (result.status === 'ok' && result.data && result.data.byteLength > 0) {\n const chunk = new Uint8Array(result.data.buffer);\n this.processChunk(chunk);\n }\n } catch {\n // Transfer failed — device may have disconnected\n if (!this.closed) {\n this.closed = true;\n this.readLoopRunning = false;\n this.receiveHandler = null;\n }\n return;\n }\n }\n };\n\n void loop();\n }\n\n private processChunk(chunk: Uint8Array): void {\n // Append to reassembly buffer\n const combined = new Uint8Array(this.rxBuffer.byteLength + chunk.byteLength);\n combined.set(this.rxBuffer);\n combined.set(chunk, this.rxBuffer.byteLength);\n this.rxBuffer = combined;\n\n // Extract complete messages\n while (this.rxBuffer.byteLength >= LENGTH_PREFIX_SIZE) {\n const view = new DataView(\n this.rxBuffer.buffer,\n this.rxBuffer.byteOffset,\n this.rxBuffer.byteLength\n );\n const msgLen = view.getUint32(0, false);\n\n if (this.rxBuffer.byteLength < LENGTH_PREFIX_SIZE + msgLen) {\n break;\n }\n\n const message = this.rxBuffer.slice(\n LENGTH_PREFIX_SIZE,\n LENGTH_PREFIX_SIZE + msgLen\n );\n this.rxBuffer = this.rxBuffer.slice(LENGTH_PREFIX_SIZE + msgLen);\n\n this.receiveHandler?.(message);\n }\n }\n}\n","/**\n * HTTP Flow Transport (nginx Bridge)\n *\n * FlowTransport adapter that translates between HTTP and Aeon flow protocol.\n * This is the normie projection layer — external clients speak HTTP,\n * the nginx module translates to Aeon flow, and everything internal\n * speaks Aeon natively.\n *\n * Two sides:\n * 1. **Server-side (Aeon→HTTP)**: Receives flow frames from internal Aeon\n * services and translates them into HTTP responses for external clients.\n * 2. **Client-side (HTTP→Aeon)**: Receives HTTP requests from nginx and\n * translates them into flow frames for internal processing.\n *\n * The nginx module handles the C-level WebSocket↔HTTP translation.\n * This TypeScript module handles the flow frame↔HTTP semantic mapping:\n * - HTTP GET → flow stream open + await FIN\n * - HTTP POST → flow stream open + data frames + FIN\n * - HTTP response → flow frames + FIN\n * - HTTP streaming response → flow frames (no FIN until complete)\n * - HTTP error → POISON frame\n *\n * Wire format between nginx module and this bridge:\n * Control messages are length-prefixed JSON.\n * Data messages are raw flow frames.\n */\n\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** HTTP request as received from nginx */\nexport interface AeonHTTPRequest {\n /** HTTP method */\n method: string;\n /** Request path */\n path: string;\n /** Query string (without leading ?) */\n query?: string;\n /** Request headers */\n headers: Record<string, string>;\n /** Request body (for POST/PUT/PATCH) */\n body?: Uint8Array;\n /** Unique request ID assigned by nginx */\n requestId: string;\n}\n\n/** HTTP response to send back through nginx */\nexport interface AeonHTTPResponse {\n /** HTTP status code */\n status: number;\n /** Response headers */\n headers: Record<string, string>;\n /** Response body */\n body: Uint8Array;\n /** Whether this is a streaming response (more chunks follow) */\n streaming?: boolean;\n /** Request ID this response belongs to */\n requestId: string;\n}\n\n/** Control message from nginx → bridge */\nexport interface NginxControlMessage {\n type: 'http-request';\n request: AeonHTTPRequest;\n}\n\n/** Control message from bridge → nginx */\nexport interface BridgeControlMessage {\n type: 'http-response' | 'http-response-chunk' | 'http-response-end';\n response: AeonHTTPResponse;\n}\n\nexport interface HTTPBridgeConfig {\n /** Default content type for responses (default: 'application/octet-stream') */\n defaultContentType?: string;\n /** Maximum request body size in bytes (default: 16MB) */\n maxBodySize?: number;\n /** Timeout for flow response in ms (default: 30000) */\n responseTimeout?: number;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// HTTP→Aeon Request Encoder\n// ═══════════════════════════════════════════════════════════════════════════════\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\n/**\n * Encode an HTTP request into flow frame payload.\n *\n * Format:\n * [0-3] u32 method length\n * [4-7] u32 path length\n * [8-11] u32 headers JSON length\n * [12-15] u32 body length\n * [...] method bytes\n * [...] path bytes (includes query string)\n * [...] headers JSON bytes\n * [...] body bytes\n */\nexport function encodeHTTPRequest(req: AeonHTTPRequest): Uint8Array {\n const methodBytes = encoder.encode(req.method);\n const fullPath = req.query ? `${req.path}?${req.query}` : req.path;\n const pathBytes = encoder.encode(fullPath);\n const headersBytes = encoder.encode(JSON.stringify(req.headers));\n const bodyBytes = req.body ?? new Uint8Array(0);\n\n const headerSize = 16;\n const totalSize = headerSize + methodBytes.byteLength + pathBytes.byteLength +\n headersBytes.byteLength + bodyBytes.byteLength;\n const encoded = new Uint8Array(totalSize);\n const view = new DataView(encoded.buffer);\n\n view.setUint32(0, methodBytes.byteLength, false);\n view.setUint32(4, pathBytes.byteLength, false);\n view.setUint32(8, headersBytes.byteLength, false);\n view.setUint32(12, bodyBytes.byteLength, false);\n\n let offset = headerSize;\n encoded.set(methodBytes, offset); offset += methodBytes.byteLength;\n encoded.set(pathBytes, offset); offset += pathBytes.byteLength;\n encoded.set(headersBytes, offset); offset += headersBytes.byteLength;\n encoded.set(bodyBytes, offset);\n\n return encoded;\n}\n\n/**\n * Decode a flow frame payload back into an HTTP request.\n */\nexport function decodeHTTPRequest(data: Uint8Array): AeonHTTPRequest {\n if (data.byteLength < 16) throw new Error('Invalid HTTP request frame');\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const methodLen = view.getUint32(0, false);\n const pathLen = view.getUint32(4, false);\n const headersLen = view.getUint32(8, false);\n const bodyLen = view.getUint32(12, false);\n\n let offset = 16;\n const method = decoder.decode(data.subarray(offset, offset + methodLen));\n offset += methodLen;\n\n const fullPath = decoder.decode(data.subarray(offset, offset + pathLen));\n offset += pathLen;\n\n const headersJson = decoder.decode(data.subarray(offset, offset + headersLen));\n offset += headersLen;\n\n const body = bodyLen > 0 ? data.slice(offset, offset + bodyLen) : undefined;\n\n // Split path and query\n const qIdx = fullPath.indexOf('?');\n const path = qIdx >= 0 ? fullPath.substring(0, qIdx) : fullPath;\n const query = qIdx >= 0 ? fullPath.substring(qIdx + 1) : undefined;\n\n return {\n method,\n path,\n query,\n headers: JSON.parse(headersJson) as Record<string, string>,\n body,\n requestId: '', // Assigned by caller\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Aeon→HTTP Response Encoder\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Encode an HTTP response into flow frame payload.\n *\n * Format:\n * [0-1] u16 status code\n * [2-5] u32 headers JSON length\n * [6-9] u32 body length\n * [...] headers JSON bytes\n * [...] body bytes\n */\nexport function encodeHTTPResponse(res: Omit<AeonHTTPResponse, 'requestId'>): Uint8Array {\n const headersBytes = encoder.encode(JSON.stringify(res.headers));\n const bodyBytes = res.body;\n\n const headerSize = 10;\n const totalSize = headerSize + headersBytes.byteLength + bodyBytes.byteLength;\n const encoded = new Uint8Array(totalSize);\n const view = new DataView(encoded.buffer);\n\n view.setUint16(0, res.status, false);\n view.setUint32(2, headersBytes.byteLength, false);\n view.setUint32(6, bodyBytes.byteLength, false);\n\n let offset = headerSize;\n encoded.set(headersBytes, offset); offset += headersBytes.byteLength;\n encoded.set(bodyBytes, offset);\n\n return encoded;\n}\n\n/**\n * Decode a flow frame payload back into an HTTP response.\n */\nexport function decodeHTTPResponse(data: Uint8Array): Omit<AeonHTTPResponse, 'requestId'> {\n if (data.byteLength < 10) throw new Error('Invalid HTTP response frame');\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const status = view.getUint16(0, false);\n const headersLen = view.getUint32(2, false);\n const bodyLen = view.getUint32(6, false);\n\n let offset = 10;\n const headersJson = decoder.decode(data.subarray(offset, offset + headersLen));\n offset += headersLen;\n\n const body = data.slice(offset, offset + bodyLen);\n\n return {\n status,\n headers: JSON.parse(headersJson) as Record<string, string>,\n body,\n };\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// HTTP↔Aeon Bridge\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Bidirectional HTTP↔Aeon flow protocol bridge.\n *\n * Sits between nginx (HTTP) and internal Aeon services (flow protocol).\n * Translates HTTP requests into flow streams and flow responses back\n * into HTTP responses.\n *\n * nginx module sends HTTP requests over a WebSocket to this bridge.\n * This bridge opens flow streams, forwards the request as flow frames,\n * collects the response frames, and sends the HTTP response back to nginx.\n */\nexport class HTTPAeonBridge {\n private transport: FlowTransport;\n private config: HTTPBridgeConfig;\n\n /** Pending HTTP requests waiting for flow responses */\n private pending = new Map<string, {\n resolve: (res: AeonHTTPResponse) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n chunks: Uint8Array[];\n }>();\n\n /** Handler for incoming HTTP requests (from nginx side) */\n private requestHandler: ((req: AeonHTTPRequest) => Promise<AeonHTTPResponse>) | null = null;\n\n constructor(transport: FlowTransport, config?: HTTPBridgeConfig) {\n this.transport = transport;\n this.config = config ?? {};\n\n // Wire up receive to handle response frames\n transport.onReceive((data) => {\n this.handleIncoming(data);\n });\n }\n\n /**\n * Register a handler for incoming HTTP requests.\n * This is used on the Aeon side — the bridge receives HTTP requests\n * from nginx, translates them to flow, and calls this handler.\n */\n onRequest(handler: (req: AeonHTTPRequest) => Promise<AeonHTTPResponse>): void {\n this.requestHandler = handler;\n }\n\n /**\n * Send an HTTP request through the bridge (used by nginx side).\n * Translates the HTTP request into flow frames, waits for the\n * flow response, and returns it as an HTTP response.\n */\n async sendRequest(req: AeonHTTPRequest): Promise<AeonHTTPResponse> {\n const timeout = this.config.responseTimeout ?? 30_000;\n\n return new Promise<AeonHTTPResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(req.requestId);\n reject(new Error(`Flow response timeout for ${req.method} ${req.path}`));\n }, timeout);\n\n this.pending.set(req.requestId, { resolve, reject, timer, chunks: [] });\n\n // Encode and send the request as a flow frame\n const payload = encodeHTTPRequest(req);\n\n // Prefix with request ID so the other side can correlate\n const reqIdBytes = encoder.encode(req.requestId);\n const frame = new Uint8Array(4 + reqIdBytes.byteLength + payload.byteLength);\n const view = new DataView(frame.buffer);\n view.setUint32(0, reqIdBytes.byteLength, false);\n frame.set(reqIdBytes, 4);\n frame.set(payload, 4 + reqIdBytes.byteLength);\n\n this.transport.send(frame);\n });\n }\n\n /**\n * Send an HTTP response back through the bridge (used by Aeon side).\n */\n sendResponse(res: AeonHTTPResponse): void {\n const payload = encodeHTTPResponse(res);\n const reqIdBytes = encoder.encode(res.requestId);\n\n // Prefix with request ID and a response marker byte\n const frame = new Uint8Array(5 + reqIdBytes.byteLength + payload.byteLength);\n const view = new DataView(frame.buffer);\n frame[0] = 0x02; // Response marker\n view.setUint32(1, reqIdBytes.byteLength, false);\n frame.set(reqIdBytes, 5);\n frame.set(payload, 5 + reqIdBytes.byteLength);\n\n this.transport.send(frame);\n }\n\n close(): void {\n for (const [, pending] of this.pending) {\n clearTimeout(pending.timer);\n pending.reject(new Error('Bridge closed'));\n }\n this.pending.clear();\n this.transport.close();\n }\n\n // ─── Internal ──────────────────────────────────────────────────────\n\n private handleIncoming(data: Uint8Array): void {\n if (data.byteLength < 5) return;\n\n // Check if this is a response (marker byte 0x02) or a request (no marker)\n if (data[0] === 0x02) {\n this.handleResponseFrame(data);\n } else {\n this.handleRequestFrame(data);\n }\n }\n\n private handleResponseFrame(data: Uint8Array): void {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const reqIdLen = view.getUint32(1, false);\n const requestId = decoder.decode(data.subarray(5, 5 + reqIdLen));\n const payload = data.subarray(5 + reqIdLen);\n\n const pending = this.pending.get(requestId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this.pending.delete(requestId);\n\n const response = decodeHTTPResponse(payload);\n pending.resolve({ ...response, requestId });\n }\n\n private async handleRequestFrame(data: Uint8Array): Promise<void> {\n if (!this.requestHandler) return;\n\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const reqIdLen = view.getUint32(0, false);\n const requestId = decoder.decode(data.subarray(4, 4 + reqIdLen));\n const payload = data.subarray(4 + reqIdLen);\n\n const request = decodeHTTPRequest(payload);\n request.requestId = requestId;\n\n try {\n const response = await this.requestHandler(request);\n this.sendResponse(response);\n } catch (err) {\n // Send error response\n this.sendResponse({\n requestId,\n status: 502,\n headers: { 'content-type': 'text/plain' },\n body: encoder.encode(err instanceof Error ? err.message : 'Internal flow error'),\n });\n }\n }\n}\n","/**\n * Federated Browser Inference\n *\n * Fork inference requests across N mesh peers via flow protocol,\n * race the results, winner provides the response. This turns\n * every browser tab with WASM inference into a federated compute node.\n *\n * The coordinator:\n * 1. Discovers peers via DashRelay room or Bluetooth/WebRTC mesh\n * 2. Forks a flow stream per peer for the same prompt\n * 3. Races all streams — fastest inference result wins\n * 4. Poisons slower streams to free their resources\n * 5. Returns the winning result to the caller\n *\n * This is fork/race/collapse at the network level —\n * the same primitive that handles ESI cache vs inference,\n * but applied across physical devices.\n *\n * Use cases:\n * - 3 phones in a room → fork prompt to all 3, fastest wins\n * - Laptop + tablet → laptop runs 7B, tablet runs 1B, race them\n * - Federated speculative decoding across device mesh\n */\n\nimport { AeonFlowProtocol } from '../flow/AeonFlowProtocol';\nimport type { FlowTransport } from '../flow/types';\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport interface FederatedPeer {\n /** Unique peer identifier */\n id: string;\n /** Flow transport to this peer */\n transport: FlowTransport;\n /** Peer's reported capabilities */\n capabilities: PeerCapabilities;\n /** Last seen timestamp */\n lastSeen: number;\n /** Whether peer is currently available for inference */\n available: boolean;\n}\n\nexport interface PeerCapabilities {\n /** Models available on this peer */\n models: string[];\n /** Acceleration type */\n acceleration: 'webgpu' | 'webnn' | 'wasm' | 'none';\n /** Estimated tokens/second */\n estimatedTps?: number;\n /** Available memory in MB */\n availableMemoryMB?: number;\n /** Whether peer is on battery */\n onBattery?: boolean;\n}\n\nexport interface FederatedInferenceRequest {\n /** Prompt text */\n prompt: string;\n /** Model preference (peers without this model are skipped) */\n model?: string;\n /** Maximum tokens to generate */\n maxTokens?: number;\n /** Temperature */\n temperature?: number;\n /** Whether to include all peer results or just the winner */\n collectAll?: boolean;\n}\n\nexport interface FederatedInferenceResult {\n /** The winning peer's ID */\n winnerId: string;\n /** Generated text */\n text: string;\n /** Time to first token (ms) */\n ttft: number;\n /** Total generation time (ms) */\n totalTime: number;\n /** Tokens per second achieved */\n tokensPerSecond: number;\n /** All peer results (if collectAll was true) */\n allResults?: Map<string, { text: string; time: number }>;\n}\n\nexport interface FederatedInferenceConfig {\n /** Timeout for inference requests in ms (default: 60000) */\n timeout?: number;\n /** Minimum peers required to start federated inference (default: 1) */\n minPeers?: number;\n /** Maximum peers to fork to (default: 8) */\n maxPeers?: number;\n /** Whether to include local inference in the race (default: true) */\n includeLocal?: boolean;\n /** Local inference handler (if includeLocal is true) */\n localInference?: (prompt: string) => Promise<string>;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Wire Format for Inference Requests/Responses\n// ═══════════════════════════════════════════════════════════════════════════════\n\nconst MSG_INFERENCE_REQUEST = 0x01;\nconst MSG_INFERENCE_RESPONSE = 0x02;\nconst MSG_CAPABILITY_ANNOUNCE = 0x03;\nconst MSG_CAPABILITY_REQUEST = 0x04;\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\nfunction encodeInferenceRequest(req: FederatedInferenceRequest): Uint8Array {\n const json = JSON.stringify(req);\n const jsonBytes = textEncoder.encode(json);\n const frame = new Uint8Array(1 + jsonBytes.byteLength);\n frame[0] = MSG_INFERENCE_REQUEST;\n frame.set(jsonBytes, 1);\n return frame;\n}\n\nfunction encodeInferenceResponse(text: string, metrics: { ttft: number; totalTime: number; tps: number }): Uint8Array {\n const json = JSON.stringify({ text, ...metrics });\n const jsonBytes = textEncoder.encode(json);\n const frame = new Uint8Array(1 + jsonBytes.byteLength);\n frame[0] = MSG_INFERENCE_RESPONSE;\n frame.set(jsonBytes, 1);\n return frame;\n}\n\nfunction encodeCapabilities(caps: PeerCapabilities): Uint8Array {\n const json = JSON.stringify(caps);\n const jsonBytes = textEncoder.encode(json);\n const frame = new Uint8Array(1 + jsonBytes.byteLength);\n frame[0] = MSG_CAPABILITY_ANNOUNCE;\n frame.set(jsonBytes, 1);\n return frame;\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Federated Inference Coordinator\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/**\n * Coordinates federated inference across a mesh of peers.\n *\n * Each peer runs its own WASM inference engine. The coordinator\n * forks the same prompt to multiple peers, races them, and returns\n * the fastest result.\n *\n * Uses AeonFlowProtocol for fork/race/collapse:\n * - fork(root, N) creates N child streams, one per peer\n * - race(children) picks the first to complete\n * - Losers are automatically poisoned\n */\nexport class FederatedInferenceCoordinator {\n private peers = new Map<string, FederatedPeer>();\n private config: FederatedInferenceConfig;\n private listeners = new Set<(event: FederationEvent) => void>();\n\n constructor(config?: FederatedInferenceConfig) {\n this.config = config ?? {};\n }\n\n // ─── Peer Management ────────────────────────────────────────────\n\n /**\n * Register a peer with its flow transport.\n * The transport should already be connected.\n */\n addPeer(id: string, transport: FlowTransport, capabilities?: PeerCapabilities): void {\n const peer: FederatedPeer = {\n id,\n transport,\n capabilities: capabilities ?? { models: [], acceleration: 'none' },\n lastSeen: Date.now(),\n available: true,\n };\n\n this.peers.set(id, peer);\n this.emit({ type: 'peer-added', peerId: id });\n\n // Request capabilities if not provided\n if (!capabilities) {\n const reqFrame = new Uint8Array([MSG_CAPABILITY_REQUEST]);\n transport.send(reqFrame);\n }\n\n // Listen for capability announcements\n transport.onReceive((data) => {\n if (data[0] === MSG_CAPABILITY_ANNOUNCE) {\n const json = textDecoder.decode(data.subarray(1));\n peer.capabilities = JSON.parse(json) as PeerCapabilities;\n peer.lastSeen = Date.now();\n this.emit({ type: 'peer-capabilities', peerId: id, capabilities: peer.capabilities });\n }\n });\n }\n\n /**\n * Remove a peer from the federation.\n */\n removePeer(id: string): void {\n const peer = this.peers.get(id);\n if (peer) {\n peer.available = false;\n this.peers.delete(id);\n this.emit({ type: 'peer-removed', peerId: id });\n }\n }\n\n /**\n * Get all available peers, optionally filtered by model support.\n */\n getAvailablePeers(model?: string): FederatedPeer[] {\n return Array.from(this.peers.values()).filter((peer) => {\n if (!peer.available) return false;\n if (model && !peer.capabilities.models.includes(model)) return false;\n return true;\n });\n }\n\n // ─── Federated Inference ──────────────────────────────────────────\n\n /**\n * Run federated inference across available peers.\n *\n * Forks the prompt to N peers, races them, returns the fastest result.\n * This is the core fork/race primitive applied at the network level.\n */\n async infer(request: FederatedInferenceRequest): Promise<FederatedInferenceResult> {\n const availablePeers = this.getAvailablePeers(request.model);\n const minPeers = this.config.minPeers ?? 1;\n const maxPeers = this.config.maxPeers ?? 8;\n const timeout = this.config.timeout ?? 60_000;\n const includeLocal = this.config.includeLocal ?? true;\n\n const totalCandidates = availablePeers.length + (includeLocal ? 1 : 0);\n\n if (totalCandidates < minPeers) {\n throw new Error(\n `Not enough peers for federated inference: ${totalCandidates} available, ${minPeers} required`\n );\n }\n\n // Select peers (up to maxPeers, sorted by estimated TPS descending)\n const selectedPeers = availablePeers\n .sort((a, b) => (b.capabilities.estimatedTps ?? 0) - (a.capabilities.estimatedTps ?? 0))\n .slice(0, maxPeers - (includeLocal ? 1 : 0));\n\n const startTime = Date.now();\n this.emit({ type: 'inference-start', peerCount: selectedPeers.length + (includeLocal ? 1 : 0) });\n\n // Race all peers (and optionally local)\n const raceEntries: Array<{\n id: string;\n promise: Promise<{ text: string; ttft: number; totalTime: number; tps: number }>;\n }> = [];\n\n // Fork to each peer\n for (const peer of selectedPeers) {\n const requestFrame = encodeInferenceRequest(request);\n const peerPromise = new Promise<{ text: string; ttft: number; totalTime: number; tps: number }>(\n (resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Peer ${peer.id} timeout`));\n }, timeout);\n\n // Store the original handler and set up our inference handler\n const handler = (data: Uint8Array) => {\n if (data[0] === MSG_INFERENCE_RESPONSE) {\n clearTimeout(timer);\n const json = textDecoder.decode(data.subarray(1));\n const result = JSON.parse(json) as { text: string; ttft: number; totalTime: number; tps: number };\n resolve(result);\n }\n };\n\n peer.transport.onReceive(handler);\n peer.transport.send(requestFrame);\n }\n );\n\n raceEntries.push({ id: peer.id, promise: peerPromise });\n }\n\n // Include local inference if configured\n if (includeLocal && this.config.localInference) {\n const localStart = Date.now();\n const localPromise = this.config.localInference(request.prompt).then((text) => {\n const totalTime = Date.now() - localStart;\n const tokens = text.split(/\\s+/).length; // Rough estimate\n return {\n text,\n ttft: totalTime / 2, // Rough estimate\n totalTime,\n tps: tokens / (totalTime / 1000),\n };\n });\n\n raceEntries.push({ id: '__local__', promise: localPromise });\n }\n\n // Race all entries\n if (request.collectAll) {\n // Wait for all results, but return the first one as winner\n const allResults = new Map<string, { text: string; time: number }>();\n let winner: { id: string; result: { text: string; ttft: number; totalTime: number; tps: number } } | null = null;\n\n const settled = await Promise.allSettled(\n raceEntries.map(async (entry) => {\n const result = await entry.promise;\n if (!winner) {\n winner = { id: entry.id, result };\n }\n allResults.set(entry.id, { text: result.text, time: result.totalTime });\n return { id: entry.id, result };\n })\n );\n\n if (!winner) {\n throw new Error('All peers failed inference');\n }\n\n const w = winner as { id: string; result: { text: string; ttft: number; totalTime: number; tps: number } };\n return {\n winnerId: w.id,\n text: w.result.text,\n ttft: w.result.ttft,\n totalTime: w.result.totalTime,\n tokensPerSecond: w.result.tps,\n allResults,\n };\n } else {\n // Pure race — first to resolve wins\n const winner = await Promise.any(\n raceEntries.map(async (entry) => {\n const result = await entry.promise;\n return { id: entry.id, result };\n })\n );\n\n this.emit({\n type: 'inference-complete',\n winnerId: winner.id,\n totalTime: Date.now() - startTime,\n });\n\n return {\n winnerId: winner.id,\n text: winner.result.text,\n ttft: winner.result.ttft,\n totalTime: winner.result.totalTime,\n tokensPerSecond: winner.result.tps,\n };\n }\n }\n\n // ─── Peer-Side: Handle Incoming Inference Requests ────────────────\n\n /**\n * Create a handler for incoming inference requests.\n * Call this on the peer side to process requests from the coordinator.\n *\n * @param inferFn - The actual inference function on this peer\n * @returns A FlowTransport receive handler\n */\n static createPeerHandler(\n inferFn: (prompt: string, options?: { maxTokens?: number; temperature?: number }) => Promise<string>\n ): (data: Uint8Array) => void {\n return (data: Uint8Array) => {\n if (data[0] !== MSG_INFERENCE_REQUEST) return;\n\n const json = textDecoder.decode(data.subarray(1));\n const request = JSON.parse(json) as FederatedInferenceRequest;\n\n const startTime = Date.now();\n let ttft = 0;\n\n void inferFn(request.prompt, {\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n }).then((text) => {\n if (ttft === 0) ttft = Date.now() - startTime;\n const totalTime = Date.now() - startTime;\n const tokens = text.split(/\\s+/).length;\n const tps = tokens / (totalTime / 1000);\n\n // This handler doesn't have direct access to transport.send()\n // The caller should wire this up appropriately\n return encodeInferenceResponse(text, { ttft, totalTime, tps });\n });\n };\n }\n\n /**\n * Set up a peer to respond to federated inference requests.\n *\n * @param transport - The FlowTransport connected to the coordinator\n * @param inferFn - The inference function to run\n * @param capabilities - This peer's capabilities to announce\n */\n static setupPeer(\n transport: FlowTransport,\n inferFn: (prompt: string, options?: { maxTokens?: number; temperature?: number }) => Promise<string>,\n capabilities: PeerCapabilities\n ): void {\n // Announce capabilities\n transport.send(encodeCapabilities(capabilities));\n\n // Handle incoming requests\n transport.onReceive((data) => {\n if (data[0] === MSG_CAPABILITY_REQUEST) {\n transport.send(encodeCapabilities(capabilities));\n return;\n }\n\n if (data[0] !== MSG_INFERENCE_REQUEST) return;\n\n const json = textDecoder.decode(data.subarray(1));\n const request = JSON.parse(json) as FederatedInferenceRequest;\n\n const startTime = Date.now();\n\n void inferFn(request.prompt, {\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n }).then((text) => {\n const totalTime = Date.now() - startTime;\n const tokens = text.split(/\\s+/).length;\n const tps = tokens / Math.max(totalTime / 1000, 0.001);\n const response = encodeInferenceResponse(text, { ttft: totalTime / 2, totalTime, tps });\n transport.send(response);\n }).catch(() => {\n // Inference failed — don't respond, let coordinator timeout\n });\n });\n }\n\n // ─── Events ──────────────────────────────────────────────────────\n\n on(handler: (event: FederationEvent) => void): void {\n this.listeners.add(handler);\n }\n\n off(handler: (event: FederationEvent) => void): void {\n this.listeners.delete(handler);\n }\n\n private emit(event: FederationEvent): void {\n for (const handler of this.listeners) {\n handler(event);\n }\n }\n\n // ─── Status ──────────────────────────────────────────────────────\n\n get peerCount(): number {\n return this.peers.size;\n }\n\n get availablePeerCount(): number {\n return Array.from(this.peers.values()).filter((p) => p.available).length;\n }\n\n destroy(): void {\n for (const peer of this.peers.values()) {\n peer.transport.close();\n }\n this.peers.clear();\n this.listeners.clear();\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Event Types\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport type FederationEvent =\n | { type: 'peer-added'; peerId: string }\n | { type: 'peer-removed'; peerId: string }\n | { type: 'peer-capabilities'; peerId: string; capabilities: PeerCapabilities }\n | { type: 'inference-start'; peerCount: number }\n | { type: 'inference-complete'; winnerId: string; totalTime: number }\n | { type: 'error'; message: string };\n","/**\n * Aeon - Distributed Synchronization & Versioning Library\n *\n * A comprehensive library for building distributed, collaborative applications\n * with real-time synchronization, schema versioning, and conflict resolution.\n *\n * @example\n * ```typescript\n * import { SyncCoordinator, SchemaVersionManager } from '@affectively/aeon';\n *\n * // Create a sync coordinator\n * const coordinator = new SyncCoordinator();\n *\n * // Register a node\n * coordinator.registerNode({\n * id: 'node-1',\n * address: 'localhost',\n * port: 3000,\n * status: 'online',\n * lastHeartbeat: new Date().toISOString(),\n * version: '1.0.0',\n * capabilities: ['sync', 'replicate'],\n * });\n *\n * // Create a sync session\n * const session = coordinator.createSyncSession('node-1', ['node-2', 'node-3']);\n * ```\n *\n * @packageDocumentation\n */\n\n// Core types\nexport * from './core';\n\n// Utils\nexport * from './utils';\n\n// Persistence module\nexport * from './persistence';\n\n// Versioning module (Phase 15)\nexport * from './versioning';\n\n// Distributed module (Phase 16)\nexport * from './distributed';\n\n// Offline module (Phase 11)\nexport * from './offline';\n\n// Compression module (Phase 12)\nexport * from './compression';\n\n// Optimization module (Phase 13)\nexport * from './optimization';\n\n// Presence module (Phase 14)\nexport * from './presence';\n\n// Crypto module (UCAN + ZK encryption)\nexport * from './crypto';\n\n// Flow module (fork/race/collapse protocol primitive)\nexport * from './flow';\n\n// Transport module (every wire format that matters)\nexport * from './transport';\n\n// Federation module (federated inference across mesh)\nexport * from './federation';\n\n/**\n * STUBS for React components and hooks\n * These are normally provided by @affectively/aeon-flux-react but are\n * imported from @affectively/aeon in many legacy parts of edge-web-app.\n *\n * NOTE: Only stub things NOT exported by submodules above.\n * SchemaVersionManager, SyncCoordinator, getAdaptiveCompressionOptimizer,\n * and getAgentPresenceManager are real exports — do NOT shadow them here.\n */\nexport const Link = (() => {\n throw new Error(\n 'Link: Stub called from @affectively/aeon. Import from @affectively/aeon-flux-react or mock in tests.'\n );\n}) as any;\n\nexport const useAeonPage = (() => {\n throw new Error(\n 'useAeonPage: Stub called from @affectively/aeon. Import from @affectively/aeon-flux-react or mock in tests.'\n );\n}) as any;\n"]}