@affectively/aeon 1.1.0 → 1.2.0
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.
- package/dist/core/index.d.cts +70 -5
- package/dist/core/index.d.ts +70 -5
- package/dist/index.cjs +151 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +151 -0
- package/dist/index.js.map +1 -1
- package/dist/presence/index.cjs +151 -0
- package/dist/presence/index.cjs.map +1 -1
- package/dist/presence/index.d.cts +116 -1
- package/dist/presence/index.d.ts +116 -1
- package/dist/presence/index.js +151 -0
- package/dist/presence/index.js.map +1 -1
- package/package.json +1 -1
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: ((error: Error, changes: DashStorageChange[]) => void) | 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}: ${error instanceof Error ? error.message : String(error)}`,\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:\n 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((migration, index) => ({\n ...migration,\n previousHash: integrityEntries[index]?.previousHash,\n integrityHash: integrityEntries[index]?.hash,\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(this.persistence.key, serialize(envelope));\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(value) 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 { migrations: this.migrations.length, snapshots: this.snapshots.size };\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 = 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(([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:\n 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(this.persistence.key, serialize(envelope));\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: (SyncProtocolPersistenceConfig & { 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?: 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: ${error instanceof Error ? error.message : String(error)}`,\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: ${error instanceof Error ? error.message : String(error)}`,\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: ${error instanceof Error ? error.message : String(error)}`,\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(this.persistence.key, serialize(envelope));\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 ${message?.messageId ?? 'unknown'}: ${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: (OfflineQueuePersistenceConfig & { key: string }) | null =\n 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().toString(36).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 metadata?: Record<string, unknown>;\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 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 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"],"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: ((error: Error, changes: DashStorageChange[]) => void) | 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}: ${error instanceof Error ? error.message : String(error)}`,\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:\n 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((migration, index) => ({\n ...migration,\n previousHash: integrityEntries[index]?.previousHash,\n integrityHash: integrityEntries[index]?.hash,\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(this.persistence.key, serialize(envelope));\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(value) 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 { migrations: this.migrations.length, snapshots: this.snapshots.size };\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 = 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(([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:\n 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(this.persistence.key, serialize(envelope));\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: (SyncProtocolPersistenceConfig & { 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?: 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: ${error instanceof Error ? error.message : String(error)}`,\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: ${error instanceof Error ? error.message : String(error)}`,\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: ${error instanceof Error ? error.message : String(error)}`,\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(this.persistence.key, serialize(envelope));\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 ${message?.messageId ?? 'unknown'}: ${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: (OfflineQueuePersistenceConfig & { key: string }) | null =\n 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().toString(36).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"]}
|